CylindricalDetector.surface

CylindricalDetector.surface(param)[source]

Return the detector surface point corresponding to param.

For parameters phi and h, the returned point is given by

surf = R * (radius * cos(phi), -radius * sin(phi), h) + t

where R is a rotation matrix and t is a translation vector. Note that increase of phi corresponds to rotation in the clockwise direction, by analogy to flat detectors.

Parameters:
paramarray-like or sequence

Parameter value(s) at which to evaluate. A sequence of parameters must have length 2.

Returns:
pointnumpy.ndarray

Vector(s) pointing from the origin to the detector surface point at param. If param is a single parameter, the returned array has shape (3,), otherwise broadcast(*param).shape + (3,).

Examples

The method works with a single parameter, resulting in a single vector:

>>> part = odl.uniform_partition(
...     [-np.pi / 2, -4], [np.pi / 2, 4], (10, 8))
>>> det = CylindricalDetector(
...     part, axes=[(1, 0, 0), (0, 0, 1)], radius = 2)
>>> det.surface([0, 0])
array([ 0., 0.,  0.])
>>> np.round(det.surface([np.pi / 2, 1]), 10)
array([ 2., -2.,  1.])

It is also vectorized, i.e., it can be called with multiple parameters at once (or an n-dimensional array of parameters):

>>> # 3 pairs of parameters, resulting in 3 vectors
>>> np.round(det.surface([[-np.pi / 2, 0, np.pi / 2], [-1, 0, 1]]), 10)
array([[-2., -2., -1.],
       [ 0.,  0.,  0.],
       [ 2., -2.,  1.]])
>>> # Pairs of parameters in a (4, 5) array each
>>> param = (np.zeros((4, 5)), np.zeros((4, 5)))
>>> det.surface(param).shape
(4, 5, 3)