From 4f5a57edd7c3cb30c967e5272235745c08033ec5 Mon Sep 17 00:00:00 2001
From: Moritz <email@moritz-huebner.de>
Date: Thu, 2 May 2019 19:33:02 +1000
Subject: [PATCH] Made property accessors more generic

---
 bilby/gw/detector/interferometer.py | 87 ++++++++++++-----------------
 1 file changed, 36 insertions(+), 51 deletions(-)

diff --git a/bilby/gw/detector/interferometer.py b/bilby/gw/detector/interferometer.py
index 671d22f08..9fd8102d7 100644
--- a/bilby/gw/detector/interferometer.py
+++ b/bilby/gw/detector/interferometer.py
@@ -18,7 +18,20 @@ except ImportError:
                    " not be able to use some of the prebuilt functions.")
 
 
-class _InterferometerGeometry(object):
+class _GenericProperty(object):
+
+    def __init__(self, property_name, instance_name):
+        self.property_name = property_name
+        self.instance_name = instance_name
+
+    def __get__(self, instance, owner):
+        return getattr(getattr(instance, self.instance_name), self.property_name)
+
+    def __set__(self, instance, value):
+        setattr(getattr(instance, self.instance_name), self.property_name, value)
+
+
+class InterferometerGeometry(object):
     def __init__(self, length, latitude, longitude, elevation, xarm_azimuth, yarm_azimuth,
                  xarm_tilt=0., yarm_tilt=0.):
         self._x_updated = False
@@ -282,35 +295,29 @@ class _InterferometerGeometry(object):
                 np.sin(arm_tilt) * e_h)
 
 
-class _GeometryProperty(object):
-
-    def __init__(self, name):
-        self.name = name
-
-    def __get__(self, instance, owner):
-        return getattr(instance.geometry, self.name)
-
-    def __set__(self, instance, value):
-        setattr(instance.geometry, self.name, value)
-
-
 class Interferometer(object):
     """Class for the Interferometer """
 
-    length = _GeometryProperty('length')
-    latitude = _GeometryProperty('latitude')
-    latitude_radians = _GeometryProperty('latitude_radians')
-    longitude = _GeometryProperty('longitude')
-    longitude_radians = _GeometryProperty('longitude_radians')
-    elevation = _GeometryProperty('elevation')
-    x = _GeometryProperty('x')
-    y = _GeometryProperty('y')
-    xarm_azimuth = _GeometryProperty('xarm_azimuth')
-    yarm_azimuth = _GeometryProperty('yarm_azimuth')
-    xarm_tilt = _GeometryProperty('xarm_tilt')
-    yarm_tilt = _GeometryProperty('yarm_tilt')
-    vertex = _GeometryProperty('vertex')
-    detector_tensor = _GeometryProperty('detector_tensor')
+    length = _GenericProperty('length', 'geometry')
+    latitude = _GenericProperty('latitude', 'geometry')
+    latitude_radians = _GenericProperty('latitude_radians', 'geometry')
+    longitude = _GenericProperty('longitude', 'geometry')
+    longitude_radians = _GenericProperty('longitude_radians', 'geometry')
+    elevation = _GenericProperty('elevation', 'geometry')
+    x = _GenericProperty('x', 'geometry')
+    y = _GenericProperty('y', 'geometry')
+    xarm_azimuth = _GenericProperty('xarm_azimuth', 'geometry')
+    yarm_azimuth = _GenericProperty('yarm_azimuth', 'geometry')
+    xarm_tilt = _GenericProperty('xarm_tilt', 'geometry')
+    yarm_tilt = _GenericProperty('yarm_tilt', 'geometry')
+    vertex = _GenericProperty('vertex', 'geometry')
+    detector_tensor = _GenericProperty('detector_tensor', 'geometry')
+
+    frequency_array = _GenericProperty('frequency_array', 'strain_data')
+    time_array = _GenericProperty('time_array', 'strain_data')
+    frequency_mask = _GenericProperty('frequency_mask', 'strain_data')
+    frequency_domain_strain = _GenericProperty('frequency_domain_strain', 'strain_data')
+    time_domain_strain = _GenericProperty('time_domain_strain', 'strain_data')
 
     def __init__(self, name, power_spectral_density, minimum_frequency, maximum_frequency, length, latitude, longitude,
                  elevation, xarm_azimuth, yarm_azimuth, xarm_tilt=0., yarm_tilt=0., calibration_model=Recalibrate()):
@@ -348,8 +355,8 @@ class Interferometer(object):
             Calibration model, this applies the calibration correction to the
             template, the default model applies no correction.
         """
-        self.geometry = _InterferometerGeometry(length, latitude, longitude, elevation,
-                                                xarm_azimuth, yarm_azimuth, xarm_tilt, yarm_tilt)
+        self.geometry = InterferometerGeometry(length, latitude, longitude, elevation,
+                                               xarm_azimuth, yarm_azimuth, xarm_tilt, yarm_tilt)
 
         self.name = name
         self.power_spectral_density = power_spectral_density
@@ -692,28 +699,6 @@ class Interferometer(object):
         return (self.power_spectral_density.power_spectral_density_interpolated(self.frequency_array) *
                 self.strain_data.window_factor)
 
-    @property
-    def frequency_array(self):
-        return self.strain_data.frequency_array
-
-    @property
-    def frequency_mask(self):
-        return self.strain_data.frequency_mask
-
-    @property
-    def frequency_domain_strain(self):
-        """ The frequency domain strain in units of strain / Hz """
-        return self.strain_data.frequency_domain_strain
-
-    @property
-    def time_domain_strain(self):
-        """ The time domain strain in units of s """
-        return self.strain_data.time_domain_strain
-
-    @property
-    def time_array(self):
-        return self.strain_data.time_array
-
     def unit_vector_along_arm(self, arm):
         logger.warning("This method has been moved and will be removed in the future."
                        "Use Interferometer.geometry.unit_vector_along_arm instead.")
-- 
GitLab