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