Jpp
 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:

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

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.

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

192 {
193  using namespace std;
194  using namespace JPP;
195 
196  typedef JRange<double> JRange_t;
197 
198  string detectorFile;
199  int detectorID;
203  double mu;
204  JRange_t T_ns;
205  string outputFile;
206  int debug;
207 
208  try {
209 
210  JParser<> zap("Auxiliary program to edit PMT parameters map.");
211 
212  zap['a'] = make_field(detectorFile, "detector file.") = "";
213  zap['D'] = make_field(detectorID, "detector identifier (in absence of detector file).") = 0;
214  zap['P'] = make_field(parameters, "PMT simulation data (or corresponding file name)") = JPARSER::initialised();
215  zap['A'] = make_field(mod, "PMT parameter modifier by physical address (e.g. B1).") = JPARSER::initialised();
216  zap['M'] = make_field(daq, "PMT parameter modifier by DAQ address (e.g. <module> <channel>.") = JPARSER::initialised();
217  zap['E'] = make_field(mu, "expectation value for npe given two-fold coincidence") = 0.0;
218  zap['T'] = make_field(T_ns, "time-over-threshold range.") = JRange_t();
219  zap['o'] = make_field(outputFile, "output file.");
220  zap['d'] = make_field(debug) = 3;
221 
222  zap(argc, argv);
223  }
224  catch(const exception &error) {
225  FATAL(error.what() << endl);
226  }
227 
228 
229  if (detectorFile != "") {
230 
231  // Setting default PMT parameters for given detector.
232 
234 
235  try {
236  load(detectorFile, detector);
237  }
238  catch(const JException& error) {
239  FATAL(error);
240  }
241 
242  if (detectorID == 0) {
243 
244  detectorID = detector.getID();
245 
246  } else if (detectorID != detector.getID()) {
247 
248  FATAL("Inconsistent detector identifier " << detectorID << " != " << detector.getID() << endl);
249  }
250 
251 
252  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
253 
254  for (unsigned int pmt = 0; pmt != module->size(); ++pmt) {
255 
256  const JPMTIdentifier id(module->getID(), pmt);
257 
258  if (parameters.find(id) == parameters.end()) {
259 
260  DEBUG("Setting default parameters for PMT " << id << endl);
261 
262  parameters[id] = parameters.getDefaultPMTParameters();
263  }
264  }
265  }
266  }
267 
268  if (!mod.empty()) {
269 
270  if (!hasDetectorAddressMap(detectorID)) {
271  FATAL("Invalid detector identifier " << detectorID << endl);
272  }
273 
274  const JDetectorAddressMap& demo = getDetectorAddressMap(detectorID);
275 
276  for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ++ps) {
277 
278  const JPMTPhysicalAddress& address = demo.get(ps->first);
279 
280  for (vector< JModifier<JPMTPhysicalAddress> >::const_iterator i = mod.begin(); i != mod.end(); ++i) {
281 
282  if (compare(i->address, address)) {
283 
284  DEBUG("Modifying parameters for PMT " << ps->first << ' ' << i->action << ' ' << i->key << ' ' << i->value << endl);
285 
286  if (!i->apply(ps->second)) {
287  ERROR("No valid action: " << *i << endl);
288  }
289  }
290  }
291  }
292  }
293 
294  if (!daq.empty()) {
295 
296  for (JPMTParametersMap::iterator ps = parameters.begin(); ps != parameters.end(); ++ps) {
297 
298  for (vector< JModifier<JPMTIdentifier> >::const_iterator i = daq.begin(); i != daq.end(); ++i) {
299 
300  if (compare(ps->first, i->address)) {
301 
302  DEBUG("Modifying parameters for PMT " << ps->first << ' ' << i->action << ' ' << i->key << ' ' << i->value << endl);
303 
304  if (!i->apply(ps->second)) {
305  ERROR("No valid action: " << *i << endl);
306  }
307  }
308  }
309  }
310  }
311 
312 
313  if (mu > 0.0) {
314 
315  DEBUG("Correct measured QE for two-hit probability " << mu << endl);
316 
317  try {
318  parameters.convertHitProbabilityToQE(mu);
319  }
320  catch(const JException& error) {
321  FATAL(error.what());
322  }
323 
324  } else if (mu < 0.0) {
325 
326  FATAL("Invalid expection value for two-hit probability " << mu << endl);
327  }
328 
329 
330  if (T_ns != JRange_t()) {
331 
332  DEBUG("Correct measured QE for time-over-threshold range " << T_ns << endl);
333 
334  const int NPE = 1;
335 
336  for (JPMTParametersMap::iterator i = parameters.begin(); i != parameters.end(); ++i) {
337 
338  const JPMTAnalogueSignalProcessor cpu(i->second);
339 
340  i->second.QE *= (cpu.getIntegralOfChargeProbability(i->second.threshold,
341  cpu.getNPE(T_ns.getUpperLimit(), NPE),
342  NPE)
343  /
344  cpu.getIntegralOfChargeProbability(cpu.getNPE(T_ns.getLowerLimit(), NPE),
345  cpu.getNPE(T_ns.getUpperLimit(), NPE),
346  NPE));
347  }
348  }
349 
350 
351  if (outputFile != "") {
352 
353  parameters.comment.add(JMeta(argc, argv));
354 
355  ofstream out(outputFile.c_str());
356 
357  out << parameters << endl;
358 
359  out.close();
360  }
361 }
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:80
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.
Data structure for PMT physical address.
do set_variable DETECTOR_TXT $WORKDIR detector
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62