Skip to content

Commit

Permalink
Revert "run black on pycbc/events/ranking in order to try and get cod…
Browse files Browse the repository at this point in the history
…eclimate to be quiet"

This reverts commit 4f082ea.
  • Loading branch information
GarethCabournDavies committed May 20, 2024
1 parent 4f082ea commit c385bed
Showing 1 changed file with 127 additions and 102 deletions.
229 changes: 127 additions & 102 deletions pycbc/events/ranking.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
""" This module contains functions for calculating single-ifo ranking
statistic values
"""

import numpy


def effsnr(snr, reduced_x2, fac=250.0, **kwargs): # pylint:disable=unused-argument
"""Calculate the effective SNR statistic. See (S5y1 paper) for definition."""
def effsnr(snr, reduced_x2, fac=250.,
**kwargs): # pylint:disable=unused-argument
"""Calculate the effective SNR statistic. See (S5y1 paper) for definition.
"""
snr = numpy.array(snr, ndmin=1, dtype=numpy.float64)
rchisq = numpy.array(reduced_x2, ndmin=1, dtype=numpy.float64)
esnr = snr / (1 + snr**2 / fac) ** 0.25 / rchisq**0.25
esnr = snr / (1 + snr ** 2 / fac) ** 0.25 / rchisq ** 0.25

# If snr input is float, return a float. Otherwise return numpy array.
if hasattr(snr, "__len__"):
if hasattr(snr, '__len__'):
return esnr
else:
return esnr[0]


def newsnr(snr, reduced_x2, q=6.0, n=2.0, **kwargs): # pylint:disable=unused-argument
def newsnr(snr, reduced_x2, q=6., n=2.,
**kwargs): # pylint:disable=unused-argument
"""Calculate the re-weighted SNR statistic ('newSNR') from given SNR and
reduced chi-squared values. See http://arxiv.org/abs/1208.3491 for
definition. Previous implementation in glue/ligolw/lsctables.py
Expand All @@ -27,63 +29,69 @@ def newsnr(snr, reduced_x2, q=6.0, n=2.0, **kwargs): # pylint:disable=unused-ar
reduced_x2 = numpy.array(reduced_x2, ndmin=1, dtype=numpy.float64)

# newsnr is only different from snr if reduced chisq > 1
ind = numpy.where(reduced_x2 > 1.0)[0]
nsnr[ind] *= (0.5 * (1.0 + reduced_x2[ind] ** (q / n))) ** (-1.0 / q)
ind = numpy.where(reduced_x2 > 1.)[0]
nsnr[ind] *= (0.5 * (1. + reduced_x2[ind] ** (q/n))) ** (-1./q)

# If snr input is float, return a float. Otherwise return numpy array.
if hasattr(snr, "__len__"):
if hasattr(snr, '__len__'):
return nsnr
else:
return nsnr[0]


def newsnr_sgveto(snr, brchisq, sgchisq, **kwargs): # pylint:disable=unused-argument
"""Combined SNR derived from NewSNR and Sine-Gaussian Chisq"""
nsnr = numpy.array(newsnr(snr, brchisq, **kwargs), ndmin=1)
def newsnr_sgveto(snr, brchisq, sgchisq,
**kwargs): # pylint:disable=unused-argument
""" Combined SNR derived from NewSNR and Sine-Gaussian Chisq"""
nsnr = numpy.array(
newsnr(
snr,
brchisq,
**kwargs),
ndmin=1)
sgchisq = numpy.array(sgchisq, ndmin=1)
t = numpy.array(sgchisq > 4, ndmin=1)
if len(t):
nsnr[t] = nsnr[t] / (sgchisq[t] / 4.0) ** 0.5

# If snr input is float, return a float. Otherwise return numpy array.
if hasattr(snr, "__len__"):
if hasattr(snr, '__len__'):
return nsnr
else:
return nsnr[0]


def newsnr_sgveto_psdvar(
snr, brchisq, sgchisq, psd_var_val, min_expected_psdvar=0.65, **kwargs
): # pylint:disable=unused-argument
"""Combined SNR derived from SNR, reduced Allen chisq, sine-Gaussian chisq and
def newsnr_sgveto_psdvar(snr, brchisq, sgchisq, psd_var_val,
min_expected_psdvar=0.65,
**kwargs): # pylint:disable=unused-argument
""" Combined SNR derived from SNR, reduced Allen chisq, sine-Gaussian chisq and
PSD variation statistic"""
# If PSD var is lower than the 'minimum usually expected value' stop this
# being used in the statistic. This low value might arise because a
# significant fraction of the "short" PSD period was gated (for instance).
psd_var_val = numpy.array(psd_var_val, copy=True)
psd_var_val[psd_var_val < min_expected_psdvar] = 1.0
scaled_snr = snr * (psd_var_val**-0.5)
scaled_brchisq = brchisq * (psd_var_val**-1.0)
nsnr = newsnr_sgveto(scaled_snr, scaled_brchisq, sgchisq, **kwargs)
psd_var_val[psd_var_val < min_expected_psdvar] = 1.
scaled_snr = snr * (psd_var_val ** -0.5)
scaled_brchisq = brchisq * (psd_var_val ** -1.)
nsnr = newsnr_sgveto(
scaled_snr,
scaled_brchisq,
sgchisq,
**kwargs
)

