Skip to content

Commit 1e27587

Browse files
[PWGHF/HFC] D*-H correlation: Correcting the filling of D* and hadron table (#9145)
1 parent c69a71e commit 1e27587

File tree

2 files changed

+142
-54
lines changed

2 files changed

+142
-54
lines changed

PWGHF/HFC/DataModel/CorrelationTables.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,11 @@ DECLARE_SOA_TABLE(TrkRecInfoDplus, "AOD", "TRKRECINFODPLUS", //! Tracks Reconstr
363363
// definition of columns and tables for Dstar-Hadron correlation pair
364364
namespace hf_correlation_dstar_hadron
365365
{
366-
DECLARE_SOA_INDEX_COLUMN(Collision, collision);
366+
DECLARE_SOA_INDEX_COLUMN(Collision, collision); // used in pair table for indexing
367+
DECLARE_SOA_COLUMN(CollisionIdx, collisionIdx, int); // used in Dstar table for indexing
367368
// Dstar candidate properties
368-
DECLARE_SOA_INDEX_COLUMN(HfCandDstar, hfCandDstar);
369+
DECLARE_SOA_INDEX_COLUMN(HfCandDstar, hfCandDstar); // used in pair table for indexing
370+
DECLARE_SOA_COLUMN(HfCandDstarIdx, hfCandDstarIdx, int); // used in Dstar table for indexing
369371
DECLARE_SOA_COLUMN(PhiDstar, phiDstar, float);
370372
DECLARE_SOA_COLUMN(EtaDstar, etaDstar, float);
371373
DECLARE_SOA_COLUMN(PtDstar, ptDstar, float);
@@ -410,9 +412,9 @@ DECLARE_SOA_TABLE(DstarHadronPair, "AOD", "DSTRHPAIR", // D* Hadrons pairs Infor
410412
hf_correlation_dstar_hadron::DeltaM<hf_correlation_dstar_hadron::MDstar, hf_correlation_dstar_hadron::MD0>);
411413

412414
DECLARE_SOA_TABLE(Dstar, "AOD", "DSTAR", // Only Dstar properties
413-
hf_correlation_dstar_hadron::CollisionId,
415+
hf_correlation_dstar_hadron::CollisionIdx,
414416
// D* only properties
415-
hf_correlation_dstar_hadron::HfCandDstarId,
417+
hf_correlation_dstar_hadron::HfCandDstarIdx,
416418
hf_correlation_dstar_hadron::PhiDstar,
417419
hf_correlation_dstar_hadron::EtaDstar,
418420
hf_correlation_dstar_hadron::PtDstar,

PWGHF/HFC/TableProducer/correlatorDstarHadrons.cxx

Lines changed: 136 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
/// \author Deependra Sharma <deependra.sharma@cern.ch>, IITB
1414
/// \author Fabrizio Grosa <fabrizio.grosa@cern.ch>, CERN
1515

16+
/// \brief Correlator for D* and hadrons. This task is used to produce table for D* and hadron pairs.
17+
18+
// c++
19+
#include <vector>
20+
1621
// O2
1722
#include "CommonConstants/PhysicsConstants.h"
1823
#include "Framework/ASoAHelpers.h"
@@ -26,11 +31,29 @@
2631
#include "PWGHF/DataModel/CandidateReconstructionTables.h"
2732
#include "PWGHF/DataModel/CandidateSelectionTables.h"
2833
#include "PWGHF/HFC/DataModel/CorrelationTables.h"
34+
#include "PWGHF/Utils/utilsAnalysis.h"
2935

3036
using namespace o2;
3137
using namespace o2::framework;
3238
using namespace o2::framework::expressions;
3339

40+
const int nBinsPtCorrelation = 8;
41+
42+
const double binsPtCorrelationsDefault[nBinsPtCorrelation + 1] = {0., 2., 4., 6., 8., 12., 16., 24., 100.};
43+
auto vecBinsPtCorrelationsDefault = std::vector<double>{binsPtCorrelationsDefault, binsPtCorrelationsDefault + nBinsPtCorrelation + 1};
44+
45+
const double signalRegionLefBoundDefault[nBinsPtCorrelation] = {0.144, 0.144, 0.144, 0.144, 0.144, 0.144, 0.144, 0.144};
46+
auto vecSignalRegionLefBoundDefault = std::vector<double>{signalRegionLefBoundDefault, signalRegionLefBoundDefault + nBinsPtCorrelation};
47+
48+
const double signalRegionRightBoundDefault[nBinsPtCorrelation] = {0.146, 0.146, 0.146, 0.146, 0.146, 0.146, 0.146, 0.146};
49+
auto vecSignalRegionRightBoundDefault = std::vector<double>{signalRegionRightBoundDefault, signalRegionRightBoundDefault + nBinsPtCorrelation};
50+
51+
const double sidebandRightInnerDefault[nBinsPtCorrelation] = {0.147, 0.147, 0.147, 0.147, 0.147, 0.147, 0.147, 0.147};
52+
auto vecSidebandRightInnerDefault = std::vector<double>{sidebandRightInnerDefault, sidebandRightInnerDefault + nBinsPtCorrelation};
53+
54+
const double sidebandRightOuterDefault[nBinsPtCorrelation] = {0.154, 0.154, 0.154, 0.154, 0.154, 0.154, 0.154, 0.154};
55+
auto vecSidebandRightOuterDefault = std::vector<double>{sidebandRightOuterDefault, sidebandRightOuterDefault + nBinsPtCorrelation};
56+
3457
// flaging a collision if D* meson is found.
3558
struct HfCorrelatorDstarHadronsCollisionSelector {
3659
Produces<aod::DmesonSelection> collisionWDstar;
@@ -39,19 +62,19 @@ struct HfCorrelatorDstarHadronsCollisionSelector {
3962
Configurable<float> yCandMax{"yCandMax", 0.8, "max. cand. rapidity"};
4063
Configurable<float> ptCandMin{"ptCandMin", 1., "min. cand. pT"};
4164

65+
SliceCache cache;
66+
4267
using DstarCandidates = soa::Join<aod::HfCandDstars, aod::HfSelDstarToD0Pi>;
4368
using FilteredCandidates = soa::Filtered<DstarCandidates>;
4469

45-
SliceCache cache;
46-
Preslice<DstarCandidates> perColDstarCand = aod::hf_cand::collisionId;
47-
4870
// candidates who passed the slection criteria defined in "CandidateSelectionTables.h"
4971
Filter candidateFilter = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == selectionFlagDstar;
5072

73+
Preslice<DstarCandidates> perColDstarCand = aod::hf_cand::collisionId;
74+
5175
void processCollisionSelWDstar(aod::Collisions const& collisions,
5276
FilteredCandidates const& candidates)
5377
{
54-
5578
for (const auto& collision : collisions) {
5679
bool isDstarFound = false;
5780
auto candidatesPerCol = candidates.sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache);
@@ -73,7 +96,7 @@ struct HfCorrelatorDstarHadronsCollisionSelector {
7396
} // candidate loop
7497
// LOG(info) << "processCollisionSelWDstar: isDstarFound = " << isDstarFound;
7598
collisionWDstar(isDstarFound); // compatible with collision table (filled collision by collision)
76-
} // collision loop
99+
} // collision loop
77100
}
78101
PROCESS_SWITCH(HfCorrelatorDstarHadronsCollisionSelector, processCollisionSelWDstar, "process only data for dstar hadron correlation", true);
79102
};
@@ -102,13 +125,20 @@ struct HfCorrelatorDstarHadrons {
102125
Configurable<float> ptAssoTrackMin{"ptAssoTrackMin", 0.5, "min Pt of Associated Track"};
103126
Configurable<float> ptAssoTrackMax{"ptAssoTrackMax", 50.0, "max pT of Associated Track"};
104127

105-
ConfigurableAxis binsMultiplicity{"binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 2000.0f, 6000.0f, 100000.0f}, "Mixing bins - multiplicity"};
106-
ConfigurableAxis binsZVtx{"binsZVtx", {VARIABLE_WIDTH, -10.0f, -2.5f, 2.5f, 10.0f}, "Mixing bins - z-vertex"};
128+
Configurable<std::vector<double>> binsPtCorrelations{"binsPtCorrelations", std::vector<double>{vecBinsPtCorrelationsDefault}, "pT bin limits for correlation plots"};
129+
Configurable<std::vector<double>> signalRegionLefBound{"signalRegionLefBound", std::vector<double>{vecSignalRegionLefBoundDefault}, "left boundary of signal region vs pT"};
130+
Configurable<std::vector<double>> signalRegionRightBound{"signalRegionRightBound", std::vector<double>{vecSignalRegionRightBoundDefault}, "right boundary of signal region vs pT"};
131+
Configurable<std::vector<double>> rightSidebandOuterBoundary{"rightSidebandOuterBoundary", std::vector<double>{vecSidebandRightOuterDefault}, "right sideband outer baoundary vs pT"};
132+
Configurable<std::vector<double>> rightSidebandInnerBoundary{"rightSidebandInnerBoundary", std::vector<double>{vecSidebandRightInnerDefault}, "right sideband inner boundary"};
107133

108-
// ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFV0M<aod::mult::MultFV0A, aod::mult::MultFV0C>> binningScheme{{binsZVtx, binsMultiplicity},true};
109-
// ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFT0M<aod::mult::MultFT0A, aod::mult::MultFT0C>> binningScheme;
110-
using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFV0M<aod::mult::MultFV0A, aod::mult::MultFV0C>>;
111-
BinningType binningScheme{{binsZVtx, binsMultiplicity}, true};
134+
// Inv Mass of Dstar and D0 Candidate
135+
float invMassDstarParticle;
136+
float invMassD0Particle;
137+
int binNumber;
138+
SliceCache cache;
139+
140+
// using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFV0M<aod::mult::MultFV0A, aod::mult::MultFV0C>>;
141+
using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFT0M<aod::mult::MultFT0A, aod::mult::MultFT0C>>;
112142

113143
// Collision Table
114144
using CollisionsWDstar = soa::Join<aod::Collisions, aod::Mults, aod::DmesonSelection>;
@@ -128,12 +158,21 @@ struct HfCorrelatorDstarHadrons {
128158
Filter trackFilter = nabs(aod::track::eta) <= etaAbsAssoTrackMax && aod::track::pt >= ptAssoTrackMin && aod::track::pt <= ptAssoTrackMax &&
129159
aod::track::dcaXY >= dcaxyAssoTrackMin && aod::track::dcaXY <= dcaxyAssoTrackMax &&
130160
aod::track::dcaZ >= dcazAssoTrackMin && aod::track::dcaZ <= dcazAssoTrackMax;
131-
SliceCache cache;
161+
132162
// Preslice<DstarCandidates> perColCandidates = aod::hf_cand::collisionId;
133163
Preslice<FilteredCandidates> perColCandidates = aod::hf_cand::collisionId;
134164
// Preslice<aod::TracksWDca> perColTracks = aod::track::collisionId;
135165
Preslice<FilteredTracks> perColTracks = aod::track::collisionId;
136166

167+
ConfigurableAxis binsMultiplicity{"binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 2000.0f, 6000.0f, 100000.0f}, "Mixing bins - multiplicity"};
168+
ConfigurableAxis binsZVtx{"binsZVtx", {VARIABLE_WIDTH, -10.0f, -2.5f, 2.5f, 10.0f}, "Mixing bins - z-vertex"};
169+
BinningType binningScheme{{binsZVtx, binsMultiplicity}, true};
170+
// Eta Phi Axes
171+
ConfigurableAxis axisEta{"axisEta", {16, -1.0, 1.0}, "Eta Axis"};
172+
ConfigurableAxis axisPhi{"axisPhi", {64, 0.0, 3.14}, "Phi Axis"};
173+
ConfigurableAxis axisDeltaEta{"axisDeltaEta", {31, -2.0, 2.0}, "Delta Eta Axis"};
174+
ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {64, -o2::constants::math::PIHalf, 3.0 * o2::constants::math::PIHalf}, "Delta Phi Axis"};
175+
137176
HistogramRegistry registry{
138177
"registry",
139178
{{"hTriggerColCandPairCounts", "Counts of Trigger Collision, Trigger Candidates and Pair Counts", {HistType::kTH1F, {{3, 0.0, 3.0}}}}}};
@@ -145,20 +184,41 @@ struct HfCorrelatorDstarHadrons {
145184
LOGP(fatal, "One and only one process function must be enabled at a time.");
146185
}
147186

187+
invMassDstarParticle = -999.0;
188+
invMassD0Particle = -999.0;
189+
binNumber = -2;
190+
148191
binningScheme = {{binsZVtx, binsMultiplicity}, true};
192+
193+
registry.add("QA/hCandsPerCol", "Candidates per Collision", {HistType::kTH1D, {{100, 0.0, 100.0}}});
194+
registry.add("QA/hAssoTracksPerCol", "Tracks per Collision", {HistType::kTH1D, {{1000, 0.0, 1000.0}}});
195+
registry.add("QA/hCandsVsTracksPerCol", "Candidates vs Tracks per Collision", {HistType::kTHnSparseF, {{100, 0.0, 100.0}, {1000, 0.0, 1000.0}}});
196+
registry.add("QA/hCandsSignalVsTracksPerCol", "Candidates vs Tracks per Collision", {HistType::kTHnSparseF, {{100, 0.0, 100.0}, {1000, 0.0, 1000.0}}});
197+
registry.add("QA/hCandsSideBandVsTracksPerCol", "Candidates vs Tracks per Collision", {HistType::kTHnSparseF, {{100, 0.0, 100.0}, {1000, 0.0, 1000.0}}});
198+
// eta phi single particle distribution
199+
registry.add("QA/hPhiDstarSignal", "Phi distribution of Dstar from signal region", {HistType::kTH1D, {axisPhi}});
200+
registry.add("QA/hEtaDstarSignal", "Eta distribution of Dstar from signal region", {HistType::kTH1D, {axisEta}});
201+
registry.add("QA/hPhiDstarSideBand", "Phi distribution of Dstar from side band region", {HistType::kTH1D, {axisPhi}});
202+
registry.add("QA/hEtaDstarSideBand", "Eta distribution of Dstar from side band region", {HistType::kTH1D, {axisEta}});
203+
registry.add("QA/hPhiAssoTrack", "Phi distribution of Associated Track", {HistType::kTH1D, {axisPhi}});
204+
registry.add("QA/hEtaAssoTrack", "Eta distribution of Associated Track", {HistType::kTH1D, {axisEta}});
205+
// delta eta phi distribution
206+
registry.add("QA/hDPhiDstarAssoTrack", "Delta Phi distribution between Dstar and Associated Track", {HistType::kTH1D, {axisDeltaPhi}});
207+
registry.add("QA/hDEtaDstarAssoTrack", "Delta Eta distribution between Dstar and Associated Track", {HistType::kTH1D, {axisDeltaEta}});
208+
registry.add("QA/hDPhiDEtaDstarAssoTrack", "Delta Phi vs Delta Eta distribution between Dstar and Associated Track", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}});
149209
}
150210

151211
void processDataSameEvent(FilteredCollisions const& collisions, // only collisions who have altleast one D*
152212
FilteredTracks const& tracks,
153213
FilteredCandidates const& candidates,
154214
aod::BCsWithTimestamps const&)
155215
{
156-
157216
for (const auto& collision : collisions) {
158217
registry.fill(HIST("hTriggerColCandPairCounts"), 0); // counting trigger collision
159218

160219
auto bc = collision.bc_as<aod::BCsWithTimestamps>();
161220
auto timestamp = bc.timestamp();
221+
binNumber = binningScheme.getBin(std::make_tuple(collision.posZ(), collision.multFT0M()));
162222
auto candidatesPerCol = candidates.sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache);
163223
auto tracksPerCol = tracks.sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
164224

@@ -167,6 +227,64 @@ struct HfCorrelatorDstarHadrons {
167227
} // endif
168228

169229
registry.fill(HIST("hTriggerColCandPairCounts"), 1); // counting number of trigger particle
230+
registry.fill(HIST("QA/hCandsPerCol"), candidatesPerCol.size());
231+
registry.fill(HIST("QA/hAssoTracksPerCol"), tracksPerCol.size());
232+
registry.fill(HIST("QA/hCandsVsTracksPerCol"), candidatesPerCol.size(), tracksPerCol.size());
233+
234+
int nCandsSignal = 0;
235+
int nCandsSideBand = 0;
236+
// Single particle distribution for canfdidates
237+
for (const auto& cand : candidatesPerCol) {
238+
auto gItriggerParticle = cand.globalIndex();
239+
if (cand.signSoftPi() > 0) {
240+
invMassDstarParticle = cand.invMassDstar();
241+
invMassD0Particle = cand.invMassD0();
242+
} else {
243+
invMassDstarParticle = cand.invMassAntiDstar();
244+
invMassD0Particle = cand.invMassD0Bar();
245+
}
246+
auto ptDstar = cand.pt();
247+
int corrBinPtDstar = o2::analysis::findBin(binsPtCorrelations, ptDstar);
248+
auto deltaM = cand.invMassDstar() - cand.invMassD0();
249+
if (deltaM > signalRegionLefBound->at(corrBinPtDstar) && deltaM < signalRegionRightBound->at(corrBinPtDstar)) {
250+
// Signal Region
251+
registry.fill(HIST("QA/hPhiDstarSignal"), cand.phi());
252+
registry.fill(HIST("QA/hEtaDstarSignal"), cand.eta());
253+
nCandsSignal++;
254+
} else if (deltaM > rightSidebandInnerBoundary->at(corrBinPtDstar) && deltaM < rightSidebandOuterBoundary->at(corrBinPtDstar)) {
255+
// Side Band Region
256+
registry.fill(HIST("QA/hPhiDstarSideBand"), cand.phi());
257+
registry.fill(HIST("QA/hEtaDstarSideBand"), cand.eta());
258+
nCandsSideBand++;
259+
}
260+
registry.fill(HIST("QA/hCandsSignalVsTracksPerCol"), nCandsSignal, tracksPerCol.size());
261+
registry.fill(HIST("QA/hCandsSideBandVsTracksPerCol"), nCandsSideBand, tracksPerCol.size());
262+
263+
if (enableSeparateTables) {
264+
rowsDstar(collision.globalIndex(),
265+
gItriggerParticle,
266+
cand.phi(),
267+
cand.eta(),
268+
cand.pt(),
269+
invMassDstarParticle,
270+
invMassD0Particle,
271+
timestamp,
272+
binNumber);
273+
}
274+
} // Dstar loop
275+
// Single particle distribution for tracks
276+
for (const auto& track : tracksPerCol) {
277+
registry.fill(HIST("QA/hPhiAssoTrack"), track.phi());
278+
registry.fill(HIST("QA/hEtaAssoTrack"), track.eta());
279+
if (enableSeparateTables) {
280+
rowsAssoTrack(track.phi(),
281+
track.eta(),
282+
track.pt(),
283+
binNumber,
284+
collision.globalIndex(),
285+
timestamp);
286+
}
287+
} // Track loop
170288

171289
// Pair creation
172290
for (const auto& [triggerParticle, assocParticle] : soa::combinations(soa::CombinationsFullIndexPolicy(candidatesPerCol, tracksPerCol))) {
@@ -176,7 +294,7 @@ struct HfCorrelatorDstarHadrons {
176294
// Track rejection based on daughter index
177295
if ((triggerParticle.prong0Id() == gIassocParticle) || (triggerParticle.prong1Id() == gIassocParticle) || (triggerParticle.prongPiId() == gIassocParticle)) {
178296
continue; // rejected pair if associated particle is same as any of daughter particle
179-
} // endif
297+
} // endif
180298

181299
// Trigger Particle Rejection
182300
if (triggerParticle.pt() > ptDstarMax || triggerParticle.pt() < ptDstarMin) {
@@ -188,12 +306,9 @@ struct HfCorrelatorDstarHadrons {
188306
} // endif
189307

190308
registry.fill(HIST("hTriggerColCandPairCounts"), 2); // counting number of pairs
191-
192-
auto binNumber = binningScheme.getBin(std::make_tuple(collision.posZ(), collision.multFT0M()));
193-
194-
// Inv Mass of Dstar and D0 Candidate
195-
float invMassDstarParticle = -999.;
196-
float invMassD0Particle = -999.;
309+
registry.fill(HIST("QA/hDPhiDstarAssoTrack"), triggerParticle.phi() - assocParticle.phi());
310+
registry.fill(HIST("QA/hDEtaDstarAssoTrack"), triggerParticle.eta() - assocParticle.eta());
311+
registry.fill(HIST("QA/hDPhiDEtaDstarAssoTrack"), triggerParticle.phi() - assocParticle.phi(), triggerParticle.eta() - assocParticle.eta());
197312

198313
if (triggerParticle.signSoftPi() > 0) {
199314
invMassDstarParticle = triggerParticle.invMassDstar();
@@ -217,28 +332,7 @@ struct HfCorrelatorDstarHadrons {
217332
assocParticle.pt(),
218333
timestamp,
219334
binNumber);
220-
221-
if (enableSeparateTables) {
222-
rowsDstar(collision.globalIndex(),
223-
gItriggerParticle,
224-
triggerParticle.phi(),
225-
triggerParticle.eta(),
226-
triggerParticle.pt(),
227-
invMassDstarParticle,
228-
invMassD0Particle,
229-
timestamp,
230-
binNumber);
231-
232-
rowsAssoTrack(assocParticle.phi(),
233-
assocParticle.eta(),
234-
assocParticle.pt(),
235-
binNumber,
236-
collision.globalIndex(),
237-
timestamp);
238-
}
239-
240335
} // D-H pair loop
241-
242336
} // collision loop
243337

244338
} // processDataSameEvent
@@ -254,25 +348,17 @@ struct HfCorrelatorDstarHadrons {
254348
Pair<FilteredCollisions, FilteredCandidates, FilteredTracks, BinningType> pairData{binningScheme, 5, -1, collisions, dstarHadronTuple, &cache};
255349

256350
for (const auto& [c1, candidatesPerCol, c2, tracksPerCol] : pairData) {
257-
258351
auto bc = c2.bc_as<aod::BCsWithTimestamps>();
259352
auto timestamp = bc.timestamp();
260-
261353
for (const auto& [triggerParticle, assocParticle] : soa::combinations(soa::CombinationsFullIndexPolicy(candidatesPerCol, tracksPerCol))) {
262-
263354
auto gItriggerParticle = triggerParticle.globalIndex();
264355
auto gIassocParticle = assocParticle.globalIndex();
265-
266356
auto yDstar = triggerParticle.y(constants::physics::MassDStar);
267357
if (std::abs(yDstar) > yAbsDstarMax) {
268358
continue;
269359
} // endif
270360

271-
int binNumber = binningScheme.getBin(std::make_tuple(c2.posZ(), c2.multFV0M()));
272-
273-
// Inv Mass of Dstar and D0 Candidate
274-
float invMassDstarParticle = -999.;
275-
float invMassD0Particle = -999.;
361+
binNumber = binningScheme.getBin(std::make_tuple(c2.posZ(), c2.multFT0M()));
276362

277363
if (triggerParticle.signSoftPi() > 0) {
278364
invMassDstarParticle = triggerParticle.invMassDstar();

0 commit comments

Comments
 (0)