Independent reproduction of a gravitational-wave detection (GW150914) using open LIGO strain data and a matched-filtering pipeline built from scratch.
gw-matched-filter/
├── data/ # raw strain data (not tracked in git, .hdf5/.gwf ignored)
├── src/ # source code
│ ├── fetch_data.py # pulls strain data from GWOSC
│ └── plot_strain.py # milestone 1: raw time-domain plot
├── notebooks/ # exploratory Jupyter notebooks
├── figures/ # generated plots (not tracked in git)
├── tests/ # pytest tests
├── environment.yml # conda environment spec
└── .vscode/ # VS Code settings (interpreter path, pytest config)
# create and activate the conda environment
conda env create -f environment.yml
conda activate gw-matched-filter
# open in VS Code
code .In VS Code: Ctrl+Shift+P -> "Python: Select Interpreter" -> choose the
gw-matched-filter conda environment if it isn't picked up automatically.
- Project scaffold
- Milestone 1: fetch and plot raw H1/L1 strain around GW150914 (signal not visible by eye)
- Milestone 2: estimate the noise power spectral density (PSD), whiten the data
- Milestone 3: build a matched filter using a real waveform template (IMRPhenomD via
pycbc), recover an SNR time series with a peak at the known merger time - Milestone 4 (stretch): repeat for a second event (e.g. GW151226 or GW170104) to show the pipeline generalizes
- Milestone 5 (stretch): estimate chirp mass / distance by scanning over a small grid of template masses and finding which maximizes recovered SNR
Matched filter recovers the GW150914 signal in both detectors, with peak SNR landing within ~30 milliseconds of the true published merger time (GPS 1126259462.4):
- H1: peak SNR = 17.55 at offset +0.029 s
- L1: peak SNR = 13.10 at offset +0.022 s
Whitened strain (noise flattened across frequency, milestone 2):
Open strain data from the Gravitational Wave Open Science Center,
accessed via the gwpy and gwosc Python packages.
First run of python src/fetch_data.py will download ~32 seconds of strain
data for H1 and L1 around the GW150914 merger time and cache it locally in data/.


