Jpp  17.0.0-rc.1
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  for (size_t i = 0; i != data->size(); ++i) {
81 
82  if (data->at(i).contains(DetID_t)) {
83  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
84  }
85 
86  if (data->at(i).contains(PMTT0s_t)) {
87 
88  for (const auto& element : data->at(i)[PMTT0s_t].get<JPMTCalibration>()) {
89 
90  if (pmtRouter.hasPMT(element.getID())) {
91 
92  JPMT& pmt = detector.getPMT(pmtRouter.getAddress(element.getID()));
93 
94  pmt.setCalibration(element.getCalibration());
95  }
96  }
97  }
98  }
99  }
100  }
101  {
102  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, PCAL) : inputFile);
103 
104  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
105 
106  for (size_t i = 0; i != data->size(); ++i) {
107 
108  if (data->at(i).contains(DetID_t)) {
109  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
110  }
111 
112  if (data->at(i).contains(DOMPositions_t)) {
113 
114  for (const auto& element : data->at(i)[DOMPositions_t].get<JModulePosition>()) {
115 
116  if (moduleRouter.hasModule(element.getID())) {
117 
118  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
119 
120  module.add(element.getPosition()); // position of reference module may not exactly be at origin
121  }
122  }
123  }
124 
125  if (data->at(i).contains(BasePositions_t)) {
126 
127  for (const auto& element : data->at(i)[BasePositions_t].get<JModulePosition>()) {
128 
129  if (moduleRouter.hasModule(element.getID())) {
130 
131  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
132 
133  module.add(element.getPosition());
134  }
135  }
136  }
137  }
138  }
139  }
140  {
141  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, RCAL) : inputFile);
142 
143  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
144 
145  for (size_t i = 0; i != data->size(); ++i) {
146 
147  if (data->at(i).contains(DetID_t)) {
148  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
149  }
150 
151  if (data->at(i).contains(DOMRotations_t)) {
152 
153  for (const auto& element : data->at(i)[DOMRotations_t].get<JModuleRotation>()) {
154 
155  if (moduleRouter.hasModule(element.getID())) {
156 
157  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
158 
159  const JModule buffer = getModule(demo.get(module.getID()), module.getID());
160 
161  if (module.size() != buffer.size()) {
162  FATAL("Module size " << module.size() << " != " << buffer.size() << endl);
163  }
164 
165  const JPosition3D center = module.getCenter();
166 
167  for (size_t i = 0; i != module.size(); ++i) {
168  module.getPMT(i).setAxis(buffer.getPMT(i).getAxis());
169  }
170 
171  module.rotate(element.getQuaternion());
172 
173  module.setPosition(module.getCenter());
174  module.set(center);
175  }
176  }
177  }
178 
179  if (data->at(i).contains(BaseRotations_t)) {
180 
181  // nothing to be done
182  }
183  }
184  }
185  }
186  {
187  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, ACAL) : inputFile);
188 
189  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
190 
191  for (size_t i = 0; i != data->size(); ++i) {
192 
193  if (data->at(i).contains(DetID_t)) {
194  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
195  }
196 
197  if (data->at(i).contains(DOMAcousticT0_t)) {
198 
199  for (const auto& element : data->at(i)[DOMAcousticT0_t].get<JModuleCalibration>()) {
200 
201  if (moduleRouter.hasModule(element.getID())) {
202 
203  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
204 
205  module.setCalibration(element.getCalibration());
206  }
207  }
208  }
209  }
210  }
211  }
212  {
213  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, CCAL) : inputFile);
214 
215  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
216 
217  for (size_t i = 0; i != data->size(); ++i) {
218 
219  if (data->at(i).contains(DetID_t)) {
220  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
221  }
222 
223  if (data->at(i).contains(DOMCompassRotations_t)) {
224 
225  for (const auto& element : data->at(i)[DOMCompassRotations_t].get<JCompassRotation>()) {
226 
227  if (moduleRouter.hasModule(element.getID())) {
228 
229  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
230 
231  module.setQuaternion(element.getQuaternion());
232  }
233  }
234  }
235  }
236  }
237  }
238  {
239  const JSon js(hasWildCard(inputFile) ? setWildCard(inputFile, SCAL) : inputFile);
240 
241  if (is_valid(js) && (data = js.find(Data_t)) != js.end()) {
242 
243  for (size_t i = 0; i != data->size(); ++i) {
244 
245  if (data->at(i).contains(DetID_t)) {
246  ASSERT(data->at(i)[DetID_t].get<int>() == detector.getID(), "Check detector identifier.");
247  }
248 
249  if (data->at(i).contains(PMTStatusInfo_t)) {
250 
251  for (const auto& element : data->at(i)[PMTStatusInfo_t].get<JPMTStatus>()) {
252 
253  if (pmtRouter.hasPMT(element.getID())) {
254 
255  JPMT& pmt = detector.getPMT(pmtRouter.getAddress(element.getID()));
256 
257  pmt.setStatus(element.getStatus());
258  }
259  }
260  }
261 
262  if (data->at(i).contains(DOMStatusInfo_t)) {
263 
264  for (const auto& element : data->at(i)[DOMStatusInfo_t].get<JModuleStatus>()) {
265 
266  if (moduleRouter.hasModule(element.getID())) {
267 
268  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
269 
270  module.setStatus(element.getStatus());
271  }
272  }
273  }
274 
275  if (data->at(i).contains(BaseStatusInfo_t)) {
276 
277  for (const auto& element : data->at(i)[BaseStatusInfo_t].get<JModuleStatus>()) {
278 
279  if (moduleRouter.hasModule(element.getID())) {
280 
281  JModule& module = detector.getModule(moduleRouter.getAddress(element.getID()));
282 
283  module.setStatus(element.getStatus());
284  }
285  }
286  }
287  }
288  }
289  }
290 
291  detector.comment.add(JMeta(argc,argv));
292 
293  try {
295  }
296  catch(const JException& error) {
297  FATAL(error);
298  }
299 }
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:1500
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 ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
Detector file.
Definition: JHead.hh:224
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:1961
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
int debug
debug level
Definition: JSirene.cc:66
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
#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
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