Skip to content

Commit 5ff679a

Browse files
ddobrigkalibuild
authored andcommitted
[PWGLF] Improvements in data model for strangeness, strangeness tof pid cleanup (AliceO2Group#12912)
Co-authored-by: ALICE Builder <alibuild@users.noreply.github.com>
1 parent e562a39 commit 5ff679a

File tree

8 files changed

+1093
-1169
lines changed

8 files changed

+1093
-1169
lines changed

PWGLF/DataModel/LFStrangenessPIDTables.h

Lines changed: 131 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,156 @@
1515
#ifndef PWGLF_DATAMODEL_LFSTRANGENESSPIDTABLES_H_
1616
#define PWGLF_DATAMODEL_LFSTRANGENESSPIDTABLES_H_
1717

18-
#include <cmath>
19-
#include "Framework/AnalysisDataModel.h"
18+
#include "PWGLF/DataModel/LFStrangenessTables.h"
19+
2020
#include "Common/Core/RecoDecay.h"
21+
2122
#include "CommonConstants/PhysicsConstants.h"
23+
#include "Framework/AnalysisDataModel.h"
24+
25+
#include <cmath>
2226

2327
namespace o2::aod
2428
{
2529
namespace dautrack
2630
{
27-
// ==== TPC INFORMATION ===
28-
DECLARE_SOA_COLUMN(TPCSignal, tpcSignal, float); //! track TPC signal
31+
// ==== define packing helpers ===
32+
namespace packing
33+
{
34+
// define variables for packing
35+
static constexpr int nbins = (1 << 8 * sizeof(int8_t)) - 2;
36+
static constexpr int8_t overflowBin = nbins >> 1;
37+
static constexpr int8_t underflowBin = -(nbins >> 1);
38+
static constexpr float binned_max = 6.35;
39+
static constexpr float binned_min = -6.35;
40+
static constexpr float bin_width = (binned_max - binned_min) / nbins;
41+
static constexpr float underflow_return = -100.0f;
42+
static constexpr float overflow_return = +100.0f;
43+
44+
// define helper function to do packing
45+
int8_t packInInt8(float nSigma)
46+
{
47+
// calculate
48+
if (nSigma <= binned_min)
49+
return underflowBin;
50+
if (nSigma >= binned_max)
51+
return overflowBin;
52+
if (nSigma >= 0) {
53+
return static_cast<int8_t>((nSigma / bin_width) + 0.5f);
54+
}
55+
// automatic: this is the case in which nSigma < 0
56+
return static_cast<int8_t>((nSigma / bin_width) - 0.5f);
57+
}
58+
59+
// define helper function to do unpacking
60+
float unpackInt8(int8_t nSigma)
61+
{
62+
if (nSigma == underflowBin) {
63+
return underflow_return;
64+
}
65+
if (nSigma == overflowBin) {
66+
return overflow_return;
67+
}
68+
return bin_width * nSigma;
69+
}
70+
71+
} // namespace packing
72+
} // namespace dautrack
73+
74+
namespace dautrack_legacy
75+
{
76+
// ==== LEGACY TPC INFORMATION (full size tables) ===
2977
DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, float); //! Nsigma proton
3078
DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, float); //! Nsigma proton
3179
DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, float); //! Nsigma proton
3280
DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, float); //! Nsigma proton
3381
DECLARE_SOA_COLUMN(TPCNSigmaHe, tpcNSigmaHe, float); //! Nsigma proton
82+
} // namespace dautrack_legacy
83+
84+
namespace dautrack
85+
{
86+
// ==== COMPACT TPC INFORMATION (full size tables) ===
87+
DECLARE_SOA_COLUMN(TPCSignal, tpcSignal, float); //! track TPC signal
88+
DECLARE_SOA_COLUMN(PackedTPCNSigmaEl, packedTpcNSigmaEl, int8_t); //! Nsigma proton
89+
DECLARE_SOA_COLUMN(PackedTPCNSigmaPi, packedTpcNSigmaPi, int8_t); //! Nsigma proton
90+
DECLARE_SOA_COLUMN(PackedTPCNSigmaKa, packedTpcNSigmaKa, int8_t); //! Nsigma proton
91+
DECLARE_SOA_COLUMN(PackedTPCNSigmaPr, packedTpcNSigmaPr, int8_t); //! Nsigma proton
92+
93+
DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaEl, tpcNSigmaEl, //! unpacked TPC nsigma
94+
[](int8_t nsigma_packed) -> float { return o2::aod::dautrack::packing::unpackInt8(nsigma_packed); });
95+
DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaPi, tpcNSigmaPi, //! unpacked TPC nsigma
96+
[](int8_t nsigma_packed) -> float { return o2::aod::dautrack::packing::unpackInt8(nsigma_packed); });
97+
DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaKa, tpcNSigmaKa, //! unpacked TPC nsigma
98+
[](int8_t nsigma_packed) -> float { return o2::aod::dautrack::packing::unpackInt8(nsigma_packed); });
99+
DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaPr, tpcNSigmaPr, //! unpacked TPC nsigma
100+
[](int8_t nsigma_packed) -> float { return o2::aod::dautrack::packing::unpackInt8(nsigma_packed); });
34101

