From cc99cfa2cec9919deb93654658ff29923c0c50c1 Mon Sep 17 00:00:00 2001
From: Martin Reinecke <martin@mpa-garching.mpg.de>
Date: Sat, 1 Jul 2017 14:00:04 +0200
Subject: [PATCH] no more zerocenter

---
 nifty/operators/fft_operator/fft_operator.py  |   4 +-
 .../transformations/rg_transforms.py          | 227 ------------------
 .../transformations/rgrgtransformation.py     |  15 +-
 nifty/spaces/rg_space/rg_space.py             |  44 +---
 test/test_operators/test_fft_operator.py      |  34 ++-
 test/test_spaces/test_power_space.py          |   9 +-
 test/test_spaces/test_rg_space.py             |  53 +---
 7 files changed, 40 insertions(+), 346 deletions(-)

diff --git a/nifty/operators/fft_operator/fft_operator.py b/nifty/operators/fft_operator/fft_operator.py
index c04bfbbb2..73723cf61 100644
--- a/nifty/operators/fft_operator/fft_operator.py
+++ b/nifty/operators/fft_operator/fft_operator.py
@@ -57,7 +57,7 @@ class FFTOperator(LinearOperator):
         "adjoint_times".
         If omitted, a co-domain will be chosen automatically.
         Whenever "domain" is an RGSpace, the codomain (and its parameters) are
-        uniquely determined (except for "zerocenter").
+        uniquely determined.
         For GLSpace, HPSpace, and LMSpace, a sensible (but not unique)
         co-domain is chosen that should work satisfactorily in most situations,
         but for full control, the user should explicitly specify a codomain.
@@ -235,7 +235,7 @@ class FFTOperator(LinearOperator):
             A (more or less perfect) counterpart to "domain" with respect
             to a FFT operation.
             Whenever "domain" is an RGSpace, the codomain (and its parameters)
-            are uniquely determined (except for "zerocenter").
+            are uniquely determined.
             For GLSpace, HPSpace, and LMSpace, a sensible (but not unique)
             co-domain is chosen that should work satisfactorily in most
             situations. For full control however, the user should not rely on
diff --git a/nifty/operators/fft_operator/transformations/rg_transforms.py b/nifty/operators/fft_operator/transformations/rg_transforms.py
index 9b4866420..a0be1d788 100644
--- a/nifty/operators/fft_operator/transformations/rg_transforms.py
+++ b/nifty/operators/fft_operator/transformations/rg_transforms.py
@@ -37,150 +37,6 @@ class Transform(Loggable, object):
         self.domain = domain
         self.codomain = codomain
 
