StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ScintHitList.cxx
1 #include <string.h>
2 #include <assert.h>
3 
4 #include <TH1.h>
5 #include <TObjArray.h>
6 #include <St_base/StMessMgr.h>
7 
8 #include "StGenericVertexMaker/StiPPVertex/ScintHitList.h"
9 
10 //==========================================================
11 //==========================================================
12 ScintHitList::ScintHitList(float Xphi0,float XdPhi,int mxPhi,
13  float Xeta0, float XdEta,int mxEta,
14  const char* name, float wm, float wv) {
15  phi0=Xphi0;
16  dPhi=XdPhi;
17  nPhi=mxPhi;
18  eta0=Xeta0;
19  dEta=XdEta;
20  nEta=mxEta;
21  nBin=nEta*nPhi;
22  myName=name;
23  Wmatch=wm;
24  Wveto=wv;
25  active= new int[nBin];
26  fired= new int[nBin];
27  track= new int[nBin];
28  memset(h,0,sizeof(h));
29  clear();
30  gMessMgr->Message("","I")
31  <<"ScintHitList for "<<myName
32  <<", use W_match="<< Wmatch<<" W_veto="<<Wveto
33  <<" nEta="<< nEta<<" nPhi="<< nPhi<<" nBin="<< nBin
34  <<endm;
35 }
36 
37 //==========================================================
38 //==========================================================
39 void
40 ScintHitList::initRun(){
41  memset(active,0,nBin*sizeof(int));
42  nActive=0;
43  clear();
44  gMessMgr->Message("","D")
45  <<"Clear ScintHitList for "<<myName<<endm;
46 }
47 
48 //==========================================================
49 //==========================================================
50 ScintHitList::~ScintHitList(){
51  delete [] active ;
52  delete [] fired ;
53  delete [] track ;
54 }
55 
56 
57 //==========================================================
58 //==========================================================
59 void
60 ScintHitList::clear(){
61  memset(fired,0,nBin*sizeof(int));
62  memset(track,0,nBin*sizeof(int));
63  nFired=nTrack=nMatch=0;
64 }
65 
66 //==========================================================
67 //==========================================================
68 int
69 ScintHitList::iPhiEta2bin(int iPhi,int iEta) {
70  int iBin=iPhi+nPhi*iEta;
71  assert(iBin>=0);
72  assert(iBin<nBin);
73  return iBin;
74 }
75 
76 //==========================================================
77 //==========================================================
78 int
79 ScintHitList::getActive(int iBin){
80  if(iBin<0 || iBin>=nBin) return -1;
81  return active[iBin];
82 }
83 
84 //==========================================================
85 //==========================================================
86 int
87 ScintHitList::getFired(int iBin){
88  if(iBin<0 || iBin>=nBin) return -1;
89  return fired[iBin];
90 }
91 
92 //==========================================================
93 //==========================================================
94 int
95 ScintHitList::getTrack(int iBin){
96  if(iBin<0 || iBin>=nBin) return -1;
97  return track[iBin];
98 }
99 
100 //==========================================================
101 //==========================================================
102 bool
103 ScintHitList::isMatched(int iBin){
104  if(iBin<0 || iBin>=nBin) return false;
105  if(active[iBin]>0 && fired[iBin]>0 && track[iBin]>0 ) return true;
106  return false;
107 }
108 
109 //==========================================================
110 //==========================================================
111 bool
112 ScintHitList::isVetoed(int iBin){
113  if(iBin<0 || iBin>=nBin) return false;
114  if(active[iBin]>0 && fired[iBin]==0 && track[iBin]>0 ) return true;
115  return false;
116 }
117 
118 //==========================================================
119 //==========================================================
120 float
121 ScintHitList:: getWeight(int iBin){
122  const float Wdunno=1;
123  if( getActive(iBin) <=0) return Wdunno;
124  if(isMatched(iBin)) return Wmatch;
125  if(isVetoed(iBin)) return Wveto;
126  return Wdunno;
127 
128 }
129 
130 //==========================================================
131 //==========================================================
132 void
133 ScintHitList::iBin2iPhiEta(int iBin,int &iPhi,int &iEta) {
134  assert(iBin>=0);
135  assert(iBin<nBin);
136  iPhi=iBin%nPhi;
137  iEta=iBin/nPhi;
138 }
139 
140 //==========================================================
141 //==========================================================
142 void
143 ScintHitList::setActive(int iBin){
144  assert(iBin>=0);
145  assert(iBin<nBin);
146  active[iBin]=1;
147  nActive++;
148 }
149 
150 //==========================================================
151 //==========================================================
152 void
153 ScintHitList::setFired(int iBin){
154  assert(iBin>=0);
155  assert(iBin<nBin);
156  if(active[iBin]<=0) return; // sensitive only to active pixels
157  fired[iBin]=1;
158  nFired++;
159 }
160 
161 //==========================================================
162 //==========================================================
163 int
164 ScintHitList::phiBin(float phi){// phi is [0,2Pi]
165 
166  int iPhi=(int)((phi-phi0)/dPhi);
167  if(iPhi<0) iPhi+=nPhi; // I'm a bit forgiving here,JB
168  if(iPhi>=nPhi) iPhi-=nPhi;// I'm a bit forgiving here,JB
169  assert(iPhi>=0);
170  assert(iPhi<nPhi);
171  return iPhi;
172 }
173 
174 //==========================================================
175 //==========================================================
176 int
177 ScintHitList:: addTrack(float eta, float phi){
178  int iBin=-1;
179 
180  int iEta=etaBin(eta);
181  int iPhi=phiBin(phi);
182  if(iEta<0 || iPhi<0 || iEta>=nEta || iPhi>=nPhi) return iBin; // out of Eta range
183  iBin=iPhiEta2bin(iPhi,iEta);
184  track[iBin]++;
185  nTrack++;
186  // printf(" %s-addTrack() eta=%.3f phi/deg=%.1f iBin=%d fired=%d iEta=%d iPhi=%d\n",myName.Data(),eta,phi/3.1416*180,iBin,fired[iBin],iEta,iPhi);
187  if( fired[iBin]>0) {
188  nMatch++;
189  if(h[6]) {// drop if histos not initialized
190  float eps=eta - (eta0+iEta*dEta); //<<-use bin2EtaLeft(int iEta), should work for endcap
191  // printf(" addTrack() eta=%.3f iEta=%d eps=%.3f \n",eta,iEta,eps);
192  h[6]->Fill(eps);
193  eps=phi - (phi0+iPhi*dPhi);
194  // printf(" addTrack() phi=%.3f/rad iPhi=%d eps=%.3f \n",phi,iPhi,eps);
195  h[7]->Fill(eps/3.1416*180);
196  }
197  }
198  return iBin;
199 }
200 
201 
202 //==========================================================
203 //==========================================================
204 void
205 ScintHitList::print(int k){
206 
207  LOG_INFO<< Form("%sHitList: nActive=%d nFired=%d nTrack=%d nMatch=%d",myName.Data(),nActive, nFired,nTrack,nMatch)<<endm;
208  LOG_DEBUG << Form("iBin iEta iPhi active:fired:track (LEFT: phi/deg, eta)")<<endm;
209  int i;
210  int nb=0;
211  for(i=0;i<nBin;i++){
212  if(k==0 && fired[i]==0 && track[i]==0) continue;
213  nb++;
214  int iPhi,iEta;
215  iBin2iPhiEta(i,iPhi,iEta);
216  char mm=' ';
217  if(fired[i] && track[i]) mm='*';
218  float etaF=bin2EtaLeft(iEta);
219  LOG_DEBUG << Form("%3d %3d %3d %d:%d:%d %c (%.1f, %.3f)",i,iEta,iPhi,active[i],fired[i],track[i],mm,phi0+iPhi*dPhi/3.1416*180., etaF )<<endm;
220  }
221  LOG_DEBUG << Form("--- %d printed bins",nb)<<endm;
222 }
223 
224 //==========================================================
225 //==========================================================
226 void
227 ScintHitList::doHisto(){
228 
229  // printf("fill ScintHitList histos for this event\n");
230  h[0]->Fill(nFired);
231  h[2]->Fill(nTrack);
232  h[4]->Fill(nMatch);
233 
234  int i;
235  for(i=0;i<nBin;i++){
236  if(fired[i]) h[1]->Fill(i);
237  if(track[i]) h[3]->Fill(i,track[i]); // could be more than one
238  if(isMatched(i)) h[5]->Fill(i);
239  }
240 }
241 
242 //==========================================================
243 //==========================================================
244 void
245 ScintHitList:: initHisto (TObjArray*HList){
246  const char *core=myName.Data();
247  char *type[3]={(char *) "Fired",(char *) "Track",(char *) "Matched tracks"};
248  char tt1[100],tt2[500];
249 
250  int it;
251  for(it=0;it<3;it++){
252  sprintf(tt1,"n%s%c",core,type[it][0]);
253  sprintf(tt2,"%s hits n%s / eve",core,type[it]);
254  int nb=70;
255  if(it==1) nb=300;
256  h[2*it]=new TH1F(tt1,tt2,nb,-0.5,nb-0.5);
257  HList->Add(h[2*it]);
258  }
259 
260  for(it=0;it<3;it++){
261  sprintf(tt1,"%s%c",core,type[it][0]);
262  sprintf(tt2,"%s : frequency of %s / element",core,type[it]);
263  h[2*it+1]=new TH1F(tt1,tt2,nBin,0.5,nBin+0.5);
264  HList->Add(h[2*it+1]);
265  }
266 
267  sprintf(tt1,"%sDeta",core);
268  sprintf(tt2,"%s tracks matched to fired cell; delta eta ",core);
269  h[6]=new TH1F(tt1,tt2,200,-2*dEta,2*dEta); // scint dependent
270  HList->Add(h[6]);
271 
272  sprintf(tt1,"%sDphi",core);
273  sprintf(tt2,"%s tracks matched to fired cell; delta phi/deg ",core);
274  float xx=2*dPhi/3.1416*180;
275  h[7]=new TH1F(tt1,tt2,200,-xx,xx); // scint dependent
276  HList->Add(h[7]);
277 
278  // note, delEta monitoring histo is not working properly for Endcap,but decisions are fine
279 
280 
281 }
282 
283