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