Skip to content

Commit dff5492

Browse files
authored
[PWGHF] Update of B+ routines (#18263)
1 parent 9eae0c6 commit dff5492

7 files changed

Lines changed: 431 additions & 247 deletions

‎PWGHF/Core/HfMlResponseBplusToD0Pi.h‎

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@
2929
// Fill the map of available input features
3030
// the key is the feature's name (std::string)
3131
// the value is the corresponding value in EnumInputFeatures
32-
#define FILL_MAP_BPLUS(FEATURE) \
33-
{ \
34-
#FEATURE, static_cast<uint8_t>(InputFeaturesBplusToD0Pi::FEATURE) \
35-
}
32+
#define FILL_MAP_BPLUS(FEATURE) \
33+
{ \
34+
#FEATURE, static_cast<uint8_t>(InputFeaturesBplusToD0Pi::FEATURE)}
3635

3736
// Check if the index of mCachedIndices (index associated to a FEATURE)
3837
// matches the entry in EnumInputFeatures associated to this FEATURE
@@ -89,6 +88,14 @@ enum class InputFeaturesBplusToD0Pi : uint8_t {
8988
decayLengthXYNormalised,
9089
cpa,
9190
cpaXY,
91+
decayLengthDToPv,
92+
decayLengthDToPvXY,
93+
decayLengthDToB,
94+
decayLengthDToBXY,
95+
cpaDToPv,
96+
cpaDToPvXY,
97+
cpaDToB,
98+
cpaDToBXY,
9299
maxNormalisedDeltaIP,
93100
prong0MlProbBkg,
94101
prong0MlProbPrompt,
@@ -134,6 +141,14 @@ class HfMlResponseBplusToD0Pi : public HfMlResponse<TypeOutputScore>
134141
CHECK_AND_FILL_VEC_BPLUS(decayLengthXYNormalised);
135142
CHECK_AND_FILL_VEC_BPLUS(cpa);
136143
CHECK_AND_FILL_VEC_BPLUS(cpaXY);
144+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToPv);
145+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToPvXY);
146+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToB);
147+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToBXY);
148+
CHECK_AND_FILL_VEC_BPLUS(cpaDToPv);
149+
CHECK_AND_FILL_VEC_BPLUS(cpaDToPvXY);
150+
CHECK_AND_FILL_VEC_BPLUS(cpaDToB);
151+
CHECK_AND_FILL_VEC_BPLUS(cpaDToBXY);
137152
CHECK_AND_FILL_VEC_BPLUS(maxNormalisedDeltaIP);
138153
CHECK_AND_FILL_VEC_D0_INDEX(prong0MlProbBkg, mlProbD0, mlProbD0bar, 0);
139154
CHECK_AND_FILL_VEC_D0_INDEX(prong0MlProbPrompt, mlProbD0, mlProbD0bar, 1);
@@ -159,6 +174,14 @@ class HfMlResponseBplusToD0Pi : public HfMlResponse<TypeOutputScore>
159174
CHECK_AND_FILL_VEC_BPLUS(decayLengthXYNormalised);
160175
CHECK_AND_FILL_VEC_BPLUS(cpa);
161176
CHECK_AND_FILL_VEC_BPLUS(cpaXY);
177+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToPv);
178+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToPvXY);
179+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToB);
180+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToBXY);
181+
CHECK_AND_FILL_VEC_BPLUS(cpaDToPv);
182+
CHECK_AND_FILL_VEC_BPLUS(cpaDToPvXY);
183+
CHECK_AND_FILL_VEC_BPLUS(cpaDToB);
184+
CHECK_AND_FILL_VEC_BPLUS(cpaDToBXY);
162185
CHECK_AND_FILL_VEC_BPLUS(maxNormalisedDeltaIP);
163186
// TPC PID variable
164187
CHECK_AND_FILL_VEC_BPLUS_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi);
@@ -190,6 +213,14 @@ class HfMlResponseBplusToD0Pi : public HfMlResponse<TypeOutputScore>
190213
FILL_MAP_BPLUS(decayLengthXYNormalised),
191214
FILL_MAP_BPLUS(cpa),
192215
FILL_MAP_BPLUS(cpaXY),
216+
FILL_MAP_BPLUS(decayLengthDToPv),
217+
FILL_MAP_BPLUS(decayLengthDToPvXY),
218+
FILL_MAP_BPLUS(decayLengthDToB),
219+
FILL_MAP_BPLUS(decayLengthDToBXY),
220+
FILL_MAP_BPLUS(cpaDToPv),
221+
FILL_MAP_BPLUS(cpaDToPvXY),
222+
FILL_MAP_BPLUS(cpaDToB),
223+
FILL_MAP_BPLUS(cpaDToBXY),
193224
FILL_MAP_BPLUS(maxNormalisedDeltaIP),
194225
FILL_MAP_BPLUS(prong0MlProbBkg),
195226
FILL_MAP_BPLUS(prong0MlProbPrompt),

