Go to the documentation of this file.00001
00002
00003
00004
00005
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) {
00045 switch (fId.ieta()) {
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 {
00060 switch (fId.ieta()) {
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;
00106
00107 edm::Handle<HBHERecHitCollection> hbhe;
00108 iEvent.getByLabel(mInputTag,hbhe);
00109
00110
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
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
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;
00133 }
00134 }
00135 }
00136 }
00137
00138
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;
00161 }
00162 }
00163 }
00164 }
00165 return true;
00166 }