211{
214
216
217 string detectorFile;
218 int detectorID;
227 bool squash;
229
230 try {
231
232 JParser<> zap(
"Auxiliary program to edit PMT parameters map.");
233
234 zap[
'a'] =
make_field(detectorFile,
"detector file.") =
"";
235 zap[
'D'] =
make_field(detectorID,
"detector identifier (in absence of detector file).") = 0;
240 zap[
'E'] =
make_field(mu,
"expectation value for npe given two-fold coincidence (" << mu .getOption() <<
" -> " << mu .getCustom() <<
")") = 0.0;
241 zap[
'T'] =
make_field(T_ns,
"time-over-threshold rang (" << T_ns.getOption() <<
" -> " << T_ns.getCustom() <<
")") =
JRange_t();
244 zap[
'q'] =
make_field(squash,
"squash meta data");
246
247 zap(argc, argv);
248 }
249 catch(const exception &error) {
250 FATAL(error.what() << endl);
251 }
252
253
254 if (squash) {
256 }
257
258 for (
vector< JModifier<> >::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
259
260 DEBUG(
"Modifying default PMT parameters " << i->action <<
' ' << i->key <<
' ' << i->value << endl);
261
263 ERROR(
"No valid action: " << *i << endl);
264 }
265 }
266
267 if (detectorFile != "") {
268
269
270
272
273 try {
275 }
278 }
279
280 if (detectorID == 0) {
281
283
284 }
else if (detectorID !=
detector.getID()) {
285
286 FATAL(
"Inconsistent detector identifier " << detectorID <<
" != " <<
detector.getID() << endl);
287 }
288
289
290 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
291
292 for (unsigned int pmt = 0; pmt != module->size(); ++pmt) {
293
295
296 if (parameters.find(id) == parameters.end()) {
297
298 DEBUG(
"Setting default parameters for PMT " <<
id << endl);
299
301 }
302 }
303 }
304
306
307 for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ) {
308
309 if (router.hasModule(ps->first))
310 ++ps;
311 else
312 ps = parameters.erase(ps);
313 }
314 }
315
316 if (!mod.empty()) {
317
319 FATAL(
"Invalid detector identifier " << detectorID << endl);
320 }
321
323
324 for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ++ps) {
325
327
328 for (
vector< JModifier<JPMTPhysicalAddress> >::const_iterator i = mod.begin(); i != mod.end(); ++i) {
329
330 if (compare(i->address, address)) {
331
332 DEBUG(
"Modifying parameters for PMT " << ps->first <<
' ' << i->action <<
' ' << i->key <<
' ' << i->value << endl);
333
334 if (!i->apply(ps->second)) {
335 ERROR(
"No valid action: " << *i << endl);
336 }
337 }
338 }
339 }
340 }
341
342 if (!daq.empty()) {
343
344 for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ++ps) {
345
346 for (
vector< JModifier<JPMTIdentifier> >::const_iterator i = daq.begin(); i != daq.end(); ++i) {
347
348 if (compare(ps->first, i->address)) {
349
350 DEBUG(
"Modifying parameters for PMT " << ps->first <<
' ' << i->action <<
' ' << i->key <<
' ' << i->value << endl);
351
352 if (!i->apply(ps->second)) {
353 ERROR(
"No valid action: " << *i << endl);
354 }
355 }
356 }
357 }
358 }
359
360 if (mu != parameters.
getMu()) {
361
363
364 if (mu > 0.0) {
365
366 DEBUG(
"Correct measured QE for two-hit probability " << mu << endl);
367
368 try {
370 }
373 }
374
375 } else if (mu < 0.0) {
376
377 FATAL(
"Invalid expection value for two-hit probability " << mu << endl);
378 }
379 } else {
380 DEBUG(
"mu is unchanged" << endl);
381 }
382
383
385
386 DEBUG(
"Correct measured QE for time-over-threshold range " << T_ns << endl);
387
388 const int NPE = 1;
389
390 for (JPMTParametersMap::iterator i = parameters.begin(); i != parameters.end(); ++i) {
391
393
394 i->second.QE *= (cpu.getIntegralOfChargeProbability(i->second.threshold,
395 cpu.getNPE(T_ns.getUpperLimit()),
396 NPE)
397 /
398 cpu.getIntegralOfChargeProbability(cpu.getNPE(T_ns.getLowerLimit()),
399 cpu.getNPE(T_ns.getUpperLimit()),
400 NPE));
401 }
402 }
403
404
406
407 for (JPMTParametersMap::iterator i = parameters.begin(); i != parameters.end(); ++i) {
408 i->second.QE = QE.
constrain(i->second.QE);
409 }
410 }
411
412
414
416
418
419 out << parameters << endl;
420
421 out.close();
422 }
423}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Lookup table for PMT addresses in detector.
const JModuleAddressMap & get(const int id) const
Get module address map.
Router for direct addressing of module data in detector data structure.
Auxiliary class for map of PMT parameters.
double getMu() const
Get expectation value for number of photo-electrons given two-fold (or higher) coincidence rate.
void convertHitProbabilityToQE(const double mu)
Convert the hit probabilities to QEs for given expectation value.
void convertQEToHitProbability()
Convert the QEs to hit probabilities for given expectation value.
const JPMTParameters & getDefaultPMTParameters() const
Get default PMT parameters.
Data structure for PMT physical address.
virtual const char * what() const override
Get error message.
Utility class to parse command line options.
Auxiliary class to assign a custom value following the reading of a specific textual value.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Type definition of range.
PMT analogue signal processor.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...