100 JParser<> zap(
"Auxiliary program to verify processing of Monte Carlo events.");
102 zap[
'f'] =
make_field(inputFile,
"input file (output of detector simulation)");
103 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
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.") =
"";
113 catch(
const exception &error) {
114 FATAL(error.what() << endl);
118 if (detectorFileB ==
"") {
119 detectorFileB = detectorFileA;
127 load(detectorFileA, detectorA);
128 load(detectorFileB, detectorB);
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);
137 JPMTParametersMap::Throw(
true);
139 if (!pmtParameters.is_valid()) {
140 FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
143 if (pmtParameters.getQE() != 1.0) {
145 NOTICE(
"Correct background rates with global efficiency " << pmtParameters.getQE() << endl);
147 rates_Hz.correct(pmtParameters.getQE());
149 NOTICE(
"Back ground rates: " << rates_Hz << endl);
158 DEBUG(
"PMT parameters:" << endl << pmtParameters << endl);
169 const JPosition3D center = get<JPosition3D>(header);
171 NOTICE(
"Apply detector offset from Monte Carlo run header (" << center <<
")" << endl);
183 while (inputFile.hasNext()) {
185 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
187 Evt*
event = inputFile.next();
189 if (!event->mc_hits.empty()) {
195 if (!pmtRouter.hasPMT(hit->pmt_id)) {
197 miss[hit->pmt_id].put(
getNPE(*hit));
204 if (!moduleRouter.hasModule(pmt.
getID())) {
206 lost[pmt].put(
getNPE(*hit));
211 const double t0 =
getTime(*hit);
212 const double t1 =
putTime(t0, pmtRouter .getPMT(hit->pmt_id));
213 const double t2 =
getTime(t1, moduleRouter.getPMT(pmt));
215 if (fabs(t2 - t0) >
parameters.TMaxLocal_ns) {
216 slip[pmt].put(
getNPE(*hit));
222 npe[pmt][0].put(
getNPE(*hit));
223 npe[pmt][1].put(
getNPE(*hit) * P);
224 npe[pmt][2].put(
getNPE(*hit) * P * data.
QE);
230 NOTICE(
"Number of PMTs absent in detector A: " << setw(6) << miss.size() << endl);
233 DEBUG(setw(5) <<
i->first <<
' ' <<
FIXED(8,0) <<
i->second.getTotal() << endl);
236 NOTICE(
"Number of PMTs absent in detector B: " << setw(6) << lost.size() << endl);
239 DEBUG(setw(8) <<
i->first.getModuleID() <<
"[" << setw(2) <<
i->first.getPMTAddress() <<
"] " <<
FIXED(8,0) <<
i->second.getTotal() << endl);
242 NOTICE(
"Number of PMTs with t0 detector A - B > " <<
FIXED(4,1) <<
parameters.TMaxLocal_ns <<
" [ns]: " << setw(6) << slip.size() << endl);
245 DEBUG(setw(8) <<
i->first.getModuleID() <<
"[" << setw(2) <<
i->first.getPMTAddress() <<
"] " <<
FIXED(8,0) <<
i->second.getTotal() << endl);
249 NOTICE(
"Number of true photo-electrons, passed threshold and survived QE." << endl);
255 DEBUG(setw(8) << p->first.getModuleID() <<
"[" << setw(2) << p->first.getPMTAddress() <<
"]");
257 for (
size_t i = 0;
i != p->second.size(); ++
i) {
258 DEBUG(
' ' <<
FIXED(8,0) << p->second[
i].getTotal());
262 for (
size_t i = 0;
i != p->second.size(); ++
i) {
263 total[
i].put(p->second[
i].getTotal());
267 NOTICE(setw(12) <<
"total");
269 for (
size_t i = 0;
i != total.size(); ++
i) {
275 NOTICE(
"Time range of hits [ns]: " << QT.getXmin() <<
" - " << QT.getXmax() << endl);
Router for direct addressing of PMT data in detector data structure.
Utility class to parse command line options.
Router for direct addressing of module data in detector data structure.
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure for floating point format specification.
double getTime(const Hit &hit)
Get true time of hit.
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
Auxiliary class for defining the range of iterations of objects.
double putTime(const T &t1, const JCalibration &cal)
Get de-calibrated time.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
int getID() const
Get identifier.
Auxiliary class for map of PMT parameters.
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Auxiliary data structure for average.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
General purpose class for object reading from a list of file names.
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 getNPE(const Hit &hit)
Get true charge of hit.
Data structure for position in three dimensions.
const JLimit & getLimit() const
Get limit.
Data structure for PMT parameters.
double QE
relative quantum efficiency
Auxiliary class for K40 rates.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
#define DEBUG(A)
Message macros.