4. Calculating the coherence between two channels

The coherence between two channels is a measure of the frequency-domain correlation between their time-series data.

In LIGO, the coherence is a crucial indicator of how noise sources couple into the main differential arm-length readout. Here we use use the TimeSeries.coherence() method to highlight coupling of motion of a beam periscope attached to the main laser table into the strain output of the LIGO-Hanford interferometer.

These data are available as part of the Auxiliary Channel Three Hour Release.

First, we import the TimeSeriesDict

from gwpy.timeseries import TimeSeriesDict

and then get() the data for the differential-arm length servo control loop error signal (H1:LSC-DARM_IN1_DQ) and the PSL periscope accelerometer (H1:PEM-CS_ACC_PSL_PERISCOPE_X_DQ):

data = TimeSeriesDict.get(
    ["H1:LSC-DARM_IN1_DQ", "H1:PEM-CS_ACC_PSL_PERISCOPE_X_DQ"],
    1186741560,
    1186742160,
    host="nds.gwosc.org",
)
darm = data["H1:LSC-DARM_IN1_DQ"]
acc = data["H1:PEM-CS_ACC_PSL_PERISCOPE_X_DQ"]

We can then calculate the coherence() of one TimeSeries with respect to the other, using an 2-second Fourier transform length, with a 1-second (50%) overlap:

coh = darm.coherence(acc, fftlength=2, overlap=1)

Finally, we can plot() the resulting data:

plot = coh.plot(
    xlabel="Frequency [Hz]", xscale="log",
    ylabel="Coherence", yscale="linear", ylim=(0, 1),
)
plot.show()

(png)

../../../_images/coherence-4.png

We can clearly see the correlation between the periscope motion and the differential-arm length servo control loop error signal between 100 Hz and 1000 Hz. Such physical couplings can interfere, mask, or even mimic a gravitational wave signal inferred from the differential arm length motion.