1212#define O2_FRAMEWORK_ANALYSISDATAMODEL_H_
1313
1414#include " Framework/ASoA.h"
15+
1516#include < cmath>
1617#include < bitset>
1718#include < numeric>
19+ #include < utility> // std::move
20+
1821#include " Framework/DataTypes.h"
1922#include " CommonConstants/MathConstants.h"
2023#include " CommonConstants/PhysicsConstants.h"
@@ -153,6 +156,17 @@ DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! Momentum in z-direction in GeV/c
153156 auto pt = 1 .f / std::abs (signed1Pt);
154157 return pt * tgl;
155158 });
159+ DECLARE_SOA_DYNAMIC_COLUMN (PVector, pVector, // ! Momentum vector in x,y,z-directions in GeV/c
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::move (std::array<float , 3 >{std::move (px), std::move (py), std::move (pz)});
169+ });
156170DECLARE_SOA_EXPRESSION_COLUMN (P, p, float , // ! Momentum in Gev/c
157171 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)));
158172DECLARE_SOA_DYNAMIC_COLUMN (Energy, energy, // ! Track energy, computed under the mass assumption given as input
@@ -366,6 +380,7 @@ DECLARE_SOA_TABLE_FULL(StoredTracks, "Tracks", "AOD", "TRACK", //! On disk versi
366380 track::Px<track::Signed1Pt, track::Snp, track::Alpha>,
367381 track::Py<track::Signed1Pt, track::Snp, track::Alpha>,
368382 track::Pz<track::Signed1Pt, track::Tgl>,
383+ track::PVector<track::Signed1Pt, track::Snp, track::Alpha, track::Tgl>,
369384 track::Energy<track::Signed1Pt, track::Tgl>,
370385 track::Rapidity<track::Signed1Pt, track::Tgl>,
371386 track::Sign<track::Signed1Pt>,
@@ -385,6 +400,7 @@ DECLARE_SOA_TABLE_FULL(StoredTracksIU, "Tracks_IU", "AOD", "TRACK_IU", //! On di
385400 track::Px<track::Signed1Pt, track::Snp, track::Alpha>,
386401 track::Py<track::Signed1Pt, track::Snp, track::Alpha>,
387402 track::Pz<track::Signed1Pt, track::Tgl>,
403+ track::PVector<track::Signed1Pt, track::Snp, track::Alpha, track::Tgl>,
388404 track::Energy<track::Signed1Pt, track::Tgl>,
389405 track::Rapidity<track::Signed1Pt, track::Tgl>,
390406 track::Sign<track::Signed1Pt>,
0 commit comments