Skip to content

Commit dd0cae1

Browse files
authored
[PWGJE] Modification 3-prong to n-prong for b-jet (#16044)
1 parent 7fa4d74 commit dd0cae1

5 files changed

Lines changed: 315 additions & 462 deletions

File tree

PWGJE/DataModel/JetTagging.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ using JTrackTag = JTracksTag::iterator;
4949

5050
namespace secondary_vertex_params
5151
{
52-
DECLARE_SOA_COLUMN(XPrimaryVertex, xPVertex, float); // o2-linter: disable=name/o2-column
53-
DECLARE_SOA_COLUMN(YPrimaryVertex, yPVertex, float); // o2-linter: disable=name/o2-column
54-
DECLARE_SOA_COLUMN(ZPrimaryVertex, zPVertex, float); // o2-linter: disable=name/o2-column
52+
DECLARE_SOA_COLUMN(XPrimaryVertex, xPrimaryVertex, float);
53+
DECLARE_SOA_COLUMN(YPrimaryVertex, yPrimaryVertex, float);
54+
DECLARE_SOA_COLUMN(ZPrimaryVertex, zPrimaryVertex, float);
5555
DECLARE_SOA_COLUMN(XSecondaryVertex, xSecondaryVertex, float);
5656
DECLARE_SOA_COLUMN(YSecondaryVertex, ySecondaryVertex, float);
5757
DECLARE_SOA_COLUMN(ZSecondaryVertex, zSecondaryVertex, float);
@@ -75,7 +75,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(DecayLength, decayLength, [](float xVtxP, float yVtxP
7575
DECLARE_SOA_DYNAMIC_COLUMN(DecayLengthXY, decayLengthXY, [](float xVtxP, float yVtxP, float xVtxS, float yVtxS) -> float { return RecoDecay::distanceXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}); });
7676
DECLARE_SOA_DYNAMIC_COLUMN(DecayLengthNormalised, decayLengthNormalised, [](float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float err) -> float { return RecoDecay::distance(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}) / err; });
7777
DECLARE_SOA_DYNAMIC_COLUMN(DecayLengthXYNormalised, decayLengthXYNormalised, [](float xVtxP, float yVtxP, float xVtxS, float yVtxS, float err) -> float { return RecoDecay::distanceXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}) / err; });
78-
DECLARE_SOA_DYNAMIC_COLUMN(CPA, cpa, [](float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float px, float py, float pz) -> float { return RecoDecay::cpa(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}, std::array{px, py, pz}); }); // o2-linter: disable=name/o2-column
78+
DECLARE_SOA_DYNAMIC_COLUMN(Cpa, cpa, [](float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float px, float py, float pz) -> float { return RecoDecay::cpa(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}, std::array{px, py, pz}); });
7979
DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterXY, impactParameterXY, [](float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float px, float py, float pz) -> float { return RecoDecay::impParXY(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}, std::array{px, py, pz}); });
8080
} // namespace secondary_vertex_params
8181

@@ -113,7 +113,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterXY, impactParameterXY, [](float xVtxP,
113113
secondary_vertex_params::DecayLengthXY<secondary_vertex_params::XPrimaryVertex, secondary_vertex_params::YPrimaryVertex, secondary_vertex_params::XSecondaryVertex, secondary_vertex_params::YSecondaryVertex>, \
114114
secondary_vertex_params::DecayLengthNormalised<secondary_vertex_params::XPrimaryVertex, secondary_vertex_params::YPrimaryVertex, secondary_vertex_params::ZPrimaryVertex, secondary_vertex_params::XSecondaryVertex, secondary_vertex_params::YSecondaryVertex, secondary_vertex_params::ZSecondaryVertex, secondary_vertex_params::ErrorDecayLength>, \
115115
secondary_vertex_params::DecayLengthXYNormalised<secondary_vertex_params::XPrimaryVertex, secondary_vertex_params::YPrimaryVertex, secondary_vertex_params::XSecondaryVertex, secondary_vertex_params::YSecondaryVertex, secondary_vertex_params::ErrorDecayLengthXY>, \
116-
secondary_vertex_params::CPA<secondary_vertex_params::XPrimaryVertex, secondary_vertex_params::YPrimaryVertex, secondary_vertex_params::ZPrimaryVertex, secondary_vertex_params::XSecondaryVertex, secondary_vertex_params::YSecondaryVertex, secondary_vertex_params::ZSecondaryVertex, secondary_vertex_params::Px, secondary_vertex_params::Py, secondary_vertex_params::Pz>, \
116+
secondary_vertex_params::Cpa<secondary_vertex_params::XPrimaryVertex, secondary_vertex_params::YPrimaryVertex, secondary_vertex_params::ZPrimaryVertex, secondary_vertex_params::XSecondaryVertex, secondary_vertex_params::YSecondaryVertex, secondary_vertex_params::ZSecondaryVertex, secondary_vertex_params::Px, secondary_vertex_params::Py, secondary_vertex_params::Pz>, \
117117
secondary_vertex_params::ImpactParameterXY<secondary_vertex_params::XPrimaryVertex, secondary_vertex_params::YPrimaryVertex, secondary_vertex_params::ZPrimaryVertex, secondary_vertex_params::XSecondaryVertex, secondary_vertex_params::YSecondaryVertex, secondary_vertex_params::ZSecondaryVertex, secondary_vertex_params::Px, secondary_vertex_params::Py, secondary_vertex_params::Pz>); \
118118
namespace _name_##indices \
119119
{ \
@@ -127,6 +127,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterXY, impactParameterXY, [](float xVtxP,
127127

128128
JETSV_TABLES_DEF(Charged, SecondaryVertex3Prong, "3PRONG");
129129
JETSV_TABLES_DEF(Charged, SecondaryVertex2Prong, "2PRONG");
130+
JETSV_TABLES_DEF(Charged, SecondaryVertexNProng, "NPRONG");
130131

131132
// Defines the jet tagging table definition
132133
namespace jettagging

PWGJE/TableProducer/jetTaggerHF.cxx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -732,13 +732,15 @@ struct JetTaggerHFTask {
732732
PROCESS_SWITCH(JetTaggerHFTask, processFillTables, "Fill Tables for tagging decision, jet probability, and ML score on charged jets", false);
733733
};
734734

735-
using JetTaggerhfDataCharged = JetTaggerHFTask<false, soa::Join<aod::ChargedJets, aod::ChargedJetConstituents>, aod::DataSecondaryVertex3ProngIndices, aod::DataSecondaryVertex3Prongs, aod::ChargedJetTags>;
736-
using JetTaggerhfMCDCharged = JetTaggerHFTask<true, soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents>, aod::MCDSecondaryVertex3ProngIndices, aod::MCDSecondaryVertex3Prongs, aod::ChargedMCDetectorLevelJetTags>;
735+
using JetTaggerhfDataCharged = JetTaggerHFTask<false, soa::Join<aod::ChargedJets, aod::ChargedJetConstituents>, aod::DataSecondaryVertexNProngIndices, aod::DataSecondaryVertexNProngs, aod::ChargedJetTags>;
736+
using JetTaggerhfMcdCharged = JetTaggerHFTask<true, soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents>, aod::MCDSecondaryVertexNProngIndices, aod::MCDSecondaryVertexNProngs, aod::ChargedMCDetectorLevelJetTags>;
737737

738738
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
739739
{
740740

741741
return WorkflowSpec{
742-
adaptAnalysisTask<JetTaggerhfDataCharged>(cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-data-charged"}), // o2-linter: disable=name/o2-task
743-
adaptAnalysisTask<JetTaggerhfMCDCharged>(cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-mcd-charged"})}; // o2-linter: disable=name/o2-task
742+
adaptAnalysisTask<JetTaggerhfDataCharged>(
743+
cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-data-charged"}), // o2-linter: disable=name/o2-task (custom device name for templated task alias)
744+
adaptAnalysisTask<JetTaggerhfMcdCharged>(
745+
cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-mcd-charged"})}; // o2-linter: disable=name/o2-task (custom device name for templated task alias)
744746
}

PWGJE/TableProducer/secondaryVertexReconstruction.cxx

Lines changed: 121 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,19 @@ struct SecondaryVertexReconstruction {
6363
Produces<aod::DataSecondaryVertex2Prongs> sv2prongTableData;
6464
Produces<aod::DataSecondaryVertex2ProngIndices> sv2prongIndicesTableData;
6565

66+
Produces<aod::DataSecondaryVertexNProngs> svnprongTableData;
67+
Produces<aod::DataSecondaryVertexNProngIndices> svnprongIndicesTableData;
68+
6669
Produces<aod::MCDSecondaryVertex3Prongs> sv3prongTableMCD;
6770
Produces<aod::MCDSecondaryVertex3ProngIndices> sv3prongIndicesTableMCD;
6871

6972
Produces<aod::MCDSecondaryVertex2Prongs> sv2prongTableMCD;
7073
Produces<aod::MCDSecondaryVertex2ProngIndices> sv2prongIndicesTableMCD;
7174

75+
Produces<aod::MCDSecondaryVertexNProngs> svnprongTableMCD;
76+
Produces<aod::MCDSecondaryVertexNProngIndices> svnprongIndicesTableMCD;
77+
78+
Configurable<int> nProng{"nProng", 3, "number of prong"};
7279
Configurable<float> magneticField{"magneticField", 20.0f, "magnetic field in kG"};
7380
Configurable<bool> propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"};
7481
Configurable<bool> useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"};
@@ -241,43 +248,77 @@ struct SecondaryVertexReconstruction {
241248
std::fill(massArray.begin(), massArray.end(), o2::constants::physics::MassPiPlus);
242249
double massSV = RecoDecay::m(arrayMomenta, massArray);
243250

251+
// calculate momentum
252+
double xMomenta = -1;
253+
double yMomenta = -1;
254+
double zMomenta = -1;
255+
if (numProngs == ThreeProngCount) {
256+
xMomenta = arrayMomenta[0][0] + arrayMomenta[1][0] + arrayMomenta[2][0];
257+
yMomenta = arrayMomenta[0][1] + arrayMomenta[1][1] + arrayMomenta[2][1];
258+
zMomenta = arrayMomenta[0][2] + arrayMomenta[1][2] + arrayMomenta[2][2];
259+
} else if (numProngs == TwoProngCount) {
260+
xMomenta = arrayMomenta[0][0] + arrayMomenta[1][0];
261+
yMomenta = arrayMomenta[0][1] + arrayMomenta[1][1];
262+
zMomenta = arrayMomenta[0][2] + arrayMomenta[1][2];
263+
} else {
264+
LOG(error) << "No process momenta\n";
265+
}
266+
244267
// fill candidate table rows
245268
if ((doprocessData3Prongs || doprocessData3ProngsExternalMagneticField) && numProngs == ThreeProngCount) {
246269
sv3prongTableData(analysisJet.globalIndex(),
247270
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
248271
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
249-
arrayMomenta[0][0] + arrayMomenta[1][0] + arrayMomenta[2][0],
250-
arrayMomenta[0][1] + arrayMomenta[1][1] + arrayMomenta[2][1],
251-
arrayMomenta[0][2] + arrayMomenta[1][2] + arrayMomenta[2][2],
272+
xMomenta,
273+
yMomenta,
274+
zMomenta,
252275
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
253276
svIndices.push_back(sv3prongTableData.lastIndex());
254277
} else if ((doprocessData2Prongs || doprocessData2ProngsExternalMagneticField) && numProngs == TwoProngCount) {
255278
sv2prongTableData(analysisJet.globalIndex(),
256279
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
257280
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
258-
arrayMomenta[0][0] + arrayMomenta[1][0],
259-
arrayMomenta[0][1] + arrayMomenta[1][1],
260-
arrayMomenta[0][2] + arrayMomenta[1][2],
281+
xMomenta,
282+
yMomenta,
283+
zMomenta,
261284
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
262285
svIndices.push_back(sv2prongTableData.lastIndex());
286+
} else if ((doprocessDataNProngs || doprocessDataNProngsExternalMagneticField) && numProngs == TwoProngCount) {
287+
svnprongTableData(analysisJet.globalIndex(),
288+
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
289+
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
290+
xMomenta,
291+
yMomenta,
292+
zMomenta,
293+
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
294+
svIndices.push_back(svnprongTableData.lastIndex());
263295
} else if ((doprocessMCD3Prongs || doprocessMCD3ProngsExternalMagneticField) && numProngs == ThreeProngCount) {
264296
sv3prongTableMCD(analysisJet.globalIndex(),
265297
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
266298
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
267-
arrayMomenta[0][0] + arrayMomenta[1][0] + arrayMomenta[2][0],
268-
arrayMomenta[0][1] + arrayMomenta[1][1] + arrayMomenta[2][1],
269-
arrayMomenta[0][2] + arrayMomenta[1][2] + arrayMomenta[2][2],
299+
xMomenta,
300+
yMomenta,
301+
zMomenta,
270302
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
271303
svIndices.push_back(sv3prongTableMCD.lastIndex());
272304
} else if ((doprocessMCD2Prongs || doprocessMCD2ProngsExternalMagneticField) && numProngs == TwoProngCount) {
273305
sv2prongTableMCD(analysisJet.globalIndex(),
274306
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
275307
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
276-
arrayMomenta[0][0] + arrayMomenta[1][0],
277-
arrayMomenta[0][1] + arrayMomenta[1][1],
278-
arrayMomenta[0][2] + arrayMomenta[1][2],
308+
xMomenta,
309+
yMomenta,
310+
zMomenta,
279311
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
280312
svIndices.push_back(sv2prongTableMCD.lastIndex());
313+
} else if (doprocessMCDNProngs || doprocessMCDNProngsExternalMagneticField) {
314+
svnprongTableMCD(analysisJet.globalIndex(),
315+
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
316+
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
317+
xMomenta,
318+
yMomenta,
319+
zMomenta,
320+
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
321+
svIndices.push_back(svnprongTableMCD.lastIndex());
281322
} else {
282323
LOG(error) << "No process specified\n";
283324
}
@@ -357,6 +398,40 @@ struct SecondaryVertexReconstruction {
357398
}
358399
PROCESS_SWITCH(SecondaryVertexReconstruction, processData2ProngsExternalMagneticField, "Reconstruct the data 2-prong secondary vertex with extrernal magnetic field", false);
359400

401+
void processDataNProngs(JetCollisionwPIs::iterator const& collision, aod::Collisions const& /*realColl*/, soa::Join<aod::ChargedJets, aod::ChargedJetConstituents> const& jets, JetTracksData const& tracks, OriginalTracks const& /*tracks*/, aod::BCsWithTimestamps const& /*bcWithTimeStamps*/)
402+
{
403+
for (const auto& jet : jets) {
404+
std::vector<int> svIndices;
405+
if (nProng == ThreeProngCount) {
406+
runCreatorNProng<ThreeProngCount, false>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df3);
407+
svnprongIndicesTableData(svIndices);
408+
} else if (nProng == TwoProngCount) {
409+
runCreatorNProng<TwoProngCount, false>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df2);
410+
svnprongIndicesTableData(svIndices);
411+
} else {
412+
LOG(error) << "set number of prong\n";
413+
}
414+
}
415+
}
416+
PROCESS_SWITCH(SecondaryVertexReconstruction, processDataNProngs, "Reconstruct the data mult-prong secondary vertex", false);
417+
418+
void processDataNProngsExternalMagneticField(JetCollisionwPIs::iterator const& collision, aod::Collisions const& /*realColl*/, soa::Join<aod::ChargedJets, aod::ChargedJetConstituents> const& jets, JetTracksData const& tracks, OriginalTracks const& /*tracks*/)
419+
{
420+
for (const auto& jet : jets) {
421+
std::vector<int> svIndices;
422+
if (nProng == ThreeProngCount) {
423+
runCreatorNProng<ThreeProngCount, true>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df3);
424+
svnprongIndicesTableData(svIndices);
425+
} else if (nProng == TwoProngCount) {
426+
runCreatorNProng<TwoProngCount, true>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df2);
427+
svnprongIndicesTableData(svIndices);
428+
} else {
429+
LOG(error) << "set number of prong\n";
430+
}
431+
}
432+
}
433+
PROCESS_SWITCH(SecondaryVertexReconstruction, processDataNProngsExternalMagneticField, "Reconstruct the data mult-prong secondary vertex with extrernal magnetic field", false);
434+
360435
void processMCD3Prongs(JetCollisionwPIs::iterator const& collision, aod::Collisions const& /*realColl*/, soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const& mcdjets, JetTracksMCDwPIs const& tracks, OriginalTracks const& /*tracks*/, aod::BCsWithTimestamps const& /*bcWithTimeStamps*/)
361436
{
362437
for (const auto& jet : mcdjets) {
@@ -396,6 +471,40 @@ struct SecondaryVertexReconstruction {
396471
}
397472
}
398473
PROCESS_SWITCH(SecondaryVertexReconstruction, processMCD2ProngsExternalMagneticField, "Reconstruct the MCD 2-prong secondary vertex with external magnetic field", false);
474+
475+
void processMCDNProngs(JetCollisionwPIs::iterator const& collision, aod::Collisions const& /*realColl*/, soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const& mcdjets, JetTracksMCDwPIs const& tracks, OriginalTracks const& /*tracks*/, aod::BCsWithTimestamps const& /*bcWithTimeStamps*/)
476+
{
477+
for (const auto& jet : mcdjets) {
478+
std::vector<int> svIndices;
479+
if (nProng == ThreeProngCount) {
480+
runCreatorNProng<ThreeProngCount, false>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df3);
481+
svnprongIndicesTableMCD(svIndices);
482+
} else if (nProng == TwoProngCount) {
483+
runCreatorNProng<TwoProngCount, false>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df2);
484+
svnprongIndicesTableMCD(svIndices);
485+
} else {
486+
LOG(error) << "set number of prong\n";
487+
}
488+
}
489+
}
490+
PROCESS_SWITCH(SecondaryVertexReconstruction, processMCDNProngs, "Reconstruct the MCD n-prong secondary vertex", false);
491+
492+
void processMCDNProngsExternalMagneticField(JetCollisionwPIs::iterator const& collision, aod::Collisions const& /*realColl*/, soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const& mcdjets, JetTracksMCDwPIs const& tracks, OriginalTracks const& /*tracks*/)
493+
{
494+
for (const auto& jet : mcdjets) {
495+
std::vector<int> svIndices;
496+
if (nProng == ThreeProngCount) {
497+
runCreatorNProng<ThreeProngCount, true>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df3);
498+
svnprongIndicesTableMCD(svIndices);
499+
} else if (nProng == TwoProngCount) {
500+
runCreatorNProng<TwoProngCount, true>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df2);
501+
svnprongIndicesTableMCD(svIndices);
502+
} else {
503+
LOG(error) << "set number of prong\n";
504+
}
505+
}
506+
}
507+
PROCESS_SWITCH(SecondaryVertexReconstruction, processMCDNProngsExternalMagneticField, "Reconstruct the MCD n-prong secondary vertex with external magnetic field", false);
399508
};
400509

401510
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

0 commit comments

Comments
 (0)