CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/HLTrigger/JetMET/src/HLTHPDFilter.cc

Go to the documentation of this file.
00001 /* \class HLTHPDFilter
00002  *
00003  * $Id: HLTHPDFilter.cc,v 1.5 2011/02/11 20:55:24 wdd Exp $
00004  *
00005  * Fedor Ratnikov (UMd) May 19, 2008
00006  */
00007 
00008 #include "HLTrigger/JetMET/interface/HLTHPDFilter.h"
00009 
00010 #include <math.h>
00011 
00012 #include <set>
00013 
00014 #include "DataFormats/Common/interface/Handle.h"
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016 #include "FWCore/Framework/interface/ESHandle.h"
00017 #include "FWCore/Framework/interface/Event.h"
00018 #include "FWCore/Framework/interface/EventSetup.h"
00019 
00020 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00021 #include "Geometry/CaloTopology/interface/HcalTopology.h"
00022 
00023 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
00024 
00025 #include "FWCore/ServiceRegistry/interface/Service.h"
00026 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00027 #include "TH1F.h"
00028 #include "TH2F.h"
00029 
00030 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
00031 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
00032 #include "FWCore/Utilities/interface/InputTag.h"
00033 
00034 namespace {
00035   enum Partition {HBM=0, HBP=1, HEM=2, HEP=3}; 
00036   std::pair<Partition,int> hpdId (HcalDetId fId) {
00037     int hpd = fId.iphi ();
00038     Partition partition = HBM;
00039     if (fId.subdet() == HcalBarrel) {
00040       partition = fId.ieta() > 0 ? HBP : HBM;
00041     }
00042     else if (fId.subdet() == HcalEndcap) {
00043       partition = fId.ieta() > 0 ? HEP : HEM;
00044       if ((fId.iphi ()-1) % 4 < 2) { // 1,2 
00045         switch (fId.ieta()) { // 1->2
00046         case 22:
00047         case 24:
00048         case 26:
00049         case 28:
00050           hpd = +1;
00051           break;
00052         case 29:
00053           if (fId.depth () == 1 || fId.depth () == 3) hpd += 1;
00054           break;
00055         default:
00056           break;
00057         }
00058       }
00059       else { // 3,4
00060         switch (fId.ieta()) { // 3->4
00061         case 21:
00062         case 23:
00063         case 25:
00064         case 27:
00065           hpd += 1;
00066           break;
00067         case 29:
00068           if (fId.depth () == 2) hpd += 1;
00069           break;
00070         default:
00071           break;
00072         }
00073       }
00074     }
00075     return std::pair<Partition,int> (partition, hpd);
00076   }
00077 }
00078 
00079 HLTHPDFilter::HLTHPDFilter(const edm::ParameterSet& iConfig)
00080   :  mInputTag (iConfig.getParameter <edm::InputTag> ("inputTag")),
00081      mEnergyThreshold (iConfig.getParameter <double> ("energy")),
00082      mHPDSpikeEnergyThreshold (iConfig.getParameter <double> ("hpdSpikeEnergy")),
00083      mHPDSpikeIsolationEnergyThreshold (iConfig.getParameter <double> ("hpdSpikeIsolationEnergy")),
00084      mRBXSpikeEnergyThreshold (iConfig.getParameter <double> ("rbxSpikeEnergy")),
00085      mRBXSpikeUnbalanceThreshold (iConfig.getParameter <double> ("rbxSpikeUnbalance"))
00086 {
00087 }
00088 
00089 HLTHPDFilter::~HLTHPDFilter(){}
00090 
00091 void
00092 HLTHPDFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
00093   edm::ParameterSetDescription desc;
00094   desc.add<edm::InputTag>("inputTag",edm::InputTag("hltHbhereco"));
00095   desc.add<double>("energy",-99.0);
00096   desc.add<double>("hpdSpikeEnergy",10.0);
00097   desc.add<double>("hpdSpikeIsolationEnergy",1.0);
00098   desc.add<double>("rbxSpikeEnergy",50.0);
00099   desc.add<double>("rbxSpikeUnbalance",0.2);
00100   descriptions.add("hltHPDFilter",desc);
00101 }
00102 
00103 bool HLTHPDFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00104 {
00105   if (mHPDSpikeEnergyThreshold <= 0 && mRBXSpikeEnergyThreshold <= 0) return true; // nothing to filter
00106   // get hits
00107   edm::Handle<HBHERecHitCollection> hbhe;
00108   iEvent.getByLabel(mInputTag,hbhe);
00109   
00110   // collect energies
00111   float hpdEnergy[4][73];
00112   for (size_t i = 0; i < 4; ++i) for (size_t j = 0; j < 73; ++j) hpdEnergy[i][j] = 0;
00113   
00114   // select hist above threshold
00115   for (unsigned i = 0; i < hbhe->size(); ++i) {
00116     if ((*hbhe)[i].energy() > mEnergyThreshold) {
00117       std::pair<Partition,int> hpd = hpdId ((*hbhe)[i].id());
00118       hpdEnergy[int (hpd.first)][hpd.second] += (*hbhe)[i].energy ();
00119     }
00120   }
00121   
00122   // not single HPD spike
00123   if (mHPDSpikeEnergyThreshold > 0) {
00124     for (size_t partition = 0; partition < 4; ++partition) {
00125       for (size_t i = 1; i < 73; ++i) {
00126         if (hpdEnergy [partition][i] > mHPDSpikeEnergyThreshold) {
00127           int hpdPlus = i + 1;
00128           if (hpdPlus == 73) hpdPlus = 1;
00129           int hpdMinus = i - 1;
00130           if (hpdMinus == 0) hpdMinus = 72;
00131           double maxNeighborEnergy = fmax (hpdEnergy[partition][hpdPlus], hpdEnergy[partition][hpdMinus]);
00132           if (maxNeighborEnergy < mHPDSpikeIsolationEnergyThreshold)  return false; // HPD spike found
00133         }
00134       }
00135     }  
00136   }
00137 
00138   // not RBX flash
00139   if (mRBXSpikeEnergyThreshold > 0) {
00140     for (size_t partition = 0; partition < 4; ++partition) {
00141       for (size_t rbx = 1; rbx < 19; ++rbx) {
00142         int ifirst = (rbx-1)*4-1;
00143         int iend = (rbx-1)*4+3;
00144         double minEnergy = 0;
00145         double maxEnergy = -1;
00146         double totalEnergy = 0;
00147         for (int irm = ifirst; irm < iend; ++irm) {
00148           int hpd = irm;
00149           if (hpd <= 0) hpd = 72 + hpd;
00150           totalEnergy += hpdEnergy[partition][hpd];
00151           if (minEnergy > maxEnergy) {
00152             minEnergy = maxEnergy = hpdEnergy[partition][hpd];
00153           }
00154           else {
00155             if (hpdEnergy[partition][hpd] < minEnergy) minEnergy = hpdEnergy[partition][hpd];
00156             if (hpdEnergy[partition][hpd] > maxEnergy) maxEnergy = hpdEnergy[partition][hpd];
00157           }
00158         }
00159         if (totalEnergy > mRBXSpikeEnergyThreshold) {
00160           if (minEnergy / maxEnergy > mRBXSpikeUnbalanceThreshold) return false; // likely HPF flash
00161         }
00162       }
00163     }
00164   }
00165   return true;
00166 }