Project
Loading...
Searching...
No Matches
CTFHelper.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15
16#ifndef O2_TRD_CTF_HELPER_H
17#define O2_TRD_CTF_HELPER_H
18
19#include "DataFormatsTRD/CTF.h"
23#include <gsl/span>
24#include <bitset>
25
26namespace o2
27{
28namespace trd
29{
30
32{
33
34 public:
35 CTFHelper(const gsl::span<const TriggerRecord>& trgRec,
36 const gsl::span<const Tracklet64>& trkData, const gsl::span<const Digit>& digData)
37 : mTrigRec(trgRec), mTrkData(trkData), mDigData(digData), mTrkStart(trkData.size()), mDigStart(digData.size())
38 {
39 // flag start of new trigger for tracklets and digits
40 for (const auto& trg : mTrigRec) {
41 if (trg.getNumberOfTracklets()) {
42 mTrkStart[trg.getFirstTracklet()] = true;
43 }
44 if (trg.getNumberOfDigits()) {
45 mDigStart[trg.getFirstDigit()] = true;
46 }
47 }
48 }
49
51 {
52 CTFHeader h{o2::detectors::DetID::TRD, 0, 1, 0, // dummy timestamp, version 1.0
53 uint32_t(mTrigRec.size()), uint32_t(mTrkData.size()), uint32_t(mDigData.size()), 0, 0, 0};
54 if (mTrigRec.size()) {
55 h.firstOrbit = mTrigRec[0].getBCData().orbit;
56 h.firstBC = mTrigRec[0].getBCData().bc;
57 }
58 if (mTrkData.size()) {
59 h.format = (uint16_t)mTrkData[0].getFormat();
60 }
61 return h;
62 }
63
64 size_t getSize() const { return mTrigRec.size() * sizeof(TriggerRecord) + mTrkData.size() * sizeof(Tracklet64) + mDigData.size() * sizeof(Digit); }
65
66 //>>> =========================== ITERATORS ========================================
67 template <typename I, typename D, typename T, int M = 1>
68 class _Iter
69 {
70 public:
71 using difference_type = std::ptrdiff_t;
72 using value_type = T;
73 using pointer = const T*;
74 using reference = const T&;
75 using iterator_category = std::random_access_iterator_tag;
76
77 _Iter(const gsl::span<const D>& data, bool end = false) : mData(data), mIndex(end ? M * data.size() : 0){};
78 _Iter() = default;
79
80 inline I& operator++() noexcept
81 {
82 ++mIndex;
83 return static_cast<I&>(*this);
84 }
85
86 inline I operator++(int)
87 {
88 I res = *(static_cast<I*>(this));
89 ++mIndex;
90 return res;
91 }
92
93 inline I& operator--() noexcept
94 {
95 mIndex--;
96 return static_cast<I&>(*this);
97 }
98
99 inline I operator--(int)
100 {
101 I res = *(static_cast<I*>(this));
102 --mIndex;
103 return res;
104 }
105
107 {
108 mIndex += i;
109 return static_cast<I&>(*this);
110 }
111
113 {
114 I res = *(const_cast<I*>(static_cast<const I*>(this)));
115 return res += i;
116 }
117
119 {
120 mIndex -= i;
121 return static_cast<I&>(*this);
122 }
123
125 {
126 I res = *(const_cast<I*>(static_cast<const I*>(this)));
127 return res -= i;
128 }
129
130 difference_type operator-(const I& other) const noexcept { return mIndex - other.mIndex; }
131
132 inline friend I operator+(difference_type i, const I& iter) { return iter + i; };
133
134 bool operator!=(const I& other) const noexcept { return mIndex != other.mIndex; }
135 bool operator==(const I& other) const noexcept { return mIndex == other.mIndex; }
136 bool operator>(const I& other) const noexcept { return mIndex > other.mIndex; }
137 bool operator<(const I& other) const noexcept { return mIndex < other.mIndex; }
138 bool operator>=(const I& other) const noexcept { return mIndex >= other.mIndex; }
139 bool operator<=(const I& other) const noexcept { return mIndex <= other.mIndex; }
140
141 protected:
142 gsl::span<const D> mData{};
144 };
145
146 //_______________________________________________
147 // BC difference wrt previous if in the same orbit, otherwise the abs.value.
148 // For the very 1st entry return 0 (diff wrt 1st BC in the CTF header)
149 class Iter_bcIncTrig : public _Iter<Iter_bcIncTrig, TriggerRecord, int16_t>
150 {
151 public:
154 {
155 if (mIndex) {
156 if (mData[mIndex].getBCData().orbit == mData[mIndex - 1].getBCData().orbit) {
157 return value_type(mData[mIndex].getBCData().bc - mData[mIndex - 1].getBCData().bc);
158 } else {
159 return value_type(mData[mIndex].getBCData().bc);
160 }
161 }
162 return 0;
163 }
165 {
166 size_t id = mIndex + i;
167 if (id) {
168 if (mData[id].getBCData().orbit == mData[id - 1].getBCData().orbit) {
169 return value_type(mData[id].getBCData().bc - mData[id - 1].getBCData().bc);
170 } else {
171 return value_type(mData[id].getBCData().bc);
172 }
173 }
174 return 0;
175 }
176 };
177
178 //_______________________________________________
179 // Orbit difference wrt previous. For the very 1st entry return 0 (diff wrt 1st BC in the CTF header)
180 class Iter_orbitIncTrig : public _Iter<Iter_orbitIncTrig, TriggerRecord, int32_t>
181 {
182 public:
184 value_type operator*() const { return value_type(mIndex ? mData[mIndex].getBCData().orbit - mData[mIndex - 1].getBCData().orbit : 0); }
186 {
187 size_t id = mIndex + i;
188 return value_type(id ? mData[id].getBCData().orbit - mData[id - 1].getBCData().orbit : 0);
189 }
190 };
191
192 //_______________________________________________
193 // Number of tracklets for trigger
194 class Iter_entriesTrk : public _Iter<Iter_entriesTrk, TriggerRecord, uint32_t>
195 {
196 public:
198 value_type operator*() const { return mData[mIndex].getNumberOfTracklets(); }
199 value_type operator[](difference_type i) const { return mData[mIndex + i].getNumberOfTracklets(); }
200 };
201
202 //_______________________________________________
203 // Number of digits for trigger
204 class Iter_entriesDig : public _Iter<Iter_entriesDig, TriggerRecord, uint32_t>
205 {
206 public:
208 value_type operator*() const { return mData[mIndex].getNumberOfDigits(); }
209 value_type operator[](difference_type i) const { return mData[mIndex + i].getNumberOfDigits(); }
210 };
211
212 //_______________________________________________
213 class Iter_HCIDTrk : public _Iter<Iter_HCIDTrk, Tracklet64, uint16_t>
214 {
215 private:
216 const std::vector<bool>* mTrigStart{nullptr};
217
218 public:
219 using _Iter<Iter_HCIDTrk, Tracklet64, uint16_t>::_Iter;
220 Iter_HCIDTrk(const std::vector<bool>* ts, const gsl::span<const Tracklet64>& data, bool end) : mTrigStart(ts), _Iter(data, end) {}
221 Iter_HCIDTrk() = default;
222
223 // assume sorting in HCID: for the 1st tracklet of the trigger return the abs HCID, for the following ones: difference to previous HCID
224 value_type operator*() const { return (*mTrigStart)[mIndex] ? mData[mIndex].getHCID() : mData[mIndex].getHCID() - mData[mIndex - 1].getHCID(); }
226 {
227 size_t id = mIndex + i;
228 return (*mTrigStart)[id] ? mData[id].getHCID() : mData[id].getHCID() - mData[id - 1].getHCID();
229 }
230 };
231
232 //_______________________________________________
233 class Iter_padrowTrk : public _Iter<Iter_padrowTrk, Tracklet64, uint8_t>
234 {
235 public:
236 using _Iter<Iter_padrowTrk, Tracklet64, uint8_t>::_Iter;
237 value_type operator*() const { return mData[mIndex].getPadRow(); }
238 value_type operator[](difference_type i) const { return mData[mIndex + i].getPadRow(); }
239 };
240
241 //_______________________________________________
242 class Iter_colTrk : public _Iter<Iter_colTrk, Tracklet64, uint8_t>
243 {
244 public:
245 using _Iter<Iter_colTrk, Tracklet64, uint8_t>::_Iter;
246 value_type operator*() const { return mData[mIndex].getColumn(); }
247 value_type operator[](difference_type i) const { return mData[mIndex + i].getColumn(); }
248 };
249
250 //_______________________________________________
251 class Iter_posTrk : public _Iter<Iter_posTrk, Tracklet64, uint16_t>
252 {
253 public:
254 using _Iter<Iter_posTrk, Tracklet64, uint16_t>::_Iter;
255 value_type operator*() const { return mData[mIndex].getPosition(); }
256 value_type operator[](difference_type i) const { return mData[mIndex + i].getPosition(); }
257 };
258
259 //_______________________________________________
260 class Iter_slopeTrk : public _Iter<Iter_slopeTrk, Tracklet64, uint8_t>
261 {
262 public:
263 using _Iter<Iter_slopeTrk, Tracklet64, uint8_t>::_Iter;
264 value_type operator*() const { return mData[mIndex].getSlope(); }
265 value_type operator[](difference_type i) const { return mData[mIndex + i].getSlope(); }
266 };
267
268 //_______________________________________________
269 class Iter_pidTrk : public _Iter<Iter_pidTrk, Tracklet64, uint32_t>
270 {
271 public:
272 using _Iter<Iter_pidTrk, Tracklet64, uint32_t>::_Iter;
273 value_type operator*() const { return mData[mIndex].getPID(); }
274 value_type operator[](difference_type i) const { return mData[mIndex + i].getPID(); }
275 };
276
277 //_______________________________________________
278 class Iter_CIDDig : public _Iter<Iter_CIDDig, Digit, uint16_t>
279 {
280 private:
281 const std::vector<bool>* mTrigStart{nullptr};
282
283 public:
284 using _Iter<Iter_CIDDig, Digit, uint16_t>::_Iter;
285 Iter_CIDDig(const std::vector<bool>* ts, const gsl::span<const Digit>& data, bool end) : mTrigStart(ts), _Iter(data, end) {}
286 Iter_CIDDig() = default;
287
288 // assume sorting in CID: for the 1st digit of the trigger return the abs CID, for the following ones: difference to previous CID
290 {
291 return (*mTrigStart)[mIndex] ? mData[mIndex].getDetector() : mData[mIndex].getDetector() - mData[mIndex - 1].getDetector();
292 }
294 {
295 size_t id = mIndex + i;
296 return (*mTrigStart)[id] ? mData[id].getDetector() : mData[id].getDetector() - mData[id - 1].getDetector();
297 }
298 };
299
300 //_______________________________________________
301 class Iter_ROBDig : public _Iter<Iter_ROBDig, Digit, uint8_t>
302 {
303 public:
304 using _Iter<Iter_ROBDig, Digit, uint8_t>::_Iter;
305 value_type operator*() const { return mData[mIndex].getROB(); }
306 value_type operator[](difference_type i) const { return mData[mIndex + i].getROB(); }
307 };
308
309 //_______________________________________________
310 class Iter_MCMDig : public _Iter<Iter_MCMDig, Digit, uint8_t>
311 {
312 public:
313 using _Iter<Iter_MCMDig, Digit, uint8_t>::_Iter;
314 value_type operator*() const { return mData[mIndex].getMCM(); }
315 value_type operator[](difference_type i) const { return mData[mIndex + i].getMCM(); }
316 };
317
318 //_______________________________________________
319 class Iter_chanDig : public _Iter<Iter_chanDig, Digit, uint8_t>
320 {
321 public:
322 using _Iter<Iter_chanDig, Digit, uint8_t>::_Iter;
323 value_type operator*() const { return mData[mIndex].getChannel(); }
324 value_type operator[](difference_type i) const { return mData[mIndex + i].getChannel(); }
325 };
326
327 //_______________________________________________
328 class Iter_ADCDig : public _Iter<Iter_ADCDig, Digit, uint16_t, constants::TIMEBINS>
329 {
330 public:
334 {
335 size_t id = mIndex + i;
336 return mData[id / constants::TIMEBINS].getADC()[id % constants::TIMEBINS];
337 }
338 };
339
340 //<<< =========================== ITERATORS ========================================
341
342 Iter_bcIncTrig begin_bcIncTrig() const { return Iter_bcIncTrig(mTrigRec, false); }
343 Iter_bcIncTrig end_bcIncTrig() const { return Iter_bcIncTrig(mTrigRec, true); }
344
345 Iter_orbitIncTrig begin_orbitIncTrig() const { return Iter_orbitIncTrig(mTrigRec, false); }
346 Iter_orbitIncTrig end_orbitIncTrig() const { return Iter_orbitIncTrig(mTrigRec, true); }
347
348 Iter_entriesTrk begin_entriesTrk() const { return Iter_entriesTrk(mTrigRec, false); }
349 Iter_entriesTrk end_entriesTrk() const { return Iter_entriesTrk(mTrigRec, true); }
350
351 Iter_entriesDig begin_entriesDig() const { return Iter_entriesDig(mTrigRec, false); }
352 Iter_entriesDig end_entriesDig() const { return Iter_entriesDig(mTrigRec, true); }
353
354 Iter_HCIDTrk begin_HCIDTrk() const { return Iter_HCIDTrk(&mTrkStart, mTrkData, false); }
355 Iter_HCIDTrk end_HCIDTrk() const { return Iter_HCIDTrk(&mTrkStart, mTrkData, true); }
356
357 Iter_padrowTrk begin_padrowTrk() const { return Iter_padrowTrk(mTrkData, false); }
358 Iter_padrowTrk end_padrowTrk() const { return Iter_padrowTrk(mTrkData, true); }
359
360 Iter_colTrk begin_colTrk() const { return Iter_colTrk(mTrkData, false); }
361 Iter_colTrk end_colTrk() const { return Iter_colTrk(mTrkData, true); }
362
363 Iter_posTrk begin_posTrk() const { return Iter_posTrk(mTrkData, false); }
364 Iter_posTrk end_posTrk() const { return Iter_posTrk(mTrkData, true); }
365
366 Iter_slopeTrk begin_slopeTrk() const { return Iter_slopeTrk(mTrkData, false); }
367 Iter_slopeTrk end_slopeTrk() const { return Iter_slopeTrk(mTrkData, true); }
368
369 Iter_pidTrk begin_pidTrk() const { return Iter_pidTrk(mTrkData, false); }
370 Iter_pidTrk end_pidTrk() const { return Iter_pidTrk(mTrkData, true); }
371
372 Iter_CIDDig begin_CIDDig() const { return Iter_CIDDig(&mDigStart, mDigData, false); }
373 Iter_CIDDig end_CIDDig() const { return Iter_CIDDig(&mDigStart, mDigData, true); }
374
375 Iter_ROBDig begin_ROBDig() const { return Iter_ROBDig(mDigData, false); }
376 Iter_ROBDig end_ROBDig() const { return Iter_ROBDig(mDigData, true); }
377
378 Iter_MCMDig begin_MCMDig() const { return Iter_MCMDig(mDigData, false); }
379 Iter_MCMDig end_MCMDig() const { return Iter_MCMDig(mDigData, true); }
380
381 Iter_chanDig begin_chanDig() const { return Iter_chanDig(mDigData, false); }
382 Iter_chanDig end_chanDig() const { return Iter_chanDig(mDigData, true); }
383
384 Iter_ADCDig begin_ADCDig() const { return Iter_ADCDig(mDigData, false); }
385 Iter_ADCDig end_ADCDig() const { return Iter_ADCDig(mDigData, true); }
386
387 private:
388 const gsl::span<const o2::trd::TriggerRecord> mTrigRec;
389 const gsl::span<const o2::trd::Tracklet64> mTrkData;
390 const gsl::span<const o2::trd::Digit> mDigData;
391 std::vector<bool> mTrkStart;
392 std::vector<bool> mDigStart;
393};
394
395} // namespace trd
396} // namespace o2
397
398#endif
uint64_t orbit
Definition RawEventData.h:6
uint64_t bc
Definition RawEventData.h:5
int32_t i
uint32_t res
Definition RawData.h:0
Definitions for TRD CTF data.
Class for time synchronization of RawReader instances.
static constexpr ID TRD
Definition DetID.h:65
value_type operator[](difference_type i) const
Definition CTFHelper.h:333
value_type operator*() const
Definition CTFHelper.h:332
value_type operator*() const
Definition CTFHelper.h:289
Iter_CIDDig(const std::vector< bool > *ts, const gsl::span< const Digit > &data, bool end)
Definition CTFHelper.h:285
value_type operator[](difference_type i) const
Definition CTFHelper.h:293
value_type operator[](difference_type i) const
Definition CTFHelper.h:225
Iter_HCIDTrk(const std::vector< bool > *ts, const gsl::span< const Tracklet64 > &data, bool end)
Definition CTFHelper.h:220
value_type operator*() const
Definition CTFHelper.h:224
value_type operator[](difference_type i) const
Definition CTFHelper.h:315
value_type operator*() const
Definition CTFHelper.h:314
value_type operator[](difference_type i) const
Definition CTFHelper.h:306
value_type operator*() const
Definition CTFHelper.h:305
value_type operator[](difference_type i) const
Definition CTFHelper.h:164
value_type operator*() const
Definition CTFHelper.h:323
value_type operator[](difference_type i) const
Definition CTFHelper.h:324
value_type operator[](difference_type i) const
Definition CTFHelper.h:247
value_type operator*() const
Definition CTFHelper.h:246
value_type operator[](difference_type i) const
Definition CTFHelper.h:209
value_type operator[](difference_type i) const
Definition CTFHelper.h:199
value_type operator[](difference_type i) const
Definition CTFHelper.h:185
value_type operator[](difference_type i) const
Definition CTFHelper.h:238
value_type operator*() const
Definition CTFHelper.h:273
value_type operator[](difference_type i) const
Definition CTFHelper.h:274
value_type operator[](difference_type i) const
Definition CTFHelper.h:256
value_type operator*() const
Definition CTFHelper.h:255
value_type operator[](difference_type i) const
Definition CTFHelper.h:265
I & operator+=(difference_type i) noexcept
Definition CTFHelper.h:106
I & operator++() noexcept
Definition CTFHelper.h:80
friend I operator+(difference_type i, const I &iter)
Definition CTFHelper.h:132
I & operator--() noexcept
Definition CTFHelper.h:93
bool operator>(const I &other) const noexcept
Definition CTFHelper.h:136
I operator-(difference_type i) const
Definition CTFHelper.h:124
std::ptrdiff_t difference_type
Definition CTFHelper.h:71
bool operator<=(const I &other) const noexcept
Definition CTFHelper.h:139
I & operator-=(difference_type i) noexcept
Definition CTFHelper.h:118
std::random_access_iterator_tag iterator_category
Definition CTFHelper.h:75
bool operator>=(const I &other) const noexcept
Definition CTFHelper.h:138
difference_type mIndex
Definition CTFHelper.h:143
I operator+(difference_type i) const
Definition CTFHelper.h:112
bool operator!=(const I &other) const noexcept
Definition CTFHelper.h:134
gsl::span< const D > mData
Definition CTFHelper.h:142
bool operator<(const I &other) const noexcept
Definition CTFHelper.h:137
difference_type operator-(const I &other) const noexcept
Definition CTFHelper.h:130
_Iter(const gsl::span< const D > &data, bool end=false)
Definition CTFHelper.h:77
bool operator==(const I &other) const noexcept
Definition CTFHelper.h:135
Iter_orbitIncTrig begin_orbitIncTrig() const
Definition CTFHelper.h:345
Iter_pidTrk end_pidTrk() const
Definition CTFHelper.h:370
Iter_HCIDTrk begin_HCIDTrk() const
Definition CTFHelper.h:354
CTFHeader createHeader()
Definition CTFHelper.h:50
Iter_entriesDig end_entriesDig() const
Definition CTFHelper.h:352
Iter_chanDig begin_chanDig() const
Definition CTFHelper.h:381
Iter_bcIncTrig end_bcIncTrig() const
Definition CTFHelper.h:343
Iter_entriesDig begin_entriesDig() const
Definition CTFHelper.h:351
Iter_CIDDig end_CIDDig() const
Definition CTFHelper.h:373
Iter_slopeTrk end_slopeTrk() const
Definition CTFHelper.h:367
Iter_CIDDig begin_CIDDig() const
Definition CTFHelper.h:372
size_t getSize() const
Definition CTFHelper.h:64
Iter_orbitIncTrig end_orbitIncTrig() const
Definition CTFHelper.h:346
Iter_pidTrk begin_pidTrk() const
Definition CTFHelper.h:369
Iter_posTrk end_posTrk() const
Definition CTFHelper.h:364
Iter_ROBDig begin_ROBDig() const
Definition CTFHelper.h:375
Iter_MCMDig begin_MCMDig() const
Definition CTFHelper.h:378
Iter_entriesTrk end_entriesTrk() const
Definition CTFHelper.h:349
Iter_slopeTrk begin_slopeTrk() const
Definition CTFHelper.h:366
Iter_ADCDig end_ADCDig() const
Definition CTFHelper.h:385
Iter_MCMDig end_MCMDig() const
Definition CTFHelper.h:379
CTFHelper(const gsl::span< const TriggerRecord > &trgRec, const gsl::span< const Tracklet64 > &trkData, const gsl::span< const Digit > &digData)
Definition CTFHelper.h:35
Iter_posTrk begin_posTrk() const
Definition CTFHelper.h:363
Iter_entriesTrk begin_entriesTrk() const
Definition CTFHelper.h:348
Iter_ADCDig begin_ADCDig() const
Definition CTFHelper.h:384
Iter_padrowTrk begin_padrowTrk() const
Definition CTFHelper.h:357
Iter_padrowTrk end_padrowTrk() const
Definition CTFHelper.h:358
Iter_bcIncTrig begin_bcIncTrig() const
Definition CTFHelper.h:342
Iter_colTrk begin_colTrk() const
Definition CTFHelper.h:360
Iter_ROBDig end_ROBDig() const
Definition CTFHelper.h:376
Iter_colTrk end_colTrk() const
Definition CTFHelper.h:361
Iter_chanDig end_chanDig() const
Definition CTFHelper.h:382
Iter_HCIDTrk end_HCIDTrk() const
Definition CTFHelper.h:355
Header for data corresponding to the same hardware trigger adapted from DataFormatsITSMFT/ROFRecord.
GLsizeiptr size
Definition glcorearb.h:659
GLuint GLuint end
Definition glcorearb.h:469
GLboolean * data
Definition glcorearb.h:298
GLuint id
Definition glcorearb.h:650
constexpr int TIMEBINS
the number of time bins
Definition Constants.h:74
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Header for a single CTF.
Definition CTF.h:29
VectorOfTObjectPtrs other