Skip to content

Commit 3d939b1

Browse files
authored
[PWGHF] Fixes for OmegaC0 workflows (#10857)
1 parent 5011eee commit 3d939b1

File tree

3 files changed

+112
-119
lines changed

3 files changed

+112
-119
lines changed

PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx

Lines changed: 76 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
/// \file taskOmegac0ToOmegapi.cxx
1313
/// \brief OmegaC0 analysis task
1414
/// \author Yunfan Liu <yunfan.liu@cern.ch>, China University of Geosciences
15+
/// \author Fabio Catalano <fabio.catalano@cern.ch>, University of Houston
1516

1617
#include <vector>
1718

@@ -36,28 +37,33 @@ using namespace o2::framework::expressions;
3637
struct HfTaskOmegac0ToOmegapi {
3738
// ML inference
3839
Configurable<bool> applyMl{"applyMl", false, "Flag to apply ML selections"};
39-
Configurable<bool> selectionFlagOmegac0{"selectionFlagOmegac0", false, "Selection Flag for Omegac0 candidates"};
40+
Configurable<bool> selectionFlagOmegac0{"selectionFlagOmegac0", true, "Select Omegac0 candidates"};
4041
Configurable<double> yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"};
4142
Configurable<double> yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"};
4243

4344
HfHelper hfHelper;
4445
SliceCache cache;
45-
using MyTracksWMc = soa::Join<aod::Tracks, aod::TracksIU, aod::McTrackLabels>;
4646

47-
using Omegac0Candidates = soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi>;
48-
using Omegac0CandidatesKF = soa::Join<Omegac0Candidates, aod::HfOmegacKf>;
49-
using OmegaC0CandidatesMcKF = soa::Join<Omegac0CandidatesKF, aod::HfToOmegaPiMCRec>;
47+
using TracksMc = soa::Join<aod::Tracks, aod::TracksIU, aod::McTrackLabels>;
5048

51-
using Omegac0CandidatesMl = soa::Join<Omegac0Candidates, aod::HfMlSelOmegacToOmegaPi>;
52-
using Omegac0CandidatesMlKF = soa::Join<Omegac0CandidatesMl, aod::HfOmegacKf>;
53-
using Omegac0CandidatesMlMcKF = soa::Join<Omegac0CandidatesMlKF, aod::HfToOmegaPiMCRec>;
49+
using Omegac0Cands = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi>>;
50+
using Omegac0CandsKF = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfOmegacKf>>;
51+
using OmegaC0CandsMcKF = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfOmegacKf, aod::HfToOmegaPiMCRec>>;
52+
53+
using Omegac0CandsMl = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfMlSelOmegacToOmegaPi>>;
54+
using Omegac0CandsMlKF = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfMlSelOmegacToOmegaPi, aod::HfOmegacKf>>;
55+
using Omegac0CandsMlMcKF = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfMlSelOmegacToOmegaPi, aod::HfOmegacKf, aod::HfToOmegaPiMCRec>>;
56+
57+
using Omegac0Gen = soa::Filtered<soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen>>;
5458

5559
using Collisions = soa::Join<aod::Collisions, aod::EvSels>;
5660
using CollisionsWithMcLabels = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels>;
57-
PresliceUnsorted<CollisionsWithMcLabels> colPerMcCollision = aod::mccollisionlabel::mcCollisionId;
5861

59-
Partition<Omegac0CandidatesKF> selectedOmegac0CandidatesKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0;
60-
Partition<Omegac0CandidatesMlKF> selectedOmegac0CandidatesMlKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0;
62+
Filter filterOmegaCToOmegaPiFlag = (aod::hf_track_index::hfflag & static_cast<uint8_t>(BIT(aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi))) != static_cast<uint8_t>(0);
63+
Filter filterOmegaCMatchedRec = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchRec) == static_cast<int8_t>(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi));
64+
Filter filterOmegaCMatchedGen = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchGen) == static_cast<int8_t>(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi));
65+
66+
PresliceUnsorted<CollisionsWithMcLabels> colPerMcCollision = aod::mccollisionlabel::mcCollisionId;
6167

6268
// ThnSparse for ML outputScores and Vars
6369
ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {50, 0, 1}, "Prompt score bins"};
@@ -70,18 +76,16 @@ struct HfTaskOmegac0ToOmegapi {
7076
ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"};
7177
ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {1000, 0, 100}, "Gen Pt B"};
7278
ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"};
73-
HistogramRegistry registry{
74-
"registry",
75-
{}};
79+
HistogramRegistry registry{"registry", {}};
7680

