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
#include "FWCore/ServiceRegistry/interface/Service.h"
#include "CondCore/DBOutputService/interface/PoolDBOutputService.h"

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

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

#include "CondTools/Ecal/interface/ESDBCopy.h"
#include <vector>

ESDBCopy::ESDBCopy(const edm::ParameterSet& iConfig)
    : m_timetype(iConfig.getParameter<std::string>("timetype")),
      m_cacheIDs(),
      m_records(),
      esPedestalsToken_(esConsumes()),
      esADCToGeVConstantToken_(esConsumes()),
      esChannelStatusToken_(esConsumes()),
      esIntercalibConstantsToken_(esConsumes()),
      esWeightStripGroupsToken_(esConsumes()),
      esTBWeightsToken_(esConsumes()) {
  std::string container;
  std::string record;
  typedef std::vector<edm::ParameterSet> Parameters;
  Parameters toCopy = iConfig.getParameter<Parameters>("toCopy");
  for (const auto& iparam : toCopy) {
    container = iparam.getParameter<std::string>("container");
    record = iparam.getParameter<std::string>("record");
    m_cacheIDs.emplace(container, 0);
    m_records.emplace(container, record);
  }
}

ESDBCopy::~ESDBCopy() {}

void ESDBCopy::analyze(const edm::Event& evt, const edm::EventSetup& evtSetup) {
  for (const auto& irec : m_records) {
    if (shouldCopy(evtSetup, irec.first)) {
      copyToDB(evtSetup, irec.first);
    }
  }
}

bool ESDBCopy::shouldCopy(const edm::EventSetup& evtSetup, const std::string& container) {
  unsigned long long cacheID = 0;
  if (container == "ESPedestals") {
    cacheID = evtSetup.get<ESPedestalsRcd>().cacheIdentifier();
  } else if (container == "ESADCToGeVConstant") {
    cacheID = evtSetup.get<ESADCToGeVConstantRcd>().cacheIdentifier();
  } else if (container == "ESIntercalibConstants") {
    cacheID = evtSetup.get<ESIntercalibConstantsRcd>().cacheIdentifier();
  } else if (container == "ESWeightStripGroups") {
    cacheID = evtSetup.get<ESWeightStripGroupsRcd>().cacheIdentifier();
  } else if (container == "ESTBWeights") {
    cacheID = evtSetup.get<ESTBWeightsRcd>().cacheIdentifier();
  } else if (container == "ESChannelStatus") {
    cacheID = evtSetup.get<ESChannelStatusRcd>().cacheIdentifier();
  } else {
    throw cms::Exception("Unknown container");
  }

  if (m_cacheIDs[container] == cacheID) {
    return false;
  } else {
    m_cacheIDs[container] = cacheID;
    return true;
  }
}

void ESDBCopy::copyToDB(const edm::EventSetup& evtSetup, const std::string& container) {
  edm::Service<cond::service::PoolDBOutputService> dbOutput;
  if (!dbOutput.isAvailable()) {
    throw cms::Exception("PoolDBOutputService is not available");
  }

  std::string recordName = m_records[container];

  if (container == "ESPedestals") {
    const auto& obj = evtSetup.getData(esPedestalsToken_);
    edm::LogInfo("ESDBCopy") << "ped pointer is: " << &obj;
    dbOutput->createOneIOV<const ESPedestals>(obj, dbOutput->beginOfTime(), recordName);

  } else if (container == "ESADCToGeVConstant") {
    const auto& obj = evtSetup.getData(esADCToGeVConstantToken_);
    edm::LogInfo("ESDBCopy") << "adc pointer is: " << &obj;
    dbOutput->createOneIOV<const ESADCToGeVConstant>(obj, dbOutput->beginOfTime(), recordName);

  } else if (container == "ESChannelStatus") {
    const auto& obj = evtSetup.getData(esChannelStatusToken_);
    edm::LogInfo("ESDBCopy") << "channel status pointer is: " << &obj;
    dbOutput->createOneIOV<const ESChannelStatus>(obj, dbOutput->beginOfTime(), recordName);

  } else if (container == "ESIntercalibConstants") {
    const auto& obj = evtSetup.getData(esIntercalibConstantsToken_);
    edm::LogInfo("ESDBCopy") << "inter pointer is: " << &obj;
    dbOutput->createOneIOV<const ESIntercalibConstants>(obj, dbOutput->beginOfTime(), recordName);

  } else if (container == "ESWeightStripGroups") {
    const auto& obj = evtSetup.getData(esWeightStripGroupsToken_);
    edm::LogInfo("ESDBCopy") << "weight pointer is: " << &obj;
    dbOutput->createOneIOV<const ESWeightStripGroups>(obj, dbOutput->beginOfTime(), recordName);

  } else if (container == "ESTBWeights") {
    const auto& obj = evtSetup.getData(esTBWeightsToken_);
    edm::LogInfo("ESDBCopy") << "tbweight pointer is: " << &obj;
    dbOutput->createOneIOV<const ESTBWeights>(obj, dbOutput->beginOfTime(), recordName);

  } else {
    throw cms::Exception("Unknown container");
  }

  edm::LogInfo("ESDBCopy") << "ESDBCopy wrote " << recordName;
}