00001 #include <string.h>
00002 #include <stdio.h>
00003 #include <assert.h>
00004 #include <cmath>
00005
00006 #include "math_constants.h"
00007
00008 #include <StMessMgr.h>
00009
00010 #include "EemcHitList.h"
00011
00012 #include "StMaker.h"
00013 #include "StEEmcUtil/database/StEEmcDb.h"
00014 #include "StEEmcUtil/database/EEmcDbItem.h"
00015 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00016
00017
00018 #include "StEmcDetector.h"
00019 #include "StEmcModule.h"
00020 #include "StEmcRawHit.h"
00021
00022
00023
00024
00025
00026
00027
00028 EemcHitList::EemcHitList(StEEmcDb* x, uint y, EEmcGeomSimple *z) :
00029 ScintHitList(-C_PI/60.,C_PI/30,60, 999,999,8,"Eemc",4,0.75) {
00030 eeDb=x;
00031 killStatEEmc=y ;
00032 geomE=z;
00033 assert(eeDb);
00034 assert(geomE);
00035 assert(nEta<=MaxEtaBins);
00036 float kSigPed=5.0;
00037 eeDb-> setThreshold( kSigPed);
00038
00039 etaHL= geomE->getEtaBinRangeArray();
00040 gMessMgr->Message("","I")
00041 <<" EemcHitList::use kSigPed="<<kSigPed
00042 <<endm;
00043 }
00044
00045
00046
00047
00048 void
00049 EemcHitList::initRun(){
00050 gMessMgr->Message("","D") <<" EemcHitList::initRun()"<<endm;
00051 ScintHitList::initRun();
00052
00053
00054 int sec,sub,etaB;
00055 for(sec=0;sec<MaxSectors;sec++)
00056 for(sub=0;sub<MaxSubSec;sub++)
00057 for(etaB=0;etaB<MaxEtaBins;etaB++)
00058 name2bin[sec][sub][etaB]=-1;
00059
00060
00061 int nB=0,nA=0;
00062 for(sec=1;sec<=MaxSectors;sec++)
00063 for(sub='A';sub<='E';sub++)
00064 for(etaB=1;etaB<=MaxEtaBins;etaB++) {
00065
00066 const EEmcDbItem *x=eeDb->getT(sec,sub,etaB);
00067 if(x==0) continue;
00068 nB++;
00069 if(x->fail ) continue;
00070 if(x->stat & killStatEEmc) continue;
00071
00072 int ieta=x->eta-1;
00073 int isec=x->sec-1, isub=x->sub-'A';
00074 float eta=geomE->getEtaMean(ieta);
00075 float phi=geomE->getPhiMean(isec,isub);
00076 if( phi<0) phi+=2*C_PI;
00077
00078
00079 int iEta=etaBin(eta);
00080 int iPhi=phiBin(phi);
00081
00082 if(iEta<0) continue;
00083
00084
00085
00086 assert( iEta<nEta);
00087 assert( iPhi>=0);
00088
00089 int iBin=iPhiEta2bin(iPhi,iEta);
00090 assert(name2bin[isec][isub][ieta]==-1);
00091 name2bin[isec][isub][ieta]=iBin;
00092
00093
00094 assert(iBin>=0);
00095 assert(iBin<nBin);
00096 assert( active[iBin]==0 );
00097
00098
00099 setActive(iBin);
00100 nA++;
00101 }
00102
00103 LOG_INFO <<" EemcHitList::initRun() done, active="<<nA<<" of "<<nB<<" ETOW towers (only 8 upper eta rings are used) " <<endm;
00104
00105 }
00106
00107
00108
00109 void
00110 EemcHitList::clear(){
00111 ScintHitList::clear();
00112 }
00113
00114
00115
00116 int
00117 EemcHitList::etaBin(float eta){
00118
00119
00120
00121 if(eta <etaHL[12]) return -1;
00122 int i;
00123 for(i=0;i<nEta;i++) {
00124 if(eta< etaHL[11-i]) return i;
00125 }
00126 return -1;
00127 }
00128
00129
00130 float
00131 EemcHitList::bin2EtaLeft(int iEta){
00132 assert(iEta>=0);
00133 assert(iEta<nEta);
00134 float etaF= etaHL[11-iEta] ;
00135 return etaF;
00136 }
00137
00138
00139
00140
00141 EemcHitList::~EemcHitList(){
00142
00143 }
00144
00145
00146
00147 void
00148 EemcHitList::build ( StEmcDetector*det, float adcMin){
00149 for(uint mod=1;mod<=det->numberOfModules();mod++) {
00150 StEmcModule* module=det->module(mod);
00151
00152 StSPtrVecEmcRawHit& hit= module->hits();
00153 int sec=mod;
00154 for(uint ih=0;ih<hit.size();ih++){
00155 StEmcRawHit *h=hit[ih];
00156 char sub='A'+h->sub()-1;
00157 int eta=h->eta();
00158 int rawAdc=h->adc();
00159
00160 const EEmcDbItem *x=eeDb->getT(sec,sub,eta);
00161 if(x==0) continue;
00162 if(x->fail ) continue;
00163 if(x->stat & killStatEEmc) continue;
00164
00165
00166 int iBin=name2bin[sec-1][sub-'A'][eta-1];
00167 if ( getActive(iBin)<0) continue;
00168
00169 if(rawAdc< x->thr) continue;
00170 float adc=rawAdc - x->ped ;
00171 if(adc < adcMin) continue;
00172
00173
00174 setFired(iBin);
00175 }
00176
00177 }
00178 };
00179