File indexing completed on 2024-09-07 04:35:09
0001
0002 #include <memory>
0003 #include <utility>
0004
0005
0006 #include "FWCore/Framework/interface/ModuleFactory.h"
0007 #include "FWCore/Framework/interface/ESProducer.h"
0008
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 #include "CalibFormats/SiStripObjects/interface/SiStripGain.h"
0013 #include "CondFormats/SiStripObjects/interface/SiStripApvGain.h"
0014 #include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"
0015 #include "CalibTracker/Records/interface/SiStripDependentRecords.h"
0016 #include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"
0017
0018 #include "SiStripGainFactor.h"
0019
0020 class SiStripGainSimESProducer : public edm::ESProducer {
0021 public:
0022 SiStripGainSimESProducer(const edm::ParameterSet&);
0023 ~SiStripGainSimESProducer() override {}
0024
0025 std::unique_ptr<SiStripGain> produce(const SiStripGainSimRcd&);
0026
0027 private:
0028 struct TokenLabel {
0029 TokenLabel(edm::ESConsumesCollector& cc, std::string record, std::string label)
0030 : token_{cc.consumesFrom<SiStripApvGain, SiStripApvGainSimRcd>(edm::ESInputTag{"", label})},
0031 recordLabel_{std::move(record), std::move(label)} {}
0032 edm::ESGetToken<SiStripApvGain, SiStripApvGainSimRcd> token_;
0033 std::pair<std::string, std::string> recordLabel_;
0034 };
0035
0036 std::vector<TokenLabel> tokenLabels_;
0037 SiStripGainFactor factor_;
0038 };
0039
0040 SiStripGainSimESProducer::SiStripGainSimESProducer(const edm::ParameterSet& iConfig) : factor_{iConfig} {
0041 auto cc = setWhatProduced(this);
0042
0043 auto apvGainLabels = iConfig.getParameter<std::vector<edm::ParameterSet> >("APVGain");
0044 if (apvGainLabels.empty()) {
0045 throw cms::Exception("Configuration") << "Got empty APVGain vector, but need at least one entry";
0046 }
0047
0048
0049 for (const auto& gainPSet : apvGainLabels) {
0050
0051 tokenLabels_.emplace_back(
0052 cc, gainPSet.getParameter<std::string>("Record"), gainPSet.getUntrackedParameter<std::string>("Label", ""));
0053 factor_.push_back_norm(gainPSet.getUntrackedParameter<double>("NormalizationFactor", 1.));
0054 }
0055
0056 factor_.resetIfBadNorm();
0057 }
0058
0059 std::unique_ptr<SiStripGain> SiStripGainSimESProducer::produce(const SiStripGainSimRcd& iRecord) {
0060 const auto detInfo =
0061 SiStripDetInfoFileReader::read(edm::FileInPath{SiStripDetInfoFileReader::kDefaultFile}.fullPath());
0062
0063 const auto& apvGain = iRecord.get(tokenLabels_[0].token_);
0064 auto gain = std::make_unique<SiStripGain>(apvGain, factor_.get(apvGain, 0), tokenLabels_[0].recordLabel_, detInfo);
0065
0066 for (unsigned int i = 1; i < tokenLabels_.size(); ++i) {
0067 const auto& apvGain = iRecord.get(tokenLabels_[i].token_);
0068 gain->multiply(apvGain, factor_.get(apvGain, i), tokenLabels_[i].recordLabel_, detInfo);
0069 }
0070 return gain;
0071 }
0072
0073 #include "FWCore/Framework/interface/ModuleFactory.h"
0074
0075 DEFINE_FWK_EVENTSETUP_MODULE(SiStripGainSimESProducer);