diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 72897ad8ca2b633aace5fc1510d3635161d6caf5..1acb1355e46274468a9022f6b891f5847f0a8b0d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,6 +42,7 @@ python-3: - coverage --version - coverage erase - coverage run --debug=trace --include=/opt/conda/lib/python3.6/site-packages/tupak* -a test/conversion_tests.py + - coverage run --include=/opt/conda/lib/python3.6/site-packages/tupak* -a test/calibration_tests.py - coverage run --include=/opt/conda/lib/python3.6/site-packages/tupak* -a test/detector_tests.py - coverage run --include=/opt/conda/lib/python3.6/site-packages/tupak* -a test/utils_tests.py - coverage run --include=/opt/conda/lib/python3.6/site-packages/tupak* -a test/prior_tests.py diff --git a/examples/injection_examples/calibration_example.py b/examples/injection_examples/calibration_example.py new file mode 100644 index 0000000000000000000000000000000000000000..d2cf310554365a4e66e7d70bae285837d3531508 --- /dev/null +++ b/examples/injection_examples/calibration_example.py @@ -0,0 +1,86 @@ +#!/bin/python +""" +Tutorial to demonstrate running parameter estimation with calibration +uncertainties included. +""" +from __future__ import division, print_function + +import numpy as np +import tupak + +# Set the duration and sampling frequency of the data segment +# that we're going to create and inject the signal into. + +duration = 4. +sampling_frequency = 2048. + +# Specify the output directory and the name of the simulation. +outdir = 'outdir' +label = 'calibration' +tupak.core.utils.setup_logger(outdir=outdir, label=label) + +# Set up a random seed for result reproducibility. This is optional! +np.random.seed(88170235) + +# We are going to inject a binary black hole waveform. We first establish a +# dictionary of parameters that includes all of the different waveform +# parameters, including masses of the two black holes (mass_1, mass_2), +# spins of both black holes (a, tilt, phi), etc. +injection_parameters = dict( + mass_1=36., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.5, tilt_2=1.0, + phi_12=1.7, phi_jl=0.3, luminosity_distance=2000., iota=0.4, psi=2.659, + phase=1.3, geocent_time=1126259642.413, ra=1.375, dec=-1.2108) + +# Fixed arguments passed into the source model +waveform_arguments = dict(waveform_approximant='IMRPhenomPv2', + reference_frequency=50.) + +# Create the waveform_generator using a LAL BinaryBlackHole source function +waveform_generator = tupak.gw.WaveformGenerator( + duration=duration, sampling_frequency=sampling_frequency, + frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole, + parameters=injection_parameters,waveform_arguments=waveform_arguments) + +# Set up interferometers. In this case we'll use three interferometers +# (LIGO-Hanford (H1), LIGO-Livingston (L1), and Virgo (V1)). +# These default to their design sensitivity +ifos = tupak.gw.detector.InterferometerList(['H1', 'L1', 'V1']) +for ifo in ifos: + injection_parameters.update({ + 'recalib_{}_amplitude_{}'.format(ifo.name, ii): 0.1 for ii in range(5)}) + injection_parameters.update({ + 'recalib_{}_phase_{}'.format(ifo.name, ii): 0.01 for ii in range(5)}) + ifo.calibration_model = tupak.gw.calibration.CubicSpline( + prefix='recalib_{}_'.format(ifo.name), + minimum_frequency=ifo.minimum_frequency, + maximum_frequency=ifo.maximum_frequency, n_points=5) +ifos.set_strain_data_from_power_spectral_densities( + sampling_frequency=sampling_frequency, duration=duration) +ifos.inject_signal(parameters=injection_parameters, + waveform_generator=waveform_generator) + +# Set up prior, which is a dictionary +# Here we fix the injected cbc parameters and most of the calibration parameters +# to the injected values. +# We allow a subset of the calibration parameters to vary. +priors = injection_parameters.copy() +for key in injection_parameters: + if 'recalib' in key: + priors[key] = injection_parameters[key] +for name in ['recalib_H1_amplitude_0', 'recalib_H1_amplitude_1']: + priors[name] = tupak.prior.Gaussian( + mu=0, sigma=0.2, name=name, latex_label='H1 $A_{}$'.format(name[-1])) + +# Initialise the likelihood by passing in the interferometer data (IFOs) and +# the waveform generator +likelihood = tupak.gw.GravitationalWaveTransient( + interferometers=ifos, waveform_generator=waveform_generator) + +# Run sampler. In this case we're going to use the `dynesty` sampler +result = tupak.run_sampler( + likelihood=likelihood, priors=priors, sampler='dynesty', npoints=1000, + injection_parameters=injection_parameters, outdir=outdir, label=label) + +# make some plots of the outputs +result.plot_corner() + diff --git a/examples/injection_examples/marginalized_likelihood.py b/examples/injection_examples/marginalized_likelihood.py index 89fb01ea7a383019b70bc4ce5962c14d7b76f3ba..08b9fdf2bea14d2cb5102c1158ebc0d54f00cc14 100644 --- a/examples/injection_examples/marginalized_likelihood.py +++ b/examples/injection_examples/marginalized_likelihood.py @@ -36,7 +36,7 @@ IFOs = [tupak.gw.detector.get_interferometer_with_fake_noise_and_injection( # Set up prior priors = tupak.gw.prior.BBHPriorSet() # These parameters will not be sampled -for key in ['a_1', 'a_2', 'tilt_1', 'tilt_2', 'phi_12', 'phi_jl', 'phase', 'iota', 'ra', 'dec', 'geocent_time']: +for key in ['a_1', 'a_2', 'tilt_1', 'tilt_2', 'phi_12', 'phi_jl', 'iota', 'ra', 'dec', 'geocent_time']: priors[key] = injection_parameters[key] # Initialise GravitationalWaveTransient diff --git a/examples/open_data_examples/GW150914.py b/examples/open_data_examples/GW150914.py index 06fa0b810728a246e2751fbd9351d0cadd4f67fc..d619dd7e1928a7dadb95a6cdf2ba5eca93aaa16b 100644 --- a/examples/open_data_examples/GW150914.py +++ b/examples/open_data_examples/GW150914.py @@ -36,13 +36,15 @@ prior = tupak.gw.prior.BBHPriorSet(filename='GW150914.prior') # creates the frequency-domain strain. In this instance, we are using the # `lal_binary_black_hole model` source model. We also pass other parameters: # the waveform approximant and reference frequency. -waveform_generator = tupak.gw.WaveformGenerator(frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole, - waveform_arguments={'waveform_approximant': 'IMRPhenomPv2', - 'reference_frequency': 50}) +waveform_generator = tupak.WaveformGenerator( + frequency_domain_source_model=tupak.gw.source.lal_binary_black_hole, + waveform_arguments={'waveform_approximant': 'IMRPhenomPv2', + 'reference_frequency': 50}) # In this step, we define the likelihood. Here we use the standard likelihood # function, passing it the data and the waveform generator. -likelihood = tupak.gw.likelihood.GravitationalWaveTransient(interferometers, waveform_generator) +likelihood = tupak.gw.likelihood.GravitationalWaveTransient( + interferometers, waveform_generator) # Finally, we run the sampler. This function takes the likelihood and prior # along with some options for how to do the sampling and how to save the data diff --git a/test/calibration_tests.py b/test/calibration_tests.py new file mode 100644 index 0000000000000000000000000000000000000000..b481e2936ed88ec6d4cf68136c495f0ef4d25539 --- /dev/null +++ b/test/calibration_tests.py @@ -0,0 +1,53 @@ +from tupak.gw import calibration +import unittest +import numpy as np + + +class TestBaseClass(unittest.TestCase): + + def setUp(self): + self.model = calibration.Recalibrate() + + def tearDown(self): + del self.model + + def test_calibration_factor(self): + frequency_array = np.linspace(20, 1024, 1000) + cal_factor = self.model.get_calibration_factor(frequency_array) + assert np.alltrue(cal_factor.real == np.ones_like(frequency_array)) + + +class TestCubicSpline(unittest.TestCase): + + def setUp(self): + self.model = calibration.CubicSpline( + prefix='recalib_', minimum_frequency=20, maximum_frequency=1024, + n_points=5) + self.parameters = {'recalib_{}_{}'.format(param, ii): 0.0 + for ii in range(5) + for param in ['amplitude', 'phase']} + + def tearDown(self): + del self.model + del self.parameters + + def test_calibration_factor(self): + frequency_array = np.linspace(20, 1024, 1000) + cal_factor = self.model.get_calibration_factor(frequency_array, + **self.parameters) + assert np.alltrue(cal_factor.real == np.ones_like(frequency_array)) + + +class TestCubicSplineRequiresFourNodes(unittest.TestCase): + + def test_cannot_instantiate_with_too_few_nodes(self): + for ii in range(6): + if ii < 4: + with self.assertRaises(ValueError): + calibration.CubicSpline('test', 1, 10, ii) + else: + calibration.CubicSpline('test', 1, 10, ii) + + +if __name__ == '__main__': + unittest.main() diff --git a/tupak/core/prior.py b/tupak/core/prior.py index a589c438f7e7c3a172e10607037f0c84874c410e..8ea049c6befa343e9c0845d124f12f699e9c2f1f 100644 --- a/tupak/core/prior.py +++ b/tupak/core/prior.py @@ -26,7 +26,11 @@ class PriorSet(dict): dict.__init__(self) if type(dictionary) is dict: self.update(dictionary) - elif filename: + elif type(dictionary) is str: + logger.debug('Argument "dictionary" is a string.' + + ' Assuming it is intended as a file name.') + self.read_in_file(dictionary) + elif type(filename) is str: self.read_in_file(filename) def write_to_file(self, outdir, label): @@ -41,7 +45,7 @@ class PriorSet(dict): """ utils.check_directory_exists_and_if_not_mkdir(outdir) - prior_file = os.path.join(outdir, "{}_prior.txt".format(label)) + prior_file = os.path.join(outdir, "{}.prior".format(label)) logger.debug("Writing priors to {}".format(prior_file)) with open(prior_file, "w") as outfile: for key in self.keys(): diff --git a/tupak/gw/__init__.py b/tupak/gw/__init__.py index 9969e9d5f35434cc0247c1470c00bde6ee7f45ed..47063bf1e2790e5ef41ad096f9723905994e9cd9 100644 --- a/tupak/gw/__init__.py +++ b/tupak/gw/__init__.py @@ -6,6 +6,8 @@ import tupak.gw.prior import tupak.gw.source import tupak.gw.utils import tupak.gw.waveform_generator +from . import calibration + from tupak.gw.waveform_generator import WaveformGenerator from tupak.gw.likelihood import GravitationalWaveTransient diff --git a/tupak/gw/calibration.py b/tupak/gw/calibration.py new file mode 100644 index 0000000000000000000000000000000000000000..e54757a86a9c60bfa029271e176b75a23c714112 --- /dev/null +++ b/tupak/gw/calibration.py @@ -0,0 +1,110 @@ +""" Functions for adding calibration factors to waveform templates. +""" + +import numpy as np +from scipy.interpolate import UnivariateSpline + + +class Recalibrate(object): + + name = 'none' + + def __init__(self, prefix='recalib_'): + """ + Base calibration object. This applies no transformation + + Parameters + ---------- + prefix: str + Prefix on parameters relating to the calibration. + """ + self.params = dict() + self.prefix = prefix + + def get_calibration_factor(self, frequency_array, **params): + """Apply calibration model + + This method should be overwritten by subclasses + + Parameters + ---------- + frequency_array: array-like + The frequency values to calculate the calibration factor for. + params : dict + Dictionary of sampling parameters which includes + calibration parameters. + + Returns + ------- + calibration_factor : array-like + The factor to multiply the strain by. + """ + self.set_calibration_parameters(**params) + return np.ones_like(frequency_array) + + def set_calibration_parameters(self, **params): + self.params.update({key[len(self.prefix):]: params[key] for key in params + if self.prefix in key}) + + +class CubicSpline(Recalibrate): + + name = 'cubic_spline' + + def __init__(self, prefix, minimum_frequency, maximum_frequency, n_points): + """ + Cubic spline recalibration + + see https://dcc.ligo.org/DocDB/0116/T1400682/001/calnote.pdf + + This assumes the spline points follow + np.logspace(np.log(minimum_frequency), np.log(maximum_frequency), n_points) + + Parameters + ---------- + prefix: str + Prefix on parameters relating to the calibration. + minimum_frequency: float + minimum frequency of spline points + maximum_frequency: float + maximum frequency of spline points + n_points: int + number of spline points + """ + Recalibrate.__init__(self, prefix=prefix) + if n_points < 4: + raise ValueError('Cubic spline calibration requires at least 4 spline nodes.') + self.n_points = n_points + self.spline_points = np.logspace(np.log10(minimum_frequency), np.log10(maximum_frequency), n_points) + + def get_calibration_factor(self, frequency_array, **params): + """Apply calibration model + + Parameters + ---------- + frequency_array: array-like + The frequency values to calculate the calibration factor for. + prefix: str + Prefix for calibration parameter names + params : dict + Dictionary of sampling parameters which includes + calibration parameters. + + Returns + ------- + calibration_factor : array-like + The factor to multiply the strain by. + """ + self.set_calibration_parameters(**params) + amplitude_parameters = [self.params['amplitude_{}'.format(ii)] for ii in range(self.n_points)] + amplitude_spline = UnivariateSpline(self.spline_points, amplitude_parameters) + delta_amplitude = amplitude_spline(frequency_array) + + phase_parameters = [self.params['phase_{}'.format(ii)] for ii in range(self.n_points)] + phase_spline = UnivariateSpline(self.spline_points, phase_parameters) + delta_phase = phase_spline(frequency_array) + + calibration_factor = (1 + delta_amplitude) * (2 + 1j * delta_phase) / (2 - 1j * delta_phase) + + return calibration_factor + diff --git a/tupak/gw/detector.py b/tupak/gw/detector.py index 842fc37333a9b1a1f538f23f8cd90e1de0736b84..f20c188ab0e70cd5580d7a76e12cc72ff91ab200 100644 --- a/tupak/gw/detector.py +++ b/tupak/gw/detector.py @@ -4,12 +4,13 @@ import os import matplotlib.pyplot as plt import numpy as np -import scipy +from scipy.signal.windows import tukey from scipy.interpolate import interp1d import tupak.gw.utils from tupak.core import utils from tupak.core.utils import logger +from .calibration import Recalibrate try: import gwpy @@ -85,7 +86,7 @@ class InterferometerList(list): `waveform_generator.frequency_domain_strain()`. If `waveform_generator` is also given, the injection_polarizations will be calculated directly and this argument can be ignored. - waveform_generator: tupak.gw.waveform_generator + waveform_generator: tupak.gw.waveform_generator.WaveformGenerator A WaveformGenerator instance using the source model to inject. If `injection_polarizations` is given, this will be ignored. @@ -353,7 +354,7 @@ class InterferometerStrainData(object): self.roll_off = roll_off elif alpha is not None: self.roll_off = alpha * self.duration / 2 - window = scipy.signal.windows.tukey(len(self._time_domain_strain), alpha=self.alpha) + window = tukey(len(self._time_domain_strain), alpha=self.alpha) self.window_factor = np.mean(window**2) return window @@ -741,9 +742,9 @@ class InterferometerStrainData(object): class Interferometer(object): """Class for the Interferometer """ - 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.): + 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()): """ Instantiate an Interferometer object. @@ -774,6 +775,9 @@ class Interferometer(object): ellipsoid earth model in LIGO-T980044-08. yarm_tilt: float, optional Tilt of the y arm in radians above the horizontal. + calibration_model: Recalibration + Calibration model, this applies the calibration correction to the + template, the default model applies no correction. """ self.__x_updated = False self.__y_updated = False @@ -791,6 +795,7 @@ class Interferometer(object): self.yarm_tilt = yarm_tilt self.power_spectral_density = power_spectral_density self.time_marginalization = False + self.calibration_model = calibration_model self._strain_data = InterferometerStrainData( minimum_frequency=minimum_frequency, maximum_frequency=maximum_frequency) @@ -1187,6 +1192,9 @@ class Interferometer(object): signal_ifo = signal_ifo * np.exp( -1j * 2 * np.pi * dt * self.frequency_array) + signal_ifo *= self.calibration_model.get_calibration_factor( + self.frequency_array, prefix='recalib_{}_'.format(self.name), **parameters) + return signal_ifo def inject_signal(self, parameters=None, injection_polarizations=None, diff --git a/tupak/gw/prior.py b/tupak/gw/prior.py index 3346a155762bd8a8d7edb8a786c9ae00917b3f68..3df269375b05c38ee03197c98a39792182556437 100644 --- a/tupak/gw/prior.py +++ b/tupak/gw/prior.py @@ -1,7 +1,8 @@ import os -from tupak.core.prior import PriorSet, FromFile, Prior - -from tupak.core.utils import logger +from ..core.prior import PriorSet, FromFile, Prior, DeltaFunction, Gaussian +from ..core.utils import logger +import numpy as np +from scipy.interpolate import UnivariateSpline class UniformComovingVolume(FromFile): @@ -114,3 +115,168 @@ Prior._default_latex_labels = { 'psi': '$\psi$', 'phase': '$\phi$', 'geocent_time': '$t_c$'} + + +class CalibrationPriorSet(PriorSet): + + def __init__(self, dictionary=None, filename=None): + """ Initialises a Prior set for Binary Black holes + + Parameters + ---------- + dictionary: dict, optional + See superclass + filename: str, optional + See superclass + """ + if dictionary is None and filename is not None: + filename = os.path.join(os.path.dirname(__file__), + 'prior_files', filename) + PriorSet.__init__(self, dictionary=dictionary, filename=filename) + self.source = None + + def write_to_file(self, outdir, label): + """ + Write the prior to file. This includes information about the source if + possible. + + Parameters + ---------- + outdir: str + Output directory. + label: str + Label for prior. + """ + PriorSet.write_to_file(self, outdir=outdir, label=label) + if self.source is not None: + prior_file = os.path.join(outdir, "{}.prior".format(label)) + with open(prior_file, "a") as outfile: + outfile.write("# prior source file is {}".format(self.source)) + + @staticmethod + def from_envelope_file(envelope_file, minimum_frequency, + maximum_frequency, n_nodes, label): + """ + Load in the calibration envelope. + + This is a text file with columns: + frequency median-amplitude median-phase -1-sigma-amplitude + -1-sigma-phase +1-sigma-amplitude +1-sigma-phase + + Parameters + ---------- + envelope_file: str + Name of file to read in. + minimum_frequency: float + Minimum frequency for the spline. + maximum_frequency: float + Minimum frequency for the spline. + n_nodes: int + Number of nodes for the spline. + label: str + Label for the names of the parameters, e.g., recalib_H1_ + + Returns + ------- + prior: PriorSet + Priors for the relevant parameters. + This includes the frequencies of the nodes which are _not_ sampled. + """ + calibration_data = np.genfromtxt(envelope_file).T + frequency_array = calibration_data[0] + amplitude_median = 1 - calibration_data[1] + phase_median = calibration_data[2] + amplitude_sigma = (calibration_data[4] - calibration_data[2]) / 2 + phase_sigma = (calibration_data[5] - calibration_data[3]) / 2 + + nodes = np.logspace(np.log10(minimum_frequency), + np.log10(maximum_frequency), n_nodes) + + amplitude_mean_nodes =\ + UnivariateSpline(frequency_array, amplitude_median)(nodes) + amplitude_sigma_nodes =\ + UnivariateSpline(frequency_array, amplitude_sigma)(nodes) + phase_mean_nodes =\ + UnivariateSpline(frequency_array, phase_median)(nodes) + phase_sigma_nodes =\ + UnivariateSpline(frequency_array, phase_sigma)(nodes) + + prior = CalibrationPriorSet() + for ii in range(n_nodes): + name = "recalib_{}_amplitude_{}".format(label, ii) + latex_label = "$A^{}_{}$".format(label, ii) + prior[name] = Gaussian(mu=amplitude_mean_nodes[ii], + sigma=amplitude_sigma_nodes[ii], + name=name, latex_label=latex_label) + for ii in range(n_nodes): + name = "recalib_{}_phase_{}".format(label, ii) + latex_label = "$\\phi^{}_{}$".format(label, ii) + prior[name] = Gaussian(mu=phase_mean_nodes[ii], + sigma=phase_sigma_nodes[ii], + name=name, latex_label=latex_label) + for ii in range(n_nodes): + name = "recalib_{}_frequency_{}".format(label, ii) + latex_label = "$f^{}_{}$".format(label, ii) + prior[name] = DeltaFunction(peak=nodes[ii], name=name, + latex_label=latex_label) + prior.source = os.path.abspath(envelope_file) + return prior + + @staticmethod + def constant_uncertainty_spline( + amplitude_sigma, phase_sigma, minimum_frequency, maximum_frequency, + n_nodes, label): + """ + Make prior assuming constant in frequency calibration uncertainty. + + This assumes Gaussian fluctuations about 0. + + Parameters + ---------- + amplitude_sigma: float + Uncertainty in the amplitude. + phase_sigma: float + Uncertainty in the phase. + minimum_frequency: float + Minimum frequency for the spline. + maximum_frequency: float + Minimum frequency for the spline. + n_nodes: int + Number of nodes for the spline. + label: str + Label for the names of the parameters, e.g., recalib_H1_ + + Returns + ------- + prior: PriorSet + Priors for the relevant parameters. + This includes the frequencies of the nodes which are _not_ sampled. + """ + nodes = np.logspace(np.log10(minimum_frequency), + np.log10(maximum_frequency), n_nodes) + + amplitude_mean_nodes = [0] * n_nodes + amplitude_sigma_nodes = [amplitude_sigma] * n_nodes + phase_mean_nodes = [0] * n_nodes + phase_sigma_nodes = [phase_sigma] * n_nodes + + prior = CalibrationPriorSet() + for ii in range(n_nodes): + name = "recalib_{}_amplitude_{}".format(label, ii) + latex_label = "$A^{}_{}$".format(label, ii) + prior[name] = Gaussian(mu=amplitude_mean_nodes[ii], + sigma=amplitude_sigma_nodes[ii], + name=name, latex_label=latex_label) + for ii in range(n_nodes): + name = "recalib_{}_phase_{}".format(label, ii) + latex_label = "$\\phi^{}_{}$".format(label, ii) + prior[name] = Gaussian(mu=phase_mean_nodes[ii], + sigma=phase_sigma_nodes[ii], + name=name, latex_label=latex_label) + for ii in range(n_nodes): + name = "recalib_{}_frequency_{}".format(label, ii) + latex_label = "$f^{}_{}$".format(label, ii) + prior[name] = DeltaFunction(peak=nodes[ii], name=name, + latex_label=latex_label) + + return prior diff --git a/tupak/gw/prior_files/GW150914.prior b/tupak/gw/prior_files/GW150914.prior index 6a6c9390bafd93cf8e31e980e6766c10ad98fde3..276a6b9f710b3835206441279b2b3ffbe7644b32 100644 --- a/tupak/gw/prior_files/GW150914.prior +++ b/tupak/gw/prior_files/GW150914.prior @@ -14,3 +14,35 @@ iota = Sine(name='iota') psi = Uniform(name='psi', minimum=0, maximum=2 * np.pi) phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi) geocent_time = Uniform(1126259462.322, 1126259462.522, name='geocent_time') +# These are the calibration parameters as described in +# https://journals.aps.org/prx/abstract/10.1103/PhysRevX.6.041015 +# recalib_H1_frequency_0 = 20 +# recalib_H1_frequency_1 = 54 +# recalib_H1_frequency_2 = 143 +# recalib_H1_frequency_3 = 383 +# recalib_H1_frequency_4 = 1024 +# recalib_H1_amplitude_0 = Gaussian(mu=0, sigma=0.048, name='recalib_H1_amplitude_0), '$\\delta A_{H0}$' +# recalib_H1_amplitude_1 = Gaussian(mu=0, sigma=0.048, name='recalib_H1_amplitude_1), '$\\delta A_{H1}$' +# recalib_H1_amplitude_2 = Gaussian(mu=0, sigma=0.048, name='recalib_H1_amplitude_2), '$\\delta A_{H2}$' +# recalib_H1_amplitude_3 = Gaussian(mu=0, sigma=0.048, name='recalib_H1_amplitude_3), '$\\delta A_{H3}$' +# recalib_H1_amplitude_4 = Gaussian(mu=0, sigma=0.048, name='recalib_H1_amplitude_4), '$\\delta A_{H4}$' +# recalib_H1_phase_0 = Gaussian(mu=0, sigma=0.056, name='recalib_H1_phase_0', '$\\delta \\phi_{H0}$') +# recalib_H1_phase_1 = Gaussian(mu=0, sigma=0.056, name='recalib_H1_phase_1', '$\\delta \\phi_{H1}$') +# recalib_H1_phase_2 = Gaussian(mu=0, sigma=0.056, name='recalib_H1_phase_2', '$\\delta \\phi_{H2}$') +# recalib_H1_phase_3 = Gaussian(mu=0, sigma=0.056, name='recalib_H1_phase_3', '$\\delta \\phi_{H3}$') +# recalib_H1_phase_4 = Gaussian(mu=0, sigma=0.056, name='recalib_H1_phase_4', '$\\delta \\phi_{H4}$') +# recalib_L1_frequency_0 = 20 +# recalib_L1_frequency_1 = 54 +# recalib_L1_frequency_2 = 143 +# recalib_L1_frequency_3 = 383 +# recalib_L1_frequency_4 = 1024 +# recalib_L1_amplitude_0 = Gaussian(mu=0, sigma=0.082, name='recalib_L1_amplitude_0), '$\\delta A_{L0}$' +# recalib_L1_amplitude_1 = Gaussian(mu=0, sigma=0.082, name='recalib_L1_amplitude_1), '$\\delta A_{L1}$' +# recalib_L1_amplitude_2 = Gaussian(mu=0, sigma=0.082, name='recalib_L1_amplitude_2), '$\\delta A_{L2}$' +# recalib_L1_amplitude_3 = Gaussian(mu=0, sigma=0.082, name='recalib_L1_amplitude_3), '$\\delta A_{L3}$' +# recalib_L1_amplitude_4 = Gaussian(mu=0, sigma=0.082, name='recalib_L1_amplitude_4), '$\\delta A_{L4}$' +# recalib_L1_phase_0 = Gaussian(mu=0, sigma=0.073, name='recalib_L1_phase_0', '$\\delta \\phi_{L0}$') +# recalib_L1_phase_1 = Gaussian(mu=0, sigma=0.073, name='recalib_L1_phase_1', '$\\delta \\phi_{L1}$') +# recalib_L1_phase_2 = Gaussian(mu=0, sigma=0.073, name='recalib_L1_phase_2', '$\\delta \\phi_{L2}$') +# recalib_L1_phase_3 = Gaussian(mu=0, sigma=0.073, name='recalib_L1_phase_3', '$\\delta \\phi_{L3}$') +# recalib_L1_phase_4 = Gaussian(mu=0, sigma=0.073, name='recalib_L1_phase_4', '$\\delta \\phi_{L4}$') diff --git a/tupak/gw/utils.py b/tupak/gw/utils.py index 741053af92a70644730260b410587778aef4b70b..c146a204634423cf3daec234b38135c4be5fec6e 100644 --- a/tupak/gw/utils.py +++ b/tupak/gw/utils.py @@ -2,9 +2,9 @@ from __future__ import division import os import numpy as np -from scipy import signal -from tupak.core.utils import gps_time_to_gmst, ra_dec_to_theta_phi, speed_of_light, nfft, logger +from ..core.utils import (gps_time_to_gmst, ra_dec_to_theta_phi, speed_of_light, + nfft, logger) try: from gwpy.signal import filter_design