Source code for pytomography.projections.forward_projection

from __future__ import annotations
import torch
from pytomography.utils import rotate_detector_z, pad_object, unpad_image
from .projection import ProjectionNet

[docs]class ForwardProjectionNet(ProjectionNet): """Implements a forward projection of mathematical form :math:`g_j = \sum_{i} c_{ij} f_i` where :math:`f_i` is an object, :math:`g_j` is the corresponding image, and :math:`c_{ij}` is the system matrix given by the various phenonemon modeled (e.g. atteunation/PSF). """
[docs] def forward( self, object: torch.tensor, angle_subset: list[int] = None, ) -> torch.tensor: r"""Implements forward projection on an object Args: object (torch.tensor[batch_size, Lx, Ly, Lz]): The object to be forward projected angle_subset (list, optional): Only uses a subset of angles (i.e. only certain values of :math:`j` in formula above) when back projecting. Useful for ordered-subset reconstructions. Defaults to None, which assumes all angles are used. Returns: torch.tensor[batch_size, Ltheta, Lx, Lz]: Forward projected image where Ltheta is specified by `self.image_meta` and `angle_subset`. """ N_angles = self.image_meta.num_projections image = torch.zeros((object.shape[0],*self.image_meta.padded_shape)).to(self.device) looper = range(N_angles) if angle_subset is None else angle_subset for i in looper: object_i = rotate_detector_z(pad_object(object), self.image_meta.angles[i]) for net in self.obj2obj_nets: object_i = net(object_i, i) image[:,i] = object_i.sum(axis=1) for net in self.im2im_nets: image = net(image) return unpad_image(image)