diff --git a/bilby/gw/likelihood.py b/bilby/gw/likelihood.py index dde655533ab342f58d0bd46feb8a4aa674b09a14..136d9567c832bcd9947421b08f65609d000706b0 100644 --- a/bilby/gw/likelihood.py +++ b/bilby/gw/likelihood.py @@ -17,7 +17,8 @@ from scipy.special import i0e from ..core import likelihood from ..core.utils import ( logger, UnsortedInterp2d, BilbyJsonEncoder, decode_bilby_json, - create_frequency_series, create_time_series) + create_frequency_series, create_time_series, speed_of_light, + radius_of_earth) from ..core.prior import Interped, Prior, Uniform from .detector import InterferometerList from .prior import BBHPriorDict @@ -913,29 +914,38 @@ class ROQGravitationalWaveTransient(GravitationalWaveTransient): return indices, in_bounds def _set_weights(self, linear_matrix, quadratic_matrix): - """ - Setup the time-dependent ROQ weights. - This follows FIXME: Smith et al. + """ Setup the time-dependent ROQ weights. + + Parameters + ---------- + linear_matrix, quadratic_matrix: array_like + Arrays of the linear and quadratic basis - The times are chosen to allow all the merger times allows in the time - prior. """ - self.weights['time_samples'] = np.arange( - self.priors['geocent_time'].minimum - 0.045, - self.priors['geocent_time'].maximum + 0.045, - self._get_time_resolution()) - self.interferometers.start_time + earth_light_crossing_time = radius_of_earth / speed_of_light + time_space = self._get_time_resolution() + delta_times = np.arange( + self.priors['geocent_time'].minimum - earth_light_crossing_time, + self.priors['geocent_time'].maximum + earth_light_crossing_time, + time_space) + time_samples = delta_times - self.interferometers.start_time + self.weights['time_samples'] = time_samples + logger.info("Using {} ROQ time samples".format(len(time_samples))) for ifo in self.interferometers: if self.roq_params is not None: - frequencies = create_frequency_series( - sampling_frequency=self.roq_params['fhigh'] * 2, - duration=self.roq_params['seglen']) - roq_mask = [frequencies >= self.roq_params['flow']] - frequencies = frequencies[roq_mask] + if ifo.maximum_frequency > self.roq_params['fhigh']: + raise ValueError("Requested maximum frequency larger than ROQ basis fhigh") + # Generate frequencies for the ROQ + roq_frequencies = np.arange( + self.roq_params['flow'], + self.roq_params['fhigh'] + 1, + 1 / self.roq_params['seglen']) overlap_frequencies, ifo_idxs, roq_idxs = np.intersect1d( - ifo.frequency_array[ifo.frequency_mask], frequencies, + ifo.frequency_array[ifo.frequency_mask], roq_frequencies, return_indices=True) + else: overlap_frequencies = ifo.frequency_array[ifo.frequency_mask] roq_idxs = np.arange(linear_matrix.shape[0], dtype=int) @@ -950,11 +960,6 @@ class ROQGravitationalWaveTransient(GravitationalWaveTransient): ifo.name, len(overlap_frequencies), min(overlap_frequencies), max(overlap_frequencies))) - # array of relative time shifts to be applied to the data - # 0.045s comes from time for GW to traverse the Earth - time_space = (self.weights['time_samples'][1] - - self.weights['time_samples'][0]) - # array to be filled with data, shifted by discrete time_samples tc_shifted_data = np.zeros([ len(self.weights['time_samples']), len(overlap_frequencies)], @@ -990,6 +995,8 @@ class ROQGravitationalWaveTransient(GravitationalWaveTransient): quadratic_matrix[roq_idxs].real, 1 / ifo.strain_data.duration) + logger.info("Finished building weights for {}".format(ifo.name)) + def save_weights(self, filename): with open(filename, 'w') as file: json.dump(self.weights, file, indent=2, cls=BilbyJsonEncoder) @@ -1055,6 +1062,10 @@ class ROQGravitationalWaveTransient(GravitationalWaveTransient): delta_t = fhigh**-1 + # Apply a safety factor to ensure the time step is short enough + delta_t = delta_t / 5 + + logger.info("ROQ time-step = {}".format(delta_t)) return delta_t def _rescale_signal(self, signal, new_distance):