Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JTimeConverter.cc
Go to the documentation of this file.
1 #include <string>
2 #include <iostream>
3 #include <iomanip>
4 #include <map>
5 #include <set>
6 
10 #include "JDAQ/JDAQEventIO.hh"
11 
12 #include "JAAnet/JAAnetToolkit.hh"
13 
14 #include "JDetector/JDetector.hh"
17 
19 
22 #include "JSupport/JSupport.hh"
23 
24 #include "Jeep/JPrint.hh"
25 #include "Jeep/JParser.hh"
26 #include "Jeep/JMessage.hh"
27 
28 
29 namespace {
30 
31  /**
32  * Count number of coincident hits.
33  *
34  * \param data1 first data set
35  * \param data2 second data set
36  * \param Tmax_ns time window [ns]
37  * \return number of hits
38  */
39  inline int get_count(const std::set<double>& data1,
40  const std::set<double>& data2,
41  const double Tmax_ns)
42  {
43  int number_of_hits = 0;
44 
45  for (std::set<double>::const_iterator p = data1.begin(), q = data2.begin(); ; ++p, ++q) {
46 
47  while (p != data1.end() && q != data2.end() && *p < *q - Tmax_ns) { ++p; }
48  while (p != data1.end() && q != data2.end() && *q < *p - Tmax_ns) { ++q; }
49 
50  if (p == data1.end() || q == data2.end()) {
51  break;
52  }
53 
54  if (fabs(*p - *q) <= Tmax_ns) {
55  ++number_of_hits;
56  }
57  }
58 
59  return number_of_hits;
60  }
61 }
62 
63 
64 /**
65  * \file
66  *
67  * Example program to test conversion between Monte Carlo and DAQ times.
68  * \author mdejong
69  */
70 int main(int argc, char **argv)
71 {
72  using namespace std;
73  using namespace JPP;
74  using namespace KM3NETDAQ;
75 
76  JTriggeredFileScanner<> inputFile;
77  JLimit_t& numberOfEvents = inputFile.getLimit();
78  string detectorFile;
79  double Tmax_ns;
80  int debug;
81 
82  try {
83 
84  JParser<> zap("Example program to test conversion between Monte Carlo and DAQ times.");
85 
86  zap['f'] = make_field(inputFile);
87  zap['a'] = make_field(detectorFile);
88  zap['n'] = make_field(numberOfEvents) = JLimit::max();
89  zap['T'] = make_field(Tmax_ns) = 20.0;
90  zap['d'] = make_field(debug) = 3;
91 
92  zap(argc, argv);
93  }
94  catch(const exception &error) {
95  FATAL(error.what() << endl);
96  }
97 
98 
99  using namespace KM3NETDAQ;
100 
101  cout.tie(&cerr);
102 
103 
105 
106  try {
107  load(detectorFile, detector);
108  }
109  catch(const JException& error) {
110  FATAL(error);
111  }
112 
113  const JModuleRouter router(detector);
114 
115 
116  //typedef JDAQSnapshotHit JHit_t;
117  typedef JDAQTriggeredHit JHit_t;
118 
119  while (inputFile.hasNext()) {
120 
121  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
122 
123  JTriggeredFileScanner<>::multi_pointer_type ps = inputFile.next();
124 
125  const JDAQEvent* tev = ps;
126  const Evt* event = ps;
127 
128  ASSERT(!tev->empty<JHit_t>());
129 
130  const JTimeConverter converter(*event, *tev);
131 
132  typedef map<int, set<double> > map_type;
133 
134  map_type mc;
135  map_type data;
136 
137  for (vector<Hit>::const_iterator i = event->mc_hits.begin(); i != event->mc_hits.end(); ++i) {
138 
139  if (!is_noise(*i)) {
140 
141  DEBUG("Hit (MC): " << setw(5) << i->pmt_id << ' ' << FIXED(6,1) << getTime(*i) << endl);
142 
143  mc[i->pmt_id].insert(getTime(*i));
144  }
145  }
146 
147  for (JDAQEvent::const_iterator<JHit_t> i = tev->begin<JHit_t>(); i != tev->end<JHit_t>(); ++i) {
148 
149  const JModule& module = router.getModule(i->getModuleID());
150  const JPMT& pmt = module.getPMT(i->getPMT());
151 
152  DEBUG("Hit (DAQ): " << setw(5) << pmt.getID() << ' ' << FIXED(6,1) << converter.getTime(*i, pmt) << endl);
153 
154  data[pmt.getID()].insert(converter.getTime(*i, pmt));
155  }
156 
157  int number_of_hits = 0;
158 
159  for (map_type::const_iterator p = mc.begin(), q = data.begin(); ; ++p, ++q) {
160 
161  while (p != mc.end() && q != data.end() && p->first < q->first) { ++p; }
162  while (p != mc.end() && q != data.end() && q->first < p->first) { ++q; }
163 
164  if (p == mc.end() || q == data.end()) {
165  break;
166  }
167 
168  if (p->first == q->first) {
169  number_of_hits += get_count(p->second, q->second, Tmax_ns);
170  }
171  }
172 
173  NOTICE("Number of hits " << setw(5) << number_of_hits << '/' << setw(5) << tev->size<JHit_t>() << endl);
174 
175  ASSERT(number_of_hits != 0);
176  }
177 
178  ASSERT(inputFile.getCounter() != 0);
179 
180  return 0;
181 }
Auxiliary class to set-up Hit.
Definition: JHit_t.hh:25
Utility class to parse command line options.
Definition: JParser.hh:1493
General exception.
Definition: JException.hh:23
ROOT TTree parameter settings.
const JModule & getModule(const JObjectID &id) const
Get module parameters.
Data structure for a composite optical module.
Definition: JModule.hh:50
bool empty() const
Check emptyness of hit container.
Synchronously read DAQ events and Monte Carlo events (and optionally other events).
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:80
Template const_iterator.
Definition: JDAQEvent.hh:68
Router for direct addressing of module data in detector data structure.
Auxiliary class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
double getTime() const
Get DAQ/trigger minus Monte Carlo hit time.
Auxiliary data structure for floating point format specification.
Definition: JPrint.hh:481
double getTime(const Hit &hit)
Get true time of hit.
Data structure for detector geometry and calibration.
unsigned int size() const
Get number of hits.
esac $JPP_DIR examples JDetector JTransitTime o $OUTPUT_FILE n N $NPE T $TTS_NS d $DEBUG for HISTOGRAM in tts tt2 pmt
Definition: JTransitTime.sh:36
bool is_noise(const Hit &hit)
Verify hit origin.
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
const_iterator< T > end() const
Get end of data.
#define ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
I/O formatting auxiliaries.
Detector file.
Definition: JHead.hh:130
const_iterator< T > begin() const
Get begin of data.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1954
int getID() const
Get identifier.
Definition: JObjectID.hh:55
Data structure for PMT geometry and calibration.
Definition: JPMT.hh:47
Definition of hit and track types and auxiliary methods for handling Monte Carlo data.
#define NOTICE(A)
Definition: JMessage.hh:64
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
int debug
debug level
Definition: JSirene.cc:61
const JPMT & getPMT(const int index) const
Get PMT.
Definition: JModule.hh:174
General purpose messaging.
#define FATAL(A)
Definition: JMessage.hh:67
Direct access to module in detector data structure.
Utility class to parse command line options.
Auxiliary class to convert DAQ/trigger hit time to/from Monte Carlo hit time.
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
General purpose class for multiple pointers.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition: Evt.hh:19
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
int main(int argc, char *argv[])
Definition: Main.cpp:15