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
00064 if (hbhe.energy()>hitEnergyMinimum_) {
00065 int index=logicalMap_->getHcalFrontEndId(hbhe.detid()).rmIndex();
00066 hpdMultiplicity_.at(index)++;
00067 }
00068
00069
00070
00071
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.;
00083 int max2TS_counter=1;
00084 double running2TS=0;
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
00109
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 }