128{
131
133
136 size_t numberOfTests;
137 double boost;
138 size_t M;
139 double SNR;
140 histogram_type X;
142 double precision;
144
145 try {
146
148
150 "douplets of signal and background histograms, "
151 << "each of which defined by <file name>:<histogram name>");
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;
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;
174 const double MUMIN = 1.0e-10;
175 const double MUMAX = 1.0e+10;
176 const size_t N = numberOfTests * 5;
177
179
180 for (const auto& i : setup) {
181
184
185 dynamic_cast<TH1*>(ps)->Scale(boost);
186 dynamic_cast<TH1*>(pb)->Scale(boost);
187
188 STATUS(printer(
"Signal:", ps) << endl);
189 STATUS(printer(
"Background:", pb) << endl);
190
192 }
193
194 if (M != 0) {
196 }
197
200 STATUS(
"Number of tests: " << setw(10) << numberOfTests << endl);
201
202
204
205 out << *gRandom;
206
207 TH1D h0("h0", NULL, X.getNumberOfBins(), X.getLowerLimit(), X.getUpperLimit());
208 TH1D h1("h1", NULL, X.getNumberOfBins(), X.getLowerLimit(), X.getUpperLimit());
209
210
211
212
214
215 const JPseudoExperiment::h0_type mu_0(px, numberOfTests);
216
217 for (const double x : mu_0) {
218 h0.Fill(x);
219 }
220
221
223
224 for (size_t i = 0; i != numberOfTests; ++i) {
225
226 if ((i*10) < numberOfTests || (i*10)%numberOfTests == 0) {
228 }
229
231
233
235
237
238 DEBUG(
"pseudo experiment " << setw(3) << aspera.size() <<
' ' <<
FIXED(12,5) <<
result.signal <<
' ' <<
FIXED(12,5) <<
result.likelihood << endl);
239
240 double mu = 0.0;
241
242 if (mu_0.getFractionBelow(
result.signal) > 1.0 - Q) {
243
244 double mumin = 1.0;
245 double mumax = 1.0;
246
247 {
248 for ( ; ; mumax *= 2.0) {
249
251
253
255
257
258 if (ps < 1.0 - Q || mumax > MUMAX) {
259 break;
260 }
261 }
262 }
263
264 if (mumax == 1.0) {
265
266 mumin = 0.5*mumax;
267
268 for ( ; ; mumin *= 0.5) {
269
271
273
275
277
278 if (ps > 1.0 - Q || mumin < MUMIN) {
279 break;
280 }
281 }
282
283 mumax = 2.0*mumin;
284
285 } else {
286
287 mumin = 0.5*mumax;
288 }
289
290 if (mumin < MUMIN)
291 mu = mumin;
292 else if (mumax > MUMAX)
293 mu = mumax;
294 else {
295
296 for ( ; ; ) {
297
298 mu = 0.5 * (mumin + mumax);
299
301
303
305
307
308 if (fabs(ps - (1.0 - Q)) <= precision) {
309 break;
310 }
311
312 if (ps >= 1.0 - Q)
313 mumin = mu;
314 else
315 mumax = mu;
316 }
317 }
318 }
319
320 mu_up.push_back(mu);
321 }
323
324 for (const double x : mu_up) {
325 h1.Fill(x);
326 }
327
328 sort(mu_up.begin(), mu_up.end());
329
330 cout <<
"<mu> " <<
FIXED(7,3) << mu_up[mu_up.size() / 2] << endl;
331
332 out.Write();
333 out.Close();
334}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Utility class to parse command line options.
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.
Auxiliary data structure to fit signal strength using likelihood ratio.
double getTestStatisticForUpperLimit(const double ps) const
Get test statistic for given signal strength.
double getProbabilityForUpperLimit(const double ps, const double ts, const size_t nx) const
Get probability for given pseudo experiment and signal strength to exceed minimal test statistic for ...
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).
Template definition of random value generator.
Auxiliary data structure for floating point format specification.