Skip to content

Commit a0ad916

Browse files
authored
Hypertriton 3body decay analysis (AliceO2Group#3045)
Hypertriton 3body decay analysis
1 parent 1021430 commit a0ad916

7 files changed

+2559
-0
lines changed

PWGLF/DataModel/Vtx3BodyTables.h

+162
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
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_

PWGLF/TableProducer/CMakeLists.txt

+10
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ o2physics_add_dpl_workflow(threebodymcfinder
9898
PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore
9999
COMPONENT_NAME Analysis)
100100

101+
o2physics_add_dpl_workflow(hypertriton3bodybuilder
102+
SOURCES hypertriton3bodybuilder.cxx
103+
PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore
104+
COMPONENT_NAME Analysis)
105+
106+
o2physics_add_dpl_workflow(hypertriton3bodyfinder
107+
SOURCES hypertriton3bodyfinder.cxx
108+
PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore
109+
COMPONENT_NAME Analysis)
110+
101111
# Resonances
102112
o2physics_add_dpl_workflow(reso2initializer
103113
SOURCES LFResonanceInitializer.cxx

0 commit comments

Comments
 (0)