Jpp  17.1.1
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  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  typedef map<int, set<double> > map_type;
131 
132  map_type mc;
133  map_type data;
134 
135  for (vector<Hit>::const_iterator i = event->mc_hits.begin(); i != event->mc_hits.end(); ++i) {
136 
137  if (!is_noise(*i)) {
138 
139  DEBUG("Hit (MC): " << setw(5) << i->pmt_id << ' ' << FIXED(6,1) << getTime(*i) << endl);
140 
141  mc[i->pmt_id].insert(getTime(*i));
142  }
143  }
144 
145  for (int test : {1, 2} ) {
146 
147  DEBUG("Test "<< test << endl);
148 
149  data.clear();
150 
151  time_converter converter;
152 
153  if (test == 1) {
154 
155  converter = time_converter(*event, *tev);
156 
157  for (JDAQEvent::const_iterator<JHit_t> i = tev->begin<JHit_t>(); i != tev->end<JHit_t>(); ++i) {
158 
159  const JModule& module = router.getModule(i->getModuleID());
160  const JPMT& pmt = module.getPMT(i->getPMT());
161 
162  data[pmt.getID()].insert(converter.getTime(getTime(*i, pmt)));
163  }
164 
165  } else if (test == 2) {
166 
167  Evt evt = *event;
168 
169  read(evt, *tev);
170 
171  converter = time_converter(evt);
172 
173  for (vector<Hit>::const_iterator i = evt.hits.begin(); i != evt.hits.end(); ++i) {
174 
175  if (i->trig != 0) {
176 
177  const JModule& module = router.getModule(i->dom_id);
178  const JPMT& pmt = module.getPMT(i->channel_id);
179 
180  data[pmt.getID()].insert(converter.getTime(getTime(i->tdc, pmt)));
181  //data[pmt.getID()].insert(converter.getTime(getTime(i->tdc, pmt)));
182  }
183  }
184  }
185 
186  for (map_type::const_iterator i = data.begin(); i != data.end(); ++i) {
187  for (set<double>::const_iterator hit = i->second.begin(); hit != i->second.end(); ++hit) {
188  DEBUG("Hit (DAQ): " << setw(5) << i->first << ' ' << FIXED(6,1) << *hit << endl);
189  }
190  }
191 
192  int number_of_hits = 0;
193 
194  for (map_type::const_iterator p = mc.begin(), q = data.begin(); ; ++p, ++q) {
195 
196  while (p != mc.end() && q != data.end() && p->first < q->first) { ++p; }
197  while (p != mc.end() && q != data.end() && q->first < p->first) { ++q; }
198 
199  if (p == mc.end() || q == data.end()) {
200  break;
201  }
202 
203  if (p->first == q->first) {
204  number_of_hits += get_count(p->second, q->second, Tmax_ns);
205  }
206  }
207 
208  NOTICE("Number of hits " << setw(5) << number_of_hits << '/' << setw(5) << tev->size<JHit_t>() << endl);
209 
210  ASSERT(number_of_hits != 0);
211  }
212  }
213 
214  ASSERT(inputFile.getCounter() != 0);
215 
216  return 0;
217 }
Utility class to parse command line options.
Definition: JParser.hh:1517
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:1993
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:55
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
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