Jpp 21.0.0-rc.1-88-g0130508c4
the software that should make you happy
Loading...
Searching...
No Matches
JFitK40.cc File Reference

Auxiliary program to fit PMT parameters from JMergeCalibrateK40.cc output. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <set>
#include <vector>
#include <algorithm>
#include <memory>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TH2D.h"
#include "km3net-dataformat/online/JDAQ.hh"
#include "km3net-dataformat/online/JDAQHeader.hh"
#include "JTools/JConstants.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JPMTParametersMap.hh"
#include "JDetector/JStringRouter.hh"
#include "JROOT/JRootFileWriter.hh"
#include "JROOT/JRootToolkit.hh"
#include "JTools/JRange.hh"
#include "JLang/JSTDObjectWriter.hh"
#include "JSupport/JMeta.hh"
#include "JSupport/JSingleFileScanner.hh"
#include "JCalibrate/JCalibrateK40.hh"
#include "JCalibrate/JTDC_t.hh"
#include "JFitK40.hh"
#include "JTransmittances.hh"
#include "Jeep/JProperties.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"
#include "Jeep/JContainer.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to fit PMT parameters from JMergeCalibrateK40.cc output.


Note that the contebts of the 2D histograms are converted to standard deviations.

Author
mdejong

Definition in file JFitK40.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 66 of file JFitK40.cc.

