Parallel3dEulerGeometry
- class odl.applications.tomo.geometry.parallel.Parallel3dEulerGeometry(apart, dpart, det_pos_init=(0, 1, 0), **kwargs)[source]
Bases:
ParallelBeamGeometryParallel beam geometry in 3d.
The motion parameters are two or three Euler angles, and the detector is flat and two-dimensional.
In the standard configuration, the detector reference point starts at
(0, 1, 0), and the initial detector axes are[(1, 0, 0), (0, 0, 1)].For details, check the online docs.
- __init__(apart, dpart, det_pos_init=(0, 1, 0), **kwargs)[source]
Initialize a new instance.
Parameters
- apart2- or 3-dim.
RectPartition Partition of the angle parameter set.
- dpart2-dim.
RectPartition Partition of the detector parameter set.
- det_pos_init
array-like, shape(3,), optional Initial position of the detector reference point.
Other Parameters
- det_axes_init2-tuple of
array-like’s (shape(3,)), optional Initial axes defining the detector orientation. The default depends on
det_pos_init, see Notes.- translation
array-like, shape(3,), optional Global translation of the geometry. This is added last in any method that computes an absolute vector, e.g.,
det_refpoint, and also shifts the center of rotation. Default:(0, 0, 0)- check_boundsbool, optional
If
True, methods computing vectors check input arguments. Checks are vectorized and add only a small overhead. Default:True
Notes
In the default configuration, the initial detector reference point is
(0, 1, 0), and the initial detector axes are[(1, 0, 0), (0, 0, 1)]. If a differentdet_pos_initis chosen, the new default axes are given as a rotation of the original ones by a matrix that transforms(0, 1, 0)to the new (normalized)det_pos_init. This matrix is calculated with therotation_matrix_from_tofunction. Expressed in code, we haveinit_rot = rotation_matrix_from_to((0, 1, 0), det_pos_init) det_axes_init[0] = init_rot.dot((1, 0, 0)) det_axes_init[1] = init_rot.dot((0, 0, 1))
Examples
Initialization with default parameters and 2 Euler angles:
>>> apart = odl.uniform_partition([0, 0], [np.pi, 2 * np.pi], ... (10, 20)) >>> dpart = odl.uniform_partition([-1, -1], [1, 1], (20, 20)) >>> geom = Parallel3dEulerGeometry(apart, dpart) >>> geom.det_refpoint([0, 0]) array([ 0., 1., 0.]) >>> geom.det_point_position([0, 0], [-1, 1]) array([-1., 1., 1.])
Checking the default orientation:
>>> e_x, e_y, e_z = np.eye(3) # standard unit vectors >>> np.allclose(geom.det_pos_init, e_y) True >>> np.allclose(geom.det_axes_init, (e_x, e_z)) True
Specifying an initial detector position by default rotates the standard configuration to this position:
>>> geom = Parallel3dEulerGeometry(apart, dpart, ... det_pos_init=(1, 0, 0)) >>> np.allclose(geom.det_pos_init, e_x) True >>> np.allclose(geom.det_axes_init, (-e_y, e_z)) True >>> geom = Parallel3dEulerGeometry(apart, dpart, ... det_pos_init=(0, 0, 1)) >>> np.allclose(geom.det_pos_init, e_z) True >>> np.allclose(geom.det_axes_init, (e_x, -e_y)) True
The initial detector axes can also be set explicitly:
>>> geom = Parallel3dEulerGeometry( ... apart, dpart, det_pos_init=(-1, 0, 0), ... det_axes_init=((0, 1, 0), (0, 0, 1))) >>> np.allclose(geom.det_pos_init, -e_x) True >>> np.allclose(geom.det_axes_init, (e_y, e_z)) True
- apart2- or 3-dim.