Jpp  19.1.0-rc.1
the software that should make you happy
Functions
JEditPMTParameters.cc File Reference

Auxiliary program to edit PMT parameters map. More...

#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include "JLang/JLangToolkit.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JPMTParametersMap.hh"
#include "JDetector/JPMTReadoutAddress.hh"
#include "JDetector/JPMTPhysicalAddress.hh"
#include "JDetector/JModuleAddressMap.hh"
#include "JDetector/JDetectorAddressMap.hh"
#include "JDetector/JDetectorSupportkit.hh"
#include "JDetector/JPMTAnalogueSignalProcessor.hh"
#include "JSupport/JMeta.hh"
#include "JTools/JRange.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 edit PMT parameters map.

Syntax:

    -@ "(set|add|sub|mul|div) <key> <value>"
    -A "<PMT physical address> (set|add|sub|mul|div) <key> <value>"
    -M "<PMT identifier>       (set|add|sub|mul|div) <key> <value>"

In this, the PMT physical address corresponds to the data structure JDETECTOR::JPMTPhysicalAddress and the PMT identifier to JDETECTOR::JPMTIdentifier.
The key corresponds to one of the data members of the JDETECTOR::JPMTParameters data structure.
The option -@ corresponds to the default PMT values.

Note that in the absence of option -a, the detector identifier should be specified using option -D so to obtain the correct PMT address mapping.

The default value for option -E (expectation value for npe given two-fold coincidence) is taken from Analysis e-log entry 519.
The (default) values for option -T (time-over-threshold range) should correspond to the minimal and maximal value at option -t of application JCalibrateK40.cc.
The values for option -Q (QE range) can be used to take into account the light scaling factor applied in the simulation of the detector response.

Multiple options -@, -A and -M will be processed in order of appearance.

Author
mdejong

Definition in file JEditPMTParameters.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 209 of file JEditPMTParameters.cc.

