Jpp  15.0.1-rc.1-highQE
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/JDetectorAddressMapToolkit.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.

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 202 of file JEditPMTParameters.cc.

203 {
204  using namespace std;
205  using namespace JPP;
206 
207  typedef JRange<double> JRange_t;
208 
209  string detectorFile;
210  int detectorID;
212  vector< JModifier<> > hdr;
215  double mu;
216  JRange_t T_ns;
217  string outputFile;
218  int debug;
219 
220  try {
221 
222  JParser<> zap("Auxiliary program to edit PMT parameters map.");
223 
224  zap['a'] = make_field(detectorFile, "detector file.") = "";
225  zap['D'] = make_field(detectorID, "detector identifier (in absence of detector file).") = 0;
226  zap['P'] = make_field(parameters, "PMT simulation data (or corresponding file name)") = JPARSER::initialised();
227  zap['@'] = make_field(hdr, "PMT parameter modifier for default values.") = JPARSER::initialised();
228  zap['A'] = make_field(mod, "PMT parameter modifier by physical address (e.g. B1).") = JPARSER::initialised();
229  zap['M'] = make_field(daq, "PMT parameter modifier by DAQ address (e.g. <module> <channel>.") = JPARSER::initialised();
230  zap['E'] = make_field(mu, "expectation value for npe given two-fold coincidence") = 0.0;
231  zap['T'] = make_field(T_ns, "time-over-threshold range.") = JRange_t();
232  zap['o'] = make_field(outputFile, "output file.");
233  zap['d'] = make_field(debug) = 3;
234 
235  zap(argc, argv);
236  }
237  catch(const exception &error) {
238  FATAL(error.what() << endl);
239  }
240 
241 
242  for (vector< JModifier<> >::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
243 
244  DEBUG("Modifying default PMT parameters " << i->action << ' ' << i->key << ' ' << i->value << endl);
245 
246  if (!i->apply(parameters.getDefaultPMTParameters())) {
247  ERROR("No valid action: " << *i << endl);
248  }
249  }
250 
251  if (detectorFile != "") {
252 
253  // Setting default PMT parameters for given detector.
254 
256 
257  try {
258  load(detectorFile, detector);
259  }
260  catch(const JException& error) {
261  FATAL(error);
262  }
263 
264  if (detectorID == 0) {
265 
266  detectorID = detector.getID();
267 
268  } else if (detectorID != detector.getID()) {
269 
270  FATAL("Inconsistent detector identifier " << detectorID << " != " << detector.getID() << endl);
271  }
272 
273 
274  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
275 
276  for (unsigned int pmt = 0; pmt != module->size(); ++pmt) {
277 
278  const JPMTIdentifier id(module->getID(), pmt);
279 
280  if (parameters.find(id) == parameters.end()) {
281 
282  DEBUG("Setting default parameters for PMT " << id << endl);
283 
284  parameters[id] = parameters.getDefaultPMTParameters();
285  }
286  }
287  }
288  }
289 
290  if (!mod.empty()) {
291 
292  if (!hasDetectorAddressMap(detectorID)) {
293  FATAL("Invalid detector identifier " << detectorID << endl);
294  }
295 
296  const JDetectorAddressMap& demo = getDetectorAddressMap(detectorID);
297 
298  for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ++ps) {
299 
300  const JPMTPhysicalAddress& address = demo.get(ps->first);
301 
302  for (vector< JModifier<JPMTPhysicalAddress> >::const_iterator i = mod.begin(); i != mod.end(); ++i) {
303 
304  if (compare(i->address, address)) {
305 
306  DEBUG("Modifying parameters for PMT " << ps->first << ' ' << i->action << ' ' << i->key << ' ' << i->value << endl);
307 
308  if (!i->apply(ps->second)) {
309  ERROR("No valid action: " << *i << endl);
310  }
311  }
312  }
313  }
314  }
315 
316  if (!daq.empty()) {
317 
318  for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ++ps) {
319 
320  for (vector< JModifier<JPMTIdentifier> >::const_iterator i = daq.begin(); i != daq.end(); ++i) {
321 
322  if (compare(ps->first, i->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 
335  if (mu > 0.0) {
336 
337  DEBUG("Correct measured QE for two-hit probability " << mu << endl);
338 
339  try {
340  parameters.convertHitProbabilityToQE(mu);
341  }
342  catch(const JException& error) {
343  FATAL(error.what());
344  }
345 
346  } else if (mu < 0.0) {
347 
348  FATAL("Invalid expection value for two-hit probability " << mu << endl);
349  }
350 
351 
352  if (T_ns != JRange_t()) {
353 
354  DEBUG("Correct measured QE for time-over-threshold range " << T_ns << endl);
355 
356  const int NPE = 1;
357 
358  for (JPMTParametersMap::iterator i = parameters.begin(); i != parameters.end(); ++i) {
359 
360  const JPMTAnalogueSignalProcessor cpu(i->second);
361 
362  i->second.QE *= (cpu.getIntegralOfChargeProbability(i->second.threshold,
363  cpu.getNPE(T_ns.getUpperLimit(), NPE),
364  NPE)
365  /
366  cpu.getIntegralOfChargeProbability(cpu.getNPE(T_ns.getLowerLimit(), NPE),
367  cpu.getNPE(T_ns.getUpperLimit(), NPE),
368  NPE));
369  }
370  }
371 
372 
373  if (outputFile != "") {
374 
375  parameters.comment.add(JMeta(argc, argv));
376 
377  ofstream out(outputFile.c_str());
378 
379  out << parameters << endl;
380 
381  out.close();
382  }
383 }
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:1500
General exception.
Definition: JException.hh:23
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:66
string outputFile
const JModuleAddressMap & get(const int id) const
Get module address map.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
int getID() const
Get identifier.
Definition: JObjectID.hh:50
#define ERROR(A)
Definition: JMessage.hh:66
Auxiliary class for map of PMT parameters.
int debug
debug level
Definition: JSirene.cc:63
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
#define FATAL(A)
Definition: JMessage.hh:67
virtual const char * what() const override
Get error message.
Definition: JException.hh:48
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
Data structure for PMT physical address.
do set_variable DETECTOR_TXT $WORKDIR detector