def full(images: Images, cors: List[ScalarCoR], recon_params: ReconstructionParameters, progress: Optional[Progress] = None) -> Images: progress = Progress.ensure_instance(progress, num_steps=images.height) output_shape = (images.num_sinograms, images.width, images.width) output_images: Images = Images.create_empty_images( output_shape, images.dtype, images.metadata) output_images.record_operation('AstraRecon.full', 'Reconstruction', **recon_params.to_dict()) # FIXME multiple GPU support - just starting up a Pool doesn't seem to work # the GPUs can't initialise the memory properly. Not sure why # num_gpus = AstraRecon._count_gpus() # LOG.info(f"Running with {num_gpus} GPUs") # partial = ptsm.create_partial(AstraRecon.single, ptsm.fwd_gpu_recon, # num_gpus=num_gpus, cors=cors, # proj_angles=proj_angles, recon_params=recon_params) # ptsm.execute(images.sinograms, output_images.data, partial, num_gpus, progress=progress) proj_angles = images.projection_angles() for i in range(images.height): output_images.data[i] = AstraRecon.single_sino( images.sino(i), cors[i], proj_angles, recon_params) progress.update(1, "Reconstructed slice") return output_images
def full(images: Images, cors: List[ScalarCoR], recon_params: ReconstructionParameters, progress: Optional[Progress] = None) -> Images: progress = Progress.ensure_instance(progress, num_steps=images.height) output_shape = (images.num_sinograms, images.width, images.width) output_images: Images = Images.create_empty_images( output_shape, images.dtype, images.metadata) output_images.record_operation('AstraRecon.full', 'Reconstruction', **recon_params.to_dict()) proj_angles = images.projection_angles( recon_params.max_projection_angle) for i in range(images.height): output_images.data[i] = AstraRecon.single_sino( images.sino(i), cors[i], proj_angles, recon_params) progress.update(1, "Reconstructed slice") return output_images
def run_preview_recon( self, slice_idx, cor: ScalarCoR, recon_params: ReconstructionParameters) -> Optional[Images]: # Ensure we have some sample data if self.images is None: return None # Perform single slice reconstruction reconstructor = get_reconstructor_for(recon_params.algorithm) output_shape = (1, self.images.width, self.images.width) recon: Images = Images.create_empty_images(output_shape, self.images.dtype, self.images.metadata) recon.data[0] = reconstructor.single_sino( self.images.sino(slice_idx), cor, self.images.projection_angles(recon_params.max_projection_angle), recon_params) recon = self._apply_pixel_size(recon, recon_params) return recon
def test_create_empty_images(self): images = Images.create_empty_images((15, 10, 10), np.float32, {}) self.assertEqual(images.data.shape, (15, 10, 10))