Jpp  17.2.1-pre0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JConstructDetector.cc File Reference

Auxiliary program to compose detector from separate calibrations. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <fstream>
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorCalibration.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JDetectorAddressMapToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JPMTRouter.hh"
#include "JSupport/JMeta.hh"
#include "JSon/JSon.hh"
#include "Jeep/JeepToolkit.hh"
#include "Jeep/JPrint.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 compose detector from separate calibrations.

Author
mdejong

Definition in file JConstructDetector.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 28 of file JConstructDetector.cc.

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
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.
Lookup table for PMT addresses in detector.
static const std::string CCAL
compass alignment (a.k.a. quaternion calibration)
string outputFile
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:127
#define ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
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
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.
JVector3D getCenter() const
Get center of module based on crossing point of PMT axes.
Definition: JModule.hh:215
static const std::string DOMAcousticT0_t
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
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
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.
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
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