DOI: 10.5281/zenodo.17142954
title: Detection of a Higher Harmonic Quasi-normal Mode in the Ringdown Signal of GW231123

description: Data and Scripts for "Detection of a Higher Harmonic Quasi-normal Mode in the Ringdown Signal of GW231123"

This repository contains the posterior samples and Python plotting scripts associated with the analysis of the gravitational wave event GW231123, as presented in the paper "Detection of a Higher Harmonic Quasi-normal Mode in the Ringdown Signal of GW231123". The data provided allows for the reproduction of the key figures in the publication.

Data Files

The posterior samples are provided in compressed TAR archives (.tar.gz). The data is stored in JSON format, compatible with the bilby Python library. Before running any scripts, please decompress these archives. The scripts assume the JSON files are located within a Data/ directory with subdirectories corresponding to the analysis method.

The following archives contain the posterior samples:





Fs_two_modes.tar.gz: Contains posterior distributions for various two-mode combinations (e.g., 220+200, 220+221, etc.) obtained using the F-statistic method. The data is located in the Data/Fs_only2/ subdirectory after extraction.




TTD_two_modes.tar.gz: Contains posterior distributions for the same two-mode combinations, but obtained using the traditional time-domain (TTD) method. The data is located in the Data/TTD_fix5/ subdirectory after extraction.




Fs_three_modes.tar.gz: Contains posterior distributions for various three-mode combinations (e.g., 220+200+210, 220+200+320, etc.) from the F-statistic method. Data is in Data/Fs_only2/.




Fs_df200.tar.gz: Contains posterior distributions from the F-statistic analysis of two-mode combinations where the frequency of the 200 mode was allowed to deviate from the General Relativity prediction (\delta f_{200}). The filenames in the scripts reflect this df_... prefix.




Fs_dtau200.tar.gz: Contains posterior distributions from the F-statistic analysis of two-mode combinations where the damping time of the 200 mode was allowed to deviate (\delta \tau_{200}). The filenames in the scripts reflect this dt_... prefix.



Prerequisites

To run the provided scripts and generate the plots, you will need a Python environment with the following libraries installed:





numpy




matplotlib




seaborn




pandas




bilby




lal




h5py (for comparing with LVK data)



Plotting Scripts

The following scripts are provided to generate the figures from the paper. Please note that some scripts may need minor adjustments (e.g., changing variable values) to reproduce specific panels or figures, as they were used to generate multiple plots. The utils.py file contains helper functions used by some of these scripts and must be in the same directory.

 

plot_bfs_m2.ipynb





Purpose: Generates the Bayes factor plot for two-mode combinations vs. the fundamental mode only.




Generates: Figure 1 from the paper.




Instructions: Run the cells in the Jupyter Notebook. It will load the necessary data from Fs_only2/ and TTD_fix5/ and produce the plot comparing the F-statistic and TTD methods.



 

check_plot_mfsf_lvk2.py





Purpose: Creates a joint posterior plot of the remnant mass (M_f) and spin (\chi_f), comparing the ringdown results (Fs and TTD) with full Inspiral-Merger-Ringdown (IMR) analyses from LVK (NRSur7dq4 and SEOBNRv5PHM).




Generates: Figure 2 from the paper.




Instructions: This script is configured to plot a single combination at a specific start time. To reproduce the panels in Figure 2, you will need to adjust the following variables at the top of the script:





For the left panel (220 mode only): Set tm = 18, lmn0 = '221', and lt = '220'.




For the right panel (220+200 mode): Set tm = 12, lmn0 = '221,201', and lt = '220+200'.




Ensure the path in post_file1 points to the correct LVK posterior samples file (GW231123_posterior_samples.h5).





 

plot_amp_bfs_m2.ipynb





Purpose: Creates a two-panel figure comparing the F-statistic and TTD methods. The top panel shows the log Bayes factor, and the bottom panel shows the violin plots for the amplitude of the subdominant mode.




Generates: Figure 3 from the paper.




Instructions: To reproduce Figure 3, which focuses on the 200 mode, the following variables in the notebook must be set accordingly:





amp_lmn = '200'




lmn1 = '221,201'





 

plot_dfdt_split.py





Purpose: Generates the split violin plots for the No-Hair Theorem test, showing the fractional deviations in the frequency (\delta f_{200}) and damping time (\delta \tau_{200}) of the 200 mode.




Generates: Figure 4 from the paper.




Instructions: This script reads from the Fs_df200 and Fs_dtau200 datasets.





IMPORTANT: You must remove or comment out the exit() command on line 46 to allow the plotting section of the script to execute.




Ensure that d_lmn is set to '200'.





 

plot_mf_sf_joint_dm.py





Purpose: Generates a series of joint posterior plots for M_f and \chi_f for all the two-mode combinations analyzed.




Generates: Figures A1 and A2 in the Appendix.




Instructions:





The script iterates through the modes0 and modes lists to generate a plot for each combination.




The file contains commented-out lists for different sets of modes. To generate all panels shown in Figures A1 and A2, you may need to uncomment or modify these lists and run the script multiple times.





 

plot_bfs_m3.ipynb





Purpose: Calculates the Bayes factors for three-mode combinations relative to the 220-only model and the preferred 220+200 model.




Generates: The data used for Figure A3 in the Appendix.




Instructions: This notebook loads the data from Fs_three_modes.tar.gz and calculates the log Bayes factors, storing them in the bfs dictionary. A plotting cell is not included, but the logic from plot_bfs_m2.ipynb can be adapted to plot the results and reproduce Figure A3.



 

utils.py





Purpose: A utility module containing the joint_plot and joint_plot_v1 functions, which are used by other scripts to create the joint posterior contour plots.




Instructions: This file must be present in the same directory as plot_mf_sf_joint_dm.py and check_plot_mfsf_lvk2.py.