00001
00002
00003
00004
00005
00006 #include "TF1.h"
00007
00008 #include "StEmcUtil/geometry/StEmcGeom.h"
00009 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00010 #include "StEEmcUtil/StEEmcSmd/EEmcSmdGeom.h"
00011 #include "WeventDisplay.h"
00012 #include "StSpinPool/StJets/StJet.h"
00013 #include "StSpinPool/StJets/TowerToJetIndex.h"
00014
00015 #include "St2011WMaker.h"
00016
00017
00018
00019 void
00020 St2011WMaker::findEndcap_W_boson(){
00021
00022 if(!wEve->l2EbitET) return;
00023
00024
00025 int nGoldW=0;
00026
00027
00028 for(uint iv=0;iv<wEve->vertex.size();iv++) {
00029 WeveVertex &V=wEve->vertex[iv];
00030 for(uint it=0;it<V.eleTrack.size();it++) {
00031 WeveEleTrack &T=V.eleTrack[it];
00032 if(T.pointTower.id>=0) continue;
00033 if(T.isMatch2Cl==false) continue;
00034 assert(T.cluster.nTower>0);
00035 assert(T.nearTotET>0);
00036
00037
00038 if(T.cluster.ET/T.nearTotET_noEEMC>parE_nearTotEtFrac){
00039 if(T.sPtBalance_noEEMC>parE_ptBalance ) {
00040 hE[140]->Fill(T.cluster.ET);
00041 if (T.prMuTrack->charge() < 0) {
00042 hE[184+3]->Fill(T.cluster.ET);
00043 } else if (T.prMuTrack->charge() > 0) {
00044 hE[184+4]->Fill(T.cluster.ET);
00045 }
00046 }
00047 }
00048
00049 if(T.cluster.ET /T.nearTotET< parE_nearTotEtFrac) continue;
00050
00051 hE[20]->Fill("noNear",1.);
00052 hE[112]->Fill( T.cluster.ET);
00053 hE[50]->Fill(T.awayTpcPT);
00054 hE[51]->Fill(T.awayBtowET);
00055 hE[54]->Fill(T.awayTotET);
00056 hE[52]->Fill(T.cluster.ET,T.awayTotET);
00057 hE[53]->Fill(T.cluster.ET,T.awayEmcET);
00058 hE[55]->Fill(T.awayEtowET);
00059 hE[60]->Fill(T.cluster.ET,T.awayTpcPT);
00060
00061 hE[132]->Fill(T.cluster.ET,T.ptBalance.Perp());
00062 hE[133]->Fill(T.awayTotET,T.ptBalance.Perp());
00063 hE[134]->Fill(T.cluster.ET,T.sPtBalance);
00064 hE[135]->Fill(T.awayTotET,T.sPtBalance);
00065
00066
00067 if(T.sPtBalance>parE_ptBalance ) {
00068 hE[136]->Fill(T.cluster.ET);
00069 hE[62]->Fill(T.pointTower.iEta ,T.cluster.energy);
00070 if (T.prMuTrack->charge() < 0) {
00071 hE[184+1]->Fill(T.cluster.ET);
00072 } else if (T.prMuTrack->charge() > 0) {
00073 hE[184+2]->Fill(T.cluster.ET);
00074 }
00075 } else {
00076 hE[137]->Fill(T.cluster.ET);
00077 if (T.prMuTrack->charge() < 0) {
00078 hE[184+5]->Fill(T.cluster.ET);
00079 } else if (T.prMuTrack->charge() > 0) {
00080 hE[184+6]->Fill(T.cluster.ET);
00081 }
00082 }
00083
00084 if(0){
00085 printf("\n WWWWWWWWWWWWWWWWWWWWW Endcap \n");
00086 wDisaply->exportEvent( "WE", V, T);
00087 wEve->print();
00088 }
00089
00090
00091 if(T.sPtBalance<parE_ptBalance) continue;
00092
00093
00094
00095
00096 hE[20]->Fill("noAway",1.0);
00097 hE[113]->Fill( T.cluster.ET);
00098
00099 hE[90]->Fill( T.cluster.ET);
00100 hE[92]->Fill( T.cluster.ET,T.glMuTrack->dEdx()*1e6);
00101 hE[93]->Fill( T.cluster.ET,T.glMuTrack->dca().mag());
00102 int k=0; if(T.prMuTrack->charge()<0) k=1;
00103 hE[94+k]->Fill( T.cluster.ET,T.glMuTrack->dcaD());
00104
00105
00106 if(T.cluster.ET<par_highET) continue;
00107 hE[91]->Fill(T.cluster.position.PseudoRapidity(),T.cluster.position.Phi());
00108 hE[96]->Fill(V.id);
00109 hE[97]->Fill(V.funnyRank);
00110 hE[98]->Fill(V.z);
00111 hE[99]->Fill( T.prMuTrack->eta());
00112 hE[100]->Fill(T.pointTower.R.X(),T.pointTower.R.Y());
00113 hE[190+k]->Fill(T.prMuTrack->eta(),T.cluster.ET);
00114 hE[20]->Fill("goldW",1.);
00115 nGoldW++;
00116
00117 }
00118 }
00119 if(nGoldW>0)
00120 hE[0]->Fill("goldW",1.);
00121
00122 }
00123
00124
00125
00126 void
00127 St2011WMaker::analyzeESMD(){
00128 if(!wEve->l2EbitET) return;
00129
00130
00131 for(uint iv=0;iv<wEve->vertex.size();iv++) {
00132 WeveVertex &V=wEve->vertex[iv];
00133 for(uint it=0;it<V.eleTrack.size();it++) {
00134 WeveEleTrack &T=V.eleTrack[it];
00135 if(T.pointTower.id>=0) continue;
00136 if(T.isMatch2Cl==false) continue;
00137 assert(T.cluster.nTower>0);
00138
00139
00140 int hitStrip[2]={-1,-1}; int hitStripGlob[2]={-1,-1};
00141
00142 TH1F* esmdShowerHist[2];
00143 esmdShowerHist[0] = new TH1F(Form("esmdU%d",wEve->id),"esmdU",41,-10.25,10.25);
00144 esmdShowerHist[1] = new TH1F(Form("esmdV%d",wEve->id),"esmdV",41,-10.25,10.25);
00145
00146 for(int iuv=0; iuv<2; iuv++){
00147 Float_t dca;
00148 const StructEEmcStrip *stripPtr = geoSmd->getDca2Strip(iuv,T.pointTower.R,&dca);
00149 if(!stripPtr) {cout<<"No Strip found"<<endl; continue;}
00150 if(fabs(dca)>0.5 ) {cout<<"DCA to big"<<endl; continue;}
00151
00152 Float_t dcaGlob;
00153 const StructEEmcStrip *stripPtrGlob = geoSmd->getDca2Strip(iuv,T.pointTower.Rglob,&dcaGlob);
00154
00155 int maxStripId=-1; float maxE=-1;
00156
00157 int stripId=stripPtr->stripStructId.stripId;
00158 int sectorId=stripPtr->stripStructId.sectorId;
00159 T.hitSector=sectorId;
00160 T.esmdGlobStrip[iuv]=stripPtrGlob->stripStructId.stripId-stripId;
00161 T.esmdDca[iuv]=dca; T.esmdDcaGlob[iuv]=dcaGlob;
00162 hitStrip[iuv]=stripId; hitStripGlob[iuv]=stripPtrGlob->stripStructId.stripId;
00163
00164
00165 int str1=stripId - parE_nSmdStrip; if(str1<1) str1=1;
00166 int str2=stripId + parE_nSmdStrip; if(str2>288) str2=288;
00167 for(int istrip=str1; istrip<=str2; istrip++){
00168 float ene=wEve->esmd.ene[sectorId-1][iuv][istrip-1]*1e3;
00169 esmdShowerHist[iuv]->SetBinContent(istrip-stripId+parE_nSmdStrip+1,ene);
00170 T.esmdShower[iuv][istrip-stripId+parE_nSmdStrip]=ene;
00171 if(ene > maxE){ maxStripId=istrip; maxE=ene; }
00172 if(ene > 0){
00173 T.esmdE[iuv]+=ene;
00174 T.esmdNhit[iuv]++;
00175 }
00176 }
00177
00178
00179 TF1 *f = new TF1("f","gaus",-5.,5.);
00180 f->SetParameter(1,0);
00181 esmdShowerHist[iuv]->Fit(f,"RQ","RQ",-5.,5.);
00182 T.esmdShowerCentroid[iuv]=f->GetParameter(1);
00183 T.esmdShowerWidth[iuv]=f->GetParameter(2);
00184
00185
00186 T.esmdXPcentroid = geoSmd->getIntersection(T.hitSector-1,hitStrip[0]-1+(int)T.esmdShowerCentroid[0],hitStrip[1]-1+(int)T.esmdShowerCentroid[1]);
00187
00188 }
00189 }
00190
00191
00192 }
00193 }
00194
00195
00196
00197
00198
00199 float
00200 St2011WMaker::sumEtowCone(float zVert, TVector3 refAxis, int flag){
00201
00202 assert(flag==1 || flag==2);
00203 float ptsum=0;
00204
00205
00206 for(int iphi=0; iphi<mxEtowPhiBin; iphi++){
00207 for(int ieta=0; ieta<mxEtowEta; ieta++){
00208 float ene=wEve->etow.ene[iphi][ieta];
00209 if(ene<=0) continue;
00210 TVector3 primP=positionEtow[iphi][ieta]-TVector3(0,0,zVert);
00211 primP.SetMag(ene);
00212 if(flag==1) {
00213 float deltaPhi=refAxis.DeltaPhi(primP);
00214 if(fabs(deltaPhi)> par_awayDeltaPhi) continue;
00215 }
00216 if(flag==2) {
00217 float deltaR=refAxis.DeltaR(primP);
00218 if(deltaR> par_nearDeltaR) continue;
00219 }
00220 ptsum+=primP.Perp();
00221 }
00222 }
00223
00224 return ptsum;
00225 }
00226
00227
00228
00229
00230
00231
00232
00233 int
00234 St2011WMaker::extendTrack2Endcap(){
00235
00236 if(!wEve->l2EbitET) return 0;
00237
00238 double parE_zSMD=geomE->getZSMD();
00239 int nTrE=0;
00240 for(uint iv=0;iv<wEve->vertex.size();iv++) {
00241 WeveVertex &V=wEve->vertex[iv];
00242 for(uint it=0;it<V.eleTrack.size();it++) {
00243 WeveEleTrack &T=V.eleTrack[it];
00244 if(T.prMuTrack->eta()<parE_trackEtaMin)
00245 continue;
00246
00247
00248 const StPhysicalHelixD trkHlx=T.prMuTrack->outerHelix();
00249 StThreeVectorD diskPosition=StThreeVectorD(0,0,parE_zSMD);
00250 StThreeVectorD diskNormal=StThreeVectorD(0,0,1);
00251
00252
00253 double path = trkHlx.pathLength(diskPosition,diskNormal);
00254
00255 StThreeVectorD r = trkHlx.at(path);
00256 float periodL=trkHlx.period();
00257
00258 if(periodL<2*path) {
00259 printf(" Warn, long path fac=%.1f ",path/periodL);
00260 printf(" punchEEMC1 x,y,z=%.1f, %.1f, %.1f path=%.1f period=%.1f\n",r.x(),r.y(),r.z(),path,periodL);
00261 }
00262
00263
00264 hE[69]->Fill(r.x(), r.y());
00265
00266 int isec,isubSec,ietaBin;
00267 Float_t epsPhi, epsEta;
00268 TVector3 rCross(r.x(),r.y(),r.z());
00269 bool inEtow=geomE->getTower(rCross,isec,isubSec,ietaBin,epsPhi,epsEta);
00270 if(!inEtow) continue;
00271 hE[20]->Fill("@E",1.);
00272
00273
00274 nTrE++;
00275 T.pointTower.id=-999;
00276 T.pointTower.R=rCross;
00277 T.pointTower.iEta=ietaBin;
00278 T.pointTower.iPhi=isec*mxEtowSub+isubSec;
00279
00280
00281 const StPhysicalHelixD trkHlxGlob=T.glMuTrack->outerHelix();
00282 double pathGlob = trkHlxGlob.pathLength(diskPosition,diskNormal);
00283
00284 StThreeVectorD rGlob = trkHlxGlob.at(pathGlob);
00285 float periodLGlob=trkHlxGlob.period();
00286
00287 if(periodLGlob<2*pathGlob) {
00288 printf(" Warn, long path Global fac=%.1f ",pathGlob/periodLGlob);
00289 printf(" punchEEMC1 x,y,z=%.1f, %.1f, %.1f path=%.1f period=%.1f\n",r.x(),r.y(),r.z(),pathGlob,periodLGlob);
00290 }
00291 TVector3 rCrossGlob(rGlob.x(),rGlob.y(),rGlob.z());
00292 T.pointTower.Rglob=rCrossGlob;
00293
00294 }
00295 }
00296
00297 if(nTrE<=0) return -1;
00298 hE[0]->Fill("TrE",1.0);
00299 return 0;
00300
00301 }
00302
00303
00304
00305
00306 int
00307 St2011WMaker::matchTrack2EtowCluster(){
00308
00309
00310 if(!wEve->l2EbitET) return 0;
00311
00312 int nTr=0;
00313 for(uint iv=0;iv<wEve->vertex.size();iv++) {
00314 WeveVertex &V=wEve->vertex[iv];
00315 float zVert=V.z;
00316 for(uint it=0;it<V.eleTrack.size();it++) {
00317 WeveEleTrack &T=V.eleTrack[it];
00318 if(T.pointTower.id>=0) continue;
00319
00320 float trackPT=T.prMuTrack->momentum().perp();
00321 T.cluster=maxEtow2x1(T.pointTower.iEta,T.pointTower.iPhi,zVert);
00322 hE[110]->Fill( T.cluster.ET);
00323 hE[33]->Fill(T.cluster.ET);
00324 hE[34]->Fill(T.cluster.adcSum,trackPT);
00325
00326
00327 int iEta=T.cluster.iEta;
00328 int iPhi=T.cluster.iPhi;
00329
00330 T.cl4x4=sumEtowPatch(iEta-1,iPhi-1,4,4,zVert);
00331
00332 if (T.cluster.ET<parE_clustET) continue;
00333 hE[20]->Fill("CL",1.);
00334 hE[37]->Fill(T.cl4x4.ET);
00335 hE[38]->Fill(T.cluster.energy, T.cl4x4.energy-T.cluster.energy);
00336
00337 float frac24=T.cluster.ET/(T.cl4x4.ET);
00338 hE[39]->Fill(frac24);
00339 if(frac24<parE_clustFrac24) continue;
00340 hE[20]->Fill("fr24",1.);
00341
00342
00343 float newMag=geomE->getZSMD()/TMath::Cos(T.cluster.position.Theta());
00344 T.cluster.position.SetMag(newMag);
00345
00346
00347 TVector3 D=T.pointTower.R-T.cluster.position;
00348 hE[43]->Fill(T.cluster.energy,D.Perp());
00349 float delPhi=T.pointTower.R.DeltaPhi(T.cluster.position);
00350 float Rxy=T.cluster.position.Perp();
00351
00352 hE[44]->Fill( T.cluster.position.Phi(),Rxy*delPhi);
00353 hE[45]->Fill( T.cluster.energy,Rxy*delPhi);
00354 hE[46]->Fill( D.Perp());
00355
00356 if(D.Perp()>par_delR3D) continue;
00357 T.isMatch2Cl=true;
00358 hE[20]->Fill("#Delta R",1.);
00359 hE[111]->Fill( T.cluster.ET);
00360
00361 nTr++;
00362 }
00363 }
00364
00365 if(nTr<=0) return -1;
00366 hE[0]->Fill("Tr2Cl",1.0);
00367 return 0;
00368
00369 }
00370
00371
00372
00373
00374 WeveCluster
00375 St2011WMaker::maxEtow2x1(int iEta, int iPhi, float zVert){
00376
00377
00378 WeveCluster maxCL;
00379
00380 float maxET=0;
00381 int I0=iEta-1;
00382 int J0=iPhi-1;
00383 for(int I=I0;I<=I0+1;I++){
00384 WeveCluster CL=sumEtowPatch(I,iPhi,2,1,zVert);
00385 if(maxET>CL.ET) continue;
00386 maxET=CL.ET;
00387 maxCL=CL;
00388
00389 }
00390
00391 for(int J=J0;J<=J0+1;J++) {
00392 WeveCluster CL=sumEtowPatch(iEta,J,1,2,zVert);
00393 if(maxET>CL.ET) continue;
00394 maxET=CL.ET;
00395 maxCL=CL;
00396
00397 }
00398
00399 return maxCL;
00400 }
00401
00402
00403
00404
00405 WeveCluster
00406 St2011WMaker::sumEtowPatch(int iEta, int iPhi, int Leta,int Lphi, float zVert){
00407
00408 WeveCluster CL;
00409 CL.iEta=iEta;
00410 CL.iPhi=iPhi;
00411 TVector3 R;
00412 double sumW=0;
00413
00414 for(int i=iEta; i<iEta+Leta;i++){
00415 if(i<0) continue;
00416 if(i>=mxEtowEta) continue;
00417 for(int j=iPhi;j<iPhi+Lphi;j++) {
00418 int jj=(j+mxEtowPhiBin)%mxEtowPhiBin;
00419
00420
00421 float ene= wEve->etow.ene[jj][i];
00422 if(ene<=0) continue;
00423 float adc= wEve->etow.adc[jj][i];
00424 float delZ=positionEtow[jj][i].z()-zVert;
00425 float Rxy=positionEtow[jj][i].Perp();
00426 float e2et=Rxy/sqrt(Rxy*Rxy+delZ*delZ);
00427 float ET=ene*e2et;
00428 float logET=log10(ET+0.5);
00429 CL.nTower++;
00430 CL.energy+=ene;
00431 CL.ET+=ET;
00432 CL.adcSum+=adc;
00433 if(logET>0) {
00434 R+=logET*positionEtow[jj][i];
00435 sumW+=logET;
00436 }
00437 }
00438
00439 if(sumW>0) {
00440 CL.position=1./sumW*R;
00441 } else {
00442 CL.position=TVector3(0,0,999);
00443 }
00444 }
00445 return CL;
00446 }
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460