00001
00002
00003
00004 #include "StECalEnergyIter.h"
00005 #include "StMuDSTMaker/COMMON/StMuEmcCollection.h"
00006 #include "StMuDSTMaker/COMMON/StMuEmcHit.h"
00007 #include "StEEmcUtil/database/StEEmcDb.h"
00008 #include "StEEmcUtil/database/EEmcDbItem.h"
00009 #include "TMath.h"
00010
00011 bool StECalEnergyIter::mIsSimu = false;
00012
00013 StECalEnergyIter::StECalEnergyIter(StMuEmcCollection *emCol, int det, StEEmcDb *db, bool flag)
00014 : mEmCol(emCol), mEEdb(db), mdetector(det), mIhits(0), mSuppBad(flag) {
00015
00016 char cuv = 'U';
00017 switch (mdetector)
00018 {
00019 case eemc:
00020 mNhits = mEmCol->getNEndcapTowerADC();
00021 break;
00022 case eprs:
00023 mNhits = mEmCol->getNEndcapPrsHits();
00024 break;
00025 case esmdv:
00026 cuv = 'V';
00027 case esmdu:
00028 mNhits = mEmCol->getNEndcapSmdHits(cuv);
00029 break;
00030 default:
00031 mNhits = 0;
00032 }
00033 }
00034
00035
00036 bool StECalEnergyIter::next(float &e, int &adc, int &adclessped,
00037 int &sec, int &eta, int &phi, char &cdet)
00038 {
00039 const EEmcDbItem *dbitem;
00040 cdet = 'U';
00041 bool dbfail;
00042
00043 do {
00044 if ( mNhits <= mIhits ) return false;
00045 switch (mdetector)
00046 {
00047 case eemc:
00048 mEmCol->getEndcapTowerADC(mIhits++, adc, sec, phi, eta);
00049 cdet = 'T';
00050 dbitem = mEEdb->getTile(sec, phi-1+'A', eta, cdet);
00051 break;
00052 case eprs:
00053 int prsId;
00054 adc = mEmCol->getEndcapPrsHit(mIhits++, sec, phi, eta,
00055 prsId)->getAdc();
00056 cdet = prsId-1+'P';
00057 dbitem = mEEdb->getTile(sec, phi-1+'A', eta, cdet);
00058 break;
00059 case esmdv:
00060 cdet = 'V';
00061 case esmdu:
00062 adc = mEmCol->getEndcapSmdHit(cdet, mIhits++, sec, eta)->getAdc();
00063 dbitem = mEEdb->getByStrip(sec, cdet, eta);
00064 break;
00065 default:
00066 return false;
00067 }
00068 dbfail = ( !dbitem || dbitem->fail || dbitem->gain < 0.5 );
00069 } while ( mSuppBad && dbfail );
00070
00071 if ( dbfail )
00072 {
00073 e = - 100.0;
00074 adclessped = adc;
00075 }
00076 else
00077 {
00078 float acorr = adc - dbitem->ped;
00079 e = acorr/dbitem->gain;
00080 if ( mIsSimu && mdetector == eemc ) e *= 1.25;
00081 adclessped = (int) TMath::Floor(acorr + 0.5);
00082 }
00083
00084 return true;
00085 }