Project
Loading...
Searching...
No Matches
AnalysisDataModel.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#ifndef O2_FRAMEWORK_ANALYSISDATAMODEL_H_
12#define O2_FRAMEWORK_ANALYSISDATAMODEL_H_
13
14#include "Framework/ASoA.h"
15
16#include <cmath>
17#include <bitset>
18#include <limits>
19#include <numeric>
20
21#include "Framework/DataTypes.h"
27#include "Framework/PID.h"
28
29namespace o2
30{
31namespace aod
32{
33namespace bc
34{
35DECLARE_SOA_COLUMN(RunNumber, runNumber, int);
36DECLARE_SOA_COLUMN(GlobalBC, globalBC, uint64_t);
37DECLARE_SOA_COLUMN(TriggerMask, triggerMask, uint64_t);
38DECLARE_SOA_COLUMN(InputMask, inputMask, uint64_t);
39DECLARE_SOA_COLUMN(Flags, flags, uint8_t);
40} // namespace bc
41
42DECLARE_SOA_TABLE(BCs_000, "AOD", "BC",
44 bc::RunNumber, bc::GlobalBC,
45 bc::TriggerMask);
46DECLARE_SOA_TABLE_VERSIONED(BCs_001, "AOD", "BC", 1,
48 bc::RunNumber, bc::GlobalBC,
49 bc::TriggerMask, bc::InputMask);
50DECLARE_SOA_TABLE(BCFlags, "AOD", "BCFLAG",
51 bc::Flags);
52
53using BCs = BCs_001; // current version
54using BC = BCs::iterator;
55
56namespace timestamp
57{
58DECLARE_SOA_COLUMN(Timestamp, timestamp, uint64_t);
59} // namespace timestamp
60
61DECLARE_SOA_TABLE(Timestamps, "AOD", "TIMESTAMPS",
62 timestamp::Timestamp);
63
65} // namespace aod
66
67namespace soa
68{
69extern template struct JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::BCs, aod::Timestamps>;
70}
71namespace aod
72{
73namespace collision
74{
76DECLARE_SOA_COLUMN(PosX, posX, float);
77DECLARE_SOA_COLUMN(PosY, posY, float);
78DECLARE_SOA_COLUMN(PosZ, posZ, float);
79DECLARE_SOA_COLUMN(CovXX, covXX, float);
80DECLARE_SOA_COLUMN(CovXY, covXY, float);
81DECLARE_SOA_COLUMN(CovXZ, covXZ, float);
82DECLARE_SOA_COLUMN(CovYY, covYY, float);
83DECLARE_SOA_COLUMN(CovYZ, covYZ, float);
84DECLARE_SOA_COLUMN(CovZZ, covZZ, float);
85DECLARE_SOA_COLUMN(Flags, flags, uint16_t);
86DECLARE_SOA_COLUMN(Chi2, chi2, float);
87DECLARE_SOA_COLUMN(NumContrib, numContrib, uint16_t);
88DECLARE_SOA_COLUMN(CollisionTime, collisionTime, float);
89DECLARE_SOA_COLUMN(CollisionTimeRes, collisionTimeRes, float);
90} // namespace collision
91
92DECLARE_SOA_TABLE(Collisions_000, "AOD", "COLLISION",
93 o2::soa::Index<>, collision::BCId,
94 collision::PosX, collision::PosY, collision::PosZ,
95 collision::CovXX, collision::CovXY, collision::CovXZ, collision::CovYY, collision::CovYZ, collision::CovZZ,
96 collision::Flags, collision::Chi2, collision::NumContrib,
97 collision::CollisionTime, collision::CollisionTimeRes);
98
99DECLARE_SOA_TABLE_VERSIONED(Collisions_001, "AOD", "COLLISION", 1,
100 o2::soa::Index<>, collision::BCId,
101 collision::PosX, collision::PosY, collision::PosZ,
102 collision::CovXX, collision::CovXY, collision::CovYY, collision::CovXZ, collision::CovYZ, collision::CovZZ,
103 collision::Flags, collision::Chi2, collision::NumContrib,
104 collision::CollisionTime, collision::CollisionTimeRes);
105
106using Collisions = Collisions_001; // current version
107using Collision = Collisions::iterator;
108
109// NOTE Relation between Collisions and BC table
110// (important for pp in case of ambiguous assignment)
111// A collision entry points to the entry in the BC table based on the calculated BC from the collision time
112// To study other compatible triggers with the collision time, check the tutorial: compatibleBCs.cxx
113
114namespace track
115{
116// TRACKPAR TABLE definition
118DECLARE_SOA_COLUMN(TrackType, trackType, uint8_t);
120DECLARE_SOA_COLUMN(Alpha, alpha, float);
123DECLARE_SOA_COLUMN(Snp, snp, float);
124DECLARE_SOA_COLUMN(Tgl, tgl, float);
125DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float);
126DECLARE_SOA_EXPRESSION_COLUMN(Phi, phi, float,
127 ifnode(nasin(aod::track::snp) + aod::track::alpha < 0.0f, nasin(aod::track::snp) + aod::track::alpha + o2::constants::math::TwoPI,
128 ifnode(nasin(aod::track::snp) + aod::track::alpha >= o2::constants::math::TwoPI, nasin(aod::track::snp) + aod::track::alpha - o2::constants::math::TwoPI,
129 nasin(aod::track::snp) + aod::track::alpha)));
131 -1.f * nlog(ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl))));
133 ifnode(nabs(aod::track::signed1Pt) <= o2::constants::math::Almost0, o2::constants::math::VeryBig, nabs(1.f / aod::track::signed1Pt)));
134DECLARE_SOA_DYNAMIC_COLUMN(IsWithinBeamPipe, isWithinBeamPipe,
135 [](float x) -> bool { return (std::fabs(x) < o2::constants::geom::XBeamPipeOuterRef); });
137 [](float signed1Pt) -> short { return (signed1Pt > 0) ? 1 : -1; });
139 [](float signed1Pt, float snp, float alpha) -> float {
140 auto pt = 1.f / std::abs(signed1Pt);
141 // FIXME: GCC & clang should optimize to sincosf
142 float cs = cosf(alpha), sn = sinf(alpha);
143 auto r = std::sqrt((1.f - snp) * (1.f + snp));
144 return pt * (r * cs - snp * sn);
145 });
147 [](float signed1Pt, float snp, float alpha) -> float {
148 auto pt = 1.f / std::abs(signed1Pt);
149 // FIXME: GCC & clang should optimize to sincosf
150 float cs = cosf(alpha), sn = sinf(alpha);
151 auto r = std::sqrt((1.f - snp) * (1.f + snp));
152 return pt * (snp * cs + r * sn);
153 });
155 [](float signed1Pt, float tgl) -> float {
156 auto pt = 1.f / std::abs(signed1Pt);
157 return pt * tgl;
158 });
160 [](float signed1Pt, float snp, float alpha, float tgl) -> std::array<float, 3> {
161 const auto pt = 1.f / std::abs(signed1Pt);
162 // FIXME: GCC & clang should optimize to sincosf
163 const float cs = cosf(alpha), sn = sinf(alpha);
164 const auto r = std::sqrt((1.f - snp) * (1.f + snp));
165 const auto px = pt * (r * cs - snp * sn);
166 const auto py = pt * (snp * cs + r * sn);
167 const auto pz = pt * tgl;
168 return std::array<float, 3>{px, py, pz};
169 });
171 ifnode(nabs(aod::track::signed1Pt) <= o2::constants::math::Almost0, o2::constants::math::VeryBig, 0.5f * (ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl)) + 1.f / ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl))) / nabs(aod::track::signed1Pt)));
173 [](float signed1Pt, float tgl, float mass) -> float {
174 const auto pt = 1.f / std::abs(signed1Pt);
175 const auto p = 0.5f * (std::tan(o2::constants::math::PIQuarter - 0.5f * std::atan(tgl)) + 1.f / std::tan(o2::constants::math::PIQuarter - 0.5f * std::atan(tgl))) * pt;
176 return std::sqrt(p * p + mass * mass);
177 });
178DECLARE_SOA_DYNAMIC_COLUMN(Rapidity, rapidity,
179 [](float signed1Pt, float tgl, float mass) -> float {
180 const auto pt = 1.f / std::abs(signed1Pt);
181 const auto pz = pt * tgl;
182 const auto p = 0.5f * (std::tan(o2::constants::math::PIQuarter - 0.5f * std::atan(tgl)) + 1.f / std::tan(o2::constants::math::PIQuarter - 0.5f * std::atan(tgl))) * pt;
183 const auto energy = std::sqrt(p * p + mass * mass);
184 return 0.5f * std::log((energy + pz) / (energy - pz));
185 });
186
187// TRACKPARCOV TABLE definition
188DECLARE_SOA_COLUMN(SigmaY, sigmaY, float);
189DECLARE_SOA_COLUMN(SigmaZ, sigmaZ, float);
190DECLARE_SOA_COLUMN(SigmaSnp, sigmaSnp, float);
191DECLARE_SOA_COLUMN(SigmaTgl, sigmaTgl, float);
192DECLARE_SOA_COLUMN(Sigma1Pt, sigma1Pt, float);
193DECLARE_SOA_COLUMN(RhoZY, rhoZY, int8_t);
194DECLARE_SOA_COLUMN(RhoSnpY, rhoSnpY, int8_t);
195DECLARE_SOA_COLUMN(RhoSnpZ, rhoSnpZ, int8_t);
196DECLARE_SOA_COLUMN(RhoTglY, rhoTglY, int8_t);
197DECLARE_SOA_COLUMN(RhoTglZ, rhoTglZ, int8_t);
198DECLARE_SOA_COLUMN(RhoTglSnp, rhoTglSnp, int8_t);
199DECLARE_SOA_COLUMN(Rho1PtY, rho1PtY, int8_t);
200DECLARE_SOA_COLUMN(Rho1PtZ, rho1PtZ, int8_t);
201DECLARE_SOA_COLUMN(Rho1PtSnp, rho1PtSnp, int8_t);
202DECLARE_SOA_COLUMN(Rho1PtTgl, rho1PtTgl, int8_t);
203
205 aod::track::sigmaY* aod::track::sigmaY);
207 (aod::track::rhoZY / 128.f) * (aod::track::sigmaZ * aod::track::sigmaY));
209 aod::track::sigmaZ* aod::track::sigmaZ);
210DECLARE_SOA_EXPRESSION_COLUMN(CSnpY, cSnpY, float,
211 (aod::track::rhoSnpY / 128.f) * (aod::track::sigmaSnp * aod::track::sigmaY));
212DECLARE_SOA_EXPRESSION_COLUMN(CSnpZ, cSnpZ, float,
213 (aod::track::rhoSnpZ / 128.f) * (aod::track::sigmaSnp * aod::track::sigmaZ));
214DECLARE_SOA_EXPRESSION_COLUMN(CSnpSnp, cSnpSnp, float,
215 aod::track::sigmaSnp* aod::track::sigmaSnp);
216DECLARE_SOA_EXPRESSION_COLUMN(CTglY, cTglY, float,
217 (aod::track::rhoTglY / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaY));
218DECLARE_SOA_EXPRESSION_COLUMN(CTglZ, cTglZ, float,
219 (aod::track::rhoTglZ / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaZ));
220DECLARE_SOA_EXPRESSION_COLUMN(CTglSnp, cTglSnp, float,
221 (aod::track::rhoTglSnp / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaSnp));
222DECLARE_SOA_EXPRESSION_COLUMN(CTglTgl, cTglTgl, float,
223 aod::track::sigmaTgl* aod::track::sigmaTgl);
224DECLARE_SOA_EXPRESSION_COLUMN(C1PtY, c1PtY, float,
225 (aod::track::rho1PtY / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaY));
226DECLARE_SOA_EXPRESSION_COLUMN(C1PtZ, c1PtZ, float,
227 (aod::track::rho1PtZ / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaZ));
228DECLARE_SOA_EXPRESSION_COLUMN(C1PtSnp, c1PtSnp, float,
229 (aod::track::rho1PtSnp / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaSnp));
230DECLARE_SOA_EXPRESSION_COLUMN(C1PtTgl, c1PtTgl, float,
231 (aod::track::rho1PtTgl / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaTgl));
232DECLARE_SOA_EXPRESSION_COLUMN(C1Pt21Pt2, c1Pt21Pt2, float,
233 aod::track::sigma1Pt* aod::track::sigma1Pt);
234
235// TRACKEXTRA TABLE definition
236DECLARE_SOA_COLUMN(TPCInnerParam, tpcInnerParam, float);
237DECLARE_SOA_COLUMN(Flags, flags, uint32_t);
238DECLARE_SOA_COLUMN(ITSClusterSizes, itsClusterSizes, uint32_t);
239DECLARE_SOA_COLUMN(ITSClusterMap, itsClusterMap, uint8_t);
240DECLARE_SOA_COLUMN(TPCNClsFindable, tpcNClsFindable, uint8_t);
241DECLARE_SOA_COLUMN(TPCNClsFindableMinusFound, tpcNClsFindableMinusFound, int8_t);
242DECLARE_SOA_COLUMN(TPCNClsFindableMinusPID, tpcNClsFindableMinusPID, int8_t);
243DECLARE_SOA_COLUMN(TPCNClsFindableMinusCrossedRows, tpcNClsFindableMinusCrossedRows, int8_t);
244DECLARE_SOA_COLUMN(TPCNClsShared, tpcNClsShared, uint8_t);
245DECLARE_SOA_COLUMN(ITSSharedClusterMap, itsSharedClusterMap, uint8_t);
246DECLARE_SOA_COLUMN(TRDPattern, trdPattern, uint8_t);
247DECLARE_SOA_COLUMN(ITSChi2NCl, itsChi2NCl, float);
248DECLARE_SOA_COLUMN(TPCChi2NCl, tpcChi2NCl, float);
249DECLARE_SOA_COLUMN(TRDChi2, trdChi2, float);
250DECLARE_SOA_COLUMN(TOFChi2, tofChi2, float);
251DECLARE_SOA_COLUMN(ITSSignal, itsSignal, float);
252DECLARE_SOA_COLUMN(TPCSignal, tpcSignal, float);
253DECLARE_SOA_COLUMN(TRDSignal, trdSignal, float);
254DECLARE_SOA_COLUMN(Length, length, float);
255DECLARE_SOA_COLUMN(TOFExpMom, tofExpMom, float);
256DECLARE_SOA_COLUMN(TrackEtaEMCAL, trackEtaEmcal, float);
257DECLARE_SOA_COLUMN(TrackPhiEMCAL, trackPhiEmcal, float);
258DECLARE_SOA_COLUMN(TrackTime, trackTime, float);
259DECLARE_SOA_COLUMN(TrackTimeRes, trackTimeRes, float);
260
261// expression columns changing between versions have to be declared in different namespaces
262
263DECLARE_SOA_EXPRESSION_COLUMN(DetectorMap, detectorMap, uint8_t,
264 ifnode(aod::track::itsClusterMap > (uint8_t)0, static_cast<uint8_t>(o2::aod::track::ITS), (uint8_t)0x0) |
265 ifnode(aod::track::tpcNClsFindable > (uint8_t)0, static_cast<uint8_t>(o2::aod::track::TPC), (uint8_t)0x0) |
266 ifnode(aod::track::trdPattern > (uint8_t)0, static_cast<uint8_t>(o2::aod::track::TRD), (uint8_t)0x0) |
267 ifnode((aod::track::tofChi2 >= 0.f) && (aod::track::tofExpMom > 0.f), static_cast<uint8_t>(o2::aod::track::TOF), (uint8_t)0x0));
268
269DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeEl, tofExpTimeEl,
270 [](float length, float tofExpMom) -> float {
272 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
273 });
274
275DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeMu, tofExpTimeMu,
276 [](float length, float tofExpMom) -> float {
278 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
279 });
280
281DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimePi, tofExpTimePi,
282 [](float length, float tofExpMom) -> float {
284 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
285 });
286
287DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeKa, tofExpTimeKa,
288 [](float length, float tofExpMom) -> float {
290 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
291 });
292
293DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimePr, tofExpTimePr,
294 [](float length, float tofExpMom) -> float {
296 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
297 });
298
299DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeDe, tofExpTimeDe,
300 [](float length, float tofExpMom) -> float {
302 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
303 });
304
305DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeTr, tofExpTimeTr,
306 [](float length, float tofExpMom) -> float {
308 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
309 });
310
311DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeHe, tofExpTimeHe,
312 [](float length, float tofExpMom) -> float {
314 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
315 });
316
317DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeAl, tofExpTimeAl,
318 [](float length, float tofExpMom) -> float {
320 return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
321 });
322
323namespace v001
324{
325DECLARE_SOA_EXPRESSION_COLUMN(DetectorMap, detectorMap, uint8_t,
326 ifnode(aod::track::itsClusterSizes > (uint32_t)0, static_cast<uint8_t>(o2::aod::track::ITS), (uint8_t)0x0) |
327 ifnode(aod::track::tpcNClsFindable > (uint8_t)0, static_cast<uint8_t>(o2::aod::track::TPC), (uint8_t)0x0) |
328 ifnode(aod::track::trdPattern > (uint8_t)0, static_cast<uint8_t>(o2::aod::track::TRD), (uint8_t)0x0) |
329 ifnode((aod::track::tofChi2 >= 0.f) && (aod::track::tofExpMom > 0.f), static_cast<uint8_t>(o2::aod::track::TOF), (uint8_t)0x0));
330DECLARE_SOA_DYNAMIC_COLUMN(ITSClusterMap, itsClusterMap,
331 [](uint32_t itsClusterSizes) -> uint8_t {
332 uint8_t clmap = 0;
333 for (unsigned int layer = 0; layer < 7; layer++) {
334 if ((itsClusterSizes >> (layer * 4)) & 0xf) {
335 clmap |= (1 << layer);
336 }
337 }
338 return clmap;
339 });
341 [](uint32_t itsClusterSizes) -> uint8_t {
342 uint8_t itsNcls = 0;
343 for (int layer = 0; layer < 7; layer++) {
344 if ((itsClusterSizes >> (layer * 4)) & 0xf)
345 itsNcls++;
346 }
347 return itsNcls;
348 });
349DECLARE_SOA_DYNAMIC_COLUMN(ITSNClsInnerBarrel, itsNClsInnerBarrel,
350 [](uint32_t itsClusterSizes) -> uint8_t {
351 uint8_t itsNclsInnerBarrel = 0;
352 for (int layer = 0; layer < 3; layer++) {
353 if ((itsClusterSizes >> (layer * 4)) & 0xf)
354 itsNclsInnerBarrel++;
355 }
356 return itsNclsInnerBarrel;
357 });
358DECLARE_SOA_DYNAMIC_COLUMN(ITSClsSizeInLayer, itsClsSizeInLayer,
359 [](uint32_t itsClusterSizes, int layer) -> uint8_t {
360 if (layer >= 7 || layer < 0) {
361 return 0;
362 }
363 return (itsClusterSizes >> (layer * 4)) & 0xf;
364 });
365
366DECLARE_SOA_DYNAMIC_COLUMN(IsITSAfterburner, isITSAfterburner,
367 [](uint8_t detectorMap, float itsChi2Ncl) -> bool {
368 return (detectorMap & o2::aod::track::ITS) && (itsChi2Ncl < 0.f);
369 });
370
371namespace extensions
372{
374DECLARE_SOA_DYNAMIC_COLUMN(TPCDeltaTFwd, tpcDeltaTFwd,
375 [](float timeErr, uint32_t trackType) -> float {
376 if (!(trackType & TrackFlags::TrackTimeAsym)) {
378 }
380 enc.encoding.timeErr = timeErr;
381 return enc.getDeltaTFwd();
382 });
383
384DECLARE_SOA_DYNAMIC_COLUMN(TPCDeltaTBwd, tpcDeltaTBwd,
385 [](float timeErr, uint32_t trackType) -> float {
386 if (!(trackType & TrackFlags::TrackTimeAsym)) {
388 }
390 p.encoding.timeErr = timeErr;
391 return p.getDeltaTBwd();
392 });
393} // namespace extensions
394
395} // namespace v001
396
398 [](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::ITS; });
400 [](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::TPC; });
402 [](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::TRD; });
404 [](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::TOF; });
405DECLARE_SOA_DYNAMIC_COLUMN(IsPVContributor, isPVContributor,
407DECLARE_SOA_DYNAMIC_COLUMN(PIDForTracking, pidForTracking,
408 [](uint32_t flags) -> uint32_t { return flags >> 28; });
409DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsFound, tpcNClsFound,
410 [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusFound) -> int16_t { return (int16_t)tpcNClsFindable - tpcNClsFindableMinusFound; });
411DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsPID, tpcNClsPID,
412 [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusPID) -> int16_t { return (int16_t)tpcNClsFindable - tpcNClsFindableMinusPID; });
413DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows,
414 [](uint8_t tpcNClsFindable, int8_t TPCNClsFindableMinusCrossedRows) -> int16_t { return (int16_t)tpcNClsFindable - TPCNClsFindableMinusCrossedRows; });
416 [](uint8_t itsClusterMap) -> uint8_t {
417 uint8_t itsNcls = 0;
418 constexpr uint8_t bit = 1;
419 for (int layer = 0; layer < 7; layer++) {
420 if (itsClusterMap & (bit << layer))
421 itsNcls++;
422 }
423 return itsNcls;
424 });
425DECLARE_SOA_DYNAMIC_COLUMN(ITSNClsInnerBarrel, itsNClsInnerBarrel,
426 [](uint8_t itsClusterMap) -> uint8_t {
427 uint8_t itsNclsInnerBarrel = 0;
428 constexpr uint8_t bit = 1;
429 for (int layer = 0; layer < 3; layer++) {
430 if (itsClusterMap & (bit << layer))
431 itsNclsInnerBarrel++;
432 }
433 return itsNclsInnerBarrel;
434 });
436 [](uint8_t itsSharedClusterMap) -> uint8_t {
438 constexpr uint8_t bit = 1;
439 for (int layer = 0; layer < 6; layer++) { // ITS1: 6 layers
440 if (itsSharedClusterMap & (bit << layer))
442 }
444 });
445DECLARE_SOA_DYNAMIC_COLUMN(TPCFoundOverFindableCls, tpcFoundOverFindableCls,
446 [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusFound) -> float {
447 int16_t tpcNClsFound = (int16_t)tpcNClsFindable - tpcNClsFindableMinusFound;
448 return (float)tpcNClsFound / (float)tpcNClsFindable;
449 });
450
451DECLARE_SOA_DYNAMIC_COLUMN(TPCCrossedRowsOverFindableCls, tpcCrossedRowsOverFindableCls,
452 [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusCrossedRows) -> float {
453 int16_t tpcNClsCrossedRows = (int16_t)tpcNClsFindable - tpcNClsFindableMinusCrossedRows;
454 return (float)tpcNClsCrossedRows / (float)tpcNClsFindable;
455 });
456
457DECLARE_SOA_DYNAMIC_COLUMN(TPCFractionSharedCls, tpcFractionSharedCls,
458 [](uint8_t tpcNClsShared, uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusFound) -> float {
459 int16_t tpcNClsFound = (int16_t)tpcNClsFindable - tpcNClsFindableMinusFound;
460 return (float)tpcNClsShared / (float)tpcNClsFound;
461 });
462
463DECLARE_SOA_DYNAMIC_COLUMN(TRDHasNeighbor, trdPattern,
464 [](uint8_t trdPattern) -> bool { return trdPattern & o2::aod::track::HasNeighbor; });
465
466DECLARE_SOA_DYNAMIC_COLUMN(TRDHasCrossing, trdPattern,
467 [](uint8_t trdPattern) -> bool { return trdPattern & o2::aod::track::HasCrossing; });
468
469DECLARE_SOA_DYNAMIC_COLUMN(TRDNLayers, trdPattern,
470 [](uint8_t trdPattern) -> std::size_t { return std::bitset<6>(trdPattern).count(); });
471} // namespace track
472
473DECLARE_SOA_TABLE_FULL(StoredTracks, "Tracks", "AOD", "TRACK",
474 o2::soa::Index<>, track::CollisionId, track::TrackType,
475 track::X, track::Alpha,
476 track::Y, track::Z, track::Snp, track::Tgl,
477 track::Signed1Pt, track::IsWithinBeamPipe<track::X>,
478 track::Px<track::Signed1Pt, track::Snp, track::Alpha>,
479 track::Py<track::Signed1Pt, track::Snp, track::Alpha>,
480 track::Pz<track::Signed1Pt, track::Tgl>,
481 track::PVector<track::Signed1Pt, track::Snp, track::Alpha, track::Tgl>,
482 track::Energy<track::Signed1Pt, track::Tgl>,
483 track::Rapidity<track::Signed1Pt, track::Tgl>,
484 track::Sign<track::Signed1Pt>,
486
487DECLARE_SOA_EXTENDED_TABLE(Tracks, StoredTracks, "EXTRACK", 0,
488 aod::track::Pt,
489 aod::track::P,
490 aod::track::Eta,
491 aod::track::Phi);
492
493DECLARE_SOA_TABLE_FULL(StoredTracksIU, "Tracks_IU", "AOD", "TRACK_IU",
494 o2::soa::Index<>, track::CollisionId, track::TrackType,
495 track::X, track::Alpha,
496 track::Y, track::Z, track::Snp, track::Tgl,
497 track::Signed1Pt, track::IsWithinBeamPipe<track::X>,
498 track::Px<track::Signed1Pt, track::Snp, track::Alpha>,
499 track::Py<track::Signed1Pt, track::Snp, track::Alpha>,
500 track::Pz<track::Signed1Pt, track::Tgl>,
501 track::PVector<track::Signed1Pt, track::Snp, track::Alpha, track::Tgl>,
502 track::Energy<track::Signed1Pt, track::Tgl>,
503 track::Rapidity<track::Signed1Pt, track::Tgl>,
504 track::Sign<track::Signed1Pt>,
506
507DECLARE_SOA_EXTENDED_TABLE(TracksIU, StoredTracksIU, "EXTRACK_IU", 0,
508 aod::track::Pt,
509 aod::track::P,
510 aod::track::Eta,
511 aod::track::Phi);
512
513DECLARE_SOA_TABLE_FULL(StoredTracksCov, "TracksCov", "AOD", "TRACKCOV",
514 track::SigmaY, track::SigmaZ, track::SigmaSnp, track::SigmaTgl, track::Sigma1Pt,
515 track::RhoZY, track::RhoSnpY, track::RhoSnpZ, track::RhoTglY, track::RhoTglZ,
516 track::RhoTglSnp, track::Rho1PtY, track::Rho1PtZ, track::Rho1PtSnp, track::Rho1PtTgl, o2::soa::Marker<1>);
517
518DECLARE_SOA_EXTENDED_TABLE(TracksCov, StoredTracksCov, "EXTRACKCOV", 0,
519 aod::track::CYY,
520 aod::track::CZY,
521 aod::track::CZZ,
522 aod::track::CSnpY,
523 aod::track::CSnpZ,
524 aod::track::CSnpSnp,
525 aod::track::CTglY,
526 aod::track::CTglZ,
527 aod::track::CTglSnp,
528 aod::track::CTglTgl,
529 aod::track::C1PtY,
530 aod::track::C1PtZ,
531 aod::track::C1PtSnp,
532 aod::track::C1PtTgl,
533 aod::track::C1Pt21Pt2);
534
535DECLARE_SOA_TABLE_FULL(StoredTracksCovIU, "TracksCov_IU", "AOD", "TRACKCOV_IU",
536 track::SigmaY, track::SigmaZ, track::SigmaSnp, track::SigmaTgl, track::Sigma1Pt,
537 track::RhoZY, track::RhoSnpY, track::RhoSnpZ, track::RhoTglY, track::RhoTglZ,
538 track::RhoTglSnp, track::Rho1PtY, track::Rho1PtZ, track::Rho1PtSnp, track::Rho1PtTgl, o2::soa::Marker<2>);
539
540DECLARE_SOA_EXTENDED_TABLE(TracksCovIU, StoredTracksCovIU, "EXTRACKCOV_IU", 0,
541 aod::track::CYY,
542 aod::track::CZY,
543 aod::track::CZZ,
544 aod::track::CSnpY,
545 aod::track::CSnpZ,
546 aod::track::CSnpSnp,
547 aod::track::CTglY,
548 aod::track::CTglZ,
549 aod::track::CTglSnp,
550 aod::track::CTglTgl,
551 aod::track::C1PtY,
552 aod::track::C1PtZ,
553 aod::track::C1PtSnp,
554 aod::track::C1PtTgl,
555 aod::track::C1Pt21Pt2);
556
557DECLARE_SOA_TABLE_FULL(StoredTracksExtra_000, "TracksExtra", "AOD", "TRACKEXTRA",
558 track::TPCInnerParam, track::Flags, track::ITSClusterMap,
559 track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows,
560 track::TPCNClsShared, track::TRDPattern, track::ITSChi2NCl,
561 track::TPCChi2NCl, track::TRDChi2, track::TOFChi2,
562 track::TPCSignal, track::TRDSignal, track::Length, track::TOFExpMom,
563 track::PIDForTracking<track::Flags>,
564 track::IsPVContributor<track::Flags>,
565 track::HasITS<track::DetectorMap>, track::HasTPC<track::DetectorMap>,
566 track::HasTRD<track::DetectorMap>, track::HasTOF<track::DetectorMap>,
567 track::TPCNClsFound<track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
568 track::TPCNClsCrossedRows<track::TPCNClsFindable, track::TPCNClsFindableMinusCrossedRows>,
569 track::TOFExpTimeEl<track::Length, track::TOFExpMom>,
570 track::TOFExpTimeMu<track::Length, track::TOFExpMom>,
571 track::TOFExpTimePi<track::Length, track::TOFExpMom>,
572 track::TOFExpTimeKa<track::Length, track::TOFExpMom>,
573 track::TOFExpTimePr<track::Length, track::TOFExpMom>,
574 track::TOFExpTimeDe<track::Length, track::TOFExpMom>,
575 track::TOFExpTimeTr<track::Length, track::TOFExpMom>,
576 track::TOFExpTimeHe<track::Length, track::TOFExpMom>,
577 track::TOFExpTimeAl<track::Length, track::TOFExpMom>,
578 track::ITSNCls<track::ITSClusterMap>, track::ITSNClsInnerBarrel<track::ITSClusterMap>,
579 track::TPCCrossedRowsOverFindableCls<track::TPCNClsFindable, track::TPCNClsFindableMinusCrossedRows>,
580 track::TPCFoundOverFindableCls<track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
581 track::TPCFractionSharedCls<track::TPCNClsShared, track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
582 track::TrackEtaEMCAL, track::TrackPhiEMCAL, track::TrackTime, track::TrackTimeRes);
583
584DECLARE_SOA_TABLE_FULL_VERSIONED(StoredTracksExtra_001, "TracksExtra", "AOD", "TRACKEXTRA", 1, // On disk version of TracksExtra, version 1
585 track::TPCInnerParam, track::Flags, track::ITSClusterSizes,
586 track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows,
587 track::TPCNClsShared, track::v001::extensions::TPCDeltaTFwd<track::TrackTimeRes, track::Flags>, track::v001::extensions::TPCDeltaTBwd<track::TrackTimeRes, track::Flags>,
588 track::TRDPattern, track::ITSChi2NCl, track::TPCChi2NCl, track::TRDChi2, track::TOFChi2,
589 track::TPCSignal, track::TRDSignal, track::Length, track::TOFExpMom,
590 track::PIDForTracking<track::Flags>,
591 track::IsPVContributor<track::Flags>,
592 track::HasITS<track::v001::DetectorMap>, track::HasTPC<track::v001::DetectorMap>,
593 track::HasTRD<track::v001::DetectorMap>, track::HasTOF<track::v001::DetectorMap>,
594 track::TPCNClsFound<track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
595 track::TPCNClsCrossedRows<track::TPCNClsFindable, track::TPCNClsFindableMinusCrossedRows>,
596 track::v001::ITSClusterMap<track::ITSClusterSizes>, track::v001::ITSNCls<track::ITSClusterSizes>, track::v001::ITSNClsInnerBarrel<track::ITSClusterSizes>,
597 track::v001::ITSClsSizeInLayer<track::ITSClusterSizes>,
598 track::v001::IsITSAfterburner<track::v001::DetectorMap, track::ITSChi2NCl>,
599 track::TOFExpTimeEl<track::Length, track::TOFExpMom>,
600 track::TOFExpTimeMu<track::Length, track::TOFExpMom>,
601 track::TOFExpTimePi<track::Length, track::TOFExpMom>,
602 track::TOFExpTimeKa<track::Length, track::TOFExpMom>,
603 track::TOFExpTimePr<track::Length, track::TOFExpMom>,
604 track::TOFExpTimeDe<track::Length, track::TOFExpMom>,
605 track::TOFExpTimeTr<track::Length, track::TOFExpMom>,
606 track::TOFExpTimeHe<track::Length, track::TOFExpMom>,
607 track::TOFExpTimeAl<track::Length, track::TOFExpMom>,
608 track::TPCCrossedRowsOverFindableCls<track::TPCNClsFindable, track::TPCNClsFindableMinusCrossedRows>,
609 track::TPCFoundOverFindableCls<track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
610 track::TPCFractionSharedCls<track::TPCNClsShared, track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
611 track::TrackEtaEMCAL, track::TrackPhiEMCAL, track::TrackTime, track::TrackTimeRes);
612
613DECLARE_SOA_TABLE_FULL_VERSIONED(StoredTracksExtra_002, "TracksExtra", "AOD", "TRACKEXTRA", 2, // On disk version of TracksExtra, version 2
614 track::TPCInnerParam, track::Flags, track::ITSClusterSizes,
615 track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusPID, track::TPCNClsFindableMinusCrossedRows,
616 track::TPCNClsShared, track::v001::extensions::TPCDeltaTFwd<track::TrackTimeRes, track::Flags>, track::v001::extensions::TPCDeltaTBwd<track::TrackTimeRes, track::Flags>,
617 track::TRDPattern, track::ITSChi2NCl, track::TPCChi2NCl, track::TRDChi2, track::TOFChi2,
618 track::TPCSignal, track::TRDSignal, track::Length, track::TOFExpMom,
619 track::PIDForTracking<track::Flags>,
620 track::IsPVContributor<track::Flags>,
621 track::HasITS<track::v001::DetectorMap>, track::HasTPC<track::v001::DetectorMap>,
622 track::HasTRD<track::v001::DetectorMap>, track::HasTOF<track::v001::DetectorMap>,
623 track::TPCNClsFound<track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
624 track::TPCNClsCrossedRows<track::TPCNClsFindable, track::TPCNClsFindableMinusCrossedRows>,
625 track::v001::ITSClusterMap<track::ITSClusterSizes>, track::v001::ITSNCls<track::ITSClusterSizes>, track::v001::ITSNClsInnerBarrel<track::ITSClusterSizes>,
626 track::v001::ITSClsSizeInLayer<track::ITSClusterSizes>,
627 track::v001::IsITSAfterburner<track::v001::DetectorMap, track::ITSChi2NCl>,
628 track::TOFExpTimeEl<track::Length, track::TOFExpMom>,
629 track::TOFExpTimeMu<track::Length, track::TOFExpMom>,
630 track::TOFExpTimePi<track::Length, track::TOFExpMom>,
631 track::TOFExpTimeKa<track::Length, track::TOFExpMom>,
632 track::TOFExpTimePr<track::Length, track::TOFExpMom>,
633 track::TOFExpTimeDe<track::Length, track::TOFExpMom>,
634 track::TOFExpTimeTr<track::Length, track::TOFExpMom>,
635 track::TOFExpTimeHe<track::Length, track::TOFExpMom>,
636 track::TOFExpTimeAl<track::Length, track::TOFExpMom>,
637 track::TPCCrossedRowsOverFindableCls<track::TPCNClsFindable, track::TPCNClsFindableMinusCrossedRows>,
638 track::TPCFoundOverFindableCls<track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
639 track::TPCFractionSharedCls<track::TPCNClsShared, track::TPCNClsFindable, track::TPCNClsFindableMinusFound>,
640 track::TrackEtaEMCAL, track::TrackPhiEMCAL, track::TrackTime, track::TrackTimeRes);
641
642DECLARE_SOA_EXTENDED_TABLE(TracksExtra_000, StoredTracksExtra_000, "EXTRACKEXTRA", 0,
643 track::DetectorMap);
644DECLARE_SOA_EXTENDED_TABLE(TracksExtra_001, StoredTracksExtra_001, "EXTRACKEXTRA", 1,
645 track::v001::DetectorMap);
646DECLARE_SOA_EXTENDED_TABLE(TracksExtra_002, StoredTracksExtra_002, "EXTRACKEXTRA", 2,
647 track::v001::DetectorMap);
648
649DECLARE_SOA_TABLE(Run2TrackExtras_000, "AOD", "RUN2TRACKEXTRA",
650 track::ITSSignal);
651DECLARE_SOA_TABLE_VERSIONED(Run2TrackExtras_001, "AOD", "RUN2TRACKEXTRA", 1,
652 track::ITSSignal, track::ITSSharedClusterMap,
653 track::ITSNSharedCls<track::ITSSharedClusterMap>);
654
655using StoredTracksExtra = StoredTracksExtra_002;
656using TracksExtra = TracksExtra_002;
657
658using Track = Tracks::iterator;
659using TrackIU = TracksIU::iterator;
660using TrackCov = TracksCov::iterator;
661using TrackCovIU = TracksCovIU::iterator;
662using TrackExtra = TracksExtra::iterator;
663using Run2TrackExtras = Run2TrackExtras_001;
664using Run2TrackExtra = Run2TrackExtras::iterator;
665
666} // namespace aod
667namespace soa
668{
669extern template struct soa::JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::Tracks, aod::TracksExtra>;
670extern template struct soa::JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::Tracks, aod::TracksCov, aod::TracksExtra>;
671extern template struct soa::JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::TracksExtension, aod::StoredTracks>;
672} // namespace soa
673namespace aod
674{
677
678namespace trackqa
679{
680// TRACKQA TABLE COLUMNS
682DECLARE_SOA_COLUMN(TPCTime0, tpcTime0, float);
683DECLARE_SOA_COLUMN(TPCDCAR, tpcdcaR, int16_t);
684DECLARE_SOA_COLUMN(TPCDCAZ, tpcdcaZ, int16_t);
685DECLARE_SOA_COLUMN(TPCClusterByteMask, tpcClusterByteMask, uint8_t);
686DECLARE_SOA_COLUMN(TPCdEdxMax0R, tpcdEdxMax0R, uint8_t);
687DECLARE_SOA_COLUMN(TPCdEdxMax1R, tpcdEdxMax1R, uint8_t);
688DECLARE_SOA_COLUMN(TPCdEdxMax2R, tpcdEdxMax2R, uint8_t);
689DECLARE_SOA_COLUMN(TPCdEdxMax3R, tpcdEdxMax3R, uint8_t);
690DECLARE_SOA_COLUMN(TPCdEdxTot0R, tpcdEdxTot0R, uint8_t);
691DECLARE_SOA_COLUMN(TPCdEdxTot1R, tpcdEdxTot1R, uint8_t);
692DECLARE_SOA_COLUMN(TPCdEdxTot2R, tpcdEdxTot2R, uint8_t);
693DECLARE_SOA_COLUMN(TPCdEdxTot3R, tpcdEdxTot3R, uint8_t);
694DECLARE_SOA_COLUMN(DeltaRefContParamY, deltaRefContParamY, int8_t);
695DECLARE_SOA_COLUMN(DeltaRefContParamZ, deltaRefITSParamZ, int8_t);
696DECLARE_SOA_COLUMN(DeltaRefContParamSnp, deltaRefContParamSnp, int8_t);
697DECLARE_SOA_COLUMN(DeltaRefContParamTgl, deltaRefContParamTgl, int8_t);
698DECLARE_SOA_COLUMN(DeltaRefContParamQ2Pt, deltaRefContParamQ2Pt, int8_t);
699DECLARE_SOA_COLUMN(DeltaRefGloParamY, deltaRefGloParamY, int8_t);
700DECLARE_SOA_COLUMN(DeltaRefGloParamZ, deltaRefGloParamZ, int8_t);
701DECLARE_SOA_COLUMN(DeltaRefGloParamSnp, deltaRefGloParamSnp, int8_t);
702DECLARE_SOA_COLUMN(DeltaRefGloParamTgl, deltaRefGloParamTgl, int8_t);
703DECLARE_SOA_COLUMN(DeltaRefGloParamQ2Pt, deltaRefGloParamQ2Pt, int8_t);
704DECLARE_SOA_COLUMN(DeltaTOFdX, deltaTOFdX, int8_t);
705DECLARE_SOA_COLUMN(DeltaTOFdZ, deltaTOFdZ, int8_t);
706
708 [](int8_t cY, int8_t cZ, int8_t cSnp, int8_t cTgl, int8_t cQ2Pt, int8_t gY, int8_t gZ, int8_t gSnp, int8_t gTgl, int8_t gQ2Pt) -> bool {
709 constexpr int8_t m = std::numeric_limits<int8_t>::min();
710 return (cY == m && cZ == m && cSnp == m && cTgl == m && cQ2Pt == m && gY == m && gZ == m && gSnp == m && gTgl == m && gQ2Pt == m);
711 });
712} // namespace trackqa
713
714DECLARE_SOA_TABLE(TracksQA_000, "AOD", "TRACKQA",
715 o2::soa::Index<>, trackqa::TrackId, trackqa::TPCTime0, trackqa::TPCDCAR, trackqa::TPCDCAZ, trackqa::TPCClusterByteMask,
716 trackqa::TPCdEdxMax0R, trackqa::TPCdEdxMax1R, trackqa::TPCdEdxMax2R, trackqa::TPCdEdxMax3R,
717 trackqa::TPCdEdxTot0R, trackqa::TPCdEdxTot1R, trackqa::TPCdEdxTot2R, trackqa::TPCdEdxTot3R);
718// o2::soa::Index<>, trackqa::TrackId, trackqa::TPCDCAR, trackqa::TPCDCAZ, trackqa::TPCClusterByteMask,
719
720DECLARE_SOA_TABLE_VERSIONED(TracksQA_001, "AOD", "TRACKQA", 1,
721 o2::soa::Index<>, trackqa::TrackId, trackqa::TPCTime0, trackqa::TPCDCAR, trackqa::TPCDCAZ, trackqa::TPCClusterByteMask,
722 trackqa::TPCdEdxMax0R, trackqa::TPCdEdxMax1R, trackqa::TPCdEdxMax2R, trackqa::TPCdEdxMax3R,
723 trackqa::TPCdEdxTot0R, trackqa::TPCdEdxTot1R, trackqa::TPCdEdxTot2R, trackqa::TPCdEdxTot3R,
724 trackqa::DeltaRefContParamY, trackqa::DeltaRefContParamZ, trackqa::DeltaRefContParamSnp, trackqa::DeltaRefContParamTgl, trackqa::DeltaRefContParamQ2Pt,
725 trackqa::DeltaRefGloParamY, trackqa::DeltaRefGloParamZ, trackqa::DeltaRefGloParamSnp, trackqa::DeltaRefGloParamTgl, trackqa::DeltaRefGloParamQ2Pt,
726 trackqa::IsDummy<trackqa::DeltaRefContParamY, trackqa::DeltaRefContParamZ, trackqa::DeltaRefContParamSnp, trackqa::DeltaRefContParamTgl, trackqa::DeltaRefContParamQ2Pt,
727 trackqa::DeltaRefGloParamY, trackqa::DeltaRefGloParamZ, trackqa::DeltaRefGloParamSnp, trackqa::DeltaRefGloParamTgl, trackqa::DeltaRefGloParamQ2Pt>);
728
729DECLARE_SOA_TABLE_VERSIONED(TracksQA_002, "AOD", "TRACKQA", 2,
730 o2::soa::Index<>, trackqa::TrackId, trackqa::TPCTime0, trackqa::TPCDCAR, trackqa::TPCDCAZ, trackqa::TPCClusterByteMask,
731 trackqa::TPCdEdxMax0R, trackqa::TPCdEdxMax1R, trackqa::TPCdEdxMax2R, trackqa::TPCdEdxMax3R,
732 trackqa::TPCdEdxTot0R, trackqa::TPCdEdxTot1R, trackqa::TPCdEdxTot2R, trackqa::TPCdEdxTot3R,
733 trackqa::DeltaRefContParamY, trackqa::DeltaRefContParamZ, trackqa::DeltaRefContParamSnp, trackqa::DeltaRefContParamTgl, trackqa::DeltaRefContParamQ2Pt,
734 trackqa::DeltaRefGloParamY, trackqa::DeltaRefGloParamZ, trackqa::DeltaRefGloParamSnp, trackqa::DeltaRefGloParamTgl, trackqa::DeltaRefGloParamQ2Pt,
735 trackqa::DeltaTOFdX, trackqa::DeltaTOFdZ,
736 trackqa::IsDummy<trackqa::DeltaRefContParamY, trackqa::DeltaRefContParamZ, trackqa::DeltaRefContParamSnp, trackqa::DeltaRefContParamTgl, trackqa::DeltaRefContParamQ2Pt,
737 trackqa::DeltaRefGloParamY, trackqa::DeltaRefGloParamZ, trackqa::DeltaRefGloParamSnp, trackqa::DeltaRefGloParamTgl, trackqa::DeltaRefGloParamQ2Pt>);
738
739using TracksQAVersion = TracksQA_002;
740using TracksQA = TracksQAVersion::iterator;
741
742namespace fwdtrack
743{
744// FwdTracks and MFTTracks Columns definitions
746DECLARE_SOA_COLUMN(TrackType, trackType, uint8_t);
750DECLARE_SOA_COLUMN(Phi, phi, float);
751DECLARE_SOA_COLUMN(Tgl, tgl, float);
752DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float);
753DECLARE_SOA_COLUMN(NClusters, nClusters, int8_t);
754DECLARE_SOA_COLUMN(MFTClusterSizesAndTrackFlags, mftClusterSizesAndTrackFlags, uint64_t);
755DECLARE_SOA_COLUMN(Chi2, chi2, float);
756DECLARE_SOA_COLUMN(PDca, pDca, float);
757DECLARE_SOA_COLUMN(RAtAbsorberEnd, rAtAbsorberEnd, float);
758DECLARE_SOA_COLUMN(Chi2MatchMCHMID, chi2MatchMCHMID, float);
759DECLARE_SOA_COLUMN(Chi2MatchMCHMFT, chi2MatchMCHMFT, float);
760DECLARE_SOA_COLUMN(MatchScoreMCHMFT, matchScoreMCHMFT, float);
761DECLARE_SOA_SELF_INDEX_COLUMN_FULL(MCHTrack, matchMCHTrack, int, "FwdTracks_MatchMCHTrack");
762DECLARE_SOA_COLUMN(MCHBitMap, mchBitMap, uint16_t);
763DECLARE_SOA_COLUMN(MIDBitMap, midBitMap, uint8_t);
764DECLARE_SOA_COLUMN(MIDBoards, midBoards, uint32_t);
765DECLARE_SOA_COLUMN(TrackTime, trackTime, float);
766DECLARE_SOA_COLUMN(TrackTimeRes, trackTimeRes, float);
768 [](float signed1Pt) -> short { return (signed1Pt > 0) ? 1 : -1; });
770 [](uint64_t mftClusterSizesAndTrackFlags) -> bool { return mftClusterSizesAndTrackFlags & (0x1ULL << 60); });
772 -1.f * nlog(ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrack::tgl))));
774 ifnode(nabs(aod::fwdtrack::signed1Pt) < o2::constants::math::Almost0, o2::constants::math::VeryBig, nabs(1.f / aod::fwdtrack::signed1Pt)));
776 ifnode((nabs(aod::fwdtrack::signed1Pt) < o2::constants::math::Almost0) || (nabs(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrack::tgl)) < o2::constants::math::Almost0), o2::constants::math::VeryBig, 0.5f * (ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrack::tgl)) + 1.f / ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrack::tgl))) / nabs(aod::fwdtrack::signed1Pt)));
778 [](float pt, float phi) -> float {
779 return pt * std::cos(phi);
780 });
782 [](float pt, float phi) -> float {
783 return pt * std::sin(phi);
784 });
786 [](float pt, float tgl) -> float {
787 return pt * tgl;
788 });
789DECLARE_SOA_DYNAMIC_COLUMN(MIDBoardCh1, midBoardCh1,
790 [](uint32_t midBoards) -> int {
791 return static_cast<int>(midBoards & 0xFF);
792 });
793DECLARE_SOA_DYNAMIC_COLUMN(MIDBoardCh2, midBoardCh2,
794 [](uint32_t midBoards) -> int {
795 return static_cast<int>((midBoards >> 8) & 0xFF);
796 });
797DECLARE_SOA_DYNAMIC_COLUMN(MIDBoardCh3, midBoardCh3,
798 [](uint32_t midBoards) -> int {
799 return static_cast<int>((midBoards >> 16) & 0xFF);
800 });
801DECLARE_SOA_DYNAMIC_COLUMN(MIDBoardCh4, midBoardCh4,
802 [](uint32_t midBoards) -> int {
803 return static_cast<int>((midBoards >> 24) & 0xFF);
804 });
805
806namespace v001
807{
809 [](uint64_t mftClusterSizesAndTrackFlags) -> int8_t {
810 int8_t nClusters = 0;
811 for (int layer = 0; layer < 10; layer++) {
812 if ((mftClusterSizesAndTrackFlags >> (layer * 6)) & 0x3F) {
813 nClusters++;
814 }
815 }
816 return nClusters;
817 });
818} // namespace v001
819
820// FwdTracksCov columns definitions
821DECLARE_SOA_COLUMN(SigmaX, sigmaX, float);
822DECLARE_SOA_COLUMN(SigmaY, sigmaY, float);
823DECLARE_SOA_COLUMN(SigmaPhi, sigmaPhi, float);
824DECLARE_SOA_COLUMN(SigmaTgl, sigmaTgl, float);
825DECLARE_SOA_COLUMN(Sigma1Pt, sigma1Pt, float);
826DECLARE_SOA_COLUMN(RhoXY, rhoXY, int8_t);
827DECLARE_SOA_COLUMN(RhoPhiX, rhoPhiX, int8_t);
828DECLARE_SOA_COLUMN(RhoPhiY, rhoPhiY, int8_t);
829DECLARE_SOA_COLUMN(RhoTglX, rhoTglX, int8_t);
830DECLARE_SOA_COLUMN(RhoTglY, rhoTglY, int8_t);
831DECLARE_SOA_COLUMN(RhoTglPhi, rhoTglPhi, int8_t);
832DECLARE_SOA_COLUMN(Rho1PtX, rho1PtX, int8_t);
833DECLARE_SOA_COLUMN(Rho1PtY, rho1PtY, int8_t);
834DECLARE_SOA_COLUMN(Rho1PtPhi, rho1PtPhi, int8_t);
835DECLARE_SOA_COLUMN(Rho1PtTgl, rho1PtTgl, int8_t);
836
838 aod::fwdtrack::sigmaX* aod::fwdtrack::sigmaX);
840 (aod::fwdtrack::rhoXY / 128.f) * (aod::fwdtrack::sigmaX * aod::fwdtrack::sigmaY));
842 aod::fwdtrack::sigmaY* aod::fwdtrack::sigmaY);
843DECLARE_SOA_EXPRESSION_COLUMN(CPhiX, cPhiX, float,
844 (aod::fwdtrack::rhoPhiX / 128.f) * (aod::fwdtrack::sigmaPhi * aod::fwdtrack::sigmaX));
845DECLARE_SOA_EXPRESSION_COLUMN(CPhiY, cPhiY, float,
846 (aod::fwdtrack::rhoPhiY / 128.f) * (aod::fwdtrack::sigmaPhi * aod::fwdtrack::sigmaY));
847DECLARE_SOA_EXPRESSION_COLUMN(CPhiPhi, cPhiPhi, float,
848 aod::fwdtrack::sigmaPhi* aod::fwdtrack::sigmaPhi);
849DECLARE_SOA_EXPRESSION_COLUMN(CTglX, cTglX, float,
850 (aod::fwdtrack::rhoTglX / 128.f) * (aod::fwdtrack::sigmaTgl * aod::fwdtrack::sigmaX));
851DECLARE_SOA_EXPRESSION_COLUMN(CTglY, cTglY, float,
852 (aod::fwdtrack::rhoTglY / 128.f) * (aod::fwdtrack::sigmaTgl * aod::fwdtrack::sigmaY));
853DECLARE_SOA_EXPRESSION_COLUMN(CTglPhi, cTglPhi, float,
854 (aod::fwdtrack::rhoTglPhi / 128.f) * (aod::fwdtrack::sigmaTgl * aod::fwdtrack::sigmaPhi));
855DECLARE_SOA_EXPRESSION_COLUMN(CTglTgl, cTglTgl, float,
856 aod::fwdtrack::sigmaTgl* aod::fwdtrack::sigmaTgl);
857DECLARE_SOA_EXPRESSION_COLUMN(C1PtY, c1PtY, float,
858 (aod::fwdtrack::rho1PtY / 128.f) * (aod::fwdtrack::sigma1Pt * aod::fwdtrack::sigmaY));
859DECLARE_SOA_EXPRESSION_COLUMN(C1PtX, c1PtX, float,
860 (aod::fwdtrack::rho1PtX / 128.f) * (aod::fwdtrack::sigma1Pt * aod::fwdtrack::sigmaX));
861DECLARE_SOA_EXPRESSION_COLUMN(C1PtPhi, c1PtPhi, float,
862 (aod::fwdtrack::rho1PtPhi / 128.f) * (aod::fwdtrack::sigma1Pt * aod::fwdtrack::sigmaPhi));
863DECLARE_SOA_EXPRESSION_COLUMN(C1PtTgl, c1PtTgl, float,
864 (aod::fwdtrack::rho1PtTgl / 128.f) * (aod::fwdtrack::sigma1Pt * aod::fwdtrack::sigmaTgl));
865DECLARE_SOA_EXPRESSION_COLUMN(C1Pt21Pt2, c1Pt21Pt2, float,
866 aod::fwdtrack::sigma1Pt* aod::fwdtrack::sigma1Pt);
867} // namespace fwdtrack
868
869// MFTStandalone tracks
870DECLARE_SOA_TABLE_FULL(StoredMFTTracks_000, "MFTTracks", "AOD", "MFTTRACK",
871 o2::soa::Index<>, fwdtrack::CollisionId,
872 fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl,
873 fwdtrack::Signed1Pt, fwdtrack::NClusters,
874 fwdtrack::Px<fwdtrack::Pt, fwdtrack::Phi>,
875 fwdtrack::Py<fwdtrack::Pt, fwdtrack::Phi>,
876 fwdtrack::Pz<fwdtrack::Pt, fwdtrack::Tgl>,
877 fwdtrack::Sign<fwdtrack::Signed1Pt>, fwdtrack::Chi2,
878 fwdtrack::TrackTime, fwdtrack::TrackTimeRes);
879
880DECLARE_SOA_TABLE_FULL_VERSIONED(StoredMFTTracks_001, "MFTTracks", "AOD", "MFTTRACK", 1,
881 o2::soa::Index<>, fwdtrack::CollisionId,
882 fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl,
883 fwdtrack::Signed1Pt, fwdtrack::v001::NClusters<fwdtrack::MFTClusterSizesAndTrackFlags>, fwdtrack::MFTClusterSizesAndTrackFlags, fwdtrack::IsCA<fwdtrack::MFTClusterSizesAndTrackFlags>,
884 fwdtrack::Px<fwdtrack::Pt, fwdtrack::Phi>,
885 fwdtrack::Py<fwdtrack::Pt, fwdtrack::Phi>,
886 fwdtrack::Pz<fwdtrack::Pt, fwdtrack::Tgl>,
887 fwdtrack::Sign<fwdtrack::Signed1Pt>, fwdtrack::Chi2,
888 fwdtrack::TrackTime, fwdtrack::TrackTimeRes);
889
890DECLARE_SOA_EXTENDED_TABLE(MFTTracks_000, StoredMFTTracks_000, "EXMFTTRACK", 0,
891 aod::fwdtrack::Pt,
892 aod::fwdtrack::Eta,
893 aod::fwdtrack::P);
894
895DECLARE_SOA_EXTENDED_TABLE(MFTTracks_001, StoredMFTTracks_001, "EXMFTTRACK", 1,
896 aod::fwdtrack::Pt,
897 aod::fwdtrack::Eta,
898 aod::fwdtrack::P);
899
900using MFTTracks = MFTTracks_001;
901using StoredMFTTracks = StoredMFTTracks_001;
902
903using MFTTrack = MFTTracks::iterator;
904
905namespace fwdtrack // Index to MFTtrack column must be defined after table definition.
906{
908}
909
910// Tracks including MCH and/or MCH (plus optionally MFT) //!
911DECLARE_SOA_TABLE_FULL(StoredFwdTracks, "FwdTracks", "AOD", "FWDTRACK",
912 o2::soa::Index<>, fwdtrack::CollisionId, fwdtrack::TrackType,
913 fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl,
914 fwdtrack::Signed1Pt, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd,
915 fwdtrack::Px<fwdtrack::Pt, fwdtrack::Phi>,
916 fwdtrack::Py<fwdtrack::Pt, fwdtrack::Phi>,
917 fwdtrack::Pz<fwdtrack::Pt, fwdtrack::Tgl>,
918 fwdtrack::Sign<fwdtrack::Signed1Pt>,
919 fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT,
920 fwdtrack::MatchScoreMCHMFT, fwdtrack::MFTTrackId, fwdtrack::MCHTrackId,
921 fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards,
922 fwdtrack::TrackTime, fwdtrack::TrackTimeRes);
923
924DECLARE_SOA_EXTENDED_TABLE(FwdTracks, StoredFwdTracks, "EXFWDTRACK", 0,
925 aod::fwdtrack::Pt,
926 aod::fwdtrack::Eta,
927 aod::fwdtrack::P);
928
929DECLARE_SOA_TABLE_FULL(StoredFwdTracksCov, "FwdTracksCov", "AOD", "FWDTRACKCOV",
930 fwdtrack::SigmaX, fwdtrack::SigmaY, fwdtrack::SigmaPhi, fwdtrack::SigmaTgl, fwdtrack::Sigma1Pt,
931 fwdtrack::RhoXY, fwdtrack::RhoPhiY, fwdtrack::RhoPhiX, fwdtrack::RhoTglX, fwdtrack::RhoTglY,
932 fwdtrack::RhoTglPhi, fwdtrack::Rho1PtX, fwdtrack::Rho1PtY, fwdtrack::Rho1PtPhi, fwdtrack::Rho1PtTgl);
933
934DECLARE_SOA_EXTENDED_TABLE(FwdTracksCov, StoredFwdTracksCov, "EXFWDTRACKCOV", 0,
935 aod::fwdtrack::CXX,
936 aod::fwdtrack::CXY,
937 aod::fwdtrack::CYY,
938 aod::fwdtrack::CPhiX,
939 aod::fwdtrack::CPhiY,
940 aod::fwdtrack::CPhiPhi,
941 aod::fwdtrack::CTglX,
942 aod::fwdtrack::CTglY,
943 aod::fwdtrack::CTglPhi,
944 aod::fwdtrack::CTglTgl,
945 aod::fwdtrack::C1PtX,
946 aod::fwdtrack::C1PtY,
947 aod::fwdtrack::C1PtPhi,
948 aod::fwdtrack::C1PtTgl,
949 aod::fwdtrack::C1Pt21Pt2);
950
951using FwdTrack = FwdTracks::iterator;
952using FwdTrackCovFwd = FwdTracksCov::iterator;
953
954DECLARE_SOA_TABLE_FULL(StoredMFTTracksCov, "MFTTracksCov", "AOD", "MFTTRACKCOV",
955 o2::soa::Index<>, fwdtrack::MFTTrackId,
956 fwdtrack::SigmaX, fwdtrack::SigmaY, fwdtrack::SigmaPhi, fwdtrack::SigmaTgl, fwdtrack::Sigma1Pt,
957 fwdtrack::RhoXY, fwdtrack::RhoPhiX, fwdtrack::RhoPhiY, fwdtrack::RhoTglX, fwdtrack::RhoTglY,
958 fwdtrack::RhoTglPhi, fwdtrack::Rho1PtX, fwdtrack::Rho1PtY, fwdtrack::Rho1PtPhi, fwdtrack::Rho1PtTgl);
959
960DECLARE_SOA_EXTENDED_TABLE(MFTTracksCov, StoredMFTTracksCov, "EXMFTTRACKCOV", 0,
961 aod::fwdtrack::CXX,
962 aod::fwdtrack::CXY,
963 aod::fwdtrack::CYY,
964 aod::fwdtrack::CPhiX,
965 aod::fwdtrack::CPhiY,
966 aod::fwdtrack::CPhiPhi,
967 aod::fwdtrack::CTglX,
968 aod::fwdtrack::CTglY,
969 aod::fwdtrack::CTglPhi,
970 aod::fwdtrack::CTglTgl,
971 aod::fwdtrack::C1PtX,
972 aod::fwdtrack::C1PtY,
973 aod::fwdtrack::C1PtPhi,
974 aod::fwdtrack::C1PtTgl,
975 aod::fwdtrack::C1Pt21Pt2);
976
977using MFTTrack = MFTTracks::iterator;
978using MFTTrackCovFwd = MFTTracksCov::iterator;
979
980} // namespace aod
981namespace soa
982{
983extern template struct JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::FwdTracks, aod::FwdTracksCov>;
984}
985namespace aod
986{
989
990// Some tracks cannot be uniquely identified with a collision. Some tracks cannot be assigned to a collision at all.
991// Those tracks have -1 as collision index and have an entry in the AmbiguousTracks table.
992// The estimated track time is used to assign BCs which are compatible with this track. Those are stored as a slice.
993// All collisions compatible with these BCs may then have produced the ambiguous track.
994// In the future possibly the DCA information can be exploited to reduce the possible collisions and then this table will be extended.
1002
1003DECLARE_SOA_TABLE(AmbiguousTracks, "AOD", "AMBIGUOUSTRACK",
1004 o2::soa::Index<>, ambiguous::TrackId, ambiguous::BCIdSlice);
1005
1006using AmbiguousTrack = AmbiguousTracks::iterator;
1007
1008DECLARE_SOA_TABLE(AmbiguousMFTTracks, "AOD", "AMBIGUOUSMFTTR",
1009 o2::soa::Index<>, ambiguous::MFTTrackId, ambiguous::BCIdSlice);
1010
1011using AmbiguousMFTTrack = AmbiguousMFTTracks::iterator;
1012
1013DECLARE_SOA_TABLE(AmbiguousFwdTracks, "AOD", "AMBIGUOUSFWDTR",
1014 o2::soa::Index<>, ambiguous::FwdTrackId, ambiguous::BCIdSlice);
1015
1016using AmbiguousFwdTrack = AmbiguousFwdTracks::iterator;
1017
1018// Forward Tracks Cluster information
1019namespace fwdtrkcl
1020{
1025DECLARE_SOA_COLUMN(ClInfo, clInfo, uint16_t);
1026DECLARE_SOA_DYNAMIC_COLUMN(DEId, deId, [](uint16_t info) -> uint16_t { return (info & 0x7FF); });
1027DECLARE_SOA_DYNAMIC_COLUMN(IsGoodX, isGoodX, [](uint16_t info) -> bool { return ((info & 0x800) >> 11); });
1028DECLARE_SOA_DYNAMIC_COLUMN(IsGoodY, isGoodY, [](uint16_t info) -> bool { return ((info & 0x1000) >> 12); });
1029} // namespace fwdtrkcl
1030
1031DECLARE_SOA_TABLE(FwdTrkCls, "AOD", "FWDTRKCL",
1033 fwdtrkcl::FwdTrackId,
1034 fwdtrkcl::X,
1035 fwdtrkcl::Y,
1036 fwdtrkcl::Z,
1037 fwdtrkcl::ClInfo,
1038 fwdtrkcl::DEId<fwdtrkcl::ClInfo>,
1039 fwdtrkcl::IsGoodX<fwdtrkcl::ClInfo>,
1040 fwdtrkcl::IsGoodY<fwdtrkcl::ClInfo>);
1041
1042using FwdTrkCl = FwdTrkCls::iterator;
1043
1044// HMPID information
1045namespace hmpid
1046{
1048DECLARE_SOA_COLUMN(HMPIDSignal, hmpidSignal, float);
1049DECLARE_SOA_COLUMN(HMPIDDistance, hmpidDistance, float);
1050DECLARE_SOA_COLUMN(HMPIDXTrack, hmpidXTrack, float);
1051DECLARE_SOA_COLUMN(HMPIDYTrack, hmpidYTrack, float);
1052DECLARE_SOA_COLUMN(HMPIDXMip, hmpidXMip, float);
1053DECLARE_SOA_COLUMN(HMPIDYMip, hmpidYMip, float);
1054DECLARE_SOA_COLUMN(HMPIDNPhotons, hmpidNPhotons, int);
1055DECLARE_SOA_COLUMN(HMPIDQMip, hmpidQMip, float);
1056DECLARE_SOA_COLUMN(HMPIDClusSize, hmpidClusSize, int);
1057DECLARE_SOA_COLUMN(HMPIDMom, hmpidMom, float);
1058DECLARE_SOA_COLUMN(HMPIDPhotsCharge, hmpidPhotsCharge, float[10]);
1059} // namespace hmpid
1060
1061DECLARE_SOA_TABLE(HMPID_000, "AOD", "HMPID",
1063 hmpid::TrackId,
1064 hmpid::HMPIDSignal,
1065 hmpid::HMPIDDistance,
1066 hmpid::HMPIDNPhotons,
1067 hmpid::HMPIDQMip);
1068
1069DECLARE_SOA_TABLE_VERSIONED(HMPID_001, "AOD", "HMPID", 1,
1071 hmpid::TrackId,
1072 hmpid::HMPIDSignal,
1073 hmpid::HMPIDXTrack,
1074 hmpid::HMPIDYTrack,
1075 hmpid::HMPIDXMip,
1076 hmpid::HMPIDYMip,
1077 hmpid::HMPIDNPhotons,
1078 hmpid::HMPIDQMip,
1079 hmpid::HMPIDClusSize,
1080 hmpid::HMPIDMom,
1081 hmpid::HMPIDPhotsCharge);
1082
1083using HMPIDs = HMPID_001;
1084using HMPID = HMPIDs::iterator;
1085
1086namespace calo
1087{
1089DECLARE_SOA_COLUMN(CellNumber, cellNumber, int16_t);
1090DECLARE_SOA_COLUMN(Amplitude, amplitude, float);
1092DECLARE_SOA_COLUMN(CellType, cellType, int8_t);
1093DECLARE_SOA_COLUMN(CaloType, caloType, int8_t);
1094} // namespace calo
1095
1096DECLARE_SOA_TABLE(Calos, "AOD", "CALO",
1097 o2::soa::Index<>, calo::BCId, calo::CellNumber, calo::Amplitude,
1098 calo::Time, calo::CellType, calo::CaloType);
1099using Calo = Calos::iterator;
1100
1101namespace calotrigger
1102{
1104DECLARE_SOA_COLUMN(FastOrAbsID, fastOrAbsID, int16_t);
1105DECLARE_SOA_COLUMN(LnAmplitude, lnAmplitude, int16_t);
1106DECLARE_SOA_COLUMN(TriggerBits, triggerBits, int32_t);
1107DECLARE_SOA_COLUMN(CaloType, caloType, int8_t);
1108} // namespace calotrigger
1109
1110DECLARE_SOA_TABLE(CaloTriggers, "AOD", "CALOTRIGGER",
1111 o2::soa::Index<>, calotrigger::BCId, calotrigger::FastOrAbsID,
1112 calotrigger::LnAmplitude, calotrigger::TriggerBits, calotrigger::CaloType);
1113using CaloTrigger = CaloTriggers::iterator;
1114
1115namespace cpvcluster
1116{
1118DECLARE_SOA_COLUMN(PosX, posX, float);
1119DECLARE_SOA_COLUMN(PosZ, posZ, float);
1120DECLARE_SOA_COLUMN(Amplitude, amplitude, float);
1121DECLARE_SOA_COLUMN(ClusterStatus, clusterStatus, uint8_t);
1122DECLARE_SOA_DYNAMIC_COLUMN(PadMult, padMult, [](uint8_t status) -> uint8_t {
1123 return status & 0b00011111;
1124});
1125DECLARE_SOA_DYNAMIC_COLUMN(ModuleNumber, moduleNumber, [](uint8_t status) -> uint8_t {
1126 return 2 + ((status & 0b01100000) >> 5);
1127});
1128DECLARE_SOA_DYNAMIC_COLUMN(IsUnfolded, isUnfolded, [](uint8_t status) -> bool {
1129 return (status & 0b01100000) >> 7;
1130});
1131} // namespace cpvcluster
1132
1133DECLARE_SOA_TABLE(CPVClusters, "AOD", "CPVCLUSTER",
1134 o2::soa::Index<>, cpvcluster::BCId, cpvcluster::PosX, cpvcluster::PosZ, cpvcluster::Amplitude,
1135 cpvcluster::ClusterStatus, cpvcluster::PadMult<cpvcluster::ClusterStatus>,
1136 cpvcluster::ModuleNumber<cpvcluster::ClusterStatus>, cpvcluster::IsUnfolded<cpvcluster::ClusterStatus>);
1137using CPVCluster = CPVClusters::iterator;
1138
1139namespace zdc
1140{
1142DECLARE_SOA_COLUMN(EnergyZEM1, energyZEM1, float);
1143DECLARE_SOA_COLUMN(EnergyZEM2, energyZEM2, float);
1144DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float);
1145DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float);
1146DECLARE_SOA_COLUMN(EnergyCommonZPA, energyCommonZPA, float);
1147DECLARE_SOA_COLUMN(EnergyCommonZPC, energyCommonZPC, float);
1148DECLARE_SOA_COLUMN(EnergySectorZNA, energySectorZNA, float[4]);
1149DECLARE_SOA_COLUMN(EnergySectorZNC, energySectorZNC, float[4]);
1150DECLARE_SOA_COLUMN(EnergySectorZPA, energySectorZPA, float[4]);
1151DECLARE_SOA_COLUMN(EnergySectorZPC, energySectorZPC, float[4]);
1152DECLARE_SOA_COLUMN(TimeZEM1, timeZEM1, float);
1153DECLARE_SOA_COLUMN(TimeZEM2, timeZEM2, float);
1154DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float);
1155DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float);
1156DECLARE_SOA_COLUMN(TimeZPA, timeZPA, float);
1157DECLARE_SOA_COLUMN(TimeZPC, timeZPC, float);
1158// New summarized table, minimal disk footprint, per channel like other detectors
1159DECLARE_SOA_COLUMN(Energy, energy, std::vector<float>);
1160DECLARE_SOA_COLUMN(ChannelE, channelE, std::vector<uint8_t>);
1161DECLARE_SOA_COLUMN(Amplitude, amplitude, std::vector<float>);
1162DECLARE_SOA_COLUMN(Time, time, std::vector<float>);
1163DECLARE_SOA_COLUMN(ChannelT, channelT, std::vector<uint8_t>);
1164// Dynamic columns to take into account packed information; replace old getters
1165DECLARE_SOA_DYNAMIC_COLUMN(DyEnergyZEM1, energyZEM1,
1166 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> float {
1167 auto ne = channelE.size();
1168 auto thisenergy = -std::numeric_limits<float>::infinity();
1169 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1170 if (channelE[ie] == o2::zdc::IdZEM1) {
1171 thisenergy = energy[ie];
1172 break; // avoid unnecessary looping
1173 }
1174 }
1175 return thisenergy;
1176 });
1177DECLARE_SOA_DYNAMIC_COLUMN(DyEnergyZEM2, energyZEM2,
1178 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> float {
1179 auto thisenergy = -std::numeric_limits<float>::infinity();
1180 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1181 if (channelE[ie] == o2::zdc::IdZEM2) {
1182 thisenergy = energy[ie];
1183 break; // avoid unnecessary looping
1184 }
1185 }
1186 return thisenergy;
1187 });
1188DECLARE_SOA_DYNAMIC_COLUMN(DyEnergyCommonZNA, energyCommonZNA,
1189 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> float {
1190 auto thisenergy = -std::numeric_limits<float>::infinity();
1191 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1192 if (channelE[ie] == o2::zdc::IdZNAC) {
1193 thisenergy = energy[ie];
1194 break; // avoid unnecessary looping
1195 }
1196 }
1197 return thisenergy;
1198 });
1199DECLARE_SOA_DYNAMIC_COLUMN(DyEnergyCommonZNC, energyCommonZNC,
1200 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> float {
1201 auto thisenergy = -std::numeric_limits<float>::infinity();
1202 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1203 if (channelE[ie] == o2::zdc::IdZNCC) {
1204 thisenergy = energy[ie];
1205 break; // avoid unnecessary looping
1206 }
1207 }
1208 return thisenergy;
1209 });
1210DECLARE_SOA_DYNAMIC_COLUMN(DyEnergyCommonZPA, energyCommonZPA,
1211 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> float {
1212 auto thisenergy = -std::numeric_limits<float>::infinity();
1213 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1214 if (channelE[ie] == o2::zdc::IdZPAC) {
1215 thisenergy = energy[ie];
1216 break; // avoid unnecessary looping
1217 }
1218 }
1219 return thisenergy;
1220 });
1221DECLARE_SOA_DYNAMIC_COLUMN(DyEnergyCommonZPC, energyCommonZPC,
1222 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> float {
1223 auto thisenergy = -std::numeric_limits<float>::infinity();
1224 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1225 if (channelE[ie] == o2::zdc::IdZPCC) {
1226 thisenergy = energy[ie];
1227 break; // avoid unnecessary looping
1228 }
1229 }
1230 return thisenergy;
1231 });
1232DECLARE_SOA_DYNAMIC_COLUMN(DyEnergySectorZNA, energySectorZNA,
1233 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> std::array<float, 4> {
1234 std::array<float, 4> thisenergy = {
1235 -std::numeric_limits<float>::infinity(),
1236 -std::numeric_limits<float>::infinity(),
1237 -std::numeric_limits<float>::infinity(),
1238 -std::numeric_limits<float>::infinity()};
1239 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1240 if (channelE[ie] == o2::zdc::IdZNA1)
1241 thisenergy[0] = energy[ie];
1242 if (channelE[ie] == o2::zdc::IdZNA2)
1243 thisenergy[1] = energy[ie];
1244 if (channelE[ie] == o2::zdc::IdZNA3)
1245 thisenergy[2] = energy[ie];
1246 if (channelE[ie] == o2::zdc::IdZNA4)
1247 thisenergy[3] = energy[ie];
1248 }
1250 });
1251DECLARE_SOA_DYNAMIC_COLUMN(DyEnergySectorZNC, energySectorZNC,
1252 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> std::array<float, 4> {
1253 std::array<float, 4> thisenergy = {
1254 -std::numeric_limits<float>::infinity(),
1255 -std::numeric_limits<float>::infinity(),
1256 -std::numeric_limits<float>::infinity(),
1257 -std::numeric_limits<float>::infinity()};
1258 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1259 if (channelE[ie] == o2::zdc::IdZNC1)
1260 thisenergy[0] = energy[ie];
1261 if (channelE[ie] == o2::zdc::IdZNC2)
1262 thisenergy[1] = energy[ie];
1263 if (channelE[ie] == o2::zdc::IdZNC3)
1264 thisenergy[2] = energy[ie];
1265 if (channelE[ie] == o2::zdc::IdZNC4)
1266 thisenergy[3] = energy[ie];
1267 }
1268 return thisenergy;
1269 });
1270DECLARE_SOA_DYNAMIC_COLUMN(DyEnergySectorZPA, energySectorZPA,
1271 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> std::array<float, 4> {
1272 std::array<float, 4> thisenergy = {
1273 -std::numeric_limits<float>::infinity(),
1274 -std::numeric_limits<float>::infinity(),
1275 -std::numeric_limits<float>::infinity(),
1276 -std::numeric_limits<float>::infinity()};
1277 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1278 if (channelE[ie] == o2::zdc::IdZPA1)
1279 thisenergy[0] = energy[ie];
1280 if (channelE[ie] == o2::zdc::IdZPA2)
1281 thisenergy[1] = energy[ie];
1282 if (channelE[ie] == o2::zdc::IdZPA3)
1283 thisenergy[2] = energy[ie];
1284 if (channelE[ie] == o2::zdc::IdZPA4)
1285 thisenergy[3] = energy[ie];
1286 }
1287 return thisenergy;
1288 });
1289DECLARE_SOA_DYNAMIC_COLUMN(DyEnergySectorZPC, energySectorZPC,
1290 [](gsl::span<const uint8_t> channelE, gsl::span<const float> energy) -> std::array<float, 4> {
1291 std::array<float, 4> thisenergy = {
1292 -std::numeric_limits<float>::infinity(),
1293 -std::numeric_limits<float>::infinity(),
1294 -std::numeric_limits<float>::infinity(),
1295 -std::numeric_limits<float>::infinity()};
1296 for (uint64_t ie = 0; ie < channelE.size(); ie++) {
1297 if (channelE[ie] == o2::zdc::IdZPC1)
1298 thisenergy[0] = energy[ie];
1299 if (channelE[ie] == o2::zdc::IdZPC2)
1300 thisenergy[1] = energy[ie];
1301 if (channelE[ie] == o2::zdc::IdZPC3)
1302 thisenergy[2] = energy[ie];
1303 if (channelE[ie] == o2::zdc::IdZPC4)
1304 thisenergy[3] = energy[ie];
1305 }
1306 return thisenergy;
1307 });
1308DECLARE_SOA_DYNAMIC_COLUMN(DyTimeZEM1, timeZEM1,
1309 [](gsl::span<const uint8_t> channelT, gsl::span<const float> time) -> float {
1310 auto thistime = -std::numeric_limits<float>::infinity();
1311 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1312 if (channelT[ie] == o2::zdc::IdZEM1) {
1313 thistime = time[ie];
1314 break; // avoid unnecessary looping
1315 }
1316 }
1317 return thistime;
1318 });
1319DECLARE_SOA_DYNAMIC_COLUMN(DyTimeZEM2, timeZEM2,
1320 [](gsl::span<const uint8_t> channelT, gsl::span<const float> time) -> float {
1321 auto thistime = -std::numeric_limits<float>::infinity();
1322 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1323 if (channelT[ie] == o2::zdc::IdZEM2) {
1324 thistime = time[ie];
1325 break; // avoid unnecessary looping
1326 }
1327 }
1328 return thistime;
1329 });
1330DECLARE_SOA_DYNAMIC_COLUMN(DyTimeZNA, timeZNA,
1331 [](gsl::span<const uint8_t> channelT, gsl::span<const float> time) -> float {
1332 auto thistime = -std::numeric_limits<float>::infinity();
1333 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1334 if (channelT[ie] == o2::zdc::IdZNAC) {
1335 thistime = time[ie];
1336 break; // avoid unnecessary looping
1337 }
1338 }
1339 return thistime;
1340 });
1341DECLARE_SOA_DYNAMIC_COLUMN(DyTimeZNC, timeZNC,
1342 [](gsl::span<const uint8_t> channelT, gsl::span<const float> time) -> float {
1343 auto thistime = -std::numeric_limits<float>::infinity();
1344 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1345 if (channelT[ie] == o2::zdc::IdZNCC) {
1346 thistime = time[ie];
1347 break; // avoid unnecessary looping
1348 }
1349 }
1350 return thistime;
1351 });
1352DECLARE_SOA_DYNAMIC_COLUMN(DyTimeZPA, timeZPA,
1353 [](gsl::span<const uint8_t> channelT, gsl::span<const float> time) -> float {
1354 auto thistime = -std::numeric_limits<float>::infinity();
1355 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1356 if (channelT[ie] == o2::zdc::IdZPAC) {
1357 thistime = time[ie];
1358 break; // avoid unnecessary looping
1359 }
1360 }
1361 return thistime;
1362 });
1363DECLARE_SOA_DYNAMIC_COLUMN(DyTimeZPC, timeZPC,
1364 [](gsl::span<const uint8_t> channelT, gsl::span<const float> time) -> float {
1365 auto thistime = -std::numeric_limits<float>::infinity();
1366 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1367 if (channelT[ie] == o2::zdc::IdZPCC) {
1368 thistime = time[ie];
1369 break; // avoid unnecessary looping
1370 }
1371 }
1372 return thistime;
1373 });
1374
1375DECLARE_SOA_DYNAMIC_COLUMN(DyAmplitudeZEM1, amplitudeZEM1,
1376 [](gsl::span<const uint8_t> channelT, gsl::span<const float> amplitude) -> float {
1377 auto thisamplitude = -std::numeric_limits<float>::infinity();
1378 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1379 if (channelT[ie] == o2::zdc::IdZEM1) {
1380 thisamplitude = amplitude[ie];
1381 break; // avoid unnecessary looping
1382 }
1383 }
1384 return thisamplitude;
1385 });
1386DECLARE_SOA_DYNAMIC_COLUMN(DyAmplitudeZEM2, amplitudeZEM2,
1387 [](gsl::span<const uint8_t> channelT, gsl::span<const float> amplitude) -> float {
1388 auto thisamplitude = -std::numeric_limits<float>::infinity();
1389 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1390 if (channelT[ie] == o2::zdc::IdZEM2) {
1391 thisamplitude = amplitude[ie];
1392 break; // avoid unnecessary looping
1393 }
1394 }
1395 return thisamplitude;
1396 });
1397DECLARE_SOA_DYNAMIC_COLUMN(DyAmplitudeZNA, amplitudeZNA,
1398 [](gsl::span<const uint8_t> channelT, gsl::span<const float> amplitude) -> float {
1399 auto thisamplitude = -std::numeric_limits<float>::infinity();
1400 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1401 if (channelT[ie] == o2::zdc::IdZNAC) {
1402 thisamplitude = amplitude[ie];
1403 break; // avoid unnecessary looping
1404 }
1405 }
1406 return thisamplitude;
1407 });
1408DECLARE_SOA_DYNAMIC_COLUMN(DyAmplitudeZNC, amplitudeZNC,
1409 [](gsl::span<const uint8_t> channelT, gsl::span<const float> amplitude) -> float {
1410 auto thisamplitude = -std::numeric_limits<float>::infinity();
1411 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1412 if (channelT[ie] == o2::zdc::IdZNCC) {
1413 thisamplitude = amplitude[ie];
1414 break; // avoid unnecessary looping
1415 }
1416 }
1417 return thisamplitude;
1418 });
1419DECLARE_SOA_DYNAMIC_COLUMN(DyAmplitudeZPA, amplitudeZPA,
1420 [](gsl::span<const uint8_t> channelT, gsl::span<const float> amplitude) -> float {
1421 auto thisamplitude = -std::numeric_limits<float>::infinity();
1422 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1423 if (channelT[ie] == o2::zdc::IdZPAC) {
1424 thisamplitude = amplitude[ie];
1425 break; // avoid unnecessary looping
1426 }
1427 }
1428 return thisamplitude;
1429 });
1430DECLARE_SOA_DYNAMIC_COLUMN(DyAmplitudeZPC, amplitudeZPC,
1431 [](gsl::span<const uint8_t> channelT, gsl::span<const float> amplitude) -> float {
1432 auto thisamplitude = -std::numeric_limits<float>::infinity();
1433 for (uint64_t ie = 0; ie < channelT.size(); ie++) {
1434 if (channelT[ie] == o2::zdc::IdZPCC) {
1435 thisamplitude = amplitude[ie];
1436 break; // avoid unnecessary looping
1437 }
1438 }
1439 return thisamplitude;
1440 });
1441} // namespace zdc
1442
1443DECLARE_SOA_TABLE(Zdcs_000, "AOD", "ZDC",
1444 o2::soa::Index<>, zdc::BCId, zdc::EnergyZEM1, zdc::EnergyZEM2,
1445 zdc::EnergyCommonZNA, zdc::EnergyCommonZNC, zdc::EnergyCommonZPA, zdc::EnergyCommonZPC,
1446 zdc::EnergySectorZNA, zdc::EnergySectorZNC, zdc::EnergySectorZPA, zdc::EnergySectorZPC,
1447 zdc::TimeZEM1, zdc::TimeZEM2, zdc::TimeZNA, zdc::TimeZNC, zdc::TimeZPA, zdc::TimeZPC);
1448
1449// new version of tables: different names for dynamic columns, but same getters
1450DECLARE_SOA_TABLE_VERSIONED(Zdcs_001, "AOD", "ZDC", 1,
1451 o2::soa::Index<>, zdc::BCId, zdc::Energy, zdc::ChannelE, zdc::Amplitude, zdc::Time, zdc::ChannelT,
1452 zdc::DyEnergyZEM1<zdc::ChannelE, zdc::Energy>, zdc::DyEnergyZEM2<zdc::ChannelE, zdc::Energy>,
1453 zdc::DyEnergyCommonZNA<zdc::ChannelE, zdc::Energy>, zdc::DyEnergyCommonZNC<zdc::ChannelE, zdc::Energy>,
1454 zdc::DyEnergyCommonZPA<zdc::ChannelE, zdc::Energy>, zdc::DyEnergyCommonZPC<zdc::ChannelE, zdc::Energy>,
1455 zdc::DyEnergySectorZNA<zdc::ChannelE, zdc::Energy>, zdc::DyEnergySectorZNC<zdc::ChannelE, zdc::Energy>,
1456 zdc::DyEnergySectorZPA<zdc::ChannelE, zdc::Energy>, zdc::DyEnergySectorZPC<zdc::ChannelE, zdc::Energy>,
1457 zdc::DyTimeZEM1<zdc::ChannelT, zdc::Time>, zdc::DyTimeZEM2<zdc::ChannelT, zdc::Time>,
1458 zdc::DyTimeZNA<zdc::ChannelT, zdc::Time>, zdc::DyTimeZNC<zdc::ChannelT, zdc::Time>,
1459 zdc::DyTimeZPA<zdc::ChannelT, zdc::Time>, zdc::DyTimeZPC<zdc::ChannelT, zdc::Time>,
1460 zdc::DyAmplitudeZEM1<zdc::ChannelT, zdc::Amplitude>, zdc::DyAmplitudeZEM2<zdc::ChannelT, zdc::Amplitude>,
1461 zdc::DyAmplitudeZNA<zdc::ChannelT, zdc::Amplitude>, zdc::DyAmplitudeZNC<zdc::ChannelT, zdc::Amplitude>,
1462 zdc::DyAmplitudeZPA<zdc::ChannelT, zdc::Amplitude>, zdc::DyAmplitudeZPC<zdc::ChannelT, zdc::Amplitude>); //
1463using Zdcs = Zdcs_001;
1464using Zdc = Zdcs::iterator;
1465
1466namespace fv0a
1467{
1469DECLARE_SOA_COLUMN(Amplitude, amplitude, std::vector<float>);
1470DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, std::vector<float>);
1471DECLARE_SOA_COLUMN(Channel, channel, std::vector<uint8_t>);
1473DECLARE_SOA_COLUMN(TriggerMask, triggerMask, uint8_t);
1474} // namespace fv0a
1475
1476DECLARE_SOA_TABLE(FV0As, "AOD", "FV0A",
1477 o2::soa::Index<>, fv0a::BCId, fv0a::Amplitude, fv0a::Channel, fv0a::Time, fv0a::TriggerMask);
1478using FV0A = FV0As::iterator;
1479
1480DECLARE_SOA_TABLE(FV0AsExtra, "AOD", "FV0AEXTRA",
1481 o2::soa::Index<>, fv0a::BCId, fv0a::TimeFV0A);
1482using FV0AExtra = FV0AsExtra::iterator;
1483
1484// V0C table for Run2 only
1485namespace fv0c
1486{
1488DECLARE_SOA_COLUMN(Amplitude, amplitude, std::vector<float>);
1489DECLARE_SOA_COLUMN(Channel, channel, std::vector<uint8_t>);
1491} // namespace fv0c
1492
1493DECLARE_SOA_TABLE(FV0Cs, "AOD", "FV0C",
1494 o2::soa::Index<>, fv0c::BCId, fv0c::Amplitude, fv0a::Channel, fv0c::Time);
1495using FV0C = FV0Cs::iterator;
1496
1497namespace ft0
1498{
1500DECLARE_SOA_COLUMN(AmplitudeA, amplitudeA, std::vector<float>);
1501DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, std::vector<float>);
1502DECLARE_SOA_COLUMN(ChannelA, channelA, std::vector<uint8_t>);
1503DECLARE_SOA_COLUMN(AmplitudeC, amplitudeC, std::vector<float>);
1504DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, std::vector<float>);
1505DECLARE_SOA_COLUMN(ChannelC, channelC, std::vector<uint8_t>);
1508DECLARE_SOA_COLUMN(TriggerMask, triggerMask, uint8_t);
1510 [](float timeA, float timeC) -> float {
1512 });
1513DECLARE_SOA_DYNAMIC_COLUMN(CollTime, collTime,
1514 [](float timeA, float timeC) -> float {
1515 return (timeA + timeC) / 2;
1516 });
1517DECLARE_SOA_DYNAMIC_COLUMN(IsValidTimeA, isValidTimeA,
1518 [](float timeA) -> bool {
1519 return timeA < 30.f; // Due to HW limitations time can be only within range (-25,25) ns, dummy time is around 32 ns
1520 });
1521DECLARE_SOA_DYNAMIC_COLUMN(IsValidTimeC, isValidTimeC,
1522 [](float timeC) -> bool {
1523 return timeC < 30.f; // Due to HW limitations time can be only within range (-25,25) ns, dummy time is around 32 ns
1524 });
1525DECLARE_SOA_DYNAMIC_COLUMN(IsValidTime, isValidTime,
1526 [](float timeA, float timeC) -> bool {
1527 return (timeA < 30.f) && (timeC < 30.f); // Due to HW limitations time can be only within range (-25,25) ns, dummy time is around 32 ns
1528 });
1530 [](gsl::span<const float> vecAmpA) -> float {
1531 return std::accumulate(vecAmpA.begin(), vecAmpA.end(), 0.f, [](auto&& sum, auto&& curr) { return sum + (curr > 0 ? curr : 0); });
1532 });
1534 [](gsl::span<const float> vecAmpC) -> float {
1535 return std::accumulate(vecAmpC.begin(), vecAmpC.end(), 0.f, [](auto&& sum, auto&& curr) { return sum + (curr > 0 ? curr : 0); });
1536 });
1537
1538} // namespace ft0
1539
1540DECLARE_SOA_TABLE(FT0s, "AOD", "FT0",
1541 o2::soa::Index<>, ft0::BCId,
1542 ft0::AmplitudeA, ft0::ChannelA, ft0::AmplitudeC, ft0::ChannelC, ft0::TimeA, ft0::TimeC,
1543 ft0::TriggerMask, ft0::PosZ<ft0::TimeA, ft0::TimeC>, ft0::CollTime<ft0::TimeA, ft0::TimeC>,
1544 ft0::IsValidTimeA<ft0::TimeA>, ft0::IsValidTimeC<ft0::TimeC>, ft0::IsValidTime<ft0::TimeA, ft0::TimeC>,
1545 ft0::SumAmpA<ft0::AmplitudeA>, ft0::SumAmpC<ft0::AmplitudeC>);
1546using FT0 = FT0s::iterator;
1547
1548DECLARE_SOA_TABLE(FT0sExtra, "AOD", "FT0EXTRA",
1549 o2::soa::Index<>, ft0::BCId,
1550 ft0::TimeFT0A, ft0::TimeFT0C);
1551using FT0Extra = FT0sExtra::iterator;
1552
1553namespace fdd
1554{
1556DECLARE_SOA_COLUMN(AmplitudeA, amplitudeA, float[4]);
1557DECLARE_SOA_COLUMN(AmplitudeC, amplitudeC, float[4]);
1558
1559DECLARE_SOA_COLUMN(ChargeA, chargeA, int16_t[8]);
1560DECLARE_SOA_COLUMN(ChargeC, chargeC, int16_t[8]);
1561
1562DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float[8]);
1563DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float[8]);
1564
1567DECLARE_SOA_COLUMN(TriggerMask, triggerMask, uint8_t);
1568} // namespace fdd
1569
1570DECLARE_SOA_TABLE(FDDs_000, "AOD", "FDD",
1571 o2::soa::Index<>, fdd::BCId,
1572 fdd::AmplitudeA, fdd::AmplitudeC,
1573 fdd::TimeA, fdd::TimeC,
1574 fdd::TriggerMask);
1575
1576DECLARE_SOA_TABLE_VERSIONED(FDDs_001, "AOD", "FDD", 1,
1578 fdd::BCId,
1579 fdd::ChargeA, fdd::ChargeC,
1580 fdd::TimeA, fdd::TimeC,
1581 fdd::TriggerMask);
1582
1583using FDDs = FDDs_001;
1584using FDD = FDDs::iterator;
1585
1586DECLARE_SOA_TABLE(FDDsExtra, "AOD", "FDDEXTRA",
1587 o2::soa::Index<>, fdd::BCId,
1588 fdd::TimeFDDA, fdd::TimeFDDC);
1589using FDDExtra = FDDsExtra::iterator;
1590
1591namespace v0
1592{
1593DECLARE_SOA_INDEX_COLUMN_FULL(PosTrack, posTrack, int, Tracks, "_Pos");
1594DECLARE_SOA_INDEX_COLUMN_FULL(NegTrack, negTrack, int, Tracks, "_Neg");
1596DECLARE_SOA_COLUMN(V0Type, v0Type, uint8_t);
1597
1598DECLARE_SOA_DYNAMIC_COLUMN(IsStandardV0, isStandardV0,
1599 [](uint8_t V0Type) -> bool { return V0Type & (1 << 0); });
1600DECLARE_SOA_DYNAMIC_COLUMN(IsPhotonV0, isPhotonV0,
1601 [](uint8_t V0Type) -> bool { return V0Type & (1 << 1); });
1602DECLARE_SOA_DYNAMIC_COLUMN(IsCollinearV0, isCollinearV0,
1603 [](uint8_t V0Type) -> bool { return V0Type & (1 << 2); });
1604
1605} // namespace v0
1606
1607DECLARE_SOA_TABLE(V0s_000, "AOD", "V0",
1609 v0::PosTrackId, v0::NegTrackId);
1610DECLARE_SOA_TABLE_VERSIONED(V0s_001, "AOD", "V0", 1,
1611 o2::soa::Index<>, v0::CollisionId,
1612 v0::PosTrackId, v0::NegTrackId);
1613DECLARE_SOA_TABLE_VERSIONED(V0s_002, "AOD", "V0", 2,
1614 o2::soa::Index<>, v0::CollisionId,
1615 v0::PosTrackId, v0::NegTrackId,
1616 v0::V0Type,
1617 v0::IsStandardV0<v0::V0Type>,
1618 v0::IsPhotonV0<v0::V0Type>,
1619 v0::IsCollinearV0<v0::V0Type>);
1620
1621using V0s = V0s_002;
1622using V0 = V0s::iterator;
1623
1624namespace cascade
1625{
1627DECLARE_SOA_INDEX_COLUMN_FULL(Bachelor, bachelor, int, Tracks, "");
1629} // namespace cascade
1630
1631DECLARE_SOA_TABLE(Cascades_000, "AOD", "CASCADE",
1632 o2::soa::Index<>, cascade::V0Id, cascade::BachelorId);
1633DECLARE_SOA_TABLE_VERSIONED(Cascades_001, "AOD", "CASCADE", 1,
1634 o2::soa::Index<>, cascade::CollisionId, cascade::V0Id, cascade::BachelorId);
1635
1636using Cascades = Cascades_001;
1637using Cascade = Cascades::iterator;
1638
1639namespace decay3body
1640{
1641DECLARE_SOA_INDEX_COLUMN_FULL(Track0, track0, int, Tracks, "_0");
1642DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int, Tracks, "_1");
1643DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, Tracks, "_2");
1645} // namespace decay3body
1646
1647DECLARE_SOA_TABLE(Decay3Bodys, "AOD", "DECAY3BODY",
1648 o2::soa::Index<>, decay3body::CollisionId, decay3body::Track0Id, decay3body::Track1Id, decay3body::Track2Id);
1649
1651using Decay3Body = Decay3Bodys::iterator;
1652
1653namespace strangenesstracking
1654{
1656DECLARE_SOA_INDEX_COLUMN_FULL(ITSTrack, itsTrack, int, Tracks, "_ITS");
1660
1661DECLARE_SOA_COLUMN(DecayX, decayX, float);
1662DECLARE_SOA_COLUMN(DecayY, decayY, float);
1663DECLARE_SOA_COLUMN(DecayZ, decayZ, float);
1664DECLARE_SOA_COLUMN(XiMass, xiMass, float);
1665DECLARE_SOA_COLUMN(OmegaMass, omegaMass, float);
1666DECLARE_SOA_COLUMN(H3Lmass, h3Lmass, float);
1667DECLARE_SOA_COLUMN(H4Lmass, h4Lmass, float);
1668DECLARE_SOA_COLUMN(He4Lmass, he4Lmass, float);
1669DECLARE_SOA_COLUMN(MatchingChi2, matchingChi2, float);
1670DECLARE_SOA_COLUMN(TopologyChi2, topologyChi2, float);
1671DECLARE_SOA_COLUMN(ITSclsSize, itsClsSize, float);
1672} // namespace strangenesstracking
1673
1675DECLARE_SOA_TABLE_FULL(TrackedCascades, "TrackedCascade", "AOD", "TRACKEDCASCADE",
1677 strangenesstracking::TrackId,
1678 strangenesstracking::ITSTrackId,
1679 strangenesstracking::CascadeId,
1680 strangenesstracking::DecayX,
1681 strangenesstracking::DecayY,
1682 strangenesstracking::DecayZ,
1683 strangenesstracking::XiMass,
1684 strangenesstracking::OmegaMass,
1685 strangenesstracking::MatchingChi2,
1686 strangenesstracking::TopologyChi2,
1687 strangenesstracking::ITSclsSize);
1688
1689DECLARE_SOA_TABLE_FULL(TrackedV0s, "TrackedV0", "AOD", "TRACKEDV0",
1691 strangenesstracking::TrackId,
1692 strangenesstracking::ITSTrackId,
1693 strangenesstracking::V0Id,
1694 strangenesstracking::DecayX,
1695 strangenesstracking::DecayY,
1696 strangenesstracking::DecayZ,
1697 strangenesstracking::H3Lmass,
1698 strangenesstracking::H4Lmass,
1699 strangenesstracking::MatchingChi2,
1700 strangenesstracking::TopologyChi2,
1701 strangenesstracking::ITSclsSize);
1702
1703DECLARE_SOA_TABLE_FULL(Tracked3Bodys, "Tracked3Body", "AOD", "TRACKED3BODY",
1705 strangenesstracking::TrackId,
1706 strangenesstracking::ITSTrackId,
1707 strangenesstracking::Decay3BodyId,
1708 strangenesstracking::DecayX,
1709 strangenesstracking::DecayY,
1710 strangenesstracking::DecayZ,
1711 strangenesstracking::H3Lmass,
1712 strangenesstracking::He4Lmass,
1713 strangenesstracking::MatchingChi2,
1714 strangenesstracking::TopologyChi2,
1715 strangenesstracking::ITSclsSize);
1716
1718using TrackedCascade = TrackedCascades::iterator;
1720using TrackedV0 = TrackedV0s::iterator;
1722using Tracked3body = Tracked3Bodys::iterator;
1723
1724namespace origins
1725{
1726DECLARE_SOA_COLUMN(DataframeID, dataframeID, uint64_t);
1727} // namespace origins
1728
1729DECLARE_SOA_TABLE(Origins, "AOD", "ORIGIN",
1730 o2::soa::Index<>, origins::DataframeID);
1731
1732using Origin = Origins::iterator;
1733
1734// ---- Run 2 tables ----
1735namespace run2
1736{
1737DECLARE_SOA_COLUMN(EventCuts, eventCuts, uint32_t);
1738DECLARE_SOA_COLUMN(TriggerMaskNext50, triggerMaskNext50, uint64_t);
1739DECLARE_SOA_COLUMN(L0TriggerInputMask, l0TriggerInputMask, uint32_t);
1740DECLARE_SOA_COLUMN(SPDClustersL0, spdClustersL0, uint16_t);
1741DECLARE_SOA_COLUMN(SPDClustersL1, spdClustersL1, uint16_t);
1742DECLARE_SOA_COLUMN(SPDFiredChipsL0, spdFiredChipsL0, uint16_t);
1743DECLARE_SOA_COLUMN(SPDFiredChipsL1, spdFiredChipsL1, uint16_t);
1744DECLARE_SOA_COLUMN(SPDFiredFastOrL0, spdFiredFastOrL0, uint16_t);
1745DECLARE_SOA_COLUMN(SPDFiredFastOrL1, spdFiredFastOrL1, uint16_t);
1746DECLARE_SOA_COLUMN(V0TriggerChargeA, v0TriggerChargeA, uint16_t);
1747DECLARE_SOA_COLUMN(V0TriggerChargeC, v0TriggerChargeC, uint16_t);
1748DECLARE_SOA_COLUMN(NTPCClusters, nTPCClusters, uint32_t);
1749DECLARE_SOA_COLUMN(NSDDSSDClusters, nSDDSSDClusters, uint32_t);
1750namespace oftv0
1751{
1753DECLARE_SOA_INDEX_COLUMN_FULL(PosTrack, posTrack, int, Tracks, "_Pos");
1754DECLARE_SOA_INDEX_COLUMN_FULL(NegTrack, negTrack, int, Tracks, "_Neg");
1755DECLARE_SOA_COLUMN(Px, px, float);
1756DECLARE_SOA_COLUMN(Py, py, float);
1757DECLARE_SOA_COLUMN(Pz, pz, float);
1759DECLARE_SOA_COLUMN(Qt, qt, float);
1764DECLARE_SOA_COLUMN(Chi2NDF, chi2NDF, float);
1765DECLARE_SOA_COLUMN(PsiPair, psiPair, float);
1766DECLARE_SOA_COLUMN(DCAr, dcaR, float);
1767DECLARE_SOA_COLUMN(DCAz, dcaZ, float);
1768DECLARE_SOA_COLUMN(Mass, mass, float);
1769} // namespace oftv0
1770} // namespace run2
1771
1772DECLARE_SOA_TABLE(Run2BCInfos_000, "AOD", "RUN2BCINFO", run2::EventCuts,
1773 run2::TriggerMaskNext50, run2::L0TriggerInputMask,
1774 run2::SPDClustersL0, run2::SPDClustersL1,
1775 run2::SPDFiredChipsL0, run2::SPDFiredChipsL1,
1776 run2::SPDFiredFastOrL0, run2::SPDFiredFastOrL1,
1777 run2::V0TriggerChargeA, run2::V0TriggerChargeC);
1778
1779DECLARE_SOA_TABLE_VERSIONED(Run2BCInfos_001, "AOD", "RUN2BCINFO", 1,
1780 run2::EventCuts,
1781 run2::TriggerMaskNext50, run2::L0TriggerInputMask,
1782 run2::SPDClustersL0, run2::SPDClustersL1,
1783 run2::SPDFiredChipsL0, run2::SPDFiredChipsL1,
1784 run2::SPDFiredFastOrL0, run2::SPDFiredFastOrL1,
1785 run2::V0TriggerChargeA, run2::V0TriggerChargeC,
1786 run2::NTPCClusters, run2::NSDDSSDClusters);
1787
1788using Run2BCInfos = Run2BCInfos_001;
1789using Run2BCInfo = Run2BCInfos::iterator;
1790
1791DECLARE_SOA_TABLE(Run2OTFV0s, "AOD", "Run2OTFV0",
1793 run2::oftv0::CollisionId, run2::oftv0::PosTrackId, run2::oftv0::NegTrackId,
1794 run2::oftv0::Px, run2::oftv0::Py, run2::oftv0::Pz, run2::oftv0::E,
1795 run2::oftv0::Qt, run2::oftv0::Alpha,
1796 run2::oftv0::X, run2::oftv0::Y, run2::oftv0::Z,
1797 run2::oftv0::Chi2NDF, run2::oftv0::PsiPair,
1798 run2::oftv0::DCAr, run2::oftv0::DCAz,
1799 run2::oftv0::Mass);
1800
1801using Run2OTFV0 = Run2OTFV0s::iterator;
1802
1803// ---- MC tables ----
1804namespace mccollision
1805{
1807DECLARE_SOA_COLUMN(GeneratorsID, generatorsID, short);
1808DECLARE_SOA_COLUMN(PosX, posX, float);
1809DECLARE_SOA_COLUMN(PosY, posY, float);
1810DECLARE_SOA_COLUMN(PosZ, posZ, float);
1813DECLARE_SOA_COLUMN(ImpactParameter, impactParameter, float);
1814DECLARE_SOA_COLUMN(EventPlaneAngle, eventPlaneAngle, float);
1815DECLARE_SOA_DYNAMIC_COLUMN(GetGeneratorId, getGeneratorId,
1816 [](short generatorsID) -> int { return o2::mcgenid::getGeneratorId(generatorsID); });
1817DECLARE_SOA_DYNAMIC_COLUMN(GetSubGeneratorId, getSubGeneratorId,
1818 [](short generatorsID) -> int { return o2::mcgenid::getSubGeneratorId(generatorsID); });
1819DECLARE_SOA_DYNAMIC_COLUMN(GetSourceId, getSourceId,
1820 [](short generatorsID) -> int { return o2::mcgenid::getSourceId(generatorsID); });
1821
1822} // namespace mccollision
1823
1824DECLARE_SOA_TABLE(McCollisions_000, "AOD", "MCCOLLISION",
1825 o2::soa::Index<>, mccollision::BCId,
1826 mccollision::GeneratorsID,
1827 mccollision::PosX, mccollision::PosY, mccollision::PosZ,
1828 mccollision::T, mccollision::Weight,
1829 mccollision::ImpactParameter,
1830 mccollision::GetGeneratorId<mccollision::GeneratorsID>,
1831 mccollision::GetSubGeneratorId<mccollision::GeneratorsID>,
1832 mccollision::GetSourceId<mccollision::GeneratorsID>);
1833DECLARE_SOA_TABLE_VERSIONED(McCollisions_001, "AOD", "MCCOLLISION", 1,
1834 o2::soa::Index<>, mccollision::BCId,
1835 mccollision::GeneratorsID,
1836 mccollision::PosX, mccollision::PosY, mccollision::PosZ,
1837 mccollision::T, mccollision::Weight,
1838 mccollision::ImpactParameter,
1839 mccollision::EventPlaneAngle,
1840 mccollision::GetGeneratorId<mccollision::GeneratorsID>,
1841 mccollision::GetSubGeneratorId<mccollision::GeneratorsID>,
1842 mccollision::GetSourceId<mccollision::GeneratorsID>);
1843
1844using McCollisions = McCollisions_001;
1845using McCollision = McCollisions::iterator;
1846
1847namespace mcparticle
1848{
1850DECLARE_SOA_COLUMN(PdgCode, pdgCode, int);
1851DECLARE_SOA_COLUMN(StatusCode, statusCode, int);
1852DECLARE_SOA_COLUMN(Flags, flags, uint8_t);
1853DECLARE_SOA_SELF_INDEX_COLUMN_FULL(Mother0, mother0, int, "McParticles_Mother0");
1854DECLARE_SOA_SELF_INDEX_COLUMN_FULL(Mother1, mother1, int, "McParticles_Mother1");
1855DECLARE_SOA_SELF_INDEX_COLUMN_FULL(Daughter0, daughter0, int, "McParticles_Daughter0");
1856DECLARE_SOA_SELF_INDEX_COLUMN_FULL(Daughter1, daughter1, int, "McParticles_Daughter1");
1860DECLARE_SOA_COLUMN(Px, px, float);
1861DECLARE_SOA_COLUMN(Py, py, float);
1862DECLARE_SOA_COLUMN(Pz, pz, float);
1864DECLARE_SOA_COLUMN(Vx, vx, float);
1865DECLARE_SOA_COLUMN(Vy, vy, float);
1866DECLARE_SOA_COLUMN(Vz, vz, float);
1867DECLARE_SOA_COLUMN(Vt, vt, float);
1868DECLARE_SOA_DYNAMIC_COLUMN(ProducedByGenerator, producedByGenerator,
1869 [](uint8_t flags) -> bool { return (flags & o2::aod::mcparticle::enums::ProducedByTransport) == 0x0; });
1870DECLARE_SOA_DYNAMIC_COLUMN(FromBackgroundEvent, fromBackgroundEvent,
1872DECLARE_SOA_DYNAMIC_COLUMN(GetProcess, getProcess,
1873 [](uint8_t flags, int statusCode) -> int { if ((flags & o2::aod::mcparticle::enums::ProducedByTransport) == 0x0) { return 0 /*TMCProcess::kPrimary*/; } else { return statusCode; } });
1874DECLARE_SOA_DYNAMIC_COLUMN(GetGenStatusCode, getGenStatusCode,
1875 [](uint8_t flags, int statusCode) -> int { if ((flags & o2::aod::mcparticle::enums::ProducedByTransport) == 0x0) { return o2::mcgenstatus::getGenStatusCode(statusCode); } else { return -1; } });
1876DECLARE_SOA_DYNAMIC_COLUMN(GetHepMCStatusCode, getHepMCStatusCode,
1877 [](uint8_t flags, int statusCode) -> int { if ((flags & o2::aod::mcparticle::enums::ProducedByTransport) == 0x0) { return o2::mcgenstatus::getHepMCStatusCode(statusCode); } else { return -1; } });
1878DECLARE_SOA_DYNAMIC_COLUMN(IsPhysicalPrimary, isPhysicalPrimary,
1881 [](float px, float py, float pz) -> std::array<float, 3> { return std::array<float, 3>{px, py, pz}; });
1882
1883DECLARE_SOA_EXPRESSION_COLUMN(Phi, phi, float,
1884 o2::constants::math::PI + natan2(-1.0f * aod::mcparticle::py, -1.0f * aod::mcparticle::px));
1886 ifnode((nsqrt(aod::mcparticle::px * aod::mcparticle::px +
1887 aod::mcparticle::py * aod::mcparticle::py +
1888 aod::mcparticle::pz * aod::mcparticle::pz) -
1889 aod::mcparticle::pz) < static_cast<float>(1e-7),
1890 ifnode(aod::mcparticle::pz < 0.f, -100.f, 100.f),
1891 0.5f * nlog((nsqrt(aod::mcparticle::px * aod::mcparticle::px +
1892 aod::mcparticle::py * aod::mcparticle::py +
1893 aod::mcparticle::pz * aod::mcparticle::pz) +
1894 aod::mcparticle::pz) /
1895 (nsqrt(aod::mcparticle::px * aod::mcparticle::px +
1896 aod::mcparticle::py * aod::mcparticle::py +
1897 aod::mcparticle::pz * aod::mcparticle::pz) -
1898 aod::mcparticle::pz))));
1900 nsqrt(aod::mcparticle::px* aod::mcparticle::px +
1901 aod::mcparticle::py * aod::mcparticle::py));
1903 nsqrt(aod::mcparticle::px* aod::mcparticle::px +
1904 aod::mcparticle::py * aod::mcparticle::py +
1905 aod::mcparticle::pz * aod::mcparticle::pz));
1907 ifnode((aod::mcparticle::e - aod::mcparticle::pz) < static_cast<float>(1e-7),
1908 ifnode(aod::mcparticle::pz < 0.f, -100.f, 100.f),
1909 0.5f * nlog((aod::mcparticle::e + aod::mcparticle::pz) /
1910 (aod::mcparticle::e - aod::mcparticle::pz))));
1911} // namespace mcparticle
1912
1913DECLARE_SOA_TABLE_FULL(StoredMcParticles_000, "McParticles", "AOD", "MCPARTICLE",
1914 o2::soa::Index<>, mcparticle::McCollisionId,
1915 mcparticle::PdgCode, mcparticle::StatusCode, mcparticle::Flags,
1916 mcparticle::Mother0Id, mcparticle::Mother1Id,
1917 mcparticle::Daughter0Id, mcparticle::Daughter1Id, mcparticle::Weight,
1918 mcparticle::Px, mcparticle::Py, mcparticle::Pz, mcparticle::E,
1919 mcparticle::Vx, mcparticle::Vy, mcparticle::Vz, mcparticle::Vt,
1920 mcparticle::PVector<mcparticle::Px, mcparticle::Py, mcparticle::Pz>,
1921 mcparticle::ProducedByGenerator<mcparticle::Flags>,
1922 mcparticle::FromBackgroundEvent<mcparticle::Flags>,
1923 mcparticle::GetGenStatusCode<mcparticle::Flags, mcparticle::StatusCode>,
1924 mcparticle::GetHepMCStatusCode<mcparticle::Flags, mcparticle::StatusCode>,
1925 mcparticle::GetProcess<mcparticle::Flags, mcparticle::StatusCode>,
1926 mcparticle::IsPhysicalPrimary<mcparticle::Flags>);
1927
1928DECLARE_SOA_TABLE_FULL_VERSIONED(StoredMcParticles_001, "McParticles", "AOD", "MCPARTICLE", 1,
1929 o2::soa::Index<>, mcparticle::McCollisionId,
1930 mcparticle::PdgCode, mcparticle::StatusCode, mcparticle::Flags,
1931 mcparticle::MothersIds, mcparticle::DaughtersIdSlice, mcparticle::Weight,
1932 mcparticle::Px, mcparticle::Py, mcparticle::Pz, mcparticle::E,
1933 mcparticle::Vx, mcparticle::Vy, mcparticle::Vz, mcparticle::Vt,
1934 mcparticle::PVector<mcparticle::Px, mcparticle::Py, mcparticle::Pz>,
1935 mcparticle::ProducedByGenerator<mcparticle::Flags>,
1936 mcparticle::FromBackgroundEvent<mcparticle::Flags>,
1937 mcparticle::GetGenStatusCode<mcparticle::Flags, mcparticle::StatusCode>,
1938 mcparticle::GetHepMCStatusCode<mcparticle::Flags, mcparticle::StatusCode>,
1939 mcparticle::GetProcess<mcparticle::Flags, mcparticle::StatusCode>,
1940 mcparticle::IsPhysicalPrimary<mcparticle::Flags>);
1941
1942DECLARE_SOA_EXTENDED_TABLE(McParticles_000, StoredMcParticles_000, "EXMCPARTICLE", 0,
1943 mcparticle::Phi,
1944 mcparticle::Eta,
1945 mcparticle::Pt,
1946 mcparticle::P,
1947 mcparticle::Y);
1948
1949DECLARE_SOA_EXTENDED_TABLE(McParticles_001, StoredMcParticles_001, "EXMCPARTICLE", 1,
1950 mcparticle::Phi,
1951 mcparticle::Eta,
1952 mcparticle::Pt,
1953 mcparticle::P,
1954 mcparticle::Y);
1955
1956using StoredMcParticles = StoredMcParticles_001;
1957using McParticles = McParticles_001;
1958using McParticle = McParticles::iterator;
1959} // namespace aod
1960namespace soa
1961{
1962DECLARE_EQUIVALENT_FOR_INDEX_NG("COLLISION/0", "COLLISION/1");
1963DECLARE_EQUIVALENT_FOR_INDEX_NG("MCPARTICLE/0", "MCPARTICLE/1");
1964DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACK/0", "TRACK_IU/0");
1965DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACK/0", "TRACKEXTRA/0");
1966DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACK_IU/0", "TRACKEXTRA/0");
1967DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACK/0", "TRACKEXTRA/1");
1968DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACK_IU/0", "TRACKEXTRA/1");
1969DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACK/0", "TRACKEXTRA/2");
1970DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACK_IU/0", "TRACKEXTRA/2");
1971DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACKEXTRA/0", "TRACKEXTRA/1");
1972DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACKEXTRA/0", "TRACKEXTRA/2");
1973DECLARE_EQUIVALENT_FOR_INDEX_NG("TRACKEXTRA/1", "TRACKEXTRA/2");
1975DECLARE_EQUIVALENT_FOR_INDEX_NG("MFTTracks/0", "MFTTracks/1");
1976} // namespace soa
1977
1978namespace aod
1979{
1980namespace mctracklabel
1981{
1983DECLARE_SOA_COLUMN(McMask, mcMask, uint16_t);
1984} // namespace mctracklabel
1985
1986DECLARE_SOA_TABLE(McTrackLabels, "AOD", "MCTRACKLABEL",
1987 mctracklabel::McParticleId, mctracklabel::McMask);
1988using McTrackLabel = McTrackLabels::iterator;
1989
1990namespace mcmfttracklabel
1991{
1993DECLARE_SOA_COLUMN(McMask, mcMask, uint8_t);
1994} // namespace mcmfttracklabel
1995
1996DECLARE_SOA_TABLE(McMFTTrackLabels, "AOD", "MCMFTTRACKLABEL",
1997 mcmfttracklabel::McParticleId, mcmfttracklabel::McMask);
1998using McMFTTrackLabel = McMFTTrackLabels::iterator;
1999
2000namespace mcfwdtracklabel
2001{
2003DECLARE_SOA_COLUMN(McMask, mcMask, uint8_t);
2004} // namespace mcfwdtracklabel
2005
2006DECLARE_SOA_TABLE(McFwdTrackLabels, "AOD", "MCFWDTRACKLABEL",
2007 mcfwdtracklabel::McParticleId, mcfwdtracklabel::McMask);
2008using McFwdTrackLabel = McFwdTrackLabels::iterator;
2009
2010namespace mccalolabel
2011{
2014DECLARE_SOA_COLUMN(McMask, mcMask, uint16_t);
2015DECLARE_SOA_COLUMN(AmplitudeA, amplitudeA, std::vector<float>);
2016} // namespace mccalolabel
2017
2018DECLARE_SOA_TABLE(McCaloLabels_000, "AOD", "MCCALOLABEL",
2019 mccalolabel::McParticleId, mccalolabel::McMask);
2020DECLARE_SOA_TABLE_VERSIONED(McCaloLabels_001, "AOD", "MCCALOLABEL", 1,
2021 mccalolabel::McParticleIds, mccalolabel::AmplitudeA);
2022using McCaloLabels = McCaloLabels_000;
2023using McCaloLabel = McCaloLabels::iterator;
2024
2025namespace mccollisionlabel
2026{
2028DECLARE_SOA_COLUMN(McMask, mcMask, uint16_t);
2029} // namespace mccollisionlabel
2030
2031DECLARE_SOA_TABLE(McCollisionLabels, "AOD", "MCCOLLISLABEL",
2032 mccollisionlabel::McCollisionId, mccollisionlabel::McMask);
2033using McCollisionLabel = McCollisionLabels::iterator;
2034
2035// --- HepMC ---
2036namespace hepmcxsection
2037{
2039DECLARE_SOA_COLUMN(GeneratorsID, generatorsID, short);
2040DECLARE_SOA_COLUMN(Accepted, accepted, uint64_t);
2041DECLARE_SOA_COLUMN(Attempted, attempted, uint64_t);
2042DECLARE_SOA_COLUMN(XsectGen, xsectGen, float);
2043DECLARE_SOA_COLUMN(XsectErr, xsectErr, float);
2044DECLARE_SOA_COLUMN(PtHard, ptHard, float);
2045DECLARE_SOA_COLUMN(NMPI, nMPI, int);
2046DECLARE_SOA_COLUMN(ProcessId, processId, int);
2047} // namespace hepmcxsection
2048
2049DECLARE_SOA_TABLE(HepMCXSections, "AOD", "HEPMCXSECTION",
2050 o2::soa::Index<>, hepmcxsection::McCollisionId, hepmcxsection::GeneratorsID,
2051 hepmcxsection::Accepted, hepmcxsection::Attempted, hepmcxsection::XsectGen,
2052 hepmcxsection::XsectErr, hepmcxsection::PtHard, hepmcxsection::NMPI, hepmcxsection::ProcessId);
2053using HepMCXSection = HepMCXSections::iterator;
2054
2055namespace hepmcpdfinfo
2056{
2058DECLARE_SOA_COLUMN(GeneratorsID, generatorsID, short);
2059DECLARE_SOA_COLUMN(Id1, id1, int);
2060DECLARE_SOA_COLUMN(Id2, id2, int);
2061DECLARE_SOA_COLUMN(PdfId1, pdfId1, int);
2062DECLARE_SOA_COLUMN(PdfId2, pdfId2, int);
2064DECLARE_SOA_COLUMN(X2, x2, float);
2065DECLARE_SOA_COLUMN(ScalePdf, scalePdf, float);
2066DECLARE_SOA_COLUMN(Pdf1, pdf1, float);
2067DECLARE_SOA_COLUMN(Pdf2, pdf2, float);
2068} // namespace hepmcpdfinfo
2069
2070DECLARE_SOA_TABLE(HepMCPdfInfos, "AOD", "HEPMCPDFINFO",
2071 o2::soa::Index<>, hepmcpdfinfo::McCollisionId, hepmcpdfinfo::GeneratorsID,
2072 hepmcpdfinfo::Id1, hepmcpdfinfo::Id2,
2073 hepmcpdfinfo::PdfId1, hepmcpdfinfo::PdfId2,
2074 hepmcpdfinfo::X1, hepmcpdfinfo::X2,
2075 hepmcpdfinfo::ScalePdf, hepmcpdfinfo::Pdf1, hepmcpdfinfo::Pdf2);
2076using HepMCPdfInfo = HepMCPdfInfos::iterator;
2077
2078namespace hepmcheavyion
2079{
2081DECLARE_SOA_COLUMN(GeneratorsID, generatorsID, short);
2082DECLARE_SOA_COLUMN(NcollHard, ncollHard, int);
2083DECLARE_SOA_COLUMN(NpartProj, npartProj, int);
2084DECLARE_SOA_COLUMN(NpartTarg, npartTarg, int);
2085DECLARE_SOA_COLUMN(Ncoll, ncoll, int);
2086DECLARE_SOA_COLUMN(NNwoundedCollisions, nNwoundedCollisions, int);
2087DECLARE_SOA_COLUMN(NwoundedNCollisions, nwoundedNCollisions, int);
2088DECLARE_SOA_COLUMN(NwoundedNwoundedCollisions, nwoundedNwoundedCollisions, int);
2089DECLARE_SOA_COLUMN(SpectatorNeutrons, spectatorNeutrons, int);
2090DECLARE_SOA_COLUMN(SpectatorProtons, spectatorProtons, int);
2091DECLARE_SOA_COLUMN(ImpactParameter, impactParameter, float);
2092DECLARE_SOA_COLUMN(EventPlaneAngle, eventPlaneAngle, float);
2093DECLARE_SOA_COLUMN(Eccentricity, eccentricity, float);
2094DECLARE_SOA_COLUMN(SigmaInelNN, sigmaInelNN, float);
2095DECLARE_SOA_COLUMN(Centrality, centrality, float);
2096} // namespace hepmcheavyion
2097
2098DECLARE_SOA_TABLE(HepMCHeavyIons, "AOD", "HEPMCHEAVYION",
2099 o2::soa::Index<>, hepmcheavyion::McCollisionId, hepmcheavyion::GeneratorsID,
2100 hepmcheavyion::NcollHard, hepmcheavyion::NpartProj, hepmcheavyion::NpartTarg,
2101 hepmcheavyion::Ncoll, hepmcheavyion::NNwoundedCollisions, hepmcheavyion::NwoundedNCollisions,
2102 hepmcheavyion::NwoundedNwoundedCollisions, hepmcheavyion::SpectatorNeutrons,
2103 hepmcheavyion::SpectatorProtons, hepmcheavyion::ImpactParameter, hepmcheavyion::EventPlaneAngle,
2104 hepmcheavyion::Eccentricity, hepmcheavyion::SigmaInelNN, hepmcheavyion::Centrality);
2105using HepMCHeavyIon = HepMCHeavyIons::iterator;
2106
2107// --- Matching between collisions and other tables through BC ---
2108
2120
2121// First entry: Collision
2122#define INDEX_LIST_RUN2 indices::CollisionId, indices::ZdcId, indices::BCId, indices::FT0Id, indices::FV0AId, indices::FV0CId, indices::FDDId
2123DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(Run2MatchedExclusive, BCs, "MA_RN2_EX", INDEX_LIST_RUN2);
2124DECLARE_SOA_INDEX_TABLE(Run2MatchedSparse, BCs, "MA_RN2_SP", INDEX_LIST_RUN2);
2125
2126#define INDEX_LIST_RUN3 indices::CollisionId, indices::ZdcId, indices::BCId, indices::FT0Id, indices::FV0AId, indices::FDDId
2127DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(Run3MatchedExclusive, BCs, "MA_RN3_EX", INDEX_LIST_RUN3);
2128DECLARE_SOA_INDEX_TABLE(Run3MatchedSparse, BCs, "MA_RN3_SP", INDEX_LIST_RUN3);
2129
2130// First entry: BC
2131DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(MatchedBCCollisionsExclusive, BCs, "MA_BCCOL_EX",
2132 indices::BCId, indices::CollisionId);
2133DECLARE_SOA_INDEX_TABLE(MatchedBCCollisionsSparse, BCs, "MA_BCCOL_SP",
2134 indices::BCId, indices::CollisionId);
2135
2136DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(MatchedBCCollisionsExclusiveMulti, BCs, "MA_BCCOLS_EX",
2137 indices::BCId, indices::CollisionIds);
2138DECLARE_SOA_INDEX_TABLE(MatchedBCCollisionsSparseMulti, BCs, "MA_BCCOLS_SP",
2139 indices::BCId, indices::CollisionIds);
2140
2141DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(Run3MatchedToBCExclusive, BCs, "MA_RN3_BC_EX",
2142 indices::BCId, indices::ZdcId, indices::FT0Id, indices::FV0AId, indices::FDDId);
2143DECLARE_SOA_INDEX_TABLE(Run3MatchedToBCSparse, BCs, "MA_RN3_BC_SP",
2144 indices::BCId, indices::ZdcId, indices::FT0Id, indices::FV0AId, indices::FDDId);
2145
2146DECLARE_SOA_INDEX_TABLE(Run2MatchedToBCSparse, BCs, "MA_RN2_BC_SP",
2147 indices::BCId, indices::ZdcId, indices::FT0Id, indices::FV0AId, indices::FV0CId, indices::FDDId);
2148
2149} // namespace aod
2150namespace soa
2151{
2152// equivalences
2153DECLARE_EQUIVALENT_FOR_INDEX(aod::StoredTracks, aod::McTrackLabels);
2154DECLARE_EQUIVALENT_FOR_INDEX(aod::StoredTracksIU, aod::McTrackLabels);
2156// Joins with collisions (only for sparse ones)
2157// NOTE: index table needs to be always last argument
2158extern template struct JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::Collisions, aod::Run2MatchedSparse>;
2159extern template struct JoinFull<o2::aod::Hash<"JOIN/0"_h>, aod::Collisions, aod::Run3MatchedSparse>;
2160} // namespace soa
2161namespace aod
2162{
2165
2166} // namespace aod
2167
2168} // namespace o2
2169#endif // O2_FRAMEWORK_ANALYSISDATAMODEL_H_
#define DECLARE_SOA_ARRAY_INDEX_COLUMN(_Name_, _Getter_)
Definition ASoA.h:2655
#define DECLARE_SOA_SELF_INDEX_COLUMN_FULL(_Name_, _Getter_, _Type_, _Label_)
Definition ASoA.h:2797
#define DECLARE_SOA_SLICE_INDEX_COLUMN(_Name_, _Getter_)
Definition ASoA.h:2500
#define DECLARE_SOA_DYNAMIC_COLUMN(_Name_, _Getter_,...)
Definition ASoA.h:2967
#define DECLARE_SOA_TABLE(_Name_, _Origin_, _Desc_,...)
Definition ASoA.h:3052
#define DECLARE_SOA_EXPRESSION_COLUMN(_Name_, _Getter_, _Type_, _Expression_)
Definition ASoA.h:2388
#define DECLARE_SOA_COLUMN(_Name_, _Getter_, _Type_)
Definition ASoA.h:2314
#define DECLARE_SOA_INDEX_COLUMN_FULL(_Name_, _Getter_, _Type_, _Table_, _Suffix_)
Definition ASoA.h:2736
#define DECLARE_EQUIVALENT_FOR_INDEX(_Base_, _Equiv_)
Definition ASoA.h:2273
#define DECLARE_SOA_SELF_SLICE_INDEX_COLUMN(_Name_, _Getter_)
Definition ASoA.h:2861
#define DECLARE_SOA_TABLE_FULL(_Name_, _Label_, _Origin_, _Desc_,...)
Definition ASoA.h:3047
#define DECLARE_EQUIVALENT_FOR_INDEX_NG(_Base_, _Equiv_)
Definition ASoA.h:2279
#define DECLARE_SOA_TABLE_VERSIONED(_Name_, _Origin_, _Desc_, _Version_,...)
Definition ASoA.h:3055
#define DECLARE_SOA_INDEX_COLUMN(_Name_, _Getter_)
Definition ASoA.h:2737
#define DECLARE_SOA_TABLE_FULL_VERSIONED(_Name_, _Label_, _Origin_, _Desc_, _Version_,...)
Definition ASoA.h:3043
#define DECLARE_SOA_EXTENDED_TABLE(_Name_, _Table_, _Description_, _Version_,...)
Definition ASoA.h:3094
#define DECLARE_SOA_INDEX_TABLE_EXCLUSIVE(_Name_, _Key_, _Description_,...)
Definition ASoA.h:3129
#define DECLARE_SOA_INDEX_TABLE(_Name_, _Key_, _Description_,...)
Definition ASoA.h:3126
#define DECLARE_SOA_SELF_ARRAY_INDEX_COLUMN(_Name_, _Getter_)
Definition ASoA.h:2937
#define INDEX_LIST_RUN3
#define INDEX_LIST_RUN2
int64_t timeC
int64_t timeA
uint64_t bc
Definition RawEventData.h:5
int16_t time
Definition RawEventData.h:4
TOF PID utilities to work with the information stored in the AO2D.
Some ALICE geometry constants of common interest.
useful math constants
Header to collect physics constants.
Some ZDC constants shared between O2 and O2Physics.
int nClusters
float sum(float s, o2::dcs::DataPointValue v)
Definition dcs-ccdb.cxx:39
constexpr bool run2
GLfloat GLfloat GLfloat alpha
Definition glcorearb.h:279
GLint GLenum GLint x
Definition glcorearb.h:403
const GLfloat * m
Definition glcorearb.h:4066
GLuint GLfloat GLfloat GLfloat x1
Definition glcorearb.h:5034
GLuint GLuint GLfloat weight
Definition glcorearb.h:5477
GLuint GLsizei GLsizei * length
Definition glcorearb.h:790
GLsizei GLenum const void * indices
Definition glcorearb.h:400
GLfloat v0
Definition glcorearb.h:811
GLbitfield flags
Definition glcorearb.h:1570
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLboolean r
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
o2::constants::math::PI natan2(-1.0f *aod::mcparticle::py, -1.0f *aod::mcparticle::px))
uint8_t itsSharedClusterMap uint8_t
constexpr uint8_t bit
ifnode(nasin(aod::track::snp)+aod::track::alpha< 0.0f, nasin(aod::track::snp)+aod::track::alpha+o2::constants::math::TwoPI, ifnode(nasin(aod::track::snp)+aod::track::alpha >=o2::constants::math::TwoPI, nasin(aod::track::snp)+aod::track::alpha - o2::constants::math::TwoPI, nasin(aod::track::snp)+aod::track::alpha)))
(sign of charge)/Pt in c/GeV. Use pt() and sign() instead
gsl::span< const uint8_t > channelE
McParticles::iterator McParticle
FV0Cs::iterator FV0C
StoredMcParticles_001 StoredMcParticles
TrackedV0s::iterator TrackedV0
Calos::iterator Calo
FT0sExtra::iterator FT0Extra
McParticles_001 McParticles
Origins::iterator Origin
FullTracks::iterator FullTrack
BCs::iterator BC
FDDsExtra::iterator FDDExtra
HepMCHeavyIons::iterator HepMCHeavyIon
FT0s::iterator FT0
Tracked3Bodys Tracked3Bodys
TracksExtra::iterator TrackExtra
TrackedCascades TrackedCascades
McCollisions_001 McCollisions
AmbiguousMFTTracks::iterator AmbiguousMFTTrack
Zdcs::iterator Zdc
new version
FDDs::iterator FDD
this defines the current default version
AmbiguousFwdTracks::iterator AmbiguousFwdTrack
Run2OTFV0s::iterator Run2OTFV0
TrackedV0s TrackedV0s
FV0AsExtra::iterator FV0AExtra
StoredTracksExtra_002 StoredTracksExtra
HepMCXSections::iterator HepMCXSection
Decay3Bodys Decay3Bodys
FV0As::iterator FV0A
McFwdTrackLabels::iterator McFwdTrackLabel
Cascades_001 Cascades
McCaloLabels::iterator McCaloLabel
Run2TrackExtras::iterator Run2TrackExtra
McCollisions::iterator McCollision
FwdTracksCov::iterator FwdTrackCovFwd
Collisions_001 Collisions
soa::Join< Collisions, Run2MatchedSparse >::iterator CollisionMatchedRun2Sparse
AmbiguousTracks::iterator AmbiguousTrack
TracksQAVersion::iterator TracksQA
FwdTrkCls::iterator FwdTrkCl
Run2TrackExtras_001 Run2TrackExtras
CPVClusters::iterator CPVCluster
McCollisionLabels::iterator McCollisionLabel
FwdTracks::iterator FwdTrack
TracksIU::iterator TrackIU
Cascades::iterator Cascade
this defines the current default version
HMPIDs::iterator HMPID
McMFTTrackLabels::iterator McMFTTrackLabel
TracksCov::iterator TrackCov
HepMCPdfInfos::iterator HepMCPdfInfo
TracksExtra_002 TracksExtra
StoredMFTTracks_001 StoredMFTTracks
Decay3Bodys::iterator Decay3Body
this defines the current default version
Tracks::iterator Track
HMPID_001 HMPIDs
FullFwdTracks::iterator FullFwdTrack
TracksCovIU::iterator TrackCovIU
MFTTracks_001 MFTTracks
Run2BCInfos::iterator Run2BCInfo
TracksQA_002 TracksQAVersion
McCaloLabels_000 McCaloLabels
soa::Join< Collisions, Run3MatchedSparse >::iterator CollisionMatchedRun3Sparse
CaloTriggers::iterator CaloTrigger
Tracked3Bodys::iterator Tracked3body
McTrackLabels::iterator McTrackLabel
MFTTracksCov::iterator MFTTrackCovFwd
Run2BCInfos_001 Run2BCInfos
TrackedCascades::iterator TrackedCascade
Collisions::iterator Collision
MFTTracks::iterator MFTTrack
constexpr float XBeamPipeOuterRef
inner radius of the beam pipe
constexpr float Almost0
constexpr float TwoPI
constexpr float PI
constexpr float PIQuarter
constexpr float VeryBig
constexpr double MassHelium3
constexpr double MassTriton
constexpr double MassMuon
constexpr double MassKaonCharged
constexpr float LightSpeedCm2NS
constexpr double MassDeuteron
constexpr double MassAlpha
constexpr double MassElectron
constexpr double MassProton
constexpr double MassPionCharged
float MassToExpTime(float tofExpMom, float length, float massSquared)
Compute the expected time of flight for a given momentum, length and massSquared.
Definition PID.h:36
int getSourceId(short encoded)
int getGeneratorId(short encoded)
int getSubGeneratorId(short encoded)
int getGenStatusCode(MCGenStatusEncoding enc)
int getHepMCStatusCode(MCGenStatusEncoding enc)
constexpr int IdZPC4
constexpr int IdZPA2
constexpr int IdZNA3
constexpr int IdZNA1
constexpr int IdZPA1
constexpr int IdZNC2
constexpr int IdZEM1
constexpr int IdZNCC
constexpr int IdZPAC
constexpr int IdZPC2
constexpr int IdZPA4
constexpr int IdZNC1
constexpr int IdZNC3
constexpr int IdZPCC
constexpr int IdZPC1
constexpr int IdZPA3
constexpr int IdZNC4
constexpr int IdZEM2
constexpr int IdZNA2
constexpr int IdZPC3
constexpr int IdZNA4
constexpr int IdZNAC
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
union o2::aod::track::extensions::TPCTimeErrEncoding::TPCDeltaTime encoding
table_t::template iterator_template< DefaultIndexPolicy, self_t, Ts... > iterator
Definition ASoA.h:3162