Jpp  master_rocky
the software that should make you happy
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  // NCR A02922408
480 
481  //get(817801283).swapTDC(22, 24);
482  //get(817801283).swapTDC(24, 26);
483  }
484 
485  protected:
486  /**
487  * Configure module.
488  */
489  virtual void configure() const override
490  {
491  using namespace JPP;
492 
493  // https://elog.km3net.de/Analysis/723
494 
495  if (module.getID() == 817802210) {
496 
497  const JRotation3Z R(-60.0 * PI / 180.0);
498 
499  for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
500  if (pmt->getDZ() < 0.0) {
501  pmt->rotate(R);
502  }
503  }
504  }
505 
506  // https://git.km3net.de/auxiliary_data/calibration/-/issues/10
507 
508  if (module.getID() == 817603901) {
509 
510  const JRotation3Z R(+60.0 * PI / 180.0);
511 
512  for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
513  if (pmt->getDZ() < 0.0) {
514  pmt->rotate(R);
515  }
516  }
517  }
518  }
519  };
520 
521 
522  /**
523  * Get detector builder.
524  *
525  * \return detector builder
526  */
527  template<class JDetector_t>
529  {
531 
532  return demo;
533  }
534 
535 
536  /**
537  * Get detector address map.
538  *
539  * \return detector address map
540  */
541  template<class JDetector_t>
543  {
544  return getDetectorBuilder<JDetector_t>();
545  }
546 
547 
548  /**
549  * Get module address map.
550  *
551  * \param id module identifier
552  * \return module address map
553  */
554  template<class JDetector_t>
556  {
557  return getDetectorAddressMap<JDetector_t>().get(id);
558  }
559 
560 
561  /**
562  * Get PMT address translator for given module identifier and TDC channel.
563  *
564  * \param id module identifier
565  * \param tdc TDC
566  * \return PMT address translator
567  */
568  template<class JDetector_t>
569  inline const JPMTAddressTranslator& getPMTAddressTranslator(int id, int tdc)
570  {
571  return getModuleAddressMap<JDetector_t>(id).getAddressTranslator(tdc);
572  }
573 
574 
575  /**
576  * Get PMT logical index for given module identifier and TDC channel.
577  *
578  * \param id module identifier
579  * \param tdc TDC
580  * \return PMT logical index
581  */
582  template<class JDetector_t>
583  inline int getPMTLogicalIndex(int id, int tdc)
584  {
585  return getModuleAddressMap<JDetector_t>(id).getIndex(tdc);
586  }
587 
588 
589  /**
590  * Auxiliary class to extract detector address map from detector identifier.
591  */
592  template<class T>
594 
595 
596  template<class JHead_t, class JTail_t>
597  struct JDetectorHelper_t< JTypeList<JHead_t, JTail_t> >
598  {
599  /**
600  * Get detector address map.
601  *
602  * \param id detector identifier
603  * \return detector builder
604  */
605  static JDetectorBuilder& get(const int id)
606  {
607  if (hasDetector(JType<JHead_t>(), id))
608  return getDetectorBuilder<JHead_t>();
609  else
611  }
612 
613 
614  /**
615  * Has detector address map.
616  *
617  * \param id detector identifier
618  * \return true if detector address map available; else false
619  */
620  static bool has(const int id)
621  {
623  }
624  };
625 
626 
627  template<class JHead_t>
629  {
630  /**
631  * Get detector address map.
632  *
633  * \param id detector identifier
634  * \return detector builder
635  */
636  static JDetectorBuilder& get(const int id)
637  {
638  if (hasDetector(JType<JHead_t>(), id))
639  return getDetectorBuilder<JHead_t>();
640  else
641  THROW(JIndexOutOfRange, "getDetectorAddressMap<..>(" << id << ")" );
642  }
643 
644 
645  /**
646  * Has detector address map.
647  *
648  * \param id detector identifier
649  * \return true if detector address map available; else false
650  */
651  static bool has(const int id)
652  {
653  return hasDetector(JType<JHead_t>(), id);
654  }
655  };
656 
657 
658  /**
659  * Get detector builder.
660  *
661  * \param id detector identifier
662  * \return detector builder
663  */
664  inline JDetectorBuilder& getDetectorBuilder(const int id)
665  {
667  }
668 
669 
670  /**
671  * Get detector address map.
672  *
673  * \param id detector identifier
674  * \return detector address map
675  */
677  {
679  }
680 
681 
682  /**
683  * Check if detector builder is available.
684  *
685  * \param id detector identifier
686  * \return true if detector builder available; else false
687  */
688  inline bool hasDetectorBuilder(const int id)
689  {
691  }
692 
693 
694  /**
695  * Check if detector address map is available.
696  *
697  * \param id detector identifier
698  * \return true if detector address map available; else false
699  */
700  inline bool hasDetectorAddressMap(const int id)
701  {
703  }
704 
705 
706  /**
707  * Get module according given detector type.
708  *
709  * \param type detector type
710  * \param id module identifier
711  * \param location module location
712  * \return module
713  */
714  template<class JDetector_t>
715  inline const JModule& getModule(const JType<JDetector_t> type,
716  const int id,
717  const JLocation& location = JLocation())
718  {
719  return getDetectorBuilder<JDetector_t>().getModule(id, location);
720  }
721 
722 
723  /**
724  * Get module according Antares detector type.
725  *
726  * \param type Antares detector type
727  * \param id module identifier
728  * \param location module location
729  * \return module
730  */
731  inline const JModule& getModule(const JType<JAntares_t> type,
732  const int id,
733  const JLocation& location = JLocation())
734  {
735  using namespace JPP;
736 
737  static JModule module;
738 
739  module.setID(id);
740 
741  module.setLocation(location);
742 
743  if (module.empty()) {
744 
745  module.resize(3);
746 
747  const double R = 0.5; // [m]
748 
749  const double st = sin(0.75*PI);
750  const double ct = cos(0.75*PI);
751 
752  for (int i = 0; i != 3; ++i) {
753 
754  const double phi = (2.0*PI*i) / 3.0;
755  const double cp = cos(phi);
756  const double sp = sin(phi);
757 
758  module[i] = JPMT(i, JAxis3D(JVector3D(R*st*cp, R*st*sp, R*ct), JVersor3D(st*cp, st*sp, ct)));
759  }
760  }
761 
762  return module;
763  }
764 
765 
766  /**
767  * Get module according detector template.
768  *
769  * \param id module identifier
770  * \param location module location
771  * \return module
772  */
773  template<class JDetector_t>
774  inline const JModule& getModule(const int id,
775  const JLocation& location = JLocation())
776  {
777  return getModule(JType<JDetector_t>(), id, location);
778  }
779 }
780 
781 #endif
782 
const JModule & getModule(const JDetector &detector, const JModuleLocation &location)
find module with a given string and floor number
Exceptions.
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Definition: JException.hh:712
Mathematical constants.
Module support kit.
Data structure for optical module.
Lookup table for PMT addresses in detector.
const JModuleAddressMap & get(const int id) const
Get module address map.
virtual void configure() const override
Configure module.
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const override
Get default module address map.
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const override
Get default module address map.
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const override
Get default module address map.
virtual const JModuleAddressMap & getDefaultModuleAddressMap() const override
Get default module address map.
Template lookup table for detector builder.
Logical location of module.
Definition: JLocation.hh:40
void setLocation(const JLocation &location)
Set location.
Definition: JLocation.hh:92
Lookup table for PMT addresses in optical module.
void configure()
Configure internal router.
bool has(const int index) const
Test whether index is available.
Data structure for a composite optical module.
Definition: JModule.hh:75
void compile()
Compile module data.
Definition: JModule.hh:281
JModule & set(const JVector3D &pos)
Set position.
Definition: JModule.hh:407
Data structure for PMT physical address.
Data structure for PMT readout address.
Data structure for PMT geometry, calibration and status.
Definition: JPMT.hh:49
Axis object.
Definition: JAxis3D.hh:41
Rotation around Z-axis.
Definition: JRotation3D.hh:87
Data structure for vector in three dimensions.
Definition: JVector3D.hh:36
Data structure for normalised vector in three dimensions.
Definition: JVersor3D.hh:28
General exception.
Definition: JException.hh:24
Exception for accessing an index in a collection that is outside of its range.
Definition: JException.hh:108
void setID(const int id)
Set identifier.
Definition: JObjectID.hh:72
file Auxiliary data structures and methods for detector calibration.
Definition: JAnchor.hh:12
JTYPELIST< JPPM_DU_t, JKM3NeTFit_t, JKM3NeT_t, JMonteCarlo_t >::typelist JDetectorTypes_t
Type list of KM3NeT detector types (specific detectors first).
JDetectorAddressMap & getDetectorAddressMap(const int id)
Get detector address map.
static const double ORCA_TBARZ_M
ORCA T-bar position relative to seabed [m].
JDetectorBuilder & getDetectorBuilder(const int id)
Get detector builder.
bool hasDetectorBuilder(const int id)
Check if detector builder is available.
JModuleAddressMap & getModuleAddressMap(int id)
Get module address map.
static const double ARCA_TBARZ_M
ORCA T-bar position relative to seabed [m].
int getPMTLogicalIndex(int id, int tdc)
Get PMT logical index for given module identifier and TDC channel.
bool hasDetector(JType< JMonteCarlo_t > type, const int id)
const JPMTAddressTranslator & getPMTAddressTranslator(int id, int tdc)
Get PMT address translator for given module identifier and TDC channel.
bool hasDetectorAddressMap(const int id)
Check if detector address map is available.
static const double PI
Mathematical constants.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary interface for building detector.
const JModule & getModule(const int id=-1, const JLocation &location=JLocation()) const
Get module.
virtual void configure() const
Configure module.
static JDetectorBuilder & get(const int id)
Get detector address map.
static bool has(const int id)
Has detector address map.
static bool has(const int id)
Has detector address map.
static JDetectorBuilder & get(const int id)
Get detector address map.
Auxiliary class to extract detector address map from detector identifier.
KM3NeT with cable swaps, etc. (see e.g. JPMTSwapDB.cc)
KM3NeT default detector
Data structure to translate PMT physical to readout address.
Type definitions for different detectors.PPM_DU.
Auxiliary class for no type definition.
Definition: JNullType.hh:19
Auxiliary class for recursive type list generation.
Definition: JTypeList.hh:351
Type list.
Definition: JTypeList.hh:23
Auxiliary class for a type holder.
Definition: JType.hh:19