Jpp  18.6.0-rc.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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

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;
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 }
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
Utility class to parse command line options.
Definition: JParser.hh:1711
General exception.
Definition: JException.hh:24
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
Detector data structure.
Definition: JDetector.hh:89
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
*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
Lookup table for PMT addresses in detector.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:84
string outputFile
const JModuleAddressMap & get(const int id) const
Get module address map.
Type definition of range.
Definition: JHead.hh:41
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
int getID() const
Get identifier.
Definition: JObjectID.hh:50
#define ERROR(A)
Definition: JMessage.hh:66
Auxiliary class for map of PMT parameters.
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
#define FATAL(A)
Definition: JMessage.hh:67
Auxiliary class to assign a custom value following the reading of a specific textual value...
Definition: JParser.hh:124
virtual const char * what() const override
Get error message.
Definition: JException.hh:64
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Data structure for PMT physical address.
do set_variable DETECTOR_TXT $WORKDIR detector
int debug
debug level
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62