StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
CtbHitList.cxx
1 #include <string.h>
2 #include <assert.h>
3 #include <cmath>
4 
5 #include <St_base/StMessMgr.h>
6 
7 #include <tables/St_g2t_ctf_hit_Table.h>
8 #include <StEvent/StTriggerData.h>
9 
10 
11 #include "StGenericVertexMaker/StiPPVertex/CtbHitList.h"
12 
13 // This needs cleanup of the mapping code
14 extern void cts_get_ctb_indexes(long, long &, long &);
15 
16 /*
17  cts_get_ctb_indexes() is defined in $STAR/pams/ctf/cts/cts.cc
18 */
19 
20 
21 //==========================================================
22 //==========================================================
23 CtbHitList::CtbHitList() :
24  ScintHitList(-M_PI/60.,M_PI/30,60, -1.,0.5,4,(char *) "Ctb",2.,0.5){
25  // CTB clibration: 2 MeV==5 ADC
26  mCtbThres_mev=1; //to reject slats with low dE for M-C data
27  mCtbThres_ch=2 ; //to reject slats with low ADC for real data
28  geantE=new float [nBin];
29 }
30 
31 
32 //==========================================================
33 //==========================================================
34 void
35 CtbHitList::initRun(float fac){
36  const float mCtbEtaSeg=0.5, mCtbPhiSeg=M_PI/30; // NEVER chang this two , JB
37  gMessMgr->Message("","I") <<" CtbHitList::initRun(), gain change factor="<<fac<<endm;
38  mCtbThres_mev*=fac; // tmp to test cuts
39  mCtbThres_ch=(int) (fac*mCtbThres_ch); // tmp to test cuts
40 
41  gMessMgr->Message("","I")
42  <<" CtbHitList::initRun() CtbThres_Ch (real)="<<mCtbThres_ch
43  <<" or CtbThres_MeV (M-C)="<<mCtbThres_mev
44  <<endm;
45 
46  ScintHitList::initRun();
47  int i;
48  for(i=0;i<nBin;i++){
49  // Assume 2004x geom, tmp, fix it by do masking based on geomtery type
50  if(i==40 || i==50 ||i==100 || i==110) continue;
51  setActive(i);
52  }
53 
54  // M-C events
55  long iPhi1,iEta1;
56  // clear old lookup table
57  for(iPhi1=1;iPhi1<mxPhi1;iPhi1++)
58  for(iEta1=1;iEta1<mxEta1;iEta1++)
59  mcId2bin[iPhi1][iEta1]=-1;
60 
61  for(iPhi1=1;iPhi1<mxPhi1;iPhi1++)
62  for(iEta1=1;iEta1<mxEta1;iEta1++) {
63  int iPhi0=iPhi1-1;
64  int iEta0=iEta1-1;
65  int iBin0=iPhiEta2bin(iPhi0,iEta0); //tmp take it out later
66  float phi=iPhi0*mCtbPhiSeg;// phi is [0,2Pi]
67  float eta=iEta0*mCtbEtaSeg -0.75;
68  int iEta=etaBin(eta); //my interal numbering scheme
69  int iPhi=phiBin(phi);
70  if(iEta<0) continue; // out of assumed sensitivity range
71  assert( iEta<nEta);
72  assert( iPhi>=0);
73  int iBin=iPhiEta2bin(iPhi,iEta);
74  assert(iBin==iBin0); //tmp
75 
76  mcId2bin[iPhi1][iEta1]=iBin;
77  }
78 
79  // real data events
80  int slat, tray;
81  for (slat = 0; slat < mxSlat; slat++)
82  for ( tray = 0; tray < mxTray; tray++) {
83  float phi,eta;
84  ctb_get_slat_from_data(slat,tray,phi,eta);
85  int iEta=etaBin(eta); //my interal numbering scheme
86  int iPhi=phiBin(phi);
87  if(iEta<0) continue; // out of assumed sensitivity range
88  assert( iEta<nEta);
89  assert( iPhi>=0);
90  int iBin=iPhiEta2bin(iPhi,iEta);
91  realId2bin[slat][tray]=iBin;
92  }
93 
94 }
95 
96 //==========================================================
97 //==========================================================
98 void
99 CtbHitList::clear(){
100  ScintHitList::clear();
101  memset(geantE,0,nBin*sizeof(float));
102 }
103 
104 //==========================================================
105 //==========================================================
106 CtbHitList::~CtbHitList(){
107  delete [] geantE ;
108 }
109 
110 
111 //==========================================================
112 //==========================================================
113 int
114 CtbHitList::etaBin(float eta){
115  if(eta<eta0) return -1; // out of Eta range
116  int iEta=(int)((eta-eta0)/dEta);
117  if( iEta>=nEta) return -1; // out of Eta range
118  // printf("CtbHitList::etaBin eta=%f iEta=%d\n",eta,iEta);
119  return iEta;
120 }
121 
122 //==========================================================
123 //==========================================================
124 float
125 CtbHitList::bin2EtaLeft(int iEta){
126  assert(iEta>=0);
127  assert(iEta<nEta);
128  float etaF= eta0+iEta*dEta ;
129  return etaF;
130 }
131 
132 //==========================================================
133 //==========================================================
134 void
135 CtbHitList::buildFromMC(TDataSet *gds) {
136 
137  // CTB clibration: 2 MeV==5 ADC
138  gMessMgr->Message("","I") <<" CtbHitList::buildFromMC thr/MeV="<<mCtbThres_mev<<endm;
139 
140  if(gds==0) return ;
141 
142  // -------------- E X T R A C T C T B H I T S --------------------
143  //access the CTB data from GEANT
144  St_g2t_ctf_hit *g2t_ctb_hit = (St_g2t_ctf_hit *) gds->Find("g2t_ctb_hit");
145  if(g2t_ctb_hit == 0){
146  LOG_DEBUG << "CtbHitList::buildMC() No CTB Hits in MC table for this event" << endm;
147  LOG_DEBUG << "g2t_ctb_hit = " << g2t_ctb_hit << endm;
148  return ;
149  }
150 
151  g2t_ctf_hit_st *ctb_hit = NULL;
152 
153  //printf("All GEANT CTB hits=%d\n",(int)g2t_ctb_hit->GetNRows());
154 
155  if (g2t_ctb_hit->GetNRows() == 0) gMessMgr->Message("","I") <<" CtbHitList::buildMC() Empty geant/ctb data set "<<endm;
156 
157  ctb_hit = g2t_ctb_hit->GetTable();
158 
159  //assert(ctb_hit);
160  if (! ctb_hit){
161  LOG_WARN << "CtbHitList::buildMC() no CTB hits" << endm;
162  return ;
163  }
164 
165  int i;
166  for (i = 0; i < g2t_ctb_hit->GetNRows(); i++,ctb_hit++){
167  float de_mev=ctb_hit->de*1000.;
168  // if(de_mev>0.5) printf("CTB Hit i=%d de/MeV=%f parent=%d\n",i,de_mev ,ctb_hit->track_p);
169  long iPhi1,iEta1;
170  cts_get_ctb_indexes(ctb_hit->volume_id,iPhi1,iEta1);
171 
172  // printf("iPhi=%d,iEta=%d de/MeV=%f \n",(int)iPhi,(int)iEta,de_mev);
173  //printf("ctb_indexes , hit=%d, vol_id=%d, iPhi=%d, iEta=%d, de/MeV=%f\n",i,(int)ctb_hit->volume_id,(int)iPhi,(int)iEta );
174 
175  int iBin=mcId2bin[iPhi1][iEta1];
176  geantE[iBin]+=de_mev;
177  }
178 
179  for(i=0;i<nBin;i++){
180  if ( getActive(i)<0) continue;
181  if( geantE[i]<mCtbThres_mev) continue; // ignore low energy CTB slat
182  setFired(i);
183  }
184 
185 }
186 
187 
188 //==========================================================
189 //==========================================================
190 void
191 CtbHitList::buildFromData(StTriggerData *trgD){
192 
193  LOG_INFO << " CtbHitList::buildFromData CtbThres_Ch thres="<<mCtbThres_ch << endm;
194 
195  // access CTB from Akio's Maker
196 
197  if(!trgD){
198  LOG_WARN << "CtbHitList::buildFromData: no trigData in real data" << endm;
199  return ;
200  }
201  int slat, tray;
202  for ( slat = 0; slat < mxSlat; slat++)
203  for ( tray = 0; tray < mxTray; tray++) {
204  float adc = trgD->ctbTraySlat(tray,slat,0);
205  if(adc<mCtbThres_ch) continue;
206  int iBin=realId2bin[slat][tray];
207  // printf("CTB sl=%3d tr=%3d %.1f iBin=%d\n",slat,tray, adc,iBin );
208  if ( getActive(iBin)<0) continue;
209  setFired(iBin);
210  }
211 #if 0
212  // old method , run just for cross check, delete later, JB
213 
214  StTriggerDetectorCollection* trigCol = event->triggerDetectorCollection();
215  if(!trigCol){
216  LOG_WARN << "StCtbUtility scans: no trigCol in Data" << endm;
217  return ;
218  }
219 
220  StCtbTriggerDetector* ctbDet = &(trigCol->ctb());
221  for (UInt_t slat = 0; slat < ctbDet->numberOfSlats(); slat++)
222  for (UInt_t tray = 0; tray < ctbDet->numberOfTrays(); tray++) {
223  ctbHit curHit;
224  curHit.adc = ctbDet->mips(tray,slat,0);
225  if(curHit.adc<mCtbThres_ch) continue;
226  // printf("A sl=%3d tr=%3d %4f\n",slat,tray, curHit.adc );
227  }
228 
229 #endif
230  return ;
231 }
232 
233 
234 //==========================================================
235 //==========================================================
236 void
237 CtbHitList::ctb_get_slat_from_data(int slat, int tray, float & phiRad, float &eta) {
238  float phiZero1 = 72 ; // magic lines from Pablo & Herb
239  float phiZero2 = 108 ;
240  float deltaPhi = 6 ;
241  // tray=0,1
242  // slat=0,...,119
243 
244  int iz ;
245  float phi ;
246 
247  if ( tray < 60 ) {
248  phi = phiZero1 - tray * deltaPhi ;
249  iz = 0 ;
250  } else {
251  phi = phiZero2 + (tray-60) * deltaPhi ;
252  iz = 1 ;
253  }
254  if ( phi < 0. ) phi += 360 ;
255  if ( phi > 360. ) phi -= 360 ;
256 
257  phiRad=phi/180*M_PI;
258  eta=(1-2*iz)*(1+2*slat)*0.25;
259  // printf("CTB hit: slat=%d, tray=%d, phiDeg=%f/deg, eta=%f\n",slat,tray,phi,eta);
260 
261 }
262 
263 
virtual TDataSet * Find(const char *path) const
Definition: TDataSet.cxx:362