Skip to content

Commit 6df82e6

Browse files
committed
Fix candidate selection and cleanup OmegaC task
1 parent e9905ae commit 6df82e6

File tree

1 file changed

+65
-82
lines changed

1 file changed

+65
-82
lines changed

PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx

Lines changed: 65 additions & 82 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>;
61+
5762
PresliceUnsorted<CollisionsWithMcLabels> colPerMcCollision = aod::mccollisionlabel::mcCollisionId;
5863

59-
Partition<Omegac0CandidatesKF> selectedOmegac0CandidatesKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0;
60-
Partition<Omegac0CandidatesMlKF> selectedOmegac0CandidatesMlKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0;
64+
Filter filterOmegaCToOmegaPiFlag = (aod::hf_track_index::hfflag & static_cast<uint8_t>(BIT(aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi))) != static_cast<uint8_t>(0);
65+
Filter filterOmegaCMatchedRec = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchRec) == static_cast<int8_t>(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi));
66+
Filter filterOmegaCMatchedGen = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchGen) == static_cast<int8_t>(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi));
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,102 @@ 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)
141+
void processDataWithKFParticle(Omegac0CandsKF const& candidates, Collisions const& collisions)
147142
{
148-
processData<false>(selectedOmegac0CandidatesKF, collisions);
143+
processData<false>(candidates, collisions);
149144
}
150145
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticle, "process HfTaskOmegac0ToOmegapi with KFParticle", false);
151-
// TODO: add processKFParticle
152146

153-
void processDataWithKFParticleMl(Omegac0CandidatesMlKF const&, Collisions const& collisions)
147+
void processDataWithKFParticleMl(Omegac0CandsMlKF const& candidates, Collisions const& collisions)
154148
{
155-
processData<true>(selectedOmegac0CandidatesMlKF, collisions);
149+
processData<true>(candidates, collisions);
156150
}
157151
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections", false);
158-
// TODO: add processKFParticleMl
159152

160153
template <bool applyMl, typename CandType, typename CollType>
161154
void processMc(const CandType& candidates,
162-
soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const& mcParticles,
163-
MyTracksWMc const&,
155+
Omegac0Gen const& mcParticles,
156+
TracksMc const&,
164157
CollType const& collisions,
165158
aod::McCollisions const&)
166159
{
167160
// MC rec.
168161
for (const auto& candidate : candidates) {
169-
if (!(candidate.hfflag() & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi)) {
162+
if (!(candidate.resultSelections() == true || (candidate.resultSelections() == false && !selectionFlagOmegac0))) {
170163
continue;
171164
}
172165
if (yCandRecoMax >= 0. && std::abs(candidate.kfRapOmegac()) > yCandRecoMax) {
173166
continue;
174167
}
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-
}
168+
169+
auto numPvContributors = candidate.template collision_as<CollType>().numContrib();
170+
171+
if constexpr (applyMl) {
172+
registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac(), candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors);
173+
174+
} else {
175+
registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac(), candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors);
176+
}
190177
}
178+
191179
// MC gen.
192180
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-
}
181+
if (yCandGenMax >= 0. && std::abs(particle.rapidityCharmBaryonGen()) > yCandGenMax) {
182+
continue;
183+
}
184+
185+
auto ptGen = particle.pt();
186+
auto yGen = particle.rapidityCharmBaryonGen();
187+
188+
unsigned maxNumContrib = 0;
189+
const auto& recoCollsPerMcColl = collisions.sliceBy(colPerMcCollision, particle.mcCollision().globalIndex());
190+
for (const auto& recCol : recoCollsPerMcColl) {
191+
maxNumContrib = recCol.numContrib() > maxNumContrib ? recCol.numContrib() : maxNumContrib;
192+
}
193+
194+
if (particle.originGen() == RecoDecay::OriginType::Prompt) {
195+
registry.fill(HIST("hSparseAcc"), ptGen, -1., yGen, RecoDecay::OriginType::Prompt, maxNumContrib);
196+
} else {
197+
float ptGenB = mcParticles.rawIteratorAt(particle.idxBhadMotherPart()).pt();
198+
registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, RecoDecay::OriginType::NonPrompt, maxNumContrib);
214199
}
215200
}
216201
}
217202

218-
void processMcWithKFParticle(OmegaC0CandidatesMcKF const& omegaC0CandidatesMcKF,
219-
soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const& mcParticles,
220-
MyTracksWMc const& tracks,
203+
void processMcWithKFParticle(OmegaC0CandsMcKF const& omegaC0CandidatesMcKF,
204+
Omegac0Gen const& mcParticles,
205+
TracksMc const& tracks,
221206
CollisionsWithMcLabels const& collisions,
222207
aod::McCollisions const& mcCollisions)
223208
{
224209
processMc<false>(omegaC0CandidatesMcKF, mcParticles, tracks, collisions, mcCollisions);
225210
}
226211
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processMcWithKFParticle, "Process MC with KFParticle", false);
227-
// TODO: add the processMcWithKFParticle
228212

229-
void processMcWithKFParticleMl(Omegac0CandidatesMlMcKF const& omegac0CandidatesMlMcKF,
230-
soa::Join<aod::McParticles, aod::HfToOmegaPiMCGen> const& mcParticles,
231-
MyTracksWMc const& tracks,
213+
void processMcWithKFParticleMl(Omegac0CandsMlMcKF const& omegac0CandidatesMlMcKF,
214+
Omegac0Gen const& mcParticles,
215+
TracksMc const& tracks,
232216
CollisionsWithMcLabels const& collisions,
233217
aod::McCollisions const& mcCollisions)
234218
{
235219
processMc<true>(omegac0CandidatesMlMcKF, mcParticles, tracks, collisions, mcCollisions);
236220
}
237221
PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processMcWithKFParticleMl, "Process MC with KFParticle and ML selections", false);
238-
// TODO: add the processMcWithKFParticleMl
239222
};
240223

241224
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

0 commit comments

Comments
 (0)