85{
88
90 JLimit_t& numberOfEvents = inputFile.getLimit();
91 string detectorFileA;
92 string detectorFileB;
97
98 try {
99
100 JParser<> zap(
"Auxiliary program to verify processing of Monte Carlo events.");
101
102 zap[
'f'] =
make_field(inputFile,
"input file (output of detector simulation)");
104 zap[
'a'] =
make_field(detectorFileA,
"detector used for converion from Monte Carlo truth to raw data.");
105 zap[
'b'] =
make_field(detectorFileB,
"detector used for conversion of raw data to calibrated data.") =
"";
110
111 zap(argc, argv);
112 }
113 catch(const exception &error) {
114 FATAL(error.what() << endl);
115 }
116
117
118 if (detectorFileB == "") {
119 detectorFileB = detectorFileA;
120 }
121
122
125
126 try {
127 load(detectorFileA, detectorA);
128 load(detectorFileB, detectorB);
129 }
132 }
133
134 NOTICE(
"Number of modules in detector A <" << detectorFileA <<
">: " << setw(4) << detectorA.size() << endl);
135 NOTICE(
"Number of modules in detector B <" << detectorFileB <<
">: " << setw(4) << detectorB.size() << endl);
136
138
140 FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
141 }
142
143 if (pmtParameters.
getQE() != 1.0) {
144
145 NOTICE(
"Correct background rates with global efficiency " << pmtParameters.
getQE() << endl);
146
148
149 NOTICE(
"Back ground rates: " << rates_Hz << endl);
150 }
151
154
156
157 DEBUG(
"Trigger:" << endl << parameters << endl);
158 DEBUG(
"PMT parameters:" << endl << pmtParameters << endl);
159
161
162 try {
164 }
167 }
168
169
174
176
178
180
182
183 if (!event->mc_hits.empty()) {
185 }
186
187 for (vector<Hit>::const_iterator hit = event->mc_hits.begin(); hit != event->mc_hits.end(); ++hit) {
188
189 if (!pmtRouter.hasPMT(hit->pmt_id)) {
190
192
193 continue;
194 }
195
197
198 if (!moduleRouter.hasModule(pmt.
getID())) {
199
201
202 continue;
203 }
204
205 const double t0 =
getTime(*hit);
206 const double t1 =
putTime(t0, pmtRouter .getPMT(hit->pmt_id));
207 const double t2 =
getTime(t1, moduleRouter.getPMT(pmt));
208
209 if (fabs(t2 - t0) > parameters.TMaxLocal_ns) {
211 }
212
215
219 }
220 }
222
223
224 NOTICE(
"Number of PMTs absent in detector A: " << setw(6) << miss.size() << endl);
225
227 DEBUG(setw(5) << i->first <<
' ' <<
FIXED(8,0) << i->second.getTotal() << endl);
228 }
229
230 NOTICE(
"Number of PMTs absent in detector B: " << setw(6) << lost.size() << endl);
231
233 DEBUG(setw(8) << i->first.getModuleID() <<
"[" << setw(2) << i->first.getPMTAddress() <<
"] " <<
FIXED(8,0) << i->second.getTotal() << endl);
234 }
235
236 NOTICE(
"Number of PMTs with t0 detector A - B > " <<
FIXED(4,1) << parameters.TMaxLocal_ns <<
" [ns]: " << setw(6) << slip.size() << endl);
237
239 DEBUG(setw(8) << i->first.getModuleID() <<
"[" << setw(2) << i->first.getPMTAddress() <<
"] " <<
FIXED(8,0) << i->second.getTotal() << endl);
240 }
241
242
243 NOTICE(
"Number of true photo-electrons, passed threshold and survived QE." << endl);
244
245 tuple_type total;
246
248
249 DEBUG(setw(8) << p->first.getModuleID() <<
"[" << setw(2) << p->first.getPMTAddress() <<
"]");
250
251 for (size_t i = 0; i != p->second.size(); ++i) {
252 DEBUG(
' ' <<
FIXED(8,0) << p->second[i].getTotal());
253 }
255
256 for (size_t i = 0; i != p->second.size(); ++i) {
257 total[i].put(p->second[i].getTotal());
258 }
259 }
260
261 NOTICE(setw(12) <<
"total");
262
263 for (size_t i = 0; i != total.size(); ++i) {
265 }
266
268
270}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Router for direct addressing of module data in detector data structure.
Auxiliary class for map of PMT parameters.
const JPMTParameters & getPMTParameters(const JPMTIdentifier &id) const
Get PMT parameters.
double getQE(const JPMTIdentifier &id) const
Get QE of given PMT.
bool is_valid() const
Check validity of PMT parameters.
Data structure for PMT parameters.
Router for direct addressing of PMT data in detector data structure.
int getID() const
Get identifier.
static void Throw(const bool option)
Enable/disable throw option.
Utility class to parse command line options.
General purpose class for object reading from a list of file names.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event.
double getNPE(const Hit &hit)
Get true charge of hit.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
double getSurvivalProbability(const JPMTParameters ¶meters)
Get model dependent probability that a one photo-electron hit survives the simulation of the PMT assu...
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
double putTime(const T &t1, const JCalibration &cal)
Get de-calibrated time.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
const char * getTime()
Get current local time conform ISO-8601 standard.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Auxiliary data structure for floating point format specification.
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary class for K40 rates.
void correct(const double QE)
Correct rates for global efficiency,.
Auxiliary class for defining the range of iterations of objects.
static counter_type max()
Get maximum counter value.