34 struct experiment_type {
51 friend inline std::istream&
operator>>(std::istream& in, experiment_type& experiment)
53 return in >> experiment.HS
58 >> experiment.nuisance;
69 friend inline std::ostream&
operator<<(std::ostream& out,
const experiment_type& experiment)
71 return out << experiment.HS <<
' '
72 << experiment.HB <<
' '
73 << experiment.Hs <<
' '
74 << experiment.Hb <<
' '
75 << experiment.boost <<
' '
76 << experiment.nuisance;
91 printer(
const char*
const title,
104 friend inline std::ostream&
operator<<(std::ostream& out,
const printer& printer)
109 out << setw(16) << left << printer.title << right;
111 if (printer.ps != NULL) {
113 out <<
' ' << setw(16) << left << printer.ps->GetName() << right;
115 const TH1* h1 =
dynamic_cast<const TH1*
>(printer.ps);
118 out <<
' ' <<
FIXED(10,3) << h1->GetSumOfWeights();
126 const char*
const title;
134 struct experiment_group {
136 double signal_weight;
145 for (
const auto& setup : setup_vec) {
151 if (setup.boost != 1.) {
152 std::cout <<
"Boosting background and signal for following dataset by factor " << setup.boost << std::endl;
153 dynamic_cast<TH1*
>(pS)->Scale(setup.boost);
154 dynamic_cast<TH1*
>(pB)->Scale(setup.boost);
155 dynamic_cast<TH1*
>(ps)->Scale(setup.boost);
156 dynamic_cast<TH1*
>(pb)->Scale(setup.boost);
159 signal_weight +=
dynamic_cast<const TH1*
>(ps)->GetSumOfWeights();
161 STATUS(printer(
"Signal for generation:", pS) << std::endl);
162 STATUS(printer(
"Background for generation:", pB) << std::endl);
166 pi.nuisance = setup.nuisance;
173 px_vec.push_back(pi);
198 size_t numberOfTests;
213 "inputs for 1st data period: signal and background histograms for generation and evaluation,\n"
214 <<
"\texposure boost, and signal and background nuisances, provided as\n"
215 <<
"\t'<file>:<hgen_s name> <file>:<hgen_b name> <file>:<heval_s name> <file>:<heval_b name> <boost> <type_s> (values) <type_b> (values)' \n"
216 <<
"\twhere <type> can be:" << get_keys(nuisance_helper) <<
"\n."
217 <<
"\t Can be called repeatedly to add multiple datasets to this period");
219 "inputs for 2nd data period: signal and background histograms for generation and evaluation,\n"
220 <<
"\texposure boost, and signal and background nuisances, provided as\n"
221 <<
"\t'<file>:<hgen_s name> <file>:<hgen_b name> <file>:<heval_s name> <file>:<heval_b name> <boost> <type_s> (values) <type_b> (values)' \n"
222 <<
"\twhere <type> can be:" << get_keys(nuisance_helper) <<
"\n."
223 <<
"\t Can be called repeatedly to add multiple datasets to this period");
226 zap[
'b'] =
make_field(Fb,
"background strength") = 1.0;
227 zap[
'M'] =
make_field(M,
"lookup table for CDFs") = 0;
228 zap[
'R'] =
make_field(SNR,
"signal-to-noise ratio") = 0.0;
229 zap[
'n'] =
make_field(numberOfTests,
"number of tests / PEs");
230 zap[
'x'] =
make_field(X,
"x-axis for likelihood histogram") = histogram_type(200, 0, +20.0);
236 catch(
const exception& error) {
237 FATAL(error.what() << endl);
243 JExperiment::setSNR(SNR);
245 cout <<
"**Setting up 1st period**" << endl;
246 experiment_group pxg_1(setup_vec1, Fs, Fb, M);
247 cout <<
"**Setting up 2nd period**" << endl;
248 experiment_group pxg_2(setup_vec2, Fs, Fb, M);
252 TH2D h2d_nllr(
"h2d_nllr",
"Negative Log-Likelihood Ratio; NLLR 1st period; NLLR total",
253 X.getNumberOfBins(), X.getLowerLimit(), X.getUpperLimit(),
254 X.getNumberOfBins(), X.getLowerLimit(), X.getUpperLimit());
255 TH2D h2d_nllr_constr(
"h2d_nllr_constr",
"Negative Log-Likelihood Ratio (filtered); NLLR 1st period; NLLR total",
256 X.getNumberOfBins(), X.getLowerLimit(), X.getUpperLimit(),
257 X.getNumberOfBins(), X.getLowerLimit(), X.getUpperLimit());
259 size_t nexp_passfilter = 0;
261 for (
size_t nexp =0; nexp != numberOfTests; ++nexp) {
262 if (nexp%100000 == 0) {
263 cout <<
"Done " << nexp <<
" pseudo-experiments out of " << numberOfTests << endl;
270 for (
const auto& px : pxg_1.px_vec) { px.run(aspera); }
273 for (
const auto& px : pxg_2.px_vec) { px.run(aspera); }
287 h2d_nllr.Fill(NLLR_1, NLLR_A, 1./numberOfTests);
289 if( result_1.
signal * pxg_1.signal_weight > 1) {
291 h2d_nllr_constr.Fill(NLLR_1, NLLR_A, 1./numberOfTests);
295 cout << nexp_passfilter <<
" PEs pass the first period filter, out of " << numberOfTests << endl;
298 h2d_nllr_constr.Write();
std::istream & operator>>(std::istream &in, JAANET::JHead &header)
Read header from input.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
int main(int argc, char **argv)
Auxiliary class to handle file name, ROOT directory and object name.
Utility class to parse command line options.
std::ostream & operator<<(std::ostream &out, const morphology_type &object)
Write morphology to output stream.
TObject * getObject(const JRootObjectID &id)
Get first TObject with given identifier.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
double signal
signal strength
double likelihood
likelihood
Auxiliary data structure to fit signal strength using likelihood ratio.
Pseudo experiment using CDF for combined generation and likelihood evaluation.
Auxiliary wrapper for I/O of container with optional comment (see JComment).
Template definition of random value generator.