AlCaHcalHBHEMuonFilter

Counters

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
// system include files
#include <atomic>
#include <memory>
#include <cmath>

// user include files
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/global/EDFilter.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/Run.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"

#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/Common/interface/Ref.h"
#include "DataFormats/HcalCalibObjects/interface/HcalHBHEMuonVariables.h"

//#define EDM_ML_DEBUG
//
// class declaration
//

namespace alcaHcalHBHEMuonFilter {
  struct Counters {
    Counters() : nAll_(0), nGood_(0), nFinal_(0) {}
    mutable std::atomic<unsigned int> nAll_, nGood_, nFinal_;
  };
}  // namespace alcaHcalHBHEMuonFilter

class AlCaHcalHBHEMuonFilter : public edm::global::EDFilter<edm::RunCache<alcaHcalHBHEMuonFilter::Counters> > {
public:
  AlCaHcalHBHEMuonFilter(edm::ParameterSet const&);
  ~AlCaHcalHBHEMuonFilter() override = default;

  std::shared_ptr<alcaHcalHBHEMuonFilter::Counters> globalBeginRun(edm::Run const&,
                                                                   edm::EventSetup const&) const override;

  bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override;
  void globalEndRun(edm::Run const& iRun, edm::EventSetup const&) const override;
  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);

private:
  // ----------member data ---------------------------
  const int prescale_;
  const double minimumMuonP_;
  const edm::InputTag labelHBHEMuonVar_;
  const edm::EDGetTokenT<HcalHBHEMuonVariablesCollection> tokHBHEMuonVar_;
};

//
// constructors and destructor
//
AlCaHcalHBHEMuonFilter::AlCaHcalHBHEMuonFilter(edm::ParameterSet const& iConfig)
    : prescale_(iConfig.getParameter<int>("prescale")),
      minimumMuonP_(iConfig.getParameter<double>("minimumMuonP")),
      labelHBHEMuonVar_(iConfig.getParameter<edm::InputTag>("hbheMuonLabel")),
      tokHBHEMuonVar_(consumes<HcalHBHEMuonVariablesCollection>(labelHBHEMuonVar_)) {
  edm::LogVerbatim("HBHEMuon") << "Parameters read from config file \n\t prescale_ " << prescale_ << "\t minimumMuonP_ "
                               << minimumMuonP_ << "\n\t Labels " << labelHBHEMuonVar_;
}  // AlCaHcalHBHEMuonFilter::AlCaHcalHBHEMuonFilter  constructor

//
// member functions
//

// ------------ method called on each new Event  ------------
bool AlCaHcalHBHEMuonFilter::filter(edm::StreamID, edm::Event& iEvent, edm::EventSetup const&) const {
  bool accept(false);
  ++(runCache(iEvent.getRun().index())->nAll_);
#ifdef EDM_ML_DEBUG
  edm::LogVerbatim("HBHEMuon") << "AlCaHcalHBHEMuonFilter::Run " << iEvent.id().run() << " Event "
                               << iEvent.id().event() << " Luminosity " << iEvent.luminosityBlock() << " Bunch "
                               << iEvent.bunchCrossing();
#endif

  auto const& hbheMuonColl = iEvent.getHandle(tokHBHEMuonVar_);
  if (hbheMuonColl.isValid()) {
    auto hbheMuon = hbheMuonColl.product();
    if (!hbheMuon->empty()) {
      bool ok(false);
      for (auto const& muon : *hbheMuon)
        if (muon.pMuon_ >= minimumMuonP_)
          ok = true;
      if (ok) {
        ++(runCache(iEvent.getRun().index())->nGood_);
        if (prescale_ <= 1)
          accept = true;
        else if (runCache(iEvent.getRun().index())->nGood_ % prescale_ == 1)
          accept = true;
      }
    }
  } else {
    edm::LogVerbatim("HBHEMuon") << "AlCaHcalHBHEMuonFilter::Cannot find the collection for HcalHBHEMuonVariables";
  }

  // Return the acceptance flag
  if (accept)
    ++(runCache(iEvent.getRun().index())->nFinal_);
#ifdef EDM_ML_DEBUG
  edm::LogVerbatim("HBHEMuon") << "AlCaHcalHBHEMuonFilter::Accept flag " << accept << " All "
                               << runCache(iEvent.getRun().index())->nAll_ << " Good "
                               << runCache(iEvent.getRun().index())->nGood_ << " Final "
                               << runCache(iEvent.getRun().index())->nFinal_;
#endif
  return accept;

}  // AlCaHcalHBHEMuonFilter::filter

// ------------ method called when starting to processes a run  ------------
std::shared_ptr<alcaHcalHBHEMuonFilter::Counters> AlCaHcalHBHEMuonFilter::globalBeginRun(edm::Run const& iRun,
                                                                                         edm::EventSetup const&) const {
  edm::LogVerbatim("HBHEMuon") << "Start the Run " << iRun.run();
  return std::make_shared<alcaHcalHBHEMuonFilter::Counters>();
}

// ------------ method called when ending the processing of a run  ------------
void AlCaHcalHBHEMuonFilter::globalEndRun(edm::Run const& iRun, edm::EventSetup const&) const {
  edm::LogVerbatim("HBHEMuon") << "Select " << runCache(iRun.index())->nFinal_ << " out of "
                               << runCache(iRun.index())->nGood_ << " good and " << runCache(iRun.index())->nAll_
                               << " total events";
}

// ------------ method fills 'descriptions' with the allowed parameters for the module  ------------
void AlCaHcalHBHEMuonFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
  edm::ParameterSetDescription desc;
  desc.add<int>("prescale", 1);
  desc.add<double>("minimumMuonP", 5.0);
  desc.add<edm::InputTag>("hbheMuonLabel", edm::InputTag("alcaHcalHBHEMuonProducer", "hbheMuon"));
  descriptions.add("alcaHcalHBHEMuonFilter", desc);
}

//define this as a plug-in
#include "FWCore/Framework/interface/MakerMacros.h"

DEFINE_FWK_MODULE(AlCaHcalHBHEMuonFilter);