Jpp  19.1.0
the software that should make you happy
JBuildL1.hh
Go to the documentation of this file.
1 #ifndef __JTRIGGER__JBUILDL1__
2 #define __JTRIGGER__JBUILDL1__
3 
4 #include <vector>
5 #include <iterator>
6 
11 #include "JTrigger/JHit.hh"
12 #include "JTrigger/JHitL0.hh"
13 #include "JTrigger/JHitL1.hh"
14 #include "JTrigger/JHitR1.hh"
15 #include "JTrigger/JBuildHelper.hh"
16 #include "JTrigger/JBuild.hh"
19 #include "JDetector/JModule.hh"
20 
21 
22 /**
23  * \author mdejong
24  */
25 
26 namespace JTRIGGER {}
27 namespace JPP { using namespace JTRIGGER; }
28 
29 namespace JTRIGGER {
30 
32  using JDETECTOR::JModule;
33 
34  /**
35  * Auxiliary data structure for L1 build parameters.
36  */
38  {
39  /**
40  * Constructor.
41  *
42  * \param Tmax_ns maximal time difference between consecutive hits [ns]
43  * \param combine combine multiple L1 hits within given time window
44  */
45  JBuildL1Parameters(const double Tmax_ns,
46  const bool combine) :
47  TMax_ns(Tmax_ns),
49  {}
50 
51 
52  /**
53  * Constructor.
54  *
55  * \param parameters trigger parameters
56  */
58  TMax_ns(parameters.TMaxLocal_ns),
59  combine(parameters.combineL1)
60  {}
61 
62 
63  /**
64  * Constructor.
65  *
66  * \param parameters L2 parameters
67  */
68  JBuildL1Parameters(const JL2Parameters& parameters) :
69  TMax_ns(parameters.TMaxLocal_ns),
70  combine(true)
71  {}
72 
73 
74  double TMax_ns;
75  bool combine;
76  };
77 
78 
79  /**
80  * Template L1 hit builder.
81  *
82  * An L1 hit is a local coincidence between two hits within the same optical module.
83  */
84  template<class JHit_t>
85  class JBuildL1 :
86  public JBuildL1Parameters,
87  public JBuildHelper< JBuildL1<JHit_t> >,
88  public JBuild<JHit_t>,
89  public JHitToolkit<JHit_t>
90  {
91  public:
92 
93  using JBuildHelper< JBuildL1<JHit_t> >::operator();
94 
95  typedef JHit_t value_type;
96 
97 
98  /**
99  * Constructor.
100  *
101  * \param parameters build L1 parameters
102  */
103  JBuildL1(const JBuildL1Parameters& parameters) :
104  JBuildL1Parameters(parameters)
105  {}
106 
107 
108  /**
109  * Build hits from calibrated data.
110  *
111  * The output data are time sorted.
112  *
113  * \param input input L0 data
114  * \param out output L1 data
115  */
116  template<class JOutput_t>
117  void operator()(const JSuperFrame2D<JHit_t>& input, JOutput_t out) const
118  {
119  (*this)(input.begin(), input.end(), out);
120  }
121 
122 
123  /**
124  * Build hits from set of frames with calibrated data.
125  *
126  * The output data are time sorted.
127  *
128  * \param __begin begin of input L0 data
129  * \param __end end of input L0 data
130  * \param out output L1 data
131  */
132  template<class JOutput_t>
135  JOutput_t out) const
136  {
137  (*this)(JSuperFrame1D<JHit_t>::multiplex(__begin, __end), out);
138  }
139 
140 
141  /**
142  * Build hits from calibrated data.
143  *
144  * The output data are time sorted.
145  *
146  * \param input input L0 data
147  * \param out output L1 data
148  */
149  template<class JOutput_t>
150  void operator()(const JSuperFrame1D<JHit_t>& input, JOutput_t out) const
151  {
152  int n = input.size();
153 
154  for (typename JSuperFrame1D<JHit_t>::const_iterator q = input.begin(), p = q++; n != 0; ++q, --n) {
155 
156  if (this->getTimeDifference(*p,*q) <= TMax_ns) {
157 
158  *out = *p;
159  ++out;
160 
161  if (combine) {
162  for (++q, --n; this->getTimeDifference(*p,*q) <= TMax_ns; ++q, --n) {}
163  }
164  }
165 
166  p = q;
167  }
168  }
169 
170 
171  /**
172  * Build hits from DAQ data.
173  *
174  * The time calibration is applied.
175  * The output data are time sorted.
176  *
177  * \param input DAQ super frame
178  * \param module module
179  * \param out output L1 data
180  */
181  template<class JOutput_t>
182  void operator()(const JDAQSuperFrame& input,
183  const JModule& module,
184  JOutput_t out) const
185  {
186  if (!input.empty()) {
187  (*this)(this->demultiplex(input, module), out);
188  }
189  }
190  };
191 
192 
193  /**
194  * Template specialisation of L1 builder for JHitL1 data type.
195  */
196  template<>
197  class JBuildL1<JHitL1> :
198  public JBuildL1<JHit>,
199  public JBuildHelper< JBuildL1<JHitL1> >
200  {
201  public:
202 
203  using JBuildHelper< JBuildL1<JHitL1> >::operator();
204 
206 
207 
208  /**
209  * Constructor.
210  *
211  * \param parameters build L1 parameters
212  */
213  JBuildL1(const JBuildL1Parameters& parameters) :
214  JBuildL1<JHit>(parameters)
215  {}
216 
217 
218  /**
219  * Build hits from calibrated data.
220  *
221  * The output data are time sorted.
222  *
223  * \param input input L0 data
224  * \param out output L1 data
225  */
226  template<class JOutput_t>
227  void operator()(const JSuperFrame2D<JHit>& input, JOutput_t out) const
228  {
229  const JSuperFrameClone2D<JHit> clone(input);
230 
231  buffer.clear();
232 
233  static_cast<const JBuildL1<JHit>&>(*this)(input, std::back_inserter(buffer));
234 
235  for (typename std::vector<JHit>::const_iterator p = buffer.begin(); p != buffer.end(); ++p) {
236 
237  JHitL1 hit(input.getModuleID());
238 
239  for (typename JSuperFrameClone2D<JHit>::const_iterator i = clone.begin(); i != clone.end(); ++i) {
240 
241  for (typename JSuperFrameClone2D<JHit>::value_type::const_iterator q = i->fast_forward(*p); this->getTimeDifference(*p,*q) <= TMax_ns; ++q) {
242 
243  hit.push_back(JHitL0(i->getPMTIdentifier(),
244  i->getAxis(),
245  *q));
246  }
247  }
248 
249  *out = hit.sort();
250  ++out;
251  }
252  }
253 
254 
255  /**
256  * Build hits from uncalibrated DAQ data.
257  *
258  * The time calibration is applied.
259  * The output data are time sorted.
260  *
261  * \param input DAQ super frame
262  * \param module module
263  * \param out output L1 data
264  */
265  template<class JOutput_t>
266  void operator()(const JDAQSuperFrame& input,
267  const JModule& module,
268  JOutput_t out) const
269  {
270  if (!input.empty()) {
271  (*this)(this->demultiplex(input, module), out);
272  }
273  }
274 
275  private:
277  };
278 
279 
280  /**
281  * Template specialisation of L1 builder for JHitR1 data type.
282  */
283  template<>
284  class JBuildL1<JHitR1> :
285  public JBuildL1<JHit>,
286  public JBuildHelper< JBuildL1<JHitR1> >
287  {
288  public:
289 
290  using JBuildHelper< JBuildL1<JHitR1> >::operator();
291 
293 
294 
295  /**
296  * Constructor.
297  *
298  * \param parameters build L1 parameters
299  */
300  JBuildL1(const JBuildL1Parameters& parameters) :
301  JBuildL1<JHit>(parameters)
302  {}
303 
304 
305  /**
306  * Build hits from calibrated data.
307  *
308  * The output data are time sorted.
309  *
310  * \param input input L0 data
311  * \param out output L1 data
312  */
313  template<class JOutput_t>
314  void operator()(const JSuperFrame2D<JHit>& input, JOutput_t out) const
315  {
316  const JSuperFrameClone2D<JHit> clone(input);
317 
318  buffer.clear();
319 
320  static_cast<const JBuildL1<JHit>&>(*this)(input, std::back_inserter(buffer));
321 
322  for (typename std::vector<JHit>::const_iterator p = buffer.begin(); p != buffer.end(); ++p) {
323 
324  JHitR1 hit(input.getModuleID(),
325  input.getPosition());
326 
327  clone.fast_forward(*p);
328 
329  for (typename JSuperFrameClone2D<JHit>::const_iterator i = clone.begin(); i != clone.end(); ++i) {
330 
331  if (i->getTimeDifference(*p) <= TMax_ns) {
332 
333  if (hit.getN() == 0)
334  hit.set(i->getJHit());
335  else
336  hit.add(i->getJHit());
337  }
338 
339  if (i->getT() < hit.getT()) {
340  hit.setPosition(i->getPosition());
341  }
342  }
343 
344  *out = hit;
345  ++out;
346  }
347  }
348 
349 
350  /**
351  * Build hits from uncalibrated DAQ data.
352  *
353  * The time calibration is applied.
354  * The output data are time sorted.
355  *
356  * \param input DAQ super frame
357  * \param module module
358  * \param out output L1 data
359  */
360  template<class JOutput_t>
361  void operator()(const JDAQSuperFrame& input,
362  const JModule& module,
363  JOutput_t out) const
364  {
365  if (!input.empty()) {
366  (*this)(this->demultiplex(input, module), out);
367  }
368  }
369 
370  private:
372  };
373 }
374 
375 #endif
Basic data structure for L0 hit.
Basic data structure for L1 hit.
Reduced data structure for L1 hit.
Tools for handling different hit types.
Data structure for optical module.
Basic data structure for time and time over threshold information of hit.
Data structure for a composite optical module.
Definition: JModule.hh:75
void setPosition(const JVector3D &pos)
Set position.
Definition: JPosition3D.hh:152
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
void operator()(const JDAQSuperFrame &input, const JModule &module, JOutput_t out) const
Build hits from uncalibrated DAQ data.
Definition: JBuildL1.hh:266
void operator()(const JSuperFrame2D< JHit > &input, JOutput_t out) const
Build hits from calibrated data.
Definition: JBuildL1.hh:227
JBuildL1(const JBuildL1Parameters &parameters)
Constructor.
Definition: JBuildL1.hh:213
std::vector< JHit > buffer
Definition: JBuildL1.hh:276
JBuildL1(const JBuildL1Parameters &parameters)
Constructor.
Definition: JBuildL1.hh:300
std::vector< JHit > buffer
Definition: JBuildL1.hh:371
void operator()(const JDAQSuperFrame &input, const JModule &module, JOutput_t out) const
Build hits from uncalibrated DAQ data.
Definition: JBuildL1.hh:361
void operator()(const JSuperFrame2D< JHit > &input, JOutput_t out) const
Build hits from calibrated data.
Definition: JBuildL1.hh:314
Template L1 hit builder.
Definition: JBuildL1.hh:90
void operator()(const JSuperFrame1D< JHit_t > &input, JOutput_t out) const
Build hits from calibrated data.
Definition: JBuildL1.hh:150
void operator()(const JDAQSuperFrame &input, const JModule &module, JOutput_t out) const
Build hits from DAQ data.
Definition: JBuildL1.hh:182
JBuildL1(const JBuildL1Parameters &parameters)
Constructor.
Definition: JBuildL1.hh:103
void operator()(typename JSuperFrame2D< JHit_t >::const_iterator __begin, typename JSuperFrame2D< JHit_t >::const_iterator __end, JOutput_t out) const
Build hits from set of frames with calibrated data.
Definition: JBuildL1.hh:133
void operator()(const JSuperFrame2D< JHit_t > &input, JOutput_t out) const
Build hits from calibrated data.
Definition: JBuildL1.hh:117
Data structure for L0 hit.
Definition: JHitL0.hh:31
Data structure for L1 hit.
Definition: JHitL1.hh:37
const JHitL1 & sort()
Sort L0 hits.
Definition: JHitL1.hh:97
Reduced data structure for L1 hit.
Definition: JHitR1.hh:35
void set(const JHit &hit, const double weight=1.0)
Set hit.
Definition: JHitR1.hh:125
int getN() const
Get count.
Definition: JHitR1.hh:183
JHitR1 & add(const JHit &hit, const double weight=1.0)
Add hit.
Definition: JHitR1.hh:148
Hit data structure.
double getT() const
Get calibrated time of hit.
1-dimensional frame with time calibrated data from one optical module.
static JSuperFrame1D< JElement_t, JAllocator_t > multiplex
Multiplexer.
2-dimensional frame with time calibrated data from one optical module.
std::vector< value_type >::const_iterator const_iterator
Clone of JSuperFrame2D.
std::vector< value_type >::const_iterator const_iterator
void fast_forward(argument_type hit) const
Increment the internal iterators until the lower bounds corresponding to the time of the given hit.
Data structure for all trigger parameters.
bool empty() const
Definition: JDAQFrame.hh:181
int getModuleID() const
Get module identifier.
Data frame of one optical module.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
const int n
Definition: JPolint.hh:786
Auxiliary classes and methods for triggering.
double getTimeDifference(const JDAQChronometer &first, const JDAQChronometer &second)
Get time difference between two chronometers.
Auxiliary class to set-up Hit.
Definition: JSirene.hh:58
Auxiliary class to extend hit building functionality to all DAQ data types.
Definition: JBuildHelper.hh:45
Auxiliary data structure for L1 build parameters.
Definition: JBuildL1.hh:38
JBuildL1Parameters(const JTriggerParameters &parameters)
Constructor.
Definition: JBuildL1.hh:57
JBuildL1Parameters(const JL2Parameters &parameters)
Constructor.
Definition: JBuildL1.hh:68
JBuildL1Parameters(const double Tmax_ns, const bool combine)
Constructor.
Definition: JBuildL1.hh:45
Auxiliary base class for hit building.
Definition: JBuild.hh:36
JSuperFrame2D< JHit_t > & demultiplex(const JDAQSuperFrame &input, const JModule &module) const
Demultiplex and pre-process DAQ super frame.
Definition: JBuild.hh:103
Template definition of hit toolkit.
Definition: JHitToolkit.hh:60
Data structure for L2 parameters.