Jpp test-rotations-new
the software that should make you happy
Loading...
Searching...
No Matches
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;
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 FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
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.
void convertHitProbabilityToQE(const double mu)
Convert the hit probabilities to QEs for given expectation value.
const JPMTParameters & getDefaultPMTParameters() const
Get default PMT parameters.
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:1698
Auxiliary class to assign a custom value following the reading of a specific textual value.
Definition JParser.hh:108
Range of values.
Definition JRange.hh:42
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.
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.
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:68
Auxiliary class for ROOT I/O of application specific meta data.
Definition JMeta.hh:72