StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
BtofHitList.cxx
1 #include <string.h>
2 #include <assert.h>
3 #include <cmath>
4 
5 #include <StMessMgr.h>
6 
7 #include "BtofHitList.h"
8 
9 #include "StMaker.h"
10 #include "StBTofUtil/StBTofTables.h"
11 #include "StBTofCollection.h"
12 
13 
14 namespace StEvPPV {
15 //==========================================================
16 //==========================================================
17 BtofHitList::BtofHitList() :
18  // phi, 60 bins
19  // eta, 32*2 bins not with the same width, so eta0,deta are really not used
20  ScintHitList(0.,M_PI/60,60, -0.9,0.028125,64,"Btof",4,0.75) {
21  myTable = new StBTofTables();
22 }
23 
24 
25 //==========================================================
26 //==========================================================
27 void
28 BtofHitList::initRun() {
29  LOG_DEBUG <<Form("BtofHitList::initRun() start")<<endm;
30  ScintHitList::initRun();
31  // clear old lookup table
32  int i,j,k;
33  for(i=0;i<mxTray;i++)
34  for(j=0;j<mxModule;j++)
35  for(k=0;k<mxCell;k++)
36  tmc2bin[i][j][k]=-1;
37 
38  // .. grab table
39  StMaker*mk=(StMaker*)StMaker::GetChain()->GetMaker("GenericVertex");
40  assert(mk);
41  myTable->loadTables(mk);
42 
43 
44  int nB=0; int nA=0;
45  for(int i=0;i<mxTray;i++) {
46  for(int j=0;j<mxModule;j++) {
47  for(int k=0;k<mxCell;k++) {
48  int iBin = cell2bin(i+1,j+1,k+1);
49  tmc2bin[i][j][k]=iBin;
50 
51  int status = 1; //
52  status = myTable->status(i+1,j+1,k+1);
53  nB++;
54  if( status!= 1) continue; // drop broken channels
55 
56  setActive(iBin);
57  nA++;
58  }
59  }
60  }
61 
62  LOG_INFO <<" BtofHitList::initRun() done, active="<<nA<<" of "<<nB<<" BTOF channels" <<endm;
63 
64 }
65 
66 //==========================================================
67 //==========================================================
68 void
69 BtofHitList::clear(){
70  ScintHitList::clear();
71 
72 }
73 
74 //==========================================================
75 //==========================================================
76 BtofHitList::~BtofHitList(){
77  if(myTable) delete myTable;
78 }
79 
80 //==========================================================
81 //==========================================================
82 void
83 BtofHitList::build ( StBTofCollection *btofColl){
84 
85  if(!btofColl || !btofColl->hitsPresent()) {
86  LOG_INFO << " No available BTOF hits for this event ... " << endm;
87  return;
88  }
89 
90  StSPtrVecBTofHit& tofHits = btofColl->tofHits();
91 
92  for(size_t i=0;i<tofHits.size();i++) { //loop on hits in modules
93  StBTofHit *aHit = tofHits[i];
94  if(!aHit) continue;
95  int t = aHit->tray();
96  int m = aHit->module();
97  int c = aHit->cell();
98  if(t<=0||t>mxTray||m<=0||m>mxModule||c<=0||c>mxCell) continue;
99 
100  int iBin=tmc2bin[t-1][m-1][c-1];
101 
102  if ( getActive(iBin)<0) continue;
103  setFired(iBin);
104  }
105 
106 /*
107  // test with Raw Hits
108  if(!btofColl || !btofColl->rawHitsPresent()) {
109  LOG_INFO << " No available BTOF hits for this event ... " << endm;
110  return;
111  }
112 
113  StSPtrVecBTofRawHit& tofRawHits = btofColl->tofRawHits();
114 
115  int chan2mc[24] = {3, 13, 8, 15, 10, 1, 6, 5, 17, 18, 2, 7, 20, 22, 0, 4, 23, 21, 16, 14, 9, 19, 12, 11};
116  for(size_t i=0;i<tofRawHits.size();i++) { //loop on hits in modules
117  StBTofRawHit *aHit = tofRawHits[i];
118  if(!aHit) continue;
119  if(!aHit->leadingEdge()) continue;
120  int t = aHit->tray();
121  int chan = aHit->channel();
122  int tdig = chan/24 + 1;
123  int index = chan%24;
124  int mc = chan2mc[index];
125  int m = (tdig-1)*4 + mc/6 + 1;
126  int c = mc%6 + 1;
127  if(t<=0||t>mxTray||m<=0||m>mxModule||c<=0||c>mxCell) continue;
128 
129  int iBin=tmc2bin[t-1][m-1][c-1];
130 
131  if ( getActive(iBin)<0) continue;
132  setFired(iBin);
133  }
134 */
135 };
136 //==========================================================
137 //==========================================================
138 int
139 BtofHitList::cell2bin(int tray, int module, int cell) {
140  int iPhi = (tray-1)%60;
141  int iEta = (tray-1)/60*mxModule + (module-1);
142  assert( iEta>=0);
143  assert( iPhi>=0);
144  return iPhiEta2bin(iPhi,iEta);
145 }
146 //==========================================================
147 //==========================================================
148 int
149 BtofHitList::addBtofTrack(int tray, int module, int cell) {
150  int iBin = cell2bin(tray, module, cell);
151  track[iBin]++;
152  nTrack++; // need to be set here rather than ScintList for BTOF
153  return iBin;
154 }
155 //==========================================================
156 //==========================================================
157 //** need to be set here rather than ScintList for BTOF **//
158 int
159 BtofHitList::addBtofMatch(IntVec ibinVec) {
160  if(isMatched(ibinVec)) nMatch++;
161  return nMatch;
162 }
163 //==========================================================
164 //==========================================================
165 bool
166 BtofHitList::isMatched(IntVec ibinVec) {
167  bool match = kFALSE;
168  for(size_t i=0;i<ibinVec.size();i++) {
169  int iBin = ibinVec[i];
170  if(getActive(iBin)>0) {
171  if(getTrack(iBin)>0&&getFired(iBin)>0) match = kTRUE;
172  }
173  }
174  return match;
175 }
176 //==========================================================
177 //==========================================================
178 bool
179 BtofHitList::isVetoed(IntVec ibinVec) {
180  int nA = 0;
181  bool veto = kTRUE;
182  for(size_t i=0;i<ibinVec.size();i++) {
183  int iBin = ibinVec[i];
184  if(getActive(iBin)>0) {
185  nA++;
186  if(getTrack(iBin)>0&&getFired(iBin)==0) veto &= kTRUE;
187  else veto &= kFALSE;
188  }
189  }
190  if(nA==0) return kFALSE;
191  else return veto;
192 }
193 //==========================================================
194 //==========================================================
195 float
196 BtofHitList::getWeight(IntVec ibinVec) {
197  const float Wdunno=1;
198  int nA = 0;
199  for(size_t i=0;i<ibinVec.size();i++) {
200  int iBin = ibinVec[i];
201  if(getActive(iBin)>0) nA++;
202  }
203  if(nA==0) return Wdunno;
204  if(isMatched(ibinVec)) return Wmatch;
205  if(isVetoed(ibinVec)) return Wveto;
206  return Wdunno;
207 }
208 //==========================================================
209 //==========================================================
210 int
211 BtofHitList::etaBin(float eta){ // not in a real case, be care when using this
212  if(fabs(eta)>0.9) return -1;
213  int iEta=(int)((eta-eta0)/dEta);
214  if(iEta<0 || iEta>=nEta) return -1; // out of Eta range
215  return iEta;
216 }
217 
218 //==========================================================
219 //==========================================================
220 float
221 BtofHitList::bin2EtaLeft(int iEta){ // not in a real case, be care when using this
222  assert(iEta>=0);
223  assert(iEta<nEta);
224  float etaF= eta0+iEta*dEta ;
225  if(etaF<-0.9) etaF=0.9;
226  return etaF;
227 }
228 }// end namespace StEvPPV
int status(int trayId, int moduleId, int cellId) const
function to return the channel status
void loadTables(StMaker *anyMaker)
load status tables from data base