# If snr input is float, return a float. Otherwise return numpy array.
if hasattr(snr, "__len__"):
if hasattr(snr, '__len__'):
return nsnr
else:
return nsnr[0]


def newsnr_sgveto_psdvar_threshold(
snr,
brchisq,
sgchisq,
psd_var_val,
min_expected_psdvar=0.65,
brchisq_threshold=10.0,
psd_var_val_threshold=10.0,
**kwargs
): # pylint:disable=unused-argument
"""newsnr_sgveto_psdvar with thresholds applied.
def newsnr_sgveto_psdvar_threshold(snr, brchisq, sgchisq, psd_var_val,
min_expected_psdvar=0.65,
brchisq_threshold=10.0,
psd_var_val_threshold=10.0,
**kwargs): # pylint:disable=unused-argument
""" newsnr_sgveto_psdvar with thresholds applied.
This is the newsnr_sgveto_psdvar statistic with additional options
to threshold on chi-squared or PSD variation.
Expand All @@ -97,47 +105,59 @@ def newsnr_sgveto_psdvar_threshold(
**kwargs
)
nsnr = numpy.array(nsnr, ndmin=1)
nsnr[brchisq > brchisq_threshold] = 1.0
nsnr[psd_var_val > psd_var_val_threshold] = 1.0
nsnr[brchisq > brchisq_threshold] = 1.
nsnr[psd_var_val > psd_var_val_threshold] = 1.

# If snr input is float, return a float. Otherwise return numpy array.
if hasattr(snr, "__len__"):
if hasattr(snr, '__len__'):
return nsnr
else:
return nsnr[0]


def newsnr_sgveto_psdvar_scaled(
snr, brchisq, sgchisq, psd_var_val, scaling=0.33, min_expected_psdvar=0.65, **kwargs
): # pylint:disable=unused-argument
"""Combined SNR derived from NewSNR, Sine-Gaussian Chisq and scaled PSD
variation statistic."""
nsnr = numpy.array(newsnr_sgveto(snr, brchisq, sgchisq, **kwargs), ndmin=1)
def newsnr_sgveto_psdvar_scaled(snr, brchisq, sgchisq, psd_var_val,
scaling=0.33, min_expected_psdvar=0.65,
**kwargs): # pylint:disable=unused-argument
""" Combined SNR derived from NewSNR, Sine-Gaussian Chisq and scaled PSD
variation statistic. """
nsnr = numpy.array(
newsnr_sgveto(
snr,
brchisq,
sgchisq,
**kwargs),
ndmin=1)
psd_var_val = numpy.array(psd_var_val, ndmin=1, copy=True)
psd_var_val[psd_var_val < min_expected_psdvar] = 1.0
psd_var_val[psd_var_val < min_expected_psdvar] = 1.

# Default scale is 0.33 as tuned from analysis of data from O2 chunks
nsnr = nsnr / psd_var_val**scaling
nsnr = nsnr / psd_var_val ** scaling

# If snr input is float, return a float. Otherwise return numpy array.
if hasattr(snr, "__len__"):
if hasattr(snr, '__len__'):
return nsnr
else:
return nsnr[0]


def newsnr_sgveto_psdvar_scaled_threshold(
snr, bchisq, sgchisq, psd_var_val, threshold=2.0, **kwargs
): # pylint:disable=unused-argument
"""Combined SNR derived from NewSNR and Sine-Gaussian Chisq, and
def newsnr_sgveto_psdvar_scaled_threshold(snr, bchisq, sgchisq, psd_var_val,
threshold=2.0,
**kwargs): # pylint:disable=unused-argument
""" Combined SNR derived from NewSNR and Sine-Gaussian Chisq, and
scaled psd variation.
"""
nsnr = newsnr_sgveto_psdvar_scaled(snr, bchisq, sgchisq, psd_var_val, **kwargs)
nsnr = newsnr_sgveto_psdvar_scaled(
snr,
bchisq,
sgchisq,
psd_var_val,
**kwargs
)
nsnr = numpy.array(nsnr, ndmin=1)
nsnr[bchisq > threshold] = 1.0
nsnr[bchisq > threshold] = 1.

# If snr input is float, return a float. Otherwise return numpy array.
if hasattr(snr, "__len__"):
if hasattr(snr, '__len__'):
return nsnr
else:
return nsnr[0]
Expand All @@ -158,7 +178,7 @@ def get_snr(trigs, **kwargs): # pylint:disable=unused-argument
numpy.ndarray
Array of snr values
"""
return numpy.array(trigs["snr"][:], ndmin=1, dtype=numpy.float32)
return numpy.array(trigs['snr'][:], ndmin=1, dtype=numpy.float32)


