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