Plotting with RIFT
Once you have run RIFT on your data, the next step is to plot the results.
Corner Plots
Corner plots are useful for visualizing multidimensional samples and examining the relationships between key parameters. Corner plots show the marginalized posteriors of the user selected parameters along the left diagonal. The peak of the marginalized posteriors represents RIFT’s best approximation of the value of that parameter at the end of the run. Two-dimensional posteriors are shown as scatter/contour plots in the other positions on the corner plot.
It is common to use corner plots to compare the results when different waveform models were used, but they have also been used to compare changes to RIFT initial settings as well as configurations used in previous searches.
Corner plots can be made using this script. The most basic way to use this script is to make a corner plot of just one iteration, probably the final iteration, to look at the posterior distributions of the parameters you might be interested in. For example:
plot_posterior_corner.py --posterior-file posterior_samples-5.dat --parameter mc --parameter q
This would make a corner plot that includes chirp mass (mc) and mass ratio (q). The points represent individual samples whose color represents the likelihood of the point. A contour is drawn around the user specified confidence interval for the 2D posteriors. You may choose whether not to display the quantiles on the marginalized posteriors using the options below.
It is common to include the results from multiple posterior_samples-*.dat
on the corner plot. This may be multiple iterations of the same run (which shows convergence over the course the run) or to compare the results of recovery of the same signal using different waveforms.
This script, plot_posterior_corner.py
, currently includes the following parameters as long as they have been saved in the output files posterior_samples-*.dat
:
**Parameters**
- --parameter mtotal
total mass
- --parameter q
mass ratio
- --parameter mc
chirp mass
- --parameter eta
symmetric mass ratio
- --parameter chi_eff
effective spin
- --parameter chi1_perp
spin on BH 1
- --parameter chi2_perp
spin on BH 2
- --parameter LambdaTilde
combined dimensionless tidal deformability
- --parameter DeltaLambdaTilde
change in tidal deformability
- --parameter lambdat
lambdat
- --parameter dlambdat
dlambdat
- --parameter eccentricity
orbital eccentricity
There are also many arguments that can be added to the command line call to customize the corner plots. Open the pull down “optional arguments” below to see the additional options and their descriptions.
**Optional arguments**
- --posterior-file
filename of .dat file [standard LI output]
- --truth-file
file containing the true parameters
- --posterior-distance-factor
Sequence of factors used to correct the distances
- --truth-event
number of event in file containing the true parameters
- --composite-file
filename of .dat file [standard ILE intermediate]
- --use-all-composite-but-grayscale
Composite; plot all grid points used in iteration but make them grayscale
- --flag-tides-in-composite
Required if you want to parse files with tidal parameters
- --flag-eos-index-in-composite
Required if you want to parse files with EOS index in composite (and tides)
- --posterior-label
label for posterior file
- --posterior-color
color and linestyle for posterior. PREPENDED onto default list, so defaults exist
- --posterior-linestyle
color and linestyle for posterior. PREPENDED onto default list, so defaults exist
- --parameter-log-scale
Put this parameter in log scale
- --change-parameter-label
format name=string. Will be wrapped in $…$
- --use-legend
creates a legend so colors of corr posteriors are labeled with –parameter-label
- --use-title
User input string containing desired plot title
- --use-smooth-1d
currently hard set to None
- --plot-1d-extra
(add descrip here)
Export PDF plots
- --bind-param
a parameter to impose a bound on, with corresponding –param-bound arg in respective order
- --param-bound
respective bounds for above params
- --ci-list
List for credible intervals. Default is 0.95,0.9,0.68
- --quantiles
List for 1d quantiles intervals. Default is 0.95,0.05
- --chi-max
sets limits on spin range ?
- --lambda-plot-max
set upper limits on matter
- --sigma-cut
removes samples with sigma lower than this value
- --eccentricity
Read sample files in format including eccentricity
P-P Plots
Probability-probability plots
This driver performs the steps necessary to generate “PP plots”: consistency tests of the code using injections and recovery from a known prior. These plots show whether the recovered parameters follow the same distribution they are generated with. The data is plotted against the theoretical distribution and should follow approximately a straight line. Too much variation from a straight line indicates that the data is departed from the intended distribution.
Since these plots are created when testing code updates, the goal is to ensure that the changes do not disrupt the recovered data from the initial intended distribution. Following usual RIFT convention, we adopt uniform priors in (redshifted/detector-frame) m1,m2, bounded by specific ranges in mc, q. Spin priors are either uniform in magnitude (if aligned or precessing), with ranges controlled by chi_max. Lambda priors are uniform up to lambda_max. Eccentricity priors are uniform.
There are two useful scripts for creating pp plots after running RIFT on injections: pp_plot_dataproduct.py and pp_plot.py .
For each injection j, extract \(P_{j,\alpha}(<x_{j,alpha})\), the empirical CDF evaluated for the jth injection and parameter \(\alpha\) at the true value value \(x_{j,\alpha}\) of that parameter.
This script pp_plot_dataproduct.py
uses the last iteration output posterior file for the run to calculate a p-value for the user specified parameters and the highest value of log-likelihood for the best point in the final posterior samples file. For example, if the user specifies parameter chirp mass, mass ratio, and spins, the script reports data in a format
# p(mc) p(q) p(a1z) p(a2z) lnL
PP plots require information from each injection, so it is easiest to make a script to loop over your data files that includes the following:
export PATH=${PATH}:path_to_file
HERE= `pwd`
for i in `seq 0 5`; do
echo " ++" $i;
export HIGHEST_SAMPLE_FILE= `ls analysis_event_${i}/posterior_samples*.dat | sort | tail -n 1`
echo Sample file: ${HIGHEST_SAMPLE_FILE}
echo `python pp_plot_dataproduct.py --posterior-file "${HIGHEST_SAMPLE_FILE}" --truth-file ${HERE}/mdc.xml.gz --truth-event ${i} --parameter mc --parameter q --parameter a1z --parameter a2z --composite-file analysis_event_${i}/all.net | tail -n 1`
echo `cat analysis_event_${i}/iteration*/logs/test*.out | tail -n 1`;
done > net_pp.dat
# grab number-only entries, don't remove floating point
grep -v ++ net_pp.dat | grep -v [a-df-z] > net_pp.dat_clean
This gathers the information from above (the parameter p-values for each injection, the maximum log-likelihood, as well as the convergence statistic) into a single file called net_pp.dat_clean
. Load in the data and make a cumulative CDF plot for each variable, with your favorite plotting code. For lightweight tests, we provide pp_plot.py
pp_plot.py net_pp.dat_clean 2 ['mc', 'q']
This script orders and plots the p-values for all the injections for each parameter. In the above example, the p-values for chirp mass and mass ratio will be plotted together on a PP plot. The points are displayed with an ellipse representing the \(90%\) confidence interval. Ideally, the points for each parameter should for a diagonal line on the pp-plot, indicating that the distribution of the recovered parameters matches the injected distribution. If your PP plot is not diagonal, there was likely some issue with your run.