Gravitational-wave Detectors

The pycbc.detector module provides the pycbc.detector.Detector class to access information about gravitational wave detectors and key information about how their orientation and position affects their view of a source

Detector Locations

from pycbc.detector import Detector, get_available_detectors

# We can list the available detectors. This gives their detector abbreviation
# along with a longer name. Note that some of these are not physical detectors
# but may be useful for testing or study purposes

for abv, long_name in get_available_detectors():
    d = Detector(abv)

    # Note that units are all in radians
    print("{} {} Latitude {} Longitude {}".format(long_name, abv,
$ python ../examples/detector/
GEO_600 G1 Latitude 0.91184982752 Longitude 0.17116780435
ALLEGRO_320 A1 Latitude 0.53079879206 Longitude -1.59137068496
LHO_4k H1 Latitude 0.81079526383 Longitude -2.08405676917
TAMA_300 T1 Latitude 0.62267336022 Longitude 2.43536359469
VIRGO_CITF V0 Latitude 0.76151183984 Longitude 0.18333805213
VIRGO V1 Latitude 0.76151183984 Longitude 0.18333805213
ET3_T1400308 E3 Latitude 0.76270463257 Longitude 0.1819299673
EXPLORER X1 Latitude 0.81070543755 Longitude 0.10821041362
CIT_40 C1 Latitude 0.59637900541 Longitude -2.06175744538
KAGRA K1 Latitude 0.6355068497 Longitude 2.396441015
ET2_T1400308 E2 Latitude 0.7629930799 Longitude 0.1840585887
ET0_T1400308 E0 Latitude 0.76270463257 Longitude 0.1819299673
LIO_4k I1 Latitude 0.248418530201 Longitude 1.33401332494
ET1_T1400308 E1 Latitude 0.76151183984 Longitude 0.18333805213
ACIGA U1 Latitude 0.0 Longitude 0.0
AURIGA O1 Latitude 0.79156499342 Longitude 0.20853775679
NIOBE B1 Latitude -0.5573418078 Longitude 2.02138216202
LHO_2k H2 Latitude 0.81079526383 Longitude -2.08405676917
LLO_4k L1 Latitude 0.53342313506 Longitude -1.58430937078
Nautilus N1 Latitude 0.7299645671 Longitude 0.22117684946

Light travel time between detectors

from pycbc.detector import Detector

for ifo1 in ['H1', 'L1', 'V1']:
    for ifo2 in ['H1', 'L1', 'V1']:
        dt = Detector(ifo1).light_travel_time_to_detector(Detector(ifo2))
        print("Direct Time from {} to {} is {} seconds".format(ifo1, ifo2, dt))
$ python ../examples/detector/
Direct Time from H1 to H1 is 0.0 seconds
Direct Time from H1 to L1 is 0.0100128461522 seconds
Direct Time from H1 to V1 is 0.0272879799338 seconds
Direct Time from L1 to H1 is 0.0100128461522 seconds
Direct Time from L1 to L1 is 0.0 seconds
Direct Time from L1 to V1 is 0.0264483410167 seconds
Direct Time from V1 to H1 is 0.0272879799338 seconds
Direct Time from V1 to L1 is 0.0264483410167 seconds
Direct Time from V1 to V1 is 0.0 seconds

Time source gravitational-wave passes through detector

from pycbc.detector import Detector
from astropy.utils import iers

# Make sure the documentation can be built without an internet connection
iers.conf.auto_download = False

# The source of the gravitational waves
right_ascension = 0.7
declination = -0.5

# Reference location will be the Hanford detector
# see the `time_delay_from_earth_center` method to use use geocentric time
# as the reference
dref = Detector("H1")

# Time in GPS seconds that the GW passes
time = 100000000

# Time that the GW will (or has) passed through the given detector
for ifo in ["H1", "L1", "V1"]:
    d = Detector(ifo)
    dt = d.time_delay_from_detector(dref, right_ascension, declination, time)
    st = "GW passed through {} {} seconds relative to passing by Hanford"
    print(st.format(ifo, dt))
$ python ../examples/detector/
GW passed through H1 0.0 seconds relative to passing by Hanford
GW passed through L1 0.00244416431241 seconds relative to passing by Hanford
GW passed through V1 -0.0147336697335 seconds relative to passing by Hanford

Antenna Patterns and Projecting a Signal into the Detector Frame

from pycbc.detector import Detector
from pycbc.waveform import get_td_waveform

# Time, orientation and location of the source in the sky
ra = 1.7
dec = 1.7
pol = 0.2
inc = 0
time = 1000000000

# We can calcualate the antenna pattern for Hanford at
# the specific sky location
d = Detector("H1")

# We get back the fp and fc antenna pattern weights.
fp, fc = d.antenna_pattern(ra, dec, pol, time)
print("fp={}, fc={}".format(fp, fc))

# These factors allow us to project a signal into what the detector would
# observe

## Generate a waveform
hp, hc = get_td_waveform(approximant="IMRPhenomD", mass1=10, mass2=10,
                         f_lower=30, delta_t=1.0/4096, inclination=inc,

## Apply the factors to get the detector frame strain
ht = fp * hp + fc * hc

# The projection process can also take into account the rotation of the
# earth using the project wave function.
hp.start_time = hc.start_time = time
ht = d.project_wave(hp, hc, ra, dec, pol)
$ python ../examples/detector/
fp=-0.385485475332, fc=0.705987205044