Go to the documentation of this file.00001 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalHFStatusBitFromDigis.h"
00002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00003
00004 #include <algorithm>
00005 #include <math.h>
00006 #include <iostream>
00007
00008 HcalHFStatusBitFromDigis::HcalHFStatusBitFromDigis()
00009 {
00010
00011 minthreshold_=40;
00012 recoFirstSample_=0;
00013 recoSamplesToAdd_=10;
00014 firstSample_=3;
00015 samplesToAdd_=4;
00016 expectedPeak_=4;
00017
00018
00019 coef0_= 0.93;
00020 coef1_ = -0.38275;
00021 coef2_ = -0.012667;
00022
00023 HFlongwindowEthresh_=40;
00024 HFlongwindowMinTime_.clear();
00025 HFlongwindowMinTime_.push_back(-10);
00026 HFlongwindowMaxTime_.clear();
00027 HFlongwindowMaxTime_.push_back(8);
00028 HFshortwindowEthresh_=40;
00029 HFshortwindowMinTime_.clear();
00030 HFshortwindowMinTime_.push_back(-10);
00031 HFshortwindowMaxTime_.clear();
00032 HFshortwindowMaxTime_.push_back(8);
00033 }
00034
00035 HcalHFStatusBitFromDigis::HcalHFStatusBitFromDigis(int recoFirstSample,
00036 int recoSamplesToAdd,
00037 const edm::ParameterSet& HFDigiTimeParams,
00038 const edm::ParameterSet& HFTimeInWindowParams)
00039 {
00040 recoFirstSample_ = recoFirstSample;
00041 recoSamplesToAdd_ = recoSamplesToAdd;
00042
00043
00044 firstSample_ = HFDigiTimeParams.getParameter<int>("HFdigiflagFirstSample");
00045 samplesToAdd_ = HFDigiTimeParams.getParameter<int>("HFdigiflagSamplesToAdd");
00046 expectedPeak_ = HFDigiTimeParams.getParameter<int>("HFdigiflagExpectedPeak");
00047 minthreshold_ = HFDigiTimeParams.getParameter<double>("HFdigiflagMinEthreshold");
00048 coef0_ = HFDigiTimeParams.getParameter<double>("HFdigiflagCoef0");
00049 coef1_ = HFDigiTimeParams.getParameter<double>("HFdigiflagCoef1");
00050 coef2_ = HFDigiTimeParams.getParameter<double>("HFdigiflagCoef2");
00051
00052
00053 HFlongwindowMinTime_ = HFTimeInWindowParams.getParameter<std::vector<double> >("hflongMinWindowTime");
00054 HFlongwindowMaxTime_ = HFTimeInWindowParams.getParameter<std::vector<double> >("hflongMaxWindowTime");
00055 HFlongwindowEthresh_ = HFTimeInWindowParams.getParameter<double>("hflongEthresh");
00056 HFshortwindowMinTime_ = HFTimeInWindowParams.getParameter<std::vector<double> >("hfshortMinWindowTime");
00057 HFshortwindowMaxTime_ = HFTimeInWindowParams.getParameter<std::vector<double> >("hfshortMaxWindowTime");
00058 HFshortwindowEthresh_ = HFTimeInWindowParams.getParameter<double>("hfshortEthresh");
00059 }
00060
00061 HcalHFStatusBitFromDigis::~HcalHFStatusBitFromDigis(){}
00062
00063 void HcalHFStatusBitFromDigis::hfSetFlagFromDigi(HFRecHit& hf,
00064 const HFDataFrame& digi,
00065 const HcalCoder& coder,
00066 const HcalCalibrations& calib)
00067 {
00068
00069 double maxInWindow=-10;
00070 int maxCapid=-1;
00071 int maxTS=-1;
00072
00073
00074 double totalCharge=0;
00075 double peakCharge=0;
00076 double RecomputedEnergy=0;
00077
00078 CaloSamples tool;
00079 coder.adc2fC(digi,tool);
00080
00081
00082 for (int i=0;i<digi.size();++i)
00083 {
00084 int capid=digi.sample(i).capid();
00085
00086 double value = tool[i]-calib.pedestal(capid);
00087
00088 if (i>=recoFirstSample_ && i <recoFirstSample_+recoSamplesToAdd_)
00089 {
00090
00091 if (value>maxInWindow)
00092 {
00093 maxCapid=capid;
00094 maxInWindow=value;
00095 maxTS=i;
00096 }
00097 }
00098
00099
00100 if (i >=firstSample_ && i < firstSample_+samplesToAdd_)
00101 {
00102 totalCharge+=value;
00103 RecomputedEnergy+=value*calib.respcorrgain(capid);
00104 if (i==expectedPeak_) peakCharge=value;
00105 }
00106 }
00107
00108
00109
00110 int TSfrac_counter=1;
00111
00112
00113 if (maxTS>0 &&
00114 tool[maxTS]!=calib.pedestal(maxCapid))
00115 TSfrac_counter=int(50*((tool[maxTS-1]-calib.pedestal((maxCapid+3)%4))/(tool[maxTS]-calib.pedestal((maxCapid+4)%4)))+1);
00116 hf.setFlagField(TSfrac_counter, HcalCaloFlagLabels::Fraction2TS,6);
00117
00118
00119
00120 if (RecomputedEnergy>=minthreshold_)
00121 {
00122
00123 double cutoff=coef0_-exp(coef1_+coef2_*RecomputedEnergy);
00124
00125 if (peakCharge/totalCharge<cutoff)
00126 hf.setFlagField(1,HcalCaloFlagLabels::HFDigiTime);
00127 }
00128
00129
00130
00131 if (hf.id().depth()==1)
00132 {
00133 if (hf.energy()>=HFlongwindowEthresh_)
00134 {
00135 float mult=1./hf.energy();
00136 float enPow=1.;
00137 float mintime=0;
00138 float maxtime=0;
00139 for (unsigned int i=0;i<HFlongwindowMinTime_.size();++i)
00140 {
00141 mintime+=HFlongwindowMinTime_[i]*enPow;
00142 maxtime+=HFlongwindowMaxTime_[i]*enPow;
00143 enPow*=mult;
00144 }
00145 if (hf.time()<mintime || hf.time()>maxtime)
00146 hf.setFlagField(1,HcalCaloFlagLabels::HFInTimeWindow);
00147 }
00148 }
00149 else if (hf.id().depth()==2)
00150 {
00151 if (hf.energy()>=HFshortwindowEthresh_)
00152 {
00153 float mult=1./hf.energy();
00154 float enPow=1.;
00155 float mintime=0;
00156 float maxtime=0;
00157 for (unsigned int i=0;i<HFshortwindowMinTime_.size();++i)
00158 {
00159 mintime+=HFshortwindowMinTime_[i]*enPow;
00160 maxtime+=HFshortwindowMaxTime_[i]*enPow;
00161 enPow*=mult;
00162 }
00163 if (hf.time()<mintime || hf.time()>maxtime)
00164 hf.setFlagField(1,HcalCaloFlagLabels::HFInTimeWindow);
00165 }
00166 }
00167
00168 return;
00169 }
00170