structured_domain.py 3.76 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
# Copyright(C) 2013-2019 Max-Planck-Society
Theo Steininger's avatar
Theo Steininger committed
15
#
16
# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik.
Philipp Arras's avatar
Philipp Arras committed
17

Martin Reinecke's avatar
Martin Reinecke committed
18
import numpy as np
Theo Steininger's avatar
Theo Steininger committed
19

Philipp Arras's avatar
Philipp Arras committed
20
21
from .domain import Domain

22

Martin Reinecke's avatar
Martin Reinecke committed
23
class StructuredDomain(Domain):
24
    """The abstract base class for all structured domains.
25

Martin Reinecke's avatar
Martin Reinecke committed
26
    An instance of a space contains information about the manifold's
Martin Reinecke's avatar
Martin Reinecke committed
27
    geometry and enhances the functionality of Domain by methods that
Martin Reinecke's avatar
Martin Reinecke committed
28
    are needed for power spectrum analysis and smoothing.
29
    """
30

Martin Reinecke's avatar
Martin Reinecke committed
31
    @property
Martin Reinecke's avatar
Martin Reinecke committed
32
    def scalar_dvol(self):
Martin Reinecke's avatar
Martin Reinecke committed
33
34
35
        """float or None : uniform cell volume, if applicable

        Returns the volume factors of this domain as a floating
Martin Reinecke's avatar
Martin Reinecke committed
36
37
38
39
40
        point scalar, if the volume factors are all identical, otherwise
        returns None.
        """
        raise NotImplementedError

Martin Reinecke's avatar
Martin Reinecke committed
41
    @property
Martin Reinecke's avatar
Martin Reinecke committed
42
    def dvol(self):
Martin Reinecke's avatar
Martin Reinecke committed
43
44
45
        """float or numpy.ndarray(dtype=float): Volume factors

        Returns the volume factors of this domain, either as a floating
Martin Reinecke's avatar
Martin Reinecke committed
46
47
48
        point scalar (if the volume factors are all identical) or as a
        floating point array with a shape of `self.shape`.
        """
Martin Reinecke's avatar
Martin Reinecke committed
49
        return self.scalar_dvol
Martin Reinecke's avatar
Martin Reinecke committed
50

Martin Reinecke's avatar
Martin Reinecke committed
51
    @property
Martin Reinecke's avatar
Martin Reinecke committed
52
    def total_volume(self):
Philipp Arras's avatar
Docs  
Philipp Arras committed
53
        """float : Total domain volume.
Martin Reinecke's avatar
Martin Reinecke committed
54

Martin Reinecke's avatar
Martin Reinecke committed
55
        Returns the sum over all the domain's pixel volumes.
Martin Reinecke's avatar
Martin Reinecke committed
56
        """
Martin Reinecke's avatar
Martin Reinecke committed
57
        tmp = self.dvol
Martin Reinecke's avatar
Martin Reinecke committed
58
        return self.size * tmp if np.isscalar(tmp) else np.sum(tmp)
59

Martin Reinecke's avatar
Martin Reinecke committed
60
    @property
61
    def harmonic(self):
Martin Reinecke's avatar
Martin Reinecke committed
62
        """bool : True iff this domain is a harmonic domain."""
63
        raise NotImplementedError
64

65
    def get_k_length_array(self):
Philipp Arras's avatar
Docs  
Philipp Arras committed
66
        """k vector lengths, if applicable.
Martin Reinecke's avatar
Martin Reinecke committed
67
68

        Returns the length of the k vector for every pixel.
Martin Reinecke's avatar
Martin Reinecke committed
69
        This method is only implemented for harmonic domains.
Theo Steininger's avatar
Theo Steininger committed
70

71
72
        Returns
        -------
73
        Field
74
            An array containing the k vector lengths
75
        """
Martin Reinecke's avatar
Martin Reinecke committed
76
        raise NotImplementedError
77

78
    def get_unique_k_lengths(self):
Martin Reinecke's avatar
Martin Reinecke committed
79
80
81
        """Sorted unique k-vector lengths, if applicable.

        Returns an array of floats containing the unique k vector lengths
Martin Reinecke's avatar
Martin Reinecke committed
82
83
        for this domain.
        This method is only implemented for harmonic domains.
Martin Reinecke's avatar
Martin Reinecke committed
84
        """
Martin Reinecke's avatar
Martin Reinecke committed
85
86
        raise NotImplementedError

87
    def get_fft_smoothing_kernel_function(self, sigma):
Martin Reinecke's avatar
Martin Reinecke committed
88
        """Helper for Gaussian smoothing.
Theo Steininger's avatar
Theo Steininger committed
89

90
91
92
93
94
        This method, which is only implemented for harmonic domains, helps to
        smoothe fields that are defined on a domain that has this domain as
        its harmonic partner. The returned function does a pointwise evaluation
        of a zero-centered Gaussian on the field values, which corresponds to a
        convolution with a Gaussian kernel with sigma standard deviation in
Martin Reinecke's avatar
Martin Reinecke committed
95
        position space.
Theo Steininger's avatar
Theo Steininger committed
96

97
98
        Parameters
        ----------
Theo Steininger's avatar
Theo Steininger committed
99
100
        sigma : float
            A real number representing a physical scale on which the smoothing
Martin Reinecke's avatar
Martin Reinecke committed
101
            takes place. Mathematically sigma is the standard
Theo Steininger's avatar
Theo Steininger committed
102
103
104
            deviation of a convolution with a normalized, zero-centered
            Gaussian that takes place in position space.

105
106
        Returns
        -------
Theo Steininger's avatar
Theo Steininger committed
107
108
109
        function (array-like -> array-like)
            A smoothing operation that multiplies values with a Gaussian
            kernel.
110
        """
Martin Reinecke's avatar
Martin Reinecke committed
111
        raise NotImplementedError