SphericalDetector.surface

SphericalDetector.surface(param)[source]

Return the detector surface point corresponding to param.

For parameters phi and theta, the surface point is given by

surf = R * radius * ( cos(phi) * cos(theta),
                     -sin(phi) * cos(theta),
                                 sin(theta)) + 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, -np.pi / 3],
...                              [ np.pi / 2,  np.pi / 3], [20, 10])
>>> det = SphericalDetector(
...     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, np.pi / 3]), 2)
array([ 1.  , -2.  ,  1.73])

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],
...                       [-np.pi / 3, 0, np.pi / 3]]), 2)
array([[-1.  , -2.  , -1.73],
       [ 0.  ,  0.  ,  0.  ],
       [ 1.  , -2.  ,  1.73]])
>>> # 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)