From a78e6b6669fa1d17f9e922d1c949c385c600af85 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sat, 27 Feb 2021 13:38:13 -0600 Subject: [PATCH 1/2] Apply esConsumes to DeDxEstimatorProducer Extended DeDxTools to not directly interact with EventSetup. --- .../interface/ASmirnovDeDxDiscriminator.h | 9 +- .../interface/BTagLikeDeDxDiscriminator.h | 9 +- RecoTracker/DeDx/interface/DeDxTools.h | 22 +++-- .../DeDx/interface/ProductDeDxDiscriminator.h | 11 +-- .../DeDx/interface/SmirnovDeDxDiscriminator.h | 9 +- .../DeDx/plugins/DeDxEstimatorProducer.cc | 27 +++--- .../DeDx/plugins/DeDxEstimatorProducer.h | 5 +- RecoTracker/DeDx/src/DeDxTools.cc | 84 ++++++++++++------- 8 files changed, 105 insertions(+), 71 deletions(-) diff --git a/RecoTracker/DeDx/interface/ASmirnovDeDxDiscriminator.h b/RecoTracker/DeDx/interface/ASmirnovDeDxDiscriminator.h index 33f2a9a5ce5f2..191fbecaa741f 100644 --- a/RecoTracker/DeDx/interface/ASmirnovDeDxDiscriminator.h +++ b/RecoTracker/DeDx/interface/ASmirnovDeDxDiscriminator.h @@ -7,16 +7,17 @@ class ASmirnovDeDxDiscriminator : public BaseDeDxEstimator { public: - ASmirnovDeDxDiscriminator(const edm::ParameterSet& iConfig) { + ASmirnovDeDxDiscriminator(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iCollector) + : token_(DeDxTools::esConsumes(iConfig.getParameter("Reccord"), iCollector)) { meVperADCStrip = iConfig.getParameter("MeVperADCStrip"); //currently needed until the map on the database are redone - Reccord = iConfig.getParameter("Reccord"); ProbabilityMode = iConfig.getParameter("ProbabilityMode"); Prob_ChargePath = nullptr; } void beginRun(edm::Run const& run, const edm::EventSetup& iSetup) override { - DeDxTools::buildDiscrimMap(run, iSetup, Reccord, ProbabilityMode, Prob_ChargePath); + auto const& histD3D = DeDxTools::getHistogramD3D(iSetup, token_); + DeDxTools::buildDiscrimMap(histD3D, ProbabilityMode, Prob_ChargePath); } std::pair dedx(const reco::DeDxHitCollection& Hits) override { @@ -50,7 +51,7 @@ class ASmirnovDeDxDiscriminator : public BaseDeDxEstimator { private: float meVperADCStrip; - std::string Reccord; + DeDxTools::ESGetTokenH3DDVariant token_; std::string ProbabilityMode; TH3F* Prob_ChargePath; }; diff --git a/RecoTracker/DeDx/interface/BTagLikeDeDxDiscriminator.h b/RecoTracker/DeDx/interface/BTagLikeDeDxDiscriminator.h index a69c8aa9fc962..e8722510c6cd6 100644 --- a/RecoTracker/DeDx/interface/BTagLikeDeDxDiscriminator.h +++ b/RecoTracker/DeDx/interface/BTagLikeDeDxDiscriminator.h @@ -7,16 +7,17 @@ class BTagLikeDeDxDiscriminator : public BaseDeDxEstimator { public: - BTagLikeDeDxDiscriminator(const edm::ParameterSet& iConfig) { + BTagLikeDeDxDiscriminator(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iCollector) + : token_(DeDxTools::esConsumes(iConfig.getParameter("Reccord"), iCollector)) { meVperADCStrip = iConfig.getParameter("MeVperADCStrip"); //currently needed until the map on the database are redone - Reccord = iConfig.getParameter("Reccord"); ProbabilityMode = iConfig.getParameter("ProbabilityMode"); Prob_ChargePath = nullptr; } void beginRun(edm::Run const& run, const edm::EventSetup& iSetup) override { - DeDxTools::buildDiscrimMap(run, iSetup, Reccord, ProbabilityMode, Prob_ChargePath); + auto const& histD3D = DeDxTools::getHistogramD3D(iSetup, token_); + DeDxTools::buildDiscrimMap(histD3D, ProbabilityMode, Prob_ChargePath); } std::pair dedx(const reco::DeDxHitCollection& Hits) override { @@ -66,7 +67,7 @@ class BTagLikeDeDxDiscriminator : public BaseDeDxEstimator { private: float meVperADCStrip; - std::string Reccord; + DeDxTools::ESGetTokenH3DDVariant token_; std::string ProbabilityMode; TH3F* Prob_ChargePath; }; diff --git a/RecoTracker/DeDx/interface/DeDxTools.h b/RecoTracker/DeDx/interface/DeDxTools.h index e7ea7b3d621f1..70c304eec364c 100644 --- a/RecoTracker/DeDx/interface/DeDxTools.h +++ b/RecoTracker/DeDx/interface/DeDxTools.h @@ -4,9 +4,6 @@ #include #include "FWCore/Framework/interface/Frameworkfwd.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/Framework/interface/ESHandle.h" #include "DataFormats/GeometryCommonDetAlgo/interface/Measurement1D.h" #include "DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h" @@ -46,16 +43,23 @@ namespace DeDxTools { int getCharge(const SiStripCluster* cluster, int& nSatStrip, const GeomDetUnit& detUnit, - const std::vector >& calibGains, + const std::vector>& calibGains, const unsigned int& m_off); void makeCalibrationMap(const std::string& m_calibrationPath, const TrackerGeometry& tkGeom, - std::vector >& calibGains, + std::vector>& calibGains, const unsigned int& m_off); - void buildDiscrimMap(edm::Run const& run, - const edm::EventSetup& iSetup, - std::string Reccord, - std::string ProbabilityMode, + + using H3DD = PhysicsTools::Calibration::HistogramD3D; + using ESGetTokenH3DDVariant = std::variant, + edm::ESGetToken, + edm::ESGetToken, + edm::ESGetToken, + edm::ESGetToken>; + ESGetTokenH3DDVariant esConsumes(std::string const& Reccord, edm::ConsumesCollector&); + PhysicsTools::Calibration::HistogramD3D const& getHistogramD3D(edm::EventSetup const&, ESGetTokenH3DDVariant const&); + void buildDiscrimMap(PhysicsTools::Calibration::HistogramD3D const&, + std::string const& ProbabilityMode, TH3F*& Prob_ChargePath); bool IsSpanningOver2APV(unsigned int FirstStrip, unsigned int ClusterSize); bool IsFarFromBorder(const TrajectoryStateOnSurface& trajState, const GeomDetUnit* it); diff --git a/RecoTracker/DeDx/interface/ProductDeDxDiscriminator.h b/RecoTracker/DeDx/interface/ProductDeDxDiscriminator.h index 5e9f931f83641..471f3e721d312 100644 --- a/RecoTracker/DeDx/interface/ProductDeDxDiscriminator.h +++ b/RecoTracker/DeDx/interface/ProductDeDxDiscriminator.h @@ -7,16 +7,17 @@ class ProductDeDxDiscriminator : public BaseDeDxEstimator { public: - ProductDeDxDiscriminator(const edm::ParameterSet& iConfig) { + ProductDeDxDiscriminator(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iCollector) + : token_(DeDxTools::esConsumes(iConfig.getParameter("Reccord"), iCollector)) { meVperADCStrip = iConfig.getParameter("MeVperADCStrip"); //currently needed until the map on the database are redone - Reccord = iConfig.getParameter("Reccord"); ProbabilityMode = iConfig.getParameter("ProbabilityMode"); Prob_ChargePath = nullptr; } - void beginRun(edm::Run const& run, const edm::EventSetup& iSetup) override { - DeDxTools::buildDiscrimMap(run, iSetup, Reccord, ProbabilityMode, Prob_ChargePath); + void beginRun(edm::Run const&, const edm::EventSetup& iSetup) override { + auto const& histD3D = DeDxTools::getHistogramD3D(iSetup, token_); + DeDxTools::buildDiscrimMap(histD3D, ProbabilityMode, Prob_ChargePath); } std::pair dedx(const reco::DeDxHitCollection& Hits) override { @@ -52,7 +53,7 @@ class ProductDeDxDiscriminator : public BaseDeDxEstimator { private: float meVperADCStrip; - std::string Reccord; + DeDxTools::ESGetTokenH3DDVariant token_; std::string ProbabilityMode; TH3F* Prob_ChargePath; }; diff --git a/RecoTracker/DeDx/interface/SmirnovDeDxDiscriminator.h b/RecoTracker/DeDx/interface/SmirnovDeDxDiscriminator.h index 14fb588b11e43..e519f5fdc7a25 100644 --- a/RecoTracker/DeDx/interface/SmirnovDeDxDiscriminator.h +++ b/RecoTracker/DeDx/interface/SmirnovDeDxDiscriminator.h @@ -7,16 +7,17 @@ class SmirnovDeDxDiscriminator : public BaseDeDxEstimator { public: - SmirnovDeDxDiscriminator(const edm::ParameterSet& iConfig) { + SmirnovDeDxDiscriminator(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iCollector) + : token_(DeDxTools::esConsumes(iConfig.getParameter("Reccord"), iCollector)) { meVperADCStrip = iConfig.getParameter("MeVperADCStrip"); //currently needed until the map on the database are redone - Reccord = iConfig.getParameter("Reccord"); ProbabilityMode = iConfig.getParameter("ProbabilityMode"); Prob_ChargePath = nullptr; } void beginRun(edm::Run const& run, const edm::EventSetup& iSetup) override { - DeDxTools::buildDiscrimMap(run, iSetup, Reccord, ProbabilityMode, Prob_ChargePath); + auto const& histD3D = DeDxTools::getHistogramD3D(iSetup, token_); + DeDxTools::buildDiscrimMap(histD3D, ProbabilityMode, Prob_ChargePath); } std::pair dedx(const reco::DeDxHitCollection& Hits) override { @@ -50,7 +51,7 @@ class SmirnovDeDxDiscriminator : public BaseDeDxEstimator { private: float meVperADCStrip; - std::string Reccord; + DeDxTools::ESGetTokenH3DDVariant token_; std::string ProbabilityMode; TH3F* Prob_ChargePath; }; diff --git a/RecoTracker/DeDx/plugins/DeDxEstimatorProducer.cc b/RecoTracker/DeDx/plugins/DeDxEstimatorProducer.cc index 028f38b72eca7..9e31867cd27f0 100644 --- a/RecoTracker/DeDx/plugins/DeDxEstimatorProducer.cc +++ b/RecoTracker/DeDx/plugins/DeDxEstimatorProducer.cc @@ -20,6 +20,7 @@ // system include files #include "RecoTracker/DeDx/plugins/DeDxEstimatorProducer.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" using namespace reco; using namespace std; @@ -44,28 +45,30 @@ void DeDxEstimatorProducer::fillDescriptions(edm::ConfigurationDescriptions& des descriptions.add("DeDxEstimatorProducer", desc); } -DeDxEstimatorProducer::DeDxEstimatorProducer(const edm::ParameterSet& iConfig) { +DeDxEstimatorProducer::DeDxEstimatorProducer(const edm::ParameterSet& iConfig) + : tkGeomToken(esConsumes()) { produces>(); + auto cCollector = consumesCollector(); string estimatorName = iConfig.getParameter("estimator"); if (estimatorName == "median") - m_estimator = new MedianDeDxEstimator(iConfig); + m_estimator = std::make_unique(iConfig); else if (estimatorName == "generic") - m_estimator = new GenericAverageDeDxEstimator(iConfig); + m_estimator = std::make_unique(iConfig); else if (estimatorName == "truncated") - m_estimator = new TruncatedAverageDeDxEstimator(iConfig); + m_estimator = std::make_unique(iConfig); else if (estimatorName == "genericTruncated") - m_estimator = new GenericTruncatedAverageDeDxEstimator(iConfig); + m_estimator = std::make_unique(iConfig); else if (estimatorName == "unbinnedFit") - m_estimator = new UnbinnedFitDeDxEstimator(iConfig); + m_estimator = std::make_unique(iConfig); else if (estimatorName == "productDiscrim") - m_estimator = new ProductDeDxDiscriminator(iConfig); + m_estimator = std::make_unique(iConfig, cCollector); else if (estimatorName == "btagDiscrim") - m_estimator = new BTagLikeDeDxDiscriminator(iConfig); + m_estimator = std::make_unique(iConfig, cCollector); else if (estimatorName == "smirnovDiscrim") - m_estimator = new SmirnovDeDxDiscriminator(iConfig); + m_estimator = std::make_unique(iConfig, cCollector); else if (estimatorName == "asmirnovDiscrim") - m_estimator = new ASmirnovDeDxDiscriminator(iConfig); + m_estimator = std::make_unique(iConfig, cCollector); //Commented for now, might be used in the future // MaxNrStrips = iConfig.getUntrackedParameter("maxNrStrips" , 255); @@ -86,11 +89,11 @@ DeDxEstimatorProducer::DeDxEstimatorProducer(const edm::ParameterSet& iConfig) { << "Pixel Hits AND Strip Hits will not be used to estimate dEdx --> BUG, Please Update the config file"; } -DeDxEstimatorProducer::~DeDxEstimatorProducer() { delete m_estimator; } +DeDxEstimatorProducer::~DeDxEstimatorProducer() {} // ------------ method called once each job just before starting event loop ------------ void DeDxEstimatorProducer::beginRun(edm::Run const& run, const edm::EventSetup& iSetup) { - iSetup.get().get(tkGeom); + tkGeom = &iSetup.getData(tkGeomToken); if (useCalibration && calibGains.empty()) { m_off = tkGeom->offsetDU(GeomDetEnumerators::PixelBarrel); //index start at the first pixel diff --git a/RecoTracker/DeDx/plugins/DeDxEstimatorProducer.h b/RecoTracker/DeDx/plugins/DeDxEstimatorProducer.h index 7ffc324dad515..a77e88a84eaf1 100644 --- a/RecoTracker/DeDx/plugins/DeDxEstimatorProducer.h +++ b/RecoTracker/DeDx/plugins/DeDxEstimatorProducer.h @@ -60,7 +60,7 @@ class DeDxEstimatorProducer : public edm::stream::EDProducer<> { int& NClusterSaturating); // ----------member data --------------------------- - BaseDeDxEstimator* m_estimator; + std::unique_ptr m_estimator; edm::EDGetTokenT m_tracksTag; @@ -78,7 +78,8 @@ class DeDxEstimatorProducer : public edm::stream::EDProducer<> { std::vector > calibGains; unsigned int m_off; - edm::ESHandle tkGeom; + const edm::ESGetToken tkGeomToken; + const TrackerGeometry* tkGeom = nullptr; }; #endif diff --git a/RecoTracker/DeDx/src/DeDxTools.cc b/RecoTracker/DeDx/src/DeDxTools.cc index 04c072e226257..bbd85befd8b0c 100644 --- a/RecoTracker/DeDx/src/DeDxTools.cc +++ b/RecoTracker/DeDx/src/DeDxTools.cc @@ -1,3 +1,6 @@ +#include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/Framework/interface/ESHandle.h" + #include "RecoTracker/DeDx/interface/DeDxTools.h" #include @@ -277,44 +280,63 @@ namespace DeDxTools { t1->Delete(); } - void buildDiscrimMap(edm::Run const& run, - const edm::EventSetup& iSetup, - std::string Reccord, - std::string ProbabilityMode, - TH3F*& Prob_ChargePath) { - edm::ESHandle deDxMapHandle; - if (strcmp(Reccord.c_str(), "SiStripDeDxMip_3D_Rcd") == 0) { - iSetup.get().get(deDxMapHandle); - } else if (strcmp(Reccord.c_str(), "SiStripDeDxPion_3D_Rcd") == 0) { - iSetup.get().get(deDxMapHandle); - } else if (strcmp(Reccord.c_str(), "SiStripDeDxKaon_3D_Rcd") == 0) { - iSetup.get().get(deDxMapHandle); - } else if (strcmp(Reccord.c_str(), "SiStripDeDxProton_3D_Rcd") == 0) { - iSetup.get().get(deDxMapHandle); - } else if (strcmp(Reccord.c_str(), "SiStripDeDxElectron_3D_Rcd") == 0) { - iSetup.get().get(deDxMapHandle); - } else { - throw cms::Exception("WrongReccord for dEdx") << "The reccord : " << Reccord << "is unknown\n"; + ESGetTokenH3DDVariant esConsumes(std::string const& Reccord, edm::ConsumesCollector& iCC) { + if (Reccord == "SiStripDeDxMip_3D_Rcd") { + return iCC.esConsumes(); + } + if (Reccord == "SiStripDeDxPion_3D_Rcd") { + return iCC.esConsumes(); + } + if (Reccord == "SiStripDeDxKaon_3D_Rcd") { + return iCC.esConsumes(); + } + if (Reccord == "SiStripDeDxProton_3D_Rcd") { + return iCC.esConsumes(); } + if (Reccord == "SiStripDeDxElectron_3D_Rcd") { + return iCC.esConsumes(); + } + throw cms::Exception("WrongReccord for dEdx") << "The reccord : " << Reccord << "is unknown\n"; + } + + PhysicsTools::Calibration::HistogramD3D const& getHistogramD3D(edm::EventSetup const& iES, + ESGetTokenH3DDVariant const& iToken) { + switch (iToken.index()) { + case 0: + return iES.getData(std::get<0>(iToken)); + case 1: + return iES.getData(std::get<1>(iToken)); + case 2: + return iES.getData(std::get<2>(iToken)); + case 3: + return iES.getData(std::get<3>(iToken)); + case 4: + return iES.getData(std::get<4>(iToken)); + } + throw cms::Exception("HistogramD3DTokenUnset"); + } - float xmin = deDxMapHandle->rangeX().min; - float xmax = deDxMapHandle->rangeX().max; - float ymin = deDxMapHandle->rangeY().min; - float ymax = deDxMapHandle->rangeY().max; - float zmin = deDxMapHandle->rangeZ().min; - float zmax = deDxMapHandle->rangeZ().max; + void buildDiscrimMap(PhysicsTools::Calibration::HistogramD3D const& deDxMap, + std::string const& ProbabilityMode, + TH3F*& Prob_ChargePath) { + float xmin = deDxMap.rangeX().min; + float xmax = deDxMap.rangeX().max; + float ymin = deDxMap.rangeY().min; + float ymax = deDxMap.rangeY().max; + float zmin = deDxMap.rangeZ().min; + float zmax = deDxMap.rangeZ().max; if (Prob_ChargePath) delete Prob_ChargePath; Prob_ChargePath = new TH3F("Prob_ChargePath", "Prob_ChargePath", - deDxMapHandle->numberOfBinsX(), + deDxMap.numberOfBinsX(), xmin, xmax, - deDxMapHandle->numberOfBinsY(), + deDxMap.numberOfBinsY(), ymin, ymax, - deDxMapHandle->numberOfBinsZ(), + deDxMap.numberOfBinsZ(), zmin, zmax); @@ -323,12 +345,12 @@ namespace DeDxTools { for (int j = 0; j <= Prob_ChargePath->GetYaxis()->GetNbins() + 1; j++) { float Ni = 0; for (int k = 0; k <= Prob_ChargePath->GetZaxis()->GetNbins() + 1; k++) { - Ni += deDxMapHandle->binContent(i, j, k); + Ni += deDxMap.binContent(i, j, k); } for (int k = 0; k <= Prob_ChargePath->GetZaxis()->GetNbins() + 1; k++) { float tmp = 0; for (int l = 0; l <= k; l++) { - tmp += deDxMapHandle->binContent(i, j, l); + tmp += deDxMap.binContent(i, j, l); } if (Ni > 0) { Prob_ChargePath->SetBinContent(i, j, k, tmp / Ni); @@ -343,10 +365,10 @@ namespace DeDxTools { for (int j = 0; j <= Prob_ChargePath->GetYaxis()->GetNbins() + 1; j++) { float Ni = 0; for (int k = 0; k <= Prob_ChargePath->GetZaxis()->GetNbins() + 1; k++) { - Ni += deDxMapHandle->binContent(i, j, k); + Ni += deDxMap.binContent(i, j, k); } for (int k = 0; k <= Prob_ChargePath->GetZaxis()->GetNbins() + 1; k++) { - float tmp = deDxMapHandle->binContent(i, j, k); + float tmp = deDxMap.binContent(i, j, k); if (Ni > 0) { Prob_ChargePath->SetBinContent(i, j, k, tmp / Ni); } else { From 4aef1c5caa19f5a9e46b948e281a9e26490d8268 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sat, 27 Feb 2021 14:11:57 -0600 Subject: [PATCH 2/2] Updated FastTrackDeDxProducer to changes to DeDxTools --- .../plugins/FastTrackDeDxProducer.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/FastSimulation/SimplifiedGeometryPropagator/plugins/FastTrackDeDxProducer.cc b/FastSimulation/SimplifiedGeometryPropagator/plugins/FastTrackDeDxProducer.cc index f127418a6b90c..6d6bc02b8b6a6 100644 --- a/FastSimulation/SimplifiedGeometryPropagator/plugins/FastTrackDeDxProducer.cc +++ b/FastSimulation/SimplifiedGeometryPropagator/plugins/FastTrackDeDxProducer.cc @@ -27,6 +27,7 @@ #include "FWCore/Framework/interface/MakerMacros.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h" @@ -99,6 +100,7 @@ class FastTrackDeDxProducer : public edm::stream::EDProducer<> { edm::EDGetTokenT simHitsToken; edm::EDGetTokenT simHit2RecHitMapToken; + const edm::ESGetToken tkGeomToken; bool usePixel; bool useStrip; @@ -137,9 +139,11 @@ void FastTrackDeDxProducer::fillDescriptions(edm::ConfigurationDescriptions& des FastTrackDeDxProducer::FastTrackDeDxProducer(const edm::ParameterSet& iConfig) : simHitsToken(consumes(iConfig.getParameter("simHits"))), simHit2RecHitMapToken( - consumes(iConfig.getParameter("simHit2RecHitMap"))) { + consumes(iConfig.getParameter("simHit2RecHitMap"))), + tkGeomToken(esConsumes()) { produces>(); + auto cCollector = consumesCollector(); string estimatorName = iConfig.getParameter("estimator"); if (estimatorName == "median") m_estimator = std::unique_ptr(new MedianDeDxEstimator(iConfig)); @@ -149,13 +153,13 @@ FastTrackDeDxProducer::FastTrackDeDxProducer(const edm::ParameterSet& iConfig) m_estimator = std::unique_ptr(new TruncatedAverageDeDxEstimator(iConfig)); //else if(estimatorName == "unbinnedFit") m_estimator = std::unique_ptr (new UnbinnedFitDeDxEstimator(iConfig));//estimator used in FullSimVersion else if (estimatorName == "productDiscrim") - m_estimator = std::unique_ptr(new ProductDeDxDiscriminator(iConfig)); + m_estimator = std::unique_ptr(new ProductDeDxDiscriminator(iConfig, cCollector)); else if (estimatorName == "btagDiscrim") - m_estimator = std::unique_ptr(new BTagLikeDeDxDiscriminator(iConfig)); + m_estimator = std::unique_ptr(new BTagLikeDeDxDiscriminator(iConfig, cCollector)); else if (estimatorName == "smirnovDiscrim") - m_estimator = std::unique_ptr(new SmirnovDeDxDiscriminator(iConfig)); + m_estimator = std::unique_ptr(new SmirnovDeDxDiscriminator(iConfig, cCollector)); else if (estimatorName == "asmirnovDiscrim") - m_estimator = std::unique_ptr(new ASmirnovDeDxDiscriminator(iConfig)); + m_estimator = std::unique_ptr(new ASmirnovDeDxDiscriminator(iConfig, cCollector)); else throw cms::Exception("fastsim::SimplifiedGeometry::FastTrackDeDxProducer.cc") << " estimator name does not exist";