Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions PWGJE/DataModel/JetTagging.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ using JTrackTag = JTracksTag::iterator;

namespace secondary_vertex_params
{
DECLARE_SOA_COLUMN(XPrimaryVertex, xPVertex, float); // o2-linter: disable=name/o2-column
DECLARE_SOA_COLUMN(YPrimaryVertex, yPVertex, float); // o2-linter: disable=name/o2-column
DECLARE_SOA_COLUMN(ZPrimaryVertex, zPVertex, float); // o2-linter: disable=name/o2-column
DECLARE_SOA_COLUMN(XPrimaryVertex, xPrimaryVertex, float);
DECLARE_SOA_COLUMN(YPrimaryVertex, yPrimaryVertex, float);
DECLARE_SOA_COLUMN(ZPrimaryVertex, zPrimaryVertex, float);
DECLARE_SOA_COLUMN(XSecondaryVertex, xSecondaryVertex, float);
DECLARE_SOA_COLUMN(YSecondaryVertex, ySecondaryVertex, float);
DECLARE_SOA_COLUMN(ZSecondaryVertex, zSecondaryVertex, float);
Expand All @@ -75,7 +75,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(DecayLength, decayLength, [](float xVtxP, float yVtxP
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}); });
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; });
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; });
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
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}); });
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}); });
} // namespace secondary_vertex_params

