Source code for pytomography.projectors.shared.kem_system_matrix

from ..system_matrix import SystemMatrix

[docs]class KEMSystemMatrix(SystemMatrix): """Given a KEM transform :math:`K` and a system matrix :math:`H`, implements the transform :math:`HK` (and backward transform :math:`K^T H^T`) Args: system_matrix (SystemMatrix): System matrix corresponding to a particular imaging system kem_transform (KEMTransform): Transform used to go from coefficient image to real image of predicted counts. """ def __init__(self, system_matrix, kem_transform): self.object_meta = system_matrix.object_meta self.proj_meta = system_matrix.proj_meta self.system_matrix = system_matrix self.kem_transform = kem_transform
[docs] def forward(self, object, angle_subset=None): """Forward transform :math:`HK` Args: object (torch.tensor): Object to be forward projected angle_subset (Sequence, optional): Angles to forward projected; if none, project to all angles. Defaults to None. Returns: torch.tensor: Corresponding projections generated from forward projection """ object = self.kem_transform.forward(object) return self.system_matrix.forward(object, angle_subset)
[docs] def backward(self, proj, angle_subset=None, return_norm_constant = False): """Backward transform :math:`K^T H^T` Args: proj (torch.tensor): Projection data to be back projected angle_subset (Sequence, optional): Angles corresponding to projections; if none, then all projections from ``self.proj_meta`` are contained. Defaults to None. return_norm_constant (bool, optional): Additionally returns :math:`K^T H^T 1` if true; defaults to False. Returns: torch.tensor: Corresponding object generated from back projection. """ if return_norm_constant: object, norm_constant = self.system_matrix.backward(proj, angle_subset, return_norm_constant) object, norm_constant = self.kem_transform.backward(object, norm_constant) return object, norm_constant else: object = self.system_matrix.backward(proj, angle_subset, return_norm_constant) return self.kem_transform.backward(object)