Jpp  18.0.0-rc.4
the software that should make you happy
 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 
12 #include "JDAQ/JDAQEventIO.hh"
13 
14 #include "JAAnet/JAAnetToolkit.hh"
15 
16 #include "JDetector/JDetector.hh"
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 
103 
104  try {
105  load(detectorFile, detector);
106  }
107  catch(const JException& error) {
108  FATAL(error);
109  }
110 
111  const JModuleRouter router(detector);
112 
113 
114  //typedef JDAQSnapshotHit JHit_t;
115  typedef JDAQTriggeredHit JHit_t;
116 
117  while (inputFile.hasNext()) {
118 
119  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
120 
121  JTriggeredFileScanner<>::multi_pointer_type ps = inputFile.next();
122 
123  const JDAQEvent* tev = ps;
124  const Evt* event = ps;
125 
126  ASSERT(!tev->empty<JHit_t>());
127 
128  typedef map<int, set<double> > map_type;
129 
130  map_type mc;
131  map_type data;
132 
133  for (vector<Hit>::const_iterator i = event->mc_hits.begin(); i != event->mc_hits.end(); ++i) {
134 
135  if (!is_noise(*i)) {
136 
137  DEBUG("Hit (MC): " << setw(5) << i->pmt_id << ' ' << FIXED(6,1) << getTime(*i) << endl);
138 
139  mc[i->pmt_id].insert(getTime(*i));
140  }
141  }
142 
143  for (int test : {1, 2} ) {
144 
145  DEBUG("Test "<< test << endl);
146 
147  data.clear();
148 
149  time_converter converter;
150 
151  if (test == 1) {
152 
153  converter = time_converter(*event, *tev);
154 
155  for (JDAQEvent::const_iterator<JHit_t> i = tev->begin<JHit_t>(); i != tev->end<JHit_t>(); ++i) {
156 
157  const JModule& module = router.getModule(i->getModuleID());
158  const JPMT& pmt = module.getPMT(i->getPMT());
159 
160  data[pmt.getID()].insert(converter.getTime(getTime(*i, pmt)));
161  }
162 
163  } else if (test == 2) {
164 
165  Evt evt = *event;
166 
167  read(evt, *tev);
168 
169  converter = time_converter(evt);
170 
171  for (vector<Hit>::const_iterator i = evt.hits.begin(); i != evt.hits.end(); ++i) {
172 
173  if (i->trig != 0) {
174 
175  const JModule& module = router.getModule(i->dom_id);
176  const JPMT& pmt = module.getPMT(i->channel_id);
177 
178  data[pmt.getID()].insert(converter.getTime(getTime(i->tdc, pmt)));
179  //data[pmt.getID()].insert(converter.getTime(getTime(i->tdc, pmt)));
180  }
181  }
182  }
183 
184  for (map_type::const_iterator i = data.begin(); i != data.end(); ++i) {
185  for (set<double>::const_iterator hit = i->second.begin(); hit != i->second.end(); ++hit) {
186  DEBUG("Hit (DAQ): " << setw(5) << i->first << ' ' << FIXED(6,1) << *hit << endl);
187  }
188  }
189 
190  int number_of_hits = 0;
191 
192  for (map_type::const_iterator p = mc.begin(), q = data.begin(); ; ++p, ++q) {
193 
194  while (p != mc.end() && q != data.end() && p->first < q->first) { ++p; }
195  while (p != mc.end() && q != data.end() && q->first < p->first) { ++q; }
196 
197  if (p == mc.end() || q == data.end()) {
198  break;
199  }
200 
201  if (p->first == q->first) {
202  number_of_hits += get_count(p->second, q->second, Tmax_ns);
203  }
204  }
205 
206  NOTICE("Number of hits " << setw(5) << number_of_hits << '/' << setw(5) << tev->size<JHit_t>() << endl);
207 
208  ASSERT(number_of_hits != 0);
209  }
210  }
211 
212  ASSERT(inputFile.getCounter() != 0);
213 
214  return 0;
215 }
Utility class to parse command line options.
Definition: JParser.hh:1514
General exception.
Definition: JException.hh:23
int main(int argc, char *argv[])
Definition: Main.cc:15
ROOT TTree parameter settings of various packages.
const JModule & getModule(const JObjectID &id) const
Get module parameters.
Data structure for a composite optical module.
Definition: JModule.hh:68
std::istream & read(std::istream &in, JTestSummary &summary, const char delimiter= ' ')
Read test summary.
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:89
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)...
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
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.
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:226
const_iterator< T > begin() const
Get begin of data.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
int getID() const
Get identifier.
Definition: JObjectID.hh:50
Data structure for PMT geometry, calibration and status.
Definition: JPMT.hh:43
Definition of hit and track types and auxiliary methods for handling Monte Carlo data.
#define NOTICE(A)
Definition: JMessage.hh:64
const JPMT & getPMT(const int index) const
Get PMT.
Definition: JModule.hh:173
General purpose messaging.
Auxiliary include file for time conversion between DAQ/trigger hit and Monte Carlo hit...
#define FATAL(A)
Definition: JMessage.hh:67
Direct access to module in detector data structure.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Utility class to parse command line options.
Auxiliary class to set-up Hit.
Definition: JSirene.hh:57
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:84
std::vector< Hit > hits
list of hits
Definition: Evt.hh:38
do set_variable DETECTOR_TXT $WORKDIR detector
General purpose class for multiple pointers.
double getTime() const
Get DAQ/trigger time minus Monte Carlo time.
int debug
debug level
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition: Evt.hh:20
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62