Transient gravitational wave data I/O
This document describes how bilby
handles interferometer data and how
you can load data.
What is used by the likelihood?
The primary likelihhod for use in transient gravitational wave data analysis is the GravitationalWaveTransient . This takes an argument interferometers which is a list of bilby.gw.detector.Interferometer objects. These objects know about the geometry of the detector, the noise properties of the detector, and the segment of data which is to be analysed. In the following, we’ll describe different ways to initilalse a likelihood for gravitational wave data analysis.
Making an Interferometer
To make an empty interferometer, for example the Hanford detector:
>>> H1 = bilby.gw.detector.get_empty_interferometer('H1')
By default, these will have power spectral densities based on the expected
design sensitivity of the detector. The strain data (i.e. the data about the
segment of interferomer data which we want to analyse) is in an attribute
H1.strain_data
. The following is a list of ways to set this strain
data.
Setting the strain data
Setting the strain data using gwpy
The gwpy module is the recommended way to read in and manipulate gravitational wave strain data. For example, here is a snippet taken from the documentation to obtain the Hanford open date for GW150914:
>>> from gwpy.timeseries import TimeSeries
>>> time_series = TimeSeries.fetch_open_data('H1', 1126259446, 1126259478)
Gwpy provides a complete interface for reading any type of data related to
gravitational wave strain data. Once you have created your time series, you can
pass it into your bilby
interferometer as follows:
>>> H1.set_strain_data_from_gwpy_time_series(time_series=time_series)
Setting the strain data directly
If you have an array of the frequency-domain strain data, you can set it directly like this:
>>> H1.set_strain_data_from_frequency_domain_strain(frequency_domain_strain,
sampling_frequency=sampling_frequency,
duration=duration,
start_time=start_time)
Where the given arguments are things you have already defined in your python
script. If you’d prefer to give the frequency_array
to which the
data corresponds instead of the sampling_frequency
and duration
this can also be done:
>>> H1.set_strain_data_from_frequency_domain_strain(frequency_domain_strain,
sampling_frequency=sampling_frequency,
duration=duration,
start_time=start_time)
Setting the strain data to be Gaussian noise
Often, for testing, you may want to just generate a realization of coloured Gaussian noise from the power spectral density. This can be done using this method:
>>> H1.set_strain_data_from_power_spectral_density
Setting the strain data to be zero noise
You can also set the strain data without any noise at all
>>> H1.set_strain_data_from_zero_noise
Injecting a signal
If you wish to inject a signal into the data, you can use this function:
>>> bilby.gw.detector.Interferometer.inject_signal
To inject a signal a bilby.gw.waveform_generator.WaveformGenerator is required.
This is where you must specify the injection’s duration, start-time, waveform.
Additionally, a parameter_conversion function can be passed. The default is parameter_conversion = bilby.gw.conversion.convert_to_lal_binary_black_hole_parameters
.
This expects injection parameters to be provided in the detector-frame, e.g.
>>> 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., theta_jn=0.4, psi=2.659,
phase=1.3, geocent_time=1126259642.413, ra=1.375, dec=-1.2108
)