From 519d1ca17fef4549102eb7eaf375c8eadd00ebd3 Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Tue, 13 May 2025 11:21:36 +0200 Subject: [PATCH 01/12] obvious changes to implement full sim jet tagging --- addons/ONNXRuntime/python/jetFlavourHelper.py | 67 +++++++++++++------ .../FCCAnalyses/JetConstituentsUtils.h | 2 + .../dataframe/src/JetConstituentsUtils.cc | 47 +++++++++++-- 3 files changed, 88 insertions(+), 28 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index a8027832352..dfc64103d6b 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -5,7 +5,14 @@ ROOT.gROOT.SetBatch(True) class JetFlavourHelper: - def __init__(self, coll, jet, jetc, tag=""): + def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): + ''' + sim_type: fast or full + ''' + # check if sim_type is valid + if sim_type not in ["fast", "full"]: + print("ERROR: sim_type must be either 'fast' or 'full'") + sys.exit() self.jet = jet self.const = jetc @@ -13,6 +20,7 @@ def __init__(self, coll, jet, jetc, tag=""): self.tag = tag if tag != "": self.tag = "_{}".format(tag) + self.sim_type = sim_type self.particle = coll["GenParticles"] self.pfcand = coll["PFParticles"] @@ -22,9 +30,15 @@ def __init__(self, coll, jet, jetc, tag=""): self.trackstate = coll["TrackState"] self.trackerhits = coll["TrackerHits"] self.calohits = coll["CalorimeterHits"] - self.dndx = coll["dNdx"] + if sim_type == "fast": + self.dndx = coll["dNdx"] + elif sim_type == "full": + self.dndx = None self.l = coll["PathLength"] - self.bz = coll["Bz"] + if sim_type == "fast": + self.bz = coll["Bz"] + elif sim_type == "full": + self.bz = "2.0" # CLD #FIXME: this should be read from the geometry self.definition = dict() @@ -69,20 +83,29 @@ def __init__(self, coll, jet, jetc, tag=""): self.definition["pfcand_phirel{}".format(self.tag)] = "JetConstituentsUtils::get_phirel_cluster({}, {})".format( jet, self.const ) - - self.definition[ - "pfcand_dndx{}".format(self.tag) - ] = "JetConstituentsUtils::get_dndx({}, {}, {}, pfcand_isChargedHad{})".format( - self.const, self.dndx, self.pftrack, self.tag - ) - - self.definition[ - "pfcand_mtof{}".format(self.tag) - ] = "JetConstituentsUtils::get_mtof({}, {}, {}, {}, {}, {}, {}, pv{})".format( - self.const, self.l, self.pftrack, self.trackerhits, self.pfphoton, self.pfnh, self.calohits, self.tag - ) - - self.definition["Bz{}".format(self.tag)] = "{}[0]".format(self.bz) + if self.sim_type == "fast": + self.definition["Bz{}".format(self.tag)] = "{}[0]".format(self.bz) + self.definition[ + "pfcand_dndx{}".format(self.tag) + ] = "JetConstituentsUtils::get_dndx({}, {}, {}, pfcand_isChargedHad{})".format( + self.const, self.dndx, self.pftrack, self.tag + ) + + self.definition[ + "pfcand_mtof{}".format(self.tag) + ] = "JetConstituentsUtils::get_mtof({}, {}, {}, {}, {}, {}, {}, pv{})".format( + self.const, self.l, self.pftrack, self.trackerhits, self.pfphoton, self.pfnh, self.calohits, self.tag + ) + elif self.sim_type == "full": + self.definition["Bz{}".format(self.tag)] = self.bz + # fill the dNdx and mtof variables with 0 + self.definition[ + "pfcand_dndx{}".format(self.tag) + ] = "JetConstituentsUtils::get_dndx_dummy({})".format(self.const) + + self.definition[ + "pfcand_mtof{}".format(self.tag) + ] = "JetConstituentsUtils::get_mtof_dummy({})".format(self.const) self.definition[ "pfcand_dxy{}".format(self.tag) @@ -176,7 +199,7 @@ def __init__(self, coll, jet, jetc, tag=""): self.definition[ "pfcand_btagSip2dSig{}".format(self.tag) - ] = "JetConstituentsUtils::get_Sip2dSig(pfcand_btagSip2dVal{}, pfcand_dxydxy{})".format(self.tag, self.tag) + ] = "JetConstituentsUtils::get_Sip2dSig(pfcand_btagSip2dVal{}, pfcand_dxydxy{}, {})".format(self.tag, self.tag, self.sim_type) self.definition[ "pfcand_btagSip3dVal{}".format(self.tag) @@ -186,8 +209,8 @@ def __init__(self, coll, jet, jetc, tag=""): self.definition[ "pfcand_btagSip3dSig{}".format(self.tag) - ] = "JetConstituentsUtils::get_Sip3dSig(pfcand_btagSip3dVal{}, pfcand_dxydxy{}, pfcand_dzdz{})".format( - self.tag, self.tag, self.tag + ] = "JetConstituentsUtils::get_Sip3dSig(pfcand_btagSip3dVal{}, pfcand_dxydxy{}, pfcand_dzdz{}, {})".format( + self.tag, self.tag, self.tag, self.sim_type ) self.definition[ @@ -198,8 +221,8 @@ def __init__(self, coll, jet, jetc, tag=""): self.definition[ "pfcand_btagJetDistSig{}".format(self.tag) - ] = "JetConstituentsUtils::get_JetDistSig(pfcand_btagJetDistVal{}, pfcand_dxydxy{}, pfcand_dzdz{})".format( - self.tag, self.tag, self.tag + ] = "JetConstituentsUtils::get_JetDistSig(pfcand_btagJetDistVal{}, pfcand_dxydxy{}, pfcand_dzdz{}, {})".format( + self.tag, self.tag, self.tag, self.sim_type ) self.definition["jet_nmu{}".format(self.tag)] = "JetConstituentsUtils::count_type(pfcand_isMu{})".format( diff --git a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h index 3d039f56a6d..a45d9be8808 100644 --- a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h +++ b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h @@ -145,6 +145,7 @@ namespace FCCAnalyses { const rv::RVec& dNdx, const rv::RVec& trackdata, const rv::RVec JetsConstituents_isChargedHad); + rv::RVec get_dndx_dummy(const rv::RVec &jcs); // for full sim rv::RVec get_Sip2dVal(const rv::RVec& jets, const rv::RVec& jcs, @@ -211,6 +212,7 @@ namespace FCCAnalyses { const rv::RVec& calohits, const TLorentzVector& V // primary vertex ); + rv::RVec get_mtof_dummy(const rv::RVec &jcs); // for full sim rv::RVec get_PIDs(const ROOT::VecOps::RVec< int > recin, diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index 37537e3ff49..6a1238c1113 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -393,6 +393,38 @@ namespace FCCAnalyses return out; } + // dummy dndx function for full sim + rv::RVec get_dndx_dummy(const rv::RVec &jcs) { + rv::RVec out; + for (int i = 0; i < jcs.size(); ++i) + { + FCCAnalysesJetConstituents ct = jcs.at(i); + FCCAnalysesJetConstituentsData tmp; + for (int j = 0; j < ct.size(); ++j) + { + tmp.push_back(0.); + } + out.push_back(tmp); + } + return out; + } + + // dummy mtof function for full sim + rv::RVec get_mtof_dummy(const rv::RVec &jcs) { + rv::RVec out; + for (int i = 0; i < jcs.size(); ++i) + { + FCCAnalysesJetConstituents ct = jcs.at(i); + FCCAnalysesJetConstituentsData tmp; + for (int j = 0; j < ct.size(); ++j) + { + tmp.push_back(0.); + } + out.push_back(tmp); + } + return out; + } + rv::RVec get_Sip2dVal(const rv::RVec &jets, const rv::RVec &jcs, const ROOT::VecOps::RVec &tracks) @@ -482,7 +514,8 @@ namespace FCCAnalyses /// The functions get_Sip2dSig and get_Sip2dVal can be made independent; /// I passed to the former the result of the latter, avoiding the recomputation rv::RVec get_Sip2dSig(const rv::RVec &Sip2dVals, - const rv::RVec &err2_D0) + const rv::RVec &err2_D0, + const std::string& sim_type) { rv::RVec out; for (int i = 0; i < Sip2dVals.size(); ++i) @@ -496,7 +529,7 @@ namespace FCCAnalyses } else { - s.push_back(-9); + s.push_back(sim_type == "fast" ? -9 : -200); // dummy value in full sim is -200 because -9 in fast sim is still inside the distribution } } out.push_back(s); @@ -595,7 +628,8 @@ namespace FCCAnalyses rv::RVec get_Sip3dSig(const rv::RVec &Sip3dVals, const rv::RVec &err2_D0, - const rv::RVec &err2_Z0) + const rv::RVec &err2_Z0, + const std::string& sim_type) { rv::RVec out; for (int i = 0; i < Sip3dVals.size(); ++i) @@ -609,7 +643,7 @@ namespace FCCAnalyses } else { - s.push_back(-9); + s.push_back(sim_type == "fast" ? -9 : -200); // dummy value in full sim is -200 because -9 in fast sim is still inside the distribution } } out.push_back(s); @@ -719,7 +753,8 @@ namespace FCCAnalyses rv::RVec get_JetDistSig(const rv::RVec &JetDistVal, const rv::RVec &err2_D0, - const rv::RVec &err2_Z0) + const rv::RVec &err2_Z0, + const std::string& sim_type) { rv::RVec out; for (int i = 0; i < JetDistVal.size(); ++i) @@ -735,7 +770,7 @@ namespace FCCAnalyses } else { - tmp.push_back(-9.); + tmp.push_back(sim_type == "fast" ? -9 : -200); // dummy value in full sim is -200 because -9 in fast sim is still inside the distribution } } out.push_back(tmp); From c936bcdc45231007fc56085510af82554307c5b4 Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Thu, 15 May 2025 09:20:02 +0200 Subject: [PATCH 02/12] trying out differences in fast vs full in track and trackstate --- addons/ONNXRuntime/python/jetFlavourHelper.py | 10 +++++----- .../dataframe/FCCAnalyses/JetConstituentsUtils.h | 3 +++ analyzers/dataframe/src/JetConstituentsUtils.cc | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index dfc64103d6b..0dff79f4fc4 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -27,19 +27,19 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.pftrack = coll["PFTracks"] self.pfphoton = coll["PFPhotons"] self.pfnh = coll["PFNeutralHadrons"] + # if sim_type == "fast": self.trackstate = coll["TrackState"] + # elif sim_type == "full": + # self.trackstate = "JetConstituentsUtils::get_trackstate({})".format(self.pfcand) self.trackerhits = coll["TrackerHits"] self.calohits = coll["CalorimeterHits"] - if sim_type == "fast": - self.dndx = coll["dNdx"] - elif sim_type == "full": - self.dndx = None self.l = coll["PathLength"] if sim_type == "fast": + self.dndx = coll["dNdx"] self.bz = coll["Bz"] elif sim_type == "full": self.bz = "2.0" # CLD #FIXME: this should be read from the geometry - + self.dndx = None self.definition = dict() # ===== VERTEX diff --git a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h index a45d9be8808..44da53eabd7 100644 --- a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h +++ b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h @@ -57,6 +57,9 @@ namespace FCCAnalyses { rv::RVec get_type(const rv::RVec&); rv::RVec get_charge(const rv::RVec&); + // retrieve collections from full sim + // ROOT::VecOps::RVec get_trackstate(const rv::RVec &particles); + //displacement rv::RVec get_d0(const rv::RVec&, const ROOT::VecOps::RVec&); diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index 6a1238c1113..f1c8313549c 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -194,6 +194,20 @@ namespace FCCAnalyses return out; } + // // get trackstate collection from full sim + // ROOT::VecOps::RVec get_trackstate(const rv::RVec &particles) + // { + // ROOT::VecOps::RVec tracks; + // for (const auto &particle : particles) + // { + // if (particle.getTracks().size() > 0) + // { + // tracks.push_back(particle.getTracks()[0].getTrackStates()); + // } + // } + // return tracks; + // } + // displacement (wrt (0,0,0)) rv::RVec get_d0(const rv::RVec &jcs, const ROOT::VecOps::RVec &tracks) From f609c373b6db64bf4e9ea3ee836877193d6980ce Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Thu, 15 May 2025 16:39:23 +0200 Subject: [PATCH 03/12] debug & add one example (XPtoPar_dxy) on how to use Tracks and TrackStates --- addons/ONNXRuntime/python/jetFlavourHelper.py | 13 +++++++------ .../dataframe/FCCAnalyses/JetConstituentsUtils.h | 10 +++++++--- .../FCCAnalyses/ReconstructedParticle2Track.h | 3 ++- analyzers/dataframe/src/JetConstituentsUtils.cc | 15 +++++++++++++-- .../dataframe/src/ReconstructedParticle2Track.cc | 16 +++++++++++----- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index 0dff79f4fc4..3553d22c41d 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -28,7 +28,8 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.pfphoton = coll["PFPhotons"] self.pfnh = coll["PFNeutralHadrons"] # if sim_type == "fast": - self.trackstate = coll["TrackState"] + self.trackstate = coll["TrackStates"] + self.tracks = coll["Tracks"] # elif sim_type == "full": # self.trackstate = "JetConstituentsUtils::get_trackstate({})".format(self.pfcand) self.trackerhits = coll["TrackerHits"] @@ -109,8 +110,8 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.definition[ "pfcand_dxy{}".format(self.tag) - ] = "JetConstituentsUtils::XPtoPar_dxy({}, {}, pv{}, Bz{})".format( - self.const, self.trackstate, self.tag, self.tag + ] = "JetConstituentsUtils::XPtoPar_dxy({}, {}, {}, pv{}, Bz{})".format( + self.const, self.trackstate, self.tracks, self.tag, self.tag ) self.definition["pfcand_dz{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_dz({}, {}, pv{}, Bz{})".format( @@ -199,7 +200,7 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.definition[ "pfcand_btagSip2dSig{}".format(self.tag) - ] = "JetConstituentsUtils::get_Sip2dSig(pfcand_btagSip2dVal{}, pfcand_dxydxy{}, {})".format(self.tag, self.tag, self.sim_type) + ] = 'JetConstituentsUtils::get_Sip2dSig(pfcand_btagSip2dVal{}, pfcand_dxydxy{}, "{}")'.format(self.tag, self.tag, self.sim_type) self.definition[ "pfcand_btagSip3dVal{}".format(self.tag) @@ -209,7 +210,7 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.definition[ "pfcand_btagSip3dSig{}".format(self.tag) - ] = "JetConstituentsUtils::get_Sip3dSig(pfcand_btagSip3dVal{}, pfcand_dxydxy{}, pfcand_dzdz{}, {})".format( + ] = 'JetConstituentsUtils::get_Sip3dSig(pfcand_btagSip3dVal{}, pfcand_dxydxy{}, pfcand_dzdz{}, "{}")'.format( self.tag, self.tag, self.tag, self.sim_type ) @@ -221,7 +222,7 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.definition[ "pfcand_btagJetDistSig{}".format(self.tag) - ] = "JetConstituentsUtils::get_JetDistSig(pfcand_btagJetDistVal{}, pfcand_dxydxy{}, pfcand_dzdz{}, {})".format( + ] = 'JetConstituentsUtils::get_JetDistSig(pfcand_btagJetDistVal{}, pfcand_dxydxy{}, pfcand_dzdz{}, "{}")'.format( self.tag, self.tag, self.tag, self.sim_type ) diff --git a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h index 44da53eabd7..98bde0b3ee2 100644 --- a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h +++ b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h @@ -79,6 +79,7 @@ namespace FCCAnalyses { rv::RVec XPtoPar_dxy(const rv::RVec&, const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, const TLorentzVector& V, // primary vertex const float&); rv::RVec XPtoPar_dz(const rv::RVec&, @@ -166,7 +167,8 @@ namespace FCCAnalyses { rv::RVec get_Sip2dSig(const rv::RVec& Sip2dVals, - const rv::RVec& err2_D0); + const rv::RVec& err2_D0, + const std::string& sim_type); rv::RVec get_Sip3dVal(const rv::RVec& jets, const rv::RVec& jcs, @@ -185,7 +187,8 @@ namespace FCCAnalyses { rv::RVec get_Sip3dSig(const rv::RVec& Sip3dVals, const rv::RVec& err2_D0, - const rv::RVec& err2_Z0); + const rv::RVec& err2_Z0, + const std::string& sim_type); rv::RVec get_JetDistVal(const rv::RVec& jets, const rv::RVec& jcs, @@ -204,7 +207,8 @@ namespace FCCAnalyses { rv::RVec get_JetDistSig(const rv::RVec& JetDistVal, const rv::RVec& err2_D0, - const rv::RVec& err2_Z0); + const rv::RVec& err2_Z0, + const std::string& sim_type); rv::RVec get_mtof(const rv::RVec& jcs, const rv::RVec& track_L, diff --git a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h index d090e77ec3f..6f6c886a96f 100644 --- a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h +++ b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h @@ -45,7 +45,8 @@ namespace ReconstructedParticle2Track{ const ROOT::VecOps::RVec& tracks); //here only computed for the first charged particle encountered ROOT::VecOps::RVec XPtoPar_dxy(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, const TLorentzVector& V, // primary vertex const float& Bz); diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index f1c8313549c..295af2e3ad3 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -120,6 +120,16 @@ namespace FCCAnalyses return out; }; + auto cast_constituent_5 = [](const auto &jcs, const auto &coll1, const auto &coll2, const auto &coll3, const auto &coll4, auto &&meth) + { + rv::RVec out; + for (const auto &jc : jcs) + { + out.emplace_back(meth(jc, coll1, coll2, coll3, coll4)); + } + return out; + }; + rv::RVec get_Bz(const rv::RVec &jcs, const ROOT::VecOps::RVec &tracks) { @@ -240,12 +250,13 @@ namespace FCCAnalyses } rv::RVec XPtoPar_dxy(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + const ROOT::VecOps::RVec& tracks, const TLorentzVector &V, // primary vertex posotion and time in mm const float &Bz) { - return cast_constituent_4(jcs, tracks, V, Bz, ReconstructedParticle2Track::XPtoPar_dxy); + return cast_constituent_5(jcs, trackstates, tracks, V, Bz, ReconstructedParticle2Track::XPtoPar_dxy); } rv::RVec XPtoPar_dz(const rv::RVec &jcs, diff --git a/analyzers/dataframe/src/ReconstructedParticle2Track.cc b/analyzers/dataframe/src/ReconstructedParticle2Track.cc index f8aa59e8901..b90ad12442e 100644 --- a/analyzers/dataframe/src/ReconstructedParticle2Track.cc +++ b/analyzers/dataframe/src/ReconstructedParticle2Track.cc @@ -61,8 +61,10 @@ namespace ReconstructedParticle2Track{ return Bz; } + ROOT::VecOps::RVec XPtoPar_dxy(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, const TLorentzVector& V, // primary vertex const float& Bz) { @@ -72,11 +74,13 @@ namespace ReconstructedParticle2Track{ for (const auto & rp: in) { - if( rp.tracks_begin < tracks.size()) { + auto track = tracks.at(rp.tracks_begin); - float D0_wrt0 = tracks.at(rp.tracks_begin).D0; - float Z0_wrt0 = tracks.at(rp.tracks_begin).Z0; - float phi0_wrt0 = tracks.at(rp.tracks_begin).phi; + if(track.tracks_begin - track.tracks_end >0) { // if any tracks + + float D0_wrt0 = trackstates.at(track.trackStates_begin).D0; + float Z0_wrt0 = trackstates.at(track.trackStates_begin).Z0; + float phi0_wrt0 = trackstates.at(track.trackStates_begin).phi; TVector3 X( - D0_wrt0 * TMath::Sin(phi0_wrt0) , D0_wrt0 * TMath::Cos(phi0_wrt0) , Z0_wrt0); TVector3 x = X - V.Vect(); @@ -103,6 +107,8 @@ namespace ReconstructedParticle2Track{ return out; } + + ROOT::VecOps::RVec XPtoPar_dz(const ROOT::VecOps::RVec& in, From da04761cf78f9ad0f7f96845ca6689448396c334 Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Fri, 16 May 2025 10:27:26 +0200 Subject: [PATCH 04/12] implement cov matrix retrieval --- addons/ONNXRuntime/python/jetFlavourHelper.py | 79 ++++---- .../FCCAnalyses/JetConstituentsUtils.h | 115 +++++++---- .../FCCAnalyses/ReconstructedParticle2Track.h | 70 +------ .../dataframe/src/JetConstituentsUtils.cc | 90 ++++++--- .../src/ReconstructedParticle2Track.cc | 185 ++---------------- 5 files changed, 201 insertions(+), 338 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index 3553d22c41d..77d4c091d78 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -5,6 +5,9 @@ ROOT.gROOT.SetBatch(True) class JetFlavourHelper: + ''' + NOTE: (May 2025) Once the full sim tagger is retrained on the new naming convention (see https://github.com/key4hep/k4MLJetTagger?tab=readme-ov-file#open-problems--further-work), the names defined here must be altered. Then, they will also nicely match the namings in ReconstructedParticle2Track. + ''' def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): ''' sim_type: fast or full @@ -114,6 +117,8 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.const, self.trackstate, self.tracks, self.tag, self.tag ) + # fix track state problem in the following functions: + self.definition["pfcand_dz{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_dz({}, {}, pv{}, Bz{})".format( self.const, self.trackstate, self.tag, self.tag ) @@ -132,66 +137,70 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.const, self.trackstate, self.tag ) - self.definition["pfcand_dptdpt{}".format(self.tag)] = "JetConstituentsUtils::get_omega_cov({}, {})".format( - self.const, self.trackstate + # covariance matrix + + self.definition["pfcand_dptdpt{}".format(self.tag)] = "JetConstituentsUtils::get_omega_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition["pfcand_dxydxy{}".format(self.tag)] = "JetConstituentsUtils::get_d0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_dxydxy{}".format(self.tag)] = "JetConstituentsUtils::get_d0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition["pfcand_dzdz{}".format(self.tag)] = "JetConstituentsUtils::get_z0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_dzdz{}".format(self.tag)] = "JetConstituentsUtils::get_z0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition["pfcand_dphidphi{}".format(self.tag)] = "JetConstituentsUtils::get_phi0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_dphidphi{}".format(self.tag)] = "JetConstituentsUtils::get_phi0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition[ - "pfcand_detadeta{}".format(self.tag) - ] = "JetConstituentsUtils::get_tanlambda_cov({}, {})".format(self.const, self.trackstate) + self.definition["pfcand_detadeta{}".format(self.tag)] = "JetConstituentsUtils::get_tanlambda_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate + ) - self.definition["pfcand_dxydz{}".format(self.tag)] = "JetConstituentsUtils::get_d0_z0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_dxydz{}".format(self.tag)] = "JetConstituentsUtils::get_d0_z0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition["pfcand_dphidxy{}".format(self.tag)] = "JetConstituentsUtils::get_phi0_d0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_dphidxy{}".format(self.tag)] = "JetConstituentsUtils::get_phi0_d0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition["pfcand_phidz{}".format(self.tag)] = "JetConstituentsUtils::get_phi0_z0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_phidz{}".format(self.tag)] = "JetConstituentsUtils::get_phi0_z0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition[ - "pfcand_phictgtheta{}".format(self.tag) - ] = "JetConstituentsUtils::get_tanlambda_phi0_cov({}, {})".format(self.const, self.trackstate) + self.definition["pfcand_phictgtheta{}".format(self.tag)] = "JetConstituentsUtils::get_tanlambda_phi0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate + ) - self.definition[ - "pfcand_dxyctgtheta{}".format(self.tag) - ] = "JetConstituentsUtils::get_tanlambda_d0_cov({}, {})".format(self.const, self.trackstate) + self.definition["pfcand_dxyctgtheta{}".format(self.tag)] = "JetConstituentsUtils::get_tanlambda_d0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate + ) - self.definition[ - "pfcand_dlambdadz{}".format(self.tag) - ] = "JetConstituentsUtils::get_tanlambda_z0_cov({}, {})".format(self.const, self.trackstate) + self.definition["pfcand_dlambdadz{}".format(self.tag)] = "JetConstituentsUtils::get_tanlambda_z0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate + ) - self.definition[ - "pfcand_cctgtheta{}".format(self.tag) - ] = "JetConstituentsUtils::get_omega_tanlambda_cov({}, {})".format(self.const, self.trackstate) + self.definition["pfcand_cctgtheta{}".format(self.tag)] = "JetConstituentsUtils::get_omega_tanlambda_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate + ) - self.definition["pfcand_phic{}".format(self.tag)] = "JetConstituentsUtils::get_omega_phi0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_phic{}".format(self.tag)] = "JetConstituentsUtils::get_omega_phi0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition["pfcand_dxyc{}".format(self.tag)] = "JetConstituentsUtils::get_omega_d0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_dxyc{}".format(self.tag)] = "JetConstituentsUtils::get_omega_d0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) - self.definition["pfcand_cdz{}".format(self.tag)] = "JetConstituentsUtils::get_omega_z0_cov({}, {})".format( - self.const, self.trackstate + self.definition["pfcand_cdz{}".format(self.tag)] = "JetConstituentsUtils::get_omega_z0_cov({}, {}, {})".format( + self.const, self.tracks, self.trackstate ) + # impact parameters + self.definition[ "pfcand_btagSip2dVal{}".format(self.tag) ] = "JetConstituentsUtils::get_Sip2dVal_clusterV({}, pfcand_dxy{}, pfcand_phi0{}, Bz{})".format( diff --git a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h index 98bde0b3ee2..9257807436c 100644 --- a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h +++ b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h @@ -97,52 +97,83 @@ namespace FCCAnalyses { const ROOT::VecOps::RVec&, const float&); + //covariance matrix - //diagonal + //diagonal - 0: d0d0, 2: phiphi, 5: omegaomega, 9: z0z0, 14: tanLambdatanLambda rv::RVec get_omega_cov(const rv::RVec&, - const ROOT::VecOps::RVec&); + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 5); rv::RVec get_d0_cov(const rv::RVec&, - const ROOT::VecOps::RVec& ); - - rv::RVec get_z0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_phi0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_tanlambda_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - //off-diag - rv::RVec get_d0_z0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_phi0_d0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_phi0_z0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_tanlambda_phi0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_tanlambda_d0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_tanlambda_z0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_omega_tanlambda_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_omega_phi0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_omega_d0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); - - rv::RVec get_omega_z0_cov(const rv::RVec& jcs, - const ROOT::VecOps::RVec& tracks); + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 0); + + rv::RVec get_z0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 9); + + rv::RVec get_phi0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 2); + + rv::RVec get_tanlambda_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 14); + //off-diag - 1: phid0, 3: d0omega, 4: phiomega, 6: d0z0, 7: phiz0, 8: omegaz0, 10: d0tanLambda, 11: phitanLambda, 12: omegatanLambda, 13: tanLambdaz0 + rv::RVec get_d0_z0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 6); + + rv::RVec get_phi0_d0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 1); + + rv::RVec get_phi0_z0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 7); + + rv::RVec get_tanlambda_phi0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 11); + + rv::RVec get_tanlambda_d0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 10); + + rv::RVec get_tanlambda_z0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 13); + + rv::RVec get_omega_tanlambda_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 12); + + rv::RVec get_omega_phi0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 4); + + rv::RVec get_omega_d0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 3); + + rv::RVec get_omega_z0_cov(const rv::RVec&, + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + int cov_index = 8); rv::RVec get_dndx(const rv::RVec& jcs, diff --git a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h index 6f6c886a96f..5ed09632eed 100644 --- a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h +++ b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h @@ -96,66 +96,16 @@ namespace ReconstructedParticle2Track{ ROOT::VecOps::RVec getRP2TRK_Z0_sig (ROOT::VecOps::RVec in, ROOT::VecOps::RVec tracks); - - /// Return the variance (not the sigma) of the the D0 of a track to a reconstructed particle - ROOT::VecOps::RVec getRP2TRK_D0_cov (ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the variance (not the sigma) of the the Z0 of a track to a reconstructed particle - ROOT::VecOps::RVec getRP2TRK_Z0_cov (ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the variance (not the sigma) of the the Phi of a track to a reconstructed particle - ROOT::VecOps::RVec getRP2TRK_phi_cov (ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the variance (not the sigma) of the omega of a track to a reconstructed particle - ROOT::VecOps::RVec getRP2TRK_omega_cov (ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the variance (not the sigma) of the tanLambda of a track to a reconstructed particle - ROOT::VecOps::RVec getRP2TRK_tanLambda_cov (ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the off-diag term (d0, phi0) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_d0_phi0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the off-diag term (d0, omega) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_d0_omega_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the off-diag term (d0,z0) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_d0_z0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the off-diag term (d0,tanlambda) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_d0_tanlambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the off-diag term (phi0,omega) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_phi0_omega_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the off-diag term (phi0,z0) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_phi0_z0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); - - /// Return the off-diag term (phi0,tanlambda) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_phi0_tanlambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) ; - - /// Return the off-diag term (omega,z0) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_omega_z0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) ; - - /// Return the off-diag term (omega,tanlambda) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_omega_tanlambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) ; - - /// Return the off-diag term (z0,tanlambda) of the covariance matrix - ROOT::VecOps::RVec getRP2TRK_z0_tanlambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks); + /* + Return the covariance matrix of a track to a reconstructed particle + @param cov_index: the index of the covariance matrix element: + - Diagonal elements are: 0: d0d0, 2: phiphi, 5: omegaomega, 9: z0z0, 14: tanLambdatanLambda + - Off-diagonal elements are: 1: phid0, 3: d0omega, 4: phiomega, 6: d0z0, 7: phiz0, 8: omegaz0, 10: d0tanLambda, 11: phitanLambda, 12: omegatanLambda, 13: tanLambdaz0 + */ + ROOT::VecOps::RVec get_cov(ROOT::VecOps::RVec in, + ROOT::VecOps::RVec tracks, + ROOT::VecOps::RVec trackstates, + int cov_index); /// Return the tracks associated to reco'ed particles diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index 295af2e3ad3..3558cd95cc9 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -296,93 +296,123 @@ namespace FCCAnalyses // Covariance matrix elements of tracks parameters // diagonal rv::RVec get_omega_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_omega_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_d0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_D0_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_z0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_Z0_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_phi0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_phi_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_tanlambda_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_tanLambda_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } // off-diagonal rv::RVec get_d0_z0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_d0_z0_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_phi0_d0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_d0_phi0_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_phi0_z0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_phi0_z0_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_tanlambda_phi0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_phi0_tanlambda_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_tanlambda_d0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_d0_tanlambda_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_tanlambda_z0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_z0_tanlambda_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_omega_tanlambda_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_omega_tanlambda_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_omega_phi0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_phi0_omega_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_omega_d0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_d0_omega_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } rv::RVec get_omega_z0_cov(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks) + const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + int cov_index) { - return cast_constituent_2(jcs, tracks, ReconstructedParticle2Track::getRP2TRK_omega_z0_cov); + return cast_constituent_4(jcs, tracks, trackstates, cov_index, ReconstructedParticle2Track::get_cov); } // neutrals are set to 0; muons and electrons are also set to 0; diff --git a/analyzers/dataframe/src/ReconstructedParticle2Track.cc b/analyzers/dataframe/src/ReconstructedParticle2Track.cc index b90ad12442e..bd46fa9823b 100644 --- a/analyzers/dataframe/src/ReconstructedParticle2Track.cc +++ b/analyzers/dataframe/src/ReconstructedParticle2Track.cc @@ -260,14 +260,23 @@ getRP2TRK_D0(ROOT::VecOps::RVec in, return result; } + +// cov_index accesses the different elements of the covariance matrix. +// diagonal elements are: 0: d0d0, 2: phiphi, 5: omegaomega, 9: z0z0, 14: tanLambdatanLambda +// off-diagonal elements are: 1: phid0, 3: d0omega, 4: phiomega, 6: d0z0, 7: phiz0, 8: omegaz0, 10: d0tanLambda, 11: phitanLambda, 12: omegatanLambda, 13: tanLambdaz0 ROOT::VecOps::RVec -getRP2TRK_D0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { +get_cov(ROOT::VecOps::RVec in, + ROOT::VecOps::RVec tracks, + ROOT::VecOps::RVec trackstates, + int cov_index) { ROOT::VecOps::RVec result; for (auto & p: in) { - if (p.tracks_begin 0) { // if any tracks + auto track = tracks.at(p.tracks_begin); + result.push_back(trackstates.at(track.trackStates_begin).covMatrix[cov_index]); + } else { + result.push_back(-9.); + } } return result; } @@ -296,18 +305,6 @@ getRP2TRK_Z0(ROOT::VecOps::RVec in, return result; } -ROOT::VecOps::RVec -getRP2TRK_Z0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin getRP2TRK_Z0_sig(ROOT::VecOps::RVec in, ROOT::VecOps::RVec tracks) { @@ -332,18 +329,6 @@ getRP2TRK_phi(ROOT::VecOps::RVec in, return result; } -ROOT::VecOps::RVec -getRP2TRK_phi_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin getRP2TRK_omega(ROOT::VecOps::RVec in, @@ -357,17 +342,6 @@ getRP2TRK_omega(ROOT::VecOps::RVec in, return result; } -ROOT::VecOps::RVec -getRP2TRK_omega_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin getRP2TRK_tanLambda(ROOT::VecOps::RVec in, @@ -381,137 +355,6 @@ getRP2TRK_tanLambda(ROOT::VecOps::RVec in, return result; } -ROOT::VecOps::RVec -getRP2TRK_tanLambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_d0_phi0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_d0_omega_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_d0_z0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_d0_tanlambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_phi0_omega_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_phi0_z0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_phi0_tanlambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_omega_z0_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_omega_tanlambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin -getRP2TRK_z0_tanlambda_cov(ROOT::VecOps::RVec in, - ROOT::VecOps::RVec tracks) { - ROOT::VecOps::RVec result; - for (auto & p: in) { - if (p.tracks_begin getRP2TRK( ROOT::VecOps::RVec in, From ff42df45fa9b7cc445c68f7b7f95dac5569cd505 Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Fri, 16 May 2025 10:36:37 +0200 Subject: [PATCH 05/12] Implement z0 --- addons/ONNXRuntime/python/jetFlavourHelper.py | 14 ++++++-------- .../dataframe/FCCAnalyses/JetConstituentsUtils.h | 7 ++++--- .../FCCAnalyses/ReconstructedParticle2Track.h | 7 ++++--- analyzers/dataframe/src/JetConstituentsUtils.cc | 5 +++-- .../dataframe/src/ReconstructedParticle2Track.cc | 16 ++++++++-------- 5 files changed, 25 insertions(+), 24 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index 77d4c091d78..3da8548f200 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -111,21 +111,17 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): "pfcand_mtof{}".format(self.tag) ] = "JetConstituentsUtils::get_mtof_dummy({})".format(self.const) - self.definition[ - "pfcand_dxy{}".format(self.tag) - ] = "JetConstituentsUtils::XPtoPar_dxy({}, {}, {}, pv{}, Bz{})".format( + self.definition["pfcand_dxy{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_dxy({}, {}, {}, pv{}, Bz{})".format( self.const, self.trackstate, self.tracks, self.tag, self.tag ) # fix track state problem in the following functions: self.definition["pfcand_dz{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_dz({}, {}, pv{}, Bz{})".format( - self.const, self.trackstate, self.tag, self.tag + self.const, self.trackstate, self.tracks, self.tag, self.tag ) - self.definition[ - "pfcand_phi0{}".format(self.tag) - ] = "JetConstituentsUtils::XPtoPar_phi({}, {}, pv{}, Bz{})".format( + self.definition["pfcand_phi0{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_phi({}, {}, pv{}, Bz{})".format( self.const, self.trackstate, self.tag, self.tag ) @@ -137,7 +133,7 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.const, self.trackstate, self.tag ) - # covariance matrix + # covariance matrix (fixed track state problem) self.definition["pfcand_dptdpt{}".format(self.tag)] = "JetConstituentsUtils::get_omega_cov({}, {}, {})".format( self.const, self.tracks, self.trackstate @@ -235,6 +231,8 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.tag, self.tag, self.tag, self.sim_type ) + # count number of particles in the jet + self.definition["jet_nmu{}".format(self.tag)] = "JetConstituentsUtils::count_type(pfcand_isMu{})".format( self.tag ) diff --git a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h index 9257807436c..87e12aef801 100644 --- a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h +++ b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h @@ -83,9 +83,10 @@ namespace FCCAnalyses { const TLorentzVector& V, // primary vertex const float&); rv::RVec XPtoPar_dz(const rv::RVec&, - const ROOT::VecOps::RVec&, - const TLorentzVector& V, // primary vertex - const float&); + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + const TLorentzVector& V, // primary vertex + const float&); rv::RVec XPtoPar_phi(const rv::RVec&, const ROOT::VecOps::RVec&, const TLorentzVector& V, // primary vertex diff --git a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h index 5ed09632eed..e6e10122856 100644 --- a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h +++ b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h @@ -51,9 +51,10 @@ namespace ReconstructedParticle2Track{ const float& Bz); ROOT::VecOps::RVec XPtoPar_dz(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, - const TLorentzVector& V, // primary vertex - const float& Bz); + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, + const TLorentzVector& V, // primary vertex + const float& Bz); ROOT::VecOps::RVec XPtoPar_phi(const ROOT::VecOps::RVec& in, const ROOT::VecOps::RVec& tracks, diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index 3558cd95cc9..7ee6ae293ef 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -260,12 +260,13 @@ namespace FCCAnalyses } rv::RVec XPtoPar_dz(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + const ROOT::VecOps::RVec& tracks, const TLorentzVector &V, // primary vertex posotion and time in mm const float &Bz) { - return cast_constituent_4(jcs, tracks, V, Bz, ReconstructedParticle2Track::XPtoPar_dz); + return cast_constituent_5(jcs, trackstates, tracks, V, Bz, ReconstructedParticle2Track::XPtoPar_dz); } rv::RVec XPtoPar_phi(const rv::RVec &jcs, diff --git a/analyzers/dataframe/src/ReconstructedParticle2Track.cc b/analyzers/dataframe/src/ReconstructedParticle2Track.cc index bd46fa9823b..cddb8008bbd 100644 --- a/analyzers/dataframe/src/ReconstructedParticle2Track.cc +++ b/analyzers/dataframe/src/ReconstructedParticle2Track.cc @@ -107,12 +107,10 @@ namespace ReconstructedParticle2Track{ return out; } - - - ROOT::VecOps::RVec XPtoPar_dz(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, const TLorentzVector& V, // primary vertex const float& Bz) { @@ -122,11 +120,13 @@ namespace ReconstructedParticle2Track{ for (const auto & rp: in) { - if( rp.tracks_begin < tracks.size()) { + auto track = tracks.at(rp.tracks_begin); - float D0_wrt0 = tracks.at(rp.tracks_begin).D0; - float Z0_wrt0 = tracks.at(rp.tracks_begin).Z0; - float phi0_wrt0 = tracks.at(rp.tracks_begin).phi; + if(track.tracks_begin - track.tracks_end >0) { // if any tracks + + float D0_wrt0 = trackstates.at(track.trackStates_begin).D0; + float Z0_wrt0 = trackstates.at(track.trackStates_begin).Z0; + float phi0_wrt0 = trackstates.at(track.trackStates_begin).phi; TVector3 X( - D0_wrt0 * TMath::Sin(phi0_wrt0) , D0_wrt0 * TMath::Cos(phi0_wrt0) , Z0_wrt0); TVector3 x = X - V.Vect(); From 0a78cf5d12d1e0f03ab5f6486208dec1d7afb63d Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Fri, 16 May 2025 10:41:03 +0200 Subject: [PATCH 06/12] Implement phi --- addons/ONNXRuntime/python/jetFlavourHelper.py | 2 +- .../FCCAnalyses/JetConstituentsUtils.h | 7 +++-- .../FCCAnalyses/ReconstructedParticle2Track.h | 7 +++-- .../dataframe/src/JetConstituentsUtils.cc | 5 ++-- .../src/ReconstructedParticle2Track.cc | 29 ++++++++++--------- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index 3da8548f200..a5df1b6d33f 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -122,7 +122,7 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): ) self.definition["pfcand_phi0{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_phi({}, {}, pv{}, Bz{})".format( - self.const, self.trackstate, self.tag, self.tag + self.const, self.trackstate, self.tracks,self.tag, self.tag ) self.definition["pfcand_C{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_C({}, {}, Bz{})".format( diff --git a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h index 87e12aef801..01bd6071437 100644 --- a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h +++ b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h @@ -88,9 +88,10 @@ namespace FCCAnalyses { const TLorentzVector& V, // primary vertex const float&); rv::RVec XPtoPar_phi(const rv::RVec&, - const ROOT::VecOps::RVec&, - const TLorentzVector& V, // primary vertex - const float&); + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + const TLorentzVector& V, // primary vertex + const float&); rv::RVec XPtoPar_C(const rv::RVec&, const ROOT::VecOps::RVec&, const float&); diff --git a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h index e6e10122856..b088ca64638 100644 --- a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h +++ b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h @@ -57,9 +57,10 @@ namespace ReconstructedParticle2Track{ const float& Bz); ROOT::VecOps::RVec XPtoPar_phi(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, - const TLorentzVector& V, // primary vertex - const float& Bz); + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, + const TLorentzVector& V, // primary vertex + const float& Bz); ROOT::VecOps::RVec XPtoPar_C(const ROOT::VecOps::RVec& in, const ROOT::VecOps::RVec& tracks, diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index 7ee6ae293ef..3b3ddc3b8c2 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -270,12 +270,13 @@ namespace FCCAnalyses } rv::RVec XPtoPar_phi(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + const ROOT::VecOps::RVec& tracks, const TLorentzVector &V, // primary vertex posotion and time in mm const float &Bz) { - return cast_constituent_4(jcs, tracks, V, Bz, ReconstructedParticle2Track::XPtoPar_phi); + return cast_constituent_5(jcs, trackstates, tracks, V, Bz, ReconstructedParticle2Track::XPtoPar_phi); } rv::RVec XPtoPar_C(const rv::RVec &jcs, diff --git a/analyzers/dataframe/src/ReconstructedParticle2Track.cc b/analyzers/dataframe/src/ReconstructedParticle2Track.cc index cddb8008bbd..3c5b251b6a0 100644 --- a/analyzers/dataframe/src/ReconstructedParticle2Track.cc +++ b/analyzers/dataframe/src/ReconstructedParticle2Track.cc @@ -160,9 +160,10 @@ namespace ReconstructedParticle2Track{ } ROOT::VecOps::RVec XPtoPar_phi(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, - const TLorentzVector& V, // primary vertex - const float& Bz) { + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, + const TLorentzVector& V, // primary vertex + const float& Bz) { const double cSpeed = 2.99792458e8 * 1.0e-9; //Reduced speed of light ??? @@ -170,11 +171,13 @@ namespace ReconstructedParticle2Track{ for (const auto & rp: in) { - if( rp.tracks_begin < tracks.size()) { + auto track = tracks.at(rp.tracks_begin); - float D0_wrt0 = tracks.at(rp.tracks_begin).D0; - float Z0_wrt0 = tracks.at(rp.tracks_begin).Z0; - float phi0_wrt0 = tracks.at(rp.tracks_begin).phi; + if(track.tracks_begin - track.tracks_end >0) { // if any tracks + + float D0_wrt0 = trackstates.at(track.trackStates_begin).D0; + float Z0_wrt0 = trackstates.at(track.trackStates_begin).Z0; + float phi0_wrt0 = trackstates.at(track.trackStates_begin).phi; TVector3 X( - D0_wrt0 * TMath::Sin(phi0_wrt0) , D0_wrt0 * TMath::Cos(phi0_wrt0) , Z0_wrt0); TVector3 x = X - V.Vect(); @@ -188,7 +191,7 @@ namespace ReconstructedParticle2Track{ double T = TMath::Sqrt(pt * pt - 2 * a * cross + a * a * r2); double phi0 = TMath::ATan2((p(1) - a * x(0)) / T, (p(0) + a * x(1)) / T); - out.push_back(phi0); + out.push_back(phi0); } else { out.push_back(-9.); @@ -211,10 +214,10 @@ namespace ReconstructedParticle2Track{ TVector3 p(rp.momentum.x, rp.momentum.y, rp.momentum.z); double a = std::copysign(1.0, rp.charge) * Bz * cSpeed; - double pt = p.Pt(); + double pt = p.Pt(); double C = a/(2 * pt); - out.push_back(C); + out.push_back(C); } else { out.push_back(-9.); } @@ -234,11 +237,9 @@ namespace ReconstructedParticle2Track{ if( rp.tracks_begin < tracks.size()) { TVector3 p(rp.momentum.x, rp.momentum.y, rp.momentum.z); - double pt = p.Pt(); - + double pt = p.Pt(); double ct = p(2) / pt; - - out.push_back(ct); + out.push_back(ct); } else { out.push_back(-9.); From 0c609c2309596bc8092dbb0ddfc204fbaac02bbf Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Fri, 16 May 2025 10:47:15 +0200 Subject: [PATCH 07/12] Implement C and ct --- addons/ONNXRuntime/python/jetFlavourHelper.py | 6 +++--- .../FCCAnalyses/JetConstituentsUtils.h | 10 ++++++---- .../FCCAnalyses/ReconstructedParticle2Track.h | 10 ++++++---- .../dataframe/src/JetConstituentsUtils.cc | 10 ++++++---- .../src/ReconstructedParticle2Track.cc | 18 ++++++++++++------ 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index a5df1b6d33f..56ce2240958 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -122,15 +122,15 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): ) self.definition["pfcand_phi0{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_phi({}, {}, pv{}, Bz{})".format( - self.const, self.trackstate, self.tracks,self.tag, self.tag + self.const, self.trackstate, self.tracks, self.tag, self.tag ) self.definition["pfcand_C{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_C({}, {}, Bz{})".format( - self.const, self.trackstate, self.tag + self.const, self.trackstate, self.tracks, self.tag ) self.definition["pfcand_ct{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_ct({}, {}, Bz{})".format( - self.const, self.trackstate, self.tag + self.const, self.trackstate, self.tracks, self.tag ) # covariance matrix (fixed track state problem) diff --git a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h index 01bd6071437..e486c4b8d13 100644 --- a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h +++ b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h @@ -93,11 +93,13 @@ namespace FCCAnalyses { const TLorentzVector& V, // primary vertex const float&); rv::RVec XPtoPar_C(const rv::RVec&, - const ROOT::VecOps::RVec&, - const float&); + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + const float&); rv::RVec XPtoPar_ct(const rv::RVec&, - const ROOT::VecOps::RVec&, - const float&); + const ROOT::VecOps::RVec&, + const ROOT::VecOps::RVec&, + const float&); //covariance matrix diff --git a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h index b088ca64638..104017280f9 100644 --- a/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h +++ b/analyzers/dataframe/FCCAnalyses/ReconstructedParticle2Track.h @@ -63,12 +63,14 @@ namespace ReconstructedParticle2Track{ const float& Bz); ROOT::VecOps::RVec XPtoPar_C(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, - const float& Bz); + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, + const float& Bz); ROOT::VecOps::RVec XPtoPar_ct(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, - const float& Bz); + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, + const float& Bz); /// Return the D0 of a track to a reconstructed particle ROOT::VecOps::RVec getRP2TRK_D0 (ROOT::VecOps::RVec in, diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index 3b3ddc3b8c2..cf9c6b6d90f 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -280,19 +280,21 @@ namespace FCCAnalyses } rv::RVec XPtoPar_C(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + const ROOT::VecOps::RVec& tracks, const float &Bz) { - return cast_constituent_3(jcs, tracks, Bz, ReconstructedParticle2Track::XPtoPar_C); + return cast_constituent_4(jcs, trackstates, tracks, Bz, ReconstructedParticle2Track::XPtoPar_C); } rv::RVec XPtoPar_ct(const rv::RVec &jcs, - const ROOT::VecOps::RVec &tracks, + const ROOT::VecOps::RVec &trackstates, + const ROOT::VecOps::RVec& tracks, const float &Bz) { - return cast_constituent_3(jcs, tracks, Bz, ReconstructedParticle2Track::XPtoPar_ct); + return cast_constituent_4(jcs, trackstates, tracks, Bz, ReconstructedParticle2Track::XPtoPar_ct); } // Covariance matrix elements of tracks parameters diff --git a/analyzers/dataframe/src/ReconstructedParticle2Track.cc b/analyzers/dataframe/src/ReconstructedParticle2Track.cc index 3c5b251b6a0..ddcb0ecce7a 100644 --- a/analyzers/dataframe/src/ReconstructedParticle2Track.cc +++ b/analyzers/dataframe/src/ReconstructedParticle2Track.cc @@ -201,15 +201,18 @@ namespace ReconstructedParticle2Track{ } ROOT::VecOps::RVec XPtoPar_C(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, - const float& Bz) { + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, + const float& Bz) { const double cSpeed = 2.99792458e8 * 1.0e3 * 1.0e-15; ROOT::VecOps::RVec out; for (const auto & rp: in) { - if( rp.tracks_begin < tracks.size()) { + auto track = tracks.at(rp.tracks_begin); + + if(track.tracks_begin - track.tracks_end >0) { // if any tracks TVector3 p(rp.momentum.x, rp.momentum.y, rp.momentum.z); @@ -226,15 +229,18 @@ namespace ReconstructedParticle2Track{ } ROOT::VecOps::RVec XPtoPar_ct(const ROOT::VecOps::RVec& in, - const ROOT::VecOps::RVec& tracks, - const float& Bz) { + const ROOT::VecOps::RVec& trackstates, + const ROOT::VecOps::RVec& tracks, + const float& Bz) { const double cSpeed = 2.99792458e8 * 1.0e-9; ROOT::VecOps::RVec out; for (const auto & rp: in) { - if( rp.tracks_begin < tracks.size()) { + auto track = tracks.at(rp.tracks_begin); + + if(track.tracks_begin - track.tracks_end >0) { // if any tracks TVector3 p(rp.momentum.x, rp.momentum.y, rp.momentum.z); double pt = p.Pt(); From 4a47beffadfe0dcb60416c2a3f627de6d5e1b70c Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Fri, 16 May 2025 11:53:03 +0200 Subject: [PATCH 08/12] Debug. cov values work. IP parameters don't --- addons/ONNXRuntime/python/jetFlavourHelper.py | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index 56ce2240958..86196da08ef 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -30,11 +30,10 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.pftrack = coll["PFTracks"] self.pfphoton = coll["PFPhotons"] self.pfnh = coll["PFNeutralHadrons"] - # if sim_type == "fast": + self.trackstate = coll["TrackStates"] self.tracks = coll["Tracks"] - # elif sim_type == "full": - # self.trackstate = "JetConstituentsUtils::get_trackstate({})".format(self.pfcand) + self.trackerhits = coll["TrackerHits"] self.calohits = coll["CalorimeterHits"] self.l = coll["PathLength"] @@ -115,21 +114,19 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.const, self.trackstate, self.tracks, self.tag, self.tag ) - # fix track state problem in the following functions: - - self.definition["pfcand_dz{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_dz({}, {}, pv{}, Bz{})".format( + self.definition["pfcand_dz{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_dz({}, {}, {}, pv{}, Bz{})".format( self.const, self.trackstate, self.tracks, self.tag, self.tag ) - self.definition["pfcand_phi0{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_phi({}, {}, pv{}, Bz{})".format( + self.definition["pfcand_phi0{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_phi({}, {}, {}, pv{}, Bz{})".format( self.const, self.trackstate, self.tracks, self.tag, self.tag ) - self.definition["pfcand_C{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_C({}, {}, Bz{})".format( + self.definition["pfcand_C{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_C({}, {}, {}, Bz{})".format( self.const, self.trackstate, self.tracks, self.tag ) - self.definition["pfcand_ct{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_ct({}, {}, Bz{})".format( + self.definition["pfcand_ct{}".format(self.tag)] = "JetConstituentsUtils::XPtoPar_ct({}, {}, {}, Bz{})".format( self.const, self.trackstate, self.tracks, self.tag ) @@ -281,12 +278,18 @@ def inference(self, jsonCfg, onnxCfg, df): initvars = tuple(initvars) # then funcs + print("INFO: JetFlavourHelper: input variables: {}".format(initvars)) + + # check if all variables are defined for varname in self.variables: matches = [obs for obs in self.definition.keys() if obs == varname] if len(matches) != 1: print("ERROR: {} variables was not defined.".format(varname)) sys.exit() + # check if variables are filled with values - HOW? + + self.get_weight_str = "JetFlavourUtils::get_weights(rdfslot_, " for var in self.variables: self.get_weight_str += "{},".format(var) From f73879f6164791087d71b5e0e275ddd5a029fa68 Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Fri, 16 May 2025 15:32:05 +0200 Subject: [PATCH 09/12] fix bugs in implementation --- .../src/ReconstructedParticle2Track.cc | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/analyzers/dataframe/src/ReconstructedParticle2Track.cc b/analyzers/dataframe/src/ReconstructedParticle2Track.cc index ddcb0ecce7a..82eb3331d09 100644 --- a/analyzers/dataframe/src/ReconstructedParticle2Track.cc +++ b/analyzers/dataframe/src/ReconstructedParticle2Track.cc @@ -73,10 +73,8 @@ namespace ReconstructedParticle2Track{ ROOT::VecOps::RVec out; for (const auto & rp: in) { - - auto track = tracks.at(rp.tracks_begin); - - if(track.tracks_begin - track.tracks_end >0) { // if any tracks + if(rp.tracks_begin - rp.tracks_end >0) { // if any tracks + auto track = tracks.at(rp.tracks_begin); float D0_wrt0 = trackstates.at(track.trackStates_begin).D0; float Z0_wrt0 = trackstates.at(track.trackStates_begin).Z0; @@ -101,7 +99,7 @@ namespace ReconstructedParticle2Track{ out.push_back(D); } else { - out.push_back(-9.); + out.push_back(-9.); } } return out; @@ -120,9 +118,8 @@ namespace ReconstructedParticle2Track{ for (const auto & rp: in) { - auto track = tracks.at(rp.tracks_begin); - - if(track.tracks_begin - track.tracks_end >0) { // if any tracks + if(rp.tracks_begin - rp.tracks_end >0) { // if any tracks + auto track = tracks.at(rp.tracks_begin); float D0_wrt0 = trackstates.at(track.trackStates_begin).D0; float Z0_wrt0 = trackstates.at(track.trackStates_begin).Z0; @@ -170,10 +167,8 @@ namespace ReconstructedParticle2Track{ ROOT::VecOps::RVec out; for (const auto & rp: in) { - - auto track = tracks.at(rp.tracks_begin); - - if(track.tracks_begin - track.tracks_end >0) { // if any tracks + if(rp.tracks_begin - rp.tracks_end >0) { // if any tracks + auto track = tracks.at(rp.tracks_begin); float D0_wrt0 = trackstates.at(track.trackStates_begin).D0; float Z0_wrt0 = trackstates.at(track.trackStates_begin).Z0; @@ -209,10 +204,8 @@ namespace ReconstructedParticle2Track{ ROOT::VecOps::RVec out; for (const auto & rp: in) { - - auto track = tracks.at(rp.tracks_begin); - - if(track.tracks_begin - track.tracks_end >0) { // if any tracks + if(rp.tracks_begin - rp.tracks_end >0) { // if any tracks + auto track = tracks.at(rp.tracks_begin); TVector3 p(rp.momentum.x, rp.momentum.y, rp.momentum.z); @@ -237,10 +230,8 @@ namespace ReconstructedParticle2Track{ ROOT::VecOps::RVec out; for (const auto & rp: in) { - - auto track = tracks.at(rp.tracks_begin); - - if(track.tracks_begin - track.tracks_end >0) { // if any tracks + if(rp.tracks_begin - rp.tracks_end >0) { // if any tracks + auto track = tracks.at(rp.tracks_begin); TVector3 p(rp.momentum.x, rp.momentum.y, rp.momentum.z); double pt = p.Pt(); From 8b2672e377398db62efd2eb80dca6ae449a9d5bb Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Fri, 16 May 2025 16:59:52 +0200 Subject: [PATCH 10/12] remove print out --- addons/ONNXRuntime/python/jetFlavourHelper.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index 86196da08ef..36f5c3a4b30 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -277,9 +277,6 @@ def inference(self, jsonCfg, onnxCfg, df): # convert to tuple initvars = tuple(initvars) - # then funcs - print("INFO: JetFlavourHelper: input variables: {}".format(initvars)) - # check if all variables are defined for varname in self.variables: matches = [obs for obs in self.definition.keys() if obs == varname] From 23bc5640ef5757736b511a088361dd72f2b72307 Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Tue, 3 Jun 2025 11:35:15 +0200 Subject: [PATCH 11/12] update PID flags retrieval --- addons/ONNXRuntime/python/jetFlavourHelper.py | 2 + .../dataframe/src/JetConstituentsUtils.cc | 56 ++++++++++++------- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index 36f5c3a4b30..bd1ce527599 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -45,6 +45,8 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): self.dndx = None self.definition = dict() + # CHANGE these lines here, PID & reco PV! + # ===== VERTEX # MC primary vertex self.definition["pv{}".format(self.tag)] = "FCCAnalyses::MCParticle::get_EventPrimaryVertexP4()( {} )".format( diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index cf9c6b6d90f..6a38bedb8e4 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -1183,21 +1183,22 @@ namespace FCCAnalyses rv::RVec out; for (int i = 0; i < jcs.size(); ++i) { - FCCAnalysesJetConstituentsData is_El; + FCCAnalysesJetConstituentsData is_Muon; FCCAnalysesJetConstituents ct = jcs.at(i); for (int j = 0; j < ct.size(); ++j) { - if (abs(ct.at(j).charge) > 0 and abs(ct.at(j).mass - 0.000510999) < 1.e-05) +#if edm4hep_VERSION > EDM4HEP_VERSION(0, 10, 5) + if (std::abs(ct.at(j).PDG) == 11) +#else + if (std::abs(ct.at(j).type) == 11) +#endif { - is_El.push_back(1.); + is_Muon.push_back(1.); } else - { - is_El.push_back(0.); - } + is_Muon.push_back(0.); } - - out.push_back(is_El); + out.push_back(is_Muon); } return out; } @@ -1207,21 +1208,22 @@ namespace FCCAnalyses rv::RVec out; for (int i = 0; i < jcs.size(); ++i) { - FCCAnalysesJetConstituentsData is_Mu; + FCCAnalysesJetConstituentsData is_Muon; FCCAnalysesJetConstituents ct = jcs.at(i); for (int j = 0; j < ct.size(); ++j) { - if (abs(ct.at(j).charge) > 0 and abs(ct.at(j).mass - 0.105658) < 1.e-03) +#if edm4hep_VERSION > EDM4HEP_VERSION(0, 10, 5) + if (std::abs(ct.at(j).PDG) == 13) +#else + if (std::abs(ct.at(j).type) == 13) +#endif { - is_Mu.push_back(1.); + is_Muon.push_back(1.); } else - { - is_Mu.push_back(0.); - } + is_Muon.push_back(0.); } - - out.push_back(is_Mu); + out.push_back(is_Muon); } return out; } @@ -1235,7 +1237,17 @@ namespace FCCAnalyses FCCAnalysesJetConstituents ct = jcs.at(i); for (int j = 0; j < ct.size(); ++j) { - if (abs(ct.at(j).charge) > 0 and abs(ct.at(j).mass - 0.13957) < 1.e-03) + int num_tracks = ct.at(j).tracks_end - ct.at(j).tracks_begin; + // check if num_tracks is valid (e.g. 0 or 1) + if (num_tracks < 0 || num_tracks > 1) + { + throw std::invalid_argument("Invalid number of tracks for constituent. Must be 0 or 1."); + } +#if edm4hep_VERSION > EDM4HEP_VERSION(0, 10, 5) + if (std::abs(ct.at(j).PDG) != 11 && std::abs(ct.at(j).PDG) != 13 && std::abs(ct.at(j).PDG) != 22 && num_tracks == 1) +#else + if (std::abs(ct.at(j).type) != 11 && std::abs(ct.at(j).type) != 13 && std::abs(ct.at(j).type) != 22 && num_tracks == 1) +#endif { is_ChargedHad.push_back(1.); } @@ -1259,10 +1271,16 @@ namespace FCCAnalyses FCCAnalysesJetConstituents ct = jcs.at(i); for (int j = 0; j < ct.size(); ++j) { + int num_tracks = ct.at(j).tracks_end - ct.at(j).tracks_begin; + // check if num_tracks is valid (e.g. 0 or 1) + if (num_tracks < 0 || num_tracks > 1) + { + throw std::invalid_argument("Invalid number of tracks for constituent. Must be 0 or 1."); + } #if edm4hep_VERSION > EDM4HEP_VERSION(0, 10, 5) - if (ct.at(j).PDG == 130) + if (std::abs(ct.at(j).PDG) != 11 && std::abs(ct.at(j).PDG) != 13 && std::abs(ct.at(j).PDG) != 22 && num_tracks == 0) #else - if (ct.at(j).type == 130) + if (std::abs(ct.at(j).type) != 11 && std::abs(ct.at(j).type) != 13 && std::abs(ct.at(j).type) != 22 && num_tracks == 0) #endif { is_NeutralHad.push_back(1.); From 6518e85b82ebd57d115e8b01c1eaed9ef5970cf3 Mon Sep 17 00:00:00 2001 From: Sara Aumiller Date: Tue, 3 Jun 2025 12:45:44 +0200 Subject: [PATCH 12/12] use reco PV instead of MC PV --- addons/ONNXRuntime/python/jetFlavourHelper.py | 10 ++++---- .../FCCAnalyses/JetConstituentsUtils.h | 4 ++++ .../dataframe/src/JetConstituentsUtils.cc | 24 +++++++++++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/addons/ONNXRuntime/python/jetFlavourHelper.py b/addons/ONNXRuntime/python/jetFlavourHelper.py index bd1ce527599..95dfdc3c09f 100644 --- a/addons/ONNXRuntime/python/jetFlavourHelper.py +++ b/addons/ONNXRuntime/python/jetFlavourHelper.py @@ -43,14 +43,12 @@ def __init__(self, coll, jet, jetc, tag="", sim_type="fast"): elif sim_type == "full": self.bz = "2.0" # CLD #FIXME: this should be read from the geometry self.dndx = None + self.primvertex = coll["PV"] self.definition = dict() - # CHANGE these lines here, PID & reco PV! - - # ===== VERTEX - # MC primary vertex - self.definition["pv{}".format(self.tag)] = "FCCAnalyses::MCParticle::get_EventPrimaryVertexP4()( {} )".format( - self.particle + # ===== VERTEX (reconstructed) + self.definition["pv{}".format(self.tag)] = "JetConstituentsUtils::get_primary_vertex({})".format( + self.primvertex ) # build jet constituents lists diff --git a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h index e486c4b8d13..5feb4da9c6a 100644 --- a/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h +++ b/analyzers/dataframe/FCCAnalyses/JetConstituentsUtils.h @@ -3,6 +3,7 @@ #include "ROOT/RVec.hxx" #include "edm4hep/ReconstructedParticle.h" +#include "edm4hep/VertexCollection.h" #include "edm4hep/MCParticle.h" #include "edm4hep/Quantity.h" #if __has_include("edm4hep/TrackerHit3DData.h") @@ -60,6 +61,9 @@ namespace FCCAnalyses { // retrieve collections from full sim // ROOT::VecOps::RVec get_trackstate(const rv::RVec &particles); + // Primary vertex + TLorentzVector get_primary_vertex(ROOT::VecOps::RVec& prim_vertex); + //displacement rv::RVec get_d0(const rv::RVec&, const ROOT::VecOps::RVec&); diff --git a/analyzers/dataframe/src/JetConstituentsUtils.cc b/analyzers/dataframe/src/JetConstituentsUtils.cc index 6a38bedb8e4..c60632cb9e6 100644 --- a/analyzers/dataframe/src/JetConstituentsUtils.cc +++ b/analyzers/dataframe/src/JetConstituentsUtils.cc @@ -218,6 +218,30 @@ namespace FCCAnalyses // return tracks; // } + // Primary vertex + + TLorentzVector get_primary_vertex(ROOT::VecOps::RVec& prim_vertex) + { + TLorentzVector pv_pos(0, 0, 0, 0); // Initialize primary vertex position + int i = 0; + for (const auto& pv : prim_vertex) + { + if (i > 0) // only one primary vertex is expected + { + throw std::invalid_argument("More than one primary vertex found in the event."); + } else + { + pv_pos.SetXYZT(pv.position.x, pv.position.y, pv.position.z, 0.0); // position of PV in mm + i++; + } + } + if (i == 0) + { + std::cout << "No primary vertex found in the event. Using (0,0,0, 0)" << std::endl; + } + return pv_pos; + } + // displacement (wrt (0,0,0)) rv::RVec get_d0(const rv::RVec &jcs, const ROOT::VecOps::RVec &tracks)