diff --git a/RecoTracker/FinalTrackSelectors/BuildFile.xml b/RecoTracker/FinalTrackSelectors/BuildFile.xml index e6243faae53a8..a1255d731924f 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..06f0171d16ec5 --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h @@ -0,0 +1,15 @@ +#ifndef TrackTfGraph_TfGraphDefWrapper_h +#define TrackTfGraph_TfGraphDefWrapper_h + +#include "PhysicsTools/TensorFlow/interface/TensorFlow.h" + +class TfGraphDefWrapper { +public: + TfGraphDefWrapper(tensorflow::GraphDef*); + tensorflow::GraphDef* GetGraphDef() const; + +private: + tensorflow::GraphDef* graphDef_; +}; + +#endif diff --git a/RecoTracker/FinalTrackSelectors/plugins/TfGraphDefProducer.cc b/RecoTracker/FinalTrackSelectors/plugins/TfGraphDefProducer.cc new file mode 100644 index 0000000000000..73963262b439e --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/plugins/TfGraphDefProducer.cc @@ -0,0 +1,66 @@ +// -*- C++ -*- +// +// Package: test/TFGraphDefProducer +// 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: + TfGraphDefWrapper wrapper_; + + // ----------member data --------------------------- +}; + +TfGraphDefProducer::TfGraphDefProducer(const edm::ParameterSet& iConfig) + : wrapper_( + TfGraphDefWrapper(tensorflow::loadGraphDef(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::unique_ptr(&wrapper_); +} + +void TfGraphDefProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("ComponentName", "tfGraphDef"); + desc.add("FileName", edm::FileInPath()); + 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..e67bf8e1171ce --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/plugins/TrackTfClassifier.cc @@ -0,0 +1,123 @@ +#include "RecoTracker/FinalTrackSelectors/interface/TrackMVAClassifier.h" + +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/ESHandle.h" + +#include "DataFormats/TrackReco/interface/Track.h" +#include "DataFormats/VertexReco/interface/Vertex.h" + +#include "getBestVertex.h" + +#include "TrackingTools/Records/interface/TfGraphRecord.h" +#include "PhysicsTools/TensorFlow/interface/TensorFlow.h" +#include "RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h" + +struct TfDnnCache { + TfDnnCache() : session_(nullptr) {} + tensorflow::Session* session_; +}; + +namespace { + struct tfDnn { + tfDnn(const edm::ParameterSet& cfg) + : tfDnnLabel_(cfg.getParameter("tfDnnLabel")) + + {} + TfDnnCache* cache_ = new TfDnnCache(); + + ~tfDnn() { + if (cache_->session_) { + tensorflow::closeSession(cache_->session_); + delete cache_; + } + } + + 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 (!cache_->session_) { + edm::ESHandle tfDnnHandle; + es.get().get(tfDnnLabel_, tfDnnHandle); + tensorflow::GraphDef* graphDef_ = tfDnnHandle.product()->GetGraphDef(); + cache_->session_ = tensorflow::createSession( + graphDef_, 1); //The integer controls how many threads are used for running inference + } + session_ = cache_->session_; + } + + float operator()(reco::Track const& trk, + reco::BeamSpot const& beamSpot, + reco::VertexCollection const& vertices) const { + Point 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(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; + } + + std::string tfDnnLabel_; + 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..e35e255961522 --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/python/trackSelectionTf_cfi.py @@ -0,0 +1,5 @@ +from DataFormats.TrackTfGraph.tfGraphDefProducer_cfi import tfGraphDefProducer as _tfGraphDefProducer +trackSelectionTf = _tfGraphDefProducer.clone( + ComponentName = "trackSelectionTf", + FileName = "RecoTracker/FinalTrackSelectors/data/QCDFlatPU_QCDHighPt_ZEE_DisplacedSUSY_2020.pb" +) diff --git a/RecoTracker/FinalTrackSelectors/src/ES_Tf.cc b/RecoTracker/FinalTrackSelectors/src/ES_Tf.cc new file mode 100644 index 0000000000000..a102e25bc133b --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/src/ES_Tf.cc @@ -0,0 +1,3 @@ +#include "PhysicsTools/TensorFlow/interface/TensorFlow.h" +#include "FWCore/Utilities/interface/typelookup.h" +TYPELOOKUP_DATA_REG(tensorflow::Session); 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..66c74cd21f7bf --- /dev/null +++ b/RecoTracker/FinalTrackSelectors/src/TfGraphDefWrapper.cc @@ -0,0 +1,5 @@ +#include "RecoTracker/FinalTrackSelectors/interface/TfGraphDefWrapper.h" + +TfGraphDefWrapper::TfGraphDefWrapper(tensorflow::GraphDef* graph) { graphDef_ = graph; } + +tensorflow::GraphDef* TfGraphDefWrapper::GetGraphDef() const { return graphDef_; } diff --git a/RecoTracker/IterativeTracking/python/DetachedQuadStep_cff.py b/RecoTracker/IterativeTracking/python/DetachedQuadStep_cff.py index dd7e55b6eff9a..fd8d941ab1e47 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 dnnQualityCuts import qualityCutDictionary ############################################### # Low pT and detached tracks from pixel quadruplets @@ -212,11 +213,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 77182fb282b6d..e69de4d71e9cf 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 dnnQualityCuts import qualityCutDictionary ############################################### # Low pT and detached tracks from pixel triplets @@ -260,11 +261,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 dad46627f08d7..dc1afaa048743 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 dnnQualityCuts import qualityCutDictionary ### high-pT triplets ### @@ -254,11 +255,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 a04086a3f3314..52664843ce84d 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 dnnQualityCuts import qualityCutDictionary ### STEP 0 ### @@ -318,13 +319,14 @@ qualityCuts = [-0.95,-0.85,-0.75] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(initialStep, TrackLwtnnClassifier.clone( - src = 'initialStepTracks', - qualityCuts = [0.0, 0.3, 0.6] +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(initialStep, TrackTfClassifier.clone( + src = 'initialStepTracks', + qualityCuts = qualityCutDictionary["InitialStep"] )) -(trackdnn & fastSim).toModify(initialStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') + +(trackdnn & fastSim).toModify(initialStep,vertices = "firstStepPrimaryVerticesBeforeMixing") pp_on_AA_2018.toModify(initialStep, mva = dict(GBRForestLabel = 'HIMVASelectorInitialStep_Phase1'), diff --git a/RecoTracker/IterativeTracking/python/JetCoreRegionalStep_cff.py b/RecoTracker/IterativeTracking/python/JetCoreRegionalStep_cff.py index 0a8f2e1d5516a..865da597fb1a1 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 dnnQualityCuts import qualityCutDictionary # This step runs over all clusters @@ -198,11 +199,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 3173217de15df..64e66d3e880bd 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 dnnQualityCuts import qualityCutDictionary # NEW CLUSTERS (remove previously used clusters) lowPtQuadStepClusters = _cfg.clusterRemoverForIter('LowPtQuadStep') @@ -205,11 +206,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 fdd1f29f75afe..4b26b541e381d 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 dnnQualityCuts import qualityCutDictionary # NEW CLUSTERS (remove previously used clusters) lowPtTripletStepClusters = _cfg.clusterRemoverForIter('LowPtTripletStep') @@ -280,11 +281,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 62b81ceb94452..f82096cdf53be 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 dnnQualityCuts import qualityCutDictionary ############################################################### # Large impact parameter Tracking using mixed-triplet seeding # @@ -345,13 +346,14 @@ qualityCuts = [-0.5,0.0,0.5] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(mixedTripletStep, TrackLwtnnClassifier.clone( - src = 'mixedTripletStepTracks', - qualityCuts = [-0.8, -0.35, 0.1] +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(mixedTripletStep, TrackTfClassifier.clone( + src = 'mixedTripletStepTracks', + qualityCuts = qualityCutDictionary['MixedTripletStep'] )) -(trackdnn & fastSim).toModify(mixedTripletStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') + +(trackdnn & fastSim).toModify(mixedTripletStep,vertices = "firstStepPrimaryVerticesBeforeMixing") highBetaStar_2018.toModify(mixedTripletStep,qualityCuts = [-0.7,0.0,0.5]) pp_on_AA_2018.toModify(mixedTripletStep, qualityCuts = [-0.5,0.0,0.9]) diff --git a/RecoTracker/IterativeTracking/python/PixelLessStep_cff.py b/RecoTracker/IterativeTracking/python/PixelLessStep_cff.py index 4180e142dd8ff..9877cb3a6824e 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 dnnQualityCuts import qualityCutDictionary ########################################################################## # Large impact parameter tracking using TIB/TID/TEC stereo layer seeding # @@ -299,13 +300,14 @@ qualityCuts = [-0.4,0.0,0.4] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(pixelLessStep, TrackLwtnnClassifier.clone( - src = 'pixelLessStepTracks', - qualityCuts = [-0.6, -0.05, 0.5] +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(pixelLessStep, TrackTfClassifier.clone( + src = 'pixelLessStepTracks', + qualityCuts = qualityCutDictionary['PixelLessStep'] )) -(trackdnn & fastSim).toModify(pixelLessStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') + +(trackdnn & fastSim).toModify(pixelLessStep,vertices = "firstStepPrimaryVerticesBeforeMixing") pp_on_AA_2018.toModify(pixelLessStep, qualityCuts = [-0.4,0.0,0.8]) diff --git a/RecoTracker/IterativeTracking/python/PixelPairStep_cff.py b/RecoTracker/IterativeTracking/python/PixelPairStep_cff.py index bdca6fd4af1e7..20c53d333984e 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 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 38f916dea3ea8..794b60ecd2d9e 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 dnnQualityCuts import qualityCutDictionary ####################################################################### # Very large impact parameter tracking using TOB + TEC ring 5 seeding # @@ -372,13 +373,14 @@ qualityCuts = [-0.6,-0.45,-0.3] )) -from RecoTracker.FinalTrackSelectors.TrackLwtnnClassifier_cfi import * -from RecoTracker.FinalTrackSelectors.trackSelectionLwtnn_cfi import * -trackdnn.toReplaceWith(tobTecStep, TrackLwtnnClassifier.clone( - src = 'tobTecStepTracks', - qualityCuts = [-0.4, -0.25, -0.1] +from RecoTracker.FinalTrackSelectors.TrackTfClassifier_cfi import * +from RecoTracker.FinalTrackSelectors.trackSelectionTf_cfi import * +trackdnn.toReplaceWith(tobTecStep, TrackTfClassifier.clone( + src = 'tobTecStepTracks', + qualityCuts = qualityCutDictionary["TobTecStep"] )) -(trackdnn & fastSim).toModify(tobTecStep,vertices = 'firstStepPrimaryVerticesBeforeMixing') + +(trackdnn & fastSim).toModify(tobTecStep,vertices = "firstStepPrimaryVerticesBeforeMixing") pp_on_AA_2018.toModify(tobTecStep, qualityCuts = [-0.6,-0.3,0.7]) diff --git a/RecoTracker/IterativeTracking/python/dnnQualityCuts.py b/RecoTracker/IterativeTracking/python/dnnQualityCuts.py new file mode 100644 index 0000000000000..0ab3834f67b7a --- /dev/null +++ b/RecoTracker/IterativeTracking/python/dnnQualityCuts.py @@ -0,0 +1,13 @@ +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/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..f5fec7147a11b --- /dev/null +++ b/TrackingTools/Records/interface/TfGraphRecord.h @@ -0,0 +1,22 @@ +#ifndef TfGraphRecord_TfGraphRecord_h +#define TfGraphRecord_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);