7781
void init(InitContext&)
7882
{
79-
std::array<bool, 12> doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl};
83+
std::array<bool, 4> doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl};
8084
if ((std::accumulate(doprocess.begin(), doprocess.end(), 0)) != 1) {
8185
LOGP(fatal, "One and only one process function should be enabled at a time.");
8286
}
8387

84-
const AxisSpec thnAxisMass{thnConfigAxisMass, "inv. mass (#Omega #pi) (GeV/#it{c}^{2})"};
88+
const AxisSpec thnAxisMass{thnConfigAxisMass, "inv. mass (#Omega#pi) (GeV/#it{c}^{2})"};
8589
const AxisSpec thnAxisPt{thnConfigAxisPt, "#it{p}_{T} (GeV/#it{c})"};
8690
const AxisSpec thnAxisPtB{thnConfigAxisPtB, "#it{p}_{T}^{B} (GeV/#it{c})"};
8791
const AxisSpec thnAxisY{thnConfigAxisY, "y"};
@@ -97,11 +101,7 @@ struct HfTaskOmegac0ToOmegapi {
97101
registry.get<THnSparse>(HIST("hSparseAcc"))->Sumw2();
98102
}
99103

100-
std::vector<AxisSpec> axes = {
101-
thnAxisMass,
102-
thnAxisPt,
103-
thnAxisY,
104-
};
104+
std::vector<AxisSpec> axes = {thnAxisMass, thnAxisPt, thnAxisY};
105105
if (doprocessMcWithKFParticle || doprocessMcWithKFParticleMl) {
106106
axes.push_back(thnAxisPtB);
107107
axes.push_back(thnAxisOrigin);
@@ -110,9 +110,7 @@ struct HfTaskOmegac0ToOmegapi {
110110
}
111111
if (applyMl) {
112112
const AxisSpec thnAxisPromptScore{thnConfigAxisPromptScore, "BDT score prompt."};
113-
114113
axes.insert(axes.begin(), thnAxisPromptScore);
115-
116114
registry.add("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type", "Thn for Omegac0 candidates", HistType::kTHnSparseD, axes);
117115
registry.get<THnSparse>(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"))->Sumw2();
118116
} else {
@@ -125,117 +123,104 @@ struct HfTaskOmegac0ToOmegapi {
125123
void processData(const CandType& candidates, CollType const&)
126124
{
127125
for (const auto& candidate : candidates) {
128-
if (!(candidate.hfflag() & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi)) {
126+
if (!(candidate.resultSelections() == true || (candidate.resultSelections() == false && !selectionFlagOmegac0))) {
129127
continue;
130128
}
131129
if (yCandRecoMax >= 0. && std::abs(candidate.kfRapOmegac()) > yCandRecoMax) {
132130
continue;
133131
}
134-
float massOmegac0;
135-
massOmegac0 = candidate.invMassCharmBaryon();
136-
auto rapidityCandidate = candidate.kfRapOmegac();
137-
auto ptCandidate = candidate.ptCharmBaryon();
132+
138133
if constexpr (applyMl) {
139-
registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate);
134+
registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac());
140135
} else {
141-
registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), massOmegac0, ptCandidate, rapidityCandidate);
136+
registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac());
142137
}
143138
}
144139
}
145140

