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