Jpp  17.2.1-pre0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JConstructDetector.cc
Go to the documentation of this file.
1 #include <string>
2 #include <iostream>
3 #include <iomanip>
4 #include <fstream>
5 
6 #include "JDetector/JDetector.hh"
11 #include "JDetector/JPMTRouter.hh"
12 #include "JSupport/JMeta.hh"
13 
14 #include "JSon/JSon.hh"
15 
16 #include "Jeep/JeepToolkit.hh"
17 #include "Jeep/JPrint.hh"
18 #include "Jeep/JParser.hh"
19 #include "Jeep/JMessage.hh"
20 
21 
22 /**
23  * \file
24  *
25  * Auxiliary program to compose detector from separate calibrations.
26  * \author mdejong
27  */
28 int main(int argc, char **argv)
29 {
30  using namespace std;
31  using namespace JPP;
32 
33  string detectorFile;
34  string inputFile;
35  string outputFile;
36  int debug;
37 
38  try {
39 
40  JParser<> zap("Auxiliary program to compose detector from separate calibrations.");
41 
42  zap['a'] = make_field(detectorFile, "detector file");
43  zap['f'] = make_field(inputFile, "detector calibration files in JSON format "\
44  "(wild card \'" << FILENAME_WILD_CARD << "\' will be replaced by corresponding calibration set)");
45  zap['o'] = make_field(outputFile, "detector file") = "";
46  zap['d'] = make_field(debug) = 1;
47 
48  zap(argc, argv);
49  }
50  catch(const exception &error) {
51  FATAL(error.what() << endl);
52  }
53 
54 
56 
57  try {
58  load(detectorFile, detector);
59  }
60  catch(const JException& error) {
61  FATAL(error);
62  }
63 
64  if (!hasDetectorAddressMap(detector.getID())) {
65  FATAL("No detector address map for detector identier " << detector.getID() << endl);
66  }
67 
68  const JDetectorAddressMap& demo = getDetectorAddressMap(detector.getID());
69 
70  const JModuleRouter moduleRouter(detector);
71  const JPMTRouter pmtRouter (detector);
72 
73  json::const_iterator data;
74 
75  {
76  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, TCAL) : inputFile);
77 
78  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
79 
80  detector.comment.add(MAKE_STRING(TCAL << "=" << (js.contains(Comment_t) ? js[Comment_t] : "?")));
81 
82  for (size_t i = 0; i != data->size(); ++i) {
83 
84  if (data->at(i).contains(DetID_t)) {
85  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
86  }
87 
88  if (data->at(i).contains(PMTT0s_t)) {
89 
90  for (const auto& element : data->at(i)[PMTT0s_t].get<JPMTCalibration>()) {
91 
92  if (pmtRouter.hasPMT(element.getID())) {
93 
94  JPMT& pmt = detector.getPMT(pmtRouter.getAddress(element.getID()));
95 
96  pmt.setCalibration(element.getCalibration());
97  }
98  }
99  }
100  }
101  }
102  }
103  {
104  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, PCAL) : inputFile);
105 
106  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
107 
108  detector.comment.add(MAKE_STRING(PCAL << "=" << (js.contains(Comment_t) ? js[Comment_t] : "?")));
109 
110  for (size_t i = 0; i != data->size(); ++i) {
111 
112  if (data->at(i).contains(DetID_t)) {
113  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
114  }
115 
116  if (data->at(i).contains(DOMPositions_t)) {
117 
118  for (const auto& element : data->at(i)[DOMPositions_t].get<JModulePosition>()) {
119 
120  if (moduleRouter.hasModule(element.getID())) {
121 
122  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
123 
124  module.add(element.getPosition()); // position of reference module may not exactly be at origin
125  }
126  }
127  }
128 
129  if (data->at(i).contains(BasePositions_t)) {
130 
131  for (const auto& element : data->at(i)[BasePositions_t].get<JModulePosition>()) {
132 
133  if (moduleRouter.hasModule(element.getID())) {
134 
135  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
136 
137  module.add(element.getPosition());
138  }
139  }
140  }
141  }
142  }
143  }
144  {
145  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, RCAL) : inputFile);
146 
147  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
148 
149  detector.comment.add(MAKE_STRING(RCAL << "=" << (js.contains(Comment_t) ? js[Comment_t] : "?")));
150 
151  for (size_t i = 0; i != data->size(); ++i) {
152 
153  if (data->at(i).contains(DetID_t)) {
154  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
155  }
156 
157  if (data->at(i).contains(DOMRotations_t)) {
158 
159  for (const auto& element : data->at(i)[DOMRotations_t].get<JModuleRotation>()) {
160 
161  if (moduleRouter.hasModule(element.getID())) {
162 
163  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
164 
165  const JModule buffer = getModule(demo.get(module.getID()), module.getID());
166 
167  if (module.size() != buffer.size()) {
168  FATAL("Module size " << module.size() << " != " << buffer.size() << endl);
169  }
170 
171  const JPosition3D center = module.getCenter();
172 
173  for (size_t i = 0; i != module.size(); ++i) {
174  module.getPMT(i).setAxis(buffer.getPMT(i).getAxis());
175  }
176 
177  module.rotate(element.getQuaternion());
178 
179  module.setPosition(module.getCenter());
180  module.set(center);
181  }
182  }
183  }
184 
185  if (data->at(i).contains(BaseRotations_t)) {
186 
187  // nothing to be done
188  }
189  }
190  }
191  }
192  {
193  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, ACAL) : inputFile);
194 
195  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
196 
197  detector.comment.add(MAKE_STRING(ACAL << "=" << (js.contains(Comment_t) ? js[Comment_t] : "?")));
198 
199  for (size_t i = 0; i != data->size(); ++i) {
200 
201  if (data->at(i).contains(DetID_t)) {
202  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
203  }
204 
205  if (data->at(i).contains(DOMAcousticT0_t)) {
206 
207  for (const auto& element : data->at(i)[DOMAcousticT0_t].get<JModuleCalibration>()) {
208 
209  if (moduleRouter.hasModule(element.getID())) {
210 
211  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
212 
213  module.setCalibration(element.getCalibration());
214  }
215  }
216  }
217  }
218  }
219  }
220  {
221  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, CCAL) : inputFile);
222 
223  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
224 
225  detector.comment.add(MAKE_STRING(CCAL << "=" << (js.contains(Comment_t) ? js[Comment_t] : "?")));
226 
227  for (size_t i = 0; i != data->size(); ++i) {
228 
229  if (data->at(i).contains(DetID_t)) {
230  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
231  }
232 
233  if (data->at(i).contains(DOMCompassRotations_t)) {
234 
235  for (const auto& element : data->at(i)[DOMCompassRotations_t].get<JCompassRotation>()) {
236 
237  if (moduleRouter.hasModule(element.getID())) {
238 
239  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
240 
241  module.setQuaternion(element.getQuaternion());
242  }
243  }
244  }
245  }
246  }
247  }
248  {
249  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, SCAL) : inputFile);
250 
251  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
252 
253  detector.comment.add(MAKE_STRING(SCAL << "=" << (js.contains(Comment_t) ? js[Comment_t] : "?")));
254 
255  for (size_t i = 0; i != data->size(); ++i) {
256 
257  if (data->at(i).contains(DetID_t)) {
258  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
259  }
260 
261  if (data->at(i).contains(PMTStatusInfo_t)) {
262 
263  for (const auto& element : data->at(i)[PMTStatusInfo_t].get<JPMTStatus>()) {
264 
265  if (pmtRouter.hasPMT(element.getID())) {
266 
267  JPMT& pmt = detector.getPMT(pmtRouter.getAddress(element.getID()));
268 
269  pmt.setStatus(element.getStatus());
270  }
271  }
272  }
273 
274  if (data->at(i).contains(DOMStatusInfo_t)) {
275 
276  for (const auto& element : data->at(i)[DOMStatusInfo_t].get<JModuleStatus>()) {
277 
278  if (moduleRouter.hasModule(element.getID())) {
279 
280  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
281 
282  module.setStatus(element.getStatus());
283  }
284  }
285  }
286 
287  if (data->at(i).contains(BaseStatusInfo_t)) {
288 
289  for (const auto& element : data->at(i)[BaseStatusInfo_t].get<JModuleStatus>()) {
290 
291  if (moduleRouter.hasModule(element.getID())) {
292 
293  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
294 
295  module.setStatus(element.getStatus());
296  }
297  }
298  }
299  }
300  }
301  }
302 
303  detector.comment.add(JMeta(argc,argv));
304 
305  try {
306  if (outputFile != "")
308  else
309  cout << detector << endl;
310  }
311  catch(const JException& error) {
312  FATAL(error);
313  }
314 
315  return 0;
316 }
Router for direct addressing of PMT data in detector data structure.
Definition: JPMTRouter.hh:35
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
static const std::string PMTStatusInfo_t
Utility class to parse command line options.
Definition: JParser.hh:1517
General exception.
Definition: JException.hh:23
static const std::string DetID_t
static const std::string RCAL
(optical|base) module orientations
int main(int argc, char *argv[])
Definition: Main.cc:15
Data structure for a composite optical module.
Definition: JModule.hh:68
static const std::string DOMPositions_t
Detector data structure.
Definition: JDetector.hh:89
Router for direct addressing of module data in detector data structure.
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
void setAxis(const JAxis3D &axis)
Set axis.
Definition: JAxis3D.hh:109
static const std::string TCAL
PMT time offsets.
bool hasPMT(const JObjectID &id) const
Has PMT.
Definition: JPMTRouter.hh:116
Lookup table for PMT addresses in detector.
static const std::string CCAL
compass alignment (a.k.a. quaternion calibration)
string outputFile
Data structure for detector geometry and calibration.
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:127
Detector specific mapping between logical positions and readout channels of PMTs in optical modules...
#define ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
I/O formatting auxiliaries.
Detector file.
Definition: JHead.hh:226
void setQuaternion(const JQuaternion3D &quaternion)
Set quaternion.
static const std::string SCAL
PMT status.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1993
Auxiliary methods for handling file names, type names and environment.
static const std::string DOMRotations_t
int getID() const
Get identifier.
Definition: JObjectID.hh:50
static const std::string PCAL
(optical|base) module positions
bool is_valid(const json &js)
Check validity of JSon data.
Data structure for PMT geometry, calibration and status.
Definition: JPMT.hh:43
static const std::string ACAL
acoustic time offsets (piezo sensor or hydrophone)
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
ROOT I/O of application specific meta data.
JVector3D getCenter() const
Get center of module based on crossing point of PMT axes.
Definition: JModule.hh:215
static const std::string DOMAcousticT0_t
Direct access to PMT in detector data structure.
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
const JPMT & getPMT(const int index) const
Get PMT.
Definition: JModule.hh:173
void rotate(const JRotation3D &R)
Rotate module.
Definition: JModule.hh:315
General purpose messaging.
void setStatus(const JStatus &status)
Set status.
Definition: JStatus.hh:97
static const std::string BaseRotations_t
static const std::string Comment_t
#define FATAL(A)
Definition: JMessage.hh:67
Direct access to module in detector data structure.
std::string setWildCard(const std::string &file_name, const std::string &value)
Get file name by setting wild card to given value.
Definition: JeepToolkit.hh:66
static const std::string DOMCompassRotations_t
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Utility class to parse command line options.
void setCalibration(const JCalibration &cal)
Set calibration.
const JAxis3D & getAxis() const
Get axis.
Definition: JAxis3D.hh:98
static const char FILENAME_WILD_CARD
wild card character for file name substitution
Definition: JeepToolkit.hh:44
static const std::string DOMStatusInfo_t
Data structure for position in three dimensions.
Definition: JPosition3D.hh:36
static const std::string PMTT0s_t
Auxiliary class to load json data from file.
Definition: JSon.hh:61
do set_variable DETECTOR_TXT $WORKDIR detector
static const std::string Data_t
JModule & set(const JVector3D &pos)
Set position.
Definition: JModule.hh:408
const JPMTAddress & getAddress(const JObjectID &id) const
Get address of PMT.
Definition: JPMTRouter.hh:80
static const std::string BaseStatusInfo_t
const JModule & getModule(const JDetector &detector, const JModuleLocation &location)
find module with a given string and floor number
int debug
debug level
static const std::string BasePositions_t
JModule & add(const JVector3D &pos)
Add position.
Definition: JModule.hh:420
void setPosition(const JVector3D &pos)
Set position.
Definition: JPosition3D.hh:152
bool hasWildCard(const std::string &file_name)
Check presence of wild card.
Definition: JeepToolkit.hh:53