From 9a16cf031306f6146a55ac5ad68f0601ab91b8e7 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 20:37:27 +1000
Subject: [PATCH 01/14] remove obsolete attributes

---
 tupak/gw/detector.py | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 34a868a30..e2a824464 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -622,10 +622,6 @@ class PowerSpectralDensity:
             Name of the ASD file
         frequencies: array_like
             Array containing the frequencies of the ASD/PSD values
-        frequency_noise_realization: list
-            TODO: This isn't doing anything right now
-        interpolated_frequency: list
-            TODO: This isn't doing anything right now
         power_spectral_density: array_like
             Array representation of the PSD
         power_spectral_density_file: str
@@ -637,8 +633,6 @@ class PowerSpectralDensity:
         self.frequencies = []
         self.power_spectral_density = []
         self.amplitude_spectral_density = []
-        self.frequency_noise_realization = []
-        self.interpolated_frequency = []
         self.power_spectral_density_interpolated = None
 
         if asd_file is not None:
-- 
GitLab


From d6344284f535121b1bfd7931720f322b43b2cd3c Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 20:41:03 +1000
Subject: [PATCH 02/14] hide interpolate_power_spectral_density

---
 tupak/gw/detector.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index e2a824464..79964ffc4 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -661,7 +661,7 @@ class PowerSpectralDensity:
             self.frequencies = psd.frequencies
             self.power_spectral_density = psd.value
             self.amplitude_spectral_density = self.power_spectral_density ** 0.5
-            self.interpolate_power_spectral_density()
+            self._interpolate_power_spectral_density()
         elif frequencies is not None:
             if asd_array is not None:
                 self._set_from_amplitude_spectral_density(frequencies, asd_array)
@@ -709,15 +709,15 @@ class PowerSpectralDensity:
         self.frequencies = frequencies
         self.amplitude_spectral_density = amplitude_spectral_density
         self.power_spectral_density = self.amplitude_spectral_density ** 2
-        self.interpolate_power_spectral_density()
+        self._interpolate_power_spectral_density()
 
     def _set_from_power_spectral_density(self, frequencies, power_spectral_density):
         self.frequencies = frequencies
         self.power_spectral_density = power_spectral_density
         self.amplitude_spectral_density = self.power_spectral_density ** 0.5
-        self.interpolate_power_spectral_density()
+        self._interpolate_power_spectral_density()
 
