File indexing completed on 2025-01-21 01:40:02
0001 #include "FWCore/Framework/interface/ESProducer.h"
0002 #include "FWCore/Framework/interface/ESHandle.h"
0003 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0004 #include "FWCore/Framework/interface/ModuleFactory.h"
0005
0006 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0007 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0008 #include "MagneticField/Engine/interface/MagneticField.h"
0009 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0010 #include "CondFormats/DataRecord/interface/SiPhase2OuterTrackerLorentzAngleRcd.h"
0011
0012 #include "RecoLocalTracker/Records/interface/TkPhase2OTCPERecord.h"
0013 #include "RecoLocalTracker/ClusterParameterEstimator/interface/ClusterParameterEstimator.h"
0014 #include "RecoLocalTracker/Phase2TrackerRecHits/interface/Phase2StripCPE.h"
0015 #include "RecoLocalTracker/Phase2TrackerRecHits/interface/Phase2StripCPEGeometric.h"
0016
0017 #include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h"
0018
0019 #include <memory>
0020 #include <map>
0021
0022 class Phase2StripCPEESProducer : public edm::ESProducer {
0023 public:
0024 Phase2StripCPEESProducer(const edm::ParameterSet&);
0025 std::unique_ptr<ClusterParameterEstimator<Phase2TrackerCluster1D> > produce(const TkPhase2OTCPERecord& iRecord);
0026 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0027
0028 private:
0029 enum CPE_t { DEFAULT, GEOMETRIC };
0030
0031 edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> magfieldToken_;
0032 edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> pDDToken_;
0033 edm::ESGetToken<SiPhase2OuterTrackerLorentzAngle, SiPhase2OuterTrackerLorentzAngleRcd> lorentzAngleToken_;
0034 CPE_t cpeNum_;
0035 edm::ParameterSet pset_;
0036 };
0037
0038 Phase2StripCPEESProducer::Phase2StripCPEESProducer(const edm::ParameterSet& p) {
0039 std::string name = p.getParameter<std::string>("ComponentType");
0040
0041 std::map<std::string, CPE_t> enumMap;
0042 enumMap[std::string("Phase2StripCPE")] = DEFAULT;
0043 enumMap[std::string("Phase2StripCPEGeometric")] = GEOMETRIC;
0044 if (enumMap.find(name) == enumMap.end())
0045 throw cms::Exception("Unknown StripCPE type") << name;
0046
0047 cpeNum_ = enumMap[name];
0048 pset_ = p.getParameter<edm::ParameterSet>("parameters");
0049 auto c = setWhatProduced(this, name);
0050 if (cpeNum_ != GEOMETRIC) {
0051 magfieldToken_ = c.consumes();
0052 pDDToken_ = c.consumes();
0053 lorentzAngleToken_ = c.consumes();
0054 }
0055 }
0056
0057 void Phase2StripCPEESProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0058 edm::ParameterSetDescription desc;
0059 desc.add<std::string>("ComponentType", "Phase2StripCPE");
0060
0061 {
0062 edm::ParameterSetDescription paramsDesc;
0063 Phase2StripCPE::fillPSetDescription(paramsDesc);
0064 desc.add<edm::ParameterSetDescription>("parameters", paramsDesc);
0065 }
0066
0067 descriptions.addWithDefaultLabel(desc);
0068 }
0069
0070 std::unique_ptr<ClusterParameterEstimator<Phase2TrackerCluster1D> > Phase2StripCPEESProducer::produce(
0071 const TkPhase2OTCPERecord& iRecord) {
0072 std::unique_ptr<ClusterParameterEstimator<Phase2TrackerCluster1D> > cpe_;
0073 switch (cpeNum_) {
0074 case DEFAULT:
0075 cpe_ = std::make_unique<Phase2StripCPE>(
0076 pset_, iRecord.get(magfieldToken_), iRecord.get(pDDToken_), iRecord.get(lorentzAngleToken_));
0077 break;
0078
0079 case GEOMETRIC:
0080 cpe_ = std::make_unique<Phase2StripCPEGeometric>(pset_);
0081 break;
0082 }
0083 return cpe_;
0084 }
0085
0086 #include "FWCore/Framework/interface/ModuleFactory.h"
0087 DEFINE_FWK_EVENTSETUP_MODULE(Phase2StripCPEESProducer);