Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-13 02:32:17

0001 #include "CalibTracker/Records/interface/SiStripDependentRecords.h"
0002 #include "CondFormats/SiStripObjects/interface/SiStripBackPlaneCorrection.h"
0003 #include "CondFormats/SiStripObjects/interface/SiStripConfObject.h"
0004 #include "CondFormats/SiStripObjects/interface/SiStripLatency.h"
0005 #include "FWCore/Framework/interface/ESHandle.h"
0006 #include "FWCore/Framework/interface/ESProducer.h"
0007 #include "FWCore/Framework/interface/ModuleFactory.h"
0008 #include "FWCore/ParameterSet/interface/EmptyGroupDescription.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "RecoLocalTracker/ClusterParameterEstimator/interface/StripClusterParameterEstimator.h"
0011 #include "RecoLocalTracker/ClusterParameterEstimator/interface/StripFakeCPE.h"
0012 #include "RecoLocalTracker/Records/interface/TkStripCPERecord.h"
0013 #include "RecoLocalTracker/SiStripRecHitConverter/interface/StripCPE.h"
0014 #include "RecoLocalTracker/SiStripRecHitConverter/interface/StripCPEfromTrackAngle.h"
0015 #include "RecoLocalTracker/SiStripRecHitConverter/interface/StripCPEgeometric.h"
0016 
0017 class StripCPEESProducer : public edm::ESProducer {
0018 public:
0019   StripCPEESProducer(const edm::ParameterSet&);
0020   std::unique_ptr<StripClusterParameterEstimator> produce(const TkStripCPERecord&);
0021 
0022   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0023 
0024 private:
0025   enum CPE_t { SIMPLE, TRACKANGLE, GEOMETRIC, FAKE };
0026 
0027   CPE_t cpeNum;
0028   edm::ParameterSet parametersPSet;
0029 
0030   edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> pDDToken_;
0031   edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> magfieldToken_;
0032   edm::ESGetToken<SiStripLorentzAngle, SiStripLorentzAngleDepRcd> lorentzAngleToken_;
0033   edm::ESGetToken<SiStripBackPlaneCorrection, SiStripBackPlaneCorrectionDepRcd> backPlaneCorrectionToken_;
0034   edm::ESGetToken<SiStripConfObject, SiStripConfObjectRcd> confObjToken_;
0035   edm::ESGetToken<SiStripLatency, SiStripLatencyRcd> latencyToken_;
0036 };
0037 
0038 void StripCPEESProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0039   edm::ParameterSetDescription desc;
0040   desc.add<std::string>("ComponentName", "stripCPE");
0041 
0042   edm::ParameterSetDescription cpeFromTrackAngleDesc;
0043   StripCPEfromTrackAngle::fillPSetDescription(cpeFromTrackAngleDesc);
0044 
0045   edm::ParameterSetDescription emptyDesc;
0046 
0047   desc.ifValue(
0048       edm::ParameterDescription<std::string>("ComponentType", "SimpleStripCPE", true),
0049       "SimpleStripCPE" >> edm::ParameterDescription<edm::ParameterSetDescription>("parameters", emptyDesc, true) or
0050           "StripCPEfromTrackAngle" >>
0051               edm::ParameterDescription<edm::ParameterSetDescription>("parameters", cpeFromTrackAngleDesc, true) or
0052           "StripCPEgeometric" >>
0053               edm::ParameterDescription<edm::ParameterSetDescription>("parameters", emptyDesc, true) or
0054           "FakeStripCPE" >> edm::EmptyGroupDescription());
0055 
0056   descriptions.addWithDefaultLabel(desc);
0057 }
0058 
0059 StripCPEESProducer::StripCPEESProducer(const edm::ParameterSet& p) {
0060   std::string name = p.getParameter<std::string>("ComponentName");
0061   std::string type = name;
0062   if (!p.exists("ComponentType"))
0063     edm::LogWarning("StripCPEESProducer") << " the CPE producer should contain a ComponentType, probably identical to "
0064                                              "ComponentName in the first step of migration. Falling back to:"
0065                                           << type;
0066   else
0067     type = p.getParameter<std::string>("ComponentType");
0068 
0069   std::map<std::string, CPE_t> enumMap;
0070   enumMap[std::string("SimpleStripCPE")] = SIMPLE;
0071   enumMap[std::string("StripCPEfromTrackAngle")] = TRACKANGLE;
0072   enumMap[std::string("StripCPEgeometric")] = GEOMETRIC;
0073   enumMap[std::string("FakeStripCPE")] = FAKE;
0074   if (enumMap.find(type) == enumMap.end())
0075     throw cms::Exception("Unknown StripCPE type") << type;
0076 
0077   cpeNum = enumMap[type];
0078   parametersPSet = p.getParameter<edm::ParameterSet>("parameters");
0079   auto cc = setWhatProduced(this, name);
0080   pDDToken_ = cc.consumes();
0081   magfieldToken_ = cc.consumes();
0082   lorentzAngleToken_ = cc.consumes();
0083   backPlaneCorrectionToken_ = cc.consumes();
0084   confObjToken_ = cc.consumes();
0085   latencyToken_ = cc.consumes();
0086 }
0087 
0088 std::unique_ptr<StripClusterParameterEstimator> StripCPEESProducer::produce(const TkStripCPERecord& iRecord) {
0089   TrackerGeometry const& pDD = iRecord.get(pDDToken_);
0090   MagneticField const& magfield = iRecord.get(magfieldToken_);
0091   SiStripLorentzAngle const& lorentzAngle = iRecord.get(lorentzAngleToken_);
0092   SiStripBackPlaneCorrection const& backPlaneCorrection = iRecord.get(backPlaneCorrectionToken_);
0093   SiStripConfObject const& confObj = iRecord.get(confObjToken_);
0094   SiStripLatency const& latency = iRecord.get(latencyToken_);
0095 
0096   std::unique_ptr<StripClusterParameterEstimator> cpe;
0097 
0098   switch (cpeNum) {
0099     case SIMPLE:
0100       cpe = std::make_unique<StripCPE>(
0101           parametersPSet, magfield, pDD, lorentzAngle, backPlaneCorrection, confObj, latency);
0102       break;
0103 
0104     case TRACKANGLE:
0105       cpe = std::make_unique<StripCPEfromTrackAngle>(
0106           parametersPSet, magfield, pDD, lorentzAngle, backPlaneCorrection, confObj, latency);
0107       break;
0108 
0109     case GEOMETRIC:
0110       cpe = std::make_unique<StripCPEgeometric>(
0111           parametersPSet, magfield, pDD, lorentzAngle, backPlaneCorrection, confObj, latency);
0112       break;
0113 
0114     case FAKE:
0115       cpe = std::make_unique<StripFakeCPE>();
0116       break;
0117   }
0118 
0119   return cpe;
0120 }
0121 
0122 DEFINE_FWK_EVENTSETUP_MODULE(StripCPEESProducer);