146-
void processDataWithKFParticle(Omegac0CandidatesKF const&, Collisions const& collisions)
147-
{
148-
processData<false>(selectedOmegac0CandidatesKF, collisions);
149-
}
150-
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticle, "process HfTaskOmegac0ToOmegapi with KFParticle", false);
151-
// TODO: add processKFParticle
152-
153-
void processDataWithKFParticleMl(Omegac0CandidatesMlKF const&, Collisions const& collisions)
154-
{
155-
processData<true>(selectedOmegac0CandidatesMlKF, collisions);
156-
}
157-
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections", false);
158-
// TODO: add processKFParticleMl
159-
160141
template <bool applyMl, typename CandType, typename CollType>
161142
void processMc(const CandType& candidates,
162-
soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const& mcParticles,
163-
MyTracksWMc const&,
143+
Omegac0Gen const& mcParticles,
144+
TracksMc const&,
164145
CollType const& collisions,
165146
aod::McCollisions const&)
166147
{
167148
// MC rec.
168149
for (const auto& candidate : candidates) {
169-
if (!(candidate.hfflag() & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi)) {
150+
if (!(candidate.resultSelections() == true || (candidate.resultSelections() == false && !selectionFlagOmegac0))) {
170151
continue;
171152
}
172153
if (yCandRecoMax >= 0. && std::abs(candidate.kfRapOmegac()) > yCandRecoMax) {
173154
continue;
174155
}
175-
auto collision = candidate.template collision_as<CollType>();
176-
auto numPvContributors = collision.numContrib();
177-
float massOmegac0;
178-
massOmegac0 = candidate.invMassCharmBaryon();
179-
auto ptCandidate = candidate.ptCharmBaryon();
180-
auto rapidityCandidate = candidate.kfRapOmegac();
181-
if (candidate.resultSelections() && !selectionFlagOmegac0)
182-
if (candidate.flagMcMatchRec() == (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)) {
183-
if constexpr (applyMl) {
184-
registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors);
185-
186-
} else {
187-
registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors);
188-
}
189-
}
156+
157+
auto numPvContributors = candidate.template collision_as<CollType>().numContrib();
158+
159+
if constexpr (applyMl) {
160+
registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac(), candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors);
161+
162+
} else {
163+
registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac(), candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors);
164+
}
190165
}
166+
191167
// MC gen.
192168
for (const auto& particle : mcParticles) {
193-
if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi) {
194-
if (yCandGenMax >= 0. && std::abs(particle.rapidityCharmBaryonGen()) > yCandGenMax) {
195-
continue;
196-
}
197-
float ptGenB = -1;
198-
auto ptGen = particle.pt();
199-
auto yGen = particle.rapidityCharmBaryonGen();
200-
201-
unsigned maxNumContrib = 0;
202-
const auto& recoCollsPerMcColl = collisions.sliceBy(colPerMcCollision, particle.mcCollision().globalIndex());
203-
for (const auto& recCol : recoCollsPerMcColl) {
204-
maxNumContrib = recCol.numContrib() > maxNumContrib ? recCol.numContrib() : maxNumContrib;
205-
}
206-
207-
if (particle.originGen() == RecoDecay::OriginType::Prompt) {
208-
registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, 1, maxNumContrib);
209-
210-
} else {
211-
ptGenB = mcParticles.rawIteratorAt(particle.idxBhadMotherPart()).pt();
212-
registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, 2, maxNumContrib);
213-
}
169+
if (yCandGenMax >= 0. && std::abs(particle.rapidityCharmBaryonGen()) > yCandGenMax) {
170+
continue;
171+
}
172+
173+
auto ptGen = particle.pt();
174+
auto yGen = particle.rapidityCharmBaryonGen();
175+
176+
unsigned maxNumContrib = 0;
177+
const auto& recoCollsPerMcColl = collisions.sliceBy(colPerMcCollision, particle.mcCollision().globalIndex());
178+
for (const auto& recCol : recoCollsPerMcColl) {
179+
maxNumContrib = recCol.numContrib() > maxNumContrib ? recCol.numContrib() : maxNumContrib;
180+
}
181+
182+
if (particle.originGen() == RecoDecay::OriginType::Prompt) {
183+
registry.fill(HIST("hSparseAcc"), ptGen, -1., yGen, RecoDecay::OriginType::Prompt, maxNumContrib);
184+
} else {
185+
float ptGenB = mcParticles.rawIteratorAt(particle.idxBhadMotherPart()).pt();
186+
registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, RecoDecay::OriginType::NonPrompt, maxNumContrib);
214187
}
215188
}
216189
}
217190

218-
void processMcWithKFParticle(OmegaC0CandidatesMcKF const& omegaC0CandidatesMcKF,
219-
soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const& mcParticles,
220-
MyTracksWMc const& tracks,
191+
void processDataWithKFParticle(Omegac0CandsKF const& candidates,
192+
Collisions const& collisions)
193+
{
194+
processData<false>(candidates, collisions);
195+
}
196+
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticle, "process HfTaskOmegac0ToOmegapi with KFParticle", false);
197+
198+
void processDataWithKFParticleMl(Omegac0CandsMlKF const& candidates,
199+
Collisions const& collisions)
200+
{
201+
processData<true>(candidates, collisions);
202+
}
203+
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections", false);
204+
205+
void processMcWithKFParticle(OmegaC0CandsMcKF const& omegaC0CandidatesMcKF,
206+
Omegac0Gen const& mcParticles,
207+
TracksMc const& tracks,
221208
CollisionsWithMcLabels const& collisions,
222209
aod::McCollisions const& mcCollisions)
223210
{
224211
processMc<false>(omegaC0CandidatesMcKF, mcParticles, tracks, collisions, mcCollisions);
225212
}
226213
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processMcWithKFParticle, "Process MC with KFParticle", false);
227-
// TODO: add the processMcWithKFParticle
228214