35102
// ==== TOF INFORMATION ===
103+
DECLARE_SOA_INDEX_COLUMN(DauTrackExtra, dauTrackExtra); //! point to daughter this TOF info belongs to
104+
DECLARE_SOA_INDEX_COLUMN(StraCollision, straCollision); //! point to collision associated with this track (not the V0/Casc)
36105
DECLARE_SOA_COLUMN(TOFSignal, tofSignal, float); //! track TOF signal
37-
DECLARE_SOA_COLUMN(TOFEvTime, tofEvTime, float); //! track TOF signal
38-
DECLARE_SOA_COLUMN(Length, length, float); //! track TOF signal
106+
DECLARE_SOA_COLUMN(TOFEvTime, tofEvTime, float); //! event time
107+
DECLARE_SOA_COLUMN(Length, length, float); //! track length (to assigned PV)
108+
DECLARE_SOA_COLUMN(TOFExpMom, tofExpMom, float); //! tof Exp Mom (to assigned PV)
109+
110+
// dynamics with expected times
111+
DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeEl, tofExpTimeEl, //! Expected time for the track to reach the TOF under the electron hypothesis
112+
[](float length, float tofExpMom) -> float {
113+
constexpr float massSquared = o2::constants::physics::MassElectron * o2::constants::physics::MassElectron;
114+
return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
115+
});
116+
117+
DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimePi, tofExpTimePi, //! Expected time for the track to reach the TOF under the pion hypothesis
118+
[](float length, float tofExpMom) -> float {
119+
constexpr float massSquared = o2::constants::physics::MassPionCharged * o2::constants::physics::MassPionCharged;
120+
return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
121+
});
122+
123+
DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimeKa, tofExpTimeKa, //! Expected time for the track to reach the TOF under the kaon hypothesis
124+
[](float length, float tofExpMom) -> float {
125+
constexpr float massSquared = o2::constants::physics::MassKaonCharged * o2::constants::physics::MassKaonCharged;
126+
return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
127+
});
128+
129+
DECLARE_SOA_DYNAMIC_COLUMN(TOFExpTimePr, tofExpTimePr, //! Expected time for the track to reach the TOF under the proton hypothesis
130+
[](float length, float tofExpMom) -> float {
131+
constexpr float massSquared = o2::constants::physics::MassProton * o2::constants::physics::MassProton;
132+
return o2::framework::pid::tof::MassToExpTime(tofExpMom, length, massSquared);
133+
});
134+
39135
} // namespace dautrack
40136

