diff --git a/Configuration/PyReleaseValidation/python/relval_2017.py b/Configuration/PyReleaseValidation/python/relval_2017.py index 065b101eadc3e..51c1b99becfad 100644 --- a/Configuration/PyReleaseValidation/python/relval_2017.py +++ b/Configuration/PyReleaseValidation/python/relval_2017.py @@ -31,7 +31,7 @@ # 2021 (DD4HEP: TTbar, ZMM) # (ele guns 10, 35, 1000; pho guns 10, 35; mu guns 1, 10, 100, 1000, QCD 3TeV, QCD Flat) # (ZMM, TTbar, ZEE, MinBias, TTbar PU, TTbar PU premix, ZEE PU, TTbar design) -# (TTbar trackingOnly, pixelTrackingOnly, trackingMkFit) +# (TTbar trackingOnly, pixelTrackingOnly, trackingMkFit, trackdnn) # (Patatrack pixel-only: ZMM - on CPU) # (Patatrack pixel-only: TTbar - on CPU) # (Patatrack ECAL-only: TTbar - on CPU) @@ -58,7 +58,7 @@ 11624.911, 11642.911, 11601.0,11602.0,11603.0,11604.0,11605.0,11606.0,11607.0,11608.0,11609.0,11630.0,11643.0, 11650.0,11634.0,11646.0,11640.0,11834.0,11834.99,11846.0,12024.0, - 11634.1,11634.5,11634.7, + 11634.1,11634.5,11634.7,11634.91, 11650.501, 11634.501, 11634.511, @@ -67,7 +67,7 @@ 11834.13, 11723.17, 12434.0,12634.0,12634.99, - 12834.0,13034.0,13034.99] + 12834.0,13034.0,13034.99,] for numWF in numWFIB: if not numWF in _upgrade_workflows: continue workflows[numWF] = _upgrade_workflows[numWF] diff --git a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py index 6f1183db3d5d0..a773e827b7577 100644 --- a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py +++ b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py @@ -356,6 +356,26 @@ def condition(self, fragment, stepList, key, hasHarvest): offset = 0.9, ) + +# Track DNN workflows +class UpgradeWorkflow_trackdnn(UpgradeWorkflow): + def setup_(self, step, stepName, stepDict, k, properties): + stepDict[stepName][k] = merge([{'--procModifiers': 'trackdnn'}, stepDict[step][k]]) + + def condition(self, fragment, stepList, key, hasHarvest): + return fragment=="TTbar_14TeV" and '2021' in key +upgradeWFs['trackdnn'] = UpgradeWorkflow_trackdnn( + steps = [ + 'Reco', + ], + PU = [ + 'Reco', + ], + suffix = '_trackdnn', + offset = 0.91, +) + + # MLPF workflows class UpgradeWorkflow_mlpf(UpgradeWorkflow): def setup_(self, step, stepName, stepDict, k, properties): diff --git a/RecoTracker/FinalTrackSelectors/BuildFile.xml b/RecoTracker/FinalTrackSelectors/BuildFile.xml index 09e00807dbbcf..c3b79de3f91c6 100644 --- a/RecoTracker/FinalTrackSelectors/BuildFile.xml +++ b/RecoTracker/FinalTrackSelectors/BuildFile.xml @@ -7,6 +7,8 @@ + + diff --git a/RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h b/RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h new file mode 100644 index 0000000000000..5adaee9352d72 --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h @@ -0,0 +1,20 @@ +#ifndef RecoTracker_FinalTrackSelectors_TfGraphDefWrapper_h +#define RecoTracker_FinalTrackSelectors_TfGraphDefWrapper_h + +#include "PhysicsTools/TensorFlow/interface/TensorFlow.h" + +class TfGraphDefWrapper { +public: + TfGraphDefWrapper(tensorflow::Session*); + ~TfGraphDefWrapper() { tensorflow::closeSession(session_); }; + TfGraphDefWrapper(const TfGraphDefWrapper&) = delete; + TfGraphDefWrapper& operator=(const TfGraphDefWrapper&) = delete; + TfGraphDefWrapper(TfGraphDefWrapper&&) = delete; + TfGraphDefWrapper& operator=(TfGraphDefWrapper&&) = delete; + const tensorflow::Session* getSession() const; + +private: + tensorflow::Session* session_; +}; + +#endif diff --git a/RecoTracker/FinalTrackSelectors/plugins/TfGraphDefProducer.cc b/RecoTracker/FinalTrackSelectors/plugins/TfGraphDefProducer.cc new file mode 100644 index 0000000000000..8dd2dc3ee5be8 --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/plugins/TfGraphDefProducer.cc @@ -0,0 +1,63 @@ +// -*- C++ -*- +// +// Package: RecoTracker/FinalTrackSelectors +// Class: TFGraphDefProducer +// +/**\class TFGraphDefProducer + Description: Produces TfGraphRecord into the event containing a tensorflow GraphDef object that can be used for running inference on a pretrained network +*/ +// +// Original Author: Joona Havukainen +// Created: Fri, 24 Jul 2020 08:04:00 GMT +// +// + +// system include files +#include + +// user include files +#include "FWCore/Framework/interface/ModuleFactory.h" +#include "FWCore/Framework/interface/ESProducer.h" + +#include "FWCore/Framework/interface/ESHandle.h" +#include "TrackingTools/Records/interface/TfGraphRecord.h" +#include "RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h" + +// class declaration + +class TfGraphDefProducer : public edm::ESProducer { +public: + TfGraphDefProducer(const edm::ParameterSet&); + using ReturnType = std::unique_ptr; + + ReturnType produce(const TfGraphRecord&); + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + const std::string filename_; + // ----------member data --------------------------- +}; + +TfGraphDefProducer::TfGraphDefProducer(const edm::ParameterSet& iConfig) + : filename_(iConfig.getParameter("FileName").fullPath()) { + auto componentName = iConfig.getParameter("ComponentName"); + setWhatProduced(this, componentName); +} + +// ------------ method called to produce the data ------------ +std::unique_ptr TfGraphDefProducer::produce(const TfGraphRecord& iRecord) { + return std::make_unique(tensorflow::createSession(tensorflow::loadGraphDef(filename_), 1)); +} + +void TfGraphDefProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("ComponentName", "tfGraphDef"); + desc.add("FileName"); + descriptions.add("tfGraphDefProducer", desc); +} + +//define this as a plug-in +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_EVENTSETUP_MODULE(TfGraphDefProducer); diff --git a/RecoTracker/FinalTrackSelectors/plugins/TrackTfClassifier.cc b/RecoTracker/FinalTrackSelectors/plugins/TrackTfClassifier.cc new file mode 100644 index 0000000000000..9052194f5b606 --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackTfClassifier.cc @@ -0,0 +1,107 @@ +#include "RecoTracker/FinalTrackSelectors/interface/TrackMVAClassifier.h" + +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/global/EDProducer.h" +#include "DataFormats/TrackReco/interface/Track.h" +#include "DataFormats/VertexReco/interface/Vertex.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" +#include "getBestVertex.h" + +#include "TrackingTools/Records/interface/TfGraphRecord.h" +#include "PhysicsTools/TensorFlow/interface/TensorFlow.h" +#include "RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h" + +namespace { + class TfDnn { + public: + TfDnn(const edm::ParameterSet& cfg) + : tfDnnLabel_(cfg.getParameter("tfDnnLabel")), + session_(nullptr) + + {} + + static const char* name() { return "TrackTfClassifier"; } + + static void fillDescriptions(edm::ParameterSetDescription& desc) { + desc.add("tfDnnLabel", "trackSelectionTf"); + } + + void beginStream() {} + + void initEvent(const edm::EventSetup& es) { + if (session_ == nullptr) { + edm::ESHandle tfDnnHandle; + es.get().get(tfDnnLabel_, tfDnnHandle); + session_ = tfDnnHandle.product()->getSession(); + } + } + + float operator()(reco::Track const& trk, + reco::BeamSpot const& beamSpot, + reco::VertexCollection const& vertices) const { + const auto& bestVertex = getBestVertex(trk, vertices); + + tensorflow::Tensor input1(tensorflow::DT_FLOAT, {1, 29}); + tensorflow::Tensor input2(tensorflow::DT_FLOAT, {1, 1}); + + input1.matrix()(0, 0) = trk.pt(); + input1.matrix()(0, 1) = trk.innerMomentum().x(); + input1.matrix()(0, 2) = trk.innerMomentum().y(); + input1.matrix()(0, 3) = trk.innerMomentum().z(); + input1.matrix()(0, 4) = trk.innerMomentum().rho(); + input1.matrix()(0, 5) = trk.outerMomentum().x(); + input1.matrix()(0, 6) = trk.outerMomentum().y(); + input1.matrix()(0, 7) = trk.outerMomentum().z(); + input1.matrix()(0, 8) = trk.outerMomentum().rho(); + input1.matrix()(0, 9) = trk.ptError(); + input1.matrix()(0, 10) = trk.dxy(bestVertex); + input1.matrix()(0, 11) = trk.dz(bestVertex); + input1.matrix()(0, 12) = trk.dxy(beamSpot.position()); + input1.matrix()(0, 13) = trk.dz(beamSpot.position()); + input1.matrix()(0, 14) = trk.dxyError(); + input1.matrix()(0, 15) = trk.dzError(); + input1.matrix()(0, 16) = trk.normalizedChi2(); + input1.matrix()(0, 17) = trk.eta(); + input1.matrix()(0, 18) = trk.phi(); + input1.matrix()(0, 19) = trk.etaError(); + input1.matrix()(0, 20) = trk.phiError(); + input1.matrix()(0, 21) = trk.hitPattern().numberOfValidPixelHits(); + input1.matrix()(0, 22) = trk.hitPattern().numberOfValidStripHits(); + input1.matrix()(0, 23) = trk.ndof(); + input1.matrix()(0, 24) = trk.hitPattern().numberOfLostTrackerHits(reco::HitPattern::MISSING_INNER_HITS); + input1.matrix()(0, 25) = trk.hitPattern().numberOfLostTrackerHits(reco::HitPattern::MISSING_OUTER_HITS); + input1.matrix()(0, 26) = + trk.hitPattern().trackerLayersTotallyOffOrBad(reco::HitPattern::MISSING_INNER_HITS); + input1.matrix()(0, 27) = + trk.hitPattern().trackerLayersTotallyOffOrBad(reco::HitPattern::MISSING_OUTER_HITS); + input1.matrix()(0, 28) = trk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); + + //Original algo as its own input, it will enter the graph so that it gets one-hot encoded, as is the preferred + //format for categorical inputs, where the labels do not have any metric amongst them + input2.matrix()(0, 0) = trk.originalAlgo(); + + //The names for the input tensors get locked when freezing the trained tensorflow model. The NamedTensors must + //match those names + tensorflow::NamedTensorList inputs; + inputs.resize(2); + inputs[0] = tensorflow::NamedTensor("x", input1); + inputs[1] = tensorflow::NamedTensor("y", input2); + std::vector outputs; + + //evaluate the input + tensorflow::run(const_cast(session_), inputs, {"Identity"}, &outputs); + //scale output to be [-1, 1] due to convention + float output = 2.0 * outputs[0].matrix()(0, 0) - 1.0; + return output; + } + + const std::string tfDnnLabel_; + const tensorflow::Session* session_; + }; + + using TrackTfClassifier = TrackMVAClassifier; +} // namespace +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +DEFINE_FWK_MODULE(TrackTfClassifier); diff --git a/RecoTracker/FinalTrackSelectors/python/trackSelectionTf_cfi.py b/RecoTracker/FinalTrackSelectors/python/trackSelectionTf_cfi.py new file mode 100644 index 0000000000000..cf4f536adceae --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/python/trackSelectionTf_cfi.py @@ -0,0 +1,5 @@ +from RecoTracker.FinalTrackSelectors.tfGraphDefProducer_cfi import tfGraphDefProducer as _tfGraphDefProducer +trackSelectionTf = _tfGraphDefProducer.clone( + ComponentName = "trackSelectionTf", + FileName = "RecoTracker/FinalTrackSelectors/data/TrackTfClassifier/QCDFlatPU_QCDHighPt_ZEE_DisplacedSUSY_2020.pb" +) diff --git a/RecoTracker/FinalTrackSelectors/src/ES_TfGraphDefWrapper.cc b/RecoTracker/FinalTrackSelectors/src/ES_TfGraphDefWrapper.cc new file mode 100644 index 0000000000000..112e741062ed4 --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/src/ES_TfGraphDefWrapper.cc @@ -0,0 +1,4 @@ +#include "RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h" +#include "FWCore/Utilities/interface/typelookup.h" + +TYPELOOKUP_DATA_REG(TfGraphDefWrapper); diff --git a/RecoTracker/FinalTrackSelectors/src/TfGraphDefWrapper.cc b/RecoTracker/FinalTrackSelectors/src/TfGraphDefWrapper.cc new file mode 100644 index 0000000000000..1885f6768298e --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/src/TfGraphDefWrapper.cc @@ -0,0 +1,6 @@ +#include "RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h" + +TfGraphDefWrapper::TfGraphDefWrapper(tensorflow::Session* session) : session_(session) {} +const tensorflow::Session* TfGraphDefWrapper::getSession() const { + return const_cast(session_); +} diff --git a/RecoTracker/IterativeTracking/python/DetachedQuadStep_cff.py b/RecoTracker/IterativeTracking/python/DetachedQuadStep_cff.py index df61a9fb7bad1..8f0f7e466fb3a 100644 --- a/RecoTracker/IterativeTracking/python/DetachedQuadStep_cff.py +++ b/RecoTracker/IterativeTracking/python/DetachedQuadStep_cff.py @@ -4,6 +4,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary ############################################### # Low pT and detached tracks from pixel quadruplets @@ -211,11 +212,11 @@ qualityCuts = [-0.5,0.0,0.5] ) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(detachedQuadStep, TrackLwtnnClassifier.clone( - src = 'detachedQuadStepTracks', - qualityCuts = [-0.6, 0.05, 0.7] +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(detachedQuadStep, TrackTfClassifier.clone( + src = 'detachedQuadStepTracks', + qualityCuts = qualityCutDictionary['DetachedQuadStep'] )) highBetaStar_2018.toModify(detachedQuadStep,qualityCuts = [-0.7,0.0,0.5]) diff --git a/RecoTracker/IterativeTracking/python/DetachedTripletStep_cff.py b/RecoTracker/IterativeTracking/python/DetachedTripletStep_cff.py index 658878cd8f8fd..a97483e20256f 100644 --- a/RecoTracker/IterativeTracking/python/DetachedTripletStep_cff.py +++ b/RecoTracker/IterativeTracking/python/DetachedTripletStep_cff.py @@ -8,6 +8,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary ############################################### # Low pT and detached tracks from pixel triplets @@ -259,11 +260,11 @@ qualityCuts = [-0.2,0.3,0.8] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(detachedTripletStep, TrackLwtnnClassifier.clone( +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(detachedTripletStep, TrackTfClassifier.clone( src = 'detachedTripletStepTracks', - qualityCuts = [0.0, 0.4, 0.8], + qualityCuts = qualityCutDictionary['DetachedTripletStep'], )) (trackdnn & fastSim).toModify(detachedTripletStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') diff --git a/RecoTracker/IterativeTracking/python/HighPtTripletStep_cff.py b/RecoTracker/IterativeTracking/python/HighPtTripletStep_cff.py index efe2111bd5462..a249bad2528c6 100644 --- a/RecoTracker/IterativeTracking/python/HighPtTripletStep_cff.py +++ b/RecoTracker/IterativeTracking/python/HighPtTripletStep_cff.py @@ -4,6 +4,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary ### high-pT triplets ### @@ -253,11 +254,11 @@ qualityCuts = [0.2,0.3,0.4] ) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(highPtTripletStep, TrackLwtnnClassifier.clone( - src = 'highPtTripletStepTracks', - qualityCuts = [0.75, 0.775, 0.8], +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(highPtTripletStep, TrackTfClassifier.clone( + src = 'highPtTripletStepTracks', + qualityCuts = qualityCutDictionary['HighPtTripletStep'], )) highBetaStar_2018.toModify(highPtTripletStep,qualityCuts = [-0.2,0.3,0.4]) diff --git a/RecoTracker/IterativeTracking/python/InitialStep_cff.py b/RecoTracker/IterativeTracking/python/InitialStep_cff.py index e36252298f4e9..fb77d3ce0acaf 100644 --- a/RecoTracker/IterativeTracking/python/InitialStep_cff.py +++ b/RecoTracker/IterativeTracking/python/InitialStep_cff.py @@ -4,6 +4,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary ### STEP 0 ### @@ -315,11 +316,11 @@ qualityCuts = [-0.95,-0.85,-0.75] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(initialStep, TrackLwtnnClassifier.clone( +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(initialStep, TrackTfClassifier.clone( src = 'initialStepTracks', - qualityCuts = [0.0, 0.3, 0.6] + qualityCuts = qualityCutDictionary["InitialStep"] )) (trackdnn & fastSim).toModify(initialStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') diff --git a/RecoTracker/IterativeTracking/python/JetCoreRegionalStep_cff.py b/RecoTracker/IterativeTracking/python/JetCoreRegionalStep_cff.py index e9f44e537d619..8984deb616a59 100644 --- a/RecoTracker/IterativeTracking/python/JetCoreRegionalStep_cff.py +++ b/RecoTracker/IterativeTracking/python/JetCoreRegionalStep_cff.py @@ -2,6 +2,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary # This step runs over all clusters @@ -231,11 +232,11 @@ qualityCuts = [-0.2,0.0,0.4] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(jetCoreRegionalStep, TrackLwtnnClassifier.clone( - src = 'jetCoreRegionalStepTracks', - qualityCuts = [0.6, 0.7, 0.8], +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(jetCoreRegionalStep, TrackTfClassifier.clone( + src = 'jetCoreRegionalStepTracks', + qualityCuts = qualityCutDictionary["JetCoreRegionalStep"], )) fastSim.toModify(jetCoreRegionalStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') diff --git a/RecoTracker/IterativeTracking/python/LowPtQuadStep_cff.py b/RecoTracker/IterativeTracking/python/LowPtQuadStep_cff.py index 806e68b098bcf..93ad826dd28c6 100644 --- a/RecoTracker/IterativeTracking/python/LowPtQuadStep_cff.py +++ b/RecoTracker/IterativeTracking/python/LowPtQuadStep_cff.py @@ -4,6 +4,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary # NEW CLUSTERS (remove previously used clusters) lowPtQuadStepClusters = _cfg.clusterRemoverForIter('LowPtQuadStep') @@ -202,11 +203,11 @@ qualityCuts = [-0.7,-0.35,-0.15] ) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(lowPtQuadStep, TrackLwtnnClassifier.clone( - src = 'lowPtQuadStepTracks', - qualityCuts = [0.2, 0.425, 0.75] +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(lowPtQuadStep, TrackTfClassifier.clone( + src = 'lowPtQuadStepTracks', + qualityCuts = qualityCutDictionary["LowPtQuadStep"] )) highBetaStar_2018.toModify(lowPtQuadStep,qualityCuts = [-0.9,-0.35,-0.15]) diff --git a/RecoTracker/IterativeTracking/python/LowPtTripletStep_cff.py b/RecoTracker/IterativeTracking/python/LowPtTripletStep_cff.py index 9ebd3a52da078..b20d60df49116 100644 --- a/RecoTracker/IterativeTracking/python/LowPtTripletStep_cff.py +++ b/RecoTracker/IterativeTracking/python/LowPtTripletStep_cff.py @@ -5,6 +5,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary # NEW CLUSTERS (remove previously used clusters) lowPtTripletStepClusters = _cfg.clusterRemoverForIter('LowPtTripletStep') @@ -279,11 +280,11 @@ qualityCuts = [-0.4,0.0,0.3], )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(lowPtTripletStep, TrackLwtnnClassifier.clone( - src = 'lowPtTripletStepTracks', - qualityCuts = [0.2, 0.5, 0.8] +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(lowPtTripletStep, TrackTfClassifier.clone( + src = 'lowPtTripletStepTracks', + qualityCuts = qualityCutDictionary['LowPtTripletStep'] )) highBetaStar_2018.toModify(lowPtTripletStep,qualityCuts = [-0.7,-0.3,-0.1]) diff --git a/RecoTracker/IterativeTracking/python/MixedTripletStep_cff.py b/RecoTracker/IterativeTracking/python/MixedTripletStep_cff.py index 2795d77035499..c3051b3053241 100644 --- a/RecoTracker/IterativeTracking/python/MixedTripletStep_cff.py +++ b/RecoTracker/IterativeTracking/python/MixedTripletStep_cff.py @@ -5,6 +5,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary ############################################################### # Large impact parameter Tracking using mixed-triplet seeding # @@ -344,11 +345,11 @@ qualityCuts = [-0.5,0.0,0.5] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(mixedTripletStep, TrackLwtnnClassifier.clone( +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(mixedTripletStep, TrackTfClassifier.clone( src = 'mixedTripletStepTracks', - qualityCuts = [-0.8, -0.35, 0.1] + qualityCuts = qualityCutDictionary['MixedTripletStep'] )) (trackdnn & fastSim).toModify(mixedTripletStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') diff --git a/RecoTracker/IterativeTracking/python/PixelLessStep_cff.py b/RecoTracker/IterativeTracking/python/PixelLessStep_cff.py index 433abb1c77412..de8694abee81b 100644 --- a/RecoTracker/IterativeTracking/python/PixelLessStep_cff.py +++ b/RecoTracker/IterativeTracking/python/PixelLessStep_cff.py @@ -5,6 +5,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary ########################################################################## # Large impact parameter tracking using TIB/TID/TEC stereo layer seeding # @@ -344,11 +345,11 @@ qualityCuts = [-0.4,0.0,0.4] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(pixelLessStep, TrackLwtnnClassifier.clone( +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(pixelLessStep, TrackTfClassifier.clone( src = 'pixelLessStepTracks', - qualityCuts = [-0.6, -0.05, 0.5] + qualityCuts = qualityCutDictionary['PixelLessStep'] )) (trackdnn & fastSim).toModify(pixelLessStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') diff --git a/RecoTracker/IterativeTracking/python/PixelPairStep_cff.py b/RecoTracker/IterativeTracking/python/PixelPairStep_cff.py index a6e5dcc276d9a..0b9d5c6dc5a77 100644 --- a/RecoTracker/IterativeTracking/python/PixelPairStep_cff.py +++ b/RecoTracker/IterativeTracking/python/PixelPairStep_cff.py @@ -5,6 +5,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary # NEW CLUSTERS (remove previously used clusters) pixelPairStepClusters = _cfg.clusterRemoverForIter('PixelPairStep') @@ -338,11 +339,11 @@ ) trackingPhase1.toModify(pixelPairStep, mva=dict(GBRForestLabel = 'MVASelectorPixelPairStep_Phase1')) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(pixelPairStep, TrackLwtnnClassifier.clone( - src = 'pixelPairStepTracks', - qualityCuts = [-0.6, -0.1, 0.4] +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(pixelPairStep, TrackTfClassifier.clone( + src='pixelPairStepTracks', + qualityCuts=qualityCutDictionary['PixelPairStep'] )) highBetaStar_2018.toModify(pixelPairStep,qualityCuts = [-0.95,0.0,0.3]) diff --git a/RecoTracker/IterativeTracking/python/TobTecStep_cff.py b/RecoTracker/IterativeTracking/python/TobTecStep_cff.py index 2613ed80978b4..af527c2b64769 100644 --- a/RecoTracker/IterativeTracking/python/TobTecStep_cff.py +++ b/RecoTracker/IterativeTracking/python/TobTecStep_cff.py @@ -4,6 +4,7 @@ #for dnn classifier from Configuration.ProcessModifiers.trackdnn_cff import trackdnn +from RecoTracker.IterativeTracking.dnnQualityCuts import qualityCutDictionary ####################################################################### # Very large impact parameter tracking using TOB + TEC ring 5 seeding # @@ -372,11 +373,11 @@ qualityCuts = [-0.6,-0.45,-0.3] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(tobTecStep, TrackLwtnnClassifier.clone( +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(tobTecStep, TrackTfClassifier.clone( src = 'tobTecStepTracks', - qualityCuts = [-0.4, -0.25, -0.1] + qualityCuts = qualityCutDictionary["TobTecStep"] )) (trackdnn & fastSim).toModify(tobTecStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') diff --git a/RecoTracker/IterativeTracking/python/dnnQualityCuts.py b/RecoTracker/IterativeTracking/python/dnnQualityCuts.py new file mode 100644 index 0000000000000..315e2a9e94dd3 --- /dev/null +++ b/RecoTracker/IterativeTracking/python/dnnQualityCuts.py @@ -0,0 +1,14 @@ +# https://indico.cern.ch/event/947686/contributions/3981867/attachments/2090510/3512658/TrackingDNN_24_8_2020.pdf +qualityCutDictionary = { + 'InitialStep': [-0.2, 0.15, 0.40], + 'LowPtQuadStep': [-0.2, 0.10, 0.45], + 'HighPtTripletStep': [0.55, 0.60, 0.65], + 'LowPtTripletStep': [-0.2, -0.1, 0.10], + 'DetachedQuadStep': [-0.3, 0.20, 0.55], + 'DetachedTripletStep': [-0.5, -0.1, 0.40], + 'PixelPairStep': [-0.4, -0.35, -0.3], + 'MixedTripletStep': [-0.7, -0.5, -0.3], + 'PixelLessStep': [-0.8, -0.7, -0.6], + 'TobTecStep': [-0.6, -0.55, -0.5], + 'JetCoreRegionalStep': [0.20, 0.30, 0.50] +} diff --git a/RecoTracker/IterativeTracking/python/iterativeTkUtils.py b/RecoTracker/IterativeTracking/python/iterativeTkUtils.py index 1cf5d937276a9..dbaead72d3951 100644 --- a/RecoTracker/IterativeTracking/python/iterativeTkUtils.py +++ b/RecoTracker/IterativeTracking/python/iterativeTkUtils.py @@ -22,7 +22,7 @@ def getMVASelectors(postfix): classifiers = [] if typeName == "ClassifierMerger": classifiers = mod.inputClassifiers.value() - elif "TrackMVAClassifier" in typeName or "TrackLwtnnClassifier" in typeName: + elif "TrackMVAClassifier" in typeName or "TrackLwtnnClassifier" or "TrackTfClassifier" in typeName: classifiers = [iterName] if len(classifiers) > 0: ret[iterName] = (iterName+"Tracks", classifiers) diff --git a/RecoTracker/IterativeTracking/python/iterativeTk_cff.py b/RecoTracker/IterativeTracking/python/iterativeTk_cff.py index e4ff4ed8e4314..89efb64bd62aa 100644 --- a/RecoTracker/IterativeTracking/python/iterativeTk_cff.py +++ b/RecoTracker/IterativeTracking/python/iterativeTk_cff.py @@ -24,7 +24,10 @@ from RecoTracker.ConversionSeedGenerators.ConversionStep_cff import * import RecoTracker.IterativeTracking.iterativeTkConfig as _cfg +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * + +trackdnn_source = cms.ESSource("EmptyESSource", recordName = cms.string("TfGraphRecord"), firstValid = cms.vuint32(1), iovIsRunNotTime = cms.bool(True) ) iterTrackingEarlyTask = _cfg.createEarlyTask("", "", globals()) for _eraName, _postfix, _era in _cfg.nonDefaultEras(): _era.toReplaceWith(iterTrackingEarlyTask, _cfg.createEarlyTask(_eraName, _postfix, globals())) @@ -40,4 +43,8 @@ ConvStepTask, conversionStepTracks ) + +_iterTrackingTask_trackdnn = iterTrackingTask.copy() +_iterTrackingTask_trackdnn.add(trackdnn_source) +trackdnn.toReplaceWith(iterTrackingTask, _iterTrackingTask_trackdnn) iterTracking = cms.Sequence(iterTrackingTask) diff --git a/TrackingTools/Records/interface/Records.h b/TrackingTools/Records/interface/Records.h index f5e9e7d7e41b6..fd776205f933c 100644 --- a/TrackingTools/Records/interface/Records.h +++ b/TrackingTools/Records/interface/Records.h @@ -2,3 +2,4 @@ #include "TrackingTools/Records/interface/DetIdAssociatorRecord.h" #include "TrackingTools/Records/interface/TransientRecHitRecord.h" #include "TrackingTools/Records/interface/TransientTrackRecord.h" +#include "TrackingTools/Records/interface/TfGraphRecord.h" diff --git a/TrackingTools/Records/interface/TfGraphRecord.h b/TrackingTools/Records/interface/TfGraphRecord.h new file mode 100644 index 0000000000000..cad4bfba9f998 --- /dev/null +++ b/TrackingTools/Records/interface/TfGraphRecord.h @@ -0,0 +1,22 @@ +#ifndef TrackingTools_Records_TfGraphRecord_h +#define TrackingTools_Records_TfGraphRecord_h +// -*- C++ -*- +// +// Package: TrackingTools/Records +// Class : TfGraphRecord +// +/**\class TfGraphRecord TfGraphRecord.h TrackingTools/Records/interface/TfGraphRecord.h + Description: Class to hold Record of a Tensorflow GraphDef that can be used to serve a pretrained tensorflow model for inference + Usage: + Used by DataFormats/TrackTfGraph to produce the GraphRecord and RecoTrack/FinalTrackSelection/plugins/TrackTfClassifier.cc to evaluate a track using the graph. +*/ +// +// Author: Joona Havukainen +// Created: Fri, 24 Jul 2020 07:39:35 GMT +// + +#include "FWCore/Framework/interface/EventSetupRecordImplementation.h" + +class TfGraphRecord : public edm::eventsetup::EventSetupRecordImplementation {}; + +#endif diff --git a/TrackingTools/Records/src/TfGraphRecord.cc b/TrackingTools/Records/src/TfGraphRecord.cc new file mode 100644 index 0000000000000..edcbf58893369 --- /dev/null +++ b/TrackingTools/Records/src/TfGraphRecord.cc @@ -0,0 +1,12 @@ +// -*- C++ -*- +// +// Package: TrackingTools/Records +// Class : TfGraphRecord +// +// Author: Joona Havukainen +// Created: Fri, 24 Jul 2020 07:39:35 GMT + +#include "TrackingTools/Records/interface/TfGraphRecord.h" +#include "FWCore/Framework/interface/eventsetuprecord_registration_macro.h" + +EVENTSETUP_RECORD_REG(TfGraphRecord);