00001 #include "RecoLocalCalo/HcalRecAlgos/interface/HFTimingTrustFlag.h"
00002 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalCaloFlagLabels.h"
00003
00004 namespace HFTimingTrust
00005 {
00006
00007
00008
00009 double timerr_hf(double rectime, double ampl);
00010
00011 template <class T, class V>
00012 void checkHFTimErr(T &rechit, const V &digi, int level1, int level2)
00013 {
00014
00015 double rectime = rechit.time();
00016
00017 if (rectime>-100 && rectime<250) {
00018
00019
00020 double ampl=0; double sum=0; int maxI = -1;
00021 for (int i=0;i<digi.size();++i) {
00022 sum += digi.sample(i).nominal_fC();
00023 if (digi.sample(i).nominal_fC()>ampl) {
00024 ampl = digi.sample(i).nominal_fC();
00025 maxI = i;
00026 }
00027 }
00028 if (ampl>1 && maxI>0 && maxI<digi.size()-1) {
00029 ampl = ampl + digi.sample(maxI-1).nominal_fC() + digi.sample(maxI+1).nominal_fC();
00030 ampl -= (sum-ampl)*3.0/(digi.size()-3);
00031 if (ampl>3) {
00032 int timerr = (int) timerr_hf(rectime,ampl);
00033 uint32_t status=0;
00034 if (timerr<0) status = 3;
00035 else if (timerr<=level1) status = 0;
00036 else if (timerr<=level2) status = 1;
00037 else status = 2;
00038 rechit.setFlagField(status,HcalCaloFlagLabels::HFTimingTrustBits,2);
00039 return;
00040 }
00041 }
00042
00043 }
00044
00045 rechit.setFlagField(3,HcalCaloFlagLabels::HFTimingTrustBits,2);
00046 return;
00047 }
00048
00049 static const float hfterrlut[195] = {
00050 3.42, 3.04, 9.18, 8.97, 8.49, 8.08, 8.01, 8.30, 8.75, 8.22, 7.21, 5.04, 2.98,
00051 2.04, 1.22, 7.58, 7.79, 7.11, 6.93, 7.03, 7.27, 7.23, 6.53, 4.59, 2.40, 1.46,
00052 1.31, 0.42, 5.95, 6.48, 6.29, 5.84, 5.97, 6.31, 6.00, 4.37, 2.37, 1.03, 0.72,
00053 0.81, 0.27, 3.98, 5.57, 5.04, 5.10, 5.21, 5.18, 4.22, 2.23, 1.07, 0.66, 0.40,
00054 0.48, 0.17, 2.51, 4.70, 4.28, 4.29, 4.36, 3.84, 2.40, 1.15, 0.68, 0.40, 0.24,
00055 0.29, 0.11, 0.81, 3.71, 3.47, 3.48, 3.52, 2.58, 1.25, 0.71, 0.41, 0.26, 0.16,
00056 0.16, 0.08, 0.27, 2.88, 2.63, 2.76, 2.33, 1.31, 0.72, 0.44, 0.27, 0.16, 0.11,
00057 0.10, 0.06, 0.15, 2.11, 2.00, 1.84, 1.46, 0.79, 0.45, 0.26, 0.17, 0.10, 0.08,
00058 0.05, 0.04, 0.10, 1.58, 1.49, 1.25, 0.90, 0.48, 0.29, 0.17, 0.10, 0.06, 0.06,
00059 0.02, 0.03, 0.06, 1.26, 1.03, 0.77, 0.57, 0.30, 0.18, 0.11, 0.06, 0.04, 0.05,
00060 0.01, 0.02, 0.04, 0.98, 0.66, 0.47, 0.39, 0.18, 0.11, 0.07, 0.04, 0.03, 0.04,
00061 0.01, 0.02, 0.02, 0.86, 0.44, 0.30, 0.27, 0.11, 0.07, 0.04, 0.03, 0.02, 0.04,
00062 0.01, 0.02, 0.02, 0.80, 0.30, 0.21, 0.17, 0.07, 0.04, 0.03, 0.02, 0.01, 0.04,
00063 0.01, 0.02, 0.01, 0.76, 0.22, 0.17, 0.12, 0.05, 0.03, 0.02, 0.01, 0.01, 0.04,
00064 0.01, 0.02, 0.01, 0.76, 0.17, 0.14, 0.09, 0.03, 0.02, 0.01, 0.01, 0.01, 0.04
00065 };
00066
00067 double timerr_hf(double rectime, double ampl)
00068 {
00069 int itim,iampl,index;
00070 double tim;
00071 if (rectime>0) tim=rectime-((int)(rectime/25))*25;
00072 else tim=rectime-((int)(rectime/25))*25+25;
00073 itim = (int) (tim/2.0);
00074
00075 iampl=0;
00076 static const double bampl[15]={3,5,8,12,19,30,47,73,115,182,287,452,712,1120,1766};
00077 if (ampl>=bampl[14]) iampl=14;
00078 else {
00079 for (int i=1;i<=14;i++) {
00080 if (ampl<bampl[i]) {
00081 iampl=i-1;
00082 break;
00083 }
00084 }
00085 }
00086
00087 index = itim + iampl*13;
00088
00089 double y1 = hfterrlut[index];
00090 double y2 = 0;
00091 double v1 = y1;
00092 if (itim<12) {
00093 y2 = hfterrlut[index+1];
00094 v1 = y1 + (y2-y1)*(tim/2.0-(float)itim);
00095 }
00096 double yy1 = 0;
00097 double yy2 = 0;
00098 double v2 = 0;
00099 if (iampl<14) {
00100 yy1 = hfterrlut[index+13];
00101 if (itim==12) v2 = yy1;
00102 else {
00103 yy2 = hfterrlut[index+14];
00104 v2 = yy1 + (yy2-yy1)*(tim/2.0-(float)itim);
00105 }
00106 v1 = v1 + (v2-v1)*(ampl-bampl[iampl])/(bampl[iampl+1]-bampl[iampl]);
00107 }
00108
00109 return v1;
00110 }
00111
00112 }
00113
00114 using namespace HFTimingTrust;
00115
00116 HFTimingTrustFlag::HFTimingTrustFlag()
00117 {
00118 HFTimingTrustLevel1_ = 1;
00119 HFTimingTrustLevel2_ = 4;
00120 }
00121
00122 HFTimingTrustFlag::HFTimingTrustFlag(int level1, int level2)
00123 {
00124 HFTimingTrustLevel1_ = level1;
00125 HFTimingTrustLevel2_ = level2;
00126 }
00127
00128 HFTimingTrustFlag::~HFTimingTrustFlag()
00129 {}
00130
00131 void HFTimingTrustFlag::setHFTimingTrustFlag(HFRecHit& rechit, const HFDataFrame& digi)
00132 {
00133 checkHFTimErr<HFRecHit, HFDataFrame>(rechit, digi, HFTimingTrustLevel1_, HFTimingTrustLevel2_);
00134 return;
00135 }
00136