diff --git a/gstlal-inspiral/python/stats/inspiral_lr.py b/gstlal-inspiral/python/stats/inspiral_lr.py index ac9424e4e32f870c6be9fbbb4fdcbc797fb90780..d7d478d130c97ef0c56dbc3f4bea118d1b879ac2 100644 --- a/gstlal-inspiral/python/stats/inspiral_lr.py +++ b/gstlal-inspiral/python/stats/inspiral_lr.py @@ -28,6 +28,7 @@ import math import numpy +import os import random from scipy import interpolate from scipy import stats @@ -35,8 +36,11 @@ import sys import warnings +from glue.ligolw import ligolw from glue.ligolw import lsctables +from glue.ligolw import array as ligolw_array from glue.ligolw import param as ligolw_param +from glue.ligolw import utils as ligolw_utils from glue import segments from gstlal.stats import horizonhistory from gstlal.stats import inspiral_extrinsics @@ -47,6 +51,13 @@ from lalburst import snglcoinc import lalsimulation +# FIXME: caution, this information might get organized differently later. +# for now we just need to figure out where the gstlal-inspiral directory in +# share/ is. don't write anything that assumes that this module will +# continue to define any of these symbols +from gstlal import paths as gstlal_config_paths + + __all__ = [ "LnSignalDensity", "LnNoiseDensity" @@ -846,15 +857,23 @@ class DatalessLnNoiseDensity(LnNoiseDensity): distance, and assess candidates based only on SNR and \chi^2 distributions. """ + + DEFAULT_FILENAME = os.path.join(gstlal_config_paths["pkgdatadir"], "inspiral_datalesslndensity.xml.gz") + + @ligolw_array.use_in + @ligolw_param.use_in + class LIGOLWContentHandler(ligolw.LIGOLWContentHandler): + pass + def __init__(self, *args, **kwargs): super(DatalessLnNoiseDensity, self).__init__(*args, **kwargs) - # this a guess at a mass dependent snr chisq prior. 10 - # *million* events gets the density estimation kernel to be - # a sensible size. - # FIXME: initialize from template information instead of - # guessing mchirp. - mchirp = 0.8 - self.add_noise_model(number_of_events = 10000000, prefactors_range = ((1. / mchirp)**.33, 25.), df = 40, inv_snr_pow = 3.) + + # install SNR, chi^2 PDF (one for all instruments) + # FIXME: make mass dependent + self.densities = { + "snr_chi": rate.BinnedLnPDF.from_xml(ligolw_utils.load_filename(self.DEFAULT_FILENAME, contenthandler = self.LIGOLWContentHandler), u"datalesslnnoisedensity") + } + def __call__(self, segments, snrs, phase, dt, template_id, **kwargs): # assume all instruments are on, 1 trigger per second per @@ -876,8 +895,8 @@ class DatalessLnNoiseDensity(LnNoiseDensity): lnP += self.coinc_rates.lnP_instruments(**triggers_per_second_per_template)[frozenset(snrs)] # evaluate the SNR, \chi^2 factors - interps = self.interps - return lnP + sum(interps[name](*value) for name, value in kwargs.items() if name in interps) + interp = self.interps["snr_chi"] + return lnP + sum(interp(*value) for name, value in kwargs.items() if name.endswith("_snr_chi")) def random_params(self): # won't work diff --git a/gstlal-inspiral/share/Makefile.am b/gstlal-inspiral/share/Makefile.am index b0c61729d497e3a6684e8ea7e9b13dee3d88531d..0e1984a7a4638dc868253619aec5f18bce35852f 100644 --- a/gstlal-inspiral/share/Makefile.am +++ b/gstlal-inspiral/share/Makefile.am @@ -4,6 +4,7 @@ dist_pkgdata_DATA = \ H1L1V1_p_of_instruments_given_H_d.h5 \ H1V1_p_of_instruments_given_H_d.h5 \ inj_simplify_and_cluster.sql \ + inspiral_datalesslndensity.xml.gz \ inspiral_dtdphi_pdf.h5 \ inspiral_snr_pdf.xml.gz \ L1V1_p_of_instruments_given_H_d.h5 \ diff --git a/gstlal-inspiral/share/inspiral_datalesslndensity.xml.gz b/gstlal-inspiral/share/inspiral_datalesslndensity.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..f73648a55c77f379f7f3a4064bc7f647c3afcb51 Binary files /dev/null and b/gstlal-inspiral/share/inspiral_datalesslndensity.xml.gz differ