48 int main(
int argc,
char **argv)
52 using namespace KM3NETDAQ;
60 int numberOfTimeslices;
64 JROOTClassSelector selector;
71 JParser<> zap(
"Example program to search for correlations between triggered events and timeslice data.");
76 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
79 zap[
'N'] =
make_field(numberOfTimeslices) = 100;
83 zap[
'C'] =
make_field(selector) =
"", getROOTClassSelection<JDAQTimesliceTypes_t>();
88 if (zap.read(argc, argv) != 0)
91 catch(
const exception& error) {
92 FATAL(error.what() << endl);
100 const int WR = 0x80000000;
107 JBit(i->second).
set(MASK[i->first]);
111 DEBUG(
"Mask " << setw(8) << i->first <<
" 0x" << hex << i->second << dec << endl);
117 load(detectorFile, detector);
119 catch(
const JException& error) {
123 const JDAQHitRouter router(detector);
125 const double TMax_ns = max(binWidth_ns,
getMaximalTime(detector));
129 JBuildL0<hit_type> buildL0;
130 JBuildL1<hit_type> buildL1(TMaxLocal_ns,
true);
135 const Double_t xmin = -(numberOfTimeslices + 1) *
getFrameTime() - 0.5*binWidth_ns;
136 const Double_t xmax = +(numberOfTimeslices + 1) *
getFrameTime() + 0.5*binWidth_ns;
137 const Int_t nx = (Int_t) ((xmax - xmin) / binWidth_ns);
139 JManager_t manager(
new TH1D(
"M_%", NULL, nx, xmin, xmax));
143 JSinglePointer< JTreeScannerInterface<JDAQTimeslice> > ps;
147 if (selector ==
"") {
149 if ((ps =
new JTreeScanner< JAssertConversion<JDAQTimesliceSN, JDAQTimeslice> >(inputFile))->getEntries() != 0 ||
150 (ps =
new JTreeScanner< JAssertConversion<JDAQTimesliceL2, JDAQTimeslice> >(inputFile))->getEntries() != 0 ||
151 (ps =
new JTreeScanner< JAssertConversion<JDAQTimesliceL1, JDAQTimeslice> >(inputFile))->getEntries() != 0 ||
152 (ps =
new JTreeScanner< JAssertConversion<JDAQTimeslice, JDAQTimeslice> >(inputFile))->getEntries() != 0 ||
153 (ps =
new JTreeScanner< JAssertConversion<JDAQTimesliceL0, JDAQTimeslice> >(inputFile))->getEntries() != 0) {
155 FATAL(
"No timeslice data." << endl);
158 NOTICE(
"Selected class " << ps->getClassName() << endl);
164 ps->configure(inputFile);
191 JPMTParametersMap parameters;
198 parameters.load(pmtFile.c_str());
200 catch(
const JException& error) {}
204 for (JTreeScanner<JDAQEvent> in(inputFile.getFilename(), inputFile.getLimit()); in.hasNext(); ) {
206 STATUS(
"event: " << setw(10) << in.getCounter() <<
'\r');
DEBUG(endl);
213 bool test_OOS =
false;
216 t0 +=
getTime(*hit, router.getPMT(*hit));
218 if(std::find(oosDomsId.begin(), oosDomsId.end(), hit->getModuleIdentifier()) != oosDomsId.end()) {
224 if(test_OOS)
continue;
229 buffer[
event->getFrameIndex()].push_back(t0);
236 while (ps->hasNext()) {
238 STATUS(
"event: " << setw(10) << ps->getCounter() <<
'\r');
DEBUG(endl);
242 map_type::const_iterator p = buffer.lower_bound(timeslice->
getFrameIndex() - numberOfTimeslices);
243 map_type::const_iterator q = buffer.upper_bound(timeslice->
getFrameIndex() + numberOfTimeslices);
245 int number_of_events = 0;
247 for (map_type::const_iterator i = p; i != q; ++i) {
248 number_of_events += i->second.size();
251 if (number_of_events == 0) {
255 for (JDAQTimeslice::const_iterator frame = timeslice->begin(); frame != timeslice->end(); ++frame) {
259 if ((frame->getStatus() & ~MASK[frame->getModuleID()] & ~WR) == 0) {
263 buildL1(*frame, router.getModule(frame->getModuleID()), back_inserter(data));
265 TH1D* h1 = manager[frame->getModuleID()];
269 const double t1 = *hit + frame->getFrameIndex() *
getFrameTime();
271 for (map_type::const_iterator i = p; i != q; ++i) {
272 for (map_type::mapped_type::const_iterator j = i->second.begin(); j != i->second.end(); ++j) {
274 const double t0 = *j;
290 Double_t most_OOS_peak = 0;
291 Int_t most_OOS_ID = 0;
293 TF1 f1(
"f1",
"[0]*exp(-0.5*(x-[1])*(x-[1])/([2]*[2])) + [3]");
301 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
305 JManager_t::iterator p = manager.find(module->getID());
307 if (p != manager.end()) {
309 TH1D* h1 = p->second;
311 if (h1->GetEntries() != 0) {
317 Double_t sigma = 250.0;
320 for (
int i = 1; i != h1->GetNbinsX(); ++i) {
322 const Double_t x = h1->GetBinCenter (i);
323 const Double_t y = h1->GetBinContent(i);
333 ymin /= h1->GetNbinsX();
335 f1.SetParameter(0, ymax);
336 f1.SetParameter(1, x0);
337 if (binWidth_ns < sigma)
338 f1.SetParameter(2, sigma);
340 f1.FixParameter(2, binWidth_ns/sqrt(12.0));
341 f1.SetParameter(3, ymin);
345 h1->Fit(&f1, option.c_str(),
"same", x0 - 5 * sigma, x0 + 5 * sigma);
347 status = (fabs(f1.GetParameter(1)) <= 0.5*
getFrameTime() &&
348 f1.GetParameter(0) >= f1.GetParameter(3));
351 if (h1->GetEntries() != 0) {
357 for (Int_t i = 1, ns = -(numberOfTimeslices + 1); i <= h1->GetNbinsX(); ++i) {
359 const Double_t x = h1->GetBinCenter (i);
360 const Double_t y = h1->GetBinContent(i);
362 while (x > (ns + 1) *
getFrameTime() - TMax_ns) { ++ns; }
372 const Double_t noise = bg.getTotal() * i->second.getCount() / bg.getCount();
373 const Double_t P = TMath::PoissonI(i->second.getTotal(), noise);
375 if (P < Pmin && i->second.getTotal() > noise)
381 if (ps.size() != 1) {
382 ERROR(
"Module " << setw(8) << module->getID() <<
" number of peaks " << ps.size() <<
" != 1" << endl);
388 const Double_t noise = bg.getTotal() * i->second.getCount() / bg.getCount();
390 if (ps.size() != 1) {
391 WARNING(
"Peak at " << setw(4) << i->first <<
" [frame time] S/N = "
392 <<
FIXED(7,1) << i->second.getTotal() <<
" / "
393 <<
FIXED(7,1) << noise << endl);
396 subPeaksPerDoms.push_back(module->getID());
397 subPeaksPerDoms.push_back(ps.size());
398 subPeaksPerDoms.push_back(i->first);
399 subPeaksPerDoms.push_back(i->second.getTotal());
400 subPeaksPerDoms.push_back(noise);
401 peaksPerDoms.push_back(subPeaksPerDoms);
408 if ((f1.GetParameter(0) > most_OOS_peak) && std::find(oosDomsId.begin(), oosDomsId.end(), module->getID()) == oosDomsId.end()){
410 most_OOS_peak = f1.GetParameter(0);
411 most_OOS_ID = module->getID();
417 if (most_OOS_ID != 0) {
418 oosDomsId.push_back(most_OOS_ID);
420 NOTICE(
"Module " << most_OOS_ID <<
" set QEs of all PMTs to zero." << endl);
423 parameters[JPMTIdentifier(most_OOS_ID, pmt)].QE = 0.0;
426 peaksPerDoms.clear();
438 if (multiPeaks == 1) {
440 NOTICE(
"Multi-peaks analysis activated" << endl);
445 for(
int i = 0; i != int(peaksPerDoms.size()); i++) {
446 if((std::find(workingDOMs.begin(), workingDOMs.end(), peaksPerDoms[i][0]) == workingDOMs.end()) &&
447 (std::find(oosDomsId.begin(), oosDomsId.end(), peaksPerDoms[i][0]) == oosDomsId.end())) {
448 workingDOMs.push_back(peaksPerDoms[i][0]);
452 for(
int i = 0; i != int(workingDOMs.size()); i++) {
455 double sumAllPeaks = 0.;
457 for(
int j = 0; j != int(peaksPerDoms.size()); j++) {
458 if (peaksPerDoms[j][0] == workingDOMs[i]){
459 if (
int(peaksPerDoms[j][2]) != 0) {
460 ratio += peaksPerDoms[j][3] - peaksPerDoms[j][4];
462 sumAllPeaks += peaksPerDoms[j][3] - peaksPerDoms[j][4];
466 ratio /= sumAllPeaks;
469 NOTICE(
"Module " << workingDOMs[i] <<
" set QEs of all PMTs to zero." << endl);
470 NOTICE(
"----> Ratio = " << 100*ratio <<
"%" << endl);
472 parameters[JPMTIdentifier(workingDOMs[i], pmt)].QE = 0.0;
480 NOTICE(
"Managing non-working DOMs." << endl);
481 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
482 JManager_t::iterator p = manager.find(module->getID());
483 if (p == manager.end()){
484 NOTICE(
"Module " << module->getID() <<
" set QEs of all PMTs to zero." << endl);
486 parameters[JPMTIdentifier(module->getID(), pmt)].QE = 0.0;
491 ofstream out(pmtFile.c_str());
493 parameters.comment.add(
JMeta(argc, argv));
495 out << parameters << endl;
505 ofstream stream(peaks);
507 stream <<
"#DOM NB_PEAKS TIMESLICE_SHIFT SIGNAL NOISE\n";
509 for(
int i = 0; i != int(peaksPerDoms.size()); i++) {
510 for(
int j = 0; j != int(peaksPerDoms[i].size()); j++){
511 if (j == 0 || j == 1 || j == 2 || j == 3) stream << int(peaksPerDoms[i][j]) <<
" " ;
512 else stream << peaksPerDoms[i][j] <<
" " ;
Utility class to parse command line options.
Direct access to PMT data in detector data structure for DAQ hits.
void set(int &mask) const
Set bit in given bit mask.
Auxiliary class to manage set of histograms.
Structure to store the ToT mean and standard deviation of the hits produced by a nanobeacon in a sour...
Empty structure for specification of parser element that is initialised (i.e.
Dynamic ROOT object management.
Auxiliary class for a type holder.
Auxiliary data structure for floating point format specification.
double getTime(const Hit &hit)
Get true time of hit.
Data structure for detector geometry and calibration.
int getFrameIndex() const
Get frame index.
JLimit JLimit_t
Type definition of limit.
Scanning of objects from a single file according a format that follows from the extension of each fil...
I/O formatting auxiliaries.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
double getFrameTime()
Get frame time duration.
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
double getMaximalTime(const JDetector &detector)
Get maximal time between modules in detector following causality.
General purpose messaging.
Auxiliary data structure for single bit.
Utility class to parse command line options.
ROOT TTree parameter settings.
const JLimit & getLimit() const
Get limit.
KM3NeT DAQ constants, bit handling, etc.
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
JTriggerCounter_t next()
Increment trigger counter.
#define DEBUG(A)
Message macros.
int main(int argc, char *argv[])