210 {
211  using namespace std;
212  using namespace JPP;
213 
214  typedef JRange<double> JRange_t;
215 
216  string detectorFile;
217  int detectorID;
218  JPMTParametersMap parameters;
219  vector< JModifier<> > hdr;
222  JProxy<double> mu ("?", 2.05644e-01);
223  JProxy<JRange_t> T_ns("?", JRange_t(4, 250));
224  JRange_t QE;
225  string outputFile;
226  bool squash;
227  int debug;
228 
229  try {
230 
231  JParser<> zap("Auxiliary program to edit PMT parameters map.");
232 
233  zap['a'] = make_field(detectorFile, "detector file.") = "";
234  zap['D'] = make_field(detectorID, "detector identifier (in absence of detector file).") = 0;
235  zap['P'] = make_field(parameters, "PMT simulation data (or corresponding file name)") = JPARSER::initialised();
236  zap['@'] = make_field(hdr, "PMT parameter modifier for default values.") = JPARSER::initialised();
237  zap['A'] = make_field(mod, "PMT parameter modifier by physical address (e.g. B1).") = JPARSER::initialised();
238  zap['M'] = make_field(daq, "PMT parameter modifier by DAQ address (e.g. <module> <channel>.") = JPARSER::initialised();
239  zap['E'] = make_field(mu, "expectation value for npe given two-fold coincidence (" << mu .getOption() << " -> " << mu .getCustom() << ")") = 0.0;
240  zap['T'] = make_field(T_ns, "time-over-threshold rang (" << T_ns.getOption() << " -> " << T_ns.getCustom() << ")") = JRange_t();
241  zap['Q'] = make_field(QE, "QE range.") = JRange_t();
242  zap['o'] = make_field(outputFile, "output file.");
243  zap['q'] = make_field(squash, "squash meta data");
244  zap['d'] = make_field(debug, "debug level") = 2;
245 
246  zap(argc, argv);
247  }
248  catch(const exception &error) {
249  FATAL(error.what() << endl);
250  }
251 
252 
253  if (squash) {
254  parameters.comment.clear();
255  }
256 
257  parameters.comment.add(JMeta(argc,argv));
258 
259 
260  for (vector< JModifier<> >::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
261 
262  DEBUG("Modifying default PMT parameters " << i->action << ' ' << i->key << ' ' << i->value << endl);
263 
264  if (!i->apply(parameters.getDefaultPMTParameters())) {
265  ERROR("No valid action: " << *i << endl);
266  }
267  }
268 
269  if (detectorFile != "") {
270 
271  // Setting default PMT parameters for given detector.
272 
274 
275  try {
276  load(detectorFile, detector);
277  }
278  catch(const JException& error) {
279  FATAL(error);
280  }
281 
282  if (detectorID == 0) {
283 
284  detectorID = detector.getID();
285 
286  } else if (detectorID != detector.getID()) {
287 
288  FATAL("Inconsistent detector identifier " << detectorID << " != " << detector.getID() << endl);
289  }
290 
291 
292  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
293 
294  for (unsigned int pmt = 0; pmt != module->size(); ++pmt) {
295 
296  const JPMTIdentifier id(module->getID(), pmt);
297 
298  if (parameters.find(id) == parameters.end()) {
299 
300  DEBUG("Setting default parameters for PMT " << id << endl);
301 
302  parameters[id] = parameters.getDefaultPMTParameters();
303  }
304  }
305  }
306  }
307 
308  if (!mod.empty()) {
309 
310  if (!hasDetectorAddressMap(detectorID)) {
311  FATAL("Invalid detector identifier " << detectorID << endl);
312  }
313 
314  const JDetectorAddressMap& demo = getDetectorAddressMap(detectorID);
315 
316  for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ++ps) {
317 
318  const JPMTPhysicalAddress& address = demo.get(ps->first);
319 
320  for (vector< JModifier<JPMTPhysicalAddress> >::const_iterator i = mod.begin(); i != mod.end(); ++i) {
321 
322  if (compare(i->address, address)) {
323 
324  DEBUG("Modifying parameters for PMT " << ps->first << ' ' << i->action << ' ' << i->key << ' ' << i->value << endl);
325 
326  if (!i->apply(ps->second)) {
327  ERROR("No valid action: " << *i << endl);
328  }
329  }
330  }
331  }
332  }
333 
334  if (!daq.empty()) {
335 
336  for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ++ps) {
337 
338  for (vector< JModifier<JPMTIdentifier> >::const_iterator i = daq.begin(); i != daq.end(); ++i) {
339 
340  if (compare(ps->first, i->address)) {
341 
342  DEBUG("Modifying parameters for PMT " << ps->first << ' ' << i->action << ' ' << i->key << ' ' << i->value << endl);
343 
344  if (!i->apply(ps->second)) {
345  ERROR("No valid action: " << *i << endl);
346  }
347  }
348  }
349  }
350  }
351 
352 
353  if (mu > 0.0) {
354 
355  DEBUG("Correct measured QE for two-hit probability " << mu << endl);
356 
357  try {
358  parameters.convertHitProbabilityToQE(mu);
359  }
360  catch(const JException& error) {
361  FATAL(error.what());
362  }
363 
364  } else if (mu < 0.0) {
365 
366  FATAL("Invalid expection value for two-hit probability " << mu << endl);
367  }
368 
369 
370  if (T_ns != JRange_t()) {
371 
372  DEBUG("Correct measured QE for time-over-threshold range " << T_ns << endl);
373 
374  const int NPE = 1;
375 
376  for (JPMTParametersMap::iterator i = parameters.begin(); i != parameters.end(); ++i) {
377 
378  const JPMTAnalogueSignalProcessor cpu(i->second);
379 
380  i->second.QE *= (cpu.getIntegralOfChargeProbability(i->second.threshold,
381  cpu.getNPE(T_ns.getUpperLimit()),
382  NPE)
383  /
384  cpu.getIntegralOfChargeProbability(cpu.getNPE(T_ns.getLowerLimit()),
385  cpu.getNPE(T_ns.getUpperLimit()),
386  NPE));
387  }
388  }
389 
390 
391  if (QE != JRange_t()) {
392 
393  for (JPMTParametersMap::iterator i = parameters.begin(); i != parameters.end(); ++i) {
394  i->second.QE = QE.constrain(i->second.QE);
395  }
396  }
397 
398 
399  if (outputFile != "") {
400 
401  parameters.comment.add(JMeta(argc, argv));
402 
403  ofstream out(outputFile.c_str());
404 
405  out << parameters << endl;
406 
407  out.close();
408  }
409 }
string outputFile
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define ERROR(A)
Definition: JMessage.hh:66
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
Lookup table for PMT addresses in detector.
const JModuleAddressMap & get(const int id) const
Get module address map.
Detector data structure.
Definition: JDetector.hh:96
Auxiliary class for map of PMT parameters.
const JPMTParameters & getDefaultPMTParameters() const
Get default PMT parameters.
void convertHitProbabilityToQE(const double mu)
Convert the hit probabilities to QEs for given expectation value.
Data structure for PMT physical address.
General exception.
Definition: JException.hh:24
virtual const char * what() const override
Get error message.
Definition: JException.hh:64
Utility class to parse command line options.
Definition: JParser.hh:1714
Auxiliary class to assign a custom value following the reading of a specific textual value.
Definition: JParser.hh:124
T constrain(argument_type x) const
Constrain value to range.
Definition: JRange.hh:350
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
JParserTemplateElement< JType_t > getOption(JType_t &object, const std::string &name, const std::string &help="")
Auxiliary method for creation of template parser element object.
Definition: JParser.hh:2093
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JSTDTypes.hh:14
Type definition of range.
Definition: JHead.hh:43
Detector file.
Definition: JHead.hh:227
JComment & add(const std::string &comment)
Add comment.
Definition: JComment.hh:100
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:84
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:72