CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/src/RecoLocalCalo/HcalRecAlgos/src/HcalHFStatusBitFromDigis.cc

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> // for "max"
00005 #include <math.h>
00006 #include <iostream>
00007 
00008 HcalHFStatusBitFromDigis::HcalHFStatusBitFromDigis()
00009 {
00010   // use simple values in default constructor
00011   minthreshold_=40; // minimum energy threshold (in GeV)
00012   recoFirstSample_=0;
00013   recoSamplesToAdd_=10;
00014   firstSample_=3;
00015   samplesToAdd_=4;
00016   expectedPeak_=4;
00017   // Based on Igor V's algorithm:
00018   //TS4/(TS3+TS4+TS5+TS6) > 0.93 - exp(-0.38275-0.012667*E)
00019   coef0_= 0.93;
00020   coef1_ = -0.38275;
00021   coef2_ = -0.012667;
00022   // Minimum energy of 10 GeV required
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   // Specify parameters used in forming the HFDigiTime flag
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   // Specify parameters used in forming HFInTimeWindow flag
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   // The following 3 values are computed using the default reconstruction window (for Shuichi's algorithm)
00069   double maxInWindow=-10; // maximum value found in reco window
00070   int maxCapid=-1;
00071   int maxTS=-1;  // time slice where maximum is found
00072 
00073   // The following 3 values are computed only in the window (firstSample_, firstSample_ + samplesToAdD_), which may not be the same as the default reco window  (for Igor's algorithm)
00074   double totalCharge=0;
00075   double peakCharge=0;
00076   double RecomputedEnergy=0;
00077 
00078   CaloSamples tool;
00079   coder.adc2fC(digi,tool);
00080 
00081   // Compute quantities needed for HFDigiTime, Fraction2TS FLAGS
00082   for (int i=0;i<digi.size();++i)
00083     {
00084       int capid=digi.sample(i).capid();
00085       //double value = digi.sample(i).nominal_fC()-calib.pedestal(capid);
00086       double value = tool[i]-calib.pedestal(capid);
00087       // Find largest value within reconstruction window
00088       if (i>=recoFirstSample_ && i <recoFirstSample_+recoSamplesToAdd_)
00089         {
00090           // Find largest overall pulse within the full digi, or just the allowed window?
00091           if (value>maxInWindow) 
00092             {
00093               maxCapid=capid;
00094               maxInWindow=value;  
00095               maxTS=i;
00096             }
00097         }
00098 
00099       // Sum all charge within flagging window, find charge in expected peak time slice
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     } // for (int i=0;i<digi.size();++i)
00107   
00108   // FLAG:  HcalCaloLabel::Fraction2TS
00109   // Shuichi's Algorithm:  Compare size of peak in digi to charge in TS immediately before peak
00110   int TSfrac_counter=1; 
00111   // get pedestals for each capid -- add 4 to each capid, and then check mod 4.
00112   // (This takes care of the case where max capid =0 , and capid-1 would then be negative)
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); // 6-bit counter to hold peak ratio info
00116   hf.setFlagField(TSfrac_counter, HcalCaloFlagLabels::Fraction2TS,6);
00117 
00118   // FLAG:  HcalCaloLabels::HFDigiTime
00119   // Igor's algorithm:  compare charge in peak to total charge in window
00120   if (RecomputedEnergy>=minthreshold_)  // don't set noise flags for cells below a given threshold
00121     {
00122       // Calculate allowed minimum value of (TS4/TS3+4+5+6):
00123       double cutoff=coef0_-exp(coef1_+coef2_*RecomputedEnergy);
00124       
00125       if (peakCharge/totalCharge<cutoff)
00126         hf.setFlagField(1,HcalCaloFlagLabels::HFDigiTime);
00127     }
00128 
00129   // FLAG:  HcalCaloLabels:: HFInTimeWindow
00130   // Timing algorithm
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