ProductAdder

ProductAdderT

SiStripQualityESProducer

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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
// -*- C++ -*-
//
// Package:    SiStripQualityESProducer
// Class:      SiStripQualityESProducer
//
/**\class SiStripQualityESProducer SiStripQualityESProducer.h CalibTracker/SiStripESProducers/plugins/real/SiStripQualityESProducer.cc

 Description: <one line class summary>

 Implementation:
     <Notes on implementation>
*/
//
// Original Author:  Domenico GIORDANO
//         Created:  Wed Oct  3 12:11:10 CEST 2007
//
//

// system include files
#include <memory>

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

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

#include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
#include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
#include "CalibTracker/Records/interface/SiStripDependentRecords.h"
#include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"
#include "CondFormats/RunInfo/interface/RunInfo.h"

namespace {
  class ProductAdder {
  public:
    virtual ~ProductAdder() = default;
    virtual void add(const SiStripQualityRcd& iRecord, SiStripQuality& quality) const = 0;
  };

  template <typename Product, typename RealRecord>
  class ProductAdderT : public ProductAdder {
  public:
    ProductAdderT(edm::ESConsumesCollector& cc, const std::string& label)
        : token_{cc.consumesFrom<Product, RealRecord>(edm::ESInputTag{"", label})} {}
    void add(const SiStripQualityRcd& iRecord, SiStripQuality& quality) const override {
      quality.add(&iRecord.get(token_));
    }

  private:
    edm::ESGetToken<Product, RealRecord> token_;
  };

  template <typename Product, typename RealRecord>
  auto make_ProductAdder(edm::ESConsumesCollector& cc, const std::string& label) {
    return std::make_unique<ProductAdderT<Product, RealRecord>>(cc, label);
  }
}  // namespace

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

  std::unique_ptr<SiStripQuality> produce(const SiStripQualityRcd&);

private:
  std::vector<std::unique_ptr<const ProductAdder>> productAdders_;
  edm::ESGetToken<RunInfo, RunInfoRcd> runInfoToken_;

  const double thresholdForReducedGranularity_;
  const bool printDebugOutput_;
  const bool useEmptyRunInfo_;
  const bool reduceGranularity_;
};

SiStripQualityESProducer::SiStripQualityESProducer(const edm::ParameterSet& iConfig)
    : thresholdForReducedGranularity_{iConfig.getParameter<double>("ThresholdForReducedGranularity")},
      printDebugOutput_{iConfig.getParameter<bool>("PrintDebugOutput")},
      useEmptyRunInfo_{iConfig.getParameter<bool>("UseEmptyRunInfo")},
      reduceGranularity_{iConfig.getParameter<bool>("ReduceGranularity")} {
  auto cc = setWhatProduced(this);

  edm::LogInfo("SiStripQualityESProducer") << "ctor";

  bool doRunInfo = false;
  std::string runInfoTagName = "";

  auto toGet = iConfig.getParameter<std::vector<edm::ParameterSet>>("ListOfRecordToMerge");

  for (const auto& toGetPSet : toGet) {
    auto tagName = toGetPSet.getParameter<std::string>("tag");
    auto recordName = toGetPSet.getParameter<std::string>("record");

    edm::LogInfo("SiStripQualityESProducer")
        << "[SiStripQualityESProducer::ctor] Going to get data from record " << recordName << " with tag " << tagName;

    if (recordName == "SiStripBadModuleRcd") {
      productAdders_.emplace_back(make_ProductAdder<SiStripBadStrip, SiStripBadModuleRcd>(cc, tagName));
    } else if (recordName == "SiStripBadFiberRcd") {
      productAdders_.emplace_back(make_ProductAdder<SiStripBadStrip, SiStripBadFiberRcd>(cc, tagName));
    } else if (recordName == "SiStripBadChannelRcd") {
      productAdders_.emplace_back(make_ProductAdder<SiStripBadStrip, SiStripBadChannelRcd>(cc, tagName));
    } else if (recordName == "SiStripBadStripRcd") {
      productAdders_.emplace_back(make_ProductAdder<SiStripBadStrip, SiStripBadStripRcd>(cc, tagName));
    } else if (recordName == "SiStripDetCablingRcd") {
      productAdders_.emplace_back(make_ProductAdder<SiStripDetCabling, SiStripDetCablingRcd>(cc, tagName));
    } else if (recordName == "SiStripDetVOffRcd") {
      productAdders_.emplace_back(make_ProductAdder<SiStripDetVOff, SiStripDetVOffRcd>(cc, tagName));
    } else if (recordName == "RunInfoRcd") {
      runInfoTagName = tagName;
      doRunInfo = true;
    } else {
      // Would it make sense to elevate this to an exception?
      edm::LogError("SiStripQualityESProducer")
          << "[SiStripQualityESProducer::ctor] Skipping the requested data for unexisting record " << recordName
          << " with tag " << tagName << std::endl;
      continue;
    }
  }

  if (doRunInfo) {
    runInfoToken_ = cc.consumes(edm::ESInputTag{"", runInfoTagName});
  }
}

std::unique_ptr<SiStripQuality> SiStripQualityESProducer::produce(const SiStripQualityRcd& iRecord) {
  const auto detInfo =
      SiStripDetInfoFileReader::read(edm::FileInPath{SiStripDetInfoFileReader::kDefaultFile}.fullPath());
  auto quality = std::make_unique<SiStripQuality>(detInfo);
  edm::LogInfo("SiStripQualityESProducer") << "produce called";

  // Set the debug output level
  quality->setPrintDebugOutput(printDebugOutput_);
  // Set the protection against empty RunInfo objects
  quality->setUseEmptyRunInfo(useEmptyRunInfo_);

  for (const auto& adder : productAdders_) {
    adder->add(iRecord, *quality);
  }

  // We do this after all the others so we know it is done after the DetCabling (if any)
  if (runInfoToken_.isInitialized()) {
    quality->add(&iRecord.get(runInfoToken_));
  }

  quality->cleanUp();

  if (reduceGranularity_) {
    quality->ReduceGranularity(thresholdForReducedGranularity_);
    quality->cleanUp(true);
  }

  quality->fillBadComponents();

  return quality;
}

DEFINE_FWK_EVENTSETUP_MODULE(SiStripQualityESProducer);