From 9bc8c848dea545ed9e77506e4078bf55b6b8233d Mon Sep 17 00:00:00 2001 From: LeonardoPalombini Date: Wed, 17 Sep 2025 18:02:37 +0200 Subject: [PATCH 1/2] LP: new track filters and BDT variables update --- source/Utils/include/FilterTracks.h | 3 ++ source/Utils/src/FilterTracks.cc | 53 ++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/source/Utils/include/FilterTracks.h b/source/Utils/include/FilterTracks.h index 5060a82..fe61cda 100644 --- a/source/Utils/include/FilterTracks.h +++ b/source/Utils/include/FilterTracks.h @@ -106,6 +106,9 @@ class FilterTracks : public marlin::Processor float _MaxSigPhi = 999; float _MaxSigQoverP = 999; + float _MaxD0 = 999.; + float _MaxZ0 = 999.; + //! NN parameters std::string _NNmethod = ""; // if defined apply the NN std::string _NNweights = ""; // xml file with weights diff --git a/source/Utils/src/FilterTracks.cc b/source/Utils/src/FilterTracks.cc index 9497cdf..3f3c1ea 100644 --- a/source/Utils/src/FilterTracks.cc +++ b/source/Utils/src/FilterTracks.cc @@ -140,6 +140,18 @@ FilterTracks::FilterTracks() _MaxSigQoverP ); + registerProcessorParameter("MaxPromptD0", + "Max d0", + _MaxD0, + _MaxD0 + ); + + registerProcessorParameter("MaxPromptZ0", + "Max z0", + _MaxZ0, + _MaxZ0 + ); + registerProcessorParameter("Bz", "Magnetic field in Tesla (default: 5)", _Bz, @@ -245,11 +257,14 @@ void FilterTracks::processEvent( LCEvent * evt ) {"trtnh", 0}, {"trch2", 0}, {"trndf", 0}, + {"trnoh", 0}, {"tr_sigd0",0}, {"tr_sigz0",0}, {"tr_sigtheta",0}, {"tr_sigphi",0}, - {"tr_sigqoverp",0} + {"tr_sigqoverp",0}, + {"tr_d0",0}, + {"tr_z0",0} }; if ( not _NNmethod.empty() ) { @@ -279,13 +294,16 @@ void FilterTracks::processEvent( LCEvent * evt ) vars["trch2"] = trk->getChi2(); vars["trndf"] = trk->getNdf(); - + vars["trnoh"] = (vars["trtnh"]-vars["trndf"]/2) / vars["trtnh"]; vars["tr_sigd0"] = sqrt(trk->getCovMatrix()[0]); vars["tr_sigz0"] = sqrt(trk->getCovMatrix()[2]); vars["tr_sigtheta"] = sqrt(trk->getCovMatrix()[9]); vars["tr_sigphi"] = sqrt(trk->getCovMatrix()[5]); vars["tr_sigqoverp"] = sqrt(trk->getCovMatrix()[14]); + vars["tr_d0"] = trk->getD0(); + vars["tr_z0"] = trk->getZ0(); + if(_BarrelOnly == true) { bool endcaphits = false; for(int j=0; jaddElement(new IMPL::TrackImpl(*itrk)); } } else { // track property cuts - if ( not _NNmethod.empty() ) { // NN cuts - auto prediction = reader->EvaluateMVA(_NNmethod); - if ( prediction > _NNthr ) { - auto itrk = dynamic_cast(trk); - OutputTrackCollection->addElement(new IMPL::TrackImpl(*itrk)); - } - } else { // user cuts - if (vars["trtnh"] > _NHitsTotal && + + if (!(vars["trtnh"] > _NHitsTotal && vars["trtvhn"] > _NHitsVertex && vars["trtihn"] > _NHitsInner && vars["trtohn"] > _NHitsOuter && @@ -319,18 +331,25 @@ void FilterTracks::processEvent( LCEvent * evt ) vars["trch2"] > _Chi2Spatial && vars["trndf"] > _MinNdf && vars["trtnh"]-vars["trndf"]/2 < _MaxOutl && - (vars["trtnh"]-vars["trndf"]/2) / vars["trtnh"] < _MaxOutlOverHits && + vars["trnoh"] < _MaxOutlOverHits && vars["trthn"] < _MaxHoles && vars["tr_sigd0"] < _MaxSigD0 && vars["tr_sigz0"] < _MaxSigZ0 && vars["tr_sigtheta"] < _MaxSigTheta && vars["tr_sigphi"] < _MaxSigPhi && - vars["tr_sigqoverp"] < _MaxSigQoverP) - { - auto itrk = dynamic_cast(trk); - OutputTrackCollection->addElement(new IMPL::TrackImpl(*itrk)); - } - } + vars["tr_sigqoverp"] < _MaxSigQoverP && + std::fabs(vars["tr_d0"]) < _MaxD0 && + std::fabs(vars["tr_z0"]) < _MaxZ0)) continue; + + if ( not _NNmethod.empty() ) { // NN cuts + + auto prediction = reader->EvaluateMVA(_NNmethod); + if ( prediction <= _NNthr ) continue; + } + + auto itrk = dynamic_cast(trk); + OutputTrackCollection->addElement(new IMPL::TrackImpl(*itrk)); + } } From 24015f233a47c79b97949e3ca1f05ce273e344dc Mon Sep 17 00:00:00 2001 From: LeonardoPalombini Date: Fri, 3 Oct 2025 14:57:28 +0200 Subject: [PATCH 2/2] LP: add reduced chi2 track filter --- source/Utils/include/FilterTracks.h | 1 + source/Utils/src/FilterTracks.cc | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/source/Utils/include/FilterTracks.h b/source/Utils/include/FilterTracks.h index fe61cda..50ef28e 100644 --- a/source/Utils/include/FilterTracks.h +++ b/source/Utils/include/FilterTracks.h @@ -89,6 +89,7 @@ class FilterTracks : public marlin::Processor //! Cut off for the value ndf int _MinNdf = 1; + float _MaxReducedChi2 = 1.e20; //! Cut off for outliers number int _MaxOutl = 10; diff --git a/source/Utils/src/FilterTracks.cc b/source/Utils/src/FilterTracks.cc index 3f3c1ea..c4ff1c4 100644 --- a/source/Utils/src/FilterTracks.cc +++ b/source/Utils/src/FilterTracks.cc @@ -140,6 +140,12 @@ FilterTracks::FilterTracks() _MaxSigQoverP ); + registerProcessorParameter("MaxReducedChi2", + "Max reduced Chi2", + _MaxReducedChi2, + _MaxReducedChi2 + ); + registerProcessorParameter("MaxPromptD0", "Max d0", _MaxD0, @@ -263,6 +269,7 @@ void FilterTracks::processEvent( LCEvent * evt ) {"tr_sigtheta",0}, {"tr_sigphi",0}, {"tr_sigqoverp",0}, + {"tr_redchi2",0}, {"tr_d0",0}, {"tr_z0",0} }; @@ -294,6 +301,7 @@ void FilterTracks::processEvent( LCEvent * evt ) vars["trch2"] = trk->getChi2(); vars["trndf"] = trk->getNdf(); + vars["tr_redchi2"] = vars["trch2"] / vars["trndf"]; vars["trnoh"] = (vars["trtnh"]-vars["trndf"]/2) / vars["trtnh"]; vars["tr_sigd0"] = sqrt(trk->getCovMatrix()[0]); vars["tr_sigz0"] = sqrt(trk->getCovMatrix()[2]); @@ -330,6 +338,7 @@ void FilterTracks::processEvent( LCEvent * evt ) theta < _MaxTheta && vars["trch2"] > _Chi2Spatial && vars["trndf"] > _MinNdf && + vars["tr_redchi2"] < _MaxReducedChi2 && vars["trtnh"]-vars["trndf"]/2 < _MaxOutl && vars["trnoh"] < _MaxOutlOverHits && vars["trthn"] < _MaxHoles &&