Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:18:33

0001 // -*- C++ -*-
0002 //
0003 // Class:      HLTHcalMETNoiseFilter
0004 //
0005 /**\class HLTHcalMETNoiseFilter
0006 
0007  Description: HLT filter module for rejecting MET events due to noise in the HCAL
0008 
0009  Implementation:
0010      <Notes on implementation>
0011 */
0012 //
0013 // Original Author:  Leonard Apanasevich
0014 //         Created:  Wed Mar 25 16:01:27 CDT 2009
0015 //
0016 //
0017 
0018 #include "HLTrigger/JetMET/interface/HLTHcalMETNoiseFilter.h"
0019 
0020 #include "DataFormats/Common/interface/Handle.h"
0021 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0022 #include "FWCore/Framework/interface/ESHandle.h"
0023 #include "FWCore/Framework/interface/Event.h"
0024 #include "FWCore/Framework/interface/EventSetup.h"
0025 
0026 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0027 
0028 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0029 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0030 #include "FWCore/Utilities/interface/InputTag.h"
0031 
0032 #include <iostream>
0033 
0034 HLTHcalMETNoiseFilter::HLTHcalMETNoiseFilter(const edm::ParameterSet& iConfig)
0035     : HcalNoiseRBXCollectionTag_(iConfig.getParameter<edm::InputTag>("HcalNoiseRBXCollection")),
0036       m_theHcalNoiseToken(consumes<reco::HcalNoiseRBXCollection>(HcalNoiseRBXCollectionTag_)),
0037       severity_(iConfig.getParameter<int>("severity")),
0038       maxNumRBXs_(iConfig.getParameter<int>("maxNumRBXs")),
0039       numRBXsToConsider_(iConfig.getParameter<int>("numRBXsToConsider")),
0040       needEMFCoincidence_(iConfig.getParameter<bool>("needEMFCoincidence")),
0041       minRBXEnergy_(iConfig.getParameter<double>("minRBXEnergy")),
0042       minRatio_(iConfig.getParameter<double>("minRatio")),
0043       maxRatio_(iConfig.getParameter<double>("maxRatio")),
0044       minHPDHits_(iConfig.getParameter<int>("minHPDHits")),
0045       minRBXHits_(iConfig.getParameter<int>("minRBXHits")),
0046       minHPDNoOtherHits_(iConfig.getParameter<int>("minHPDNoOtherHits")),
0047       minZeros_(iConfig.getParameter<int>("minZeros")),
0048       minHighEHitTime_(iConfig.getParameter<double>("minHighEHitTime")),
0049       maxHighEHitTime_(iConfig.getParameter<double>("maxHighEHitTime")),
0050       maxRBXEMF_(iConfig.getParameter<double>("maxRBXEMF")),
0051       minRecHitE_(iConfig.getParameter<double>("minRecHitE")),
0052       minLowHitE_(iConfig.getParameter<double>("minLowHitE")),
0053       minHighHitE_(iConfig.getParameter<double>("minHighHitE")),
0054       minR45HitE_(iConfig.getParameter<double>("minR45HitE")),
0055       TS4TS5EnergyThreshold_(iConfig.getParameter<double>("TS4TS5EnergyThreshold")) {
0056   std::vector<double> TS4TS5UpperThresholdTemp = iConfig.getParameter<std::vector<double> >("TS4TS5UpperThreshold");
0057   std::vector<double> TS4TS5UpperCutTemp = iConfig.getParameter<std::vector<double> >("TS4TS5UpperCut");
0058   std::vector<double> TS4TS5LowerThresholdTemp = iConfig.getParameter<std::vector<double> >("TS4TS5LowerThreshold");
0059   std::vector<double> TS4TS5LowerCutTemp = iConfig.getParameter<std::vector<double> >("TS4TS5LowerCut");
0060 
0061   for (int i = 0; i < (int)TS4TS5UpperThresholdTemp.size() && i < (int)TS4TS5UpperCutTemp.size(); i++)
0062     TS4TS5UpperCut_.push_back(std::pair<double, double>(TS4TS5UpperThresholdTemp[i], TS4TS5UpperCutTemp[i]));
0063   sort(TS4TS5UpperCut_.begin(), TS4TS5UpperCut_.end());
0064 
0065   for (int i = 0; i < (int)TS4TS5LowerThresholdTemp.size() && i < (int)TS4TS5LowerCutTemp.size(); i++)
0066     TS4TS5LowerCut_.push_back(std::pair<double, double>(TS4TS5LowerThresholdTemp[i], TS4TS5LowerCutTemp[i]));
0067   sort(TS4TS5LowerCut_.begin(), TS4TS5LowerCut_.end());
0068 }
0069 
0070 void HLTHcalMETNoiseFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0071   edm::ParameterSetDescription desc;
0072   desc.add<edm::InputTag>("HcalNoiseRBXCollection", edm::InputTag("hltHcalNoiseInfoProducer"));
0073   desc.add<int>("severity", 1);
0074   desc.add<int>("maxNumRBXs", 2);
0075   desc.add<int>("numRBXsToConsider", 2);
0076   desc.add<bool>("needEMFCoincidence", true);
0077   desc.add<double>("minRBXEnergy", 50.0);
0078   desc.add<double>("minRatio", -999.);
0079   desc.add<double>("maxRatio", 999.);
0080   desc.add<int>("minHPDHits", 17);
0081   desc.add<int>("minRBXHits", 999);
0082   desc.add<int>("minHPDNoOtherHits", 10);
0083   desc.add<int>("minZeros", 10);
0084   desc.add<double>("minHighEHitTime", -9999.0);
0085   desc.add<double>("maxHighEHitTime", 9999.0);
0086   desc.add<double>("maxRBXEMF", 0.02);
0087   desc.add<double>("minRecHitE", 1.5);
0088   desc.add<double>("minLowHitE", 10.0);
0089   desc.add<double>("minHighHitE", 25.0);
0090   desc.add<double>("minR45HitE", 5.0);
0091   desc.add<double>("TS4TS5EnergyThreshold", 50.0);
0092 
0093   double TS4TS5UpperThresholdArray[5] = {70, 90, 100, 400, 4000};
0094   double TS4TS5UpperCutArray[5] = {1, 0.8, 0.75, 0.72, 0.72};
0095   double TS4TS5LowerThresholdArray[7] = {100, 120, 150, 200, 300, 400, 500};
0096   double TS4TS5LowerCutArray[7] = {-1, -0.7, -0.4, -0.2, -0.08, 0, 0.1};
0097   std::vector<double> TS4TS5UpperThreshold(TS4TS5UpperThresholdArray, TS4TS5UpperThresholdArray + 5);
0098   std::vector<double> TS4TS5UpperCut(TS4TS5UpperCutArray, TS4TS5UpperCutArray + 5);
0099   std::vector<double> TS4TS5LowerThreshold(TS4TS5LowerThresholdArray, TS4TS5LowerThresholdArray + 7);
0100   std::vector<double> TS4TS5LowerCut(TS4TS5LowerCutArray, TS4TS5LowerCutArray + 7);
0101 
0102   desc.add<std::vector<double> >("TS4TS5UpperThreshold", TS4TS5UpperThreshold);
0103   desc.add<std::vector<double> >("TS4TS5UpperCut", TS4TS5UpperCut);
0104   desc.add<std::vector<double> >("TS4TS5LowerThreshold", TS4TS5LowerThreshold);
0105   desc.add<std::vector<double> >("TS4TS5LowerCut", TS4TS5LowerCut);
0106   descriptions.add("hltHcalMETNoiseFilter", desc);
0107 }
0108 
0109 //
0110 // member functions
0111 //
0112 
0113 bool HLTHcalMETNoiseFilter::filter(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0114   using namespace reco;
0115 
0116   // in this case, do not filter anything
0117   if (severity_ == 0)
0118     return true;
0119 
0120   // get the RBXs produced by RecoMET/METProducers/HcalNoiseInfoProducer
0121   edm::Handle<HcalNoiseRBXCollection> rbxs_h;
0122   iEvent.getByToken(m_theHcalNoiseToken, rbxs_h);
0123   if (!rbxs_h.isValid()) {
0124     edm::LogError("DataNotFound") << "HLTHcalMETNoiseFilter: Could not find HcalNoiseRBXCollection product named "
0125                                   << HcalNoiseRBXCollectionTag_ << "." << std::endl;
0126     return true;
0127   }
0128 
0129   // reject events with too many RBXs
0130   if (static_cast<int>(rbxs_h->size()) > maxNumRBXs_)
0131     return true;
0132 
0133   // create a sorted set of the RBXs, ordered by energy
0134   noisedataset_t data;
0135   for (auto const& rbx : *rbxs_h) {
0136     CommonHcalNoiseRBXData d(rbx,
0137                              minRecHitE_,
0138                              minLowHitE_,
0139                              minHighHitE_,
0140                              TS4TS5EnergyThreshold_,
0141                              TS4TS5UpperCut_,
0142                              TS4TS5LowerCut_,
0143                              minR45HitE_);
0144     data.insert(d);
0145   }
0146 
0147   // data is now sorted by RBX energy
0148   // only consider top N=numRBXsToConsider_ energy RBXs
0149   int cntr = 0;
0150   for (auto it = data.begin(); it != data.end() && cntr < numRBXsToConsider_; ++it, ++cntr) {
0151     bool passFilter = true;
0152     bool passEMF = true;
0153     if (it->energy() > minRBXEnergy_) {
0154       if (it->validRatio() && it->ratio() < minRatio_)
0155         passFilter = false;
0156       else if (it->validRatio() && it->ratio() > maxRatio_)
0157         passFilter = false;
0158       else if (it->numHPDHits() >= minHPDHits_)
0159         passFilter = false;
0160       else if (it->numRBXHits() >= minRBXHits_)
0161         passFilter = false;
0162       else if (it->numHPDNoOtherHits() >= minHPDNoOtherHits_)
0163         passFilter = false;
0164       else if (it->numZeros() >= minZeros_)
0165         passFilter = false;
0166       else if (it->minHighEHitTime() < minHighEHitTime_)
0167         passFilter = false;
0168       else if (it->maxHighEHitTime() > maxHighEHitTime_)
0169         passFilter = false;
0170       else if (!it->PassTS4TS5())
0171         passFilter = false;
0172 
0173       if (it->RBXEMF() < maxRBXEMF_)
0174         passEMF = false;
0175     }
0176 
0177     if ((needEMFCoincidence_ && !passEMF && !passFilter) || (!needEMFCoincidence_ && !passFilter)) {
0178       LogDebug("") << "HLTHcalMETNoiseFilter debug: Found a noisy RBX: "
0179                    << "energy=" << it->energy() << "; "
0180                    << "ratio=" << it->ratio() << "; "
0181                    << "# RBX hits=" << it->numRBXHits() << "; "
0182                    << "# HPD hits=" << it->numHPDHits() << "; "
0183                    << "# Zeros=" << it->numZeros() << "; "
0184                    << "min time=" << it->minHighEHitTime() << "; "
0185                    << "max time=" << it->maxHighEHitTime() << "; "
0186                    << "passTS4TS5=" << it->PassTS4TS5() << "; "
0187                    << "RBX EMF=" << it->RBXEMF() << std::endl;
0188       return false;
0189     }
0190   }
0191 
0192   // no problems found
0193   return true;
0194 }