59{
62
63 string detectorFile;
64 string option;
65 double precision;
67
68 try {
69
70 JParser<> zap(
"Auxiliary program to print detector file in human friendly format.");
71
74
75 default_t,
76
77 pmts_t,
78 modules_t,
79 geometry_t,
80
81 comment_t,
82 header_t,
83 version_t,
84 identifier_t,
85 can_t,
86 center_t,
87 summary_t,
88
89 HEADER_t,
90 VERSION_t,
91 IDENTIFIER_t,
92 CAN_t,
93 CENTER_t,
94 SUMMARY_t;
95
96 zap[
'p'] =
make_field(precision,
"precision for match with reference module") = 1.0e-5;
98
99 zap(argc, argv);
100 }
101 catch(const exception &error) {
102 FATAL(error.what() << endl);
103 }
104
105
107
108 try {
110 }
113 }
114
115 if (option == default_t) {
116
118
119 } else if (option == modules_t) {
120
122
123 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
124
125 cout << "Module";
126 cout << ' ' << noshowpos << setw(8) << right << module->getID();
127 cout << ' ' << noshowpos << setw(3) << right << module->getString();
128 cout << ' ' << noshowpos << setw(2) << right << module->getFloor();
129 cout <<
' ' <<
FIXED(7,2) << module->getX();
130 cout <<
' ' <<
FIXED(7,2) << module->getY();
131 cout <<
' ' <<
FIXED(7,2) << module->getZ();
132 cout <<
' ' <<
FIXED(8,2) << module->getT0();
133
134 if (module->getFloor() != 0) {
135 {
137
140
141 const double phi = (JVector3Z_t.getDot(q1.twist) >= 0.0 ? +1.0 : -1.0) * q1.twist.getAngle();
142
143 cout <<
' ' <<
FIXED(7,2) << phi;
144 }
145 {
148
149 const double phi = (JVector3Z_t.getDot(q1.twist) >= 0.0 ? +1.0 : -1.0) * q1.twist.getAngle();
150
151 cout <<
' ' <<
FIXED(7,2) << phi;
152 }
153 {
155
156 const JRotation3D R = getRotation(buffer, *module);
157
159
160 cout << ' ' << (JModule::compare(buffer, *module, precision) ? "==" : "!=")
162 }
163 }
164
165 cout << endl;
166 }
167
168 } else if (option == pmts_t) {
169
170 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
171 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
172 cout << "PMT";
173 cout << ' ' << noshowpos << setw(8) << right << pmt->getID();
174 cout <<
' ' <<
FIXED(7,2) << pmt->getX();
175 cout <<
' ' <<
FIXED(7,2) << pmt->getY();
176 cout <<
' ' <<
FIXED(7,2) << pmt->getZ();
177 cout <<
' ' <<
FIXED(6,3) << pmt->getDX();
178 cout <<
' ' <<
FIXED(6,3) << pmt->getDY();
179 cout <<
' ' <<
FIXED(6,3) << pmt->getDZ();
180 cout <<
' ' <<
FIXED(8,2) << pmt->getT0();
181 cout << ' ' << noshowpos << setw(8) << right << pmt->getStatus();
182 cout << endl;
183 }
184 }
185
186 } else if (option == geometry_t) {
187
190
191 } else if (option == comment_t) {
192
194
195 } else if (option == header_t ||
196 option == HEADER_t) {
197
198 if (option == header_t) {
199
200 cout <<
detector.getProperties() << endl;
203 "unknown") << endl;
204 cout << "validity = "
207
208 } else {
209
210 cout <<
"set_variable UTM_EAST " <<
FIXED(12,2) <<
detector.getUTMEast() <<
";" << endl;
211 cout <<
"set_variable UTM_NORTH " <<
FIXED(12,2) <<
detector.getUTMNorth() <<
";" << endl;
212 cout <<
"set_variable UTM_Z " <<
FIXED(12,2) <<
detector.getUTMZ() <<
";" << endl;
213 cout <<
"set_variable UTM_ZONE " <<
FIXED(12,2) <<
detector.getUTMZone() <<
";" << endl;
214 cout <<
"set_variable UTM_WGS " <<
FIXED(12,2) <<
detector.getWGS() <<
";" << endl;
215 }
216
217 } else if (option == version_t ||
218 option == VERSION_t) {
219
220 if (option == version_t) {
221
222 cout <<
detector.getVersion() << endl;
223
224 } else {
225
226 cout <<
"set_variable DETECTOR_VERSION " <<
detector.getVersion() <<
";" << endl;
227 }
228
229 } else if (option == identifier_t ||
230 option == IDENTIFIER_t) {
231
232 if (option == identifier_t) {
233
234 cout <<
"Detector " <<
detector.getID() << endl;
235
236 } else {
237
238 cout <<
"set_variable DETECTOR_ID " <<
detector.getID() <<
";" << endl;
239 }
240
241 } else if (option == can_t ||
242 option == CAN_t) {
243
245
246 const double V = (cylinder.getZmax() - cylinder.getZmin()) * PI * cylinder.getRadius() * cylinder.getRadius();
248
249 if (option == can_t) {
250
251 cout <<
"X = " <<
FIXED(7,1) << cylinder.getX() << endl;
252 cout <<
"Y = " <<
FIXED(7,1) << cylinder.getY() << endl;
253 cout <<
"Zmin = " <<
FIXED(7,1) << cylinder.getZmin() << endl;
254 cout <<
"Zmax = " <<
FIXED(7,1) << cylinder.getZmax() << endl;
255 cout <<
"Radius = " <<
FIXED(7,1) << cylinder.getRadius() << endl;
256 cout <<
"Depth = " <<
FIXED(7,1) <<
detector.getUTMZ() << endl;
257 cout <<
"Volume = " <<
SCIENTIFIC(12,3) << V << endl;
258 cout <<
"Distance = " <<
FIXED(9,3) << D << endl;
259
260 } else {
261
262 cout <<
"set_variable CAN_X_M " <<
FIXED(7,1) << cylinder.getX() <<
";" << endl;
263 cout <<
"set_variable CAN_Y_M " <<
FIXED(7,1) << cylinder.getY() <<
";" << endl;
264 cout <<
"set_variable CAN_ZMIN_M " <<
FIXED(7,1) << cylinder.getZmin() <<
";" << endl;
265 cout <<
"set_variable CAN_ZMAX_M " <<
FIXED(7,1) << cylinder.getZmax() <<
";" << endl;
266 cout <<
"set_variable CAN_RADIUS_M " <<
FIXED(7,1) << cylinder.getRadius() <<
";" << endl;
267 cout <<
"set_variable CAN_DEPTH_M " <<
FIXED(7,1) <<
detector.getUTMZ() <<
";" << endl;
268 cout <<
"set_variable CAN_VOLUME_M3 " <<
SCIENTIFIC(12,3) << V <<
";" << endl;
269 cout <<
"set_variable CAN_DISTANCE_M " <<
FIXED(9,3) << D <<
";" << endl;
270 }
271
272 } else if (option == center_t ||
273 option == CENTER_t) {
274
276
277 if (option == center_t) {
278
279 cout << "center = ";
280 cout << showpos <<
FIXED(8,3) << center.getX() <<
' ';
281 cout << showpos <<
FIXED(8,3) << center.getY() <<
' ';
282 cout << showpos <<
FIXED(8,3) << center.getZ() << endl;
283
284 } else {
285
286 cout <<
"set_variable CENTER_X_M " <<
FIXED(7,1) << center.getX() <<
";" << endl;
287 cout <<
"set_variable CENTER_Y_M " <<
FIXED(7,1) << center.getY() <<
";" << endl;
288 cout <<
"set_variable CENTER_Z_M " <<
FIXED(7,1) << center.getZ() <<
";" << endl;
289 }
290
291 } else if (option == summary_t ||
292 option == SUMMARY_t) {
293
294 const int numberOfStrings = getNumberOfStrings(
detector);
298
300
301 const JRange_t string(make_array(
detector.begin(),
detector.end(), &JModule::getString));
302 const JRange_t floor (make_array(
detector.begin(),
detector.end(), &JModule::getFloor));
303
306
307 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
308 strings.insert(module->getString());
309 modules.insert(module->getID());
310 }
311
312 if (option == summary_t) {
313
314 cout << "Number of strings = " << setw(4) << numberOfStrings << endl;
315 cout << "Number of floors = " << setw(4) << numberOfFloors << endl;
316 cout << "Number of modules = " << setw(4) << numberOfModules << endl;
317 cout << "Number of PMTs = " << setw(4) << numberOfPMTs << endl;
318 cout << "First string = " << setw(4) << string.first << endl;
319 cout << "Last string = " << setw(4) << string.second << endl;
320 cout << "First floor = " << setw(4) << floor .first << endl;
321 cout << "Last floor = " << setw(4) << floor .second << endl;
322
323 } else {
324
325 cout << "set_variable NUMBER_OF_STRINGS " << setw(4) << numberOfStrings << ";" << endl;
326 cout << "set_variable NUMBER_OF_FLOORS " << setw(4) << numberOfFloors << ";" << endl;
327 cout << "set_variable NUMBER_OF_MODULES " << setw(4) << numberOfModules << ";" << endl;
328 cout << "set_variable NUMBER_OF_PMTS " << setw(4) << numberOfPMTs << ";" << endl;
329 cout << "set_variable FIRST_STRING " << setw(4) << string.first << ";" << endl;
330 cout << "set_variable LAST_STRING " << setw(4) << string.second << ";" << endl;
331 cout << "set_variable FIRST_FLOOR " << setw(4) << floor .first << ";" << endl;
332 cout << "set_variable LAST_FLOOR " << setw(4) << floor .second << ";" << endl;
333 cout << "set_array STRINGS ";
334 copy(strings.begin(), strings.end(), ostream_iterator<int>(cout,
" "));
335 cout << ";" << endl;
336 cout << "set_array MODULES ";
337 copy(modules.begin(), modules.end(), ostream_iterator<int>(cout,
" "));
338 cout << ";" << endl;
339 }
340 }
341}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
const JModuleAddressMap & get(const int id) const
Get module address map.
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const =0
Get default module address map.
Data structure for a composite optical module.
void rotate(const JRotation3D &R)
Rotate module.
Data structure for unit quaternion in three dimensions.
Utility class to parse command line options.
void copy(const Head &from, JHead &to)
Copy header from from to to.
int getNumberOfPMTs(const JModule &module)
Get number of PMTs.
int getNumberOfFloors(const JDetector &detector)
Get number of floors.
JDetectorBuilder & getDetectorBuilder()
Get detector builder.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
int getNumberOfModules(const JDetector &detector)
Get number of modules.
bool isORCADetector(const JDetectorHeader &header)
Check if given detector header is compatible with that of ORCA.
bool isARCADetector(const JDetectorHeader &header)
Check if given detector header is compatible with tat of ARCA.
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
double getMaximalTime(const double R_Hz)
Get maximal time for given rate.
Auxiliary data structure for floating point format specification.
Auxiliary interface for building detector.
const JModule & getModule(const int id=-1, const JLocation &location=JLocation()) const
Get module.
Auxiliary data structure for decomposition of quaternion in twist and swing quaternions.
Auxiliary class for date and time.
std::string toString() const
Get ASCII formatted date and time.
Auxiliary data structure for floating point format specification.