def get_newsnr(trigs, **kwargs): # pylint:disable=unused-argument
Expand All @@ -176,8 +196,12 @@ def get_newsnr(trigs, **kwargs): # pylint:disable=unused-argument
numpy.ndarray
Array of newsnr values
"""
dof = 2.0 * trigs["chisq_dof"][:] - 2.0
nsnr = newsnr(trigs["snr"][:], trigs["chisq"][:] / dof, **kwargs)
dof = 2. * trigs['chisq_dof'][:] - 2.
nsnr = newsnr(
trigs['snr'][:],
trigs['chisq'][:] / dof,
**kwargs
)
return numpy.array(nsnr, ndmin=1, dtype=numpy.float32)


Expand All @@ -196,9 +220,12 @@ def get_newsnr_sgveto(trigs, **kwargs): # pylint:disable=unused-argument
numpy.ndarray
Array of newsnr values
"""
dof = 2.0 * trigs["chisq_dof"][:] - 2.0
dof = 2. * trigs['chisq_dof'][:] - 2.
nsnr_sg = newsnr_sgveto(
trigs["snr"][:], trigs["chisq"][:] / dof, trigs["sg_chisq"][:], **kwargs
trigs['snr'][:],
trigs['chisq'][:] / dof,
trigs['sg_chisq'][:],
**kwargs
)
return numpy.array(nsnr_sg, ndmin=1, dtype=numpy.float32)

