Jpp  18.0.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JTriggerTester.cc File Reference

Auxiliary program to verify processing of Monte Carlo events. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <utility>
#include "km3net-dataformat/offline/Head.hh"
#include "km3net-dataformat/offline/Evt.hh"
#include "km3net-dataformat/offline/Hit.hh"
#include "JAAnet/JHead.hh"
#include "JAAnet/JHeadToolkit.hh"
#include "JAAnet/JAAnetToolkit.hh"
#include "JPhysics/JK40Rates.hh"
#include "km3net-dataformat/online/JDAQ.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JPMTRouter.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JPMTParametersMap.hh"
#include "JDetector/JPMTParametersToolkit.hh"
#include "JTrigger/JTriggerParameters.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JMonteCarloFileSupportkit.hh"
#include "JSupport/JSupport.hh"
#include "JTools/JHashMap.hh"
#include "JTools/JWeight.hh"
#include "JTools/JQuantile.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to verify processing of Monte Carlo events.

Note that the available options are identical to those of JTriggerEfficiency.cc.

Author
mdejong

Definition in file JTriggerTester.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 84 of file JTriggerTester.cc.

85 {
86  using namespace std;
87  using namespace JPP;
88 
89  JMultipleFileScanner<Evt> inputFile;
90  JLimit_t& numberOfEvents = inputFile.getLimit();
91  string detectorFileA;
92  string detectorFileB;
94  JPMTParametersMap pmtParameters;
95  JK40Rates rates_Hz;
96  int debug;
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)");
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.") = "";
106  zap['@'] = make_field(parameters, "Trigger parameters (or corresponding file name)") = JPARSER::initialised();
107  zap['P'] = make_field(pmtParameters, "PMT simulation data (or corresponding file name)") = JPARSER::initialised();
108  zap['B'] = make_field(rates_Hz, "background rates [Hz]") = JPARSER::initialised();
109  zap['d'] = make_field(debug, "debug") = 2;
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 
123  JDetector detectorA;
124  JDetector detectorB;
125 
126  try {
127  load(detectorFileA, detectorA);
128  load(detectorFileB, detectorB);
129  }
130  catch(const JException& error) {
131  FATAL(error);
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 
137  JPMTParametersMap::Throw(true);
138 
139  if (!pmtParameters.is_valid()) {
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 
147  rates_Hz.correct(pmtParameters.getQE());
148 
149  NOTICE("Back ground rates: " << rates_Hz << endl);
150  }
151 
152  const JPMTRouter pmtRouter (detectorA);
153  const JModuleRouter moduleRouter(detectorB);
154 
155  parameters.set(getMaximalDistance(detectorB));
156 
157  DEBUG("Trigger:" << endl << parameters << endl);
158  DEBUG("PMT parameters:" << endl << pmtParameters << endl);
159 
160  Head header;
161 
162  try {
163  header = getHeader(inputFile);
164  }
165  catch(const JException& error) {
166  FATAL(error);
167  }
168 
169  const JPosition3D center = get<JPosition3D>(header);
170 
171  NOTICE("Apply detector offset from Monte Carlo run header (" << center << ")" << endl);
172 
173  detectorA -= center;
174  detectorB -= center;
175 
180 
181  JQuantile QT;
182 
183  while (inputFile.hasNext()) {
184 
185  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r');
186 
187  Evt* event = inputFile.next();
188 
189  if (!event->mc_hits.empty()) {
190  QT.put(getTimeRange(*event).getLength());
191  }
192 
193  for (vector<Hit>::const_iterator hit = event->mc_hits.begin(); hit != event->mc_hits.end(); ++hit) {
194 
195  if (!pmtRouter.hasPMT(hit->pmt_id)) {
196 
197  miss[hit->pmt_id].put(getNPE(*hit));
198 
199  continue;
200  }
201 
202  const JPMTIdentifier pmt = pmtRouter.getIdentifier(hit->pmt_id);
203 
204  if (!moduleRouter.hasModule(pmt.getID())) {
205 
206  lost[pmt].put(getNPE(*hit));
207 
208  continue;
209  }
210 
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));
214 
215  if (fabs(t2 - t0) > parameters.TMaxLocal_ns) {
216  slip[pmt].put(getNPE(*hit));
217  }
218 
219  const JPMTParameters data = pmtParameters.getPMTParameters(pmt);
220  const double P = getSurvivalProbability(data);
221 
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);
225  }
226  }
227  STATUS(endl);
228 
229 
230  NOTICE("Number of PMTs absent in detector A: " << setw(6) << miss.size() << endl);
231 
232  for (JHashMap<int, JWeight>::const_iterator i = miss.begin(); i != miss.end(); ++i) {
233  DEBUG(setw(5) << i->first << ' ' << FIXED(8,0) << i->second.getTotal() << endl);
234  }
235 
236  NOTICE("Number of PMTs absent in detector B: " << setw(6) << lost.size() << endl);
237 
238  for (JHashMap<JPMTIdentifier, JWeight>::const_iterator i = lost.begin(); i != lost.end(); ++i) {
239  DEBUG(setw(8) << i->first.getModuleID() << "[" << setw(2) << i->first.getPMTAddress() << "] " << FIXED(8,0) << i->second.getTotal() << endl);
240  }
241 
242  NOTICE("Number of PMTs with t0 detector A - B > " << FIXED(4,1) << parameters.TMaxLocal_ns << " [ns]: " << setw(6) << slip.size() << endl);
243 
244  for (JHashMap<JPMTIdentifier, JWeight>::const_iterator i = slip.begin(); i != slip.end(); ++i) {
245  DEBUG(setw(8) << i->first.getModuleID() << "[" << setw(2) << i->first.getPMTAddress() << "] " << FIXED(8,0) << i->second.getTotal() << endl);
246  }
247 
248 
249  NOTICE("Number of true photo-electrons, passed threshold and survived QE." << endl);
250 
251  tuple_type total;
252 
253  for (JHashMap<JPMTIdentifier, tuple_type>::const_iterator p = npe.begin(); p != npe.end(); ++p) {
254 
255  DEBUG(setw(8) << p->first.getModuleID() << "[" << setw(2) << p->first.getPMTAddress() << "]");
256 
257  for (size_t i = 0; i != p->second.size(); ++i) {
258  DEBUG(' ' << FIXED(8,0) << p->second[i].getTotal());
259  }
260  DEBUG(endl);
261 
262  for (size_t i = 0; i != p->second.size(); ++i) {
263  total[i].put(p->second[i].getTotal());
264  }
265  }
266 
267  NOTICE(setw(12) << "total");
268 
269  for (size_t i = 0; i != total.size(); ++i) {
270  NOTICE(' ' << FIXED(8,0) << total[i].getTotal());
271  }
272 
273  NOTICE(endl);
274 
275  NOTICE("Time range of hits [ns]: " << QT.getXmin() << " - " << QT.getXmax() << endl);
276 }
Router for direct addressing of PMT data in detector data structure.
Definition: JPMTRouter.hh:35
Utility class to parse command line options.
Definition: JParser.hh:1514
General exception.
Definition: JException.hh:23
General purpose class for hash map of unique keys.
Definition: JHashMap.hh:72
Auxiliary data structure for running average, standard deviation and quantiles.
Definition: JQuantile.hh:43
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:89
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
Definition: diff-Tuna.sh:38
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:83
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
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.
Definition: JLimit.hh:41
double putTime(const T &t1, const JCalibration &cal)
Get de-calibrated time.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
int getID() const
Get identifier.
Definition: JObjectID.hh:50
#define NOTICE(A)
Definition: JMessage.hh:64
Auxiliary class for map of PMT parameters.
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Definition: Head.hh:65
#define FATAL(A)
Definition: JMessage.hh:67
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 &parameters)
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.
Definition: JPosition3D.hh:36
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:84
container_type::const_iterator const_iterator
Definition: JHashMap.hh:86
Data structure for PMT parameters.
double QE
relative quantum efficiency
int debug
debug level
Auxiliary class for K40 rates.
Definition: JK40Rates.hh:41
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition: Evt.hh:20
then $DIR JPlotNPE PDG P
Definition: JPlotNPE-PDG.sh:62
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62