CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/RecoLocalCalo/HcalRecAlgos/src/HBHEStatusBitSetter.cc

Go to the documentation of this file.
00001 #include "RecoLocalCalo/HcalRecAlgos/interface/HBHEStatusBitSetter.h"
00002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00003 #include "CalibCalorimetry/HcalAlgos/interface/HcalLogicalMapGenerator.h"
00004 #include "CondFormats/HcalObjects/interface/HcalLogicalMap.h"
00005 
00006 HBHEStatusBitSetter::HBHEStatusBitSetter()
00007 {
00008   HcalLogicalMapGenerator gen;
00009   logicalMap_=new HcalLogicalMap(gen.createMap());
00010 
00011   for (int iRm=0;iRm<HcalFrontEndId::maxRmIndex;iRm++) {
00012     hpdMultiplicity_.push_back(0);
00013   }
00014 
00015   nominalPedestal_=3.0;
00016   hitEnergyMinimum_=2.0;
00017   hitMultiplicityThreshold_=17;
00018 }
00019 
00020 HBHEStatusBitSetter::HBHEStatusBitSetter(double nominalPedestal,
00021                                          double hitEnergyMinimum,
00022                                          int hitMultiplicityThreshold,
00023                                          std::vector<edm::ParameterSet> pulseShapeParameterSets,
00024                                          int firstSample, 
00025                                          int samplesToAdd)
00026 {
00027   HcalLogicalMapGenerator gen;
00028   logicalMap_=new HcalLogicalMap(gen.createMap());
00029   
00030   for (int iRm=0;iRm<HcalFrontEndId::maxRmIndex;iRm++) {
00031     hpdMultiplicity_.push_back(0);
00032   }
00033 
00034   nominalPedestal_=nominalPedestal;
00035   hitEnergyMinimum_=hitEnergyMinimum;
00036   hitMultiplicityThreshold_=hitMultiplicityThreshold;
00037   firstSample_ = firstSample;
00038   samplesToAdd_ = samplesToAdd;
00039 
00040   for (unsigned int iPSet=0;iPSet<pulseShapeParameterSets.size();iPSet++) {
00041     edm::ParameterSet pset=pulseShapeParameterSets.at(iPSet);
00042     std::vector<double> params=pset.getParameter<std::vector<double> >("pulseShapeParameters");
00043     pulseShapeParameters_.push_back(params);
00044   }
00045 
00046 }
00047 
00048 HBHEStatusBitSetter::~HBHEStatusBitSetter() {
00049   delete logicalMap_;
00050 }
00051 
00052 void HBHEStatusBitSetter::Clear()
00053 {
00054   for (unsigned int i=0;i<hpdMultiplicity_.size();i++) hpdMultiplicity_[i]=0;
00055 }
00056 
00057 void HBHEStatusBitSetter::SetFlagsFromDigi(HBHERecHit& hbhe, 
00058                                            const HBHEDataFrame& digi,
00059                                            const HcalCoder& coder,
00060                                            const HcalCalibrations& calib
00061                                            )
00062 {
00063   //increment hit multiplicity
00064   if (hbhe.energy()>hitEnergyMinimum_) {
00065     int index=logicalMap_->getHcalFrontEndId(hbhe.detid()).rmIndex();
00066     hpdMultiplicity_.at(index)++;
00067   }
00068 
00069   //set pulse shape bits
00070   // Shuichi's algorithm uses the "correct" charge & pedestals, while Ted's uses "nominal" values.
00071   // Perhaps we should correct Ted's algorithm in the future, though that will mean re-tuning thresholds for his cuts. -- Jeff, 28 May 2010
00072   double charge_total=0.0;
00073   double nominal_charge_total=0.0;  
00074   double charge_max3=-100.0;
00075   double charge_late3=-100.0;
00076   unsigned int slice_max3=0;
00077   unsigned int size=digi.size();
00078  
00079   CaloSamples tool;
00080   coder.adc2fC(digi,tool);
00081 
00082   double max2TS=-99.; // largest 2-TS sum found in reco window so far
00083   int max2TS_counter=1; // default value is 1
00084   double running2TS=0; // tracks current 2-TS sum, using "correct" charge and pedestal
00085   int capid=-1, capid2=-1;
00086   for (unsigned int iSlice=0;iSlice<size;iSlice++) 
00087     {
00088       capid  = digi.sample(iSlice).capid();
00089       charge_total+=tool[iSlice]-calib.pedestal(capid);
00090       nominal_charge_total+=digi[iSlice].nominal_fC()-nominalPedestal_;
00091       if (iSlice>=firstSample_ && 
00092           iSlice<(firstSample_ + samplesToAdd_-1) && 
00093           iSlice<(size-1))
00094         {
00095           capid2 = digi.sample(iSlice+1).capid();
00096           running2TS=tool[iSlice]+tool[iSlice+1]-calib.pedestal(capid)-calib.pedestal(capid2);
00097           if (running2TS>max2TS)
00098             max2TS=running2TS;
00099         }
00100       if (iSlice<2) continue;
00101       double qsum3=digi[iSlice].nominal_fC() + digi[iSlice-1].nominal_fC() + digi[iSlice-2].nominal_fC() - 3*nominalPedestal_;
00102       if (qsum3>charge_max3) {
00103         charge_max3=qsum3;
00104         slice_max3=iSlice;
00105       }
00106     }
00107 
00108   // max2TS counter will be set from 1->63, indicating the fraction of total charge
00109   // contained within the largest 2 time slices within the reco window.
00110 
00111   if (charge_total<0 && max2TS>0)
00112     max2TS_counter=63;
00113       
00114   else if (charge_total>0)
00115     {
00116       max2TS_counter=int(100*(max2TS/charge_total-0.5))+1;
00117       if (max2TS_counter<1) max2TS_counter=1;
00118       if (max2TS_counter>63) max2TS_counter=63;
00119     }
00120       
00121   hbhe.setFlagField(max2TS_counter, HcalCaloFlagLabels::Fraction2TS,6);
00122   
00123   if ((4+slice_max3)>size) return;
00124   charge_late3=digi[slice_max3+1].nominal_fC() + digi[slice_max3+2].nominal_fC() + digi[slice_max3+3].nominal_fC() - 3*nominalPedestal_;
00125 
00126   for (unsigned int iCut=0;iCut<pulseShapeParameters_.size();iCut++) {
00127     if (pulseShapeParameters_[iCut].size()!=6) continue;
00128     if (nominal_charge_total<pulseShapeParameters_[iCut].at(0) || nominal_charge_total>=pulseShapeParameters_[iCut].at(1)) continue;
00129     if ( charge_late3< (pulseShapeParameters_[iCut].at(2)+nominal_charge_total*pulseShapeParameters_[iCut].at(3)) ) continue;
00130     if ( charge_late3>=(pulseShapeParameters_[iCut].at(4)+nominal_charge_total*pulseShapeParameters_[iCut].at(5)) ) continue;
00131     hbhe.setFlagField(1,HcalCaloFlagLabels::HBHEPulseShape);
00132     return;
00133   }
00134   
00135 }
00136 
00137 void HBHEStatusBitSetter::SetFlagsFromRecHits(HBHERecHitCollection& rec) {
00138   for (HBHERecHitCollection::iterator iHBHE=rec.begin();iHBHE!=rec.end();++iHBHE) {
00139     int index=logicalMap_->getHcalFrontEndId(iHBHE->detid()).rmIndex();
00140     if (hpdMultiplicity_.at(index)<hitMultiplicityThreshold_) continue;
00141     iHBHE->setFlagField(1,HcalCaloFlagLabels::HBHEHpdHitMultiplicity);
00142   }
00143 }