def geometry(request): geom = request.param m = 100 n_angles = 100 if geom == 'par2d': apart = odl.uniform_partition(0, np.pi, n_angles) dpart = odl.uniform_partition(-30, 30, m) return tomo.Parallel2dGeometry(apart, dpart) elif geom == 'par3d': apart = odl.uniform_partition(0, np.pi, n_angles) dpart = odl.uniform_partition([-30, -30], [30, 30], (m, m)) return tomo.Parallel3dAxisGeometry(apart, dpart) elif geom == 'cone2d': apart = odl.uniform_partition(0, 2 * np.pi, n_angles) dpart = odl.uniform_partition(-30, 30, m) return tomo.FanFlatGeometry(apart, dpart, src_radius=200, det_radius=100) elif geom == 'cone3d': apart = odl.uniform_partition(0, 2 * np.pi, n_angles) dpart = odl.uniform_partition([-60, -60], [60, 60], (m, m)) return tomo.CircularConeFlatGeometry(apart, dpart, src_radius=200, det_radius=100) elif geom == 'helical': apart = odl.uniform_partition(0, 8 * 2 * np.pi, n_angles) dpart = odl.uniform_partition([-30, -3], [30, 3], (m, m)) return tomo.HelicalConeFlatGeometry(apart, dpart, pitch=5.0, src_radius=200, det_radius=100) else: raise ValueError('geom not valid')
def projector(request, dtype): n_angles = 200 geom, impl, angle = request.param.split() if angle == 'uniform': apart = odl.uniform_partition(0, 2 * np.pi, n_angles) elif angle == 'random': # Linearly spaced with random noise min_pt = 2 * (2.0 * np.pi) / n_angles max_pt = (2.0 * np.pi) - 2 * (2.0 * np.pi) / n_angles points = np.linspace(min_pt, max_pt, n_angles) points += np.random.rand(n_angles) * (max_pt - min_pt) / (5 * n_angles) apart = odl.nonuniform_partition(points) elif angle == 'nonuniform': # Angles spaced quadratically min_pt = 2 * (2.0 * np.pi) / n_angles max_pt = (2.0 * np.pi) - 2 * (2.0 * np.pi) / n_angles points = np.linspace(min_pt ** 0.5, max_pt ** 0.5, n_angles) ** 2 apart = odl.nonuniform_partition(points) else: raise ValueError('angle not valid') if geom == 'par2d': # Discrete reconstruction space discr_reco_space = odl.uniform_discr([-20, -20], [20, 20], [100, 100], dtype=dtype) # Geometry dpart = odl.uniform_partition(-30, 30, 200) geom = tomo.Parallel2dGeometry(apart, dpart) # Ray transform return tomo.RayTransform(discr_reco_space, geom, impl=impl) elif geom == 'par3d': # Discrete reconstruction space discr_reco_space = odl.uniform_discr([-20, -20, -20], [20, 20, 20], [100, 100, 100], dtype=dtype) # Geometry dpart = odl.uniform_partition([-30, -30], [30, 30], [200, 200]) geom = tomo.Parallel3dAxisGeometry(apart, dpart, axis=[1, 0, 0]) # Ray transform return tomo.RayTransform(discr_reco_space, geom, impl=impl) elif geom == 'cone2d': # Discrete reconstruction space discr_reco_space = odl.uniform_discr([-20, -20], [20, 20], [100, 100], dtype=dtype) # Geometry dpart = odl.uniform_partition(-30, 30, 200) geom = tomo.FanFlatGeometry(apart, dpart, src_radius=200, det_radius=100) # Ray transform return tomo.RayTransform(discr_reco_space, geom, impl=impl) elif geom == 'cone3d': # Discrete reconstruction space discr_reco_space = odl.uniform_discr([-20, -20, -20], [20, 20, 20], [100, 100, 100], dtype=dtype) # Geometry dpart = odl.uniform_partition([-30, -30], [30, 30], [200, 200]) geom = tomo.CircularConeFlatGeometry( apart, dpart, src_radius=200, det_radius=100, axis=[1, 0, 0]) # Ray transform return tomo.RayTransform(discr_reco_space, geom, impl=impl) elif geom == 'helical': # Discrete reconstruction space discr_reco_space = odl.uniform_discr([-20, -20, 0], [20, 20, 40], [100, 100, 100], dtype=dtype) # Geometry # TODO: angles n_angle = 700 apart = odl.uniform_partition(0, 8 * 2 * np.pi, n_angle) dpart = odl.uniform_partition([-30, -3], [30, 3], [200, 20]) geom = tomo.HelicalConeFlatGeometry(apart, dpart, pitch=5.0, src_radius=200, det_radius=100) # Ray transform return tomo.RayTransform(discr_reco_space, geom, impl=impl) else: raise ValueError('param not valid')