TkInstLumiTableProducer

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
#include "DataFormats/NanoAOD/interface/FlatTable.h"
#include "DataFormats/OnlineMetaData/interface/OnlineLuminosityRecord.h"
#include "DataFormats/Scalers/interface/LumiScalers.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"

class TkInstLumiTableProducer : public edm::stream::EDProducer<> {
public:
  explicit TkInstLumiTableProducer(const edm::ParameterSet& params)
      : m_name(params.getParameter<std::string>("name")),
        m_doc(params.existsAs<std::string>("doc") ? params.getParameter<std::string>("doc") : ""),
        m_extension(params.existsAs<bool>("extension") ? params.getParameter<bool>("extension") : false),
        m_scalerToken(consumes<LumiScalersCollection>(params.getParameter<edm::InputTag>("lumiScalers"))),
        m_metaDataToken(consumes<OnlineLuminosityRecord>(params.getParameter<edm::InputTag>("metadata"))) {
    produces<nanoaod::FlatTable>();
  }

  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
    edm::ParameterSetDescription desc;
    desc.add<std::string>("name", "");
    desc.add<std::string>("doc", "");
    desc.add<bool>("extension", false);
    desc.add<edm::InputTag>("lumiScalers", edm::InputTag("scalersRawToDigi"));
    desc.add<edm::InputTag>("metadata", edm::InputTag("onlineMetaDataDigis"));
    descriptions.add("tkInstLumiTable", desc);
  }

  void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;

private:
  const std::string m_name;
  const std::string m_doc;
  bool m_extension;

  const edm::EDGetTokenT<LumiScalersCollection> m_scalerToken;
  const edm::EDGetTokenT<OnlineLuminosityRecord> m_metaDataToken;
};

void TkInstLumiTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
  auto out = std::make_unique<nanoaod::FlatTable>(1, m_name, true, m_extension);

  out->addColumnValue<int>("bx", iEvent.bunchCrossing(), "Bunch-crossing ID");

  float instLumi{0.}, pu{0.};
  edm::Handle<LumiScalersCollection> lumiScalers = iEvent.getHandle(m_scalerToken);
  edm::Handle<OnlineLuminosityRecord> metaData = iEvent.getHandle(m_metaDataToken);

  if (lumiScalers.isValid() && !lumiScalers->empty()) {
    if (lumiScalers->begin() != lumiScalers->end()) {
      instLumi = lumiScalers->begin()->instantLumi();
      pu = lumiScalers->begin()->pileup();
    }
  } else if (metaData.isValid()) {
    instLumi = metaData->instLumi();
    pu = metaData->avgPileUp();
  } else {
    edm::LogInfo("TkInstLumiTableProducer")
        << "Luminosity related collections not found in the event; will write dummy values";
  }

  out->addColumnValue<float>("instLumi", instLumi, "Instantaneous luminosity");
  out->addColumnValue<float>("PU", pu, "Pileup");

  iEvent.put(std::move(out));
}

#include "FWCore/PluginManager/interface/ModuleDef.h"
#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(TkInstLumiTableProducer);