Jpp  18.3.0-rc.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JDetectorSupportkit.hh
Go to the documentation of this file.
1 #ifndef __JDETECTOR__JDETECTORSUPPORTKIT__
2 #define __JDETECTOR__JDETECTORSUPPORTKIT__
3 
4 #include "JLang/JTypeList.hh"
5 #include "JLang/JNullType.hh"
6 #include "JLang/JType.hh"
7 #include "JLang/JException.hh"
8 
9 #include "JMath/JConstants.hh"
10 
11 #include "JDetector/JModule.hh"
15 
16 
17 /**
18  * \file
19  *
20  * Detector support kit.
21  * \author mdejong
22  */
23 namespace JDETECTOR {}
24 namespace JPP { using namespace JDETECTOR; }
25 
26 namespace JDETECTOR {
27 
28  using JLANG::JTypeList;
29  using JLANG::JTYPELIST;
30  using JLANG::JNullType;
31  using JLANG::JType;
32  using JLANG::JException;
34 
35 
36  static const double ORCA_TBARZ_M = 0.91; //!< ORCA T-bar position relative to seabed [m]
37  static const double ARCA_TBARZ_M = 0.95; //!< ORCA T-bar position relative to seabed [m]
38 
39 
40  /**
41  * Type definitions for different detectors.
42  */
43  struct JPPM_DU_t {}; //!< PPM_DU
44  struct JKM3NeT_t {}; //!< %KM3NeT default detector
45  struct JMonteCarlo_t {}; //!< Monte Carlo
46  struct JAntares_t {}; //!< %Antares
47  struct JObsolete_t {}; //!< obsolete detector
48  struct JKM3NeTFit_t {}; //!< %KM3NeT with cable swaps, etc. (see e.g. JPMTSwapDB.cc)
49 
50 
51  /**
52  * Type list of %KM3NeT detector types (specific detectors first).
53  */
55 
56 
57  /**
58  * Check validity of detector identifier.
59  *
60  * \param type detector type
61  * \param id detector identifier
62  * \return true if valid match; else false
63  */
64  inline bool hasDetector(JType<JPPM_DU_t> type, const int id) { return id == 1; }
65  inline bool hasDetector(JType<JKM3NeTFit_t> type, const int id) { return id >= 2 && id <= 2000000000; }
66  inline bool hasDetector(JType<JKM3NeT_t> type, const int id) { return id >= 2 && id <= 2000000000; }
67  inline bool hasDetector(JType<JMonteCarlo_t> type, const int id) { return id >= -2000000000 && id <= -2; }
68 
69 
70  /**
71  * Auxiliary interface for building detector.
72  */
74  public JDetectorAddressMap
75  {
76  /**
77  * Get module.
78  *
79  * The configuration of module is according internal module address map.
80  *
81  * \param id module identifier
82  * \param location module location
83  * \return module
84  */
85  const JModule& getModule(const int id = -1, const JLocation& location = JLocation()) const
86  {
87  module.setID(id);
88  module.setLocation(location);
89 
90  const JModuleAddressMap& memo = this->get(id);
91 
92  module.resize(memo.size());
93 
94  if (memo.has( 0)) { module[memo[ 0].tdc] = JPMT( 1, JAxis3D(JVector3D(+0.000, +0.000, -0.200), JVersor3D(+0.000, +0.000, -1.000))); }
95 
96  if (memo.has( 1)) { module[memo[ 1].tdc] = JPMT( 2, JAxis3D(JVector3D(+0.000, +0.105, -0.170), JVersor3D(+0.000, +0.527, -0.850))); }
97  if (memo.has( 2)) { module[memo[ 2].tdc] = JPMT( 3, JAxis3D(JVector3D(+0.091, +0.053, -0.170), JVersor3D(+0.456, +0.263, -0.850))); }
98  if (memo.has( 3)) { module[memo[ 3].tdc] = JPMT( 4, JAxis3D(JVector3D(+0.091, -0.053, -0.170), JVersor3D(+0.456, -0.263, -0.850))); }
99  if (memo.has( 4)) { module[memo[ 4].tdc] = JPMT( 5, JAxis3D(JVector3D(+0.000, -0.105, -0.170), JVersor3D(+0.000, -0.527, -0.850))); }
100  if (memo.has( 5)) { module[memo[ 5].tdc] = JPMT( 6, JAxis3D(JVector3D(-0.091, -0.053, -0.170), JVersor3D(-0.456, -0.263, -0.850))); }
101  if (memo.has( 6)) { module[memo[ 6].tdc] = JPMT( 7, JAxis3D(JVector3D(-0.091, +0.053, -0.170), JVersor3D(-0.456, +0.263, -0.850))); }
102 
103  if (memo.has( 7)) { module[memo[ 7].tdc] = JPMT( 8, JAxis3D(JVector3D(+0.083, +0.144, -0.111), JVersor3D(+0.416, +0.720, -0.555))); }
104  if (memo.has( 8)) { module[memo[ 8].tdc] = JPMT( 9, JAxis3D(JVector3D(+0.166, +0.000, -0.111), JVersor3D(+0.832, +0.000, -0.555))); }
105  if (memo.has( 9)) { module[memo[ 9].tdc] = JPMT(10, JAxis3D(JVector3D(+0.083, -0.144, -0.111), JVersor3D(+0.416, -0.720, -0.555))); }
106  if (memo.has(10)) { module[memo[10].tdc] = JPMT(11, JAxis3D(JVector3D(-0.083, -0.144, -0.111), JVersor3D(-0.416, -0.720, -0.555))); }
107  if (memo.has(11)) { module[memo[11].tdc] = JPMT(12, JAxis3D(JVector3D(-0.166, +0.000, -0.111), JVersor3D(-0.832, +0.000, -0.555))); }
108  if (memo.has(12)) { module[memo[12].tdc] = JPMT(13, JAxis3D(JVector3D(-0.083, +0.144, -0.111), JVersor3D(-0.416, +0.720, -0.555))); }
109 
110  if (memo.has(13)) { module[memo[13].tdc] = JPMT(14, JAxis3D(JVector3D(+0.000, +0.191, -0.059), JVersor3D(+0.000, +0.955, -0.295))); }
111  if (memo.has(14)) { module[memo[14].tdc] = JPMT(15, JAxis3D(JVector3D(+0.165, +0.096, -0.059), JVersor3D(+0.827, +0.478, -0.295))); }
112  if (memo.has(15)) { module[memo[15].tdc] = JPMT(16, JAxis3D(JVector3D(+0.165, -0.096, -0.059), JVersor3D(+0.827, -0.478, -0.295))); }
113  if (memo.has(16)) { module[memo[16].tdc] = JPMT(17, JAxis3D(JVector3D(+0.000, -0.191, -0.059), JVersor3D(+0.000, -0.955, -0.295))); }
114  if (memo.has(17)) { module[memo[17].tdc] = JPMT(18, JAxis3D(JVector3D(-0.165, -0.096, -0.059), JVersor3D(-0.827, -0.478, -0.295))); }
115  if (memo.has(18)) { module[memo[18].tdc] = JPMT(19, JAxis3D(JVector3D(-0.165, +0.096, -0.059), JVersor3D(-0.827, +0.478, -0.295))); }
116 
117  if (memo.has(19)) { module[memo[19].tdc] = JPMT(20, JAxis3D(JVector3D(+0.096, +0.165, +0.059), JVersor3D(+0.478, +0.827, +0.295))); }
118  if (memo.has(20)) { module[memo[20].tdc] = JPMT(21, JAxis3D(JVector3D(+0.191, +0.000, +0.059), JVersor3D(+0.955, +0.000, +0.295))); }
119  if (memo.has(21)) { module[memo[21].tdc] = JPMT(22, JAxis3D(JVector3D(+0.096, -0.165, +0.059), JVersor3D(+0.478, -0.827, +0.295))); }
120  if (memo.has(22)) { module[memo[22].tdc] = JPMT(23, JAxis3D(JVector3D(-0.096, -0.165, +0.059), JVersor3D(-0.478, -0.827, +0.295))); }
121  if (memo.has(23)) { module[memo[23].tdc] = JPMT(24, JAxis3D(JVector3D(-0.191, +0.000, +0.059), JVersor3D(-0.955, +0.000, +0.295))); }
122  if (memo.has(24)) { module[memo[24].tdc] = JPMT(25, JAxis3D(JVector3D(-0.096, +0.165, +0.059), JVersor3D(-0.478, +0.827, +0.295))); }
123 
124  if (memo.has(25)) { module[memo[25].tdc] = JPMT(26, JAxis3D(JVector3D(+0.000, +0.166, +0.111), JVersor3D(+0.000, +0.832, +0.555))); }
125  if (memo.has(26)) { module[memo[26].tdc] = JPMT(27, JAxis3D(JVector3D(+0.144, +0.083, +0.111), JVersor3D(+0.720, +0.416, +0.555))); }
126  if (memo.has(27)) { module[memo[27].tdc] = JPMT(28, JAxis3D(JVector3D(+0.144, -0.083, +0.111), JVersor3D(+0.720, -0.416, +0.555))); }
127  if (memo.has(28)) { module[memo[28].tdc] = JPMT(29, JAxis3D(JVector3D(+0.000, -0.166, +0.111), JVersor3D(+0.000, -0.832, +0.555))); }
128  if (memo.has(29)) { module[memo[29].tdc] = JPMT(30, JAxis3D(JVector3D(-0.144, -0.083, +0.111), JVersor3D(-0.720, -0.416, +0.555))); }
129  if (memo.has(30)) { module[memo[30].tdc] = JPMT(31, JAxis3D(JVector3D(-0.144, +0.083, +0.111), JVersor3D(-0.720, +0.416, +0.555))); }
130 
131  configure();
132 
133  module.compile();
134  module.set(JVector3D(0.0, 0.0, 0.0));
135 
136  return module;
137  }
138 
139  protected:
140  /**
141  * Configure module.
142  */
143  virtual void configure() const
144  {}
145 
146  mutable JModule module;
147  };
148 
149 
150  /**
151  * Template lookup table for detector builder.
152  *
153  * The template argument refers to a specific detector.\n
154  * This class should be specialised for each detector by providing an implementation of method getDefaultModuleAddressMap.\n
155  * In the constructor of the specialised class, the PMT cable swaps should be defined.\n
156  * Other features can be implemented in virtual method configure.
157  */
158  template<class JDetector_t>
160 
161 
162  /**
163  * Template specialisation of JDetectorBuilder for obsolete detector.
164  */
165  template<>
167  public JDetectorBuilder
168  {
169  public:
170  /**
171  * Default constructor.
172  */
174  {}
175 
176 
177  /**
178  * Get default module address map.
179  *
180  * \return module address map
181  */
182  virtual const JModuleAddressMap& getDefaultModuleAddressMap() const override
183  {
184  static JModuleAddressMap memo;
185 
186  if (memo.empty()) {
187 
188  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 0), JPMTPhysicalAddress('A', 1)));
189 
190  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 1), JPMTPhysicalAddress('B', 1)));
191  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 2), JPMTPhysicalAddress('B', 2)));
192  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 3), JPMTPhysicalAddress('B', 3)));
193  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 4), JPMTPhysicalAddress('B', 4)));
194  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 5), JPMTPhysicalAddress('B', 5)));
195  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 6), JPMTPhysicalAddress('B', 6)));
196 
197  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 7), JPMTPhysicalAddress('C', 1)));
198  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 8), JPMTPhysicalAddress('C', 2)));
199  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 9), JPMTPhysicalAddress('C', 3)));
200  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(10), JPMTPhysicalAddress('C', 4)));
201  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(11), JPMTPhysicalAddress('C', 5)));
202  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(12), JPMTPhysicalAddress('C', 6)));
203 
204  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(13), JPMTPhysicalAddress('D', 1)));
205  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(14), JPMTPhysicalAddress('D', 2)));
206  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(15), JPMTPhysicalAddress('D', 3)));
207  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(16), JPMTPhysicalAddress('D', 4)));
208  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(17), JPMTPhysicalAddress('D', 5)));
209  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(18), JPMTPhysicalAddress('D', 6)));
210 
211  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(19), JPMTPhysicalAddress('E', 1)));
212  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(20), JPMTPhysicalAddress('E', 2)));
213  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(21), JPMTPhysicalAddress('E', 3)));
214  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(22), JPMTPhysicalAddress('E', 4)));
215  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(23), JPMTPhysicalAddress('E', 5)));
216  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(24), JPMTPhysicalAddress('E', 6)));
217 
218  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(25), JPMTPhysicalAddress('F', 1)));
219  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(26), JPMTPhysicalAddress('F', 2)));
220  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(27), JPMTPhysicalAddress('F', 3)));
221  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(28), JPMTPhysicalAddress('F', 4)));
222  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(29), JPMTPhysicalAddress('F', 5)));
223  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(30), JPMTPhysicalAddress('F', 6)));
224 
225  memo.configure();
226  }
227 
228  return memo;
229  }
230  };
231 
232 
233  /**
234  * Template specialisation of JDetectorBuilder for PPM_DU detector.
235  */
236  template<>
238  public JDetectorBuilder
239  {
240  public:
241  /**
242  * Default constructor.
243  */
245  {
246  get(103).swap(24,30);
247  }
248 
249 
250  /**
251  * Get default module address map.
252  *
253  * \return module address map
254  */
255  virtual const JModuleAddressMap& getDefaultModuleAddressMap() const override
256  {
257  static JModuleAddressMap memo;
258 
259  if (memo.empty()) {
260 
261  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 0), JPMTPhysicalAddress('A', 1)));
262 
263  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 6), JPMTPhysicalAddress('B', 1)));
264  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 5), JPMTPhysicalAddress('B', 2)));
265  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 4), JPMTPhysicalAddress('B', 3)));
266  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 3), JPMTPhysicalAddress('B', 4)));
267  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 2), JPMTPhysicalAddress('B', 5)));
268  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 1), JPMTPhysicalAddress('B', 6)));
269 
270  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(12), JPMTPhysicalAddress('C', 1)));
271  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(11), JPMTPhysicalAddress('C', 2)));
272  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(10), JPMTPhysicalAddress('C', 3)));
273  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 9), JPMTPhysicalAddress('C', 4)));
274  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 8), JPMTPhysicalAddress('C', 5)));
275  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 7), JPMTPhysicalAddress('C', 6)));
276 
277  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(18), JPMTPhysicalAddress('D', 1)));
278  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(17), JPMTPhysicalAddress('D', 2)));
279  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(16), JPMTPhysicalAddress('D', 3)));
280  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(15), JPMTPhysicalAddress('D', 4)));
281  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(14), JPMTPhysicalAddress('D', 5)));
282  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(13), JPMTPhysicalAddress('D', 6)));
283 
284  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(19), JPMTPhysicalAddress('E', 1)));
285  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(24), JPMTPhysicalAddress('E', 2)));
286  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(23), JPMTPhysicalAddress('E', 3)));
287  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(22), JPMTPhysicalAddress('E', 4)));
288  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(21), JPMTPhysicalAddress('E', 5)));
289  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(20), JPMTPhysicalAddress('E', 6)));
290 
291  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(25), JPMTPhysicalAddress('F', 1)));
292  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(30), JPMTPhysicalAddress('F', 2)));
293  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(29), JPMTPhysicalAddress('F', 3)));
294  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(28), JPMTPhysicalAddress('F', 4)));
295  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(27), JPMTPhysicalAddress('F', 5)));
296  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(26), JPMTPhysicalAddress('F', 6)));
297 
298  memo.configure();
299  }
300 
301  return memo;
302  }
303  };
304 
305 
306  /**
307  * Template specialisation of JDetectorBuilder for %KM3NeT detector.
308  */
309  template<>
311  public JDetectorBuilder
312  {
313  public:
314  /**
315  * Default constructor.
316  */
318  {}
319 
320 
321  /**
322  * Get default module address map.
323  *
324  * \return module address map
325  */
326  virtual const JModuleAddressMap& getDefaultModuleAddressMap() const override
327  {
328  static JModuleAddressMap memo;
329 
330  if (memo.empty()) {
331 
332  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(22), JPMTPhysicalAddress('A', 1)));
333 
334  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(14), JPMTPhysicalAddress('B', 1)));
335  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(19), JPMTPhysicalAddress('B', 2)));
336  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(25), JPMTPhysicalAddress('B', 3)));
337  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(24), JPMTPhysicalAddress('B', 4)));
338  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(26), JPMTPhysicalAddress('B', 5)));
339  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(18), JPMTPhysicalAddress('B', 6)));
340 
341  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(13), JPMTPhysicalAddress('C', 1)));
342  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(21), JPMTPhysicalAddress('C', 2)));
343  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(29), JPMTPhysicalAddress('C', 3)));
344  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(28), JPMTPhysicalAddress('C', 4)));
345  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(20), JPMTPhysicalAddress('C', 5)));
346  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(17), JPMTPhysicalAddress('C', 6)));
347 
348  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(12), JPMTPhysicalAddress('D', 1)));
349  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(15), JPMTPhysicalAddress('D', 2)));
350  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(23), JPMTPhysicalAddress('D', 3)));
351  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(30), JPMTPhysicalAddress('D', 4)));
352  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(27), JPMTPhysicalAddress('D', 5)));
353  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(16), JPMTPhysicalAddress('D', 6)));
354 
355  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(10), JPMTPhysicalAddress('E', 1)));
356  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 6), JPMTPhysicalAddress('E', 2)));
357  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 3), JPMTPhysicalAddress('E', 3)));
358  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 2), JPMTPhysicalAddress('E', 4)));
359  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 1), JPMTPhysicalAddress('E', 5)));
360  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(11), JPMTPhysicalAddress('E', 6)));
361 
362  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 9), JPMTPhysicalAddress('F', 1)));
363  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 8), JPMTPhysicalAddress('F', 2)));
364  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 4), JPMTPhysicalAddress('F', 3)));
365  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 0), JPMTPhysicalAddress('F', 4)));
366  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 5), JPMTPhysicalAddress('F', 5)));
367  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 7), JPMTPhysicalAddress('F', 6)));
368 
369  memo.configure();
370  }
371 
372  return memo;
373  }
374  };
375 
376 
377  /**
378  * Template specialisation of JDetectorBuilder for Monte Carlo detector.
379  */
380  template<>
382  public JDetectorBuilder
383  {
384  public:
385  /**
386  * Default constructor.
387  */
389  {}
390 
391 
392  /**
393  * Get default module address map.
394  *
395  * \return module address map
396  */
397  virtual const JModuleAddressMap& getDefaultModuleAddressMap() const override
398  {
399  static JModuleAddressMap memo;
400 
401  if (memo.empty()) {
402 
403  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(22), JPMTPhysicalAddress('A', 1)));
404 
405  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(14), JPMTPhysicalAddress('B', 1)));
406  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(19), JPMTPhysicalAddress('B', 2)));
407  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(25), JPMTPhysicalAddress('B', 3)));
408  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(24), JPMTPhysicalAddress('B', 4)));
409  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(26), JPMTPhysicalAddress('B', 5)));
410  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(18), JPMTPhysicalAddress('B', 6)));
411 
412  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(13), JPMTPhysicalAddress('C', 1)));
413  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(21), JPMTPhysicalAddress('C', 2)));
414  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(29), JPMTPhysicalAddress('C', 3)));
415  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(28), JPMTPhysicalAddress('C', 4)));
416  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(20), JPMTPhysicalAddress('C', 5)));
417  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(17), JPMTPhysicalAddress('C', 6)));
418 
419  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(12), JPMTPhysicalAddress('D', 1)));
420  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(15), JPMTPhysicalAddress('D', 2)));
421  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(23), JPMTPhysicalAddress('D', 3)));
422  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(30), JPMTPhysicalAddress('D', 4)));
423  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(27), JPMTPhysicalAddress('D', 5)));
424  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(16), JPMTPhysicalAddress('D', 6)));
425 
426  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(10), JPMTPhysicalAddress('E', 1)));
427  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 6), JPMTPhysicalAddress('E', 2)));
428  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 3), JPMTPhysicalAddress('E', 3)));
429  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 2), JPMTPhysicalAddress('E', 4)));
430  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 1), JPMTPhysicalAddress('E', 5)));
431  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress(11), JPMTPhysicalAddress('E', 6)));
432 
433  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 9), JPMTPhysicalAddress('F', 1)));
434  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 8), JPMTPhysicalAddress('F', 2)));
435  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 4), JPMTPhysicalAddress('F', 3)));
436  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 0), JPMTPhysicalAddress('F', 4)));
437  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 5), JPMTPhysicalAddress('F', 5)));
438  memo.push_back(JPMTAddressTranslator(JPMTReadoutAddress( 7), JPMTPhysicalAddress('F', 6)));
439 
440  memo.configure();
441  }
442 
443  return memo;
444  }
445  };
446 
447 
448  /**
449  * Template specialisation of JDetectorBuilder for %KM3NeT detector with all known features.
450  */
451  template<>
453  public JDetectorBuilder_t<JKM3NeT_t>
454  {
455  public:
456  /**
457  * Default constructor.
458  */
460  {
461  // NCR A02904908
462 
463  get(817802210).rotateL('B');
464 
465  // https://elog.km3net.de/Analysis/721
466  // https://elog.km3net.de/Analysis/723
467 
468  get(817351722).swapTDC(15, 17);
469  get(808972598).swapTDC(27, 28);
470  get(817315169).swapTDC(14, 18);
471  get(806481218).swapTDC( 9, 11);
472 
473  get(817295048).rotateR('B');
474 
475  // NCR A03733363
476 
477  get(817565802).swapTDC( 3, 4);
478  }
479 
480  protected:
481  /**
482  * Configure module.
483  */
484  virtual void configure() const override
485  {
486  using namespace JPP;
487 
488  // https://elog.km3net.de/Analysis/723
489 
490  if (module.getID() == 817802210) {
491 
492  const JRotation3Z R(-60.0 * PI / 180.0);
493 
494  for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
495  if (pmt->getDZ() < 0.0) {
496  pmt->rotate(R);
497  }
498  }
499  }
500  }
501  };
502 
503 
504  /**
505  * Get detector builder.
506  *
507  * \return detector builder
508  */
509  template<class JDetector_t>
511  {
513 
514  return demo;
515  }
516 
517 
518  /**
519  * Get detector address map.
520  *
521  * \return detector address map
522  */
523  template<class JDetector_t>
525  {
526  return getDetectorBuilder<JDetector_t>();
527  }
528 
529 
530  /**
531  * Get module address map.
532  *
533  * \param id module identifier
534  * \return module address map
535  */
536  template<class JDetector_t>
538  {
539  return getDetectorAddressMap<JDetector_t>().get(id);
540  }
541 
542 
543  /**
544  * Get PMT address translator for given module identifier and TDC channel.
545  *
546  * \param id module identifier
547  * \param tdc TDC
548  * \return PMT address translator
549  */
550  template<class JDetector_t>
551  inline const JPMTAddressTranslator& getPMTAddressTranslator(int id, int tdc)
552  {
553  return getModuleAddressMap<JDetector_t>(id).getAddressTranslator(tdc);
554  }
555 
556 
557  /**
558  * Get PMT logical index for given module identifier and TDC channel.
559  *
560  * \param id module identifier
561  * \param tdc TDC
562  * \return PMT logical index
563  */
564  template<class JDetector_t>
565  inline int getPMTLogicalIndex(int id, int tdc)
566  {
567  return getModuleAddressMap<JDetector_t>(id).getIndex(tdc);
568  }
569 
570 
571  /**
572  * Auxiliary class to extract detector address map from detector identifier.
573  */
574  template<class T>
576 
577 
578  template<class JHead_t, class JTail_t>
579  struct JDetectorHelper_t< JTypeList<JHead_t, JTail_t> >
580  {
581  /**
582  * Get detector address map.
583  *
584  * \param id detector identifier
585  * \return detector builder
586  */
587  static JDetectorBuilder& get(const int id)
588  {
589  if (hasDetector(JType<JHead_t>(), id))
590  return getDetectorBuilder<JHead_t>();
591  else
593  }
594 
595 
596  /**
597  * Has detector address map.
598  *
599  * \param id detector identifier
600  * \return true if detector address map available; else false
601  */
602  static bool has(const int id)
603  {
605  }
606  };
607 
608 
609  template<class JHead_t>
611  {
612  /**
613  * Get detector address map.
614  *
615  * \param id detector identifier
616  * \return detector builder
617  */
618  static JDetectorBuilder& get(const int id)
619  {
620  if (hasDetector(JType<JHead_t>(), id))
621  return getDetectorBuilder<JHead_t>();
622  else
623  THROW(JIndexOutOfRange, "getDetectorAddressMap<..>(" << id << ")" );
624  }
625 
626 
627  /**
628  * Has detector address map.
629  *
630  * \param id detector identifier
631  * \return true if detector address map available; else false
632  */
633  static bool has(const int id)
634  {
635  return hasDetector(JType<JHead_t>(), id);
636  }
637  };
638 
639 
640  /**
641  * Get detector builder.
642  *
643  * \param id detector identifier
644  * \return detector builder
645  */
646  inline JDetectorBuilder& getDetectorBuilder(const int id)
647  {
649  }
650 
651 
652  /**
653  * Get detector address map.
654  *
655  * \param id detector identifier
656  * \return detector address map
657  */
659  {
661  }
662 
663 
664  /**
665  * Check if detector builder is available.
666  *
667  * \param id detector identifier
668  * \return true if detector builder available; else false
669  */
670  inline bool hasDetectorBuilder(const int id)
671  {
673  }
674 
675 
676  /**
677  * Check if detector address map is available.
678  *
679  * \param id detector identifier
680  * \return true if detector address map available; else false
681  */
682  inline bool hasDetectorAddressMap(const int id)
683  {
685  }
686 
687 
688  /**
689  * Get module according given detector type.
690  *
691  * \param type detector type
692  * \param id module identifier
693  * \param location module location
694  * \return module
695  */
696  template<class JDetector_t>
697  inline const JModule& getModule(const JType<JDetector_t> type,
698  const int id,
699  const JLocation& location = JLocation())
700  {
701  return getDetectorBuilder<JDetector_t>().getModule(id, location);
702  }
703 
704 
705  /**
706  * Get module according Antares detector type.
707  *
708  * \param type Antares detector type
709  * \param id module identifier
710  * \param location module location
711  * \return module
712  */
713  inline const JModule& getModule(const JType<JAntares_t> type,
714  const int id,
715  const JLocation& location = JLocation())
716  {
717  using namespace JPP;
718 
719  static JModule module;
720 
721  module.setID(id);
722 
723  module.setLocation(location);
724 
725  if (module.empty()) {
726 
727  module.resize(3);
728 
729  const double R = 0.5; // [m]
730 
731  const double st = sin(0.75*PI);
732  const double ct = cos(0.75*PI);
733 
734  for (int i = 0; i != 3; ++i) {
735 
736  const double phi = (2.0*PI*i) / 3.0;
737  const double cp = cos(phi);
738  const double sp = sin(phi);
739 
740  module[i] = JPMT(i, JAxis3D(JVector3D(R*st*cp, R*st*sp, R*ct), JVersor3D(st*cp, st*sp, ct)));
741  }
742  }
743 
744  return module;
745  }
746 
747 
748  /**
749  * Get module according detector template.
750  *
751  * \param id module identifier
752  * \param location module location
753  * \return module
754  */
755  template<class JDetector_t>
756  inline const JModule& getModule(const int id,
757  const JLocation& location = JLocation())
758  {
759  return getModule(JType<JDetector_t>(), id, location);
760  }
761 }
762 
763 #endif
764 
KM3NeT default detector
General exception.
Definition: JException.hh:24
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const override
Get default module address map.
static bool has(const int id)
Has detector address map.
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const override
Get default module address map.
Module support kit.
Exceptions.
bool hasDetectorBuilder(const int id)
Check if detector builder is available.
Data structure for a composite optical module.
Definition: JModule.hh:67
static const double ARCA_TBARZ_M
ORCA T-bar position relative to seabed [m].
static bool has(const int id)
Has detector address map.
void setLocation(const JLocation &location)
Set location.
Definition: JLocation.hh:91
Template lookup table for detector builder.
Auxiliary class to extract detector address map from detector identifier.
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Definition: JException.hh:712
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
T get(const JHead &header)
Get object from header.
Lookup table for PMT addresses in detector.
Auxiliary class for a type holder.
Definition: JType.hh:19
KM3NeT with cable swaps, etc. (see e.g. JPMTSwapDB.cc)
Axis object.
Definition: JAxis3D.hh:38
then usage set_variable ACOUSTICS_WORKDIR $WORKDIR set_variable FORMULA sin([0]+2 *$PI *([1]+[2]*x)*x)" set_variable DY 1.0e-8 mkdir $WORKDIR for DETECTOR in $DETECTORS[*]
Type list.
Definition: JTypeList.hh:22
static const double ORCA_TBARZ_M
ORCA T-bar position relative to seabed [m].
JTYPELIST< JPPM_DU_t, JKM3NeTFit_t, JKM3NeT_t, JMonteCarlo_t >::typelist JDetectorTypes_t
Type list of KM3NeT detector types (specific detectors first).
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const override
Get default module address map.
Lookup table for PMT addresses in optical module.
virtual void configure() const
Configure module.
virtual void configure() const override
Configure module.
bool hasDetector(JType< JPPM_DU_t > type, const int id)
Check validity of detector identifier.
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const override
Get default module address map.
Data structure for vector in three dimensions.
Definition: JVector3D.hh:34
Logical location of module.
Definition: JLocation.hh:37
Auxiliary class for recursive type list generation.
Definition: JTypeList.hh:351
Mathematical constants.
const JPMTAddressTranslator & getPMTAddressTranslator(int id, int tdc)
Get PMT address translator for given module identifier and TDC channel.
Type definitions for different detectors.PPM_DU.
Data structure for PMT geometry, calibration and status.
Definition: JPMT.hh:43
void compile()
Compile module data.
Definition: JModule.hh:281
Auxiliary class for no type definition.
Definition: JNullType.hh:19
JModuleAddressMap & getModuleAddressMap(int id)
Get module address map.
static const double PI
Mathematical constants.
Data structure to translate PMT physical to readout address.
int getPMTLogicalIndex(int id, int tdc)
Get PMT logical index for given module identifier and TDC channel.
int getIndex()
Get index for user I/O manipulation.
Definition: JManip.hh:26
JDetectorAddressMap & getDetectorAddressMap()
Get detector address map.
then JCookie sh JDataQuality D $DETECTOR_ID R
Definition: JDataQuality.sh:41
Data structure for PMT readout address.
void setID(const int id)
Set identifier.
Definition: JObjectID.hh:72
then cp
Data structure for PMT physical address.
Exception for accessing an index in a collection that is outside of its range.
Definition: JException.hh:106
JDetectorBuilder & getDetectorBuilder()
Get detector builder.
Data structure for normalised vector in three dimensions.
Definition: JVersor3D.hh:26
void configure()
Configure internal router.
JModule & set(const JVector3D &pos)
Set position.
Definition: JModule.hh:407
Auxiliary interface for building detector.
bool has(const int index) const
Test whether index is available.
const JModule & getModule(const JDetector &detector, const JModuleLocation &location)
find module with a given string and floor number
const JModule & getModule(const int id=-1, const JLocation &location=JLocation()) const
Get module.
Data structure for optical module.