From 62e05ba52c72c94e489a77ea5c2033b43bcf6e2c Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Sat, 12 May 2018 14:39:41 +1000
Subject: [PATCH] add frequency masking for detectors

---
 tupak/detector.py | 83 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 64 insertions(+), 19 deletions(-)

diff --git a/tupak/detector.py b/tupak/detector.py
index b2806f7cb..e9aa04c85 100644
--- a/tupak/detector.py
+++ b/tupak/detector.py
@@ -15,22 +15,38 @@ from . import utils
 class Interferometer(object):
     """Class for the Interferometer """
 
-    def __init__(self, name, power_spectral_density, length, latitude, longitude, elevation, xarm_azimuth, yarm_azimuth,
+    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.):
         """
-        Interferometer class
-
-        :param name: interferometer name, e.g., H1
-        :param power_spectral_density: PowerSpectralDensity object, default is aLIGO design sensitivity.
-        :param length: length of the interferometer
-        :param latitude: latitude North in degrees (South is negative)
-        :param longitude: longitude East in degrees (West is negative)
-        :param elevation: height above surface in meters
-        :param xarm_azimuth: orientation of the x arm in degrees North of East
-        :param yarm_azimuth: orientation of the y arm in degrees North of East
-        :param xarm_tilt: tilt of the x arm in radians above the horizontal defined by ellipsoid earth model in
-                          LIGO-T980044-08
-        :param yarm_tilt: tilt of the y arm in radians above the horizontal
+        Instantiate an Interferometer object.
+
+        Parameters
+        ----------
+        name: str
+            Interferometer name, e.g., H1.
+        power_spectral_density: PowerSpectralDensity
+            Power spectral density determining the sensitivity of the detector.
+        minimum_frequency: float
+            Minimum frequency to analyse for detector.
+        maximum_frequency: float
+            Maximum frequency to analyse for detector.
+        length: float
+            Length of the interferometer in km.
+        latitude: float
+            Latitude North in degrees (South is negative).
+        longitude: float
+            Longitude East in degrees (West is negative).
+        elevation: float
+            Height above surface in metres.
+        xarm_azimuth: float
+            Orientation of the x arm in degrees North of East.
+        yarm_azimuth: float
+            Orientation of the y arm in degrees North of East.
+        xarm_tilt: float
+            Tilt of the x arm in radians above the horizontal defined by ellipsoid earth model in LIGO-T980044-08.
+        yarm_tilt: float
+            Tilt of the y arm in radians above the horizontal.
         """
         self.__x_updated = False
         self.__y_updated = False
@@ -38,6 +54,8 @@ class Interferometer(object):
         self.__detector_tensor_update = False
 
         self.name = name
+        self.minimum_frequency = minimum_frequency
+        self.maximum_frequency = maximum_frequency
         self.length = length
         self.latitude = latitude
         self.longitude = longitude
@@ -52,6 +70,27 @@ class Interferometer(object):
         self.sampling_frequency = None
         self.duration = None
 
+    @property
+    def minimum_frequency(self):
+        return self.__minimum_frequency
+
+    @minimum_frequency.setter
+    def minimum_frequency(self, minimum_frequency):
+        self.__minimum_frequency = minimum_frequency
+
+    @property
+    def maximum_frequency(self):
+        return self.__maximum_frequency
+
+    @maximum_frequency.setter
+    def maximum_frequency(self, maximum_frequency):
+        self.__maximum_frequency = maximum_frequency
+
+    @property
+    def frequency_mask(self):
+        """Masking array for limiting the frequency band."""
+        return (self.frequency_array > self.minimum_frequency) & (self.frequency_array < self.maximum_frequency)
+
     @property
     def latitude(self):
         return self.__latitude * 180 / np.pi
@@ -193,6 +232,8 @@ class Interferometer(object):
             signal[mode] = waveform_polarizations[mode] * det_response
         signal_ifo = sum(signal.values())
 
+        signal_ifo *= self.frequency_mask
+
         time_shift = self.time_delay_from_geocenter(
             parameters['ra'],
             parameters['dec'],
@@ -305,8 +346,8 @@ class Interferometer(object):
 
         self.sampling_frequency = sampling_frequency
         self.duration = duration
-        self.data = frequency_domain_strain
         self.frequency_array = frequencies
+        self.data = frequency_domain_strain * self.frequency_mask
 
         return
 
@@ -449,25 +490,29 @@ def get_empty_interferometer(name):
         arXiv:gr-qc/0008066 [45] for V1/ GEO600
     """
     if name == 'H1':
-        H1 = Interferometer(name='H1', power_spectral_density=PowerSpectralDensity(), length=4,
-                            latitude=46 + 27. / 60 + 18.528 / 3600,
+        H1 = Interferometer(name='H1', power_spectral_density=PowerSpectralDensity(),
+                            minimum_frequency=20, maximum_frequency=2048,
+                            length=4, latitude=46 + 27. / 60 + 18.528 / 3600,
                             longitude=-(119 + 24. / 60 + 27.5657 / 3600), elevation=142.554, xarm_azimuth=125.9994,
                             yarm_azimuth=215.994, xarm_tilt=-6.195e-4, yarm_tilt=1.25e-5)
         return H1
     elif name == 'L1':
-        L1 = Interferometer(name='L1', power_spectral_density=PowerSpectralDensity(), length=4,
-                            latitude=30 + 33. / 60 + 46.4196 / 3600,
+        L1 = Interferometer(name='L1', power_spectral_density=PowerSpectralDensity(),
+                            minimum_frequency=20, maximum_frequency=2048,
+                            length=4, latitude=30 + 33. / 60 + 46.4196 / 3600,
                             longitude=-(90 + 46. / 60 + 27.2654 / 3600), elevation=-6.574, xarm_azimuth=197.7165,
                             yarm_azimuth=287.7165,
                             xarm_tilt=-3.121e-4, yarm_tilt=-6.107e-4)
         return L1
     elif name == 'V1':
         V1 = Interferometer(name='V1', power_spectral_density=PowerSpectralDensity(psd_file='AdV_psd.txt'), length=3,
+                            minimum_frequency=20, maximum_frequency=2048,
                             latitude=43 + 37. / 60 + 53.0921 / 3600, longitude=10 + 30. / 60 + 16.1878 / 3600,
                             elevation=51.884, xarm_azimuth=70.5674, yarm_azimuth=160.5674)
         return V1
     elif name == 'GEO600':
         GEO600 = Interferometer(name='GEO600', power_spectral_density=PowerSpectralDensity(asd_file='GEO600_S6e_asd.txt'),
+                                minimum_frequency=40, maximum_frequency=2048,
                                 length=0.6, latitude=52 + 14. / 60 + 42.528 / 3600, longitude=9 + 48. / 60 + 25.894 / 3600,
                                 elevation=114.425,
                                 xarm_azimuth=115.9431, yarm_azimuth=21.6117)
-- 
GitLab