Jpp
JEditDetector.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <sstream>
3 #include <string>
4 #include <vector>
5 
6 #include "TRandom3.h"
7 
8 #include "JDetector/JDetector.hh"
13 #include "JGeometry3D/JVector3D.hh"
14 #include "JTools/JConstants.hh"
15 #include "JTools/JRange.hh"
16 #include "JLang/JException.hh"
17 #include "JSupport/JMeta.hh"
18 
19 #include "Jeep/JeepToolkit.hh"
20 #include "Jeep/JPrint.hh"
21 #include "Jeep/JParser.hh"
22 #include "Jeep/JMessage.hh"
23 
24 
25 namespace {
26 
27  using namespace JPP;
28 
29  static const std::string reset_t = "reset"; //!< Reset time offset, position and orientation or PMT status bit
30  static const std::string set_t = "set"; //!< Set time offset or position or PMT status bit
31  static const std::string add_t = "add"; //!< Add time offset or position
32  static const std::string sub_t = "sub"; //!< Subtract time offset or position
33  static const std::string rot_t = "rot"; //!< Rotate around z-axis by value [rad]
34  static const std::string mul_t = "mul"; //!< Multiply z-position by (1 + value)
35  static const std::string via_t = "via"; //!< Apply time offset by (floor * value)
36 
37  static const std::string rand_t = "rand"; //!< Random value(s)
38  static const std::string randset_t = rand_t + set_t; //!< Set time offset or position
39  static const std::string randadd_t = rand_t + add_t; //!< Add time offset or position
40  static const std::string randsub_t = rand_t + sub_t; //!< Subtract time offset or position
41  static const std::string randrot_t = rand_t + rot_t; //!< Rotate around z-axis by value [rad]
42  static const std::string randmul_t = rand_t + mul_t; //!< Multiply z-position by (1 + value)
43  static const std::string randvia_t = rand_t + via_t; //!< Apply time offset by (floor * value)
44 
45 
46  /**
47  * Auxiliary class to apply detector modifications.
48  *
49  * Note that the internal identifier may apply to a module as well as a string.
50  */
51  class JModifier {
52  public:
53  /**
54  * Wild card for module and string identifier.
55  */
56  static const int WILD_CARD = -1;
57 
58 
59  /**
60  * Default constructor.
61  */
62  JModifier()
63  {}
64 
65 
66  /**
67  * Check validity.
68  *
69  * \return true if valid modifier; else false
70  */
71  bool is_valid() const
72  {
73  return (action != "" && !data.empty());
74  }
75 
76 
77  /**
78  * Apply modification to given module.
79  *
80  * \param module module
81  * \return true if valid action; else false
82  */
83  bool apply(JModule& module) const
84  {
85  switch (data.size()) {
86 
87  case 0:
88  return apply(module, action); // reset calibration
89 
90  case 1:
91  return apply(module, action, data[0]); // time/position/orientation calibration
92 
93  case 2:
94  return apply(module, action, JVector3D(data[0], data[1], 0.0)); // 2D position calibration
95 
96  case 3:
97  return apply(module, action, JVector3D(data[0], data[1], data[2])); // 3D position calibration
98 
99  default:
100  return false;
101  }
102  }
103 
104 
105  /**
106  * Read modifier from input.
107  *
108  * \param in input stream
109  * \param modifier modifier
110  * \return input stream
111  */
112  friend inline std::istream& operator>>(std::istream& in, JModifier& modifier)
113  {
114  using namespace std;
115 
116  if (in >> modifier.id >> modifier.action) {
117 
118  modifier.data.clear();
119 
120  for (double x; in >> x; ) {
121  modifier.data.push_back(x);
122  }
123 
124  in.clear(ios_base::eofbit);
125  }
126 
127  return in;
128  }
129 
130 
131  /**
132  * Write modifier to output.
133  *
134  * \param out output stream
135  * \param modifier modifier
136  * \return output stream
137  */
138  friend inline std::ostream& operator<<(std::ostream& out, const JModifier& modifier)
139  {
140  out << modifier.id;
141  out << ' ';
142  out << modifier.action;
143 
144  for (std::vector<double>::const_iterator i = modifier.data.begin(); i != modifier.data.end(); ++i) {
145  out << ' ' << *i;
146  }
147 
148  return out;
149  }
150 
151 
152  int id;
153  std::string action;
154  std::vector<double> data;
155 
156  private:
157 
158  /**
159  * Apply time/orientation calibration to given module.
160  *
161  * \param module module
162  * \param action action
163  * \return true if valid action; else false
164  */
165  static bool apply(JModule& module, const std::string& action)
166  {
167  if (action == reset_t) {
168 
170 
171  for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
172  pmt->setCalibration(JCalibration());
173  }
174 
175  } else {
176 
177  return false;
178  }
179 
180  return true;
181  }
182 
183 
184  /**
185  * Apply time/position/orientation calibration to given module.
186  *
187  * \param module module
188  * \param action action
189  * \param value value
190  * \return true if valid action; else false
191  */
192  static bool apply(JModule& module, const std::string& action, const double value)
193  {
194  if (action == set_t) { // actions with fixed values
195 
196  module.set(value);
197 
198  } else if (action == add_t) {
199 
200  module.add(value);
201 
202  } else if (action == sub_t) {
203 
204  module.sub(value);
205 
206  } else if (action == rot_t) {
207 
208  const JVector3D center = module.getPosition();
209 
210  module.sub(center);
211 
212  module.rotate(JRotation3Z(value));
213 
214  module.add(center);
215 
216  } else if (action == mul_t) {
217 
218  const JVector3D center(module.getPosition().getX(),
219  module.getPosition().getY(),
220  module.getPosition().getZ() * (1.0 + value));
221 
222  module.set(center);
223 
224  } else if (action == via_t) {
225 
226  module.add(value * module.getFloor());
227 
228  } else if (action == randadd_t) { // actions with random values
229 
230  module.add(gRandom->Gaus(0.0, value));
231 
232  } else if (action == randsub_t) {
233 
234  module.sub(gRandom->Gaus(0.0, value));
235 
236  } else if (action == randrot_t){
237 
238  const JVector3D center = module.getPosition();
239 
240  module.sub(center);
241 
242  module.rotate(JRotation3Z(gRandom->Gaus(0.0, value)));
243 
244  module.add(center);
245 
246  } else if (action == randmul_t) {
247 
248  const JVector3D center(module.getPosition().getX(),
249  module.getPosition().getY(),
250  module.getPosition().getZ() * gRandom->Gaus(1.0, value));
251 
252  module.set(center);
253 
254  } else if (action == randvia_t) {
255 
256  module.add(gRandom->Gaus(0.0, value) * module.getFloor());
257 
258  } else {
259 
260  return false;
261  }
262 
263  return true;
264  }
265 
266 
267  /**
268  * Apply position calibration to given module.
269  *
270  * \param module module
271  * \param action action
272  * \param pos pos
273  * \return true if valid action; else false
274  */
275  static bool apply(JModule& module, const std::string& action, const JVector3D& pos)
276  {
277  const JVector3D randpos(gRandom->Gaus(0.0, pos.getX()),
278  gRandom->Gaus(0.0, pos.getY()),
279  gRandom->Gaus(0.0, pos.getZ()));
280 
281  if (action == set_t) // actions with fixed values
282  module.set(pos);
283  else if (action == add_t)
284  module.add(pos);
285  else if (action == sub_t)
286  module.sub(pos);
287  else if (action == randset_t) // actions with random values
288  module.set(randpos);
289  else if (action == randadd_t)
290  module.add(randpos);
291  else if (action == randsub_t)
292  module.sub(randpos);
293  else
294  return false;
295 
296  return true;
297  }
298  };
299 
300 
301  /**
302  * Get modifier for given string.
303  *
304  * \param id string identifier
305  * \param modifier modifier
306  * \return modifier
307  */
308  inline const JModifier& getModifier(const int id, const JModifier& modifier)
309  {
310  using namespace std;
311 
313 
314  const string::size_type pos = modifier.action.find(rand_t);
315 
316  if (pos != string::npos) {
317 
318  JModifier& result = buffer[id][modifier.action][modifier.data.size()];
319 
320  if (!result.is_valid()) {
321 
322  result.id = id;
323  result.action = modifier.action.substr(pos + rand_t.length());
324 
325  for (size_t i = 0; i != modifier.data.size(); ++i) {
326  result.data.push_back(gRandom->Gaus(0.0, modifier.data[i]));
327  }
328  }
329 
330  return result;
331 
332  } else {
333 
334  return modifier;
335  }
336  }
337 
338 
339  /**
340  * Auxiliary class to apply PMT status modifications.
341  */
342  class JPMTModifier :
343  public JPMTIdentifier
344  {
345  public:
346  /**
347  * Default constructor.
348  */
349  JPMTModifier()
350  {}
351 
352 
353  /**
354  * Apply modification to given PMT.
355  *
356  * \param pmt PMT
357  * \return true if valid action; else false
358  */
359  bool apply(JPMT& pmt) const
360  {
361  try {
362 
363  if (action == set_t) {
364 
365  pmt.set(getPMTStatusBit(value));
366 
367  } else if (action == reset_t) {
368 
369  pmt.reset(getPMTStatusBit(value));
370 
371  } else {
372 
373  return false;
374  }
375 
376  return true;
377  }
378  catch(const std::exception&) {}
379 
380  return false;
381  }
382 
383 
384  /**
385  * Read PMT modifier from input.
386  *
387  * \param in input stream
388  * \param modifier modifier
389  * \return input stream
390  */
391  friend inline std::istream& operator>>(std::istream& in, JPMTModifier& modifier)
392  {
393  return in >> static_cast<JPMTIdentifier&>(modifier) >> modifier.action >> modifier.value;
394  }
395 
396 
397  /**
398  * Write modifier to output.
399  *
400  * \param out output stream
401  * \param modifier modifier
402  * \return output stream
403  */
404  friend inline std::ostream& operator<<(std::ostream& out, const JPMTModifier& modifier)
405  {
406  out << static_cast<const JPMTIdentifier&>(modifier);
407  out << ' ';
408  out << modifier.action;
409  out << ' ';
410  out << modifier.value;
411 
412  return out;
413  }
414 
415 
416  int id;
417  std::string action;
418  std::string value;
419  };
420 
421 
422  /**
423  * Range of identifiers.
424  */
425  struct JRange_t :
426  public JRange<int> {
427  /**
428  * Separator between two identifier values.
429  */
430  static const char SEPARATOR = '-';
431 
432  /**
433  * Default constructor.
434  */
435  JRange_t() :
436  JRange(-1, -1)
437  {}
438 
439 
440  /**
441  * Read range from input.
442  *
443  * \param in input stream
444  * \param range range
445  * \return input stream
446  */
447  friend inline std::istream& operator>>(std::istream& in, JRange_t& range)
448  {
449  if (in >> range.first) {
450  if (in.get() != (int) JRange_t::SEPARATOR || ! (in >> range.second)) {
451  in.setstate(std::ios::badbit);
452  }
453  }
454 
455  return in;
456  }
457 
458 
459  /**
460  * Write range to output.
461  *
462  * \param out output stream
463  * \param range range
464  * \return output stream
465  */
466  friend inline std::ostream& operator<<(std::ostream& out, const JRange_t& range)
467  {
468  return out << range.first << JRange_t::SEPARATOR << range.second;
469  }
470  };
471 }
472 
473 
474 /**
475  * \file
476  *
477  * Auxiliary program to modify detector calibration.
478  *
479  * Syntax:
480  * <pre>
481  * -M "<module identifier> (set|add|sub|randset|randadd|randsub) x0 [x1 [x2]]"
482  * -S "<string number> (set|add|sub|randset|randadd|randsub) x0 [x1 [x2]]"
483  * -M "<module identifier> (rot|randrot) phi"
484  * -S "<string number> (rot|randrot) phi"
485  * -M "<module identifier> (mul|randmul) factor"
486  * -S "<string number> (mul|randmul) factor"
487  * -M "<module identifier> (via|randvia) factor"
488  * -S "<string number> (via|randvia) factor"
489  * -M "<module identifier> (reset)
490  * -S "<string number> (reset)
491  * -P "<PMT identifier> (set|reset) PMT_STATUS"
492  * -k "<string number>[-<string number>"
493  * -r "<string number>[-<string number>"
494  * -\@ "<key>=<value>[;<key>=<value>"
495  * </pre>
496  * Options <tt>-M</tt> and <tt>-S</tt> refer to a module and a string, respectively.\n
497  * The values provided for a string modification coherently apply to the specified string number.
498  *
499  * The options <tt>randXXX</tt> correspond to a randomisation of the specified option.
500  *
501  * If the module identifier or string number is -1,
502  * the action is applied to all modules or strings in the detector, respectively.
503  *
504  * For options <tt>[rand]set [rand]add [rand]sub</tt>,
505  * the number of values apply to position or time calibration in the following way:
506  * -# time calibration <tt>(t = x0)</tt>
507  * -# position calibration <tt>(x = x0, y = x1, z = 0)</tt>
508  * -# position calibration <tt>(x = x0, y = x1, z = x2)</tt>
509  *
510  * For options <tt>[rand]rot</tt>,
511  * the angle <tt>phi</tt> refers to an anti-clockwise rotation around the z-axis.\n
512  * The rotation angle is defined in radians.
513  *
514  * For options <tt>[rand]mul</tt>,
515  * the multiplication <tt>factor</tt> applies to the z-coordinates.\n
516  * This factor is defined as a fraction; the actual multiplication factor is <tt>(1 + factor)</tt>.
517  *
518  * For options <tt>[rand]via</tt>,
519  * The <tt>factor</tt> applies to the time calibration as a function of floor number.
520  *
521  * Note that for string modifiers with option <tt>randxxx</tt>,
522  * the action is coherently applied to the modules in the specified string.
523  * Only one type of action (defined by <tt>xxx</tt> and the number of values) is then allowed per string.
524  *
525  * Option <tt>-\@</tt> refers to the header information.\n
526  * The list of possible keys can be obtained using JPrintDetector.cc with option <tt>-O header</tt>.
527  *
528  * Multiple options <tt>-M</tt>, <tt>-S</tt> or <tt>-\@</tt> will be processed in order of appearance.
529  *
530  * Options <tt>-k</tt> and <tt>-r</tt> can be used to keep and remove a range of string numbers, respectively.
531  *
532  * Note that if the output file name is the same as the input file name,
533  * the original file will be overwritten.
534  * \author mdejong
535  */
536 int main(int argc, char **argv)
537 {
538  using namespace std;
539  using namespace JPP;
540 
541  string inputFile;
542  string outputFile;
543  vector<JModifier> mod;
544  vector<JModifier> str;
545  vector<string> hdr;
547  vector<JRange_t> keep;
548  vector<JRange_t> rm;
549  int debug;
550 
551  try {
552 
553  JParser<> zap("Auxiliary program to modify detector.");
554 
555  zap['a'] = make_field(inputFile);
556  zap['M'] = make_field(mod) = JPARSER::initialised();
557  zap['S'] = make_field(str) = JPARSER::initialised();
558  zap['@'] = make_field(hdr) = JPARSER::initialised();
559  zap['P'] = make_field(pmt) = JPARSER::initialised();
560  zap['o'] = make_field(outputFile);
561  zap['k'] = make_field(keep) = JPARSER::initialised();
562  zap['r'] = make_field(rm) = JPARSER::initialised();
563  zap['d'] = make_field(debug) = 2;
564 
565  zap(argc, argv);
566  }
567  catch(const exception &error) {
568  FATAL(error.what() << endl);
569  }
570 
572 
573  try {
574  load(inputFile, detector);
575  }
576  catch(const JException& error) {
577  FATAL(error);
578  }
579 
580 
581  gRandom->SetSeed(0);
582 
583 
584  if (!keep.empty() && !rm.empty()) {
585  FATAL("Use either option -k or -r." << endl);
586  }
587 
588 
589  detector.comment.add(JMeta(argc,argv));
590 
591 
592  if (!hdr.empty()) {
593 
594  JProperties helper = detector.getProperties();
595 
596  for (vector<string>::const_iterator i = hdr.begin(); i != hdr.end(); ++i) {
597 
598  istringstream is(*i);
599 
600  is >> helper;
601  }
602  }
603 
604 
605  for (JDetector::iterator module = detector.begin(); module != detector.end(); ) {
606 
607  bool __rm__ = !keep.empty() && rm.empty();
608 
609  for (vector<JRange_t>::const_iterator i = keep.begin(); i != keep.end(); ++i) {
610  if (module->getString() >= i->first && module->getString() <= i->second) {
611  __rm__ = false;
612  }
613  }
614 
615  for (vector<JRange_t>::const_iterator i = rm.begin(); i != rm.end(); ++i) {
616  if (module->getString() >= i->first && module->getString() <= i->second) {
617  __rm__ = true;
618  }
619  }
620 
621  if (__rm__)
622  module = detector.erase(module);
623  else
624  ++module;
625  }
626 
627 
628  for (vector<JModifier>::const_iterator i = mod.begin(); i != mod.end(); ++i) {
629 
630  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
631 
632  if (module->getID() == i->id || i->id == JModifier::WILD_CARD ){
633 
634  DEBUG("Modifier" << ' '
635  << "(" << setw(3) << module->getString() << "," << setw(2) << module->getFloor() << ")" << ' '
636  << setw(8) << module->getID() << ' '
637  << "action" << ' ' << i->action << JEEPZ() << i->data << endl);
638 
639  if (!i->apply(*module)) {
640  ERROR("No valid action: " << *i << endl);
641  }
642  }
643  }
644  }
645 
646 
647  for (vector<JModifier>::const_iterator i = str.begin(); i != str.end(); ++i) {
648 
649  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
650 
651  if (module->getString() == i->id || i->id == JModifier::WILD_CARD) {
652 
653  const JModifier& modifier = getModifier(module->getString(), *i);
654 
655  DEBUG("Modifier" << ' '
656  << "(" << setw(3) << module->getString() << "," << setw(2) << module->getFloor() << ")" << ' '
657  << setw(8) << module->getID() << ' '
658  << "action" << ' ' << modifier.action << JEEPZ() << modifier.data << endl);
659 
660  if (!modifier.apply(*module)) {
661  ERROR("No valid action: " << *i << endl);
662  }
663  }
664  }
665  }
666 
667 
668  for (vector<JPMTModifier>::const_iterator i = pmt.begin(); i != pmt.end(); ++i) {
669 
670  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
671 
672  if (module->getID() == i->getModuleID() || i->getModuleID() == JModifier::WILD_CARD) {
673 
674  DEBUG("PMT modifier" << ' '
675  << "(" << setw(8) << module->getID() << "," << setw(2) << i->getPMTAddress() << ")" << ' '
676  << "action" << ' ' << i->action << ' '
677  << "value" << ' ' << i->value << endl);
678 
679  if (i->getPMTAddress() < 0 ||
680  i->getPMTAddress() >= getNumberOfPMTs(*module) ||
681  !i->apply(module->getPMT(i->getPMTAddress()))) {
682  ERROR("No valid action: " << *i << endl);
683  }
684  }
685  }
686  }
687 
688  try {
690  }
691  catch(const JException& error) {
692  FATAL(error);
693  }
694 }
JException.hh
JMeta.hh
JVector3D.hh
JDETECTOR::JModule::sub
JModule & sub(const JVector3D &pos)
Subtract position.
Definition: JModule.hh:353
operator>>
std::istream & operator>>(std::istream &in, JAANET::JHead &header)
Read header from input.
Definition: JHead.hh:1260
JMessage.hh
JDetectorHeader.hh
JPrint.hh
JAANET::is_valid
bool is_valid(const T &value)
Check validity of given value.
Definition: JHead.hh:823
KM3NETDAQ::WILD_CARD
static const char WILD_CARD
Definition: JDAQTags.hh:34
JGEOMETRY3D::JVector3D::getZ
double getZ() const
Get z position.
Definition: JVector3D.hh:114
JDETECTOR::JCalibration
Data structure for PMT calibration.
Definition: JDetector/JCalibration.hh:35
JPARSER::initialised
Empty structure for specification of parser element that is initialised (i.e.
Definition: JParser.hh:63
JDETECTOR::load
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
Definition: JDetectorToolkit.hh:456
std::vector
Definition: JSTDTypes.hh:12
JTOOLS::JRange
Range of values.
Definition: JRange.hh:34
JDETECTOR::JModule::getInstance
static const JModule & getInstance()
Get reference to unique instance of this class object.
Definition: JModule.hh:89
JEEPZ
Auxiliary data structure for streaming of STL containers.
Definition: JPrint.hh:558
JPARSER::JParser
Utility class to parse command line options.
Definition: JParser.hh:1493
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JAAnetToolkit.hh:37
ERROR
#define ERROR(A)
Definition: JMessage.hh:66
JDETECTOR::getPMTStatusBit
static const JGetPMTStatusBit getPMTStatusBit
Function object to map key to PMT status bit.
Definition: JPMT.hh:347
main
int main(int argc, char **argv)
Definition: JEditDetector.cc:536
JRange.hh
JGEOMETRY3D::JVector3D
Data structure for vector in three dimensions.
Definition: JVector3D.hh:33
JDETECTOR::JModule::getPMT
const JPMT & getPMT(const int index) const
Get PMT.
Definition: JModule.hh:173
debug
int debug
debug level
Definition: JSirene.cc:59
JConstants.hh
JDETECTOR::JModule::set
JModule & set(const JVector3D &pos)
Set position.
Definition: JModule.hh:323
JLANG::JObjectID::getID
int getID() const
Get identifier.
Definition: JObjectID.hh:55
JTOOLS::result
return result
Definition: JPolint.hh:695
JPMTIdentifier.hh
JModuleRouter.hh
JDETECTOR::JModule
Data structure for a composite optical module.
Definition: JModule.hh:49
operator<<
std::ostream & operator<<(std::ostream &stream, const CLBCommonHeader &header)
Definition: clb_common_header.hh:72
JDETECTOR::JModule::rotate
void rotate(const JRotation3D &R)
Rotate module.
Definition: JModule.hh:230
std::map
Definition: JSTDTypes.hh:16
JDETECTOR::JPMT
Data structure for PMT geometry and calibration.
Definition: JPMT.hh:53
JParser.hh
JDETECTOR::getNumberOfPMTs
int getNumberOfPMTs(const JModule &module)
Get number of PMTs.
Definition: JDetectorToolkit.hh:348
JDetectorToolkit.hh
JGEOMETRY3D::JRotation3Z
Rotation around Z-axis.
Definition: JRotation3D.hh:85
JDETECTOR::store
void store(const JString &file_name, const JDetector &detector)
Store detector to output file.
Definition: JDetectorToolkit.hh:532
JGEOMETRY3D::JPosition3D::setPosition
void setPosition(const JVector3D &pos)
Set position.
Definition: JPosition3D.hh:151
make_field
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1954
JDETECTOR::JPMTIdentifier
PMT identifier.
Definition: JPMTIdentifier.hh:30
JDETECTOR::JDetector
Detector data structure.
Definition: JDetector.hh:80
JGEOMETRY3D::JPosition3D::getPosition
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:129
JEEP::JProperties
Utility class to parse parameter values.
Definition: JProperties.hh:496
JAANET::getPosition
JPosition3D getPosition(const Vec &v)
Get position.
Definition: JAAnetToolkit.hh:197
JAANET::detector
Detector file.
Definition: JHead.hh:130
JSUPPORT::JMeta
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:71
DEBUG
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
JDETECTOR::JPMT::reset
void reset(const JPMTStatusBits_t bit)
Reset PMT status.
Definition: JPMT.hh:167
std
Definition: jaanetDictionary.h:36
JGEOMETRY3D::JVector3D::getY
double getY() const
Get y position.
Definition: JVector3D.hh:103
JeepToolkit.hh
JDETECTOR::JModule::add
JModule & add(const JVector3D &pos)
Add position.
Definition: JModule.hh:335
JDetector.hh
JDETECTOR::JPMT::set
void set(const JPMTStatusBits_t bit)
Set PMT status.
Definition: JPMT.hh:156
JGEOMETRY3D::JVector3D::getX
double getX() const
Get x position.
Definition: JVector3D.hh:93
JDETECTOR::JModuleLocation::getFloor
int getFloor() const
Get floor number.
Definition: JModuleLocation.hh:144
FATAL
#define FATAL(A)
Definition: JMessage.hh:67
outputFile
string outputFile
Definition: JDAQTimesliceSelector.cc:37
JLANG::JException
General exception.
Definition: JException.hh:40
JDETECTOR::JModuleLocation::getString
int getString() const
Get string number.
Definition: JModuleLocation.hh:133