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