Expand All @@ -219,20 +246,18 @@ def get_newsnr_sgveto_psdvar(trigs, **kwargs): # pylint:disable=unused-argument
numpy.ndarray
Array of newsnr values
"""
dof = 2.0 * trigs["chisq_dof"][:] - 2.0
dof = 2. * trigs['chisq_dof'][:] - 2.
nsnr_sg_psd = newsnr_sgveto_psdvar(
trigs["snr"][:],
trigs["chisq"][:] / dof,
trigs["sg_chisq"][:],
trigs["psd_var_val"][:],
trigs['snr'][:],
trigs['chisq'][:] / dof,
trigs['sg_chisq'][:],
trigs['psd_var_val'][:],
**kwargs
)
return numpy.array(nsnr_sg_psd, ndmin=1, dtype=numpy.float32)


def get_newsnr_sgveto_psdvar_threshold(
trigs, **kwargs
): # pylint:disable=unused-argument
def get_newsnr_sgveto_psdvar_threshold(trigs, **kwargs): # pylint:disable=unused-argument
"""
Calculate newsnr re-weighted by the sine-gaussian veto and scaled
psd variation statistic
Expand All @@ -248,12 +273,11 @@ def get_newsnr_sgveto_psdvar_threshold(
numpy.ndarray
Array of newsnr values
"""
dof = 2.0 * trigs["chisq_dof"][:] - 2.0
dof = 2. * trigs['chisq_dof'][:] - 2.
nsnr_sg_psdt = newsnr_sgveto_psdvar_threshold(
trigs["snr"][:],
trigs["chisq"][:] / dof,
trigs["sg_chisq"][:],
trigs["psd_var_val"][:],
trigs['snr'][:], trigs['chisq'][:] / dof,
trigs['sg_chisq'][:],
trigs['psd_var_val'][:],
**kwargs
)
return numpy.array(nsnr_sg_psdt, ndmin=1, dtype=numpy.float32)
Expand All @@ -275,20 +299,18 @@ def get_newsnr_sgveto_psdvar_scaled(trigs, **kwargs): # pylint:disable=unused-a
numpy.ndarray
Array of newsnr values
"""
dof = 2.0 * trigs["chisq_dof"][:] - 2.0
dof = 2. * trigs['chisq_dof'][:] - 2.
nsnr_sg_psdscale = newsnr_sgveto_psdvar_scaled(
trigs["snr"][:],
trigs["chisq"][:] / dof,
trigs["sg_chisq"][:],
trigs["psd_var_val"][:],
trigs['snr'][:],
trigs['chisq'][:] / dof,
trigs['sg_chisq'][:],
trigs['psd_var_val'][:],
**kwargs
)
return numpy.array(nsnr_sg_psdscale, ndmin=1, dtype=numpy.float32)


def get_newsnr_sgveto_psdvar_scaled_threshold(
trigs, **kwargs
): # pylint:disable=unused-argument
def get_newsnr_sgveto_psdvar_scaled_threshold(trigs, **kwargs): # pylint:disable=unused-argument
"""
Calculate newsnr re-weighted by the sine-gaussian veto and scaled
psd variation statistic. A further threshold is applied to the
Expand All @@ -305,40 +327,43 @@ def get_newsnr_sgveto_psdvar_scaled_threshold(
numpy.ndarray
Array of newsnr values
"""
dof = 2.0 * trigs["chisq_dof"][:] - 2.0
dof = 2. * trigs['chisq_dof'][:] - 2.
nsnr_sg_psdt = newsnr_sgveto_psdvar_scaled_threshold(
trigs["snr"][:],
trigs["chisq"][:] / dof,
trigs["sg_chisq"][:],
trigs["psd_var_val"][:],
trigs['snr'][:],
trigs['chisq'][:] / dof,
trigs['sg_chisq'][:],
trigs['psd_var_val'][:],
**kwargs
)
return numpy.array(nsnr_sg_psdt, ndmin=1, dtype=numpy.float32)


sngls_ranking_function_dict = {
"snr": get_snr,
"newsnr": get_newsnr,
"new_snr": get_newsnr,
"newsnr_sgveto": get_newsnr_sgveto,
"newsnr_sgveto_psdvar": get_newsnr_sgveto_psdvar,
"newsnr_sgveto_psdvar_threshold": get_newsnr_sgveto_psdvar_threshold,
"newsnr_sgveto_psdvar_scaled": get_newsnr_sgveto_psdvar_scaled,
"newsnr_sgveto_psdvar_scaled_threshold": get_newsnr_sgveto_psdvar_scaled_threshold,
'snr': get_snr,
'newsnr': get_newsnr,
'new_snr': get_newsnr,
'newsnr_sgveto': get_newsnr_sgveto,
'newsnr_sgveto_psdvar': get_newsnr_sgveto_psdvar,
'newsnr_sgveto_psdvar_threshold': get_newsnr_sgveto_psdvar_threshold,
'newsnr_sgveto_psdvar_scaled': get_newsnr_sgveto_psdvar_scaled,
'newsnr_sgveto_psdvar_scaled_threshold':
get_newsnr_sgveto_psdvar_scaled_threshold,
}

# Lists of datasets required in the trigs object for each function
reqd_datasets = {}
reqd_datasets["snr"] = ["snr"]
reqd_datasets["newsnr"] = reqd_datasets["snr"] + ["chisq", "chisq_dof"]
reqd_datasets["new_snr"] = reqd_datasets["newsnr"]
reqd_datasets["newsnr_sgveto"] = reqd_datasets["newsnr"] + ["sg_chisq"]
reqd_datasets["newsnr_sgveto_psdvar"] = reqd_datasets["newsnr_sgveto"] + ["psd_var_val"]
reqd_datasets["newsnr_sgveto_psdvar_threshold"] = reqd_datasets["newsnr_sgveto_psdvar"]
reqd_datasets["newsnr_sgveto_psdvar_scaled"] = reqd_datasets["newsnr_sgveto_psdvar"]
reqd_datasets["newsnr_sgveto_psdvar_scaled_threshold"] = reqd_datasets[
"newsnr_sgveto_psdvar"
]
reqd_datasets['snr'] = ['snr']
reqd_datasets['newsnr'] = reqd_datasets['snr'] + ['chisq', 'chisq_dof']
reqd_datasets['new_snr'] = reqd_datasets['newsnr']
reqd_datasets['newsnr_sgveto'] = reqd_datasets['newsnr'] + ['sg_chisq']
reqd_datasets['newsnr_sgveto_psdvar'] = \
reqd_datasets['newsnr_sgveto'] + ['psd_var_val']
reqd_datasets['newsnr_sgveto_psdvar_threshold'] = \
reqd_datasets['newsnr_sgveto_psdvar']
reqd_datasets['newsnr_sgveto_psdvar_scaled'] = \
reqd_datasets['newsnr_sgveto_psdvar']
reqd_datasets['newsnr_sgveto_psdvar_scaled_threshold'] = \
reqd_datasets['newsnr_sgveto_psdvar']


def get_sngls_ranking_from_trigs(trigs, statname, **kwargs):
Expand All @@ -359,7 +384,7 @@ def get_sngls_ranking_from_trigs(trigs, statname, **kwargs):
try:
sngl_func = sngls_ranking_function_dict[statname]
except KeyError as exc:
err_msg = "Single-detector ranking {} not recognized".format(statname)
err_msg = 'Single-detector ranking {} not recognized'.format(statname)
raise ValueError(err_msg) from exc

# NOTE: In the sngl_funcs all the kwargs are explicitly stated, so any
Expand Down

0 comments on commit c385bed

Please sign in to comment.