CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/RecoLocalCalo/HcalRecAlgos/src/HFTimingTrustFlag.cc

Go to the documentation of this file.
00001 #include "RecoLocalCalo/HcalRecAlgos/interface/HFTimingTrustFlag.h"
00002 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalCaloFlagLabels.h"
00003 
00004 namespace HFTimingTrust 
00005 {
00006   // Template class checks HF timing, sets rechit 
00007   // timing status bits according to its uncertainty;
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     // Get rechit timing
00015     double rectime = rechit.time();
00016 
00017     if (rectime>-100 && rectime<250) {
00018 
00019       // Get signal from digi
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; // unreconstructable time
00035           else if (timerr<=level1) status = 0; // time reconstructed; precision better than level1 value
00036           else if (timerr<=level2) status = 1; // precision worse than level1 value
00037           else status = 2; //precision worse than level 2 value
00038           rechit.setFlagField(status,HcalCaloFlagLabels::HFTimingTrustBits,2);
00039           return;
00040         }
00041       }
00042 
00043     } // if (rectime > -100 && rectime < -250)
00044     // if rectime outside expected range, set flag field to 3 (unreconstructable)?
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; // time precision 1ns
00119   HFTimingTrustLevel2_ = 4; // time precision 4ns
00120 }
00121 
00122 HFTimingTrustFlag::HFTimingTrustFlag(int level1, int level2)
00123 {
00124   HFTimingTrustLevel1_ = level1; // allow user to set t-trust level
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