67{
68 using namespace std;
69 using namespace JPP;
70 using namespace KM3NETDAQ;
71
73
75
76 string inputFile;
77 string outputFile;
78 string detectorFile;
79 string pmtFile;
80 JTDC_t TDC;
81 bool reverse;
82 bool overwriteDetector;
83 JCounter writeFits;
84 bool fitAngle;
85 bool fitNoise;
86 bool fitModel;
87 double QE;
88 set<char> transmittance;
89 JRange_t X;
90 JRange_t Y;
91 string transmittanceFile;
92 bool TEST = false;
93 int debug;
94
95 try {
96
97 JProperties properties;
98
99 properties.insert(gmake_property(MINIMAL_RATE_HZ));
100 properties.insert(gmake_property(STDEV));
101 properties.insert(gmake_property(MAXIMAL_COUNTS));
102 properties.insert(gmake_property(QE_MIN));
103 properties.insert(gmake_property(T0_NS));
104 properties.insert(gmake_property(K40.R));
105 properties.insert(gmake_property(K40.p1));
106 properties.insert(gmake_property(K40.p2));
107 properties.insert(gmake_property(K40.p3));
108 properties.insert(gmake_property(K40.p4));
109 properties.insert(gmake_property(TEROSTAT_R1));
110 properties.insert(gmake_property(TEROSTAT_DZ));
111 properties.insert(gmake_property(BELL_SHAPE));
112 properties.insert(gmake_property(MESTIMATOR));
113 properties.insert(gmake_property(TEST));
114
115 JParser<> zap("Auxiliary program to fit PMT parameters from JMergeCalibrateK40 output.");
116
117 zap['@'] = make_field(properties) = JPARSER::initialised();
118 zap['f'] = make_field(inputFile, "input file (output from JMergeCalibrateK40).");
119 zap['o'] = make_field(outputFile, "output file.") = "fit.root";
120 zap['a'] = make_field(detectorFile, "detector file.");
121 zap['P'] = make_field(pmtFile, "specify PMT file name that can be given to JTriggerEfficiency.") = "";
122 zap['!'] = make_field(TDC,
123 "Fix time offset(s) of PMT(s) of certain module(s), e.g."
124 "\n-! \"808969848 0 808982077 23\" will fix time offsets of PMT 0 of module 808969848 and of PMT 23 of module 808982077."
125 "\nSame PMT offset can be fixed for all optical modules, e.g."
126 "\n-! \"-1 0 -1 23\" will fix time offsets of PMTs 0 and 23 of all optical modules.") = JPARSER::initialised();
127 zap['r'] = make_field(reverse, "reverse TDC constraints due to option -! <TDC>.");
128 zap['A'] = make_field(overwriteDetector, "overwrite detector file provided through '-a' with fitted time offsets.");
129 zap['w'] = make_field(writeFits, "write fit results to ROOT file; -ww also write fitted TTS to PMT file.");
130 zap['D'] = make_field(fitAngle, "fit angular distribution; fix normalisation.");
131 zap['B'] = make_field(fitNoise, "fit background.");
132 zap['M'] = make_field(fitModel, "fit angular distribution as well as normalisation; fix PMT QEs = 1.0.");
133 zap['Q'] = make_field(QE, "fix PMT QEs") = 0.0;
134 zap['T'] = make_field(transmittance, "fit transmittance of ring A-F") = JPARSER::initialised();
135 zap['X'] = make_field(transmittanceFile, "transmittances I/O") = JPARSER::initialised();
136 zap['x'] = make_field(X, "fit range (PMT pairs).") = JRange_t();
137 zap['y'] = make_field(Y, "fit range (time residual [ns]).") = JRange_t();
138 zap['d'] = make_field(debug, "debug.") = 1;
139
140 zap(argc, argv);
141 }
142 catch(const exception &error) {
143 FATAL(error.what() << endl);
144 }
145
146
147 if ((fitModel ? 1 : 0) +
148 (fitAngle ? 1 : 0) +
149 (fitNoise ? 1 : 0) +
150 (QE != 0.0 ? 1 : 0) > 1) {
151 FATAL("Use either option -M, -D, -B or -Q" << endl);
152 }
153
154 const int option = (fitModel ? FIT_MODEL_t :
156 fitNoise ? FIT_PMTS_AND_BACKGROUND_t :
157 QE != 0.0 ? FIT_PMTS_QE_FIXED_t :
158 FIT_PMTS_t);
159
160 if (reverse) {
161 TDC.reverse();
162 }
163
164 for (JTDC_t::const_iterator i = TDC.begin(); i != TDC.end(); ++i) {
165 DEBUG("PMT " << setw(10) << i->first << ' ' << setw(2) << i->second << " constrain t0." << endl);
166 }
167
168 try {
169 TDC.is_valid(true);
170 }
171 catch(const exception &error) {
172 FATAL(error.what() << endl);
173 }
174
176
177 try {
178 load(detectorFile, detector);
179 }
180 catch(const JException& error) {
181 FATAL(error);
182 }
183
184
185 JPMTParametersMap parameters;
186
187 if (pmtFile != "") {
188 try {
189 parameters.load(pmtFile.c_str());
190 }
191 catch(const exception& error) {}
192 }
193
194 parameters.comment.add(JMeta(argc, argv));
195
196 transmittances_type transmittances;
197
198 if (transmittanceFile != "") {
199 try {
200 transmittances.load(transmittanceFile.c_str());
201 }
202 catch(const exception& error) {}
203 }
204
205 TFile* in = TFile::Open(inputFile.c_str(), "exist");
206
207 if (in == NULL || !in->IsOpen()) {
208 FATAL("File: " << inputFile << " not opened." << endl);
209 }
210
211
212 TFile out(outputFile.c_str(), "recreate");
213
214 TH1D h0("chi2", NULL, 500, 0.0, 5.0);
215 TH1D hn("hn", NULL, 501, -0.5, 500.0);
216 TH1D hr("rate", NULL, 500, 0.0, 25.0);
217 TH1D h1("p1", NULL, 500, -5.0, +5.0);
218 TH1D h2("p2", NULL, 500, -5.0, +5.0);
219 TH1D h3("p3", NULL, 500, -5.0, +5.0);
220 TH1D h4("p4", NULL, 500, -5.0, +5.0);
221 TH1D hc("cc", NULL, 500, -0.1, +0.1);
222 TH1D hb("bc", NULL, 500, -0.1, +0.1);
223
225
226 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
227 T.push_back(new TH1D(MAKE_CSTRING("transmittance[" << ring_type::getRing(i) << "]"), NULL, 100, 0.0, 10.0));
228 }
229
231 const JStringRouter string(detector);
232
233 TH2D H2("detector", NULL,
234 string.size() + 0, -0.5, string.size() - 0.5,
235 range.getUpperLimit(), 1 - 0.5, range.getUpperLimit() + 0.5);
236
237 for (Int_t i = 1; i <= H2.GetXaxis()->GetNbins(); ++i) {
238 H2.GetXaxis()->SetBinLabel(i, MAKE_CSTRING(string.at(i-1)));
239 }
240 for (Int_t i = 1; i <= H2.GetYaxis()->GetNbins(); ++i) {
241 H2.GetYaxis()->SetBinLabel(i, MAKE_CSTRING(i));
242 }
243
244 TH2D* HN = (TH2D*) H2.Clone("iterations");
245
246 JFit fit(MESTIMATOR, debug);
247
248 for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
249
250 if (module->getFloor() == 0) {
251 continue;
252 }
253
254 const JTDC_t::range_type range = TDC.equal_range(module->getID());
255
256 NOTICE("Module " << setw(10) << module->getID() << ' ' << getLabel(module->getLocation()) << " !" << distance(range.first, range.second) << endl);
257
258 TH2D* h2d = (TH2D*) in->Get(MAKE_CSTRING(module->getID() << _2R));
259
260 if (h2d == NULL || h2d->GetEntries() == 0) {
261
262 NOTICE("No data for module " << module->getID() << " -> set QEs to 0." << endl);
263
264 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
265 parameters[JPMTIdentifier(module->getID(), pmt)].QE = 0.0;
266 }
267
268 continue;
269 }
270
271 JModel model(*module, K40, range, option);
272
273 for (const char c : transmittance) {
274 model.transmittance[ring_type(c).getIndex()].set();
275 }
276
277 if (transmittances.count(module->getID())) {
278 for (int i = 0 ; i != NUMBER_OF_RINGS; ++i) {
279 model.transmittance[i].fix(transmittances[module->getID()][i]);
280 }
281 }
282
283 if (QE != 0.0) {
284 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
285 model.parameters[pmt].QE.fix(QE);
286 }
287 }
288
289 data_type data; // input data
290
291 vector<size_t> count[2] = {
292 vector<size_t>(NUMBER_OF_PMTS, 0), // counter (exclude self)
293 vector<size_t>(NUMBER_OF_PMTS, 1) // counter (include self)
294 };
295
296 for (int ix = 1; ix <= h2d->GetXaxis()->GetNbins(); ++ix) {
297
298 const pair_type pair = model.getPair(ix - 1);
299
300 auto& buffer = data[pair]; // storage
301
302 double V = 0.0; // integrated value
303 double W = 0.0; // integrated error
304
305 for (int iy = 1; iy <= h2d->GetYaxis()->GetNbins(); ++iy) {
306
307 const double x = h2d->GetXaxis()->GetBinCenter(ix);
308 const double y = h2d->GetYaxis()->GetBinCenter(iy);
309
310 if (X(x) && Y(y)) {
311
312 double value = h2d->GetBinContent(ix,iy);
313 double error = h2d->GetBinError (ix,iy);
314
315 buffer.push_back(rate_type(y, value, error));
316
317 double width = h2d->GetYaxis()->GetBinWidth(iy);
318
319 value *= width;
320 error *= width;
321
322 V += value;
323 W += error * error;
324 }
325 }
326
327 W = sqrt(W);
328
329 if (V <= 0.0 - STDEV*W) {
330 count[0][pair.first] += 1;
331 count[0][pair.second] += 1;
332 }
333
334 if (V <= MINIMAL_RATE_HZ + STDEV*W) {
335 count[1][pair.first] += 1;
336 count[1][pair.second] += 1;
337 }
338 }
339
340 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
341
342 if (count[0][pmt] >= MAXIMAL_COUNTS) { // too many paired rates negative
343
344 WARNING("PMT " << setw(10) << module->getID() << '.' << FILL(2,'0') << pmt << FILL() << " some rates negative -> fit background" << endl);
345
346 if (fit.value.parameters[pmt].status) {
347 model.parameters[pmt].bg.set();
348 }
349 }
350
351 if (count[1][pmt] == NUMBER_OF_PMTS) { // all paired rates too low
352
353 WARNING("PMT " << setw(10) << module->getID() << '.' << FILL(2,'0') << pmt << FILL() << " all rates to low -> disable" << endl);
354
355 model.parameters[pmt].disable();
356 }
357 }
358
359 DEBUG("Start value:" << endl << model << endl);
360
361 try {
362
363 fit.value = model; // start value
364
365 fit.TEST = TEST; // test
366
367 auto result = fit(data);
368
369 if (result.ndf <= 0) {
370
371 ERROR("Fit result " << setw(10) << module->getID() << " NDF " << setw(5) << result.ndf << " -> skip" << endl);
372
373 continue;
374 }
375
376 bool refit = false;
377
378 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
379
380 if (fit.value.parameters[pmt].status) {
381
382 if (fit.value.parameters[pmt].QE() <= QE_MIN ) {
383
384 WARNING("PMT " << setw(10) << module->getID() << '.' << FILL(2,'0') << pmt << FILL() << ' '
385 << "QE = "
386 << FIXED(5,3) << fit.value.parameters[pmt].QE() << " +/- "
387 << FIXED(5,3) << fit.error.parameters[pmt].QE() << " "
388 << " -> disable" << (!refit ? " and refit" : "") << endl);
389
390 fit.value.parameters[pmt].disable();
391
392 refit = true;
393 }
394 }
395 }
396
397 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
398
399 if (fit.value.parameters[pmt].status) {
400
401 if (fit.value.parameters[pmt].t0.atLimit(T0_NS)) {
402
403 WARNING("PMT " << setw(10) << module->getID() << '.' << FILL(2,'0') << pmt << FILL() << ' '
404 << "t0 at limit "
405 << FIXED(7,3) << fit.value.parameters[pmt].t0() << " +/- "
406 << FIXED(7,3) << fit.error.parameters[pmt].t0());
407
408 if (refit == false) {
409
410 WARNING(" -> disable and refit" << endl);
411
412 fit.value.parameters[pmt].disable();
413
414 refit = true;
415
416 } else {
417
418 WARNING(" -> reset" << endl);
419
420 fit.value.parameters[pmt].t0.set(0.0);
421 }
422 }
423 }
424 }
425
426 if (refit) {
427
428 fit.value.transmittance.set(JTransmittance::getInstance());
429
430 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
431 if (fit.value.parameters[pmt].status) {
432 fit.value.parameters[pmt].set(JPMTParameters_t::getInstance());
433 }
434 }
435
436 refit = false;
437 result = fit(data);
438 }
439
440 NOTICE("Fit result " << setw(10) << module->getID() << " chi2 / NDF " << FIXED(10,2) << result.chi2 << " / " << setw(5) << result.ndf << ' ' << setw(5) << fit.numberOfIterations << endl);
441
442 if (fitModel && debug < debug_t) {
443 fit.value.model.print(cout);
444 }
445
446 DEBUG(fit.value);
447
448 // store transmittances
449
450 transmittances[module->getID()] = fit.value.transmittance;
451
452 if (writeFits) {
453
454 h0.Fill(result.chi2 / result.ndf);
455 hn.Fill(fit.numberOfIterations);
456 hr.Fill(fit.value.model.R );
457 h1.Fill(fit.value.model.p1);
458 h2.Fill(fit.value.model.p2);
459 h3.Fill(fit.value.model.p3);
460 h4.Fill(fit.value.model.p4);
461 hc.Fill(fit.value.model.cc);
462 hb.Fill(fit.value.model.bc);
463
464 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
465 T[i]->Fill(fit.value.transmittance[i]());
466 }
467
468 TH1D h1t(MAKE_CSTRING(module->getID() << ".1t0"), NULL, NUMBER_OF_PMTS, -0.5, NUMBER_OF_PMTS - 0.5);
469 TH1D h1s(MAKE_CSTRING(module->getID() << ".1TTS"), NULL, NUMBER_OF_PMTS, -0.5, NUMBER_OF_PMTS - 0.5);
470 TH1D h1q(MAKE_CSTRING(module->getID() << ".1QE"), NULL, NUMBER_OF_PMTS, -0.5, NUMBER_OF_PMTS - 0.5);
471
472 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
473 h1t.SetBinContent(pmt + 1, fit.value.parameters[pmt].t0 ());
474 h1t.SetBinError (pmt + 1, fit.error.parameters[pmt].t0 () + numeric_limits<double>::epsilon());
475 h1s.SetBinContent(pmt + 1, fit.value.parameters[pmt].TTS());
476 h1s.SetBinError (pmt + 1, fit.error.parameters[pmt].TTS() + numeric_limits<double>::epsilon());
477 h1q.SetBinContent(pmt + 1, fit.value.parameters[pmt].QE ());
478 h1q.SetBinError (pmt + 1, fit.error.parameters[pmt].QE () + numeric_limits<double>::epsilon());
479 }
480
481 out << h1t << h1s << h1q;
482
483 for (int ix = 1; ix <= h2d->GetXaxis()->GetNbins(); ++ix) {
484
485 const pair_type pair = fit.value.getPair(ix - 1);
486
487 for (int iy = 1; iy <= h2d->GetYaxis()->GetNbins(); ++iy) {
488
489 const double dt_ns = h2d->GetYaxis()->GetBinCenter(iy);
490
491 h2d->SetBinContent(ix, iy, fit.value.getValue(pair, dt_ns));
492 h2d->SetBinError (ix, iy, 0.0);
493 }
494 }
495
496 h2d->SetName(MAKE_CSTRING(module->getID() << _2F));
497 h2d->Write();
498
499 const double x = string.getIndex(module->getString());
500 const double y = module->getFloor();
501
502 H2 .Fill(x, y, result.chi2 / result.ndf);
503 HN->Fill(x, y, fit.numberOfIterations);
504 }
505
506 const double t0 = (fit.value.hasFixedTimeOffset() ? fit.value.getFixedTimeOffset() : 0.0);
507
508 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
509
510 const ring_type ring = getRing(module->getPMT(pmt).getDZ());
511
512 JPMTParameters& data = parameters[JPMTIdentifier(module->getID(), pmt)];
513
515
516 if (R > 0.0)
517 data.QE = fit.value.parameters[pmt].QE() * fit.value.transmittance[ring]() / R;
518 else
519 data.QE = 0.0;
520
521 if (writeFits > 1) {
522 data.TTS_ns = fit.value.parameters[pmt].TTS();
523 }
524
525 module->getPMT(pmt).addT0(fit.value.parameters[pmt].t0() - t0);
526 }
527 }
528 catch(const exception& error) {
529
530 ERROR("Module " << setw(10) << module->getID() << ' ' << error.what() << " -> set QEs to 0." << endl);
531
532 for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
533 parameters[JPMTIdentifier(module->getID(), pmt)].QE = 0.0;
534 }
535 }
536 }
537
538
539 vector<JMeta> meta(1, JMeta(argc, argv));
540
541 {
542 JSingleFileScanner<JMeta> reader(inputFile);
543 JSTDObjectWriter <JMeta> writer(meta);
544
545 writer << reader;
546 }
547
548 for (vector<JMeta>::const_reverse_iterator i = meta.rbegin(); i != meta.rend(); ++i) {
549 parameters.comment.add(*i);
550 detector .comment.add(*i);
551 }
552
553 if (overwriteDetector) {
554
555 NOTICE("Store calibration data on file " << detectorFile << endl);
556
557 store(detectorFile, detector);
558 }
559
560 if (pmtFile != "") {
561 parameters.store(pmtFile.c_str());
562 }
563
564 if (transmittanceFile != "") {
565 transmittances.store(transmittanceFile.c_str());
566 }
567
568 for (vector<JMeta>::const_iterator i = meta.begin(); i != meta.end(); ++i) {
569 putObject(out,*i);
570 }
571
572 for (JRootFileReader<JDAQHeader> in(inputFile.c_str()); in.hasNext(); ) {
573 putObject(out, *in.next());
574 }
575
576 if (writeFits) {
577
578 out << h0 << hn << hr << h1 << h2 << h3 << h4 << hc << hb << H2 << *HN;
579
580 for (int i = 0; i != NUMBER_OF_RINGS; ++i) {
581 out << *T[i];
582 }
583 }
584
585 out.Close();
586
587 return 0;
588}
string outputFile
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define NOTICE(A)
Definition JMessage.hh:64
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:74
#define WARNING(A)
Definition JMessage.hh:65
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2140
#define MAKE_CSTRING(A)
Make C-string.
Definition JPrint.hh:57
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
#define TEST(T)
Test data member.
Definition JRootClass.cc:35
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Detector data structure.
Definition JDetector.hh:96
Auxiliary class for map of PMT parameters.
Data structure for PMT parameters.
Utility class to parse parameter values.
General exception.
Definition JException.hh:25
Utility class to parse command line options.
Definition JParser.hh:1697
Object reading from a list of files.
Range of values.
Definition JRange.hh:42
T getUpperLimit() const
Get upper limit.
Definition JRange.hh:213
static double TEROSTAT_R1
scaling factor
Definition JFitK40.hh:66
static const char *const _2F
Name extension for 2F rate fitted.
@ FIT_PMTS_QE_FIXED_t
fit parameters of PMTs with QE fixed
Definition JFitK40.hh:57
@ FIT_PMTS_AND_ANGULAR_DEPENDENCE_t
fit parameters of PMTs and angular dependence of K40 rate
Definition JFitK40.hh:55
@ FIT_MODEL_t
fit parameters of K40 rate and TTSs of PMTs
Definition JFitK40.hh:58
@ FIT_PMTS_AND_BACKGROUND_t
fit parameters of PMTs and background
Definition JFitK40.hh:56
@ FIT_PMTS_t
fit parameters of PMTs
Definition JFitK40.hh:54
static const char *const _2R
Name extension for 2D rate measured.
static const int NUMBER_OF_RINGS
number of rings in optical module.
Definition JFitK40.hh:63
static double TEROSTAT_DZ
maximal PMT inclination
Definition JFitK40.hh:65
ring_type getRing(const double dz)
Get ring.
Definition JFitK40.hh:988
static double BELL_SHAPE
Bell shape.
Definition JFitK40.hh:67
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
Definition JLocation.hh:247
floor_range getRangeOfFloors(const JDetector &detector)
Get range of floors.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
double getSurvivalProbability(const JPMTParameters &parameters)
Get model dependent probability that a one photo-electron hit survives the simulation of the PMT assu...
@ debug_t
debug
Definition JMessage.hh:29
void model(JModel_t &value)
Auxiliary function to constrain model during fit.
Definition JGandalf.hh:57
static const JX X
Definition JMathlib.hh:1558
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
bool putObject(TDirectory &dir, const TObject &object)
Write object to ROOT directory.
return result
Definition JPolint.hh:862
KM3NeT DAQ data structures and auxiliaries.
Definition DataQueue.cc:39
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
Definition JDAQ.hh:26
Auxiliary data structure for sequence of same character.
Definition JManip.hh:330
Auxiliary data structure for floating point format specification.
Definition JManip.hh:448
Type definition of range.
Definition JHead.hh:43
Livetime of noise data.
Definition JHead.hh:1062
Detector file.
Definition JHead.hh:227
Acoustic single fit.
Model for fit to acoustics data.
Fit parameters for two-fold coincidence rate due to K40.
Definition JFitK40.hh:726
static const JK40Parameters & getInstance()
Get default values.
Definition JFitK40.hh:742
static const JPMTParameters_t & getInstance()
Get default values.
Definition JFitK40.hh:495
Auxiliary class for TDC constraints.
Definition JTDC_t.hh:39
range_type equal_range(const int id)
Get range of constraints for given module.
Definition JTDC_t.hh:101
void reverse()
Reverse constraints.
Definition JTDC_t.hh:137
bool is_valid(const bool option=false) const
Check validity of TDC constrants.
Definition JTDC_t.hh:171
static const JTransmittance & getInstance()
Get default values.
Definition JFitK40.hh:1069
Data structure for measured coincidence rates of all pairs of PMTs in optical module.
Definition JFitK40.hh:110
Data structure for measured coincidence rate of pair of PMTs.
Definition JFitK40.hh:73
Auxiliary data structure to define ring.
Definition JFitK40.hh:902
int getIndex() const
Get index.
Definition JFitK40.hh:918
static ring_type getRing(const int index)
Get ring.
Definition JFitK40.hh:941
Auxiliary data structure for I/O of transmittances of optical modules in detector.
Router for mapping of string identifier to index.
JComment & add(const std::string &comment)
Add comment.
Definition JComment.hh:100
void store(const char *file_name) const
Store to output file.
void load(const char *file_name)
Load from input file.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition JParser.hh:67
Auxiliary class for ROOT I/O of application specific meta data.
Definition JMeta.hh:72
Data structure for a pair of indices.