StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
EemcHitList.cxx
1 #include <string.h>
2 #include <assert.h>
3 #include <cmath>
4 
5 #include <StMessMgr.h>
6 
7 #include "EemcHitList.h"
8 
9 #include "StMaker.h"
10 #include "StEEmcUtil/database/StEEmcDb.h"
11 #include "StEEmcUtil/database/EEmcDbItem.h"
12 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
13 
14 
15 #include "StEmcDetector.h"
16 #include "StEmcModule.h"
17 #include "StEmcRawHit.h"
18 
19 
20 //Z=270, 288,306 cm
21 
22 
23 namespace StEvPPV {
24 //==========================================================
25 //==========================================================
26 EemcHitList::EemcHitList(StEEmcDb* x, unsigned int y, EEmcGeomSimple *z) :
27  ScintHitList(-M_PI/60.,M_PI/30,60, 999,999,8,(char *) "Eemc",4,0.75) {
28  eeDb=x;
29  killStatEEmc=y ;
30  geomE=z;
31  assert(eeDb);
32  assert(geomE);
33  assert(nEta<=MaxEtaBins);
34  float kSigPed=5.0;
35  eeDb-> setThreshold( kSigPed);
36  // the first 13 entries mark the bounds of the 12 eta Bins.
37  etaHL= geomE->getEtaBinRangeArray();
38  gMessMgr->Message("","I")
39  <<" EemcHitList::use kSigPed="<<kSigPed
40  <<endm;
41 }
42 
43 
44 //==========================================================
45 //==========================================================
46 void
47 EemcHitList::initRun(){
48  gMessMgr->Message("","D") <<" EemcHitList::initRun()"<<endm;
49  ScintHitList::initRun();
50 
51  // clear old lookup table
52  int sec,sub,etaB;
53  for(sec=0;sec<MaxSectors;sec++)
54  for(sub=0;sub<MaxSubSec;sub++)
55  for(etaB=0;etaB<MaxEtaBins;etaB++)
56  name2bin[sec][sub][etaB]=-1;
57 
58  // fill in new association
59  int nB=0,nA=0;
60  for(sec=1;sec<=MaxSectors;sec++)
61  for(sub='A';sub<='E';sub++)
62  for(etaB=1;etaB<=MaxEtaBins;etaB++) {
63  //Db ranges: sec=1-12,sub=A-E,eta=1-12; slow method
64  const EEmcDbItem *x=eeDb->getT(sec,sub,etaB);
65  if(x==0) continue;
66  nB++;
67  if(x->fail ) continue; // drop broken channels
68  if(x->stat & killStatEEmc) continue; // other problems
69 
70  int ieta=x->eta-1; // typical endcap bin numbering
71  int isec=x->sec-1, isub=x->sub-'A';
72  float eta=geomE->getEtaMean(ieta);
73  float phi=geomE->getPhiMean(isec,isub); // // -pi <= phi < pi
74  if( phi<0) phi+=2*M_PI; // I want phi in [0,2Pi]
75 
76  //........... convert it to private bins
77  int iEta=etaBin(eta); // unique vertx finder bin numbering
78  int iPhi=phiBin(phi);
79  //printf("EE eta=%.3f iEta=%d , phi/deg=%.1f iPhi=%d name=%s\n",eta,iEta,phi/3.1416*180,iPhi,x->name);// x->print();
80  if(iEta<0) continue; // out of assumed sensitivity range
81 
82  //printf("EE tower is good\n");
83 
84  assert( iEta<nEta);
85  assert( iPhi>=0);
86 
87  int iBin=iPhiEta2bin(iPhi,iEta);
88  assert(name2bin[isec][isub][ieta]==-1); //tmp, to check ETOW code
89  name2bin[isec][isub][ieta]=iBin;
90 
91  //tmp
92  assert(iBin>=0);
93  assert(iBin<nBin);
94  assert( active[iBin]==0 );
95  // tmp end
96 
97  setActive(iBin);
98  nA++;
99  }
100 
101  LOG_INFO <<" EemcHitList::initRun() done, active="<<nA<<" of "<<nB<<" ETOW towers (only 8 upper eta rings are used) " <<endm;
102 
103 }
104 
105 //==========================================================
106 //==========================================================
107 void
108 EemcHitList::clear(){
109  ScintHitList::clear();
110 }
111 
112 //==========================================================
113 //==========================================================
114 int
115 EemcHitList::etaBin(float eta){
116 
117  // in this aplication only 'nBin' ,counted from eta=1. --> eta=2., are condidered to be valid. nBin should be ~8, since no tracking is expected at eta >1.6
118 
119  if(eta <etaHL[12]) return -1; // missed EEMC
120  int i;
121  for(i=0;i<nEta;i++) {
122  if(eta< etaHL[11-i]) return i;
123  }
124  return -1;
125 }
126 //==========================================================
127 //==========================================================
128 float
129 EemcHitList::bin2EtaLeft(int iEta){
130  assert(iEta>=0);
131  assert(iEta<nEta);
132  float etaF= etaHL[11-iEta] ;
133  return etaF;
134 }
135 
136 
137 //==========================================================
138 //==========================================================
139 EemcHitList::~EemcHitList(){
140 
141 }
142 
143 //==========================================================
144 //==========================================================
145 void
146 EemcHitList::build ( StEmcDetector*det, float adcMin){
147  for(unsigned int mod=1;mod<=det->numberOfModules();mod++) {
148  StEmcModule* module=det->module(mod);
149  //printf("ETOW sector=%d nHit=%d\n",mod,module->numberOfHits());
150  StSPtrVecEmcRawHit& hit= module->hits();
151  int sec=mod; // range 1-12
152  for(unsigned int ih=0;ih<hit.size();ih++){ // over cesctors
153  StEmcRawHit *h=hit[ih];
154  char sub='A'+h->sub()-1;// range A-E
155  int eta=h->eta();// range 1-12
156  int rawAdc=h->adc();
157  //Db ranges: sec=1-12,sub=A-E,eta=1-12; slow method
158  const EEmcDbItem *x=eeDb->getT(sec,sub,eta);
159  if(x==0) continue;
160  if(x->fail ) continue; // drop broken channels
161  if(x->stat & killStatEEmc) continue; // other problems
162  // functioning chan
163 
164  int iBin=name2bin[sec-1][sub-'A'][eta-1];
165  if ( getActive(iBin)<0) continue;
166 
167  if(rawAdc< x->thr) continue; // still only ped
168  float adc=rawAdc - x->ped ;
169  if(adc < adcMin) continue; // too low response for MIP
170  // printf("add Eemc hit %s adc=%.1f\n",x->name,adc);
171 
172  setFired(iBin);
173  } // end of sector
174  // printf("sect=%d so far: nActive=%d nHit=%d\n",sec,nAct,nHit);
175  }
176 };
177 }// end namespace StEvPPV
178 
Float_t getPhiMean(UInt_t sec) const
EEMC simple geometry.
Float_t getEtaMean(UInt_t eta) const