Jpp 20.0.0-rc.7
the software that should make you happy
Loading...
Searching...
No Matches
JPseudoExperimentUpperLimit.cc File Reference

Test application for pseudo experiment generation and upper limit evaluations. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <vector>
#include <map>
#include <exception>
#include <algorithm>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TH3D.h"
#include "TRandom3.h"
#include "JAstronomy/JPseudoExperiment.hh"
#include "JAstronomy/JGarage.hh"
#include "JAstronomy/JAstronomyToolkit.hh"
#include "JLang/JVectorize.hh"
#include "JGizmo/JGizmoToolkit.hh"
#include "JTools/JAbstractHistogram.hh"
#include "JROOT/JRandom.hh"
#include "JMath/JMathSupportkit.hh"
#include "Jeep/JContainer.hh"
#include "Jeep/JParser.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Test application for pseudo experiment generation and upper limit evaluations.

Author
mdejong

Definition in file JPseudoExperimentUpperLimit.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 127 of file JPseudoExperimentUpperLimit.cc.

128{
129 using namespace std;
130 using namespace JPP;
131
132 typedef JAbstractHistogram<double> histogram_type;
133
135 string outputFile;
136 size_t numberOfTests;
137 double boost;
138 size_t M;
139 double SNR;
140 histogram_type X;
141 JRandom seed;
142 double precision;
143 int debug;
144
145 try {
146
147 JParser<> zap;
148
149 zap['E'] = make_field(setup,
150 "douplets of signal and background histograms, "
151 << "each of which defined by <file name>:<histogram name>");
152 zap['o'] = make_field(outputFile, "output file with histograms") = "benchmark.root";
153 zap['n'] = make_field(numberOfTests, "number of tests");
154 zap['B'] = make_field(boost, "boost livetime of experiment") = 1.0;
155 zap['M'] = make_field(M, "lookup table for CDFs") = 0;
156 zap['R'] = make_field(SNR, "signal-to-noise ratio") = 0.0;
157 zap['x'] = make_field(X, "x-axis signal histogram") = histogram_type(100, -1.0e3, +1.0e3);
158 zap['p'] = make_field(precision, "precision") = 1.0e-4;
159 zap['S'] = make_field(seed) = 0;
160 zap['d'] = make_field(debug) = 1;
161
162 zap(argc, argv);
163 }
164 catch(const exception& error) {
165 FATAL(error.what() << endl);
166 }
167
168
169 seed.set(gRandom);
170
171 JExperiment::setSNR(SNR);
172
173 const double Q = 0.9; // probability limit
174
176
177 for (const auto& i : setup) {
178
179 TObject* ps = getObject(i.Hs);
180 TObject* pb = getObject(i.Hb);
181
182 dynamic_cast<TH1*>(ps)->Scale(boost);
183 dynamic_cast<TH1*>(pb)->Scale(boost);
184
185 STATUS(printer("Signal:", ps) << endl);
186 STATUS(printer("Background:", pb) << endl);
187
188 px.add(ps, pb);
189 }
190
191 if (M != 0) {
192 px.configure(M);
193 }
194
195 STATUS("Signal: " << FIXED(10,3) << px.getSignal() << endl);
196 STATUS("Background: " << FIXED(10,3) << px.getBackground() << endl);
197 STATUS("Number of tests: " << setw(10) << numberOfTests << endl);
198
199
200 TFile out(outputFile.c_str(), "recreate");
201
202 out << *gRandom;
203
204 TH1D h0("h0", NULL, X.getNumberOfBins(), X.getLowerLimit(), X.getUpperLimit());
205 TH1D h1("h1", NULL, X.getNumberOfBins(), X.getLowerLimit(), X.getUpperLimit());
206
207
208 // generate background only pseudo experiments and store fitted signals
209
210 px.set(0.0);
211
212 for (size_t i = 0; i != numberOfTests; ++i) {
213
214 JAspera aspera;
215
216 px.run(aspera);
217
218 h0.Fill(aspera(true).signal);
219 }
220
221
222 vector<double> mu_up;
223
224 for (size_t i = 0; i != numberOfTests; ++i) {
225
226 if ((i*10) < numberOfTests || (i*10)%numberOfTests == 0) {
227 STATUS(setw(6) << i << '\r'); DEBUG(endl);
228 }
229
230 JAspera aspera;
231
232 px.set(0.0);
233
234 px.run(aspera);
235
236 mu_up.push_back(px.getSignalStrengthForUpperLimit(aspera, Q, numberOfTests));
237 }
238 STATUS(endl);
239
240 for (const double x : mu_up) {
241 h1.Fill(x);
242 }
243
244 sort(mu_up.begin(), mu_up.end());
245
246 cout << "<mu> " << FIXED(7,3) << mu_up[mu_up.size() / 2] << endl;
247
248 out.Write();
249 out.Close();
250}
string outputFile
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define STATUS(A)
Definition JMessage.hh:63
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
Utility class to parse command line options.
Definition JParser.hh:1698
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.
Definition JManip.hh:448
Auxiliary data structure to fit signal strength using likelihood ratio.
Definition JAspera.hh:24
double getSignalStrengthForUpperLimit(const JAspera &aspera, const double Q, const size_t numberOfTests, const double precision=1.0e-4)
Get signal strength given result of experiment and probability of upper limit.
Pseudo experiment using CDF for combined generation and likelihood evaluation.
void add(const TObject *ps, const TObject *pb)
Add objects with PDFs of signal and background.
virtual stats_type run(JAspera &out) const
Generate pseudo experiment and transfer values to fit method.
double getSignal() const
Get total signal.
virtual void set(const double fS, const double fB=1.0) override
Set scaling factors of signal and background strengths.
double getBackground() const
Get total background.
void configure(size_t N)
Configure lookup tables.
Auxiliary wrapper for I/O of container with optional comment (see JComment).
Definition JContainer.hh:42
Template definition of random value generator.
Simple data structure for histogram binning.