space.py 4.39 KB
Newer Older
1 2 3 4
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
5
#
6 7
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
8 9 10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
11
# You should have received a copy of the GNU General Public License
12
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Theo Steininger's avatar
Theo Steininger committed
13 14 15 16 17
#
# Copyright(C) 2013-2017 Max-Planck-Society
#
# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik
# and financially supported by the Studienstiftung des deutschen Volkes.
Marco Selig's avatar
Marco Selig committed
18

19 20
import abc

Martin Reinecke's avatar
Martin Reinecke committed
21
from ...domain_object import DomainObject
Theo Steininger's avatar
Theo Steininger committed
22

23

24
class Space(DomainObject):
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
    """ The abstract base class for all NIFTy spaces.

    An instance of a space contains information about the manifolds
    geometry and enhances the functionality of DomainObject by methods that
    are needed for powerspectrum analysis and smoothing.

    Parameters
    ----------
    None

    Attributes
    ----------
    dim : np.int
        Total number of dimensionality, i.e. the number of pixels.
    harmonic : bool
        Specifies whether the space is a signal or harmonic space.
    total_volume : np.float
        The total volume of the space.
    shape : tuple of np.ints
        The shape of the space's data array.

    Raises
    ------
    TypeError
        Raised if instantiated directly.

    Notes
    -----
    `Space` is an abstract base class. In order to allow for instantiation
Martin Reinecke's avatar
PEP8  
Martin Reinecke committed
54 55
    the methods `total_volume` and `copy` must be implemented as well as the
    abstract methods inherited from `DomainObject`.
56 57

    """
58

59
    def __init__(self):
Martin Reinecke's avatar
Martin Reinecke committed
60
        super(Space, self).__init__()
61

62 63
    @abc.abstractproperty
    def harmonic(self):
Theo Steininger's avatar
Theo Steininger committed
64
        """ Returns True if this space is a harmonic space.
65
        """
66
        raise NotImplementedError
67

68
    @abc.abstractproperty
69
    def total_volume(self):
Theo Steininger's avatar
Theo Steininger committed
70 71
        """ Returns the total volume of the space.

72 73
        Returns
        -------
Theo Steininger's avatar
Theo Steininger committed
74 75
        float
            A real number representing the sum of all pixel volumes.
76
        """
77 78
        raise NotImplementedError(
            "There is no generic volume for the Space base class.")
79

80 81
    @abc.abstractmethod
    def copy(self):
Theo Steininger's avatar
Theo Steininger committed
82 83
        """ Returns a copy of this Space instance.

84 85
        Returns
        -------
Theo Steininger's avatar
Theo Steininger committed
86 87
        Space
            A copy of this instance.
88
        """
Martin Reinecke's avatar
Martin Reinecke committed
89
        return self.__class__()
90

91
    def get_k_length_array(self):
Martin Reinecke's avatar
Martin Reinecke committed
92 93
        """ The length of the k vector for every pixel.
        This method is only implemented for harmonic spaces.
Theo Steininger's avatar
Theo Steininger committed
94

95 96
        Returns
        -------
Martin Reinecke's avatar
stage1  
Martin Reinecke committed
97
        numpy.ndarray
Martin Reinecke's avatar
Martin Reinecke committed
98
            An array containing the  k vector lengths
Theo Steininger's avatar
Theo Steininger committed
99

100
        """
Martin Reinecke's avatar
Martin Reinecke committed
101
        raise NotImplementedError
102

103
    def get_unique_k_lengths(self):
Martin Reinecke's avatar
Martin Reinecke committed
104 105 106 107
        """ Returns an array of floats containing the unique k vector lengths
        for this space.
        This method is only implemented for harmonic spaces.
        """
Martin Reinecke's avatar
Martin Reinecke committed
108 109
        raise NotImplementedError

110
    def get_fft_smoothing_kernel_function(self, sigma):
Theo Steininger's avatar
Theo Steininger committed
111 112 113 114 115 116 117 118
        """ This method returns a smoothing kernel function.

        This method, which is only implemented for harmonic spaces, helps
        smoothing fields that live in a position space that has this space as
        its harmonic space. The returned function multiplies field values of a
        field with a zero centered Gaussian which corresponds to a convolution
        with a Gaussian kernel and sigma standard deviation in position space.

119 120
        Parameters
        ----------
Theo Steininger's avatar
Theo Steininger committed
121 122 123 124 125 126 127 128
        sigma : float
            A real number representing a physical scale on which the smoothing
            takes place. The smoothing is defined with respect to the real
            physical field and points that are closer together than one sigma
            are blurred together. Mathematically sigma is the standard
            deviation of a convolution with a normalized, zero-centered
            Gaussian that takes place in position space.

129 130
        Returns
        -------
Theo Steininger's avatar
Theo Steininger committed
131 132 133 134
        function (array-like -> array-like)
            A smoothing operation that multiplies values with a Gaussian
            kernel.

135
        """
Theo Steininger's avatar
Theo Steininger committed
136

137 138
        raise NotImplementedError(
            "There is no generic co-smoothing kernel for Space base class.")