-        # initialize the dictionary which stores the values from
-        # get_centering_mask
-        self.centering_mask_dict = {}
-
-    def get_centering_mask(self, to_center_input, dimensions_input,
-                           offset_input=False):
-        """
-            Computes the mask, used to (de-)zerocenter domain and target
-            fields.
-
-            Parameters
-            ----------
-            to_center_input : tuple, list, numpy.ndarray
-                A tuple of booleans which dimensions should be
-                zero-centered.
-
-            dimensions_input : tuple, list, numpy.ndarray
-                A tuple containing the mask's desired shape.
-
-            offset_input : int, boolean
-                Specifies whether the zero-th dimension starts with an odd
-                or and even index, i.e. if it is shifted.
-
-            Returns
-            -------
-            result : np.ndarray
-                A 1/-1-alternating mask.
-        """
-        # cast input
-        to_center = np.array(to_center_input)
-        dimensions = np.array(dimensions_input)
-
-        # if none of the dimensions are zero centered, return a 1
-        if np.all(to_center == 0):
-            return 1
-
-        if np.all(dimensions == np.array(1)) or \
-                np.all(dimensions == np.array([1])):
-            return dimensions
-        # The dimensions of size 1 must be sorted out for computing the
-        # centering_mask. The depth of the array will be restored in the
-        # end.
-        size_one_dimensions = []
-        temp_dimensions = []
-        temp_to_center = []
-        for i in range(len(dimensions)):
-            if dimensions[i] == 1:
-                size_one_dimensions += [True]
-            else:
-                size_one_dimensions += [False]
-                temp_dimensions += [dimensions[i]]
-                temp_to_center += [to_center[i]]
-        dimensions = np.array(temp_dimensions)
-        to_center = np.array(temp_to_center)
-        # cast the offset_input into the shape of to_center
-        offset = np.zeros(to_center.shape, dtype=int)
-        # if the first dimension has length 1 and has an offset, restore the
-        # global minus by hand
-        if not size_one_dimensions[0]:
-            offset[0] = int(offset_input)
-        # check for dimension match
-        if to_center.size != dimensions.size:
-            raise TypeError(
-                'The length of the supplied lists does not match.')
-
-        # build up the value memory
-        # compute an identifier for the parameter set
-        temp_id = tuple(
-            (tuple(to_center), tuple(dimensions), tuple(offset)))
-        if temp_id not in self.centering_mask_dict:
-            # use np.tile in order to stack the core alternation scheme
-            # until the desired format is constructed.
-            core = np.fromfunction(
-                lambda *args: (-1) **
-                              (np.tensordot(to_center,
-                                            args +
-                                            offset.reshape(offset.shape +
-                                                           (1,) *
-                                                           (np.array(
-                                                              args).ndim - 1)),
-                                            1)),
-                (2,) * to_center.size)
-            # Cast the core to the smallest integers we can get
-            core = core.astype(np.int8)
-
-            centering_mask = np.tile(core, dimensions // 2)
-            # for the dimensions of odd size corresponding slices must be
-            # added
-            for i in range(centering_mask.ndim):
-                # check if the size of the certain dimension is odd or even
-                if (dimensions % 2)[i] == 0:
-                    continue
-                # prepare the slice object
-                temp_slice = (slice(None),) * i + (slice(-2, -1, 1),) + \
-                             (slice(None),) * (centering_mask.ndim - 1 - i)
-                # append the slice to the centering_mask
-                centering_mask = np.append(centering_mask,
-                                           centering_mask[temp_slice],
-                                           axis=i)
-            # Add depth to the centering_mask where the length of a
-            # dimension was one
-            temp_slice = ()
-            for i in range(len(size_one_dimensions)):
-                if size_one_dimensions[i]:
-                    temp_slice += (None,)
-                else:
-                    temp_slice += (slice(None),)
-            centering_mask = centering_mask[temp_slice]
-            # if the first dimension has length 1 and has an offset, restore
-            # the global minus by hand
-            if size_one_dimensions[0] and offset_input:
-                centering_mask *= -1
-
-            self.centering_mask_dict[temp_id] = centering_mask
-        return self.centering_mask_dict[temp_id]
-
-    def _apply_mask(self, val, mask, axes):
-        """
-            Apply centering mask to an array.
-
-            Parameters
-            ----------
-            val: distributed_data_object or numpy.ndarray
-                The value-array on which the mask should be applied.
-
-            mask: numpy.ndarray
-                The mask to be applied.
-
-            axes: tuple
-                The axes which are to be transformed.
-
-            Returns
-            -------
-            distributed_data_object or np.nd_array
-                Mask input array by multiplying it with the mask.
-        """
-        # reshape mask if necessary
-        if axes:
-            mask = mask.reshape(
-                [y if x in axes else 1
-                 for x, y in enumerate(val.shape)]
-            )
-        return val * mask
-
     def transform(self, val, axes, **kwargs):
         """
             A generic ff-transform function.
@@ -242,11 +98,6 @@ class MPIFFT(Transform):
         return self.info_dict[temp_id]
 
     def _atomic_mpi_transform(self, val, info, axes):
-        # Apply codomain centering mask
-        if reduce(lambda x, y: x + y, self.codomain.zerocenter):
-            temp_val = np.copy(val)
-            val = self._apply_mask(temp_val, info.cmask_codomain, axes)
-
         p = info.plan
         # Load the value into the plan
         if p.has_input:
@@ -259,13 +110,6 @@ class MPIFFT(Transform):
         else:
             return None
 
-        # Apply domain centering mask
-        if reduce(lambda x, y: x + y, self.domain.zerocenter):
-            result = self._apply_mask(result, info.cmask_domain, axes)
-
-        # Correct the sign if needed
-        result *= info.sign
-
         return result
 
     def _local_transform(self, val, axes, **kwargs):
@@ -286,27 +130,12 @@ class MPIFFT(Transform):
                                                 is_local=True,
                                                 **kwargs)
 
-        # Apply codomain centering mask
-        if reduce(lambda x, y: x + y, self.codomain.zerocenter):
-            temp_val = np.copy(local_val)
-            local_val = self._apply_mask(temp_val,
-                                         current_info.cmask_codomain, axes)
-
         local_result = current_info.fftw_interface(
             local_val,
             axes=axes,
             planner_effort='FFTW_ESTIMATE'
         )
 
-        # Apply domain centering mask
-        if reduce(lambda x, y: x + y, self.domain.zerocenter):
-            local_result = self._apply_mask(local_result,
-                                            current_info.cmask_domain, axes)
-
-        # Correct the sign if needed
-        if current_info.sign != 1:
-            local_result *= current_info.sign
-
         try:
             # Create return object and insert results inplace
             return_val = val.copy_empty(global_shape=val.shape,
@@ -475,33 +304,6 @@ class FFTWTransformInfo(object):
         shape = (local_shape if axes is None else
                  [y for x, y in enumerate(local_shape) if x in axes])
 
-        self._cmask_domain = fftw_context.get_centering_mask(domain.zerocenter,
-                                                             shape,
-                                                             local_offset_Q)
-
-        self._cmask_codomain = fftw_context.get_centering_mask(
-                                                         codomain.zerocenter,
-                                                         shape,
-                                                         local_offset_Q)
-
-        # If both domain and codomain are zero-centered the result,
-        # will get a global minus. Store the sign to correct it.
-        self._sign = (-1) ** np.sum(np.array(domain.zerocenter) *
-                                    np.array(codomain.zerocenter) *
-                                    (np.array(domain.shape) // 2 % 2))
-
-    @property
-    def cmask_domain(self):
-        return self._cmask_domain
-
-    @property
-    def cmask_codomain(self):
-        return self._cmask_codomain
-
-    @property
-    def sign(self):
-        return self._sign
-
 
 class FFTWLocalTransformInfo(FFTWTransformInfo):
     def __init__(self, domain, codomain, axes, local_shape,
@@ -624,20 +426,6 @@ class SerialFFT(Transform):
         return return_val
 
     def _atomic_transform(self, local_val, axes, local_offset_Q):
-
-        # some auxiliaries for the mask computation
-        local_shape = local_val.shape
-        shape = (local_shape if axes is None else
-                 [y for x, y in enumerate(local_shape) if x in axes])
-
-        # Apply codomain centering mask
-        if reduce(lambda x, y: x + y, self.codomain.zerocenter):
-            temp_val = np.copy(local_val)
-            mask = self.get_centering_mask(self.codomain.zerocenter,
-                                           shape,
-                                           local_offset_Q)
-            local_val = self._apply_mask(temp_val, mask, axes)
-
         # perform the transformation
         if self._use_fftw:
             if self.codomain.harmonic:
@@ -652,19 +440,4 @@ class SerialFFT(Transform):
             else:
                 result_val = np.fft.ifftn(local_val, axes=axes)
 
-        # Apply domain centering mask
-        if reduce(lambda x, y: x + y, self.domain.zerocenter):
-            mask = self.get_centering_mask(self.domain.zerocenter,
-                                           shape,
-                                           local_offset_Q)
-            result_val = self._apply_mask(result_val, mask, axes)
-
-        # If both domain and codomain are zero-centered the result,
-        # will get a global minus. Store the sign to correct it.
-        sign = (-1) ** np.sum(np.array(self.domain.zerocenter) *
-                              np.array(self.codomain.zerocenter) *
-                              (np.array(self.domain.shape) // 2 % 2))
-        if sign != 1:
-            result_val *= sign
-
         return result_val
diff --git a/nifty/operators/fft_operator/transformations/rgrgtransformation.py b/nifty/operators/fft_operator/transformations/rgrgtransformation.py
index 92deac634..c4685bcc2 100644
--- a/nifty/operators/fft_operator/transformations/rgrgtransformation.py
+++ b/nifty/operators/fft_operator/transformations/rgrgtransformation.py
@@ -50,7 +50,7 @@ class RGRGTransformation(Transformation):
         return True
 
     @classmethod
-    def get_codomain(cls, domain, zerocenter=None):
+    def get_codomain(cls, domain):
         """
             Generates a compatible codomain to which transformations are
             reasonable, i.e.\  either a shifted grid or a Fourier conjugate
@@ -60,9 +60,6 @@ class RGRGTransformation(Transformation):
             ----------
             domain: RGSpace
                 Space for which a codomain is to be generated
-            zerocenter : {bool, numpy.ndarray}, *optional*
-                Whether or not the grid is zerocentered for each axis or not
-                (default: None).
 
             Returns
             -------
@@ -72,21 +69,11 @@ class RGRGTransformation(Transformation):
         if not isinstance(domain, RGSpace):
             raise TypeError("domain needs to be a RGSpace")
 
-        # parse the zerocenter input
-        if zerocenter is None:
-            zerocenter = domain.zerocenter
-        # if the input is something scalar, cast it to a boolean
-        else:
-            temp = np.empty_like(domain.zerocenter)
-            temp[:] = zerocenter
-            zerocenter = temp
-
         # calculate the initialization parameters
         distances = 1 / (np.array(domain.shape) *
                          np.array(domain.distances))
 
         new_space = RGSpace(domain.shape,
-                            zerocenter=zerocenter,
                             distances=distances,
                             harmonic=(not domain.harmonic))
 
diff --git a/nifty/spaces/rg_space/rg_space.py b/nifty/spaces/rg_space/rg_space.py
index 26e9f8bd6..b43fa4db8 100644
--- a/nifty/spaces/rg_space/rg_space.py
+++ b/nifty/spaces/rg_space/rg_space.py
@@ -52,10 +52,6 @@ class RGSpace(Space):
         ----------
         shape : {int, numpy.ndarray}
             Number of grid points or numbers of gridpoints along each axis.
-        zerocenter : {bool, numpy.ndarray} *optional*
-            Whether x==0 (or k==0, respectively) is located in the center of
-            the grid (or the center of each axis speparately) or not.
-            (default: False).
         distances : {float, numpy.ndarray}, *optional*
             Distance between two grid points along each axis
             (default: None).
@@ -72,9 +68,6 @@ class RGSpace(Space):
         ----------
         harmonic : bool
             Whether or not the grid represents a position or harmonic space.
-        zerocenter : tuple of bool
-            Whether x==0 (or k==0, respectively) is located in the center of
-            the grid (or the center of each axis speparately) or not.
         distances : tuple of floats
             Distance between two grid points along the correponding axis.
         dim : np.int
@@ -90,15 +83,13 @@ class RGSpace(Space):
 
     # ---Overwritten properties and methods---
 
-    def __init__(self, shape, zerocenter=False, distances=None,
-                 harmonic=False):
+    def __init__(self, shape, distances=None, harmonic=False):
         self._harmonic = bool(harmonic)
 
         super(RGSpace, self).__init__()
 
         self._shape = self._parse_shape(shape)
         self._distances = self._parse_distances(distances)
-        self._zerocenter = self._parse_zerocenter(zerocenter)
 
     def hermitian_decomposition(self, x, axes=None,
                                 preserve_gaussian_variance=False):
@@ -186,8 +177,8 @@ class RGSpace(Space):
     # ---Mandatory properties and methods---
 
     def __repr__(self):
-        return ("RGSpace(shape=%r, zerocenter=%r, distances=%r, harmonic=%r)"
-                % (self.shape, self.zerocenter, self.distances, self.harmonic))
+        return ("RGSpace(shape=%r, distances=%r, harmonic=%r)"
+                % (self.shape, self.distances, self.harmonic))
 
     @property
     def harmonic(self):
@@ -207,7 +198,6 @@ class RGSpace(Space):
 
     def copy(self):
         return self.__class__(shape=self.shape,
-                              zerocenter=self.zerocenter,
                               distances=self.distances,
                               harmonic=self.harmonic)
 
@@ -269,16 +259,13 @@ class RGSpace(Space):
 
         dists = (cords[0] - shape[0]//2)*dk[0]
         dists *= dists
-        # apply zerocenterQ shift
-        if not self.zerocenter[0]:
-            dists = np.fft.ifftshift(dists)
+        dists = np.fft.ifftshift(dists)
         # only save the individual slice
         dists = dists[slice_of_first_dimension]
         for ii in range(1, len(shape)):
             temp = (cords[ii] - shape[ii] // 2) * dk[ii]
             temp *= temp
-            if not self.zerocenter[ii]:
-                temp = np.fft.ifftshift(temp)
+            temp = np.fft.ifftshift(temp)
             dists = dists + temp
         dists = np.sqrt(dists)
         return dists
@@ -297,21 +284,6 @@ class RGSpace(Space):
 
         return self._distances
 
-    @property
-    def zerocenter(self):
-        """Returns True if grid points lie symmetrically around zero.
-
-        Returns
-        -------
-        bool
-            True if the grid points are centered around the 0 grid point. This
-            option is most common for harmonic spaces (where both conventions
-            are used) but may be used for position spaces, too.
-
-        """
-
-        return self._zerocenter
-
     def _parse_shape(self, shape):
         if np.isscalar(shape):
             shape = (shape,)
@@ -330,16 +302,11 @@ class RGSpace(Space):
             temp[:] = distances
         return tuple(temp)
 
-    def _parse_zerocenter(self, zerocenter):
-        temp = np.empty(len(self.shape), dtype=bool)
-        temp[:] = zerocenter
-        return tuple(temp)
 
     # ---Serialization---
 
     def _to_hdf5(self, hdf5_group):
         hdf5_group['shape'] = self.shape
-        hdf5_group['zerocenter'] = self.zerocenter
         hdf5_group['distances'] = self.distances
         hdf5_group['harmonic'] = self.harmonic
 
@@ -349,7 +316,6 @@ class RGSpace(Space):
     def _from_hdf5(cls, hdf5_group, repository):
         result = cls(
             shape=hdf5_group['shape'][:],
-            zerocenter=hdf5_group['zerocenter'][:],
             distances=hdf5_group['distances'][:],
             harmonic=hdf5_group['harmonic'][()],
             )
diff --git a/test/test_operators/test_fft_operator.py b/test/test_operators/test_fft_operator.py
index 696fbbed4..81cf444f3 100644
--- a/test/test_operators/test_fft_operator.py
+++ b/test/test_operators/test_fft_operator.py
@@ -49,32 +49,31 @@ def _get_rtol(tp):
 
 
 class FFTOperatorTests(unittest.TestCase):
-    @expand(product([10, 11], [False, True], [0.1, 1, 3.7]))
-    def test_RG_distance_1D(self, dim1, zc1, d):
-        foo = RGSpace([dim1], zerocenter=zc1, distances=d)
+    @expand(product([10, 11], [0.1, 1, 3.7]))
+    def test_RG_distance_1D(self, dim1, d):
+        foo = RGSpace([dim1], distances=d)
         res = foo.get_distance_array('not')
-        assert_equal(res[zc1 * (dim1 // 2)], 0.)
+        assert_equal(res[0], 0.)
 
-    @expand(product([10, 11], [9, 28], [False, True], [False, True],
+    @expand(product([10, 11], [9, 28],
                     [0.1, 1, 3.7]))
-    def test_RG_distance_2D(self, dim1, dim2, zc1, zc2, d):
-        foo = RGSpace([dim1, dim2], zerocenter=[zc1, zc2], distances=d)
+    def test_RG_distance_2D(self, dim1, dim2, d):
+        foo = RGSpace([dim1, dim2], distances=d)
         res = foo.get_distance_array('not')
-        assert_equal(res[zc1 * (dim1 // 2), zc2 * (dim2 // 2)], 0.)
+        assert_equal(res[0,0], 0.)
 
     @expand(product(["numpy", "fftw", "fftw_mpi"],
-                    [10, 11], [False, True], [False, True],
-                    [0.1, 1, 3.7],
+                    [10, 11], [0.1, 1, 3.7],
                     [np.float64, np.complex128, np.float32, np.complex64]))
-    def test_fft1D(self, module, dim1, zc1, zc2, d, itp):
+    def test_fft1D(self, module, dim1, d, itp):
         if module == "fftw_mpi":
             if not hasattr(gdi.get('fftw'), 'FFTW_MPI'):
                 raise SkipTest
         if module == "fftw" and "fftw" not in gdi:
             raise SkipTest
         tol = _get_rtol(itp)
-        a = RGSpace(dim1, zerocenter=zc1, distances=d)
-        b = RGSpace(dim1, zerocenter=zc2, distances=1./(dim1*d), harmonic=True)
+        a = RGSpace(dim1, distances=d)
+        b = RGSpace(dim1, distances=1./(dim1*d), harmonic=True)
         fft = FFTOperator(domain=a, target=b, domain_dtype=itp,
                           target_dtype=_harmonic_type(itp), module=module)
         inp = Field.from_random(domain=a, random_type='normal', std=7, mean=3,
@@ -83,19 +82,18 @@ class FFTOperatorTests(unittest.TestCase):
         assert_allclose(inp.val, out.val, rtol=tol, atol=tol)
 
     @expand(product(["numpy", "fftw", "fftw_mpi"],
-                    [10, 11], [9, 12], [False, True],
-                    [False, True], [False, True], [False, True], [0.1, 1, 3.7],
+                    [10, 11], [9, 12], [0.1, 1, 3.7],
                     [0.4, 1, 2.7],
                     [np.float64, np.complex128, np.float32, np.complex64]))
-    def test_fft2D(self, module, dim1, dim2, zc1, zc2, zc3, zc4, d1, d2, itp):
+    def test_fft2D(self, module, dim1, dim2, d1, d2, itp):
         if module == "fftw_mpi":
             if not hasattr(gdi.get('fftw'), 'FFTW_MPI'):
                 raise SkipTest
         if module == "fftw" and "fftw" not in gdi:
             raise SkipTest
         tol = _get_rtol(itp)
-        a = RGSpace([dim1, dim2], zerocenter=[zc1, zc2], distances=[d1, d2])
-        b = RGSpace([dim1, dim2], zerocenter=[zc3, zc4],
+        a = RGSpace([dim1, dim2], distances=[d1, d2])
+        b = RGSpace([dim1, dim2],
                     distances=[1./(dim1*d1), 1./(dim2*d2)], harmonic=True)
         fft = FFTOperator(domain=a, target=b, domain_dtype=itp,
                           target_dtype=_harmonic_type(itp), module=module)
diff --git a/test/test_spaces/test_power_space.py b/test/test_spaces/test_power_space.py
index 256b38647..b638e141a 100644
--- a/test/test_spaces/test_power_space.py
+++ b/test/test_spaces/test_power_space.py
@@ -33,15 +33,12 @@ from nifty import dependency_injector as gdi
 from nose.plugins.skip import SkipTest
 
 HARMONIC_SPACES = [RGSpace((8,), harmonic=True),
-                   RGSpace((7,), harmonic=True, zerocenter=True),
-                   RGSpace((8,), harmonic=True, zerocenter=True),
+                   RGSpace((7,), harmonic=True),
                    RGSpace((7, 8), harmonic=True),
-                   RGSpace((7, 8), harmonic=True, zerocenter=True),
-                   RGSpace((6, 6), harmonic=True, zerocenter=True),
-                   RGSpace((7, 5), harmonic=True, zerocenter=True),
+                   RGSpace((6, 6), harmonic=True),
+                   RGSpace((7, 5), harmonic=True),
                    RGSpace((5, 5), harmonic=True),
                    RGSpace((4, 5, 7), harmonic=True),
-                   RGSpace((4, 5, 7), harmonic=True, zerocenter=True),
                    LMSpace(6),
                    LMSpace(9)]
 
diff --git a/test/test_spaces/test_rg_space.py b/test/test_spaces/test_rg_space.py
index e3f950c71..cc394b1b4 100644
--- a/test/test_spaces/test_rg_space.py
+++ b/test/test_spaces/test_rg_space.py
@@ -25,57 +25,43 @@ from numpy.testing import assert_, assert_equal, assert_almost_equal
 from nifty import RGSpace
 from test.common import expand
 
-# [shape, zerocenter, distances, harmonic, expected]
+# [shape, distances, harmonic, expected]
 CONSTRUCTOR_CONFIGS = [
-        [(8,), False, None, False,
+        [(8,), None, False,
             {
                 'shape': (8,),
-                'zerocenter': (False,),
                 'distances': (0.125,),
                 'harmonic': False,
                 'dim': 8,
                 'total_volume': 1.0
             }],
-        [(8,), True, None, False,
+        [(8,), None, True,
             {
                 'shape': (8,),
-                'zerocenter': (True,),
-                'distances': (0.125,),
-                'harmonic': False,
-                'dim': 8,
-                'total_volume': 1.0
-            }],
-        [(8,), False, None, True,
-            {
-                'shape': (8,),
-                'zerocenter': (False,),
                 'distances': (1.0,),
                 'harmonic': True,
                 'dim': 8,
                 'total_volume': 8.0
             }],
-        [(8,), False, (12,), True,
+        [(8,), (12,), True,
             {
                 'shape': (8,),
-                'zerocenter': (False,),
                 'distances': (12.0,),
                 'harmonic': True,
                 'dim': 8,
                 'total_volume': 96.0
             }],
-        [(11, 11), (False, True), None, False,
+        [(11, 11), None, False,
             {
                 'shape': (11, 11),
-                'zerocenter': (False, True),
                 'distances': (1/11, 1/11),
                 'harmonic': False,
                 'dim': 121,
                 'total_volume': 1.0
             }],
-        [(11, 11), True, (1.3, 1.3), True,
+        [(11, 11), (1.3, 1.3), True,
             {
                 'shape': (11, 11),
-                'zerocenter': (True, True),
                 'distances': (1.3, 1.3),
                 'harmonic': True,
                 'dim': 121,
@@ -86,7 +72,7 @@ CONSTRUCTOR_CONFIGS = [
 
 
 def get_distance_array_configs():
-    # for RGSpace(shape=(4, 4), distances=None, zerocenter=[False, False])
+    # for RGSpace(shape=(4, 4), distances=None)
     cords_0 = np.ogrid[0:4, 0:4]
     da_0 = ((cords_0[0] - 4 // 2) * 0.25)**2
     da_0 = np.fft.ifftshift(da_0)
@@ -94,20 +80,8 @@ def get_distance_array_configs():
     temp = np.fft.ifftshift(temp)
     da_0 = da_0 + temp
     da_0 = np.sqrt(da_0)
-    # for RGSpace(shape=(4, 4), distances=None, zerocenter=[True, True])
-    da_1 = ((cords_0[0] - 4 // 2) * 0.25)**2
-    temp = ((cords_0[1] - 4 // 2) * 0.25)**2
-    da_1 = da_1 + temp
-    da_1 = np.sqrt(da_1)
-    # for RGSpace(shape=(4, 4), distances=(12, 12), zerocenter=[True, True])
-    da_2 = ((cords_0[0] - 4 // 2) * 12)**2
-    temp = ((cords_0[1] - 4 // 2) * 12)**2
-    da_2 = da_2 + temp
-    da_2 = np.sqrt(da_2)
     return [
-        [(4, 4),  None, [False, False], da_0],
-        [(4, 4),  None, [True, True], da_1],
-        [(4, 4),  (12, 12), [True, True], da_2]
+        [(4, 4),  None, da_0],
         ]
 
 
@@ -213,8 +187,7 @@ def get_hermitian_configs():
 
 
 class RGSpaceInterfaceTests(unittest.TestCase):
-    @expand([['distances', tuple],
-            ['zerocenter', tuple]])
+    @expand([['distances', tuple]])
     def test_property_ret_type(self, attribute, expected_type):
         x = RGSpace(1)
         assert_(isinstance(getattr(x, attribute), expected_type))
@@ -222,9 +195,9 @@ class RGSpaceInterfaceTests(unittest.TestCase):
 
 class RGSpaceFunctionalityTests(unittest.TestCase):
     @expand(CONSTRUCTOR_CONFIGS)
-    def test_constructor(self, shape, zerocenter, distances,
+    def test_constructor(self, shape, distances,
                          harmonic, expected):
-        x = RGSpace(shape, zerocenter, distances, harmonic)
+        x = RGSpace(shape, distances, harmonic)
         for key, value in expected.iteritems():
             assert_equal(getattr(x, key), value)
 
@@ -235,8 +208,8 @@ class RGSpaceFunctionalityTests(unittest.TestCase):
         assert_almost_equal(r.hermitian_decomposition(x, axes=axes)[1], imag)
 
     @expand(get_distance_array_configs())
-    def test_distance_array(self, shape, distances, zerocenter, expected):
-        r = RGSpace(shape=shape, distances=distances, zerocenter=zerocenter)
+    def test_distance_array(self, shape, distances, expected):
+        r = RGSpace(shape=shape, distances=distances)
         assert_almost_equal(r.get_distance_array('not'), expected)
 
     @expand(get_weight_configs())
-- 
GitLab