Skip to content
Snippets Groups Projects
Commit 6291b020 authored by Colm Talbot's avatar Colm Talbot
Browse files

Allow different time reference and polarizations in MBTransient

parent 4b9c75ba
No related branches found
No related tags found
No related merge requests found
...@@ -1862,14 +1862,21 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient): ...@@ -1862,14 +1862,21 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient):
maximum offset of geocent time is 2.1 seconds, which is the value for the standard prior used by maximum offset of geocent time is 2.1 seconds, which is the value for the standard prior used by
LIGO-Virgo-KAGRA. LIGO-Virgo-KAGRA.
""" """
time_parameter = self.time_reference + "_time"
if time_parameter == "geocent_time":
safety = radius_of_earth / speed_of_light
else:
safety = 2 * radius_of_earth / speed_of_light
if time_offset is not None: if time_offset is not None:
if isinstance(time_offset, int) or isinstance(time_offset, float): if isinstance(time_offset, int) or isinstance(time_offset, float):
self._time_offset = time_offset self._time_offset = time_offset
else: else:
raise TypeError("time_offset must be a number") raise TypeError("time_offset must be a number")
elif self.priors is not None and 'geocent_time' in self.priors: elif self.priors is not None and time_parameter in self.priors:
self._time_offset = self.interferometers.start_time + self.interferometers.duration \ self._time_offset = (
- self.priors['geocent_time'].minimum + radius_of_earth / speed_of_light self.interferometers.start_time + self.interferometers.duration
- self.priors[time_parameter].minimum + safety
)
else: else:
self._time_offset = 2.12 self._time_offset = 2.12
logger.warning("time offset can not be inferred. Use the standard time offset of {} seconds.".format( logger.warning("time offset can not be inferred. Use the standard time offset of {} seconds.".format(
...@@ -1889,14 +1896,21 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient): ...@@ -1889,14 +1896,21 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient):
used. It is computed assuming that the minimum offset of geocent time is 1.9 seconds, which is the used. It is computed assuming that the minimum offset of geocent time is 1.9 seconds, which is the
value for the standard prior used by LIGO-Virgo-KAGRA. value for the standard prior used by LIGO-Virgo-KAGRA.
""" """
time_parameter = self.time_reference + "_time"
if time_parameter == "geocent_time":
safety = radius_of_earth / speed_of_light
else:
safety = 2 * radius_of_earth / speed_of_light
if delta_f_end is not None: if delta_f_end is not None:
if isinstance(delta_f_end, int) or isinstance(delta_f_end, float): if isinstance(delta_f_end, int) or isinstance(delta_f_end, float):
self._delta_f_end = delta_f_end self._delta_f_end = delta_f_end
else: else:
raise TypeError("delta_f_end must be a number") raise TypeError("delta_f_end must be a number")
elif self.priors is not None and 'geocent_time' in self.priors: elif self.priors is not None and time_parameter in self.priors:
self._delta_f_end = 100. / (self.interferometers.start_time + self.interferometers.duration self._delta_f_end = 100 / (
- self.priors['geocent_time'].maximum - radius_of_earth / speed_of_light) self.interferometers.start_time + self.interferometers.duration
- self.priors[time_parameter].maximum - safety
)
else: else:
self._delta_f_end = 53. self._delta_f_end = 53.
logger.warning("delta_f_end can not be inferred. Use the standard delta_f_end of {} Hz.".format( logger.warning("delta_f_end can not be inferred. Use the standard delta_f_end of {} Hz.".format(
...@@ -1915,8 +1929,10 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient): ...@@ -1915,8 +1929,10 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient):
a high frequency, which can break down the approximation. It is calculated from the 0PN formula of a high frequency, which can break down the approximation. It is calculated from the 0PN formula of
time-to-merger \tau(f). The user-specified frequency is used if it is lower than that frequency. time-to-merger \tau(f). The user-specified frequency is used if it is lower than that frequency.
""" """
fmax_tmp = (15. / 968.)**(3. / 5.) * (self.highest_mode / (2. * np.pi))**(8. / 5.) \ fmax_tmp = (
(15 / 968)**(3 / 5) * (self.highest_mode / (2 * np.pi))**(8 / 5)
/ self.reference_chirp_mass_in_second / self.reference_chirp_mass_in_second
)
if maximum_banding_frequency is not None: if maximum_banding_frequency is not None:
if isinstance(maximum_banding_frequency, int) or isinstance(maximum_banding_frequency, float): if isinstance(maximum_banding_frequency, int) or isinstance(maximum_banding_frequency, float):
if maximum_banding_frequency < fmax_tmp: if maximum_banding_frequency < fmax_tmp:
...@@ -2230,12 +2246,14 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient): ...@@ -2230,12 +2246,14 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient):
snrs: named tuple of snrs snrs: named tuple of snrs
""" """
f_plus = interferometer.antenna_response( strain = np.zeros(len(self.banded_frequency_points), dtype=complex)
self.parameters['ra'], self.parameters['dec'], for mode in waveform_polarizations:
self.parameters['geocent_time'], self.parameters['psi'], 'plus') response = interferometer.antenna_response(
f_cross = interferometer.antenna_response( self.parameters['ra'], self.parameters['dec'],
self.parameters['ra'], self.parameters['dec'], self.parameters['geocent_time'], self.parameters['psi'],
self.parameters['geocent_time'], self.parameters['psi'], 'cross') mode
)
strain += waveform_polarizations[mode][self.unique_to_original_frequencies] * response
dt = interferometer.time_delay_from_geocenter( dt = interferometer.time_delay_from_geocenter(
self.parameters['ra'], self.parameters['dec'], self.parameters['ra'], self.parameters['dec'],
...@@ -2246,15 +2264,16 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient): ...@@ -2246,15 +2264,16 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient):
calib_factor = interferometer.calibration_model.get_calibration_factor( calib_factor = interferometer.calibration_model.get_calibration_factor(
self.banded_frequency_points, prefix='recalib_{}_'.format(interferometer.name), **self.parameters) self.banded_frequency_points, prefix='recalib_{}_'.format(interferometer.name), **self.parameters)
h = f_plus * waveform_polarizations['plus'][self.unique_to_original_frequencies] \ strain *= np.exp(-1j * 2. * np.pi * self.banded_frequency_points * ifo_time)
+ f_cross * waveform_polarizations['cross'][self.unique_to_original_frequencies] strain *= np.conjugate(calib_factor)
h *= np.exp(-1j * 2. * np.pi * self.banded_frequency_points * ifo_time)
h *= np.conjugate(calib_factor)
d_inner_h = np.dot(h, self.linear_coeffs[interferometer.name]) d_inner_h = np.dot(strain, self.linear_coeffs[interferometer.name])
if self.linear_interpolation: if self.linear_interpolation:
optimal_snr_squared = np.vdot(np.real(h * np.conjugate(h)), self.quadratic_coeffs[interferometer.name]) optimal_snr_squared = np.vdot(
np.real(strain * np.conjugate(strain)),
self.quadratic_coeffs[interferometer.name]
)
else: else:
optimal_snr_squared = 0. optimal_snr_squared = 0.
for b in range(len(self.fb_dfb) - 1): for b in range(len(self.fb_dfb) - 1):
...@@ -2263,12 +2282,12 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient): ...@@ -2263,12 +2282,12 @@ class MBGravitationalWaveTransient(GravitationalWaveTransient):
Mb = self.Mbs[b] Mb = self.Mbs[b]
if b == 0: if b == 0:
optimal_snr_squared += (4. / self.interferometers.duration) * np.vdot( optimal_snr_squared += (4. / self.interferometers.duration) * np.vdot(
np.real(h[start_idx:end_idx + 1] * np.conjugate(h[start_idx:end_idx + 1])), np.real(strain[start_idx:end_idx + 1] * np.conjugate(strain[start_idx:end_idx + 1])),
interferometer.frequency_mask[Ks:Ke + 1] * self.windows[start_idx:end_idx + 1] interferometer.frequency_mask[Ks:Ke + 1] * self.windows[start_idx:end_idx + 1]
/ interferometer.power_spectral_density_array[Ks:Ke + 1]) / interferometer.power_spectral_density_array[Ks:Ke + 1])
else: else:
self.wths[interferometer.name][b][Ks:Ke + 1] = self.square_root_windows[start_idx:end_idx + 1] \ self.wths[interferometer.name][b][Ks:Ke + 1] = self.square_root_windows[start_idx:end_idx + 1] \
* h[start_idx:end_idx + 1] * strain[start_idx:end_idx + 1]
self.hbcs[interferometer.name][b][-Mb:] = np.fft.irfft(self.wths[interferometer.name][b]) self.hbcs[interferometer.name][b][-Mb:] = np.fft.irfft(self.wths[interferometer.name][b])
thbc = np.fft.rfft(self.hbcs[interferometer.name][b]) thbc = np.fft.rfft(self.hbcs[interferometer.name][b])
optimal_snr_squared += (4. / self.Tbhats[b]) * np.vdot( optimal_snr_squared += (4. / self.Tbhats[b]) * np.vdot(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment