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

Auxiliary program to generate detector files. More...

#include <stdlib.h>
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
#include <deque>
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JDetectorSupportkit.hh"
#include "JDetector/JDetectorParameters.hh"
#include "JDetector/JAnchor.hh"
#include "JDetector/JDetectorAddressMapToolkit.hh"
#include "JSupport/JMeta.hh"
#include "Jeep/JeepToolkit.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 generate detector files.

The footprint of the detector can be provided through an input file (option -f).

When no input file for the footprint is specified, the footprint is according the so-called WPD reference detector which is subsequently scaled according the specified line distance (JDETECTOR::JDetectorParameters::lineDistance_m).
The specified number of lines (JDETECTOR::JDetectorParameters::numberOfLines) is then selected from this footprint according the specified detector type (JDETECTOR::JDetectorParameters::detectorType).
The list of options includes:

  1. remove outer positions (massive);
  2. remove inner positions (hollow);
    Author
    mdejong

Definition in file JDetector.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 46 of file JDetector.cc.

47 {
48  using namespace std;
49  using namespace JPP;
50 
51  string inputFile;
52  string outputFile;
53  int detectorID;
54  string variant;
56  double Zmin_m;
57  string option;
58  int debug;
59 
60  // default values
61 
62  parameters.detectorType = 1; //
63  parameters.floorDistance_m = 0.0; // [m]
64  parameters.numberOfFloors = 18; //
65  parameters.lineDistance_m = 0.0; // [m]
66  parameters.numberOfLines = 0; //
67 
68  try {
69 
70  JParser<> zap("Auxiliary program to generate detector files.");
71 
73 
74  zap['f'] = make_field(inputFile, "anchor positions") = "";
75  zap['o'] = make_field(outputFile, "detector file");
76  zap['D'] = make_field(detectorID, "detector identifier");
77  zap['V'] = make_field(variant, "detector version") = getDetectorVersions<string>();
78  zap['@'] = make_field(helper, "detector parameters") = JPARSER::initialised();
79  zap['z'] = make_field(Zmin_m, "distance from seabed [m]") = 100.;
80  zap['O'] = make_field(option, "detector type") = ARCA_t, ORCA_t, Antares_t;
81  zap['d'] = make_field(debug) = 0;
82 
83  zap(argc, argv);
84  }
85  catch(const exception &error) {
86  FATAL(error.what() << endl);
87  }
88 
89 
90  JDetectorHeader header;
91 
92  if (option == ARCA_t)
93  header = getARCADetectorHeader();
94  else if (option == ORCA_t)
95  header = getORCADetectorHeader();
96  else if (option == Antares_t)
97  ;
98  else
99  FATAL("Invalid option " << option << endl);
100 
101 
102  JDetector detector(detectorID, variant, header);
103 
104  if (!hasDetectorAddressMap(detector.getID())) {
105  FATAL("No detector address map for detector identifier " << detector.getID() << endl);
106  }
107 
108  detector.comment.add(JMeta(argc,argv));
109 
110  const JDetectorAddressMap& demo = getDetectorAddressMap(detector.getID());
111 
112 
113  deque<JAnchor> footprint;
114 
115  if (inputFile != "") {
116 
117  ifstream in(getFullFilename(LD_LIBRARY_PATH, inputFile).c_str());
118 
119  if (in) {
120 
121  for (JAnchor anchor; in >> anchor && footprint.size() < parameters.numberOfLines; ) {
122  footprint.push_back(anchor);
123  }
124 
125  in.close();
126 
127  } else {
128 
129  FATAL("Error opening file " << inputFile);
130  }
131 
132  } else {
133 
134  // WPD footprint
135 
136  footprint.push_back(JAnchor( 1, 6, -7));
137  footprint.push_back(JAnchor( 2, 188, 9));
138  footprint.push_back(JAnchor( 3, 131, 153));
139  footprint.push_back(JAnchor( 4, -85, 120));
140  footprint.push_back(JAnchor( 5, -175, 39));
141  footprint.push_back(JAnchor( 6, -64, -181));
142  footprint.push_back(JAnchor( 7, 90, -178));
143  footprint.push_back(JAnchor( 8, 368, 20));
144  footprint.push_back(JAnchor( 9, 251, 159));
145  footprint.push_back(JAnchor( 10, 264, -146));
146  footprint.push_back(JAnchor( 11, 189, 293));
147  footprint.push_back(JAnchor( 12, 12, 309));
148  footprint.push_back(JAnchor( 13, -176, 338));
149  footprint.push_back(JAnchor( 14, -266, 149));
150  footprint.push_back(JAnchor( 15, -336, -1));
151  footprint.push_back(JAnchor( 16, -248, -174));
152  footprint.push_back(JAnchor( 17, -196, -348));
153  footprint.push_back(JAnchor( 18, -18, -350));
154  footprint.push_back(JAnchor( 19, 211, -339));
155  footprint.push_back(JAnchor( 20, 541, -12));
156  footprint.push_back(JAnchor( 21, 442, 183));
157  footprint.push_back(JAnchor( 22, 422, -125));
158  footprint.push_back(JAnchor( 23, 364, 287));
159  footprint.push_back(JAnchor( 24, 342, -323));
160  footprint.push_back(JAnchor( 25, 297, 499));
161  footprint.push_back(JAnchor( 26, 51, 452));
162  footprint.push_back(JAnchor( 27, -78, 488));
163  footprint.push_back(JAnchor( 28, -281, 508));
164  footprint.push_back(JAnchor( 29, -325, 304));
165  footprint.push_back(JAnchor( 30, -455, 128));
166  footprint.push_back(JAnchor( 31, -541, 15));
167  footprint.push_back(JAnchor( 32, -429, -142));
168  footprint.push_back(JAnchor( 33, -327, -316));
169  footprint.push_back(JAnchor( 34, -255, -488));
170  footprint.push_back(JAnchor( 35, -103, -508));
171  footprint.push_back(JAnchor( 36, 74, -469));
172  footprint.push_back(JAnchor( 37, 289, -452));
173  footprint.push_back(JAnchor( 38, 715, 0));
174  footprint.push_back(JAnchor( 39, 653, 154));
175  footprint.push_back(JAnchor( 40, 614, -141));
176  footprint.push_back(JAnchor( 41, 530, 269));
177  footprint.push_back(JAnchor( 42, 512, -323));
178  footprint.push_back(JAnchor( 43, 473, 472));
179  footprint.push_back(JAnchor( 44, 458, -473));
180  footprint.push_back(JAnchor( 45, 395, 632));
181  footprint.push_back(JAnchor( 46, 205, 630));
182  footprint.push_back(JAnchor( 47, 1, 667));
183  footprint.push_back(JAnchor( 48, -160, 644));
184  footprint.push_back(JAnchor( 49, -352, 639));
185  footprint.push_back(JAnchor( 50, -413, 460));
186  footprint.push_back(JAnchor( 51, -564, 286));
187  footprint.push_back(JAnchor( 52, -636, 125));
188  footprint.push_back(JAnchor( 53, -717, 23));
189  footprint.push_back(JAnchor( 54, -605, -139));
190  footprint.push_back(JAnchor( 55, -518, -279));
191  footprint.push_back(JAnchor( 56, -482, -448));
192  footprint.push_back(JAnchor( 57, -379, -595));
193  footprint.push_back(JAnchor( 58, -211, -619));
194  footprint.push_back(JAnchor( 59, 8, -652));
195  footprint.push_back(JAnchor( 60, 214, -619));
196  footprint.push_back(JAnchor( 61, 395, -617));
197  footprint.push_back(JAnchor( 62, 886, -12));
198  footprint.push_back(JAnchor( 63, 802, 155));
199  footprint.push_back(JAnchor( 64, 844, -128));
200  footprint.push_back(JAnchor( 65, 697, 285));
201  footprint.push_back(JAnchor( 66, 731, -275));
202  footprint.push_back(JAnchor( 67, 621, 450));
203  footprint.push_back(JAnchor( 68, 600, -497));
204  footprint.push_back(JAnchor( 69, 568, 593));
205  footprint.push_back(JAnchor( 70, 517, -586));
206  footprint.push_back(JAnchor( 71, 430, 776));
207  footprint.push_back(JAnchor( 72, 240, 758));
208  footprint.push_back(JAnchor( 73, 70, 783));
209  footprint.push_back(JAnchor( 74, -75, 803));
210  footprint.push_back(JAnchor( 75, -252, 809));
211  footprint.push_back(JAnchor( 76, -478, 771));
212  footprint.push_back(JAnchor( 77, -510, 590));
213  footprint.push_back(JAnchor( 78, -643, 468));
214  footprint.push_back(JAnchor( 79, -741, 284));
215  footprint.push_back(JAnchor( 80, -845, 175));
216  footprint.push_back(JAnchor( 81, -907, -6));
217  footprint.push_back(JAnchor( 82, -792, -142));
218  footprint.push_back(JAnchor( 83, -737, -340));
219  footprint.push_back(JAnchor( 84, -639, -492));
220  footprint.push_back(JAnchor( 85, -518, -596));
221  footprint.push_back(JAnchor( 86, -455, -751));
222  footprint.push_back(JAnchor( 87, -260, -814));
223  footprint.push_back(JAnchor( 88, -103, -819));
224  footprint.push_back(JAnchor( 89, 106, -764));
225  footprint.push_back(JAnchor( 90, 274, -754));
226  footprint.push_back(JAnchor( 91, 417, -762));
227  footprint.push_back(JAnchor( 92, 1094, -4));
228  footprint.push_back(JAnchor( 93, 1010, 120));
229  footprint.push_back(JAnchor( 94, 992, -171));
230  footprint.push_back(JAnchor( 95, 898, 324));
231  footprint.push_back(JAnchor( 96, 901, -298));
232  footprint.push_back(JAnchor( 97, 768, 471));
233  footprint.push_back(JAnchor( 98, 818, -477));
234  footprint.push_back(JAnchor( 99, 731, 632));
235  footprint.push_back(JAnchor(100, 713, -633));
236  footprint.push_back(JAnchor(101, 625, 772));
237  footprint.push_back(JAnchor(102, 661, -759));
238  footprint.push_back(JAnchor(103, 530, 949));
239  footprint.push_back(JAnchor(104, 345, 960));
240  footprint.push_back(JAnchor(105, 221, 931));
241  footprint.push_back(JAnchor(106, -29, 962));
242  footprint.push_back(JAnchor(107, -155, 967));
243  footprint.push_back(JAnchor(108, -382, 917));
244  footprint.push_back(JAnchor(109, -545, 965));
245  footprint.push_back(JAnchor(110, -634, 779));
246  footprint.push_back(JAnchor(111, -731, 600));
247  footprint.push_back(JAnchor(112, -852, 471));
248  footprint.push_back(JAnchor(113, -903, 322));
249  footprint.push_back(JAnchor(114, -976, 166));
250  footprint.push_back(JAnchor(115, -1100, 11));
251  footprint.push_back(JAnchor(116, -1006, -131));
252  footprint.push_back(JAnchor(117, -867, -332));
253  footprint.push_back(JAnchor(118, -800, -504));
254  footprint.push_back(JAnchor(119, -706, -593));
255  footprint.push_back(JAnchor(120, -604, -800));
256  footprint.push_back(JAnchor(121, -503, -933));
257  footprint.push_back(JAnchor(122, -318, -927));
258  footprint.push_back(JAnchor(123, -177, -926));
259  footprint.push_back(JAnchor(124, -10, -894));
260  footprint.push_back(JAnchor(125, 155, -919));
261  footprint.push_back(JAnchor(126, 381, -967));
262  footprint.push_back(JAnchor(127, 531, -900));
263  footprint.push_back(JAnchor(128, 1091, 311));
264  footprint.push_back(JAnchor(129, 1061, -285));
265  footprint.push_back(JAnchor(130, 966, 481));
266  footprint.push_back(JAnchor(131, 958, -457));
267  footprint.push_back(JAnchor(132, 905, 658));
268  footprint.push_back(JAnchor(133, 863, -630));
269  footprint.push_back(JAnchor(134, 788, 742));
270  footprint.push_back(JAnchor(135, 686, 911));
271  footprint.push_back(JAnchor(136, 277, 1113));
272  footprint.push_back(JAnchor(137, 92, 1094));
273  footprint.push_back(JAnchor(138, -84, 1127));
274  footprint.push_back(JAnchor(139, -302, 1062));
275  footprint.push_back(JAnchor(140, -732, 892));
276  footprint.push_back(JAnchor(141, -793, 761));
277  footprint.push_back(JAnchor(142, -901, 661));
278  footprint.push_back(JAnchor(143, -1012, 456));
279  footprint.push_back(JAnchor(144, -1101, 280));
280  footprint.push_back(JAnchor(145, -1077, -326));
281  footprint.push_back(JAnchor(146, -973, -457));
282  footprint.push_back(JAnchor(147, -883, -602));
283  footprint.push_back(JAnchor(148, -822, -771));
284  footprint.push_back(JAnchor(149, -689, -910));
285  footprint.push_back(JAnchor(150, -457, -1066));
286  footprint.push_back(JAnchor(151, -268, -1067));
287  footprint.push_back(JAnchor(152, -58, -1080));
288  footprint.push_back(JAnchor(153, 72, -1100));
289  footprint.push_back(JAnchor(154, 280, -1081));
290 
291  // scale positions to specified distance
292 
293  for (deque<JAnchor>::iterator i = footprint.begin(); i != footprint.end(); ++i) {
294  i->mul(parameters.lineDistance_m * 0.5 / 90.0);
295  }
296 
297  if (parameters.numberOfLines > footprint.size()) {
298  FATAL("Available footprint inconsistent with specified number of lines "
299  << parameters.numberOfLines << " > " << footprint.size() << endl);
300  }
301 
302  // select specified number of lines
303 
304  sort(footprint.begin(), footprint.end());
305 
306  if (parameters.detectorType == 2) { // hollow detector
307  while (parameters.numberOfLines < footprint.size()) {
308  footprint.pop_front();
309  }
310  } else { // massive detector
311  while (parameters.numberOfLines < footprint.size()) {
312  footprint.pop_back();
313  }
314  }
315 
316  // reset object identifiers
317 
318  for (deque<JAnchor>::iterator i = footprint.begin(); i != footprint.end(); ++i) {
319  static_cast<JObjectID&>(*i) = JObjectID(distance(footprint.begin(),i) + 1);
320  }
321  }
322 
323 
324  for (deque<JAnchor>::iterator i = footprint.begin(); i != footprint.end(); ++i) {
325  DEBUG(i->getID() << ' ' << i->getX() << ' ' << i->getY() << endl);
326  }
327 
328 
329  // build detector
330 
331  int PMT = 1;
332 
333  for (deque<JAnchor>::const_iterator anchor = footprint.begin(); anchor != footprint.end(); ++anchor) {
334 
335  {
336  const JVector3D position(anchor->getX(),
337  anchor->getY(),
338  option == ARCA_t ? ARCA_TBARZ_M :
339  option == ORCA_t ? ORCA_TBARZ_M :
340  0.0);
341 
342  const JLocation location(anchor->getID(), 0);
343 
344  const int id = demo.getModuleID(location);
345 
346  JModule module(id, location);
347 
348  module.set(position);
349 
350  module.compile();
351 
352  detector.push_back(module);
353  }
354 
355  for (unsigned int floor = 1; floor <= parameters.numberOfFloors; ++floor) {
356 
357  const JVector3D position(anchor->getX(),
358  anchor->getY(),
359  Zmin_m + (floor - 1) * parameters.floorDistance_m);
360 
361  const JLocation location(anchor->getID(), floor);
362 
363  const int id = demo.getModuleID(location);
364 
365  JModule module;
366 
367  if (option == ARCA_t || option == ORCA_t)
368  module = getModule<JKM3NeT_t> (id, location);
369  else if (option == Antares_t)
370  module = getModule<JAntares_t>(id, location);
371  else
372  FATAL("Invalid option " << option << endl);
373 
374  module.add(position);
375 
376  for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt, ++PMT) {
377  pmt->setID(PMT++);
378  //pmt->setCalibration(JCalibration((R + position.getZ())/C));
379  }
380 
381  detector.push_back(module);
382  }
383  }
384 
385  // Store detector.
386 
387  try {
389  }
390  catch(const JException& error) {
391  FATAL(error);
392  }
393 
394  return 0;
395 }
JDetectorHeader getORCADetectorHeader()
Get detector header for ORCA.
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
Utility class to parse command line options.
Definition: JParser.hh:1500
Auxiliary class for I/O of JDetectorParameters data structure.
General exception.
Definition: JException.hh:23
Data structure for a composite optical module.
Definition: JModule.hh:68
static const double ARCA_TBARZ_M
ORCA T-bar position relative to seabed [m].
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
static const char *const LD_LIBRARY_PATH
Nick names of environment variables.
Definition: JeepToolkit.hh:31
static const JPBS_t PMT(3, 4, 2, 3)
PBS of photo-multiplier tube (PMT)
Detector data structure.
Definition: JDetector.hh:89
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
Lookup table for PMT addresses in detector.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:66
Data structure for parameters for detector geometry.
string outputFile
Data structure for detector header.
static const double ORCA_TBARZ_M
ORCA T-bar position relative to seabed [m].
Detector file.
Definition: JHead.hh:224
Data structure for vector in three dimensions.
Definition: JVector3D.hh:34
Logical location of module.
Definition: JLocation.hh:37
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
int debug
debug level
Definition: JSirene.cc:63
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
#define FATAL(A)
Definition: JMessage.hh:67
Auxiliary class for object identification.
Definition: JObjectID.hh:22
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
void setID(const int id)
Set identifier.
Definition: JObjectID.hh:72
JDetectorHeader getARCADetectorHeader()
Get detector header for ARCA.
Data structure for anchor position on sea bed.
Definition: JAnchor.hh:24
do set_variable DETECTOR_TXT $WORKDIR detector
std::string getFullFilename(const std::string &variable, const std::string &file_name)
Get full file name (see JEEP::getPath).
Definition: JeepToolkit.hh:213
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:42
JModule & add(const JVector3D &pos)
Add position.
Definition: JModule.hh:420