Go to the documentation of this file.00001 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalHFStatusBitFromRecHits.h"
00002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00003 #include "Geometry/HcalTowerAlgo/src/HcalHardcodeGeometryData.h"
00004
00005 #include <algorithm>
00006 #include <cmath>
00007 #include <iostream>
00008
00009 HcalHFStatusBitFromRecHits::HcalHFStatusBitFromRecHits()
00010 {
00011
00012 long_HFlongshortratio_ = 0.99;
00013 short_HFlongshortratio_ = 0.99;
00014 long_thresholdET_ = 0.5;
00015 short_thresholdET_ = 0.5;
00016 long_thresholdEnergy_ = 100;
00017 short_thresholdEnergy_ = 100;
00018 }
00019
00020 HcalHFStatusBitFromRecHits::HcalHFStatusBitFromRecHits(double shortR, double shortET, double shortE,
00021 double longR, double longET, double longE)
00022 {
00023 long_HFlongshortratio_ = longR;
00024 short_HFlongshortratio_ = shortR;
00025 long_thresholdET_ = longET;
00026 short_thresholdET_ = shortET;
00027 long_thresholdEnergy_ = longE;
00028 short_thresholdEnergy_ = shortE;
00029 }
00030
00031 HcalHFStatusBitFromRecHits::~HcalHFStatusBitFromRecHits(){}
00032
00033 void HcalHFStatusBitFromRecHits::hfSetFlagFromRecHits(HFRecHitCollection& rec,
00034 HcalChannelQuality* myqual,
00035 const HcalSeverityLevelComputer* mySeverity)
00036 {
00037
00038 int status;
00039 float en, en2;
00040 int ieta, iphi, depth;
00041 float ratio;
00042 double coshEta;
00043
00044
00045 for (HFRecHitCollection::iterator iHF=rec.begin(); iHF!=rec.end();++iHF)
00046 {
00047
00048
00049
00050 ieta =iHF->id().ieta();
00051
00052 coshEta=fabs(cosh(0.5*(theHFEtaBounds[abs(ieta)-29]+theHFEtaBounds[abs(ieta)-28])));
00053
00054 status=0;
00055
00056 en2=-999;
00057 depth=iHF->id().depth();
00058 en=iHF->energy();
00059
00060 if (depth==1)
00061 {
00062 if (en<1.2) continue;
00063 if (long_thresholdEnergy_>0. && en<long_thresholdEnergy_) continue;
00064 if (long_thresholdET_>0. && en<long_thresholdET_*coshEta) continue;
00065 }
00066
00067 else if (depth==2)
00068 {
00069 if (en<1.8) continue;
00070 if (short_thresholdEnergy_>0. && en<short_thresholdEnergy_) continue;
00071 if (short_thresholdET_>0. && en<short_thresholdET_*coshEta) continue;
00072 }
00073
00074 iphi =iHF->id().iphi();
00075
00076
00077
00078
00079 HcalDetId partner(HcalForward, ieta, iphi, 3-depth);
00080 DetId detpartner=DetId(partner);
00081 const HcalChannelStatus* partnerstatus=myqual->getValues(detpartner.rawId());
00082 if (mySeverity->dropChannel(partnerstatus->getValue() ) ) continue;
00083
00084
00085 for (HFRecHitCollection::iterator iHF2=rec.begin(); iHF2!=rec.end();++iHF2)
00086 {
00087 if (iHF2->id().ieta()!=ieta) continue;
00088 if (iHF2->id().iphi()!=iphi) continue;
00089 if (iHF2->id().depth()==depth) continue;
00090
00091 en2=iHF2->energy();
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 ratio = (en - en2)/(en + en2);
00104
00105 if (depth==1 && ratio>long_HFlongshortratio_)
00106 status=1;
00107 else if (depth==2 && ratio>short_HFlongshortratio_)
00108 status=1;
00109 break;
00110 }
00111
00112
00113 if (en2==-999)
00114 status=1;
00115
00116
00117 if (status==1)
00118 iHF->setFlagField(status,HcalCaloFlagLabels::HFLongShort, 1);
00119 }
00120 return;
00121 }