‎PWGHF/Core/HfMlResponseBplusToD0PiReduced.h‎

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,9 @@
2727
// Fill the map of available input features
2828
// the key is the feature's name (std::string)
2929
// the value is the corresponding value in EnumInputFeatures
30-
#define FILL_MAP_BPLUS(FEATURE) \
31-
{ \
32-
#FEATURE, static_cast<uint8_t>(InputFeaturesBplusToD0PiReduced::FEATURE) \
33-
}
30+
#define FILL_MAP_BPLUS(FEATURE) \
31+
{ \
32+
#FEATURE, static_cast<uint8_t>(InputFeaturesBplusToD0PiReduced::FEATURE)}
3433

3534
// Check if the index of mCachedIndices (index associated to a FEATURE)
3635
// matches the entry in EnumInputFeatures associated to this FEATURE
@@ -76,6 +75,14 @@ enum class InputFeaturesBplusToD0PiReduced : uint8_t {
7675
decayLengthXYNormalised,
7776
cpa,
7877
cpaXY,
78+
decayLengthDToPv,
79+
decayLengthDToPvXY,
80+
decayLengthDToB,
81+
decayLengthDToBXY,
82+
cpaDToPv,
83+
cpaDToPvXY,
84+
cpaDToB,
85+
cpaDToBXY,
7986
maxNormalisedDeltaIP,
8087
prong0MlScoreBkg,
8188
prong0MlScorePrompt,
@@ -119,6 +126,14 @@ class HfMlResponseBplusToD0PiReduced : public HfMlResponse<TypeOutputScore>
119126
CHECK_AND_FILL_VEC_BPLUS(decayLengthXYNormalised);
120127
CHECK_AND_FILL_VEC_BPLUS(cpa);
121128
CHECK_AND_FILL_VEC_BPLUS(cpaXY);
129+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToPv);
130+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToPvXY);
131+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToB);
132+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToBXY);
133+
CHECK_AND_FILL_VEC_BPLUS(cpaDToPv);
134+
CHECK_AND_FILL_VEC_BPLUS(cpaDToPvXY);
135+
CHECK_AND_FILL_VEC_BPLUS(cpaDToB);
136+
CHECK_AND_FILL_VEC_BPLUS(cpaDToBXY);
122137
CHECK_AND_FILL_VEC_BPLUS(maxNormalisedDeltaIP);
123138
CHECK_AND_FILL_VEC_BPLUS(prong0MlScoreBkg);
124139
CHECK_AND_FILL_VEC_BPLUS(prong0MlScorePrompt);
@@ -144,6 +159,14 @@ class HfMlResponseBplusToD0PiReduced : public HfMlResponse<TypeOutputScore>
144159
CHECK_AND_FILL_VEC_BPLUS(decayLengthXYNormalised);
145160
CHECK_AND_FILL_VEC_BPLUS(cpa);
146161
CHECK_AND_FILL_VEC_BPLUS(cpaXY);
162+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToPv);
163+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToPvXY);
164+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToB);
165+
CHECK_AND_FILL_VEC_BPLUS(decayLengthDToBXY);
166+
CHECK_AND_FILL_VEC_BPLUS(cpaDToPv);
167+
CHECK_AND_FILL_VEC_BPLUS(cpaDToPvXY);
168+
CHECK_AND_FILL_VEC_BPLUS(cpaDToB);
169+
CHECK_AND_FILL_VEC_BPLUS(cpaDToBXY);
147170
CHECK_AND_FILL_VEC_BPLUS(maxNormalisedDeltaIP);
148171
// TPC PID variable
149172
CHECK_AND_FILL_VEC_BPLUS_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi);
@@ -175,6 +198,14 @@ class HfMlResponseBplusToD0PiReduced : public HfMlResponse<TypeOutputScore>
175198
FILL_MAP_BPLUS(decayLengthXYNormalised),
176199
FILL_MAP_BPLUS(cpa),
177200
FILL_MAP_BPLUS(cpaXY),
201+
FILL_MAP_BPLUS(decayLengthDToPv),
202+
FILL_MAP_BPLUS(decayLengthDToPvXY),
203+
FILL_MAP_BPLUS(decayLengthDToB),
204+
FILL_MAP_BPLUS(decayLengthDToBXY),
205+
FILL_MAP_BPLUS(cpaDToPv),
206+
FILL_MAP_BPLUS(cpaDToPvXY),
207+
FILL_MAP_BPLUS(cpaDToB),
208+
FILL_MAP_BPLUS(cpaDToBXY),
178209
FILL_MAP_BPLUS(maxNormalisedDeltaIP),
179210
FILL_MAP_BPLUS(prong0MlScoreBkg),
180211
FILL_MAP_BPLUS(prong0MlScorePrompt),

