SiStripGainSimESProducer

TokenLabel

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
// system include files
#include <memory>
#include <utility>

// user include files
#include "FWCore/Framework/interface/ModuleFactory.h"
#include "FWCore/Framework/interface/ESProducer.h"

#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"

#include "CalibFormats/SiStripObjects/interface/SiStripGain.h"
#include "CondFormats/SiStripObjects/interface/SiStripApvGain.h"
#include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"
#include "CalibTracker/Records/interface/SiStripDependentRecords.h"
#include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"

#include "SiStripGainFactor.h"

class SiStripGainSimESProducer : public edm::ESProducer {
public:
  SiStripGainSimESProducer(const edm::ParameterSet&);
  ~SiStripGainSimESProducer() override {}

  std::unique_ptr<SiStripGain> produce(const SiStripGainSimRcd&);

private:
  struct TokenLabel {
    TokenLabel(edm::ESConsumesCollector& cc, std::string record, std::string label)
        : token_{cc.consumesFrom<SiStripApvGain, SiStripApvGainSimRcd>(edm::ESInputTag{"", label})},
          recordLabel_{std::move(record), std::move(label)} {}
    edm::ESGetToken<SiStripApvGain, SiStripApvGainSimRcd> token_;
    std::pair<std::string, std::string> recordLabel_;
  };

  std::vector<TokenLabel> tokenLabels_;
  SiStripGainFactor factor_;
};

SiStripGainSimESProducer::SiStripGainSimESProducer(const edm::ParameterSet& iConfig) : factor_{iConfig} {
  auto cc = setWhatProduced(this);

  auto apvGainLabels = iConfig.getParameter<std::vector<edm::ParameterSet> >("APVGain");
  if (apvGainLabels.empty()) {
    throw cms::Exception("Configuration") << "Got empty APVGain vector, but need at least one entry";
  }

  // Fill the vector of apv labels
  for (const auto& gainPSet : apvGainLabels) {
    // Shouldn't all these parameters be tracked?
    tokenLabels_.emplace_back(
        cc, gainPSet.getParameter<std::string>("Record"), gainPSet.getUntrackedParameter<std::string>("Label", ""));
    factor_.push_back_norm(gainPSet.getUntrackedParameter<double>("NormalizationFactor", 1.));
  }

  factor_.resetIfBadNorm();
}

std::unique_ptr<SiStripGain> SiStripGainSimESProducer::produce(const SiStripGainSimRcd& iRecord) {
  const auto detInfo =
      SiStripDetInfoFileReader::read(edm::FileInPath{SiStripDetInfoFileReader::kDefaultFile}.fullPath());

  const auto& apvGain = iRecord.get(tokenLabels_[0].token_);
  auto gain = std::make_unique<SiStripGain>(apvGain, factor_.get(apvGain, 0), tokenLabels_[0].recordLabel_, detInfo);

  for (unsigned int i = 1; i < tokenLabels_.size(); ++i) {
    const auto& apvGain = iRecord.get(tokenLabels_[i].token_);
    gain->multiply(apvGain, factor_.get(apvGain, i), tokenLabels_[i].recordLabel_, detInfo);
  }
  return gain;
}

#include "FWCore/Framework/interface/ModuleFactory.h"

DEFINE_FWK_EVENTSETUP_MODULE(SiStripGainSimESProducer);