-    def interpolate_power_spectral_density(self):
+    def _interpolate_power_spectral_density(self):
         """Interpolate the loaded PSD so it can be resampled for arbitrary frequency arrays."""
         self.power_spectral_density_interpolated = interp1d(self.frequencies, self.power_spectral_density,
                                                             bounds_error=False,
-- 
GitLab


From bbd379b86b8278dd9561faf29e75e890e76de0c2 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 20:53:56 +1000
Subject: [PATCH 03/14] make asd and psd properties

---
 tupak/gw/detector.py | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 79964ffc4..7e1d58d07 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -629,10 +629,11 @@ class PowerSpectralDensity:
         power_spectral_density_interpolated: scipy.interpolated.interp1d
             Interpolated function of the PSD
         """
+        self.__both_updated = True
+        self.__power_spectral_density = []
+        self.__amplitude_spectral_density = []
 
         self.frequencies = []
-        self.power_spectral_density = []
-        self.amplitude_spectral_density = []
         self.power_spectral_density_interpolated = None
 
         if asd_file is not None:
@@ -679,6 +680,29 @@ class PowerSpectralDensity:
                     min(self.power_spectral_density)))
                 logging.warning("You may have intended to provide this as an amplitude spectral density.")
 
+    @property
+    def power_spectral_density(self):
+        return self.__power_spectral_density
+
+    @power_spectral_density.setter
+    def power_spectral_density(self, power_spectral_density):
+        self.__power_spectral_density = power_spectral_density
+        self._interpolate_power_spectral_density()
+        self.__both_updated = ~self.__both_updated
+        if not self.__both_updated:
+            self.amplitude_spectral_density(power_spectral_density**0.5)
+
+    @property
+    def amplitude_spectral_density(self):
+        return self.__amplitude_spectral_density
+
+    @power_spectral_density.setter
+    def power_spectral_density(self, amplitude_spectral_density):
+        self.__amplitude_spectral_density = amplitude_spectral_density
+        self.__both_updated = ~self.__both_updated
+        if not self.__both_updated:
+            self.power_spectral_density(amplitude_spectral_density**2)
+
     def import_amplitude_spectral_density(self):
         """
         Automagically load one of the amplitude spectral density curves contained in the noise_curves directory.
-- 
GitLab


From 0e7293f4229423d8fd854435faf12f2ea233eb23 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 20:59:26 +1000
Subject: [PATCH 04/14] add check of frequency array and spectral density array

---
 tupak/gw/detector.py | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 7e1d58d07..3fa57f206 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -686,22 +686,24 @@ class PowerSpectralDensity:
 
     @power_spectral_density.setter
     def power_spectral_density(self, power_spectral_density):
-        self.__power_spectral_density = power_spectral_density
-        self._interpolate_power_spectral_density()
-        self.__both_updated = ~self.__both_updated
-        if not self.__both_updated:
-            self.amplitude_spectral_density(power_spectral_density**0.5)
+        if self._check_frequency_array_matches_density_array(power_spectral_density):
+            self.__power_spectral_density = power_spectral_density
+            self._interpolate_power_spectral_density()
+            self.__both_updated = ~self.__both_updated
+            if not self.__both_updated:
+                self.amplitude_spectral_density = power_spectral_density**0.5
 
     @property
     def amplitude_spectral_density(self):
         return self.__amplitude_spectral_density
 
-    @power_spectral_density.setter
-    def power_spectral_density(self, amplitude_spectral_density):
-        self.__amplitude_spectral_density = amplitude_spectral_density
-        self.__both_updated = ~self.__both_updated
-        if not self.__both_updated:
-            self.power_spectral_density(amplitude_spectral_density**2)
+    @amplitude_spectral_density.setter
+    def amplitude_spectral_density(self, amplitude_spectral_density):
+        if self._check_frequency_array_matches_density_array(amplitude_spectral_density):
+            self.__amplitude_spectral_density = amplitude_spectral_density
+            self.__both_updated = ~self.__both_updated
+            if not self.__both_updated:
+                self.power_spectral_density = amplitude_spectral_density**2
 
     def import_amplitude_spectral_density(self):
         """
@@ -729,6 +731,12 @@ class PowerSpectralDensity:
         spectral_density = np.genfromtxt(self.power_spectral_density_file)
         self._set_from_power_spectral_density(spectral_density[:, 0], spectral_density[:, 1])
 
+    def _check_frequency_array_matches_density_array(self, density_array):
+        match = (len(self.frequencies) == len(density_array))
+        if not match:
+            logging.warning('Spectral density does not match frequency array. Not updating.')
+        return match
+
     def _set_from_amplitude_spectral_density(self, frequencies, amplitude_spectral_density):
         self.frequencies = frequencies
         self.amplitude_spectral_density = amplitude_spectral_density
-- 
GitLab


From 16d57a1751ab4c4f23a14ca4483c0b0e0f6e9ebc Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 21:02:26 +1000
Subject: [PATCH 05/14] remove obsolete lines

---
 tupak/gw/detector.py | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 3fa57f206..483249071 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -661,8 +661,6 @@ class PowerSpectralDensity:
             psd = strain.psd(fftlength=fft_length, window=window)
             self.frequencies = psd.frequencies
             self.power_spectral_density = psd.value
-            self.amplitude_spectral_density = self.power_spectral_density ** 0.5
-            self._interpolate_power_spectral_density()
         elif frequencies is not None:
             if asd_array is not None:
                 self._set_from_amplitude_spectral_density(frequencies, asd_array)
@@ -740,14 +738,10 @@ class PowerSpectralDensity:
     def _set_from_amplitude_spectral_density(self, frequencies, amplitude_spectral_density):
         self.frequencies = frequencies
         self.amplitude_spectral_density = amplitude_spectral_density
-        self.power_spectral_density = self.amplitude_spectral_density ** 2
-        self._interpolate_power_spectral_density()
 
     def _set_from_power_spectral_density(self, frequencies, power_spectral_density):
         self.frequencies = frequencies
         self.power_spectral_density = power_spectral_density
-        self.amplitude_spectral_density = self.power_spectral_density ** 0.5
-        self._interpolate_power_spectral_density()
 
     def _interpolate_power_spectral_density(self):
         """Interpolate the loaded PSD so it can be resampled for arbitrary frequency arrays."""
-- 
GitLab


From b0f054f20ca1c36491fe77663104509c27b07f27 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 21:23:54 +1000
Subject: [PATCH 06/14] make PowerSpectralDensity inherit from object

---
 tupak/gw/detector.py | 33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 483249071..a263dde4c 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -574,7 +574,7 @@ class Interferometer(object):
                    header='f h(f)')
 
 
-class PowerSpectralDensity:
+class PowerSpectralDensity(object):
 
     def __init__(self, asd_file=None, psd_file='aLIGO_ZERO_DET_high_P_psd.txt', frame_file=None, asd_array=None,
                  psd_array=None, frequencies=None, epoch=0,
@@ -630,8 +630,8 @@ class PowerSpectralDensity:
             Interpolated function of the PSD
         """
         self.__both_updated = True
-        self.__power_spectral_density = []
-        self.__amplitude_spectral_density = []
+        self.__power_spectral_density = None
+        self.__amplitude_spectral_density = None
 
         self.frequencies = []
         self.power_spectral_density_interpolated = None
@@ -684,12 +684,14 @@ class PowerSpectralDensity:
 
     @power_spectral_density.setter
     def power_spectral_density(self, power_spectral_density):
-        if self._check_frequency_array_matches_density_array(power_spectral_density):
-            self.__power_spectral_density = power_spectral_density
-            self._interpolate_power_spectral_density()
-            self.__both_updated = ~self.__both_updated
-            if not self.__both_updated:
-                self.amplitude_spectral_density = power_spectral_density**0.5
+        # if self._check_frequency_array_matches_density_array(power_spectral_density):
+        self.__power_spectral_density = power_spectral_density
+        self._interpolate_power_spectral_density()
+        # print(self.__both_updated)
+        # self.__both_updated = ~self.__both_updated
+        # print(self.__both_updated)
+        # if not self.__both_updated:
+        self.__amplitude_spectral_density = power_spectral_density**0.5
 
     @property
     def amplitude_spectral_density(self):
@@ -697,11 +699,14 @@ class PowerSpectralDensity:
 
     @amplitude_spectral_density.setter
     def amplitude_spectral_density(self, amplitude_spectral_density):
-        if self._check_frequency_array_matches_density_array(amplitude_spectral_density):
-            self.__amplitude_spectral_density = amplitude_spectral_density
-            self.__both_updated = ~self.__both_updated
-            if not self.__both_updated:
-                self.power_spectral_density = amplitude_spectral_density**2
+        # if self._check_frequency_array_matches_density_array(amplitude_spectral_density):
+        self.__amplitude_spectral_density = amplitude_spectral_density
+        # print(self.__both_updated)
+        # self.__both_updated = ~self.__both_updated
+        # print(self.__both_updated)
+        # if not self.__both_updated:
+        self.__power_spectral_density = amplitude_spectral_density**2
+        self._interpolate_power_spectral_density()
 
     def import_amplitude_spectral_density(self):
         """
-- 
GitLab


From 57ec4f9ef602925fd1a633779d90c01eea8c32bd Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 21:25:39 +1000
Subject: [PATCH 07/14] reinstate check on array length

---
 tupak/gw/detector.py | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index a263dde4c..31d1c1c93 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -684,14 +684,14 @@ class PowerSpectralDensity(object):
 
     @power_spectral_density.setter
     def power_spectral_density(self, power_spectral_density):
-        # if self._check_frequency_array_matches_density_array(power_spectral_density):
-        self.__power_spectral_density = power_spectral_density
-        self._interpolate_power_spectral_density()
+        if self._check_frequency_array_matches_density_array(power_spectral_density):
+            self.__power_spectral_density = power_spectral_density
+            self._interpolate_power_spectral_density()
         # print(self.__both_updated)
         # self.__both_updated = ~self.__both_updated
         # print(self.__both_updated)
         # if not self.__both_updated:
-        self.__amplitude_spectral_density = power_spectral_density**0.5
+            self.__amplitude_spectral_density = power_spectral_density**0.5
 
     @property
     def amplitude_spectral_density(self):
@@ -699,14 +699,14 @@ class PowerSpectralDensity(object):
 
     @amplitude_spectral_density.setter
     def amplitude_spectral_density(self, amplitude_spectral_density):
-        # if self._check_frequency_array_matches_density_array(amplitude_spectral_density):
-        self.__amplitude_spectral_density = amplitude_spectral_density
+        if self._check_frequency_array_matches_density_array(amplitude_spectral_density):
+            self.__amplitude_spectral_density = amplitude_spectral_density
         # print(self.__both_updated)
         # self.__both_updated = ~self.__both_updated
         # print(self.__both_updated)
         # if not self.__both_updated:
-        self.__power_spectral_density = amplitude_spectral_density**2
-        self._interpolate_power_spectral_density()
+            self.__power_spectral_density = amplitude_spectral_density**2
+            self._interpolate_power_spectral_density()
 
     def import_amplitude_spectral_density(self):
         """
-- 
GitLab


From a048e917f7214dd8ff2ac0cdb50050bbfd09c9a4 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 21:26:50 +1000
Subject: [PATCH 08/14] change output for bad psd update

---
 tupak/gw/detector.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 31d1c1c93..2fe0550c9 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -737,7 +737,7 @@ class PowerSpectralDensity(object):
     def _check_frequency_array_matches_density_array(self, density_array):
         match = (len(self.frequencies) == len(density_array))
         if not match:
-            logging.warning('Spectral density does not match frequency array. Not updating.')
+            logging.warning('Provided spectral density does not match frequency array. Not updating.')
         return match
 
     def _set_from_amplitude_spectral_density(self, frequencies, amplitude_spectral_density):
-- 
GitLab


From 922b6e9321084aa9785b8844a7d80a01ae81824d Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 21:27:55 +1000
Subject: [PATCH 09/14] clean up

---
 tupak/gw/detector.py | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 2fe0550c9..32817d357 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -629,7 +629,6 @@ class PowerSpectralDensity(object):
         power_spectral_density_interpolated: scipy.interpolated.interp1d
             Interpolated function of the PSD
         """
-        self.__both_updated = True
         self.__power_spectral_density = None
         self.__amplitude_spectral_density = None
 
@@ -687,10 +686,6 @@ class PowerSpectralDensity(object):
         if self._check_frequency_array_matches_density_array(power_spectral_density):
             self.__power_spectral_density = power_spectral_density
             self._interpolate_power_spectral_density()
-        # print(self.__both_updated)
-        # self.__both_updated = ~self.__both_updated
-        # print(self.__both_updated)
-        # if not self.__both_updated:
             self.__amplitude_spectral_density = power_spectral_density**0.5
 
     @property
@@ -701,10 +696,6 @@ class PowerSpectralDensity(object):
     def amplitude_spectral_density(self, amplitude_spectral_density):
         if self._check_frequency_array_matches_density_array(amplitude_spectral_density):
             self.__amplitude_spectral_density = amplitude_spectral_density
-        # print(self.__both_updated)
-        # self.__both_updated = ~self.__both_updated
-        # print(self.__both_updated)
-        # if not self.__both_updated:
             self.__power_spectral_density = amplitude_spectral_density**2
             self._interpolate_power_spectral_density()
 
-- 
GitLab


From 50a8bb13b084451598bcd1dde83c5b1d4ef5f5f3 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 21:42:52 +1000
Subject: [PATCH 10/14] remove set functions

---
 tupak/gw/detector.py | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 32817d357..b83c1a5d0 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -661,10 +661,11 @@ class PowerSpectralDensity(object):
             self.frequencies = psd.frequencies
             self.power_spectral_density = psd.value
         elif frequencies is not None:
+            self.frequencies = frequencies
             if asd_array is not None:
-                self._set_from_amplitude_spectral_density(frequencies, asd_array)
+                self.amplitude_spectral_density = asd_array
             elif psd_array is not None:
-                self._set_from_amplitude_spectral_density(frequencies, psd_array)
+                self.power_spectral_density = psd_array
         else:
             if psd_file is None:
                 logging.info("No power spectral density provided, using aLIGO, zero detuning, high power.")
@@ -709,8 +710,7 @@ class PowerSpectralDensity(object):
         if '/' not in self.amplitude_spectral_density_file:
             self.amplitude_spectral_density_file = os.path.join(os.path.dirname(__file__), 'noise_curves',
                                                                 self.amplitude_spectral_density_file)
-        spectral_density = np.genfromtxt(self.amplitude_spectral_density_file)
-        self._set_from_amplitude_spectral_density(spectral_density[:, 0], spectral_density[:, 1])
+        self.frequencies, self.amplitude_spectral_density = np.genfromtxt(self.amplitude_spectral_density_file).T
 
     def import_power_spectral_density(self):
         """
@@ -722,8 +722,7 @@ class PowerSpectralDensity(object):
         if '/' not in self.power_spectral_density_file:
             self.power_spectral_density_file = os.path.join(os.path.dirname(__file__), 'noise_curves',
                                                             self.power_spectral_density_file)
-        spectral_density = np.genfromtxt(self.power_spectral_density_file)
-        self._set_from_power_spectral_density(spectral_density[:, 0], spectral_density[:, 1])
+        self.frequencies, self.power_spectral_density = np.genfromtxt(self.power_spectral_density_file).T
 
     def _check_frequency_array_matches_density_array(self, density_array):
         match = (len(self.frequencies) == len(density_array))
@@ -731,14 +730,6 @@ class PowerSpectralDensity(object):
             logging.warning('Provided spectral density does not match frequency array. Not updating.')
         return match
 
-    def _set_from_amplitude_spectral_density(self, frequencies, amplitude_spectral_density):
-        self.frequencies = frequencies
-        self.amplitude_spectral_density = amplitude_spectral_density
-
-    def _set_from_power_spectral_density(self, frequencies, power_spectral_density):
-        self.frequencies = frequencies
-        self.power_spectral_density = power_spectral_density
-
     def _interpolate_power_spectral_density(self):
         """Interpolate the loaded PSD so it can be resampled for arbitrary frequency arrays."""
         self.power_spectral_density_interpolated = interp1d(self.frequencies, self.power_spectral_density,
-- 
GitLab


From 988f415c78e6ab24b06137a9d9e52643db60e490 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Jun 2018 22:52:24 +1000
Subject: [PATCH 11/14] improve extrpolation of PSD

---
 tupak/gw/detector.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index b83c1a5d0..824d45729 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -734,7 +734,7 @@ class PowerSpectralDensity(object):
         """Interpolate the loaded PSD so it can be resampled for arbitrary frequency arrays."""
         self.power_spectral_density_interpolated = interp1d(self.frequencies, self.power_spectral_density,
                                                             bounds_error=False,
-                                                            fill_value=max(self.power_spectral_density))
+                                                            fill_value=np.inf)
 
     def get_noise_realisation(self, sampling_frequency, duration):
         """
@@ -756,6 +756,7 @@ class PowerSpectralDensity(object):
         white_noise, frequencies = utils.create_white_noise(sampling_frequency, duration)
         interpolated_power_spectral_density = self.power_spectral_density_interpolated(frequencies)
         frequency_domain_strain = interpolated_power_spectral_density ** 0.5 * white_noise
+        frequency_domain_strain[(frequencies < min(self.frequencies)) | (frequencies > max(self.frequencies))] = 0
         return frequency_domain_strain, frequencies
 
 
-- 
GitLab


From 09667f8b9112ea35598538a4c503f625d0be834c Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Thu, 21 Jun 2018 08:48:44 +1000
Subject: [PATCH 12/14] apply frequency mask to noise realisation test

---
 test/noise_realisation_tests.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/test/noise_realisation_tests.py b/test/noise_realisation_tests.py
index 8f96cb30c..d69d4921b 100644
--- a/test/noise_realisation_tests.py
+++ b/test/noise_realisation_tests.py
@@ -8,7 +8,7 @@ class TestNoiseRealisation(unittest.TestCase):
     def test_averaged_noise(self):
         time_duration = 1.
         sampling_frequency = 4096.
-        factor = np.sqrt(2./time_duration)
+        factor = np.sqrt(2 / time_duration)
         n_avg = 1000
         psd_avg = 0
         interferometer = tupak.gw.detector.get_empty_interferometer('H1')
@@ -16,11 +16,12 @@ class TestNoiseRealisation(unittest.TestCase):
             interferometer.set_data(sampling_frequency, time_duration, from_power_spectral_density=True)
             psd_avg += abs(interferometer.data)**2
 
-        psd_avg = psd_avg/n_avg
-        asd_avg = np.sqrt(abs(psd_avg))
+        psd_avg = psd_avg / n_avg
+        asd_avg = np.sqrt(abs(psd_avg)) * interferometer.frequency_mask
 
-        a = interferometer.amplitude_spectral_density_array/factor
+        a = np.nan_to_num(interferometer.amplitude_spectral_density_array / factor * interferometer.frequency_mask)
         b = asd_avg
+        print(a, b)
         self.assertTrue(np.allclose(a, b, rtol=1e-1))
 
     def test_noise_normalisation(self):
-- 
GitLab


From 119575fda473ce636cd02ae28fd60dfbb2258fdb Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Thu, 21 Jun 2018 10:25:19 +1000
Subject: [PATCH 13/14] make zeroed noise elements complex

---
 tupak/gw/detector.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 824d45729..77c04c629 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -756,7 +756,8 @@ class PowerSpectralDensity(object):
         white_noise, frequencies = utils.create_white_noise(sampling_frequency, duration)
         interpolated_power_spectral_density = self.power_spectral_density_interpolated(frequencies)
         frequency_domain_strain = interpolated_power_spectral_density ** 0.5 * white_noise
-        frequency_domain_strain[(frequencies < min(self.frequencies)) | (frequencies > max(self.frequencies))] = 0
+        out_of_bounds = (frequencies < min(self.frequencies)) | (frequencies > max(self.frequencies))
+        frequency_domain_strain[out_of_bounds] = 0 * (1 + 1j)
         return frequency_domain_strain, frequencies
 
 
-- 
GitLab


From 6af99cec2479eda2b70e329f17a19a5c06bdbf65 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Thu, 21 Jun 2018 10:31:53 +1000
Subject: [PATCH 14/14] make mismatched arrays raise error

---
 tupak/gw/detector.py | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py
index 77c04c629..bf7d8bd38 100644
--- a/tupak/gw/detector.py
+++ b/tupak/gw/detector.py
@@ -684,10 +684,10 @@ class PowerSpectralDensity(object):
 
     @power_spectral_density.setter
     def power_spectral_density(self, power_spectral_density):
-        if self._check_frequency_array_matches_density_array(power_spectral_density):
-            self.__power_spectral_density = power_spectral_density
-            self._interpolate_power_spectral_density()
-            self.__amplitude_spectral_density = power_spectral_density**0.5
+        self._check_frequency_array_matches_density_array(power_spectral_density)
+        self.__power_spectral_density = power_spectral_density
+        self._interpolate_power_spectral_density()
+        self.__amplitude_spectral_density = power_spectral_density**0.5
 
     @property
     def amplitude_spectral_density(self):
@@ -695,10 +695,10 @@ class PowerSpectralDensity(object):
 
     @amplitude_spectral_density.setter
     def amplitude_spectral_density(self, amplitude_spectral_density):
-        if self._check_frequency_array_matches_density_array(amplitude_spectral_density):
-            self.__amplitude_spectral_density = amplitude_spectral_density
-            self.__power_spectral_density = amplitude_spectral_density**2
-            self._interpolate_power_spectral_density()
+        self._check_frequency_array_matches_density_array(amplitude_spectral_density)
+        self.__amplitude_spectral_density = amplitude_spectral_density
+        self.__power_spectral_density = amplitude_spectral_density**2
+        self._interpolate_power_spectral_density()
 
     def import_amplitude_spectral_density(self):
         """
@@ -725,10 +725,11 @@ class PowerSpectralDensity(object):
         self.frequencies, self.power_spectral_density = np.genfromtxt(self.power_spectral_density_file).T
 
     def _check_frequency_array_matches_density_array(self, density_array):
-        match = (len(self.frequencies) == len(density_array))
-        if not match:
-            logging.warning('Provided spectral density does not match frequency array. Not updating.')
-        return match
+        """Check if the provided frequency and spectral density arrays match."""
+        try:
+            self.frequencies - density_array
+        except ValueError as e:
+            raise(e, 'Provided spectral density does not match frequency array. Not updating.')
 
     def _interpolate_power_spectral_density(self):
         """Interpolate the loaded PSD so it can be resampled for arbitrary frequency arrays."""
-- 
GitLab