Project
Loading...
Searching...
No Matches
RecoContainerCreateTracksVariadic.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
17#include "Framework/InputSpec.h"
25
29
35
37
62
65
66//________________________________________________________
67template <class T>
69{
70 // We go from most complete tracks to least complete ones, taking into account that some track times
71 // do not bear their own kinematics but just constrain the time
72 // As we get more track types functional, this method should be completed
73 // If user provided function creator returns true, then the track is considered as consumed and its contributing
74 // simpler tracks will not be provided to the creator. If it returns false, the creator will be called also
75 // with this simpler contrubutors.
76 // The creator function is called with track kinematics, track GlobalTrackID and track timing information as 2 floats
77 // which depends on the track time:
78 // 1) For track types containing TimeStampWithError ts it is ts.getTimeStamp(), getTimeStampError()
79 // 2) For tracks with asymmetric time uncertainty, e.g. TPC: as mean time of t0-errBwd,t+errFwd and 0.5(errBwd+errFwd), all in TPC time bins
80 // 3) For tracks whose timing is provided as RO frame: as time in \mus for RO frame start since the start of TF, half-duration of RO window.
81
82 auto start_time = std::chrono::high_resolution_clock::now();
83 constexpr float PS2MUS = 1e-6;
84 std::array<std::vector<uint8_t>, GTrackID::NSources> usedData;
85 auto flagUsed2 = [&usedData](int idx, int src) {
86 if (!usedData[src].empty()) {
87 usedData[src][idx] = 1;
88 }
89 };
90 auto flagUsed = [&usedData, &flagUsed2](const GTrackID gidx) { flagUsed2(gidx.getIndex(), gidx.getSource()); };
91 auto isUsed2 = [&usedData](int idx, int src) { return (!usedData[src].empty()) && (usedData[src][idx] != 0); };
92 auto isUsed = [&usedData, isUsed2](const GTrackID gidx) { return isUsed2(gidx.getIndex(), gidx.getSource()); };
93
94 // create only for those data types which are used
95 const auto tracksITS = getITSTracks();
96 const auto trkITABRefs = getITSABRefs();
97 const auto tracksMFT = getMFTTracks();
98 const auto tracksMCH = getMCHTracks();
99 const auto tracksMID = getMIDTracks();
100 const auto tracksTPC = getTPCTracks();
101 const auto tracksTPCITS = getTPCITSTracks();
102 const auto tracksMFTMCH = getGlobalFwdTracks();
103 const auto matchesMCHMID = getMCHMIDMatches();
104 const auto tracksTPCTOF = getTPCTOFTracks(); // TOF-TPC tracks with refit
105 const auto matchesTPCTOF = getTPCTOFMatches(); // and corresponding matches
106 const auto tracksTPCTRD = getTPCTRDTracks<o2::trd::TrackTRD>();
107 const auto matchesITSTPCTOF = getITSTPCTOFMatches(); // just matches, no refit done
108 const auto matchesTPCTRDTOF = getTPCTRDTOFMatches(); // just matches, no refit done
109 const auto matchesITSTPCTRDTOF = getITSTPCTRDTOFMatches(); // just matches, no refit done
110 const auto tofClusters = getTOFClusters();
111 const auto tracksITSTPCTRD = getITSTPCTRDTracks<o2::trd::TrackTRD>();
112
113 const auto trigTPCTRD = getTPCTRDTriggers();
114
115 usedData[GTrackID::ITS].resize(tracksITS.size()); // to flag used ITS tracks
116 usedData[GTrackID::MCH].resize(tracksMCH.size()); // to flag used MCH tracks
117 usedData[GTrackID::MFT].resize(tracksMFT.size()); // to flag used MFT tracks
118 usedData[GTrackID::MID].resize(tracksMID.size()); // to flag used MFT tracks
119 usedData[GTrackID::TPC].resize(tracksTPC.size()); // to flag used TPC tracks
120 usedData[GTrackID::ITSTPC].resize(tracksTPCITS.size()); // to flag used ITSTPC tracks
121 usedData[GTrackID::MFTMCH].resize(tracksMFTMCH.size()); // to flag used MFTMCH tracks
122 usedData[GTrackID::ITSTPCTRD].resize(tracksITSTPCTRD.size()); // to flag used ITSTPCTRD tracks
123 usedData[GTrackID::TPCTRD].resize(tracksTPCTRD.size()); // to flag used TPCTRD tracks
124 usedData[GTrackID::ITSTPCTRD].resize(tracksITSTPCTRD.size()); // to flag used TPCTRD tracks
125 usedData[GTrackID::ITSTPCTOF].resize(getITSTPCTOFMatches().size()); // to flag used ITSTPC-TOF matches
126 usedData[GTrackID::TPCTRDTOF].resize(getTPCTRDTOFMatches().size()); // to flag used ITSTPC-TOF matches
127 usedData[GTrackID::ITSTPCTRDTOF].resize(getITSTPCTRDTOFMatches().size()); // to flag used ITSTPC-TOF matches
128
129 static int BCDiffErrCount = 0;
130 constexpr int MAXBCDiffErrCount = 5;
131 GTrackID::Source currentSource = GTrackID::NSources;
132 auto getBCDiff = [startIR = this->startIR, &currentSource](const o2::InteractionRecord& ir) {
133 auto bcd = ir.differenceInBC(startIR);
134 if (uint64_t(bcd) > o2::constants::lhc::LHCMaxBunches * 256 && BCDiffErrCount < MAXBCDiffErrCount) {
135 LOGP(alarm, "ATTENTION: wrong bunches diff. {} for current IR {} wrt 1st TF orbit {}, source:{}", bcd, ir.asString(), startIR.asString(), GTrackID::getSourceName(currentSource));
136 BCDiffErrCount++;
137 }
138 return bcd;
139 };
140
141 // ITS-TPC-TRD-TOF
142 {
143 currentSource = GTrackID::ITSTPCTRDTOF;
144 if (srcSel[currentSource]) {
145 if (matchesITSTPCTRDTOF.size() && (!tofClusters.size() || !tracksITSTPCTRD.size())) {
146 throw std::runtime_error(fmt::format("Global-TOF tracks ({}) require ITS-TPC-TRD tracks ({}) and TOF clusters ({})",
147 matchesITSTPCTRDTOF.size(), tracksITSTPCTRD.size(), tofClusters.size()));
148 }
149 for (unsigned i = 0; i < matchesITSTPCTRDTOF.size(); i++) {
150 const auto& match = matchesITSTPCTRDTOF[i];
151 auto gidx = match.getTrackRef(); // this should be corresponding ITS-TPC-TRD track
152 // no need to check isUsed: by construction this ITS-TPC-TRD was not used elsewhere
153 // const auto& tofCl = tofClusters[match.getTOFClIndex()];
154 float timeTOFMUS = (match.getSignal() - match.getLTIntegralOut().getTOF(o2::track::PID::Pion)) * PS2MUS; // tof time in \mus, FIXME: account for time of flight to R TOF
155 const float timeErr = 0.010f; // assume 10 ns error FIXME
156 if (creator(tracksITSTPCTRD[gidx.getIndex()], {i, currentSource}, timeTOFMUS, timeErr)) {
157 flagUsed(gidx); // flag used ITS-TPC-TRD tracks
158 }
159 }
160 }
161 }
162
163 // TPC-TRD-TOF
164 {
165 currentSource = GTrackID::TPCTRDTOF;
166 if (srcSel[currentSource]) {
167 if (matchesTPCTRDTOF.size() && (!tofClusters.size() || !tracksTPCTRD.size())) {
168 throw std::runtime_error(fmt::format("Global-TOF tracks ({}) require TPC-TRD tracks ({}) and TOF clusters ({})",
169 matchesTPCTRDTOF.size(), tracksTPCTRD.size(), tofClusters.size()));
170 }
171 for (unsigned i = 0; i < matchesTPCTRDTOF.size(); i++) {
172 const auto& match = matchesTPCTRDTOF[i];
173 auto gidx = match.getTrackRef(); // this should be corresponding TPC-TRD track
174 // const auto& tofCl = tofClusters[match.getTOFClIndex()];
175 float timeTOFMUS = (match.getSignal() - match.getLTIntegralOut().getTOF(o2::track::PID::Pion)) * PS2MUS; // tof time in \mus, FIXME: account for time of flight to R TOF
176 const float timeErr = 0.010f; // assume 10 ns error FIXME
177 if (creator(tracksTPCTRD[gidx.getIndex()], {i, currentSource}, timeTOFMUS, timeErr)) {
178 flagUsed(gidx); // flag used TPC-TRD tracks
179 }
180 }
181 }
182 }
183
184 // ITS-TPC-TRD
185 {
186 currentSource = GTrackID::ITSTPCTRD;
187 if (srcSel[currentSource]) {
188 const auto trigITSTPCTRD = getITSTPCTRDTriggers();
189 for (unsigned itr = 0; itr < trigITSTPCTRD.size(); itr++) {
190 const auto& trig = trigITSTPCTRD[itr];
191 auto bcdiff = getBCDiff(trig.getBCData());
192 float t0Trig = bcdiff * o2::constants::lhc::LHCBunchSpacingMUS;
193 for (unsigned int i = trig.getTrackRefs().getFirstEntry(); i < (unsigned int)trig.getTrackRefs().getEntriesBound(); i++) {
194 const auto& trc = tracksITSTPCTRD[i];
195 if (isUsed2(i, currentSource)) {
196 flagUsed(trc.getRefGlobalTrackId()); // flag seeding ITS-TPC track
197 continue;
198 }
199 float t0Err = 5.e-3; // 5ns nominal error
200 if (trc.hasPileUpInfo()) { // distance to farthest collision within the pileup integration time
201 t0Err += trc.getPileUpTimeErrorMUS();
202 }
203 if (creator(trc, {i, currentSource}, t0Trig, t0Err)) { // assign 1ns error to BC
204 flagUsed(trc.getRefGlobalTrackId()); // flag seeding ITS-TPC track
205 }
206 }
207 }
208 }
209 }
210
211 // ITS-TPC-TOF matches, these are just MatchInfoTOF objects, pointing on ITS-TPC match and TOF cl.
212 {
213 currentSource = GTrackID::ITSTPCTOF;
214 if (srcSel[currentSource]) {
215 if (matchesITSTPCTOF.size() && (!tofClusters.size() || !tracksTPCITS.size())) {
216 throw std::runtime_error(fmt::format("Global-TOF tracks ({}) require ITS-TPC tracks ({}) and TOF clusters ({})",
217 matchesITSTPCTOF.size(), tracksTPCITS.size(), tofClusters.size()));
218 }
219 for (unsigned i = 0; i < matchesITSTPCTOF.size(); i++) {
220 const auto& match = matchesITSTPCTOF[i];
221 auto gidx = match.getTrackRef(); // this should be corresponding ITS-TPC track
222 if (isUsed(gidx)) { // RS FIXME: THIS IS TEMPORARY, until the TOF matching will use ITS-TPC-TRD as an input
223 continue;
224 }
225 // no need to check isUsed: by construction this ITS-TPC was not used elsewhere
226 // const auto& tofCl = tofClusters[match.getTOFClIndex()];
227 float timeTOFMUS = (match.getSignal() - match.getLTIntegralOut().getTOF(o2::track::PID::Pion)) * PS2MUS; // tof time in \mus, FIXME: account for time of flight to R TOF
228 const float timeErr = 0.010f; // assume 10 ns error FIXME
229 if (creator(tracksTPCITS[gidx.getIndex()], {i, currentSource}, timeTOFMUS, timeErr)) {
230 flagUsed(gidx); // flag used ITS-TPC tracks
231 }
232 }
233 }
234 }
235
236 // TPC-TRD
237 {
238 currentSource = GTrackID::TPCTRD;
239 if (srcSel[currentSource]) {
240 const auto trigTPCTRD = getTPCTRDTriggers();
241 for (unsigned itr = 0; itr < trigTPCTRD.size(); itr++) {
242 const auto& trig = trigTPCTRD[itr];
243 auto bcdiff = getBCDiff(trig.getBCData());
244 float t0Trig = bcdiff * o2::constants::lhc::LHCBunchSpacingMUS;
245 for (unsigned int i = trig.getTrackRefs().getFirstEntry(); i < (unsigned int)trig.getTrackRefs().getEntriesBound(); i++) {
246 const auto& trc = tracksTPCTRD[i];
247 if (isUsed2(i, currentSource)) {
248 flagUsed(trc.getRefGlobalTrackId()); // flag seeding TPC track
249 continue;
250 }
251 float t0Err = 5.e-3; // 5ns nominal error
252 if (trc.hasPileUpInfo()) { // distance to farthest collision within the pileup integration time
253 t0Err += trc.getPileUpTimeErrorMUS();
254 }
255 if (creator(trc, {i, currentSource}, t0Trig, t0Err)) { // assign 1ns error to BC
256 flagUsed(trc.getRefGlobalTrackId()); // flag seeding TPC track
257 }
258 }
259 }
260 }
261 }
262
263 // ITS-TPC matches
264 {
265 currentSource = GTrackID::ITSTPC;
266 if (srcSel[currentSource]) {
267 for (unsigned i = 0; i < tracksTPCITS.size(); i++) {
268 const auto& matchTr = tracksTPCITS[i];
269 if (isUsed2(i, currentSource)) {
270 flagUsed(matchTr.getRefITS()); // flag used ITS tracks or AB tracklets (though the latter is not really necessary)
271 flagUsed(matchTr.getRefTPC()); // flag used TPC tracks
272 continue;
273 }
274 if (creator(matchTr, {i, currentSource}, matchTr.getTimeMUS().getTimeStamp(), matchTr.getTimeMUS().getTimeStampError())) {
275 flagUsed(matchTr.getRefITS()); // flag used ITS tracks or AB tracklets (though the latter is not really necessary)
276 flagUsed(matchTr.getRefTPC()); // flag used TPC tracks
277 }
278 }
279 }
280 }
281
282 // TPC-TOF matches
283 {
284 currentSource = GTrackID::TPCTOF;
285 if (srcSel[currentSource]) {
286 if (matchesTPCTOF.size() && !tracksTPCTOF.size()) {
287 throw std::runtime_error(fmt::format("TPC-TOF matched tracks ({}) require TPCTOF matches ({}) and TPCTOF tracks ({})",
288 -1, matchesTPCTOF.size(), tracksTPCTOF.size()));
289 }
290 for (unsigned i = 0; i < matchesTPCTOF.size(); i++) {
291 const auto& match = matchesTPCTOF[i];
292 const auto& gidx = match.getTrackRef(); // TPC track global idx
293 if (isUsed(gidx)) { // flag used TPC tracks
294 continue;
295 }
296 const auto& trc = tracksTPCTOF[i];
297 if (creator(trc, {i, currentSource}, trc.getTimeMUS().getTimeStamp(), trc.getTimeMUS().getTimeStampError())) {
298 flagUsed(gidx); // flag used TPC tracks
299 }
300 }
301 }
302 }
303
304 // MFT-MCH tracks
305 {
306 currentSource = GTrackID::MFTMCH;
307 if (srcSel[currentSource]) {
308 for (unsigned i = 0; i < tracksMFTMCH.size(); i++) {
309 const auto& matchTr = tracksMFTMCH[i];
310 if (creator(matchTr, {i, currentSource}, matchTr.getTimeMUS().getTimeStamp(), matchTr.getTimeMUS().getTimeStampError())) {
311 flagUsed2(matchTr.getMFTTrackID(), GTrackID::MFT);
312 flagUsed2(matchTr.getMCHTrackID(), GTrackID::MCH);
313 }
314 }
315 }
316 }
317
318 // MCH-MID matches
319 {
320 currentSource = GTrackID::MCHMID;
321 if (srcSel[currentSource]) {
322 if (matchesMCHMID.size() && !tracksMCH.size()) {
323 throw std::runtime_error(fmt::format("MCH-MID matched tracks ({}) require MCHMID matches ({}) and MCH tracks ({})",
324 -1, matchesMCHMID.size(), tracksMCH.size()));
325 }
326 for (unsigned i = 0; i < matchesMCHMID.size(); i++) {
327 const auto& match = matchesMCHMID[i];
328 auto [trcTime, isInTF] = match.getTimeMUS(startIR, 256, BCDiffErrCount < MAXBCDiffErrCount);
329 if (!isInTF && BCDiffErrCount < MAXBCDiffErrCount) {
330 BCDiffErrCount++;
331 }
332 auto gidxMCH = match.getMCHRef();
333 const auto& trc = tracksMCH[gidxMCH.getIndex()];
334 if (creator(trc, {i, currentSource}, trcTime.getTimeStamp(), trcTime.getTimeStampError())) {
335 flagUsed(gidxMCH); // flag used MCH tracks
336 flagUsed(match.getMIDRef()); // flag used MID tracks (if requested)
337 }
338 }
339 }
340 }
341
342 // ITS only tracks
343 {
344 currentSource = GTrackID::ITS;
345 if (srcSel[currentSource]) {
346 const auto& rofrs = getITSTracksROFRecords();
347 for (unsigned irof = 0; irof < rofrs.size(); irof++) {
348 const auto& rofRec = rofrs[irof];
349 auto bcdiff = getBCDiff(rofRec.getBCData());
350 float t0 = bcdiff * o2::constants::lhc::LHCBunchSpacingNS * 1e-3;
351 int trlim = rofRec.getFirstEntry() + rofRec.getNEntries();
352 for (int it = rofRec.getFirstEntry(); it < trlim; it++) {
353 if (isUsed2(it, currentSource)) { // skip used tracks
354 continue;
355 }
356 GTrackID gidITS(it, currentSource);
357 const auto& trc = tracksITS[it];
358 creator(trc, gidITS, t0, 0.5);
359 }
360 }
361 }
362 }
363
364 // MFT only tracks
365 {
366 currentSource = GTrackID::MFT;
367 if (srcSel[currentSource]) {
368 const auto& rofrs = getMFTTracksROFRecords();
369 for (unsigned irof = 0; irof < rofrs.size(); irof++) {
370 const auto& rofRec = rofrs[irof];
371 auto bcdiff = getBCDiff(rofRec.getBCData());
372 float t0 = bcdiff * o2::constants::lhc::LHCBunchSpacingNS * 1e-3;
373 int trlim = rofRec.getFirstEntry() + rofRec.getNEntries();
374 for (int it = rofRec.getFirstEntry(); it < trlim; it++) {
375 if (isUsed2(it, currentSource)) {
376 continue;
377 }
378 GTrackID gidMFT(it, currentSource);
379 const auto& trc = tracksMFT[it];
380 creator(trc, gidMFT, t0, 0.5);
381 }
382 }
383 }
384 }
385
386 // MCH standalone tracks
387 {
388 currentSource = GTrackID::MCH;
389 if (srcSel[currentSource]) {
390 const auto& rofs = getMCHTracksROFRecords();
391 for (const auto& rof : rofs) {
392 if (rof.getNEntries() == 0) {
393 continue;
394 }
395 auto [trcTime, isInTF] = rof.getTimeMUS(startIR, 256, BCDiffErrCount < MAXBCDiffErrCount);
396 if (!isInTF && BCDiffErrCount < MAXBCDiffErrCount) {
397 BCDiffErrCount++;
398 }
399 for (int idx = rof.getFirstIdx(); idx <= rof.getLastIdx(); ++idx) {
400 if (isUsed2(idx, currentSource)) {
401 continue;
402 }
403 GTrackID gidMCH(idx, currentSource);
404 const auto& trc = tracksMCH[idx];
405 creator(trc, gidMCH, trcTime.getTimeStamp(), trcTime.getTimeStampError());
406 }
407 }
408 }
409 }
410
411 // MID standalone tracks
412 {
413 currentSource = GTrackID::MID;
414 if (srcSel[currentSource]) {
415 const auto& rofs = getMIDTracksROFRecords();
416 for (const auto& rof : rofs) {
417 if (rof.nEntries == 0) {
418 continue;
419 }
420 auto [trcTime, isInTF] = rof.getTimeMUS(startIR, 256, BCDiffErrCount < MAXBCDiffErrCount);
421 if (!isInTF && BCDiffErrCount < MAXBCDiffErrCount) {
422 BCDiffErrCount++;
423 }
424 if (trcTime.getTimeStamp() < 0.f) {
425 if (BCDiffErrCount - 1 < MAXBCDiffErrCount) {
426 LOGP(alarm, "Skipping MID ROF with {} entries since it precedes TF start", rof.nEntries);
427 }
428 continue;
429 }
430 for (int idx = rof.firstEntry; idx < rof.getEndIndex(); ++idx) {
431 if (isUsed2(idx, currentSource)) {
432 continue;
433 }
434 GTrackID gidMID(idx, currentSource);
435 const auto& trc = tracksMID[idx];
436 creator(trc, gidMID, trcTime.getTimeStamp(), trcTime.getTimeStampError());
437 }
438 }
439 }
440 }
441
442 // TPC only tracks
443 {
444 currentSource = GTrackID::TPC;
445 if (srcSel[currentSource]) {
446 int nacc = 0, noffer = 0;
447 for (unsigned i = 0; i < tracksTPC.size(); i++) {
448 if (isUsed2(i, currentSource)) { // skip used tracks
449 continue;
450 }
451 const auto& trc = tracksTPC[i];
452 creator(trc, {i, currentSource}, trc.getTime0() + 0.5 * (trc.getDeltaTFwd() - trc.getDeltaTBwd()), 0.5 * (trc.getDeltaTFwd() + trc.getDeltaTBwd()));
453 }
454 }
455 }
456
457 auto current_time = std::chrono::high_resolution_clock::now();
458 LOG(info) << "RecoContainer::createTracks took " << std::chrono::duration_cast<std::chrono::microseconds>(current_time - start_time).count() * 1e-6 << " CPU s.";
459}
460
461template <class T>
462inline constexpr auto isITSTrack()
463{
464 return std::is_same_v<std::decay_t<T>, o2::its::TrackITS>;
465}
466
467template <class T>
468inline constexpr auto isITSABRef()
469{
470 return std::is_same_v<std::decay_t<T>, o2::itsmft::TrkClusRef>;
471}
472
473template <class T>
474inline constexpr auto isMFTTrack()
475{
476 return std::is_same_v<std::decay_t<T>, o2::mft::TrackMFT>;
477}
478
479template <class T>
480inline constexpr auto isMCHTrack()
481{
482 return std::is_same_v<std::decay_t<T>, o2::mch::TrackMCH>;
483}
484
485template <class T>
486inline constexpr auto isMIDTrack()
487{
488 return std::is_same_v<std::decay_t<T>, o2::mid::Track>;
489}
490
491template <class T>
492inline constexpr auto isTPCTrack()
493{
494 return std::is_same_v<std::decay_t<T>, o2::tpc::TrackTPC>;
495}
496
497template <class T>
498inline constexpr auto isTRDTrack()
499{
500 return std::is_same_v<std::decay_t<T>, o2::trd::TrackTRD>;
501}
502
503template <class T>
504inline constexpr auto isTPCTOFTrack()
505{
506 return std::is_same_v<std::decay_t<T>, o2::dataformats::TrackTPCTOF>;
507}
508
509template <class T>
510inline constexpr auto isTPCITSTrack()
511{
512 return std::is_same_v<std::decay_t<T>, o2::dataformats::TrackTPCITS>;
513}
514
515template <class T>
516inline constexpr auto isGlobalFwdTrack()
517{
518 return std::is_same_v<std::decay_t<T>, o2::dataformats::GlobalFwdTrack>;
519}
520
521template <class T>
522inline constexpr auto isBarrelTrack()
523{
524 return std::is_base_of<o2::track::TrackParF, std::decay_t<T>>::value || std::is_base_of<o2::track::TrackParD, std::decay_t<T>>::value;
525}
Definition of the ITSMFT compact cluster.
Wrapper container for different reconstructed object types.
Definition of the MCH cluster minimal structure.
Reconstructed MID cluster.
Label for MID.
Reconstructed MID track.
Definition of the TOF cluster.
definition of CTPDigit, CTPInputDigit
Definition of the FIT RecPoints class.
Definition of the FV0 RecPoints class.
int32_t i
Global Forward Muon tracks.
Definition of the ITSMFT ROFrame (trigger) record.
Label for MID clusters.
Definition of the MCH ROFrame record.
Definition of the MID event record.
Class to store the output of the matching to HMPID.
Class to store the output of the matching to TOF.
Class to describe reconstructed ZDC event (single BC with signal in one of detectors)
Definition of the FDD RecPoint class.
constexpr auto isMCHTrack()
constexpr auto isITSABRef()
constexpr auto isTPCITSTrack()
constexpr auto isTRDTrack()
constexpr auto isITSTrack()
constexpr auto isMFTTrack()
constexpr auto isMIDTrack()
constexpr auto isGlobalFwdTrack()
constexpr auto isBarrelTrack()
constexpr auto isTPCTOFTrack()
constexpr auto isTPCTrack()
Struct for input data required by TRD tracking workflow.
Definition of the ITS track.
Definition of the MUON track.
Definition of the MCH track.
Result of refitting TPC-ITS matched track.
Result of refitting TPC with TOF match constraint.
Helper class to obtain TPC clusters / digits / labels from DPL.
Definitions of TPC Zero Suppression Data Headers.
MCH track external format.
Definition TrackMCH.h:34
This class defines the MID track.
Definition Track.h:30
static constexpr ID Pion
Definition PID.h:96
bool match(const std::vector< std::string > &queries, const char *pattern)
Definition dcs-ccdb.cxx:229
GLenum src
Definition glcorearb.h:1767
GLsizeiptr size
Definition glcorearb.h:659
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
Definition glcorearb.h:5034
constexpr double LHCBunchSpacingMUS
constexpr int LHCMaxBunches
constexpr double LHCBunchSpacingNS
void empty(int)
std::string asString() const
int64_t differenceInBC(const InteractionRecord &other) const
void createTracksVariadic(T creator, GTrackID::mask_t srcSel=GTrackID::getSourcesMask("all")) const
static constexpr float PS2MUS
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
o2::InteractionRecord ir(0, 0)