Skip to content

Commit a8b8892

Browse files
authored
Merge branch 'AliceO2Group:master' into master
2 parents 60dcb5f + 0861112 commit a8b8892

25 files changed

Lines changed: 1491 additions & 617 deletions

‎DPG/Tasks/AOTTrack/PID/HMPID/hmpidDeuteron.cxx‎

Lines changed: 106 additions & 100 deletions
Large diffs are not rendered by default.

‎PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx‎

Lines changed: 73 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,15 @@ constexpr int McBitPR = 2;
6868
constexpr int McBitEL = 3;
6969
constexpr int McBitDE = 4;
7070

71-
#define BITSET(mask, ithBit) ((mask) |= (1 << (ithBit))) // avoid name bitset as std::bitset is already there
72-
#define BITCHECK(mask, ithBit) ((mask) & (1 << (ithBit))) // bit check will return int value, not bool, use BITCHECK != 0 in Analysi
71+
constexpr void BITSET(int& mask, int ithBit)
72+
{
73+
mask |= (1 << ithBit);
74+
}
75+
76+
constexpr bool BITCHECK(int mask, int ithBit)
77+
{
78+
return (mask & (1 << ithBit)) != 0;
79+
}
7380

7481
enum PidEnum {
7582
kCh = 0,
@@ -212,6 +219,10 @@ struct NchCumulantsId {
212219
ConfigurableAxis subSampleAxis{"subSampleAxis", {10, 0., 10.}, "Subsample"};
213220
TRandom3* fRandom = new TRandom3(0); // Random number generator for subsampling
214221
int currentSubsample = 0;
222+
Configurable<float> cfgCutPtMinKa{"cfgCutPtMinKa", 0.30, "min pT for kaon eff-correction inclusion"};
223+
Configurable<float> cfgCutPtMaxKa{"cfgCutPtMaxKa", 1.20, "max pT for kaon eff-correction inclusion (purity cutoff)"};
224+
Configurable<float> cfgCutPtMinPr{"cfgCutPtMinPr", 0.40, "min pT for proton eff-correction inclusion"};
225+
Configurable<float> cfgCutPtMaxPr{"cfgCutPtMaxPr", 1.50, "max pT for proton eff-correction inclusion (purity cutoff)"};
215226
} cfgEventSelection;
216227

217228
// Configurables for particle Identification
@@ -297,9 +308,11 @@ struct NchCumulantsId {
297308
double q4 = 0.;
298309
};
299310

311+
static constexpr float KmaxWeight = 10.0f; // secondary safeguard for pr and kaon eff fix
312+
300313
inline void fillEffPower(EffPowerSums& p, float weight)
301314
{
302-
if (weight <= 0.f) {
315+
if (weight <= 0.f || weight > KmaxWeight) {
303316
return;
304317
}
305318

@@ -1008,54 +1021,44 @@ struct NchCumulantsId {
10081021
{
10091022
switch (pidMode) {
10101023
case kPi:
1011-
if (std::fabs(track.tpcNSigmaPi()) < nSigmaTPC &&
1012-
std::fabs(track.tofNSigmaPi()) < nSigmaTOF) {
1013-
return true;
1014-
}
1015-
break;
1024+
return std::fabs(track.tpcNSigmaPi()) < nSigmaTPC &&
1025+
std::fabs(track.tofNSigmaPi()) < nSigmaTOF;
1026+
10161027
case kKa:
1017-
if (std::fabs(track.tpcNSigmaKa()) < nSigmaTPC &&
1018-
std::fabs(track.tofNSigmaKa()) < nSigmaTOF) {
1019-
return true;
1020-
}
1021-
break;
1028+
return std::fabs(track.tpcNSigmaKa()) < nSigmaTPC &&
1029+
std::fabs(track.tofNSigmaKa()) < nSigmaTOF;
1030+
10221031
case kPr:
1023-
if (std::fabs(track.tpcNSigmaPr()) < nSigmaTPC &&
1024-
std::fabs(track.tofNSigmaPr()) < nSigmaTOF) {
1025-
return true;
1026-
}
1027-
break;
1032+
return std::fabs(track.tpcNSigmaPr()) < nSigmaTPC &&
1033+
std::fabs(track.tofNSigmaPr()) < nSigmaTOF;
1034+
10281035
default:
10291036
return false;
1030-
break;
10311037
}
1032-
return false;
10331038
}
10341039

10351040
template <int pidMode, typename T>
10361041
bool selIdEllipsoidalCut(const T& track, const float& nSigmaTPC, const float& nSigmaTOF)
10371042
{
10381043
switch (pidMode) {
10391044
case kPi:
1040-
if (std::pow(track.tpcNSigmaPi() / nSigmaTPC, 2) + std::pow(track.tofNSigmaPi() / nSigmaTOF, 2) < 1.0) {
1041-
return true;
1042-
}
1043-
break;
1045+
return std::pow(track.tpcNSigmaPi() / nSigmaTPC, 2) +
1046+
std::pow(track.tofNSigmaPi() / nSigmaTOF, 2) <
1047+
1.0;
1048+
10441049
case kKa:
1045-
if (std::pow(track.tpcNSigmaKa() / nSigmaTPC, 2) + std::pow(track.tofNSigmaKa() / nSigmaTOF, 2) < 1.0) {
1046-
return true;
1047-
}
1048-
break;
1050+
return std::pow(track.tpcNSigmaKa() / nSigmaTPC, 2) +
1051+
std::pow(track.tofNSigmaKa() / nSigmaTOF, 2) <
1052+
1.0;
1053+
10491054
case kPr:
1050-
if (std::pow(track.tpcNSigmaPr() / nSigmaTPC, 2) + std::pow(track.tofNSigmaPr() / nSigmaTOF, 2) < 1.0) {
1051-
return true;
1052-
}
1053-
break;
1055+
return std::pow(track.tpcNSigmaPr() / nSigmaTPC, 2) +
1056+
std::pow(track.tofNSigmaPr() / nSigmaTOF, 2) <
1057+
1.0;
1058+
10541059
default:
10551060
return false;
1056-
break;
10571061
}
1058-
return false;
10591062
}
10601063

10611064
template <int pidMode, typename T>
@@ -1196,13 +1199,10 @@ struct NchCumulantsId {
11961199
template <typename T>
11971200
bool selTrackForId(const T& track)
11981201
{
1199-
if (cfgIdElRejLowNSigma < track.tpcNSigmaEl() && track.tpcNSigmaEl() < cfgIdElRejHighNSigma &&
1200-
std::fabs(track.tpcNSigmaPi()) > cfgIdPiRejNSigma &&
1201-
std::fabs(track.tpcNSigmaKa()) > cfgIdKaRejNSigma &&
1202-
std::fabs(track.tpcNSigmaPr()) > cfgIdPrRejNSigma) {
1203-
return false;
1204-
}
1205-
return true;
1202+
return !(cfgIdElRejLowNSigma < track.tpcNSigmaEl() && track.tpcNSigmaEl() < cfgIdElRejHighNSigma &&
1203+
std::fabs(track.tpcNSigmaPi()) > cfgIdPiRejNSigma &&
1204+
std::fabs(track.tpcNSigmaKa()) > cfgIdKaRejNSigma &&
1205+
std::fabs(track.tpcNSigmaPr()) > cfgIdPrRejNSigma);
12061206
}
12071207

12081208
// Pion
@@ -1999,19 +1999,27 @@ struct NchCumulantsId {
19991999
fillGenTrackQA<genAnalysisDir, kPi, kNeg>(genAnalysis, mcTrack);
20002000
} else if (pdg == kKPlus) {
20012001
// fillGenTrackQA<genAnalysisDir, kKa>(genAnalysis, mcTrack);
2002-
nKaGen++;
2002+
if (mcTrack.pt() >= cfgEventSelection.cfgCutPtMinKa && mcTrack.pt() <= cfgEventSelection.cfgCutPtMaxKa) {
2003+
nKaGen++;
2004+
}
20032005
fillGenTrackQA<genAnalysisDir, kKa, kPos>(genAnalysis, mcTrack);
20042006
} else if (pdg == kKMinus) {
20052007
// fillGenTrackQA<genAnalysisDir, kKa>(genAnalysis, mcTrack);
2006-
nAKaGen++;
2008+
if (mcTrack.pt() >= cfgEventSelection.cfgCutPtMinKa && mcTrack.pt() <= cfgEventSelection.cfgCutPtMaxKa) {
2009+
nAKaGen++;
2010+
}
20072011
fillGenTrackQA<genAnalysisDir, kKa, kNeg>(genAnalysis, mcTrack);
20082012
} else if (pdg == kProton) {
20092013
// fillGenTrackQA<genAnalysisDir, kPr>(genAnalysis, mcTrack);
2010-
nPrGen++;
2014+
if (mcTrack.pt() >= cfgEventSelection.cfgCutPtMinPr && mcTrack.pt() <= cfgEventSelection.cfgCutPtMaxPr) {
2015+
nPrGen++;
2016+
}
20112017
fillGenTrackQA<genAnalysisDir, kPr, kPos>(genAnalysis, mcTrack);
20122018
} else if (pdg == kProtonBar) {
20132019
// fillGenTrackQA<genAnalysisDir, kPr>(genAnalysis, mcTrack);
2014-
nAPrGen++;
2020+
if (mcTrack.pt() >= cfgEventSelection.cfgCutPtMinPr && mcTrack.pt() <= cfgEventSelection.cfgCutPtMaxPr) {
2021+
nAPrGen++;
2022+
}
20152023
fillGenTrackQA<genAnalysisDir, kPr, kNeg>(genAnalysis, mcTrack);
20162024
}
20172025

@@ -2176,15 +2184,19 @@ struct NchCumulantsId {
21762184
}
21772185
} else if (trackIsKaon) {
21782186
if (track.sign() > 0) {
2179-
nKaRec += hPtEtaForEffCorrection[kKa][kPos]->GetBinContent(ptEtaBin);
21802187
fillRecoTrackQA<recoAnalysisDir, kKa, kPos>(recoAnalysis, track);
2181-
float weight = hPtEtaForEffCorrection[kKa][kPos]->GetBinContent(ptEtaBin);
2182-
fillEffPower(kapPow, weight);
2188+
if (track.pt() >= cfgEventSelection.cfgCutPtMinKa && track.pt() <= cfgEventSelection.cfgCutPtMaxKa) {
2189+
nKaRec += hPtEtaForEffCorrection[kKa][kPos]->GetBinContent(ptEtaBin);
2190+
float weight = hPtEtaForEffCorrection[kKa][kPos]->GetBinContent(ptEtaBin);
2191+
fillEffPower(kapPow, weight);
2192+
}
21832193
} else if (track.sign() < 0) {
2184-
nAKaRec += hPtEtaForEffCorrection[kKa][kNeg]->GetBinContent(ptEtaBin);
21852194
fillRecoTrackQA<recoAnalysisDir, kKa, kNeg>(recoAnalysis, track);
2186-
float weight = hPtEtaForEffCorrection[kKa][kNeg]->GetBinContent(ptEtaBin);
2187-
fillEffPower(kamPow, weight);
2195+
if (track.pt() >= cfgEventSelection.cfgCutPtMinKa && track.pt() <= cfgEventSelection.cfgCutPtMaxKa) {
2196+
nAKaRec += hPtEtaForEffCorrection[kKa][kNeg]->GetBinContent(ptEtaBin);
2197+
float weight = hPtEtaForEffCorrection[kKa][kNeg]->GetBinContent(ptEtaBin);
2198+
fillEffPower(kamPow, weight);
2199+
}
21882200
}
21892201
// PID band QA for kaons
21902202
if (idMethodKa == kTPCidentified) {
@@ -2195,15 +2207,19 @@ struct NchCumulantsId {
21952207
}
21962208
} else if (trackIsProton) {
21972209
if (track.sign() > 0) {
2198-
nPrRec += hPtEtaForEffCorrection[kPr][kPos]->GetBinContent(ptEtaBin);
21992210
fillRecoTrackQA<recoAnalysisDir, kPr, kPos>(recoAnalysis, track);
2200-
float weight = hPtEtaForEffCorrection[kPr][kPos]->GetBinContent(ptEtaBin);
2201-
fillEffPower(prPow, weight);
2211+
if (track.pt() >= cfgEventSelection.cfgCutPtMinPr && track.pt() <= cfgEventSelection.cfgCutPtMaxPr) {
2212+
nPrRec += hPtEtaForEffCorrection[kPr][kPos]->GetBinContent(ptEtaBin);
2213+
float weight = hPtEtaForEffCorrection[kPr][kPos]->GetBinContent(ptEtaBin);
2214+
fillEffPower(prPow, weight);
2215+
}
22022216
} else if (track.sign() < 0) {
2203-
nAPrRec += hPtEtaForEffCorrection[kPr][kNeg]->GetBinContent(ptEtaBin);
22042217
fillRecoTrackQA<recoAnalysisDir, kPr, kNeg>(recoAnalysis, track);
2205-
float weight = hPtEtaForEffCorrection[kPr][kNeg]->GetBinContent(ptEtaBin);
2206-
fillEffPower(aprPow, weight);
2218+
if (track.pt() >= cfgEventSelection.cfgCutPtMinPr && track.pt() <= cfgEventSelection.cfgCutPtMaxPr) {
2219+
nAPrRec += hPtEtaForEffCorrection[kPr][kNeg]->GetBinContent(ptEtaBin);
2220+
float weight = hPtEtaForEffCorrection[kPr][kNeg]->GetBinContent(ptEtaBin);
2221+
fillEffPower(aprPow, weight);
2222+
}
22072223
}
22082224
// PID band QA for protons
22092225
if (idMethodPr == kTPCidentified) {

‎PWGCF/Femto/Core/femtoUtils.h‎

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <cstdint>
3131
#include <limits>
3232
#include <optional>
33+
#include <type_traits>
3334
#include <unordered_map>
3435

3536
namespace o2::analysis::femto
@@ -83,7 +84,7 @@ inline double getPdgMass(int pdgCode)
8384
{
8485
// use this function instead of TDatabasePDG to return masses defined in the PhysicsConstants.h header
8586
// this approach saves a lot of memory and important partilces like deuteron are missing in TDatabasePDG anyway
86-
double mass = 0.f;
87+
double mass = 0.;
8788
// add new particles if necessary here
8889
switch (std::abs(pdgCode)) {
8990
case kPiPlus:
@@ -102,10 +103,10 @@ inline double getPdgMass(int pdgCode)
102103
mass = o2::constants::physics::MassPhi;
103104
break;
104105
case kRho770_0:
105-
mass = 775.26; // not defined in O2?
106+
mass = 0.77526; // not defined in O2?
106107
break;
107108
case kRho770Plus:
108-
mass = 775.11; // not defined in O2?
109+
mass = 0.77511; // not defined in O2?
109110
break;
110111
case o2::constants::physics::Pdg::kK0Star892:
111112
mass = o2::constants::physics::MassK0Star892;
@@ -138,7 +139,7 @@ inline double getPdgMass(int pdgCode)
138139
mass = o2::constants::physics::MassOmegaMinus;
139140
break;
140141
default:
141-
LOG(warn) << "PDG code is not suppored. Return 0...";
142+
LOG(warn) << "PDG code " << pdgCode << " is not suppored. Return 0... ";
142143
}
143144
return mass;
144145
}
@@ -154,11 +155,15 @@ concept HasQvectors = requires(T col) {
154155
};
155156

156157
template <typename T>
157-
concept HasEventShape = requires(T col) {
158-
col.qvec();
159-
col.eventPlaneAngle();
158+
concept HasEventShapeRow = requires(T row) {
159+
row.qvec();
160+
row.eventPlaneAngle();
160161
};
161162

163+
/// accepts either a row/iterator or a table (Filtered<Join<...>> etc.)
164+
template <typename T>
165+
concept HasEventShape = HasEventShapeRow<std::decay_t<T>> || (requires { typename std::decay_t<T>::iterator; } && HasEventShapeRow<typename std::decay_t<T>::iterator>);
166+
162167
/// Recalculate pT for Kinks (Sigmas) using kinematic constraints
163168
inline float calcPtnew(float pxMother, float pyMother, float pzMother, float pxDaughter, float pyDaughter, float pzDaughter)
164169
{

‎PWGCF/Femto/Core/pairBuilder.h‎

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "PWGCF/Femto/Core/charmHadronHistManager.h"
2121
#include "PWGCF/Femto/Core/closePairRejection.h"
2222
#include "PWGCF/Femto/Core/collisionHistManager.h"
23+
#include "PWGCF/Femto/Core/femtoUtils.h"
2324
#include "PWGCF/Femto/Core/kinkHistManager.h"
2425
#include "PWGCF/Femto/Core/mcParticleHistManager.h"
2526
#include "PWGCF/Femto/Core/modes.h"
@@ -202,8 +203,8 @@ class PairTrackTrackBuilder
202203
}
203204
}
204205

205-
template <modes::Mode mode, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
206-
void processMixedEvent(T1 const& cols, T2& trackTable, T3& partition1, T4& partition2, T5& cache, T6& binsVtxMult, T7& binsVtxCent, T8& binsVtxMultCent)
206+
template <modes::Mode mode, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
207+
void processMixedEvent(T1 const& cols, T2& trackTable, T3& partition1, T4& partition2, T5& cache, T6& binsVtxMult, T7& binsVtxCent, T8& binsVtxMultCent, T9& binsVtxCentEventPlaneAngle)
207208
{
208209

209210
if (mSameSpecies) {
@@ -217,6 +218,13 @@ class PairTrackTrackBuilder
217218
case static_cast<int>(pairhistmanager::kVtxMultCent):
218219
pairprocesshelpers::processMixedEvent<mode>(cols, partition1, partition1, trackTable, cache, binsVtxMultCent, mMixingDepth, mPairHistManagerMe, mCprMe, mPcMe);
219220
break;
221+
case static_cast<int>(pairhistmanager::kVtxCentEventPlaneAngle):
222+
if constexpr (utils::HasEventShape<T1>) {
223+
pairprocesshelpers::processMixedEvent<mode>(cols, partition1, partition1, trackTable, cache, binsVtxCentEventPlaneAngle, mMixingDepth, mPairHistManagerMe, mCprMe, mPcMe);
224+
} else {
225+
LOG(fatal) << "Mixing policy kVtxCentEventPlaneAngle requires a collision table with event-shape columns. Breaking...";
226+
}
227+
break;
220228
default:
221229
LOG(fatal) << "Invalid binning policiy specifed. Breaking...";
222230
}
@@ -231,14 +239,21 @@ class PairTrackTrackBuilder
231239
case static_cast<int>(pairhistmanager::kVtxMultCent):
232240
pairprocesshelpers::processMixedEvent<mode>(cols, partition1, partition2, trackTable, cache, binsVtxMultCent, mMixingDepth, mPairHistManagerMe, mCprMe, mPcMe);
233241
break;
242+
case static_cast<int>(pairhistmanager::kVtxCentEventPlaneAngle):
243+
if constexpr (utils::HasEventShape<T1>) {
244+
pairprocesshelpers::processMixedEvent<mode>(cols, partition1, partition2, trackTable, cache, binsVtxCentEventPlaneAngle, mMixingDepth, mPairHistManagerMe, mCprMe, mPcMe);
245+
} else {
246+
LOG(fatal) << "Mixing policy kVtxCentEventPlaneAngle requires a collision table with event-shape columns. Breaking...";
247+
}
248+
break;
234249
default:
235250
LOG(fatal) << "Invalid binning policiy specifed. Breaking...";
236251
}
237252
}
238253
}
239254

240-
template <modes::Mode mode, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
241-
void processMixedEvent(T1 const& cols, T2 const& mcCols, T3& trackTable, T4& partition1, T5& partition2, T6 const& mcParticles, T7 const& mcMothers, T8 const& mcPartonicMothers, T9& cache, T10& binsVtxMult, T11& binsVtxCent, T12& binsVtxMultCent)
255+
template <modes::Mode mode, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
256+
void processMixedEvent(T1 const& cols, T2 const& mcCols, T3& trackTable, T4& partition1, T5& partition2, T6 const& mcParticles, T7 const& mcMothers, T8 const& mcPartonicMothers, T9& cache, T10& binsVtxMult, T11& binsVtxCent, T12& binsVtxMultCent, T13& binsVtxCentEventPlaneAngle)
242257
{
243258
if (mSameSpecies) {
244259
switch (mMixingPolicy) {
@@ -251,6 +266,13 @@ class PairTrackTrackBuilder
251266
case static_cast<int>(pairhistmanager::kVtxMultCent):
252267
pairprocesshelpers::processMixedEvent<mode>(cols, mcCols, partition1, partition1, trackTable, mcParticles, mcMothers, mcPartonicMothers, cache, binsVtxMultCent, mMixingDepth, mPairHistManagerMe, mTrackCleaner1, mTrackCleaner1, mCprMe, mPcMe);
253268
break;
269+
case static_cast<int>(pairhistmanager::kVtxCentEventPlaneAngle):
270+
if constexpr (utils::HasEventShape<T1>) {
271+
pairprocesshelpers::processMixedEvent<mode>(cols, mcCols, partition1, partition1, trackTable, mcParticles, mcMothers, mcPartonicMothers, cache, binsVtxCentEventPlaneAngle, mMixingDepth, mPairHistManagerMe, mTrackCleaner1, mTrackCleaner1, mCprMe, mPcMe);
272+
} else {
273+
LOG(fatal) << "Mixing policy kVtxCentEventPlaneAngle requires a collision table with event-shape columns. Breaking...";
274+
}
275+
break;
254276
default:
255277
LOG(fatal) << "Invalid binning policiy specifed. Breaking...";
256278
}
@@ -265,6 +287,13 @@ class PairTrackTrackBuilder
265287
case static_cast<int>(pairhistmanager::kVtxMultCent):
266288
pairprocesshelpers::processMixedEvent<mode>(cols, mcCols, partition1, partition2, trackTable, mcParticles, mcMothers, mcPartonicMothers, cache, binsVtxMultCent, mMixingDepth, mPairHistManagerMe, mTrackCleaner1, mTrackCleaner2, mCprMe, mPcMe);
267289
break;
290+
case static_cast<int>(pairhistmanager::kVtxCentEventPlaneAngle):
291+
if constexpr (utils::HasEventShape<T1>) {
292+
pairprocesshelpers::processMixedEvent<mode>(cols, mcCols, partition1, partition2, trackTable, mcParticles, mcMothers, mcPartonicMothers, cache, binsVtxCentEventPlaneAngle, mMixingDepth, mPairHistManagerMe, mTrackCleaner1, mTrackCleaner2, mCprMe, mPcMe);
293+
} else {
294+
LOG(fatal) << "Mixing policy kVtxCentEventPlaneAngle requires a collision table with event-shape columns. Breaking...";
295+
}
296+
break;
268297
default:
269298
LOG(fatal) << "Invalid binning policiy specifed. Breaking...";
270299
}

0 commit comments

Comments
 (0)