Skip to content

Commit a991c91

Browse files
authored
Merge branch 'AliceO2Group:master' into master
2 parents c4c6e4f + 1c5f7ae commit a991c91

8 files changed

Lines changed: 250 additions & 18 deletions

File tree

Common/DataModel/EvtPlanes.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,15 @@ DECLARE_SOA_COLUMN(EvtPlBNegRectr, evtPlBNegRectr, float);
4343
DECLARE_SOA_COLUMN(EvtPlBNegTwist, evtPlBNegTwist, float);
4444
DECLARE_SOA_COLUMN(EvtPlBNegFinal, evtPlBNegFinal, float);
4545

46+
DECLARE_SOA_COLUMN(NTrkBPos, nTrkBPos, int);
47+
DECLARE_SOA_COLUMN(NTrkBNeg, nTrkBNeg, int);
4648
} // namespace ep
4749
DECLARE_SOA_TABLE(EvtPlanes, "AOD", "EVTPLANES", //! Table with all event planes.
4850
ep::Cent,
4951
ep::EvtPlUncor, ep::EvtPlRectr, ep::EvtPlTwist, ep::EvtPlFinal,
5052
ep::EvtPlBPosUncor, ep::EvtPlBPosRectr, ep::EvtPlBPosTwist, ep::EvtPlBPosFinal,
51-
ep::EvtPlBNegUncor, ep::EvtPlBNegRectr, ep::EvtPlBNegTwist, ep::EvtPlBNegFinal);
53+
ep::EvtPlBNegUncor, ep::EvtPlBNegRectr, ep::EvtPlBNegTwist, ep::EvtPlBNegFinal,
54+
ep::NTrkBPos, ep::NTrkBNeg);
5255
using EvtPlane = EvtPlanes::iterator;
5356
} // namespace o2::aod
5457

Common/DataModel/Qvectors.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ DECLARE_SOA_COLUMN(QvecBNegTwistRe, qvecBNegTwistRe, float);
5353
DECLARE_SOA_COLUMN(QvecBNegTwistIm, qvecBNegTwistIm, float);
5454
DECLARE_SOA_COLUMN(QvecBNegFinalRe, qvecBNegFinalRe, float);
5555
DECLARE_SOA_COLUMN(QvecBNegFinalIm, qvecBNegFinalIm, float);
56+
DECLARE_SOA_COLUMN(NTrkBPos, nTrkBPos, int);
57+
DECLARE_SOA_COLUMN(NTrkBNeg, nTrkBNeg, int);
5658
/// NOTE: Add here Qx,Qy for other systems.
5759
} // namespace qvec
5860

@@ -63,7 +65,8 @@ DECLARE_SOA_TABLE(Qvectors, "AOD", "QVECTORS", //! Table with all Qvectors.
6365
qvec::QvecBPosUncorRe, qvec::QvecBPosUncorIm, qvec::QvecBPosRectrRe, qvec::QvecBPosRectrIm,
6466
qvec::QvecBPosTwistRe, qvec::QvecBPosTwistIm, qvec::QvecBPosFinalRe, qvec::QvecBPosFinalIm,
6567
qvec::QvecBNegUncorRe, qvec::QvecBNegUncorIm, qvec::QvecBNegRectrRe, qvec::QvecBNegRectrIm,
66-
qvec::QvecBNegTwistRe, qvec::QvecBNegTwistIm, qvec::QvecBNegFinalRe, qvec::QvecBNegFinalIm);
68+
qvec::QvecBNegTwistRe, qvec::QvecBNegTwistIm, qvec::QvecBNegFinalRe, qvec::QvecBNegFinalIm,
69+
qvec::NTrkBPos, qvec::NTrkBNeg);
6770
using Qvector = Qvectors::iterator;
6871
} // namespace o2::aod
6972

Common/TableProducer/evtPlanesTable.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ struct evtPlanesTable {
9696
evPlane(qVec.cent(),
9797
evtPlane[0], evtPlane[1], evtPlane[2], evtPlane[3],
9898
evtPlaneBPos[0], evtPlaneBPos[1], evtPlaneBPos[2], evtPlaneBPos[3],
99-
evtPlaneBNeg[0], evtPlaneBNeg[1], evtPlaneBNeg[2], evtPlaneBNeg[3]);
99+
evtPlaneBNeg[0], evtPlaneBNeg[1], evtPlaneBNeg[2], evtPlaneBNeg[3],
100+
qVec.nTrkBPos(), qVec.nTrkBNeg());
100101
} // void process(aod::Qvector const& qVec)
101102
};
102103