Expand Down Expand Up @@ -113,7 +113,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterXY, impactParameterXY, [](float xVtxP,
secondary_vertex_params::DecayLengthXY<secondary_vertex_params::XPrimaryVertex, secondary_vertex_params::YPrimaryVertex, secondary_vertex_params::XSecondaryVertex, secondary_vertex_params::YSecondaryVertex>, \
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>, \
secondary_vertex_params::DecayLengthXYNormalised<secondary_vertex_params::XPrimaryVertex, secondary_vertex_params::YPrimaryVertex, secondary_vertex_params::XSecondaryVertex, secondary_vertex_params::YSecondaryVertex, secondary_vertex_params::ErrorDecayLengthXY>, \
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>, \
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>, \
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>); \
namespace _name_##indices \
{ \
Expand All @@ -127,6 +127,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterXY, impactParameterXY, [](float xVtxP,

JETSV_TABLES_DEF(Charged, SecondaryVertex3Prong, "3PRONG");
JETSV_TABLES_DEF(Charged, SecondaryVertex2Prong, "2PRONG");
JETSV_TABLES_DEF(Charged, SecondaryVertexNProng, "NPRONG");

// Defines the jet tagging table definition
namespace jettagging
Expand Down
10 changes: 6 additions & 4 deletions PWGJE/TableProducer/jetTaggerHF.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -732,13 +732,15 @@ struct JetTaggerHFTask {
PROCESS_SWITCH(JetTaggerHFTask, processFillTables, "Fill Tables for tagging decision, jet probability, and ML score on charged jets", false);
};

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

WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
{

return WorkflowSpec{
adaptAnalysisTask<JetTaggerhfDataCharged>(cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-data-charged"}), // o2-linter: disable=name/o2-task
adaptAnalysisTask<JetTaggerhfMCDCharged>(cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-mcd-charged"})}; // o2-linter: disable=name/o2-task
adaptAnalysisTask<JetTaggerhfDataCharged>(
cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-data-charged"}), // o2-linter: disable=name/o2-task (custom device name for templated task alias)
adaptAnalysisTask<JetTaggerhfMcdCharged>(
cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-mcd-charged"})}; // o2-linter: disable=name/o2-task (custom device name for templated task alias)
}
133 changes: 121 additions & 12 deletions PWGJE/TableProducer/secondaryVertexReconstruction.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,19 @@ struct SecondaryVertexReconstruction {
Produces<aod::DataSecondaryVertex2Prongs> sv2prongTableData;
Produces<aod::DataSecondaryVertex2ProngIndices> sv2prongIndicesTableData;

Produces<aod::DataSecondaryVertexNProngs> svnprongTableData;
Produces<aod::DataSecondaryVertexNProngIndices> svnprongIndicesTableData;

Produces<aod::MCDSecondaryVertex3Prongs> sv3prongTableMCD;
Produces<aod::MCDSecondaryVertex3ProngIndices> sv3prongIndicesTableMCD;

Produces<aod::MCDSecondaryVertex2Prongs> sv2prongTableMCD;
Produces<aod::MCDSecondaryVertex2ProngIndices> sv2prongIndicesTableMCD;

Produces<aod::MCDSecondaryVertexNProngs> svnprongTableMCD;
Produces<aod::MCDSecondaryVertexNProngIndices> svnprongIndicesTableMCD;

Configurable<int> nProng{"nProng", 3, "number of prong"};
Configurable<float> magneticField{"magneticField", 20.0f, "magnetic field in kG"};
Configurable<bool> propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"};
Configurable<bool> useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"};
Expand Down Expand Up @@ -241,43 +248,77 @@ struct SecondaryVertexReconstruction {
std::fill(massArray.begin(), massArray.end(), o2::constants::physics::MassPiPlus);
double massSV = RecoDecay::m(arrayMomenta, massArray);

// calculate momentum
double xMomenta = -1;
double yMomenta = -1;
double zMomenta = -1;
if (numProngs == ThreeProngCount) {
xMomenta = arrayMomenta[0][0] + arrayMomenta[1][0] + arrayMomenta[2][0];
yMomenta = arrayMomenta[0][1] + arrayMomenta[1][1] + arrayMomenta[2][1];
zMomenta = arrayMomenta[0][2] + arrayMomenta[1][2] + arrayMomenta[2][2];
} else if (numProngs == TwoProngCount) {
xMomenta = arrayMomenta[0][0] + arrayMomenta[1][0];
yMomenta = arrayMomenta[0][1] + arrayMomenta[1][1];
zMomenta = arrayMomenta[0][2] + arrayMomenta[1][2];
} else {
LOG(error) << "No process momenta\n";
}

// fill candidate table rows
if ((doprocessData3Prongs || doprocessData3ProngsExternalMagneticField) && numProngs == ThreeProngCount) {
sv3prongTableData(analysisJet.globalIndex(),
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
arrayMomenta[0][0] + arrayMomenta[1][0] + arrayMomenta[2][0],
arrayMomenta[0][1] + arrayMomenta[1][1] + arrayMomenta[2][1],
arrayMomenta[0][2] + arrayMomenta[1][2] + arrayMomenta[2][2],
xMomenta,
yMomenta,
zMomenta,
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
svIndices.push_back(sv3prongTableData.lastIndex());
} else if ((doprocessData2Prongs || doprocessData2ProngsExternalMagneticField) && numProngs == TwoProngCount) {
sv2prongTableData(analysisJet.globalIndex(),
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
arrayMomenta[0][0] + arrayMomenta[1][0],
arrayMomenta[0][1] + arrayMomenta[1][1],
arrayMomenta[0][2] + arrayMomenta[1][2],
xMomenta,
yMomenta,
zMomenta,
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
svIndices.push_back(sv2prongTableData.lastIndex());
} else if ((doprocessDataNProngs || doprocessDataNProngsExternalMagneticField) && numProngs == TwoProngCount) {
svnprongTableData(analysisJet.globalIndex(),
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
xMomenta,
yMomenta,
zMomenta,
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
svIndices.push_back(svnprongTableData.lastIndex());
} else if ((doprocessMCD3Prongs || doprocessMCD3ProngsExternalMagneticField) && numProngs == ThreeProngCount) {
sv3prongTableMCD(analysisJet.globalIndex(),
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
arrayMomenta[0][0] + arrayMomenta[1][0] + arrayMomenta[2][0],
arrayMomenta[0][1] + arrayMomenta[1][1] + arrayMomenta[2][1],
arrayMomenta[0][2] + arrayMomenta[1][2] + arrayMomenta[2][2],
xMomenta,
yMomenta,
zMomenta,
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
svIndices.push_back(sv3prongTableMCD.lastIndex());
} else if ((doprocessMCD2Prongs || doprocessMCD2ProngsExternalMagneticField) && numProngs == TwoProngCount) {
sv2prongTableMCD(analysisJet.globalIndex(),
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
arrayMomenta[0][0] + arrayMomenta[1][0],
arrayMomenta[0][1] + arrayMomenta[1][1],
arrayMomenta[0][2] + arrayMomenta[1][2],
xMomenta,
yMomenta,
zMomenta,
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
svIndices.push_back(sv2prongTableMCD.lastIndex());
} else if (doprocessMCDNProngs || doprocessMCDNProngsExternalMagneticField) {
svnprongTableMCD(analysisJet.globalIndex(),
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
xMomenta,
yMomenta,
zMomenta,
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
svIndices.push_back(svnprongTableMCD.lastIndex());
} else {
LOG(error) << "No process specified\n";
}
Expand Down Expand Up @@ -357,6 +398,40 @@ struct SecondaryVertexReconstruction {
}
PROCESS_SWITCH(SecondaryVertexReconstruction, processData2ProngsExternalMagneticField, "Reconstruct the data 2-prong secondary vertex with extrernal magnetic field", false);

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*/)
{
for (const auto& jet : jets) {
std::vector<int> svIndices;
if (nProng == ThreeProngCount) {
runCreatorNProng<ThreeProngCount, false>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df3);
svnprongIndicesTableData(svIndices);
} else if (nProng == TwoProngCount) {
runCreatorNProng<TwoProngCount, false>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df2);
svnprongIndicesTableData(svIndices);
} else {
LOG(error) << "set number of prong\n";
}
}
}
PROCESS_SWITCH(SecondaryVertexReconstruction, processDataNProngs, "Reconstruct the data mult-prong secondary vertex", false);

void processDataNProngsExternalMagneticField(JetCollisionwPIs::iterator const& collision, aod::Collisions const& /*realColl*/, soa::Join<aod::ChargedJets, aod::ChargedJetConstituents> const& jets, JetTracksData const& tracks, OriginalTracks const& /*tracks*/)
{
for (const auto& jet : jets) {
std::vector<int> svIndices;
if (nProng == ThreeProngCount) {
runCreatorNProng<ThreeProngCount, true>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df3);
svnprongIndicesTableData(svIndices);
} else if (nProng == TwoProngCount) {
runCreatorNProng<TwoProngCount, true>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df2);
svnprongIndicesTableData(svIndices);
} else {
LOG(error) << "set number of prong\n";
}
}
}
PROCESS_SWITCH(SecondaryVertexReconstruction, processDataNProngsExternalMagneticField, "Reconstruct the data mult-prong secondary vertex with extrernal magnetic field", false);

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*/)
{
for (const auto& jet : mcdjets) {
Expand Down Expand Up @@ -396,6 +471,40 @@ struct SecondaryVertexReconstruction {
}
}
PROCESS_SWITCH(SecondaryVertexReconstruction, processMCD2ProngsExternalMagneticField, "Reconstruct the MCD 2-prong secondary vertex with external magnetic field", false);

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*/)
{
for (const auto& jet : mcdjets) {
std::vector<int> svIndices;
if (nProng == ThreeProngCount) {
runCreatorNProng<ThreeProngCount, false>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df3);
svnprongIndicesTableMCD(svIndices);
} else if (nProng == TwoProngCount) {
runCreatorNProng<TwoProngCount, false>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df2);
svnprongIndicesTableMCD(svIndices);
} else {
LOG(error) << "set number of prong\n";
}
}
}
PROCESS_SWITCH(SecondaryVertexReconstruction, processMCDNProngs, "Reconstruct the MCD n-prong secondary vertex", false);

void processMCDNProngsExternalMagneticField(JetCollisionwPIs::iterator const& collision, aod::Collisions const& /*realColl*/, soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const& mcdjets, JetTracksMCDwPIs const& tracks, OriginalTracks const& /*tracks*/)
{
for (const auto& jet : mcdjets) {
std::vector<int> svIndices;
if (nProng == ThreeProngCount) {
runCreatorNProng<ThreeProngCount, true>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df3);
svnprongIndicesTableMCD(svIndices);
} else if (nProng == TwoProngCount) {
runCreatorNProng<TwoProngCount, true>(collision.template collision_as<aod::Collisions>(), jet, tracks, svIndices, df2);
svnprongIndicesTableMCD(svIndices);
} else {
LOG(error) << "set number of prong\n";
}
}
}
PROCESS_SWITCH(SecondaryVertexReconstruction, processMCDNProngsExternalMagneticField, "Reconstruct the MCD n-prong secondary vertex with external magnetic field", false);
};

WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
Expand Down
Loading
Loading