Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 11:58:44

0001 // system include files
0002 #include <atomic>
0003 #include <memory>
0004 #include <cmath>
0005 
0006 // user include files
0007 #include "FWCore/Framework/interface/Frameworkfwd.h"
0008 #include "FWCore/Framework/interface/global/EDFilter.h"
0009 #include "FWCore/Framework/interface/Event.h"
0010 #include "FWCore/Framework/interface/EventSetup.h"
0011 #include "FWCore/Framework/interface/Run.h"
0012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0015 
0016 #include "DataFormats/Common/interface/Handle.h"
0017 #include "DataFormats/Common/interface/Ref.h"
0018 #include "DataFormats/HcalCalibObjects/interface/HcalHBHEMuonVariables.h"
0019 
0020 //#define EDM_ML_DEBUG
0021 //
0022 // class declaration
0023 //
0024 
0025 namespace alCaHcalHEMuonFilter {
0026   struct Counters {
0027     Counters() : nAll_(0), nGood_(0), nFinal_(0) {}
0028     mutable std::atomic<unsigned int> nAll_, nGood_, nFinal_;
0029   };
0030 }  // namespace alCaHcalHEMuonFilter
0031 
0032 class AlCaHcalHEMuonFilter : public edm::global::EDFilter<edm::RunCache<alCaHcalHEMuonFilter::Counters> > {
0033 public:
0034   AlCaHcalHEMuonFilter(edm::ParameterSet const&);
0035   ~AlCaHcalHEMuonFilter() override = default;
0036 
0037   std::shared_ptr<alCaHcalHEMuonFilter::Counters> globalBeginRun(edm::Run const&,
0038                                                                  edm::EventSetup const&) const override;
0039 
0040   bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override;
0041   void globalEndRun(edm::Run const& iRun, edm::EventSetup const&) const override;
0042   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0043 
0044 private:
0045   // ----------member data ---------------------------
0046   const int prescale_;
0047   const double muonptCut_, muonetaCut_;
0048   const edm::InputTag labelHBHEMuonVar_;
0049   const edm::EDGetTokenT<HcalHBHEMuonVariablesCollection> tokHBHEMuonVar_;
0050 };
0051 
0052 //
0053 // constructors and destructor
0054 //
0055 AlCaHcalHEMuonFilter::AlCaHcalHEMuonFilter(edm::ParameterSet const& iConfig)
0056     : prescale_(iConfig.getParameter<int>("prescale")),
0057       muonptCut_(iConfig.getParameter<double>("muonPtCut")),
0058       muonetaCut_(iConfig.getParameter<double>("muonEtaCut")),
0059       labelHBHEMuonVar_(iConfig.getParameter<edm::InputTag>("hbheMuonLabel")),
0060       tokHBHEMuonVar_(consumes<HcalHBHEMuonVariablesCollection>(labelHBHEMuonVar_)) {
0061   edm::LogVerbatim("HBHEMuon") << "Parameters read from config file \n\t prescale_ " << prescale_ << "\n\t Labels "
0062                                << labelHBHEMuonVar_;
0063 }  // AlCaHcalHEMuonFilter::AlCaHcalHEMuonFilter  constructor
0064 
0065 //
0066 // member functions
0067 //
0068 
0069 // ------------ method called on each new Event  ------------
0070 bool AlCaHcalHEMuonFilter::filter(edm::StreamID, edm::Event& iEvent, edm::EventSetup const&) const {
0071   bool accept(false);
0072   ++(runCache(iEvent.getRun().index())->nAll_);
0073 #ifdef EDM_ML_DEBUG
0074   edm::LogVerbatim("HBHEMuon") << "AlCaHcalHEMuonFilter::Run " << iEvent.id().run() << " Event " << iEvent.id().event()
0075                                << " Luminosity " << iEvent.luminosityBlock() << " Bunch " << iEvent.bunchCrossing();
0076 #endif
0077 
0078   auto const& hbheMuonColl = iEvent.getHandle(tokHBHEMuonVar_);
0079   if (hbheMuonColl.isValid()) {
0080     auto hbheMuon = hbheMuonColl.product();
0081     if (!hbheMuon->empty()) {
0082       bool ok(false);
0083       for (auto const& muon : *hbheMuon)
0084         if ((muon.ptGlob_ >= muonptCut_) && (std::abs(muon.etaGlob_) > muonetaCut_))
0085           ok = true;
0086 #ifdef EDM_ML_DEBUG
0087       edm::LogVerbatim("HBHEMuon") << "AlCaHcalHEMuonFilter::Flag for finding a muon with pt > " << muonptCut_
0088                                    << " and |eta| > " << muonetaCut_ << " is " << ok;
0089 #endif
0090       if (ok) {
0091         ++(runCache(iEvent.getRun().index())->nGood_);
0092         if (prescale_ <= 1)
0093           accept = true;
0094         else if (runCache(iEvent.getRun().index())->nGood_ % prescale_ == 1)
0095           accept = true;
0096       }
0097     }
0098   } else {
0099     edm::LogVerbatim("HBHEMuon") << "AlCaHcalHEMuonFilter::Cannot find the collection for HcalHBHEMuonVariables";
0100   }
0101 
0102   // Return the acceptance flag
0103   if (accept)
0104     ++(runCache(iEvent.getRun().index())->nFinal_);
0105 #ifdef EDM_ML_DEBUG
0106   edm::LogVerbatim("HBHEMuon") << "AlCaHcalHEMuonFilter::Accept flag " << accept << " All "
0107                                << runCache(iEvent.getRun().index())->nAll_ << " Good "
0108                                << runCache(iEvent.getRun().index())->nGood_ << " Final "
0109                                << runCache(iEvent.getRun().index())->nFinal_;
0110 #endif
0111   return accept;
0112 
0113 }  // AlCaHcalHEMuonFilter::filter
0114 
0115 // ------------ method called when starting to processes a run  ------------
0116 std::shared_ptr<alCaHcalHEMuonFilter::Counters> AlCaHcalHEMuonFilter::globalBeginRun(edm::Run const& iRun,
0117                                                                                      edm::EventSetup const&) const {
0118   edm::LogVerbatim("HBHEMuon") << "Start the Run " << iRun.run();
0119   return std::make_shared<alCaHcalHEMuonFilter::Counters>();
0120 }
0121 
0122 // ------------ method called when ending the processing of a run  ------------
0123 void AlCaHcalHEMuonFilter::globalEndRun(edm::Run const& iRun, edm::EventSetup const&) const {
0124   edm::LogVerbatim("HBHEMuon") << "Select " << runCache(iRun.index())->nFinal_ << " out of "
0125                                << runCache(iRun.index())->nGood_ << " good and " << runCache(iRun.index())->nAll_
0126                                << " total events";
0127 }
0128 
0129 // ------------ method fills 'descriptions' with the allowed parameters for the module  ------------
0130 void AlCaHcalHEMuonFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0131   edm::ParameterSetDescription desc;
0132   desc.add<int>("prescale", 1);
0133   desc.add<double>("muonPtCut", 20.0);
0134   desc.add<double>("muonEtaCut", 1.305);
0135   desc.add<edm::InputTag>("hbheMuonLabel", edm::InputTag("alcaHcalHBHEMuonProducer", "hbheMuon"));
0136   descriptions.add("alcaHcalHEMuonFilter", desc);
0137 }
0138 
0139 //define this as a plug-in
0140 #include "FWCore/Framework/interface/MakerMacros.h"
0141 
0142 DEFINE_FWK_MODULE(AlCaHcalHEMuonFilter);