diff --git a/HLTrigger/Configuration/python/customizeHLTforCMSSW.py b/HLTrigger/Configuration/python/customizeHLTforCMSSW.py index b35dfef990fec..86a58c7de66d2 100644 --- a/HLTrigger/Configuration/python/customizeHLTforCMSSW.py +++ b/HLTrigger/Configuration/python/customizeHLTforCMSSW.py @@ -268,6 +268,53 @@ def customizeHLTfor44576(process): break return process +def customizeHLTfor45063(process): + """Assigns value of MuonHLTSeedMVAClassifier mva input file, scales and mean values according to the value of isFromL1""" + for prod in producers_by_type(process, 'MuonHLTSeedMVAClassifier'): + if hasattr(prod, "isFromL1"): + if (prod.isFromL1 == True): + if hasattr(prod, "mvaFileBL1"): + prod.mvaFileB = prod.mvaFileBL1 + if hasattr(prod, "mvaFileEL1"): + prod.mvaFileE = prod.mvaFileEL1 + if hasattr(prod, "mvaScaleMeanBL1"): + prod.mvaScaleMeanB = prod.mvaScaleMeanBL1 + if hasattr(prod, "mvaScaleStdBL1"): + prod.mvaScaleStdB = prod.mvaScaleStdBL1 + if hasattr(prod, "mvaScaleMeanEL1"): + prod.mvaScaleMeanE = prod.mvaScaleMeanEL1 + if hasattr(prod, "mvaScaleStdEL1"): + prod.mvaScaleStdE = prod.mvaScaleStdEL1 + else: + if hasattr(prod, "mvaFileBL2"): + prod.mvaFileB = prod.mvaFileBL2 + if hasattr(prod, "mvaFileEL2"): + prod.mvaFileE = prod.mvaFileEL2 + if hasattr(prod, "mvaScaleMeanBL2"): + prod.mvaScaleMeanB = prod.mvaScaleMeanBL2 + if hasattr(prod, "mvaScaleStdBL2"): + prod.mvaScaleStdB = prod.mvaScaleStdBL2 + if hasattr(prod, "mvaScaleMeanEL2"): + prod.mvaScaleMeanE = prod.mvaScaleMeanEL2 + if hasattr(prod, "mvaScaleStdEL2"): + prod.mvaScaleStdE = prod.mvaScaleStdEL2 + + for prod in producers_by_type(process, 'MuonHLTSeedMVAClassifier'): + delattr(prod,"mvaFileBL1") + delattr(prod,"mvaFileEL1") + delattr(prod,"mvaScaleMeanBL1") + delattr(prod,"mvaScaleStdBL1") + delattr(prod,"mvaScaleMeanEL1") + delattr(prod,"mvaScaleStdEL1") + delattr(prod,"mvaFileBL2") + delattr(prod,"mvaFileEL2") + delattr(prod,"mvaScaleMeanBL2") + delattr(prod,"mvaScaleStdBL2") + delattr(prod,"mvaScaleMeanEL2") + delattr(prod,"mvaScaleStdEL2") + + return process + # CMSSW version specific customizations def customizeHLTforCMSSW(process, menuType="GRun"): @@ -278,5 +325,6 @@ def customizeHLTforCMSSW(process, menuType="GRun"): process = checkHLTfor43774(process) process = customizeHLTfor44576(process) + process = customizeHLTfor45063(process) return process diff --git a/RecoMuon/TrackerSeedGenerator/interface/SeedMvaEstimator.h b/RecoMuon/TrackerSeedGenerator/interface/SeedMvaEstimator.h index dc547a4ccfdf3..003e56d6e29f2 100644 --- a/RecoMuon/TrackerSeedGenerator/interface/SeedMvaEstimator.h +++ b/RecoMuon/TrackerSeedGenerator/interface/SeedMvaEstimator.h @@ -20,6 +20,24 @@ namespace edm { class FileInPath; } +namespace { + enum inputIndexes { + kTsosErr0, // 0 + kTsosErr2, // 1 + kTsosErr5, // 2 + kTsosDxdz, // 3 + kTsosDydz, // 4 + kTsosQbp, // 5 + kDRdRL1SeedP, // 6 + kDPhidRL1SeedP, // 7 + kLastL1, // 8 + + kDRdRL2SeedP = 8, // 8 + kDPhidRL2SeedP, // 9 + kLastL2, // 10 + }; +} // namespace + class SeedMvaEstimator { public: SeedMvaEstimator(const edm::FileInPath& weightsfile, diff --git a/RecoMuon/TrackerSeedGenerator/plugins/MuonHLTSeedMVAClassifier.cc b/RecoMuon/TrackerSeedGenerator/plugins/MuonHLTSeedMVAClassifier.cc index df29f5fc58ce3..a7e28b3d52bf4 100644 --- a/RecoMuon/TrackerSeedGenerator/plugins/MuonHLTSeedMVAClassifier.cc +++ b/RecoMuon/TrackerSeedGenerator/plugins/MuonHLTSeedMVAClassifier.cc @@ -8,6 +8,7 @@ // system include files #include #include +#include // user include files #include "FWCore/Framework/interface/Frameworkfwd.h" @@ -23,6 +24,8 @@ #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "CommonTools/MVAUtils/interface/TMVAZipReader.h" + // TrajectorySeed #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h" #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h" @@ -44,6 +47,7 @@ class MuonHLTSeedMVAClassifier : public edm::stream::EDProducer<> { ~MuonHLTSeedMVAClassifier() override = default; static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + bool checkMVAFileConsistency(const std::string& weightsFileFullPath, bool isFromL1) const; private: void produce(edm::Event&, const edm::EventSetup&) override; @@ -87,33 +91,67 @@ class MuonHLTSeedMVAClassifier : public edm::stream::EDProducer<> { const reco::RecoChargedCandidateCollection& l2Muons); }; +bool MuonHLTSeedMVAClassifier::checkMVAFileConsistency(const std::string& weightsFileFullPath, + const bool isFromL1) const { + tinyxml2::XMLDocument xmlDoc; + if (reco::details::hasEnding(weightsFileFullPath, ".xml")) { + xmlDoc.LoadFile(weightsFileFullPath.c_str()); + } else { + edm::LogError("MuonHLTSeedMVAClassifier") << "unsupported file extension, it should be a .xml file!"; + return false; + } + tinyxml2::XMLElement* root = xmlDoc.FirstChildElement("MethodSetup"); + if (root == nullptr) { + edm::LogError("MuonHLTSeedMVAClassifier") << "could not retrieve the MethodSetup node from XML file!"; + return false; + } + + const auto& vars = root->FirstChildElement("Variables"); + size_t n = 0; + if (vars != nullptr) { + for (tinyxml2::XMLElement* e = vars->FirstChildElement("Variable"); e != nullptr; + e = e->NextSiblingElement("Variable")) { + ++n; + } + } else { + edm::LogError("MuonHLTSeedMVAClassifier") << "could not retrieve the Variables node from XML file!"; + return false; + } + + LogTrace("MuonHLTSeedMVAClassifier") << "MVA file:" << weightsFileFullPath.c_str() << " n Var:" << n; + bool condition = (isFromL1 && (n == inputIndexes::kLastL1)) || (!isFromL1 && (n == inputIndexes::kLastL2)); + return condition; +} + MuonHLTSeedMVAClassifier::MuonHLTSeedMVAClassifier(const edm::ParameterSet& iConfig) : seedToken_(consumes(iConfig.getParameter("src"))), l1MuonToken_(consumes(iConfig.getParameter("L1Muon"))), l2MuonToken_(consumes(iConfig.getParameter("L2Muon"))), trackerGeometryToken_(esConsumes()), - rejectAll_(iConfig.getParameter("rejectAll")), isFromL1_(iConfig.getParameter("isFromL1")), - - mvaFileB_(iConfig.getParameter(isFromL1_ ? "mvaFileBL1" : "mvaFileBL2")), - mvaFileE_(iConfig.getParameter(isFromL1_ ? "mvaFileEL1" : "mvaFileEL2")), - - mvaScaleMeanB_(iConfig.getParameter>(isFromL1_ ? "mvaScaleMeanBL1" : "mvaScaleMeanBL2")), - mvaScaleStdB_(iConfig.getParameter>(isFromL1_ ? "mvaScaleStdBL1" : "mvaScaleStdBL2")), - mvaScaleMeanE_(iConfig.getParameter>(isFromL1_ ? "mvaScaleMeanEL1" : "mvaScaleMeanEL2")), - mvaScaleStdE_(iConfig.getParameter>(isFromL1_ ? "mvaScaleStdEL1" : "mvaScaleStdEL2")), - + mvaFileB_(iConfig.getParameter("mvaFileB")), + mvaFileE_(iConfig.getParameter("mvaFileE")), + mvaScaleMeanB_(iConfig.getParameter>("mvaScaleMeanB")), + mvaScaleStdB_(iConfig.getParameter>("mvaScaleStdB")), + mvaScaleMeanE_(iConfig.getParameter>("mvaScaleMeanE")), + mvaScaleStdE_(iConfig.getParameter>("mvaScaleStdE")), doSort_(iConfig.getParameter("doSort")), nSeedsMaxB_(iConfig.getParameter("nSeedsMaxB")), nSeedsMaxE_(iConfig.getParameter("nSeedsMaxE")), - etaEdge_(iConfig.getParameter("etaEdge")), mvaCutB_(iConfig.getParameter("mvaCutB")), mvaCutE_(iConfig.getParameter("mvaCutE")), - minL1Qual_(iConfig.getParameter("minL1Qual")), baseScore_(iConfig.getParameter("baseScore")) { + const auto& mvaFileBPath = mvaFileB_.fullPath(); + const auto& mvaFileEPath = mvaFileE_.fullPath(); + + if (!checkMVAFileConsistency(mvaFileBPath, isFromL1_) || !checkMVAFileConsistency(mvaFileEPath, isFromL1_)) { + throw cms::Exception("ConfigurationError") << " MVA files appear to be not consistent with the value of isFromL1 " + "parameter.\n Please check your configuration."; + } + if (!rejectAll_) { mvaEstimator_ = std::make_pair( std::make_unique(mvaFileB_, mvaScaleMeanB_, mvaScaleStdB_, isFromL1_, minL1Qual_), @@ -247,22 +285,14 @@ void MuonHLTSeedMVAClassifier::fillDescriptions(edm::ConfigurationDescriptions& desc.add("rejectAll", false); desc.add("isFromL1", false); - desc.add("mvaFileBL1", + desc.add("mvaFileB", edm::FileInPath("RecoMuon/TrackerSeedGenerator/data/xgb_Run3_Iter2FromL1Seeds_barrel.xml")); - desc.add("mvaFileEL1", + desc.add("mvaFileE", edm::FileInPath("RecoMuon/TrackerSeedGenerator/data/xgb_Run3_Iter2FromL1Seeds_endcap.xml")); - desc.add("mvaFileBL2", - edm::FileInPath("RecoMuon/TrackerSeedGenerator/data/xgb_Run3_Iter2Seeds_barrel.xml")); - desc.add("mvaFileEL2", - edm::FileInPath("RecoMuon/TrackerSeedGenerator/data/xgb_Run3_Iter2Seeds_endcap.xml")); - desc.add>("mvaScaleMeanBL1", {0., 0., 0., 0., 0., 0., 0., 0.}); - desc.add>("mvaScaleStdBL1", {1., 1., 1., 1., 1., 1., 1., 1.}); - desc.add>("mvaScaleMeanEL1", {0., 0., 0., 0., 0., 0., 0., 0.}); - desc.add>("mvaScaleStdEL1", {1., 1., 1., 1., 1., 1., 1., 1.}); - desc.add>("mvaScaleMeanBL2", {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}); - desc.add>("mvaScaleStdBL2", {1., 1., 1., 1., 1., 1., 1., 1., 1., 1.}); - desc.add>("mvaScaleMeanEL2", {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}); - desc.add>("mvaScaleStdEL2", {1., 1., 1., 1., 1., 1., 1., 1., 1., 1.}); + desc.add>("mvaScaleMeanB", {0., 0., 0., 0., 0., 0., 0., 0.}); + desc.add>("mvaScaleStdB", {1., 1., 1., 1., 1., 1., 1., 1.}); + desc.add>("mvaScaleMeanE", {0., 0., 0., 0., 0., 0., 0., 0.}); + desc.add>("mvaScaleStdE", {1., 1., 1., 1., 1., 1., 1., 1.}); desc.add("doSort", false); desc.add("nSeedsMaxB", 1e6); diff --git a/RecoMuon/TrackerSeedGenerator/src/SeedMvaEstimator.cc b/RecoMuon/TrackerSeedGenerator/src/SeedMvaEstimator.cc index ca2b0581aabff..36adca295dc11 100644 --- a/RecoMuon/TrackerSeedGenerator/src/SeedMvaEstimator.cc +++ b/RecoMuon/TrackerSeedGenerator/src/SeedMvaEstimator.cc @@ -20,24 +20,6 @@ SeedMvaEstimator::SeedMvaEstimator(const edm::FileInPath& weightsfile, SeedMvaEstimator::~SeedMvaEstimator() {} -namespace { - enum inputIndexes { - kTsosErr0, // 0 - kTsosErr2, // 1 - kTsosErr5, // 2 - kTsosDxdz, // 3 - kTsosDydz, // 4 - kTsosQbp, // 5 - kDRdRL1SeedP, // 6 - kDPhidRL1SeedP, // 7 - kLastL1, // 8 - - kDRdRL2SeedP = 8, // 8 - kDPhidRL2SeedP, // 9 - kLastL2, // 10 - }; -} // namespace - void SeedMvaEstimator::getL1MuonVariables(const GlobalVector& global_p, const l1t::MuonBxCollection& l1Muons, float& dR2dRL1SeedP,