Skip to content

Commit 2e3e171

Browse files
scattarualibuildvkucera
authored
[PWGHF] Ds-h correlations, ME offline on self-contained derived data (#8997)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch> Co-authored-by: Vít Kučera <vit.kucera@cern.ch>
1 parent 63d7328 commit 2e3e171

File tree

3 files changed

+204
-28
lines changed

3 files changed

+204
-28
lines changed

PWGHF/HFC/TableProducer/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ o2physics_add_dpl_workflow(correlator-ds-hadrons
4444
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
4545
COMPONENT_NAME Analysis)
4646

47+
o2physics_add_dpl_workflow(correlator-ds-hadrons-reduced
48+
SOURCES correlatorDsHadronsReduced.cxx
49+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
50+
COMPONENT_NAME Analysis)
51+
4752
o2physics_add_dpl_workflow(correlator-dstar-hadrons
4853
SOURCES correlatorDstarHadrons.cxx
4954
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore

PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx

Lines changed: 77 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ struct HfCorrelatorDsHadronsSelCollision {
6161
Configurable<float> yCandMax{"yCandMax", 0.8, "max. cand. rapidity"};
6262
Configurable<float> ptCandMin{"ptCandMin", 1., "min. cand. pT"};
6363

64-
SliceCache cache;
6564
HfHelper hfHelper;
65+
SliceCache cache;
6666

6767
using SelCollisions = soa::Join<aod::Collisions, aod::EvSels>;
6868
using CandDsData = soa::Filtered<soa::Join<aod::HfCand3Prong, aod::HfSelDsToKKPi>>;
@@ -169,15 +169,8 @@ struct HfCorrelatorDsHadrons {
169169
Configurable<std::vector<double>> binsPtHadron{"binsPtHadron", std::vector<double>{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle"};
170170
Configurable<std::vector<double>> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector<double>{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for efficiency"};
171171
Configurable<std::vector<double>> efficiencyD{"efficiencyD", {1., 1., 1., 1., 1., 1.}, "efficiency values for Ds meson"};
172-
ConfigurableAxis zPoolBins{"zPoolBins", {VARIABLE_WIDTH, -10.0, -2.5, 2.5, 10.0}, "z vertex position pools"};
173-
ConfigurableAxis multPoolBins{"multPoolBins", {VARIABLE_WIDTH, 0., 900., 1800., 6000.}, "event multiplicity pools (FT0M)"};
174-
ConfigurableAxis binsMassD{"binsMassD", {200, 1.7, 2.25}, "inv. mass (K^{#pm}K^{-}#pi^{+}) (GeV/#it{c}^{2})"};
175-
ConfigurableAxis binsEta{"binsEta", {50, -2., 2.}, "#it{#eta}"};
176-
ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"};
177-
ConfigurableAxis binsMultiplicity{"binsMultiplicity", {200, 0., 800.}, "Multiplicity"};
178-
ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 6000.}, "Multiplicity as FT0M signal amplitude"};
179-
ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"};
180-
ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"};
172+
173+
int hfcReducedCollisionIndex = 0;
181174

182175
HfHelper hfHelper;
183176
SliceCache cache;
@@ -195,6 +188,22 @@ struct HfCorrelatorDsHadrons {
195188
Filter flagDsFilter = ((o2::aod::hf_track_index::hfflag & static_cast<uint8_t>(1 << aod::hf_cand_3prong::DecayType::DsToKKPi)) != static_cast<uint8_t>(0)) && (aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlagDs || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlagDs);
196189
Filter trackFilter = (nabs(aod::track::eta) < etaTrackMax) && (aod::track::pt > ptTrackMin) && (aod::track::pt < ptTrackMax) && (nabs(aod::track::dcaXY) < dcaXYTrackMax) && (nabs(aod::track::dcaZ) < dcaZTrackMax);
197190

191+
Preslice<CandDsData> candsDsPerCollision = aod::hf_cand::collisionId;
192+
Preslice<MyTracksData> trackIndicesPerCollision = aod::track::collisionId;
193+
Preslice<CandDsMcGen> perCollisionCandMc = o2::aod::mcparticle::mcCollisionId;
194+
PresliceUnsorted<soa::Join<aod::Collisions, aod::FT0Mults, aod::EvSels, aod::McCollisionLabels>> collPerCollMc = o2::aod::mccollisionlabel::mcCollisionId;
195+
196+
ConfigurableAxis zPoolBins{"zPoolBins", {VARIABLE_WIDTH, -10.0, -2.5, 2.5, 10.0}, "z vertex position pools"};
197+
ConfigurableAxis multPoolBins{"multPoolBins", {VARIABLE_WIDTH, 0., 900., 1800., 6000.}, "event multiplicity pools (FT0M)"};
198+
ConfigurableAxis binsMassD{"binsMassD", {200, 1.7, 2.25}, "inv. mass (K^{#pm}K^{-}#pi^{+}) (GeV/#it{c}^{2})"};
199+
ConfigurableAxis binsEta{"binsEta", {50, -2., 2.}, "#it{#eta}"};
200+
201+
ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"};
202+
ConfigurableAxis binsMultiplicity{"binsMultiplicity", {200, 0., 800.}, "Multiplicity"};
203+
ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 6000.}, "Multiplicity as FT0M signal amplitude"};
204+
ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"};
205+
ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"};
206+
198207
HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject};
199208

200209
void init(InitContext&)
@@ -581,9 +590,6 @@ struct HfCorrelatorDsHadrons {
581590
}
582591
PROCESS_SWITCH(HfCorrelatorDsHadrons, processMcRec, "Process MC Reco mode", false);
583592

584-
Preslice<CandDsMcGen> perCollisionCandMc = o2::aod::mcparticle::mcCollisionId;
585-
PresliceUnsorted<soa::Join<aod::Collisions, aod::FT0Mults, aod::EvSels, aod::McCollisionLabels>> collPerCollMc = o2::aod::mccollisionlabel::mcCollisionId;
586-
587593
/// Ds-Hadron correlation pair builder - for MC gen-level analysis (no filter/selection, only true signal)
588594
void processMcGen(SelCollisionsMc const& mcCollisions,
589595
soa::Join<aod::Collisions, aod::FT0Mults, aod::EvSels, aod::McCollisionLabels> const& collisions,
@@ -689,32 +695,75 @@ struct HfCorrelatorDsHadrons {
689695
}
690696
PROCESS_SWITCH(HfCorrelatorDsHadrons, processMcGen, "Process MC Gen mode", false);
691697

692-
void processDerivedDataDs(SelCollisionsWithDs::iterator const& collision,
698+
void processDerivedDataDs(SelCollisionsWithDs const& collisions,
693699
CandDsData const& candidates,
694700
MyTracksData const& tracks)
695701
{
696-
collReduced(collision.multFT0M(), collision.posZ());
697702

698-
// Ds fill histograms and Ds candidates information stored
699-
for (const auto& candidate : candidates) {
700-
// candidate selected
701-
if (candidate.isSelDsToKKPi() >= selectionFlagDs) {
702-
candReduced(collReduced.lastIndex(), candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToKKPi(candidate));
703-
} else if (candidate.isSelDsToPiKK() >= selectionFlagDs) {
704-
candReduced(collReduced.lastIndex(), candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToPiKK(candidate));
703+
for (const auto& collision : collisions) {
704+
auto thisCollId = collision.globalIndex();
705+
auto candsDsThisColl = candidates.sliceBy(candsDsPerCollision, thisCollId);
706+
auto tracksThisColl = tracks.sliceBy(trackIndicesPerCollision, thisCollId);
707+
708+
// Ds fill histograms and Ds candidates information stored
709+
for (const auto& candidate : candidates) {
710+
// candidate selected
711+
if (candidate.isSelDsToKKPi() >= selectionFlagDs) {
712+
candReduced(hfcReducedCollisionIndex, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToKKPi(candidate));
713+
} else if (candidate.isSelDsToPiKK() >= selectionFlagDs) {
714+
candReduced(hfcReducedCollisionIndex, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToPiKK(candidate));
715+
}
705716
}
706-
}
707717

708-
// tracks information
709-
for (const auto& track : tracks) {
710-
if (!track.isGlobalTrackWoDCA()) {
711-
continue;
718+
// tracks information
719+
for (const auto& track : tracks) {
720+
if (!track.isGlobalTrackWoDCA()) {
721+
continue;
722+
}
723+
assocTrackReduced(hfcReducedCollisionIndex, track.phi(), track.eta(), track.pt());
712724
}
713-
assocTrackReduced(collReduced.lastIndex(), track.phi(), track.eta(), track.pt());
725+
726+
collReduced(collision.multFT0M(), collision.posZ());
727+
hfcReducedCollisionIndex++;
714728
}
715729
}
716730
PROCESS_SWITCH(HfCorrelatorDsHadrons, processDerivedDataDs, "Process derived data Ds", false);
717731

732+
void processDerivedDataDsLastIndex(SelCollisionsWithDs const& collisions,
733+
CandDsData const& candidates,
734+
MyTracksData const& tracks)
735+
{
736+
737+
for (const auto& collision : collisions) {
738+
auto thisCollId = collision.globalIndex();
739+
auto candsDsThisColl = candidates.sliceBy(candsDsPerCollision, thisCollId);
740+
auto tracksThisColl = tracks.sliceBy(trackIndicesPerCollision, thisCollId);
741+
742+
int indexHfcReducedCollision = collReduced.lastIndex() + 1;
743+
744+
// Ds fill histograms and Ds candidates information stored
745+
for (const auto& candidate : candidates) {
746+
// candidate selected
747+
if (candidate.isSelDsToKKPi() >= selectionFlagDs) {
748+
candReduced(indexHfcReducedCollision, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToKKPi(candidate));
749+
} else if (candidate.isSelDsToPiKK() >= selectionFlagDs) {
750+
candReduced(indexHfcReducedCollision, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToPiKK(candidate));
751+
}
752+
}
753+
754+
// tracks information
755+
for (const auto& track : tracks) {
756+
if (!track.isGlobalTrackWoDCA()) {
757+
continue;
758+
}
759+
assocTrackReduced(indexHfcReducedCollision, track.phi(), track.eta(), track.pt());
760+
}
761+
762+
collReduced(collision.multFT0M(), collision.posZ());
763+
}
764+
}
765+
PROCESS_SWITCH(HfCorrelatorDsHadrons, processDerivedDataDsLastIndex, "Process derived data Ds w lastIndex", false);
766+
718767
// Event Mixing
719768
void processDataME(SelCollisionsWithDs const& collisions,
720769
CandDsData const& candidates,
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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+
/// \file correlatorDsHadronsReduced.cxx
13+
/// \brief Ds-Hadrons correlator task for ME offline
14+
/// \author Samuele Cattaruzzi <samuele.cattaruzzi@cern.ch>
15+
16+
#include <vector>
17+
18+
#include "CommonConstants/PhysicsConstants.h"
19+
#include "Framework/AnalysisTask.h"
20+
#include "Framework/HistogramRegistry.h"
21+
#include "Framework/runDataProcessing.h"
22+
23+
#include "PWGHF/HFC/DataModel/CorrelationTables.h"
24+
#include "PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h"
25+
26+
using namespace o2;
27+
using namespace o2::analysis;
28+
using namespace o2::constants::physics;
29+
using namespace o2::constants::math;
30+
using namespace o2::framework;
31+
using namespace o2::framework::expressions;
32+
33+
/// Returns deltaPhi value in range [-pi/2., 3.*pi/2], typically used for correlation studies
34+
double getDeltaPhi(double phiHadron, double phiD)
35+
{
36+
return RecoDecay::constrainAngle(phiHadron - phiD, -PIHalf);
37+
}
38+
39+
// binning type
40+
using BinningTypeDerived = ColumnBinningPolicy<aod::hf_collisions_reduced::PosZ, aod::hf_collisions_reduced::Multiplicity>;
41+
42+
/// Ds-Hadron correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth)
43+
struct HfCorrelatorDsHadronsReduced {
44+
Produces<aod::DsHadronPair> entryDsHadronPair;
45+
Produces<aod::DsHadronRecoInfo> entryDsHadronRecoInfo;
46+
Produces<aod::DsHadronGenInfo> entryDsHadronGenInfo;
47+
48+
Configurable<bool> fillHistoData{"fillHistoData", true, "Flag for filling histograms in data processes"};
49+
Configurable<int> numberEventsMixed{"numberEventsMixed", 5, "Number of events mixed in ME process"};
50+
51+
SliceCache cache;
52+
53+
// Preslice<aod::AssocTrackReds> tracksPerCol = aod::hf_assoc_track_reduced::hfcRedCollisionId;
54+
Preslice<aod::AssocTrackReds> tracksPerCol = aod::hf_candidate_reduced::hfcRedCollisionId;
55+
Preslice<aod::DsCandReduceds> candPerCol = aod::hf_candidate_reduced::hfcRedCollisionId;
56+
57+
ConfigurableAxis zPoolBins{"zPoolBins", {VARIABLE_WIDTH, -10.0, -2.5, 2.5, 10.0}, "z vertex position pools"};
58+
ConfigurableAxis multPoolBins{"multPoolBins", {VARIABLE_WIDTH, 0., 900., 1800., 6000.}, "event multiplicity pools (FT0M)"};
59+
ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 6000.}, "Multiplicity as FT0M signal amplitude"};
60+
ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"};
61+
ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"};
62+
63+
HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject};
64+
65+
void init(InitContext&)
66+
{
67+
AxisSpec axisMultFT0M = {binsMultFT0M, "MultiplicityFT0M"};
68+
AxisSpec axisPosZ = {binsPosZ, "PosZ"};
69+
AxisSpec axisPoolBin = {binsPoolBin, "PoolBin"};
70+
71+
// Histograms for data analysis
72+
if (fillHistoData) {
73+
registry.add("hMultFT0M", "Multiplicity FT0M", {HistType::kTH1F, {axisMultFT0M}});
74+
registry.add("hZVtx", "z vertex", {HistType::kTH1F, {axisPosZ}});
75+
registry.add("hDsPoolBin", "Ds candidates pool bin", {HistType::kTH1F, {axisPoolBin}});
76+
registry.add("hTracksPoolBin", "Particles associated pool bin", {HistType::kTH1F, {axisPoolBin}});
77+
}
78+
}
79+
80+
void processDerivedDataME(aod::HfcRedCollisions const& collisions,
81+
aod::DsCandReduceds const& candidates,
82+
aod::AssocTrackReds const& tracks)
83+
{
84+
85+
BinningTypeDerived corrBinning{{zPoolBins, multPoolBins}, true};
86+
87+
auto tracksTuple = std::make_tuple(candidates, tracks);
88+
89+
Pair<aod::HfcRedCollisions, aod::DsCandReduceds, aod::AssocTrackReds, BinningTypeDerived> pairData{corrBinning, numberEventsMixed, -1, collisions, tracksTuple, &cache};
90+
91+
for (const auto& [c1, tracks1, c2, tracks2] : pairData) {
92+
if (tracks1.size() == 0) {
93+
continue;
94+
}
95+
96+
int poolBin = corrBinning.getBin(std::make_tuple(c2.posZ(), c2.multiplicity()));
97+
int poolBinDs = corrBinning.getBin(std::make_tuple(c1.posZ(), c1.multiplicity()));
98+
registry.fill(HIST("hMultFT0M"), c1.multiplicity());
99+
registry.fill(HIST("hZVtx"), c1.posZ());
100+
registry.fill(HIST("hTracksPoolBin"), poolBin);
101+
registry.fill(HIST("hDsPoolBin"), poolBinDs);
102+
103+
for (const auto& [cand, pAssoc] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) {
104+
LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", cand.index(), pAssoc.index(), c1.index(), c2.index(), cand.hfcRedCollisionId(), pAssoc.hfcRedCollisionId());
105+
106+
entryDsHadronPair(getDeltaPhi(pAssoc.phiAssocTrack(), cand.phiCand()),
107+
pAssoc.etaAssocTrack() - cand.etaCand(),
108+
cand.ptCand(),
109+
pAssoc.ptAssocTrack(),
110+
poolBin);
111+
entryDsHadronRecoInfo(cand.invMassDs(), false, false);
112+
entryDsHadronGenInfo(false, false, 0);
113+
}
114+
}
115+
}
116+
PROCESS_SWITCH(HfCorrelatorDsHadronsReduced, processDerivedDataME, "Process Mixed Event Derived Data", true);
117+
};
118+
119+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
120+
{
121+
return WorkflowSpec{adaptAnalysisTask<HfCorrelatorDsHadronsReduced>(cfgc)};
122+
}

0 commit comments

Comments
 (0)