|
| 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 | + |
| 12 | +#ifndef PWGLF_DATAMODEL_VTX3BODYTABLES_H_ |
| 13 | +#define PWGLF_DATAMODEL_VTX3BODYTABLES_H_ |
| 14 | + |
| 15 | +#include <cmath> |
| 16 | +#include "Framework/AnalysisDataModel.h" |
| 17 | +#include "Common/Core/RecoDecay.h" |
| 18 | +#include "CommonConstants/PhysicsConstants.h" |
| 19 | + |
| 20 | +namespace o2::aod |
| 21 | +{ |
| 22 | +namespace vtx3body |
| 23 | +{ |
| 24 | +DECLARE_SOA_INDEX_COLUMN_FULL(Track0, track0, int, Tracks, "_0"); //! |
| 25 | +DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int, Tracks, "_1"); //! |
| 26 | +DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, Tracks, "_2"); //! |
| 27 | +DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! |
| 28 | + |
| 29 | +// General 3 body Vtx properties: position, momentum |
| 30 | +DECLARE_SOA_COLUMN(PxTrack0, pxtrack0, float); //! track0 px at min |
| 31 | +DECLARE_SOA_COLUMN(PyTrack0, pytrack0, float); //! track0 py at min |
| 32 | +DECLARE_SOA_COLUMN(PzTrack0, pztrack0, float); //! track0 pz at min |
| 33 | +DECLARE_SOA_COLUMN(PxTrack1, pxtrack1, float); //! track1 px at min |
| 34 | +DECLARE_SOA_COLUMN(PyTrack1, pytrack1, float); //! track1 py at min |
| 35 | +DECLARE_SOA_COLUMN(PzTrack1, pztrack1, float); //! track1 pz at min |
| 36 | +DECLARE_SOA_COLUMN(PxTrack2, pxtrack2, float); //! track2 px at min |
| 37 | +DECLARE_SOA_COLUMN(PyTrack2, pytrack2, float); //! track2 py at min |
| 38 | +DECLARE_SOA_COLUMN(PzTrack2, pztrack2, float); //! track2 pz at min |
| 39 | +DECLARE_SOA_COLUMN(X, x, float); //! decay position X |
| 40 | +DECLARE_SOA_COLUMN(Y, y, float); //! decay position Y |
| 41 | +DECLARE_SOA_COLUMN(Z, z, float); //! decay position Z |
| 42 | + |
| 43 | +// Saved from finding: DCAs |
| 44 | +DECLARE_SOA_COLUMN(DCAVtxDaughters, dcaVtxdaughters, float); //! DCA between daughters |
| 45 | +DECLARE_SOA_COLUMN(DCATrack0ToPV, dcatrack0topv, float); //! DCA prong0 to PV |
| 46 | +DECLARE_SOA_COLUMN(DCATrack1ToPV, dcatrack1topv, float); //! DCA prong1 to PV |
| 47 | +DECLARE_SOA_COLUMN(DCATrack2ToPV, dcatrack2topv, float); //! DCA prong2 to PV |
| 48 | + |
| 49 | +// Derived expressions |
| 50 | +// Momenta |
| 51 | +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! 3 body pT |
| 52 | + [](float pxtrack0, float pytrack0, float pxtrack1, float pytrack1, float pxtrack2, float pytrack2) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack0 + pxtrack1 + pxtrack2, pytrack0 + pytrack1 + pytrack2); }); |
| 53 | + |
| 54 | +// Length quantities |
| 55 | +DECLARE_SOA_DYNAMIC_COLUMN(VtxRadius, vtxradius, //! 3 body decay radius (2D, centered at zero) |
| 56 | + [](float x, float y) -> float { return RecoDecay::sqrtSumOfSquares(x, y); }); |
| 57 | + |
| 58 | +// Distance Over To Mom |
| 59 | +DECLARE_SOA_DYNAMIC_COLUMN(DistOverTotMom, distovertotmom, //! PV to 3 body decay distance over total momentum |
| 60 | + [](float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) { |
| 61 | + float P = RecoDecay::sqrtSumOfSquares(Px, Py, Pz); |
| 62 | + return std::sqrt(std::pow(X - pvX, 2) + std::pow(Y - pvY, 2) + std::pow(Z - pvZ, 2)) / (P + 1E-10); |
| 63 | + }); |
| 64 | + |
| 65 | +// CosPA |
| 66 | +DECLARE_SOA_DYNAMIC_COLUMN(VtxCosPA, vtxcosPA, //! 3 body vtx CosPA |
| 67 | + [](float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) -> float { return RecoDecay::cpa(array{pvX, pvY, pvZ}, array{X, Y, Z}, array{Px, Py, Pz}); }); |
| 68 | +DECLARE_SOA_DYNAMIC_COLUMN(DCAVtxToPV, dcavtxtopv, //! DCA of 3 body vtx to PV |
| 69 | + [](float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) -> float { return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); }); |
| 70 | + |
| 71 | +// Calculated on the fly with mass assumption + dynamic tables |
| 72 | +DECLARE_SOA_DYNAMIC_COLUMN(MHypertriton, mHypertriton, //! mass under Hypertriton hypothesis |
| 73 | + [](float pxtrack0, float pytrack0, float pztrack0, float pxtrack1, float pytrack1, float pztrack1, float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::m(array{array{pxtrack0, pytrack0, pztrack0}, array{pxtrack1, pytrack1, pztrack1}, array{pxtrack2, pytrack2, pztrack2}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); }); |
| 74 | +DECLARE_SOA_DYNAMIC_COLUMN(MAntiHypertriton, mAntiHypertriton, //! mass under antiHypertriton hypothesis |
| 75 | + [](float pxtrack0, float pytrack0, float pztrack0, float pxtrack1, float pytrack1, float pztrack1, float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::m(array{array{pxtrack0, pytrack0, pztrack0}, array{pxtrack1, pytrack1, pztrack1}, array{pxtrack2, pytrack2, pztrack2}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); }); |
| 76 | + |
| 77 | +DECLARE_SOA_DYNAMIC_COLUMN(YHypertriton, yHypertriton, //! 3 body vtx y with hypertriton or antihypertriton hypothesis |
| 78 | + [](float Px, float Py, float Pz) -> float { return RecoDecay::y(array{Px, Py, Pz}, o2::constants::physics::MassHyperTriton); }); // here MassHyperTriton = 2.992 |
| 79 | +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, //! 3 body vtx eta |
| 80 | + [](float Px, float Py, float Pz) -> float { return RecoDecay::eta(array{Px, Py, Pz}); }); |
| 81 | +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, //! 3 body vtx phi |
| 82 | + [](float Px, float Py) -> float { return RecoDecay::phi(Px, Py); }); |
| 83 | + |
| 84 | +DECLARE_SOA_DYNAMIC_COLUMN(Track0Pt, track0pt, //! daughter0 pT |
| 85 | + [](float pxtrack0, float pytrack0) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack0, pytrack0); }); |
| 86 | +DECLARE_SOA_DYNAMIC_COLUMN(Track1Pt, track1pt, //! daughter1 pT |
| 87 | + [](float pxtrack1, float pytrack1) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack1, pytrack1); }); |
| 88 | +DECLARE_SOA_DYNAMIC_COLUMN(Track2Pt, track2pt, //! daughter2 pT |
| 89 | + [](float pxtrack2, float pytrack2) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack2, pytrack2); }); |
| 90 | +DECLARE_SOA_DYNAMIC_COLUMN(Track0Eta, track0eta, //! daughter0 eta |
| 91 | + [](float pxtrack0, float pytrack0, float pztrack0) -> float { return RecoDecay::eta(array{pxtrack0, pytrack0, pztrack0}); }); |
| 92 | +DECLARE_SOA_DYNAMIC_COLUMN(Track0Phi, track0phi, //! daughter0 phi |
| 93 | + [](float pxtrack0, float pytrack0) -> float { return RecoDecay::phi(pxtrack0, pytrack0); }); |
| 94 | +DECLARE_SOA_DYNAMIC_COLUMN(Track1Eta, track1eta, //! daughter1 eta |
| 95 | + [](float pxtrack1, float pytrack1, float pztrack1) -> float { return RecoDecay::eta(array{pxtrack1, pytrack1, pztrack1}); }); |
| 96 | +DECLARE_SOA_DYNAMIC_COLUMN(Track1Phi, track1phi, //! daughter1 phi |
| 97 | + [](float pxtrack1, float pytrack1) -> float { return RecoDecay::phi(pxtrack1, pytrack1); }); |
| 98 | +DECLARE_SOA_DYNAMIC_COLUMN(Track2Eta, track2eta, //! daughter2 eta |
| 99 | + [](float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::eta(array{pxtrack2, pytrack2, pztrack2}); }); |
| 100 | +DECLARE_SOA_DYNAMIC_COLUMN(Track2Phi, track2phi, //! daughter2 phi |
| 101 | + [](float pxtrack2, float pytrack2) -> float { return RecoDecay::phi(pxtrack2, pytrack2); }); |
| 102 | + |
| 103 | +DECLARE_SOA_EXPRESSION_COLUMN(Px, px, //! 3 body vtx px |
| 104 | + float, 1.f * aod::vtx3body::pxtrack0 + 1.f * aod::vtx3body::pxtrack1 + 1.f * aod::vtx3body::pxtrack2); |
| 105 | +DECLARE_SOA_EXPRESSION_COLUMN(Py, py, //! 3 body vtx py |
| 106 | + float, 1.f * aod::vtx3body::pytrack0 + 1.f * aod::vtx3body::pytrack1 + 1.f * aod::vtx3body::pytrack2); |
| 107 | +DECLARE_SOA_EXPRESSION_COLUMN(Pz, pz, //! 3 body vtx pz |
| 108 | + float, 1.f * aod::vtx3body::pztrack0 + 1.f * aod::vtx3body::pztrack1 + 1.f * aod::vtx3body::pztrack2); |
| 109 | +} // namespace vtx3body |
| 110 | + |
| 111 | +DECLARE_SOA_TABLE_FULL(StoredVtx3BodyDatas, "Vtx3BodyDatas", "AOD", "Vtx3BodyDATA", //! |
| 112 | + o2::soa::Index<>, vtx3body::Track0Id, vtx3body::Track1Id, vtx3body::Track2Id, vtx3body::CollisionId, |
| 113 | + vtx3body::X, vtx3body::Y, vtx3body::Z, |
| 114 | + vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PzTrack0, |
| 115 | + vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, |
| 116 | + vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2, |
| 117 | + vtx3body::DCAVtxDaughters, |
| 118 | + vtx3body::DCATrack0ToPV, vtx3body::DCATrack1ToPV, vtx3body::DCATrack2ToPV, |
| 119 | + |
| 120 | + // Dynamic columns |
| 121 | + vtx3body::Pt<vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PxTrack2, vtx3body::PyTrack2>, |
| 122 | + vtx3body::VtxRadius<vtx3body::X, vtx3body::Y>, |
| 123 | + vtx3body::DistOverTotMom<vtx3body::X, vtx3body::Y, vtx3body::Z, vtx3body::Px, vtx3body::Py, vtx3body::Pz>, |
| 124 | + vtx3body::VtxCosPA<vtx3body::X, vtx3body::Y, vtx3body::Z, vtx3body::Px, vtx3body::Py, vtx3body::Pz>, |
| 125 | + vtx3body::DCAVtxToPV<vtx3body::X, vtx3body::Y, vtx3body::Z, vtx3body::Px, vtx3body::Py, vtx3body::Pz>, |
| 126 | + |
| 127 | + // Invariant masses |
| 128 | + vtx3body::MHypertriton<vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PzTrack0, vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2>, |
| 129 | + vtx3body::MAntiHypertriton<vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PzTrack0, vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2>, |
| 130 | + |
| 131 | + // Longitudinal |
| 132 | + vtx3body::YHypertriton<vtx3body::Px, vtx3body::Py, vtx3body::Pz>, |
| 133 | + vtx3body::Eta<vtx3body::Px, vtx3body::Py, vtx3body::Pz>, |
| 134 | + vtx3body::Phi<vtx3body::Px, vtx3body::Py>, |
| 135 | + vtx3body::Track0Pt<vtx3body::PxTrack0, vtx3body::PyTrack0>, |
| 136 | + vtx3body::Track0Eta<vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PzTrack0>, |
| 137 | + vtx3body::Track0Phi<vtx3body::PxTrack0, vtx3body::PyTrack0>, |
| 138 | + vtx3body::Track1Pt<vtx3body::PxTrack1, vtx3body::PyTrack1>, |
| 139 | + vtx3body::Track1Eta<vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1>, |
| 140 | + vtx3body::Track1Phi<vtx3body::PxTrack1, vtx3body::PyTrack1>, |
| 141 | + vtx3body::Track2Pt<vtx3body::PxTrack2, vtx3body::PyTrack2>, |
| 142 | + vtx3body::Track2Eta<vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2>, |
| 143 | + vtx3body::Track2Phi<vtx3body::PxTrack2, vtx3body::PyTrack2>); |
| 144 | + |
| 145 | +// extended table with expression columns that can be used as arguments of dynamic columns |
| 146 | +DECLARE_SOA_EXTENDED_TABLE_USER(Vtx3BodyDatas, StoredVtx3BodyDatas, "Vtx3BodyDATAEXT", //! |
| 147 | + vtx3body::Px, vtx3body::Py, vtx3body::Pz); |
| 148 | + |
| 149 | +using Vtx3BodyData = Vtx3BodyDatas::iterator; |
| 150 | +namespace vtx3body |
| 151 | +{ |
| 152 | +DECLARE_SOA_INDEX_COLUMN(Vtx3BodyData, vtx3BodyData); //! Index to Vtx3BodyData entry |
| 153 | +} |
| 154 | + |
| 155 | +DECLARE_SOA_TABLE(Vtx3BodyDataLink, "AOD", "VtxDATALINK", //! Joinable table with Decay3bodys which links to Vtx3BodyData which is not produced for all entries |
| 156 | + vtx3body::Vtx3BodyDataId); |
| 157 | + |
| 158 | +using Vtxs3BodyLinked = soa::Join<Decay3Bodys, Vtx3BodyDataLink>; |
| 159 | +using Vtx3BodyLinked = Vtxs3BodyLinked::iterator; |
| 160 | + |
| 161 | +} // namespace o2::aod |
| 162 | +#endif // PWGLF_DATAMODEL_VTX3BODYTABLES_H_ |
0 commit comments