‎PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ struct HfCandidateCreatorBplusReduced {
200200
pVecD0[0], pVecD0[1], pVecD0[2],
201201
pVecPion[0], pVecPion[1], pVecPion[2],
202202
dcaD0.getY(), dcaPion.getY(),
203-
std::sqrt(dcaD0.getSigmaY2()), std::sqrt(dcaPion.getSigmaY2()));
203+
std::sqrt(dcaD0.getSigmaY2()), std::sqrt(dcaPion.getSigmaY2()),
204+
candD0.xSecondaryVertex(), candD0.ySecondaryVertex(), candD0.zSecondaryVertex());
204205

205206
rowCandidateProngs(candD0.globalIndex(), trackPion.globalIndex());
206207

‎PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx‎

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
#include "PWGHF/Core/SelectorCuts.h"
2020
#include "PWGHF/D2H/DataModel/ReducedDataModel.h"
2121
#include "PWGHF/DataModel/CandidateSelectionTables.h"
22+
#include "PWGHF/Utils/utilsAnalysis.h"
2223
#include "PWGHF/Utils/utilsPid.h"
2324

2425
#include "Common/Core/TrackSelectorPID.h"
2526

2627
#include <CCDB/CcdbApi.h>
28+
#include <CommonConstants/PhysicsConstants.h>
2729
#include <Framework/ASoA.h>
2830
#include <Framework/AnalysisHelpers.h>
2931
#include <Framework/AnalysisTask.h>
@@ -91,6 +93,7 @@ struct HfCandidateSelectorBplusToD0PiReduced {
9193
Configurable<std::vector<std::string>> onnxFileNames{"onnxFileNames", std::vector<std::string>{"ModelHandler_onnx_BPLUSToD0Pi.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"};
9294
Configurable<int64_t> timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"};
9395
Configurable<bool> loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"};
96+
Configurable<bool> useD0TriggerMassCut{"useD0TriggerMassCut", false, "Flag to enable parametrize pT differential mass cut for triggered data"};
9497
// variable that will store the value of selectionFlagD (defined in dataCreatorD0PiReduced.cxx)
9598
int mySelectionFlagD0 = -1;
9699
int mySelectionFlagD0bar = -1;
@@ -101,6 +104,7 @@ struct HfCandidateSelectorBplusToD0PiReduced {
101104
o2::ccdb::CcdbApi ccdbApi;
102105

103106
TrackSelectorPi selectorPion;
107+
HfTrigger2ProngCuts hfTriggerCuts;
104108

105109
using TracksPion = soa::Join<HfRedTracks, HfRedTracksPid>;
106110

@@ -154,6 +158,19 @@ struct HfCandidateSelectorBplusToD0PiReduced {
154158
}
155159
}
156160

161+
/// Utility function to apply the pT-differential mass cut for triggered data
162+
/// on the D0 daughter of the B+ candidate
163+
/// \param candidate is the B+ candidate
164+
/// \param trackPi is the bachelor pion of the B+ candidate
165+
/// \return true if the D0 daughter passes the mass selection
166+
template <typename T1>
167+
bool isDmesInMassRange(const T1& candidate, TracksPion::iterator const& trackPi)
168+
{
169+
const auto candD0 = candidate.template prong0_as<HfRed2Prongs>();
170+
const auto invMassD0 = (trackPi.signed1Pt() < 0) ? candD0.invMassHypo0() : candD0.invMassHypo1();
171+
return isCandidateInMassRange(invMassD0, o2::constants::physics::MassD0, candidate.ptProng0(), hfTriggerCuts);
172+
}
173+
157174
/// Main function to perform B+ candidate creation
158175
/// \param withDmesMl is the flag to use the table with ML scores for the D- daughter (only possible if present in the derived data)
159176
/// \param hfCandsBp B+ candidates
@@ -189,6 +206,18 @@ struct HfCandidateSelectorBplusToD0PiReduced {
189206
continue;
190207
}
191208

209+
auto trackPi = hfCandBp.template prong1_as<TracksPion>();
210+
211+
// pT-differential mass cut on the D0 daughter for triggered data
212+
if (useD0TriggerMassCut && !isDmesInMassRange(hfCandBp, trackPi)) {
213+
hfSelBplusToD0PiCandidate(statusBplus);
214+
if (applyBplusMl) {
215+
hfMlBplusToD0PiCandidate(outputMlNotPreselected);
216+
}
217+
// LOGF(info, "B+ candidate selection failed at D0-meson mass selection");
218+
continue;
219+
}
220+
192221
if constexpr (WithDmesMl) { // we include it in the topological selections
193222
if (!HfHelper::selectionDmesMlScoresForBReduced(hfCandBp, cutsDmesMl, binsPtDmesMl)) {
194223
hfSelBplusToD0PiCandidate(statusBplus);
@@ -206,7 +235,6 @@ struct HfCandidateSelectorBplusToD0PiReduced {
206235
}
207236

208237
// track-level PID selection
209-
auto trackPi = hfCandBp.template prong1_as<TracksPion>();
210238
if (pionPidMethod == PidMethod::TpcOrTof || pionPidMethod == PidMethod::TpcAndTof) {
211239
int pidTrackPi{TrackSelectorPID::Status::NotApplicable};
212240
if (pionPidMethod == PidMethod::TpcOrTof) {
@@ -250,7 +278,8 @@ struct HfCandidateSelectorBplusToD0PiReduced {
250278

251279
void processSelection(HfRedCandBplus const& hfCandsBp,
252280
TracksPion const& pionTracks,
253-
HfCandBpConfigs const& configs)
281+
HfCandBpConfigs const& configs,
282+
HfRed2Prongs const& /*candsD*/)
254283
{
255284
runSelection<false>(hfCandsBp, pionTracks, configs);
256285
} // processSelection
@@ -259,7 +288,8 @@ struct HfCandidateSelectorBplusToD0PiReduced {
259288

260289
void processSelectionWithDmesMl(soa::Join<HfRedCandBplus, HfRedBplusD0Mls> const& hfCandsBp,
261290
TracksPion const& pionTracks,
262-
HfCandBpConfigs const& configs)
291+
HfCandBpConfigs const& configs,
292+
HfRed2Prongs const& /*candsD*/)
263293
{
264294
runSelection<true>(hfCandsBp, pionTracks, configs);
265295
} // processSelectionWithDmesMl

0 commit comments

Comments
 (0)