Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:01:09

0001 // -*- C++ -*-
0002 //
0003 // Package:    HBHENoiseFilterResultProducer
0004 // Class:      HBHENoiseFilterResultProducer
0005 //
0006 /**\class HBHENoiseFilterResultProducer
0007 
0008  Description: Produces the result from the HBENoiseFilter
0009 
0010  Implementation:
0011               Use the HcalNoiseSummary to make cuts on an event-by-event basis
0012 */
0013 //
0014 // Original Author:  John Paul Chou (Brown)
0015 //
0016 //
0017 
0018 #include <iostream>
0019 
0020 // system include files
0021 #include <memory>
0022 #include <map>
0023 
0024 // user include files
0025 #include "FWCore/Framework/interface/Frameworkfwd.h"
0026 #include "FWCore/Framework/interface/stream/EDProducer.h"
0027 
0028 #include "FWCore/Framework/interface/Event.h"
0029 #include "FWCore/Framework/interface/MakerMacros.h"
0030 #include "FWCore/Utilities/interface/Exception.h"
0031 
0032 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0033 
0034 #include "DataFormats/METReco/interface/HcalNoiseSummary.h"
0035 #include "DataFormats/JetReco/interface/PFJetCollection.h"
0036 
0037 //
0038 // class declaration
0039 //
0040 
0041 class HBHENoiseFilterResultProducer : public edm::stream::EDProducer<> {
0042 public:
0043   explicit HBHENoiseFilterResultProducer(const edm::ParameterSet&);
0044   ~HBHENoiseFilterResultProducer() override;
0045 
0046 private:
0047   void produce(edm::Event&, const edm::EventSetup&) override;
0048 
0049   // ----------member data ---------------------------
0050 
0051   // parameters
0052   edm::EDGetTokenT<HcalNoiseSummary> noisetoken_;
0053   int minHPDHits_;
0054   int minHPDNoOtherHits_;
0055   int minZeros_;
0056 
0057   bool IgnoreTS4TS5ifJetInLowBVRegion_;
0058   std::string defaultDecision_;
0059 
0060   int minNumIsolatedNoiseChannels_;
0061   double minIsolatedNoiseSumE_;
0062   double minIsolatedNoiseSumEt_;
0063 
0064   edm::EDGetTokenT<unsigned int> bunchSpacing_;
0065   bool useBunchSpacingProducer_;
0066 
0067   // other members
0068   std::map<std::string, bool> decisionMap_;
0069 };
0070 
0071 //
0072 // constructors and destructor
0073 //
0074 
0075 HBHENoiseFilterResultProducer::HBHENoiseFilterResultProducer(const edm::ParameterSet& iConfig) {
0076   //now do what ever initialization is needed
0077   noisetoken_ = consumes<HcalNoiseSummary>(iConfig.getParameter<edm::InputTag>("noiselabel"));
0078   minHPDHits_ = iConfig.getParameter<int>("minHPDHits");
0079   minHPDNoOtherHits_ = iConfig.getParameter<int>("minHPDNoOtherHits");
0080   minZeros_ = iConfig.getParameter<int>("minZeros");
0081   IgnoreTS4TS5ifJetInLowBVRegion_ = iConfig.getParameter<bool>("IgnoreTS4TS5ifJetInLowBVRegion");
0082   defaultDecision_ = iConfig.getParameter<std::string>("defaultDecision");
0083 
0084   // parameters related to isolation filter
0085   minNumIsolatedNoiseChannels_ = iConfig.getParameter<int>("minNumIsolatedNoiseChannels");
0086   minIsolatedNoiseSumE_ = iConfig.getParameter<double>("minIsolatedNoiseSumE");
0087   minIsolatedNoiseSumEt_ = iConfig.getParameter<double>("minIsolatedNoiseSumEt");
0088 
0089   // parameters needed for bunch-spacing check
0090   bunchSpacing_ = consumes<unsigned int>(edm::InputTag("bunchSpacingProducer"));
0091   useBunchSpacingProducer_ = iConfig.getParameter<bool>("useBunchSpacingProducer");
0092 
0093   produces<bool>("HBHENoiseFilterResult");
0094   produces<bool>("HBHENoiseFilterResultRun1");
0095   produces<bool>("HBHENoiseFilterResultRun2Loose");
0096   produces<bool>("HBHENoiseFilterResultRun2Tight");
0097   produces<bool>("HBHEIsoNoiseFilterResult");
0098 }
0099 
0100 HBHENoiseFilterResultProducer::~HBHENoiseFilterResultProducer() {}
0101 
0102 //
0103 // member functions
0104 //
0105 
0106 // ------------ method called on each new Event  ------------
0107 void HBHENoiseFilterResultProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0108   using namespace edm;
0109 
0110   // get the Noise summary object
0111   edm::Handle<HcalNoiseSummary> summary_h;
0112   iEvent.getByToken(noisetoken_, summary_h);
0113   if (!summary_h.isValid()) {
0114     throw edm::Exception(edm::errors::ProductNotFound) << " could not find HcalNoiseSummary.\n";
0115     return;
0116   }
0117   const HcalNoiseSummary& summary(*summary_h);
0118 
0119   bool goodJetFoundInLowBVRegion = false;
0120   if (IgnoreTS4TS5ifJetInLowBVRegion_)
0121     goodJetFoundInLowBVRegion = summary.goodJetFoundInLowBVRegion();
0122 
0123   const bool failCommon = summary.maxHPDHits() >= minHPDHits_ || summary.maxHPDNoOtherHits() >= minHPDNoOtherHits_ ||
0124                           summary.maxZeros() >= minZeros_;
0125 
0126   const bool failRun1 = failCommon || (summary.HasBadRBXTS4TS5() && !goodJetFoundInLowBVRegion);
0127   decisionMap_["HBHENoiseFilterResultRun1"] = failRun1;
0128 
0129   const bool failRun2Loose = failCommon || (summary.HasBadRBXRechitR45Loose() && !goodJetFoundInLowBVRegion);
0130   decisionMap_["HBHENoiseFilterResultRun2Loose"] = failRun2Loose;
0131 
0132   const bool failRun2Tight = failCommon || (summary.HasBadRBXRechitR45Tight() && !goodJetFoundInLowBVRegion);
0133   decisionMap_["HBHENoiseFilterResultRun2Tight"] = failRun2Tight;
0134 
0135   // Write out the standard flags
0136   std::unique_ptr<bool> pOut;
0137   for (std::map<std::string, bool>::const_iterator it = decisionMap_.begin(); it != decisionMap_.end(); ++it) {
0138     pOut = std::make_unique<bool>(!it->second);
0139     iEvent.put(std::move(pOut), it->first);
0140   }
0141 
0142   // Overwrite defaultDecision_ dynamically based on bunchSpacingProducer
0143   if (useBunchSpacingProducer_) {
0144     edm::Handle<unsigned int> bunchSpacingH;
0145     iEvent.getByToken(bunchSpacing_, bunchSpacingH);
0146     unsigned int bunchspacing = 0;
0147     if (bunchSpacingH.isValid()) {
0148       bunchspacing = *bunchSpacingH;
0149       if (bunchspacing == 50) {
0150         defaultDecision_ = "HBHENoiseFilterResultRun1";
0151       } else {
0152         defaultDecision_ = "HBHENoiseFilterResultRun2Loose";
0153       }
0154     }
0155   }
0156 
0157   // Write out the default flag
0158   std::map<std::string, bool>::const_iterator it = decisionMap_.find(defaultDecision_);
0159   if (it == decisionMap_.end())
0160     throw cms::Exception("Invalid HBHENoiseFilterResultProducer parameter \"defaultDecision\"");
0161   pOut = std::make_unique<bool>(!it->second);
0162   iEvent.put(std::move(pOut), "HBHENoiseFilterResult");
0163 
0164   // Check isolation requirements
0165   const bool failIsolation = summary.numIsolatedNoiseChannels() >= minNumIsolatedNoiseChannels_ ||
0166                              summary.isolatedNoiseSumE() >= minIsolatedNoiseSumE_ ||
0167                              summary.isolatedNoiseSumEt() >= minIsolatedNoiseSumEt_;
0168   pOut = std::make_unique<bool>(!failIsolation);
0169   iEvent.put(std::move(pOut), "HBHEIsoNoiseFilterResult");
0170 
0171   return;
0172 }
0173 
0174 //define this as a plug-in
0175 DEFINE_FWK_MODULE(HBHENoiseFilterResultProducer);