Jpp  18.6.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  // 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  };
507 
508 
509  /**
510  * Get detector builder.
511  *
512  * \return detector builder
513  */
514  template<class JDetector_t>
516  {
518 
519  return demo;
520  }
521 
522 
523  /**
524  * Get detector address map.
525  *
526  * \return detector address map
527  */
528  template<class JDetector_t>
530  {
531  return getDetectorBuilder<JDetector_t>();
532  }
533 
534 
535  /**
536  * Get module address map.
537  *
538  * \param id module identifier
539  * \return module address map
540  */
541  template<class JDetector_t>
543  {
544  return getDetectorAddressMap<JDetector_t>().get(id);
545  }
546 
547 
548  /**
549  * Get PMT address translator for given module identifier and TDC channel.
550  *
551  * \param id module identifier
552  * \param tdc TDC
553  * \return PMT address translator
554  */
555  template<class JDetector_t>
556  inline const JPMTAddressTranslator& getPMTAddressTranslator(int id, int tdc)
557  {
558  return getModuleAddressMap<JDetector_t>(id).getAddressTranslator(tdc);
559  }
560 
561 
562  /**
563  * Get PMT logical index for given module identifier and TDC channel.
564  *
565  * \param id module identifier
566  * \param tdc TDC
567  * \return PMT logical index
568  */
569  template<class JDetector_t>
570  inline int getPMTLogicalIndex(int id, int tdc)
571  {
572  return getModuleAddressMap<JDetector_t>(id).getIndex(tdc);
573  }
574 
575 
576  /**
577  * Auxiliary class to extract detector address map from detector identifier.
578  */
579  template<class T>
581 
582 
583  template<class JHead_t, class JTail_t>
584  struct JDetectorHelper_t< JTypeList<JHead_t, JTail_t> >
585  {
586  /**
587  * Get detector address map.
588  *
589  * \param id detector identifier
590  * \return detector builder
591  */
592  static JDetectorBuilder& get(const int id)
593  {
594  if (hasDetector(JType<JHead_t>(), id))
595  return getDetectorBuilder<JHead_t>();
596  else
598  }
599 
600 
601  /**
602  * Has detector address map.
603  *
604  * \param id detector identifier
605  * \return true if detector address map available; else false
606  */
607  static bool has(const int id)
608  {
610  }
611  };
612 
613 
614  template<class JHead_t>
616  {
617  /**
618  * Get detector address map.
619  *
620  * \param id detector identifier
621  * \return detector builder
622  */
623  static JDetectorBuilder& get(const int id)
624  {
625  if (hasDetector(JType<JHead_t>(), id))
626  return getDetectorBuilder<JHead_t>();
627  else
628  THROW(JIndexOutOfRange, "getDetectorAddressMap<..>(" << id << ")" );
629  }
630 
631 
632  /**
633  * Has detector address map.
634  *
635  * \param id detector identifier
636  * \return true if detector address map available; else false
637  */
638  static bool has(const int id)
639  {
640  return hasDetector(JType<JHead_t>(), id);
641  }
642  };
643 
644 
645  /**
646  * Get detector builder.
647  *
648  * \param id detector identifier
649  * \return detector builder
650  */
651  inline JDetectorBuilder& getDetectorBuilder(const int id)
652  {
654  }
655 
656 
657  /**
658  * Get detector address map.
659  *
660  * \param id detector identifier
661  * \return detector address map
662  */
664  {
666  }
667 
668 
669  /**
670  * Check if detector builder is available.
671  *
672  * \param id detector identifier
673  * \return true if detector builder available; else false
674  */
675  inline bool hasDetectorBuilder(const int id)
676  {
678  }
679 
680 
681  /**
682  * Check if detector address map is available.
683  *
684  * \param id detector identifier
685  * \return true if detector address map available; else false
686  */
687  inline bool hasDetectorAddressMap(const int id)
688  {
690  }
691 
692 
693  /**
694  * Get module according given detector type.
695  *
696  * \param type detector type
697  * \param id module identifier
698  * \param location module location
699  * \return module
700  */
701  template<class JDetector_t>
703  const int id,
704  const JLocation& location = JLocation())
705  {
706  return getDetectorBuilder<JDetector_t>().getModule(id, location);
707  }
708 
709 
710  /**
711  * Get module according Antares detector type.
712  *
713  * \param type Antares detector type
714  * \param id module identifier
715  * \param location module location
716  * \return module
717  */
718  inline const JModule& getModule(const JType<JAntares_t> type,
719  const int id,
720  const JLocation& location = JLocation())
721  {
722  using namespace JPP;
723 
724  static JModule module;
725 
726  module.setID(id);
727 
728  module.setLocation(location);
729 
730  if (module.empty()) {
731 
732  module.resize(3);
733 
734  const double R = 0.5; // [m]
735 
736  const double st = sin(0.75*PI);
737  const double ct = cos(0.75*PI);
738 
739  for (int i = 0; i != 3; ++i) {
740 
741  const double phi = (2.0*PI*i) / 3.0;
742  const double cp = cos(phi);
743  const double sp = sin(phi);
744 
745  module[i] = JPMT(i, JAxis3D(JVector3D(R*st*cp, R*st*sp, R*ct), JVersor3D(st*cp, st*sp, ct)));
746  }
747  }
748 
749  return module;
750  }
751 
752 
753  /**
754  * Get module according detector template.
755  *
756  * \param id module identifier
757  * \param location module location
758  * \return module
759  */
760  template<class JDetector_t>
761  inline const JModule& getModule(const int id,
762  const JLocation& location = JLocation())
763  {
764  return getModule(JType<JDetector_t>(), id, location);
765  }
766 }
767 
768 #endif
769 
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.
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)
then set_variable PMT_FILE set_variable DAQ_FILE set_variable OUTPUT_FILE set_variable DETECTOR else fatal Wrong number of arguments fi JPrintTree f $DAQ_FILE type
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.