structured_domain.py 3.94 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
#
Martin Reinecke's avatar
Martin Reinecke committed
14
# Copyright(C) 2013-2018 Max-Planck-Society
Theo Steininger's avatar
Theo Steininger committed
15
16
17
#
# 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
from __future__ import absolute_import, division, print_function
Philipp Arras's avatar
Philipp Arras committed
20

21
import abc
Philipp Arras's avatar
Philipp Arras committed
22

Martin Reinecke's avatar
Martin Reinecke committed
23
import numpy as np
Theo Steininger's avatar
Theo Steininger committed
24

Philipp Arras's avatar
Philipp Arras committed
25
26
27
from ..compat import *
from .domain import Domain

28

Martin Reinecke's avatar
Martin Reinecke committed
29
30
class StructuredDomain(Domain):
    """The abstract base class for all structured NIFTy domains.
31

Martin Reinecke's avatar
Martin Reinecke committed
32
    An instance of a space contains information about the manifold's
Martin Reinecke's avatar
Martin Reinecke committed
33
    geometry and enhances the functionality of Domain by methods that
Martin Reinecke's avatar
Martin Reinecke committed
34
    are needed for power spectrum analysis and smoothing.
35
    """
36

Martin Reinecke's avatar
Martin Reinecke committed
37
    @abc.abstractproperty
Martin Reinecke's avatar
Martin Reinecke committed
38
    def scalar_dvol(self):
Martin Reinecke's avatar
Martin Reinecke committed
39
40
41
        """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
42
43
44
45
46
        point scalar, if the volume factors are all identical, otherwise
        returns None.
        """
        raise NotImplementedError

Martin Reinecke's avatar
Martin Reinecke committed
47
    @property
Martin Reinecke's avatar
Martin Reinecke committed
48
    def dvol(self):
Martin Reinecke's avatar
Martin Reinecke committed
49
50
51
        """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
52
53
54
        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
55
        return self.scalar_dvol
Martin Reinecke's avatar
Martin Reinecke committed
56

Martin Reinecke's avatar
Martin Reinecke committed
57
    @property
Martin Reinecke's avatar
Martin Reinecke committed
58
    def total_volume(self):
Martin Reinecke's avatar
Martin Reinecke committed
59
        """float : Total domain volume
Martin Reinecke's avatar
Martin Reinecke committed
60

Martin Reinecke's avatar
Martin Reinecke committed
61
        Returns the sum over all the domain's pixel volumes.
Martin Reinecke's avatar
Martin Reinecke committed
62
        """
Martin Reinecke's avatar
Martin Reinecke committed
63
        tmp = self.dvol
Martin Reinecke's avatar
Martin Reinecke committed
64
        return self.size * tmp if np.isscalar(tmp) else np.sum(tmp)
65

66
67
    @abc.abstractproperty
    def harmonic(self):
Martin Reinecke's avatar
Martin Reinecke committed
68
        """bool : True iff this domain is a harmonic domain."""
69
        raise NotImplementedError
70

71
    def get_k_length_array(self):
Martin Reinecke's avatar
Martin Reinecke committed
72
73
74
        """k vector lengths, if applicable,

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

77
78
        Returns
        -------
79
        Field
80
            An array containing the k vector lengths
81
        """
Martin Reinecke's avatar
Martin Reinecke committed
82
        raise NotImplementedError
83

84
    def get_unique_k_lengths(self):
Martin Reinecke's avatar
Martin Reinecke committed
85
86
87
        """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
88
89
        for this domain.
        This method is only implemented for harmonic domains.
Martin Reinecke's avatar
Martin Reinecke committed
90
        """
Martin Reinecke's avatar
Martin Reinecke committed
91
92
        raise NotImplementedError

93
    def get_fft_smoothing_kernel_function(self, sigma):
Martin Reinecke's avatar
Martin Reinecke committed
94
        """Helper for Gaussian smoothing.
Theo Steininger's avatar
Theo Steininger committed
95

Martin Reinecke's avatar
Martin Reinecke committed
96
97
98
99
100
101
        This method, which is only implemented for harmonic domains, helps
        smoothing fields that live on a domain that has this domain as
        its harmonic partner. 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.
Theo Steininger's avatar
Theo Steininger committed
102

103
104
        Parameters
        ----------
Theo Steininger's avatar
Theo Steininger committed
105
106
        sigma : float
            A real number representing a physical scale on which the smoothing
Martin Reinecke's avatar
Martin Reinecke committed
107
            takes place. Mathematically sigma is the standard
Theo Steininger's avatar
Theo Steininger committed
108
109
110
            deviation of a convolution with a normalized, zero-centered
            Gaussian that takes place in position space.

111
112
        Returns
        -------
Theo Steininger's avatar
Theo Steininger committed
113
114
115
        function (array-like -> array-like)
            A smoothing operation that multiplies values with a Gaussian
            kernel.
116
        """
Martin Reinecke's avatar
Martin Reinecke committed
117
        raise NotImplementedError