00001 #include <string.h>
00002 #include <assert.h>
00003 #include <stdio.h>
00004
00005 #include <TH1.h>
00006 #include <TObjArray.h>
00007 #include <StMessMgr.h>
00008
00009 #include "ScintHitList.h"
00010
00011
00012
00013 ScintHitList::ScintHitList(float Xphi0,float XdPhi,int mxPhi,
00014 float Xeta0, float XdEta,int mxEta,
00015 char * name, float wm, float wv) {
00016 phi0=Xphi0;
00017 dPhi=XdPhi;
00018 nPhi=mxPhi;
00019 eta0=Xeta0;
00020 dEta=XdEta;
00021 nEta=mxEta;
00022 nBin=nEta*nPhi;
00023 myName=name;
00024 Wmatch=wm;
00025 Wveto=wv;
00026 active= new int[nBin];
00027 fired= new int[nBin];
00028 track= new int[nBin];
00029 memset(h,0,sizeof(h));
00030 clear();
00031 gMessMgr->Message("","I")
00032 <<"ScintHitList for "<<myName
00033 <<", use W_match="<< Wmatch<<" W_veto="<<Wveto
00034 <<" nEta="<< nEta<<" nPhi="<< nPhi<<" nBin="<< nBin
00035 <<endm;
00036 }
00037
00038
00039
00040 void
00041 ScintHitList::initRun(){
00042 memset(active,0,nBin*sizeof(int));
00043 nActive=0;
00044 clear();
00045 gMessMgr->Message("","D")
00046 <<"Clear ScintHitList for "<<myName<<endm;
00047 }
00048
00049
00050
00051 ScintHitList::~ScintHitList(){
00052 delete [] active ;
00053 delete [] fired ;
00054 delete [] track ;
00055 }
00056
00057
00058
00059
00060 void
00061 ScintHitList::clear(){
00062 memset(fired,0,nBin*sizeof(int));
00063 memset(track,0,nBin*sizeof(int));
00064 nFired=nTrack=nMatch=0;
00065 }
00066
00067
00068
00069 int
00070 ScintHitList::iPhiEta2bin(int iPhi,int iEta) {
00071 int iBin=iPhi+nPhi*iEta;
00072 assert(iBin>=0);
00073 assert(iBin<nBin);
00074 return iBin;
00075 }
00076
00077
00078
00079 int
00080 ScintHitList::getActive(int iBin){
00081 if(iBin<0 || iBin>=nBin) return -1;
00082 return active[iBin];
00083 }
00084
00085
00086
00087 int
00088 ScintHitList::getFired(int iBin){
00089 if(iBin<0 || iBin>=nBin) return -1;
00090 return fired[iBin];
00091 }
00092
00093
00094
00095 int
00096 ScintHitList::getTrack(int iBin){
00097 if(iBin<0 || iBin>=nBin) return -1;
00098 return track[iBin];
00099 }
00100
00101
00102
00103 bool
00104 ScintHitList::isMatched(int iBin){
00105 if(iBin<0 || iBin>=nBin) return false;
00106 if(active[iBin]>0 && fired[iBin]>0 && track[iBin]>0 ) return true;
00107 return false;
00108 }
00109
00110
00111
00112 bool
00113 ScintHitList::isVetoed(int iBin){
00114 if(iBin<0 || iBin>=nBin) return false;
00115 if(active[iBin]>0 && fired[iBin]==0 && track[iBin]>0 ) return true;
00116 return false;
00117 }
00118
00119
00120
00121 float
00122 ScintHitList:: getWeight(int iBin){
00123 const float Wdunno=1;
00124 if( getActive(iBin) <=0) return Wdunno;
00125 if(isMatched(iBin)) return Wmatch;
00126 if(isVetoed(iBin)) return Wveto;
00127 return Wdunno;
00128
00129 }
00130
00131
00132
00133 void
00134 ScintHitList::iBin2iPhiEta(int iBin,int &iPhi,int &iEta) {
00135 assert(iBin>=0);
00136 assert(iBin<nBin);
00137 iPhi=iBin%nPhi;
00138 iEta=iBin/nPhi;
00139 }
00140
00141
00142
00143 void
00144 ScintHitList::setActive(int iBin){
00145 assert(iBin>=0);
00146 assert(iBin<nBin);
00147 active[iBin]=1;
00148 nActive++;
00149 }
00150
00151
00152
00153 void
00154 ScintHitList::setFired(int iBin){
00155 assert(iBin>=0);
00156 assert(iBin<nBin);
00157 if(active[iBin]<=0) return;
00158 fired[iBin]=1;
00159 nFired++;
00160 }
00161
00162
00163
00164 int
00165 ScintHitList::phiBin(float phi){
00166
00167 int iPhi=(int)((phi-phi0)/dPhi);
00168 if(iPhi<0) iPhi+=nPhi;
00169 if(iPhi>=nPhi) iPhi-=nPhi;
00170 assert(iPhi>=0);
00171 assert(iPhi<nPhi);
00172 return iPhi;
00173 }
00174
00175
00176
00177 int
00178 ScintHitList:: addTrack(float eta, float phi){
00179 int iBin=-1;
00180
00181 int iEta=etaBin(eta);
00182 int iPhi=phiBin(phi);
00183 if(iEta<0 || iPhi<0 || iEta>=nEta || iPhi>=nPhi) return iBin;
00184 iBin=iPhiEta2bin(iPhi,iEta);
00185 track[iBin]++;
00186 nTrack++;
00187
00188 if( fired[iBin]>0) {
00189 nMatch++;
00190 if(h[6]) {
00191 float eps=eta - (eta0+iEta*dEta);
00192
00193 h[6]->Fill(eps);
00194 eps=phi - (phi0+iPhi*dPhi);
00195
00196 h[7]->Fill(eps/3.1416*180);
00197 }
00198 }
00199 return iBin;
00200 }
00201
00202
00203
00204
00205 void
00206 ScintHitList::print(int k){
00207
00208 LOG_INFO<< Form("%sHitList: nActive=%d nFired=%d nTrack=%d nMatch=%d",myName.Data(),nActive, nFired,nTrack,nMatch)<<endm;
00209 LOG_DEBUG << Form("iBin iEta iPhi active:fired:track (LEFT: phi/deg, eta)")<<endm;
00210 int i;
00211 int nb=0;
00212 for(i=0;i<nBin;i++){
00213 if(k==0 && fired[i]==0 && track[i]==0) continue;
00214 nb++;
00215 int iPhi,iEta;
00216 iBin2iPhiEta(i,iPhi,iEta);
00217 char mm=' ';
00218 if(fired[i] && track[i]) mm='*';
00219 float etaF=bin2EtaLeft(iEta);
00220 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;
00221 }
00222 LOG_DEBUG << Form("--- %d printed bins",nb)<<endm;
00223 }
00224
00225
00226
00227 void
00228 ScintHitList::doHisto(){
00229
00230
00231 h[0]->Fill(nFired);
00232 h[2]->Fill(nTrack);
00233 h[4]->Fill(nMatch);
00234
00235 int i;
00236 for(i=0;i<nBin;i++){
00237 if(fired[i]) h[1]->Fill(i);
00238 if(track[i]) h[3]->Fill(i,track[i]);
00239 if(isMatched(i)) h[5]->Fill(i);
00240 }
00241 }
00242
00243
00244
00245 void
00246 ScintHitList:: initHisto (TObjArray*HList){
00247 const char *core=myName.Data();
00248 char *type[3]={"Fired","Track","Matched tracks"};
00249 char tt1[100],tt2[500];
00250
00251 int it;
00252 for(it=0;it<3;it++){
00253 sprintf(tt1,"n%s%c",core,type[it][0]);
00254 sprintf(tt2,"%s hits n%s / eve",core,type[it]);
00255 int nb=70;
00256 if(it==1) nb=300;
00257 h[2*it]=new TH1F(tt1,tt2,nb,-0.5,nb-0.5);
00258 HList->Add(h[2*it]);
00259 }
00260
00261 for(it=0;it<3;it++){
00262 sprintf(tt1,"%s%c",core,type[it][0]);
00263 sprintf(tt2,"%s : frequency of %s / element",core,type[it]);
00264 h[2*it+1]=new TH1F(tt1,tt2,nBin,0.5,nBin+0.5);
00265 HList->Add(h[2*it+1]);
00266 }
00267
00268 sprintf(tt1,"%sDeta",core);
00269 sprintf(tt2,"%s tracks matched to fired cell; delta eta ",core);
00270 h[6]=new TH1F(tt1,tt2,200,-2*dEta,2*dEta);
00271 HList->Add(h[6]);
00272
00273 sprintf(tt1,"%sDphi",core);
00274 sprintf(tt2,"%s tracks matched to fired cell; delta phi/deg ",core);
00275 float xx=2*dPhi/3.1416*180;
00276 h[7]=new TH1F(tt1,tt2,200,-xx,xx);
00277 HList->Add(h[7]);
00278
00279
00280
00281
00282 }
00283
00284