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);