Parallel2dGeometry.det_refpoint

Parallel2dGeometry.det_refpoint(angle)

Return the position(s) of the detector ref. point at angle.

The reference point is given by a rotation of the initial position by angle.

For an angle (or a vector of angles) phi, the detector position is given by

det_ref(phi) = translation +
               rotation_matrix(phi) * (det_pos_init - translation)

where det_pos_init is the detector reference point at initial state.

This default implementation assumes in the case of 2 or 3 motion parameters that they are to be interpreted as Euler angles. Subclasses with a deviating intended interpretation should override this method.

Parameters:
anglearray-like or sequence

One or several (Euler) angles in radians at which to evaluate. If motion_params.ndim >= 2, a sequence of that length must be provided.

Returns:
refptnumpy.ndarray

Vector(s) pointing from the origin to the detector reference point at angle. If angle is a single parameter, the returned array has shape (ndim,), otherwise

See also

rotation_matrix

Examples

For 2d and default arguments, the detector starts at e_y and rotates to -e_x at 90 degrees:

>>> apart = odl.uniform_partition(0, np.pi, 10)
>>> dpart = odl.uniform_partition(-1, 1, 20)
>>> geom = Parallel2dGeometry(apart, dpart)
>>> geom.det_refpoint(0)
array([ 0.,  1.])
>>> np.allclose(geom.det_refpoint(np.pi / 2), [-1, 0])
True

The method is vectorized, i.e., it can be called with multiple angles at once (or n-dimensional arrays of parameters):

>>> points = geom.det_refpoint([0, np.pi])
>>> np.allclose(points[0], [0, 1])
True
>>> np.allclose(points[1], [0, -1])
True
>>> geom.det_refpoint(np.zeros((4, 5))).shape
(4, 5, 2)

In 3d with single rotation axis e_z, we have the same situation, except that the vectors have a third component equal to 0:

>>> apart = odl.uniform_partition(0, np.pi, 10)
>>> dpart = odl.uniform_partition([-1, -1], [1, 1], (20, 20))
>>> geom = Parallel3dAxisGeometry(apart, dpart)
>>> geom.det_refpoint(0)
array([ 0.,  1.,  0.])
>>> np.allclose(geom.det_refpoint(np.pi / 2), [-1, 0, 0])
True