229-
void processMcWithKFParticleMl(Omegac0CandidatesMlMcKF const& omegac0CandidatesMlMcKF,
230-
soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const& mcParticles,
231-
MyTracksWMc const& tracks,
215+
void processMcWithKFParticleMl(Omegac0CandsMlMcKF const& omegac0CandidatesMlMcKF,
216+
Omegac0Gen const& mcParticles,
217+
TracksMc const& tracks,
232218
CollisionsWithMcLabels const& collisions,
233219
aod::McCollisions const& mcCollisions)
234220
{
235221
processMc<true>(omegac0CandidatesMlMcKF, mcParticles, tracks, collisions, mcCollisions);
236222
}
237223
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processMcWithKFParticleMl, "Process MC with KFParticle and ML selections", false);
238-
// TODO: add the processMcWithKFParticleMl
239224
};
240225

241226
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
/// \author Federica Zanone <federica.zanone@cern.ch>, Heidelberg University
1515
/// \author Ruiqi Yin <ruiqi.yin@cern.ch>, Fudan University
1616
/// \author Yunfan Liu <yunfan.liu@cern.ch>, China University of Geosciences
17+
/// \author Fabio Catalano <fabio.catalano@cern.ch>, University of Houston
1718

1819
#include <string>
1920
#include <vector>
@@ -223,7 +224,6 @@ struct HfCandidateSelectorToOmegaPi {
223224
registry.add("hStatusCheck", "Check consecutive selections status;status;entries", {HistType::kTH1D, {{12, 0., 12.}}});
224225

225226
// for QA of the selections (bin 0 -> candidates that did not pass the selection, bin 1 -> candidates that passed the selection)
226-
registry.add("hSelPtOmegac", "hSelPtOmegac;status;entries", {HistType::kTH1D, {axisSel}});
227227
registry.add("hSelSignDec", "hSelSignDec;status;entries", {HistType::kTH1D, {axisSel}});
228228
registry.add("hSelEtaPosV0Dau", "hSelEtaPosV0Dau;status;entries", {HistType::kTH1D, {axisSel}});
229229
registry.add("hSelEtaNegV0Dau", "hSelEtaNegV0Dau;status;entries", {HistType::kTH1D, {axisSel}});
@@ -254,6 +254,7 @@ struct HfCandidateSelectorToOmegaPi {
254254
registry.add("hSelDcaXYToPvKaFromCasc", "hSelDcaXYToPvKaFromCasc;status;entries", {HistType::kTH1D, {axisSel}});
255255

256256
if (KfconfigurableGroup.applyKFpreselections) {
257+
registry.add("hSelPtOmegac", "hSelPtOmegac;status;entries", {HistType::kTH1D, {axisSel}});
257258
registry.add("hSelCompetingCasc", "hSelCompetingCasc;status;entries", {HistType::kTH1D, {axisSel}});
258259
registry.add("hSelKFstatus", "hSelKFstatus;status;entries", {HistType::kTH1D, {axisSel}});
259260
registry.add("hSelV0_Casc_Omegacldl", "hSelV0_Casc_Omegacldl;status;entries", {HistType::kTH1D, {axisSel}});
@@ -340,7 +341,6 @@ struct HfCandidateSelectorToOmegaPi {
340341
auto trackPrFromLam = trackV0PosDau;
341342

342343
auto ptCand = candidate.ptCharmBaryon();
343-
344344
int8_t signDecay = candidate.signDecay(); // sign of pi <- cascade
345345

346346
if (signDecay > 0) {
@@ -507,7 +507,6 @@ struct HfCandidateSelectorToOmegaPi {
507507
}
508508

509509
if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) {
510-
;
511510
// KFParticle Preselections(kfsel)
512511
if (KfconfigurableGroup.applyKFpreselections) {
513512

@@ -529,7 +528,6 @@ struct HfCandidateSelectorToOmegaPi {
529528
}
530529

531530
// Omegac Pt selection
532-
hPtCharmBaryon->Fill(std::abs(candidate.kfptOmegac()));
533531
if (std::abs(candidate.kfptOmegac()) < ptCandMin || std::abs(candidate.kfptOmegac()) > ptCandMax) {
534532
resultSelections = false;
535533
registry.fill(HIST("hSelPtOmegac"), 0);
@@ -798,6 +796,11 @@ struct HfCandidateSelectorToOmegaPi {
798796

799797
if (statusPidLambda && statusPidCascade && statusPidCharmBaryon && statusInvMassLambda && statusInvMassCascade && statusInvMassCharmBaryon && resultSelections) {
800798
hInvMassCharmBaryon->Fill(invMassCharmBaryon);
799+
if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) {
800+
hPtCharmBaryon->Fill(candidate.kfptOmegac());
801+
} else {
802+
hPtCharmBaryon->Fill(ptCand);
803+
}
801804
}
802805
}
803806
} // end process

0 commit comments

Comments
 (0)