Common/TableProducer/qVectorsTable.cxx

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ using namespace o2::framework;
5050
using MyCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::FT0sCorrected,
5151
aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::CentFV0As>;
5252

53-
using MyTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection>;
53+
using MyTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::TrackSelectionExtension>;
5454

5555
struct qVectorsTable {
5656
// Configurables.
@@ -72,8 +72,11 @@ struct qVectorsTable {
7272
// FIXME: 6 correction factors for each centrality and 8 centrality intervals are hard-coded.
7373

7474
Configurable<std::vector<float>> cfgCorr{"cfgCorr", std::vector<float>{0.0}, "Correction constants for detector"};
75-
Configurable<std::vector<float>> cfgBPosCorr{"cfgBPosCent", std::vector<float>{0.0}, "Correction constants for positive TPC tracks"};
76-
Configurable<std::vector<float>> cfgBNegCorr{"cfgBNegCent", std::vector<float>{0.0}, "Correction constants for negative TPC tracks"};
75+
Configurable<std::vector<float>> cfgBPosCorr{"cfgBPosCorr", std::vector<float>{0.0}, "Correction constants for positive TPC tracks"};
76+
Configurable<std::vector<float>> cfgBNegCorr{"cfgBNegCorr", std::vector<float>{0.0}, "Correction constants for negative TPC tracks"};
77+
78+
Configurable<float> cfgMinPtOnTPC{"cfgMinPtOnTPC", 0.15, "minimum transverse momentum selection for TPC tracks participating in Q-vector reconstruction"};
79+
Configurable<float> cfgMaxPtOnTPC{"cfgMaxPtOnTPC", 5., "maximum transverse momentum selection for TPC tracks participating in Q-vector reconstruction"};
7780

7881
// Table.
7982
Produces<aod::Qvectors> qVector;
@@ -148,6 +151,33 @@ struct qVectorsTable {
148151
histosQA.add("ChTracks", "", {HistType::kTHnSparseF, {axisPt, axisEta, axisPhi, axixCent}});
149152
}
150153

154+
template <typename TrackType>
155+
bool SelTrack(const TrackType track)
156+
{
157+
if (track.pt() < cfgMinPtOnTPC)
158+
return false;
159+
if (track.pt() > cfgMaxPtOnTPC)
160+
return false;
161+
if (!track.passedITSNCls())
162+
return false;
163+
if (!track.passedITSChi2NDF())
164+
return false;
165+
if (!track.passedITSHits())
166+
return false;
167+
if (!track.passedITSNCls())
168+
return false;
169+
if (!track.passedTPCCrossedRowsOverNCls())
170+
return false;
171+
if (!track.passedTPCChi2NDF())
172+
return false;
173+
if (!track.passedDCAxy())
174+
return false;
175+
if (!track.passedDCAz())
176+
return false;
177+
178+
return true;
179+
}
180+
151181
void process(MyCollisions::iterator const& coll, aod::FT0s const& ft0s, aod::FV0As const& fv0s, MyTracks const& tracks) //, aod::FV0Cs const&)
152182
// void process(MyCollisions::iterator const& coll, aod::FT0s const& ft0s, aod::FV0As const& fv0s)
153183
{
@@ -261,20 +291,24 @@ struct qVectorsTable {
261291
qVectBNeg[0] = 0.;
262292
qVectBNeg[1] = 0.;
263293

294+
int nTrkBPos = 0;
295+
int nTrkBNeg = 0;
264296
for (auto& trk : tracks) {
265-
if (!trk.isGlobalTrack())
297+
if (!SelTrack(trk))
266298
continue;
267299
histosQA.fill(HIST("ChTracks"), trk.pt(), trk.eta(), trk.phi(), cent);
268300
if (abs(trk.eta()) < 0.1 || abs(trk.eta()) > 0.8)
269301
continue;
270302
if (trk.eta() > 0) {
271-
qVectBPos[0] += trk.pt() * TMath::Cos(2. * trk.phi());
272-
qVectBPos[1] += trk.pt() * TMath::Sin(2. * trk.phi());
303+
qVectBPos[0] += trk.pt() * TMath::Cos(2. * trk.phi()) / 20.;
304+
qVectBPos[1] += trk.pt() * TMath::Sin(2. * trk.phi()) / 20.;
305+
nTrkBPos++;
273306
} else if (trk.eta() < 0) {
274-
qVectBNeg[0] += trk.pt() * TMath::Cos(2. * trk.phi());
275-
qVectBNeg[1] += trk.pt() * TMath::Sin(2. * trk.phi());
307+
qVectBNeg[0] += trk.pt() * TMath::Cos(2. * trk.phi()) / 20.;
308+
qVectBNeg[1] += trk.pt() * TMath::Sin(2. * trk.phi()) / 20.;
309+
nTrkBNeg++;
276310
}
277-
}
311+
} // FIXME: ARBITRARY SCALE FACTOR OF 20
278312

279313
/// TODO: Repeat here the procedure for any other Qvector columns.
280314
/// Do not forget to add the configurable for the correction constants.
@@ -329,8 +363,8 @@ struct qVectorsTable {
329363

330364
helperEP.DoRecenter(qVector_rectr[0], qVector_rectr[1], cfgCorr->at(cBin * 6), cfgCorr->at(cBin * 6 + 1));
331365

332-
helperEP.DoRecenter(qVector_twist[0], qVector_twist[1], cfgCorr->at(cBin * 6 + 2), cfgCorr->at(cBin * 6 + 3));
333-
helperEP.DoTwist(qVector_twist[0], qVector_twist[1], cfgCorr->at(cBin * 6 + 4), cfgCorr->at(cBin * 6 + 5));
366+
helperEP.DoRecenter(qVector_twist[0], qVector_twist[1], cfgCorr->at(cBin * 6), cfgCorr->at(cBin * 6 + 1));
367+
helperEP.DoTwist(qVector_twist[0], qVector_twist[1], cfgCorr->at(cBin * 6 + 2), cfgCorr->at(cBin * 6 + 3));
334368

335369
helperEP.DoRecenter(qVector_final[0], qVector_final[1], cfgCorr->at(cBin * 6), cfgCorr->at(cBin * 6 + 1));
336370
helperEP.DoTwist(qVector_final[0], qVector_final[1], cfgCorr->at(cBin * 6 + 2), cfgCorr->at(cBin * 6 + 3));
@@ -361,7 +395,8 @@ struct qVectorsTable {
361395
qVectBPos_uncor[0], qVectBPos_uncor[1], qVectBPos_rectr[0], qVectBPos_rectr[1],
362396
qVectBPos_twist[0], qVectBPos_twist[1], qVectBPos_final[0], qVectBPos_final[1],
363397
qVectBNeg_uncor[0], qVectBNeg_uncor[1], qVectBNeg_rectr[0], qVectBNeg_rectr[1],
364-
qVectBNeg_twist[0], qVectBNeg_twist[1], qVectBNeg_final[0], qVectBNeg_final[1]);
398+
qVectBNeg_twist[0], qVectBNeg_twist[1], qVectBNeg_final[0], qVectBNeg_final[1],
399+
nTrkBPos, nTrkBNeg);
365400
} // End process.
366401
};
367402

Common/Tasks/evtPlanesResolution.cxx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ struct evtPlanesResolution {
6161
// Helper variables.
6262
EventPlaneHelper helperEP;
6363

64+
Configurable<int> cfgMinTPCTracks{"cfgMinTPCTracks", 20, "minimum TPC tracks participating in Q-vector reconstruction"};
65+
6466
void init(InitContext const&)
6567
{
6668
// Fill the registry with the needed objects.
@@ -91,6 +93,9 @@ struct evtPlanesResolution {
9193
template <int cBin, typename T>
9294
void fillHistosEvtPl(const T& vec)
9395
{
96+
if (vec.nTrkBPos() < cfgMinTPCTracks || vec.nTrkBNeg() < cfgMinTPCTracks)
97+
return;
98+
9499
histosQA.fill(HIST(ep::centClasses[cBin]) + HIST("histEvtPlUncor"), vec.evtPlUncor());
95100
histosQA.fill(HIST(ep::centClasses[cBin]) + HIST("histEvtPlRectr"), vec.evtPlRectr());
96101
histosQA.fill(HIST(ep::centClasses[cBin]) + HIST("histEvtPlTwist"), vec.evtPlTwist());

PWGLF/Tasks/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,3 +210,8 @@ o2physics_add_dpl_workflow(delta-analysis
210210
SOURCES rhoanalysis.cxx
211211
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
212212
COMPONENT_NAME Analysis)
213+
214+
o2physics_add_dpl_workflow(rsn-analysis-thnsparse
215+
SOURCES rsnanalysisTHnSparse.cxx
216+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
217+
COMPONENT_NAME Analysis)
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
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+
/// \author Veronika Barbasova (veronika.barbasova@cern.ch)
13+
/// \since October 12, 2023
14+
15+
#include "Framework/runDataProcessing.h"
16+
#include "Framework/AnalysisTask.h"
17+
18+
#include "Common/DataModel/TrackSelectionTables.h"
19+
#include "Common/DataModel/Multiplicity.h"
20+
#include "Common/DataModel/EventSelection.h"
21+
#include "Common/DataModel/PIDResponse.h"
22+
23+
#include <TLorentzVector.h>
24+
#include "ReconstructionDataFormats/PID.h"
25+
#include "Framework/ASoAHelpers.h"
26+
27+
using namespace o2;
28+
using namespace o2::framework;
29+
using namespace o2::framework::expressions;
30+
31+
struct rsnanalysisTHnSparse {
32+
33+
SliceCache cache;
34+
35+
Configurable<bool> test{"test", false, "Running in test mode."};
36+
Configurable<int> refresh{"print-refresh", 0, "Freqency of print event information."};
37+
Configurable<int> refresh_index{"print-refresh-index", 1, "Freqency of print event information index."};
38+
Configurable<float> tpcnSigma1{"tpcnSigma1", 3.0f, "TPC NSigma cut of the first particle."};
39+
Configurable<float> tpcnSigma2{"tpcnSigma2", 3.0f, "TPC NSigma cut of the second particle."};
40+
Configurable<int> dauther1{"dauther1", 3, "Particle type of the first dauther according to ReconstructionDataFormats/PID.h (Default = Kaon)"};
41+
Configurable<int> dauther2{"dauther", 3, "Particle type of the second dauther according to ReconstructionDataFormats/PID.h (Default = Kaon)"};
42+
Configurable<float> vertexfilter{"vertex-filter", 10.0f, "Z vertex range."};
43+
44+
ConfigurableAxis invaxis{"invAxis", {200, 0.97, 1.1}, "Invariant mass axis binning."};
45+
ConfigurableAxis ptaxis{"ptAxis", {20, 0., 20.}, "Pt axis binning."};
46+
ConfigurableAxis maxis{"mAxis", {200, 0., 2000.}, "Multiplicity axis binning."};
47+
ConfigurableAxis nsigmaaxis{"nsigma-axis", {300, -15., 15.}, "NSigma axis binning."};
48+
49+
HistogramRegistry registry{"registry",
50+
{{"hNsigmaPos", "hNsigmaPos", {HistType::kTH1F, {nsigmaaxis}}},
51+
{"hNsigmaNeg", "hNsigmaNeg", {HistType::kTH1F, {nsigmaaxis}}}}};
52+
53+
// defined in DataFormats/Reconstruction/include/ReconstructionDataFormats/PID.h
54+
float mass1 = o2::track::PID::getMass(dauther1);
55+
float mass2 = o2::track::PID::getMass(dauther2);
56+
57+
float multiplicity;
58+
59+
Filter eventFilter = (o2::aod::evsel::sel8 == true);
60+
Filter vtxFilter = (nabs(o2::aod::collision::posZ) < vertexfilter);
61+
62+
using EventCandidates = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Mults>>;
63+
using EventCandidate = EventCandidates::iterator;
64+
using TrackCandidates = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::pidTPCFullKa>;
65+
66+
Partition<TrackCandidates> positive = (aod::track::signed1Pt > 0.0f) && (nabs(o2::aod::pidtpc::tpcNSigmaKa) < tpcnSigma1);
67+
Partition<TrackCandidates> negative = (aod::track::signed1Pt < 0.0f) && (nabs(o2::aod::pidtpc::tpcNSigmaKa) < tpcnSigma2);
68+
69+
TLorentzVector d1, d2, mother;
70+
71+
void init(o2::framework::InitContext&)
72+
{
73+
if (test)
74+
LOGF(info, "Running test");
75+
76+
AxisSpec invAxis = {invaxis, "Inv. mass (GeV/c^{2})", "im"};
77+
AxisSpec ptAxis = {ptaxis, "p_{T} (GeV/c)", "pt"};
78+
AxisSpec mAxis = {maxis, "N", "m"};
79+
HistogramConfigSpec Hist({HistType::kTHnSparseF, {invAxis, ptAxis, mAxis}});
80+
registry.add("unlike", "Unlike", Hist);
81+
registry.add("likep", "Likep", Hist);
82+
registry.add("liken", "Liken", Hist);
83+
}
84+
85+
template <typename T>
86+
bool selectedTrack(const T& track)
87+
{
88+
if (!track.isPrimaryTrack())
89+
return false;
90+
return true;
91+
}
92+
93+
template <typename T>
94+
bool selectedPair(TLorentzVector& mother, const T& track1, const T& track2)
95+
{
96+
d1.SetXYZM(track1.px(), track1.py(), track1.pz(), mass1);
97+
d2.SetXYZM(track2.px(), track2.py(), track2.pz(), mass2);
98+
mother = d1 + d2;
99+
100+
return true;
101+
}
102+
103+
void process(EventCandidate const& collision, TrackCandidates const& tracks)
104+
{
105+
if (test && collision.globalIndex() != 1)
106+
return;
107+
108+
auto posDauthers = positive->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
109+
auto negDauthers = negative->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
110+
111+
if (collision.globalIndex() == 0) {
112+
if (test) {
113+
LOGF(info, "BAD pos=%lld neg=%lld, Z vertex position: %f [cm], %d, mult:%f.0", posDauthers.size(), negDauthers.size(), collision.posZ(),
114+
collision.globalIndex(), multiplicity);
115+
}
116+
return;
117+
}
118+
119+
multiplicity = collision.multFT0A() + collision.multFT0C();
120+
121+
if (refresh > 0 && collision.globalIndex() % refresh == refresh_index)
122+
LOGF(info, "pos=%lld neg=%lld, Z vertex position: %f [cm], %d, mult:%f.0", posDauthers.size(), negDauthers.size(), collision.posZ(),
123+
collision.globalIndex(), multiplicity);
124+
125+
for (const auto& trk : posDauthers) {
126+
registry.fill(HIST("hNsigmaPos"), trk.tpcNSigmaKa());
127+
}
128+
129+
for (const auto& trk : negDauthers) {
130+
registry.fill(HIST("hNsigmaNeg"), trk.tpcNSigmaKa());
131+
}
132+
133+
for (auto& [track1, track2] : combinations(o2::soa::CombinationsUpperIndexPolicy(posDauthers, negDauthers))) {
134+
135+
if (!selectedTrack(track1))
136+
continue;
137+
if (!selectedTrack(track2))
138+
continue;
139+
140+
if (!selectedPair(mother, track1, track2))
141+
continue;
142+
registry.fill(HIST("unlike"), mother.Mag(), mother.Pt(), multiplicity);
143+
}
144+
145+
for (auto& [track1, track2] : combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(posDauthers, posDauthers))) {
146+
147+
if (!selectedTrack(track1))
148+
continue;
149+
if (!selectedTrack(track2))
150+
continue;
151+
152+
if (!selectedPair(mother, track1, track2))
153+
continue;
154+
registry.fill(HIST("likep"), mother.Mag(), mother.Pt(), multiplicity);
155+
}
156+
157+
for (auto& [track1, track2] : combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(negDauthers, negDauthers))) {
158+
159+
if (!selectedTrack(track1))
160+
continue;
161+
if (!selectedTrack(track2))
162+
continue;
163+
164+
if (!selectedPair(mother, track1, track2))
165+
continue;
166+
registry.fill(HIST("liken"), mother.Mag(), mother.Pt(), multiplicity);
167+
}
168+
}
169+
};
170+
171+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
172+
{
173+
return WorkflowSpec{
174+
adaptAnalysisTask<rsnanalysisTHnSparse>(cfgc)};
175+
}

0 commit comments

Comments
 (0)