41-
DECLARE_SOA_TABLE(DauTrackTPCPIDs, "AOD", "DAUTRACKTPCPID", // nsigma table (for analysis)
42-
dautrack::TPCSignal, dautrack::TPCNSigmaEl,
43-
dautrack::TPCNSigmaPi, dautrack::TPCNSigmaKa,
44-
dautrack::TPCNSigmaPr, dautrack::TPCNSigmaHe);
45-
DECLARE_SOA_TABLE(DauTrackTOFPIDs, "AOD", "DAUTRACKTOFPID", // raw table (for posterior TOF calculation)
137+
DECLARE_SOA_TABLE(DauTrackTPCPIDs_000, "AOD", "DAUTRACKTPCPID", // nsigma table (for analysis)
138+
dautrack::TPCSignal, dautrack_legacy::TPCNSigmaEl,
139+
dautrack_legacy::TPCNSigmaPi, dautrack_legacy::TPCNSigmaKa,
140+
dautrack_legacy::TPCNSigmaPr, dautrack_legacy::TPCNSigmaHe);
141+
142+
DECLARE_SOA_TABLE_VERSIONED(DauTrackTPCPIDs_001, "AOD", "DAUTRACKTPCPID", 1, // nsigma table (for analysis)
143+
dautrack::TPCSignal,
144+
dautrack::PackedTPCNSigmaEl, dautrack::PackedTPCNSigmaPi,
145+
dautrack::PackedTPCNSigmaKa, dautrack::PackedTPCNSigmaPr,
146+
dautrack::TPCNSigmaEl<dautrack::PackedTPCNSigmaEl>,
147+
dautrack::TPCNSigmaPi<dautrack::PackedTPCNSigmaPi>,
148+
dautrack::TPCNSigmaKa<dautrack::PackedTPCNSigmaKa>,
149+
dautrack::TPCNSigmaPr<dautrack::PackedTPCNSigmaPr>);
150+
151+
using DauTrackTPCPIDs = DauTrackTPCPIDs_001; // second gen: packed Nsigma, no He
152+
153+
DECLARE_SOA_TABLE(DauTrackTOFPIDs_000, "AOD", "DAUTRACKTOFPID", // raw table (for posterior TOF calculation)
46154
dautrack::TOFSignal, dautrack::TOFEvTime, dautrack::Length);
47155

156+
DECLARE_SOA_TABLE_VERSIONED(DauTrackTOFPIDs_001, "AOD", "DAUTRACKTOFPID", 1, // raw table (for posterior TOF calculation)
157+
o2::soa::Index<>,
158+
dautrack::StraCollisionId, dautrack::DauTrackExtraId,
159+
dautrack::TOFSignal, dautrack::TOFEvTime,
160+
dautrack::Length, dautrack::TOFExpMom,
161+
dautrack::TOFExpTimeEl<dautrack::Length, dautrack::TOFExpMom>,
162+
dautrack::TOFExpTimePi<dautrack::Length, dautrack::TOFExpMom>,
163+
dautrack::TOFExpTimeKa<dautrack::Length, dautrack::TOFExpMom>,
164+
dautrack::TOFExpTimePr<dautrack::Length, dautrack::TOFExpMom>);
165+
166+
using DauTrackTOFPIDs = DauTrackTOFPIDs_001; // second gen: with collision Id, with TOFExpMom
167+
48168
namespace v0data
49169
{
50170
// define constants for NSigma operation

PWGLF/DataModel/LFStrangenessTables.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ DECLARE_SOA_DYNAMIC_COLUMN(EnergyCommonZNA, energyCommonZNA, //! get the total s
6363
[](float value) -> float { return value; });
6464
DECLARE_SOA_DYNAMIC_COLUMN(EnergyCommonZNC, energyCommonZNC, //! get the total sum of the ZN A amplitudes
6565
[](float value) -> float { return value; });
66+
67+
// event time
68+
DECLARE_SOA_COLUMN(EventTime, eventTime, float); //! event time (FT0, TOF) for TOF PID (stored once per event)
6669
} // namespace stracollision
6770

6871
//______________________________________________________
@@ -308,6 +311,8 @@ DECLARE_SOA_TABLE(StraStamps_000, "AOD", "STRASTAMPS", //! information for ID-in
308311
bc::RunNumber, timestamp::Timestamp);
309312
DECLARE_SOA_TABLE_VERSIONED(StraStamps_001, "AOD", "STRASTAMPS", 1, //! information for ID-ing mag field if needed
310313
bc::RunNumber, timestamp::Timestamp, bc::GlobalBC);
314+
DECLARE_SOA_TABLE(StraEvTimes, "AOD", "STRAEVTIMES", //! event time (FT0, TOF)
315+
stracollision::EventTime);
311316

312317
using StraRawCents = StraRawCents_004;
313318
using StraCents = StraCents_001;

PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,21 @@
99
# granted to it by virtue of its status as an Intergovernmental Organization
1010
# or submit itself to any jurisdiction.
1111

12+
o2physics_add_dpl_workflow(stradautrackstpcpidconverter
13+
SOURCES stradautrackstpcpidconverter.cxx
14+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
15+
COMPONENT_NAME Analysis)
16+
1217
o2physics_add_dpl_workflow(stradautrackstofpidconverter
1318
SOURCES stradautrackstofpidconverter.cxx
1419
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
1520
COMPONENT_NAME Analysis)
1621

22+
o2physics_add_dpl_workflow(stradautrackstofpidconverter2
23+
SOURCES stradautrackstofpidconverter2.cxx
24+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
25+
COMPONENT_NAME Analysis)
26+
1727
o2physics_add_dpl_workflow(stradautracksextraconverter2
1828
SOURCES stradautracksextraconverter2.cxx
1929
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore

PWGLF/TableProducer/Strangeness/Converters/stradautrackstofpidconverter.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ struct stradautrackstofpidconverter {
5353
lTOFEvTimes[casc.bachTrackExtraId()] = casc.bachTOFEventTime();
5454
}
5555
for (int ii = 0; ii < dauTracks.size(); ii++) {
56-
dautracktofpids(lTOFSignals[ii], lTOFEvTimes[ii], lLengths[ii]);
56+
dautracktofpids(-1, -1, lTOFSignals[ii], lTOFEvTimes[ii], lLengths[ii], 0.0f);
5757
}
5858
}
5959
};
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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+
#include "PWGLF/DataModel/LFStrangenessPIDTables.h"
12+
#include "PWGLF/DataModel/LFStrangenessTables.h"
13+
14+
#include "Framework/AnalysisDataModel.h"
15+
#include "Framework/AnalysisTask.h"
16+
#include "Framework/runDataProcessing.h"
17+
18+
using namespace o2;
19+
using namespace o2::framework;
20+
21+
// converts DauTrackTOFPIDs_000 to _001
22+
struct stradautrackstofpidconverter2 {
23+
Produces<aod::DauTrackTOFPIDs_001> dautracktofpids;
24+
Produces<aod::StraEvTimes> straEvTimes;
25+
26+
void process(aod::StraCollisions const& collisions, soa::Join<aod::DauTrackExtras, aod::DauTrackTOFPIDs_000> const& dauTracks, soa::Join<aod::V0CollRefs, aod::V0Cores, aod::V0Extras> const& v0s)
27+
{
28+
// create new TOFPIDs
29+
for (int ii = 0; ii < dauTracks.size(); ii++) {
30+
auto dauTrack = dauTracks.rawIteratorAt(ii);
31+
dautracktofpids(-1, -1, dauTrack.tofSignal(), dauTrack.tofEvTime(), dauTrack.length(), 0.0f);
32+
}
33+
34+
// fill EvTimes (created simultaneously, so done in the same converter)
35+
// recover as much as possible from the previous format
36+
std::vector<double> collisionEventTime(collisions.size(), 0.0);
37+
std::vector<int> collisionNtracks(collisions.size(), 0);
38+
39+
for (const auto& v0 : v0s) {
40+
auto posTrackTOF = dauTracks.rawIteratorAt(v0.posTrackExtraId());
41+
auto negTrackTOF = dauTracks.rawIteratorAt(v0.negTrackExtraId());
42+
if (posTrackTOF.hasTOF()) {
43+
collisionEventTime[v0.straCollisionId()] += posTrackTOF.tofEvTime();
44+
collisionNtracks[v0.straCollisionId()]++;
45+
}
46+
if (negTrackTOF.hasTOF()) {
47+
collisionEventTime[v0.straCollisionId()] += negTrackTOF.tofEvTime();
48+
collisionNtracks[v0.straCollisionId()]++;
49+
}
50+
}
51+
for (const auto& collision : collisions) {
52+
if (collisionNtracks[collision.globalIndex()] > 0) {
53+
collisionEventTime[collision.globalIndex()] /= static_cast<double>(collisionNtracks[collision.globalIndex()]);
54+
} else {
55+
collisionEventTime[collision.globalIndex()] = -1e+6; // undefined
56+
}
57+
straEvTimes(collisionEventTime[collision.globalIndex()]);
58+
}
59+
}
60+
};
61+
62+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
63+
{
64+
return WorkflowSpec{
65+
adaptAnalysisTask<stradautrackstofpidconverter2>(cfgc)};
66+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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+
#include "PWGLF/DataModel/LFStrangenessPIDTables.h"
12+
#include "PWGLF/DataModel/LFStrangenessTables.h"
13+
14+
#include "Framework/AnalysisDataModel.h"
15+
#include "Framework/AnalysisTask.h"
16+
#include "Framework/runDataProcessing.h"
17+
18+
using namespace o2;
19+
using namespace o2::framework;
20+
21+
// converts DauTrackTOFPIDs_000 to _001
22+
struct stradautrackstpcpidconverter {
23+
Produces<aod::DauTrackTPCPIDs_001> dautrackpcpids;
24+
25+
void process(aod::DauTrackTPCPIDs_000 const& v000s)
26+
{
27+
for (int ii = 0; ii < v000s.size(); ii++) {
28+
auto dauTrackTPCPID = v000s.rawIteratorAt(ii);
29+
dautrackpcpids(dauTrackTPCPID.tpcSignal(),
30+
aod::dautrack::packing::packInInt8(dauTrackTPCPID.tpcNSigmaEl()),
31+
aod::dautrack::packing::packInInt8(dauTrackTPCPID.tpcNSigmaPi()),
32+
aod::dautrack::packing::packInInt8(dauTrackTPCPID.tpcNSigmaKa()),
33+
aod::dautrack::packing::packInInt8(dauTrackTPCPID.tpcNSigmaPr()));
34+
}
35+
}
36+
};
37+
38+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
39+
{
40+
return WorkflowSpec{
41+
adaptAnalysisTask<stradautrackstpcpidconverter>(cfgc)};
42+
}

0 commit comments

Comments
 (0)