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"
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
3036using namespace o2 ;
3137using namespace o2 ::framework;
3238using 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.
3558struct 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