Commit 046d074c authored by Martin Reinecke's avatar Martin Reinecke
Browse files

Merge branch 'total_volume' into 'NIFTy_5'

Add total_volume property to DomainTuple

See merge request !359
parents b43ef800 f14b80e3
Pipeline #63030 passed with stages
in 19 minutes and 29 seconds
...@@ -19,6 +19,8 @@ from functools import reduce ...@@ -19,6 +19,8 @@ from functools import reduce
from . import utilities from . import utilities
from .domains.domain import Domain from .domains.domain import Domain
import numpy as np
class DomainTuple(object): class DomainTuple(object):
"""Ordered sequence of Domain objects. """Ordered sequence of Domain objects.
...@@ -125,6 +127,58 @@ class DomainTuple(object): ...@@ -125,6 +127,58 @@ class DomainTuple(object):
""" """
return self._size return self._size
def scalar_weight(self, spaces=None):
"""Returns the uniform volume element for a sub-domain of `self`.
Parameters
----------
spaces : int, tuple of int or None
Indices of the sub-domains to be considered.
If `None`, the entire domain is used.
Returns
-------
float or None
If the requested sub-domain has a uniform volume element, it is
returned. Otherwise, `None` is returned.
"""
if np.isscalar(spaces):
return self._dom[spaces].scalar_dvol
if spaces is None:
spaces = range(len(self._dom))
res = 1.
for i in spaces:
tmp = self._dom[i].scalar_dvol
if tmp is None:
return None
res *= tmp
return res
def total_volume(self, spaces=None):
"""Returns the total volume of `self` or of a subspace of it.
Parameters
----------
spaces : int, tuple of int or None
Indices of the sub-domains of the domain to be considered.
If `None`, the total volume of the whole domain is returned.
Returns
-------
float
the total volume of the requested (sub-)domain.
"""
if np.isscalar(spaces):
return self._dom[spaces].total_volume
if spaces is None:
spaces = range(len(self._dom))
res = 1.
for i in spaces:
res *= self._dom[i].total_volume
return res
@property @property
def axes(self): def axes(self):
"""tuple of tuple of int : axis indices of the underlying domains""" """tuple of tuple of int : axis indices of the underlying domains"""
......
...@@ -246,42 +246,23 @@ class Field(object): ...@@ -246,42 +246,23 @@ class Field(object):
If the requested sub-domain has a uniform volume element, it is If the requested sub-domain has a uniform volume element, it is
returned. Otherwise, `None` is returned. returned. Otherwise, `None` is returned.
""" """
if np.isscalar(spaces): return self._domain.scalar_weight(spaces)
return self._domain[spaces].scalar_dvol
if spaces is None:
spaces = range(len(self._domain))
res = 1.
for i in spaces:
tmp = self._domain[i].scalar_dvol
if tmp is None:
return None
res *= tmp
return res
def total_volume(self, spaces=None): def total_volume(self, spaces=None):
"""Returns the total volume of a sub-domain of `self`. """Returns the total volume of the field's domain or of a subspace of it.
Parameters Parameters
---------- ----------
spaces : int, tuple of int or None spaces : int, tuple of int or None
Indices of the sub-domains of the field's domain to be considered. Indices of the sub-domains of the field's domain to be considered.
If `None`, the entire domain is used. If `None`, the total volume of the whole domain is returned.
Returns Returns
------- -------
float float
the total volume of the requested sub-domain. the total volume of the requested (sub-)domain.
""" """
if np.isscalar(spaces): return self._domain.total_volume(spaces)
return self._domain[spaces].total_volume
if spaces is None:
spaces = range(len(self._domain))
res = 1.
for i in spaces:
res *= self._domain[i].total_volume
return res
def weight(self, power=1, spaces=None): def weight(self, power=1, spaces=None):
"""Weights the pixels of `self` with their invidual pixel volumes. """Weights the pixels of `self` with their invidual pixel volumes.
......
...@@ -219,17 +219,23 @@ def test_weight(): ...@@ -219,17 +219,23 @@ def test_weight():
f = ift.Field.full(s1, 10.) f = ift.Field.full(s1, 10.)
f2 = f.weight(1) f2 = f.weight(1)
assert_equal(f.weight(1).local_data, f2.local_data) assert_equal(f.weight(1).local_data, f2.local_data)
assert_equal(f.domain.total_volume(), 1)
assert_equal(f.domain.total_volume(0), 1)
assert_equal(f.domain.total_volume((0,)), 1)
assert_equal(f.total_volume(), 1) assert_equal(f.total_volume(), 1)
assert_equal(f.total_volume(0), 1) assert_equal(f.total_volume(0), 1)
assert_equal(f.total_volume((0,)), 1) assert_equal(f.total_volume((0,)), 1)
assert_equal(f.domain.scalar_weight(), 0.1)
assert_equal(f.domain.scalar_weight(0), 0.1)
assert_equal(f.domain.scalar_weight((0,)), 0.1)
assert_equal(f.scalar_weight(), 0.1) assert_equal(f.scalar_weight(), 0.1)
assert_equal(f.scalar_weight(0), 0.1) assert_equal(f.scalar_weight(0), 0.1)
assert_equal(f.scalar_weight((0,)), 0.1) assert_equal(f.scalar_weight((0,)), 0.1)
s1 = ift.GLSpace(10) s1 = ift.GLSpace(10)
f = ift.Field.full(s1, 10.) f = ift.Field.full(s1, 10.)
assert_equal(f.scalar_weight(), None) assert_equal(f.domain.scalar_weight(), None)
assert_equal(f.scalar_weight(0), None) assert_equal(f.domain.scalar_weight(0), None)
assert_equal(f.scalar_weight((0,)), None) assert_equal(f.domain.scalar_weight((0,)), None)
@pmp('dom', [ift.RGSpace(10), ift.GLSpace(10)]) @pmp('dom', [ift.RGSpace(10), ift.GLSpace(10)])
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment