00001 #include "StEEmcDisplay.h"
00002
00003 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00004
00005 #include "TH1F.h"
00006 #include "TH2F.h"
00007 #include "TMarker.h"
00008 #include "TLine.h"
00009 #include "TCanvas.h"
00010 #include "TPaveText.h"
00011 #include "TLatex.h"
00012
00013 #include "StMessMgr.h"
00014
00015 ClassImp(StEEmcDisplay);
00016
00017 StEEmcDisplay::StEEmcDisplay( const Char_t *name, const Char_t *title ) : TNamed(name,title)
00018 {
00019 memset( mTowerEnergy, 0, sizeof(mTowerEnergy) );
00020 memset( mTowerStat, 0, sizeof(mTowerStat) );
00021 memset( mTowerFail, 0, sizeof(mTowerFail) );
00022 memset( mStripEnergy, 0, sizeof(mStripEnergy) );
00023 memset( mStripStat, 0, sizeof(mStripStat) );
00024 memset( mStripFail, 0, sizeof(mStripFail) );
00025 eemc=0;
00026 smdu=0;
00027 smdv=0;
00028 pre1=0;
00029 pre2=0;
00030 post=0;
00031 hTowers=0;
00032 hPre1=0;
00033 hPre2=0;
00034 hPost=0;
00035 geom = new EEmcGeomSimple();
00036 mEnergy2Mip=1000.0/1.3;
00037 nClustersU=0;
00038 nClustersV=0;
00039 nPoints=0;
00040 nPi0=0;
00041 nEta=0;
00042 mHighTowerEtabin=-1;
00043 mHighTowerPhibin=-1;
00044 mHighTowerEnergy=0.;
00045 }
00046
00047 void StEEmcDisplay::clear()
00048 {
00049
00050 memset( mTowerEnergy, 0, sizeof(mTowerEnergy) );
00051 memset( mTowerStat, 0, sizeof(mTowerStat) );
00052 memset( mTowerFail, 0, sizeof(mTowerFail) );
00053 memset( mStripEnergy, 0, sizeof(mStripEnergy) );
00054 memset( mStripStat, 0, sizeof(mStripStat) );
00055 memset( mStripFail, 0, sizeof(mStripFail) );
00056
00057 mHighTowerEtabin=-1;
00058 mHighTowerPhibin=-1;
00059 mHighTowerEnergy=0.;
00060
00061 mClusterKey.clear();
00062 mClusterEnergy.clear();
00063 mClusterMean.clear();
00064 mClusterSigma.clear();
00065 mClusterSector.clear();
00066 mClusterPlane.clear();
00067 for ( UInt_t ii=0;ii<mClusterStrips.size();ii++) mClusterStrips[ii].clear();
00068 mClusterStrips.clear();
00069 mClusterHisto.clear();
00070 mClusterStats.clear();
00071 mClusterColor.clear();
00072 mClusterFill.clear();
00073 mClusterSplit.clear();
00074
00075 mPointKey.clear();
00076 mPointEnergy.clear();
00077 mPointX.clear();
00078 mPointY.clear();
00079 mPointMarker.clear();
00080 mPointColor.clear();
00081 mPointStyle.clear();
00082 mPointUkey.clear();
00083 mPointVkey.clear();
00084
00085 if (hTowers ) delete hTowers;
00086 hTowers=0;
00087
00088 if ( hPre1 ) delete hPre1;
00089 hPre1=0;
00090
00091 if ( hPre2 ) delete hPre2;
00092 hPre2 = 0;
00093
00094 if ( hPost) delete hPost;
00095 hPost = 0;
00096
00097 for ( Int_t sec=0;sec<12;sec++ )
00098 for ( Int_t plane=0;plane<2;plane++ ){
00099 if ( hSmds[sec][plane] ) delete hSmds[sec][plane];
00100 hSmds[sec][plane]=0;
00101 }
00102 if (eemc) delete eemc; eemc=0;
00103 if (smdu) delete smdu; smdu=0;
00104 if (smdv) delete smdv; smdv=0;
00105
00106 if (pre1) delete pre1; pre1=0;
00107 if (pre2) delete pre2; pre2=0;
00108 if (post) delete post; post=0;
00109
00110 nClustersU=0;
00111 nClustersV=0;
00112 nPoints=0;
00113 nPi0=0;
00114 nEta=0;
00115
00116 }
00117
00118 void StEEmcDisplay::add( StEEmcTower tower )
00119 {
00120 Int_t sec = tower.sector();
00121 Int_t sub = tower.subsector();
00122 Int_t eta = tower.etabin();
00123 Int_t layer=tower.layer();
00124 if ( layer == 0 ){
00125 mTowerEnergy[sec][sub][eta]=tower.energy();
00126 mTowerStat[sec][sub][eta]=tower.stat();
00127 mTowerFail[sec][sub][eta]=tower.fail();
00128 }
00129 else{
00130 mPrepostEnergy[sec][sub][eta][layer-1]=tower.energy();
00131 mPrepostStat[sec][sub][eta][layer-1]=tower.stat();
00132 mPrepostFail[sec][sub][eta][layer-1]=tower.fail();
00133 return;
00134 }
00135
00136 if ( tower.energy() > mHighTowerEnergy )
00137 {
00138 mHighTowerEtabin=eta;
00139 mHighTowerPhibin=tower.phibin();
00140 mHighTowerEnergy=tower.energy();
00141 }
00142
00143 }
00144
00145 void StEEmcDisplay::add( StEEmcStrip strip )
00146 {
00147 Int_t sec = strip.sector();
00148 Int_t plane = strip.plane();
00149 Int_t index=strip.index();
00150 mStripEnergy[sec][plane][index]=strip.energy();
00151 mStripStat[sec][plane][index]=strip.stat();
00152 mStripFail[sec][plane][index]=strip.fail();
00153 }
00154
00155 void StEEmcDisplay::add( StEEmcSmdCluster cluster, Int_t color, Int_t fill )
00156 {
00157 mClusterKey.push_back( cluster.key() );
00158 mClusterSector.push_back( cluster.sector() );
00159 mClusterEnergy.push_back( cluster.energy() );
00160 mClusterPlane.push_back( cluster.plane() );
00161 std::vector< Int_t > strips;
00162 for ( Int_t ii=0;ii<cluster.size();ii++ )
00163 strips.push_back( cluster.strip(ii).index() );
00164 mClusterStrips.push_back( strips );
00165 mClusterColor.push_back( color );
00166 mClusterFill.push_back( fill );
00167 mClusterMean.push_back( cluster.mean() );
00168 mClusterSigma.push_back( cluster.sigma() );
00169 mClusterSplit.push_back( cluster.split() );
00170 if ( cluster.plane()==0 ) nClustersU++;
00171 if ( cluster.plane()==1 ) nClustersV++;
00172 }
00173
00174 void StEEmcDisplay::add( StEEmcPoint point, Int_t color, Int_t style )
00175 {
00176 mPointKey.push_back( point.key() );
00177 mPointEnergy.push_back( point.energy() );
00178 TVector3 position=point.position();
00179 mPointX.push_back( position.X() );
00180 mPointY.push_back( position.Y() );
00181 mPointColor.push_back( color );
00182 mPointStyle.push_back( style );
00183 mPointUkey.push_back( point.cluster(0).key() );
00184 mPointVkey.push_back( point.cluster(1).key() );
00185 nPoints++;
00186 }
00187
00188
00189
00190 TH2F *StEEmcDisplay::DrawTowers(Option_t *opts)
00191 {
00192
00193
00194 if ( !eemc ) {
00195 eemc=new TCanvas(TString("eemc-")+GetName(),GetTitle(),600,400);
00196 eemc->cd();
00197 }
00198
00199 if ( hTowers ) {
00200 hTowers -> Draw(opts);
00201 return hTowers;
00202 }
00203
00204
00205 hTowers = new TH2F(TString("hTowers-")+GetName(),GetTitle(),62,-1.,61.,12,0.,12.);
00206
00207
00208 for ( Int_t sec=0;sec<kEEmcNumSectors;sec++ )
00209 for ( Int_t sub=0;sub<kEEmcNumSubSectors;sub++ )
00210 for ( Int_t eta=0;eta<kEEmcNumEtas;eta++ )
00211 {
00212
00213 Float_t x = 5*sec+sub; x+=0.5;
00214 Float_t y = eta; y+=0.5;
00215 Int_t bin = hTowers->FindBin ( x, y );
00216
00217 if ( !mTowerFail[sec][sub][eta] )
00218 hTowers->SetBinContent( bin, mTowerEnergy[sec][sub][eta] );
00219 else {
00220 failTower(sec,sub,eta, hTowers);
00221
00222 };
00223
00224
00225 if ( sec==11 && sub==4 )
00226 {
00227 x=-0.5;
00228 bin = hTowers->FindBin ( x, y );
00229
00230 if ( !mTowerFail[sec][sub][eta] )
00231 hTowers->SetBinContent( bin, mTowerEnergy[sec][sub][eta] );
00232 else
00233 failTower(0,-1,eta,hTowers);
00234
00235 }
00236
00237
00238 if ( sec==0 && sub==0 )
00239 {
00240 x=60.5;
00241 bin = hTowers->FindBin ( x, y );
00242 if ( !mTowerFail[sec][sub][eta] )
00243 hTowers->SetBinContent( bin, mTowerEnergy[sec][sub][eta] );
00244 else
00245 failTower(12,5,eta,hTowers);
00246 }
00247
00248 }
00249
00250
00251 for ( Float_t x=0.0; x<=60.0; x+=5.0 ) {
00252 hTowers->GetListOfFunctions()->Add( new TLine( x, 0., x, 12.0 ) );
00253 }
00254 hTowers->GetXaxis()->SetRangeUser(0.,59.9);
00255
00256 hTowers->Draw(opts);
00257 return hTowers;
00258
00259 }
00260
00261
00262
00263
00264
00265
00266 TH2F *StEEmcDisplay::DrawLayer(Int_t layer, Option_t *opts)
00267 {
00268
00269
00270 if ( layer==0 ) return DrawTowers(opts);
00271 if ( layer > 3 ) {
00272 LOG_WARN<<" Invalid layer passed to DrawLayer(...)"<<endm;
00273 return 0;
00274 }
00275
00276 TCanvas *mycanvas = 0;
00277
00278 if ( layer==1 )
00279 mycanvas=pre1;
00280 if ( layer==2 )
00281 mycanvas=pre2;
00282 if ( layer==3 )
00283 mycanvas=post;
00284
00285 const Char_t *cnames[]={"eemc","pre1","pre2","post"};
00286 TH2F *his[]={hTowers,hPre1,hPre2,hPost};
00287 TH2F *myhist=his[layer];
00288 const Char_t *hnames[]={"hTowers","hPre1","hPre2","hPost"};
00289
00290
00291 if ( !mycanvas ) {
00292 mycanvas=new TCanvas(TString(cnames[layer])+GetName(),GetTitle(),600,400);
00293 mycanvas->cd();
00294 if ( layer==1 )pre1=mycanvas;
00295 if ( layer==2 )pre2=mycanvas;
00296 if ( layer==3 )post=mycanvas;
00297 }
00298
00299
00300
00301 if ( myhist ) {
00302 myhist -> Draw(opts);
00303 return myhist;
00304 }
00305
00306
00307 const Char_t *titles[]={"Towers: ","Preshower 1: ", "Preshower 2: ", "Postshower: "};
00308
00309
00310 myhist = new TH2F(TString(hnames[layer])+GetName(),TString(titles[layer])+GetTitle(),62,-1.,61.,12,0.,12.);
00311 assert(myhist);
00312
00313
00314 for ( Int_t sec=0;sec<kEEmcNumSectors;sec++ )
00315 for ( Int_t sub=0;sub<kEEmcNumSubSectors;sub++ )
00316 for ( Int_t eta=0;eta<kEEmcNumEtas;eta++ )
00317 {
00318
00319 Float_t x = 5*sec+sub; x+=0.5;
00320 Float_t y = eta; y+=0.5;
00321 Int_t bin = myhist->FindBin ( x, y );
00322
00323 if ( !mPrepostFail[sec][sub][eta][layer-1] )
00324 myhist->SetBinContent( bin,1000.* mPrepostEnergy[sec][sub][eta][layer-1] );
00325 else {
00326 failTower(sec,sub,eta, myhist);
00327
00328 };
00329
00330
00331 if ( sec==11 && sub==4 )
00332 {
00333 x=-0.5;
00334 bin = myhist->FindBin ( x, y );
00335
00336 if ( !mPrepostFail[sec][sub][eta][layer-1] )
00337 myhist->SetBinContent( bin, 1000.* mPrepostEnergy[sec][sub][eta][layer-1] );
00338 else
00339 failTower(0,-1,eta,myhist);
00340
00341 }
00342
00343
00344 if ( sec==0 && sub==0 )
00345 {
00346 x=60.5;
00347 bin = myhist->FindBin ( x, y );
00348 if ( !mPrepostFail[sec][sub][eta][layer-1] )
00349 myhist->SetBinContent( bin, 1000.*mPrepostEnergy[sec][sub][eta][layer-1] );
00350 else
00351 failTower(12,5,eta,myhist);
00352 }
00353
00354 }
00355
00356
00357 for ( Float_t x=0.0; x<=60.0; x+=5.0 ) {
00358 myhist->GetListOfFunctions()->Add( new TLine( x, 0., x, 12.0 ) );
00359 }
00360 myhist->GetXaxis()->SetRangeUser(0.,59.9);
00361
00362 myhist->Draw(opts);
00363 return myhist;
00364
00365 }
00366
00367
00368
00369
00370
00371
00372 TH2F *StEEmcDisplay::DrawPoints( Option_t *opts )
00373 {
00374
00375 TH2F *towers = DrawTowers();
00376
00377 if ( !mPointMarker.size() )
00378 for ( UInt_t ii=0;ii<mPointKey.size();ii++ )
00379 {
00380
00381 Float_t x=mPointX[ii];
00382 Float_t y=mPointY[ii];
00383 TVector3 position(x,y,kEEmcZSMD);
00384
00385 Int_t sec,sub,eta;
00386 Float_t dphi,deta;
00387 if ( !geom->getTower( position, sec, sub, eta, dphi, deta ) ){
00388
00389 position.Print();
00390 return towers;
00391 }
00392 Float_t myphi = 0.5 + 5*sec + ((Float_t)sub) + 0.5*dphi;
00393 Float_t myeta = 0.5 + ((Float_t)eta) + 0.5*deta;
00394
00395 TMarker *m=new TMarker( myphi, myeta, mPointStyle[ii] );
00396 m->SetMarkerColor( mPointColor[ii] );
00397 mPointMarker.push_back(m);
00398
00399 TLatex *tex=new TLatex( myphi+0.05, myeta, Form("uid=%i vid=%i",mPointUkey[ii],mPointVkey[ii]) );
00400 tex->SetTextColor( mPointColor[ii] );
00401 towers->GetListOfFunctions()->Add(tex);
00402
00403 }
00404
00405 for ( UInt_t ii=0;ii<mPointMarker.size();ii++ )
00406 {
00407 mPointMarker[ii]->Draw();
00408 }
00409
00410 return towers;
00411
00412
00413 }
00414
00415
00416
00417
00418 TH1F *StEEmcDisplay::DrawSmd( Int_t sector, Int_t plane, Option_t *opts )
00419 {
00420
00421 const Char_t *name_planes[]={"smdu","smdv"};
00422 const Char_t *name_uv[]={"U","V"};
00423
00424
00425 TCanvas *mycanvas = (plane==0)? smdu : smdv;
00426 if ( !mycanvas )
00427 {
00428 mycanvas = new TCanvas(TString(name_planes[plane])+"-"+GetName(),GetTitle(),600,400);
00429 if ( plane==0 ) smdu=mycanvas; else smdv=mycanvas;
00430 }
00431 mycanvas->cd();
00432
00433
00434
00435 if ( hSmds[sector][plane] )
00436 {
00437 hSmds[sector][plane]->Draw(opts);
00438 return hSmds[sector][plane];
00439 }
00440
00441
00442
00443 TString hname="h";
00444 if ( sector+1<10 ) hname+="0";
00445 hname+=(sector+1);
00446 hname+=name_uv[plane];
00447 hname+="::";
00448 hname+=GetName();
00449 TH1F *histo=new TH1F(hname,TString(GetTitle())+";index;Nmips",288,0.,288.);
00450 hSmds[sector][plane]=histo;
00451
00452 for ( Int_t strip=0;strip<kEEmcNumStrips;strip++ )
00453 {
00454 Float_t energy = mStripEnergy[sector][plane][strip];
00455 if ( !mStripFail[sector][plane][strip] )
00456 histo->SetBinContent( strip+1, energy*mEnergy2Mip );
00457 else { }
00458 }
00459
00460 hSmds[sector][plane]->Draw(opts);
00461
00462 return hSmds[sector][plane];
00463
00464 }
00465
00466
00467
00468 TH1F *StEEmcDisplay::DrawClusters( Int_t sector, Int_t plane, Option_t *opts )
00469 {
00470
00471 Bool_t draw_stats = false;
00472 TString myopts=opts;
00473 if ( myopts.Contains("stats") )
00474 {
00475 myopts.ReplaceAll("stats","");
00476 opts=myopts.Data();
00477 draw_stats=true;
00478 }
00479
00480 TH1F *hsmd = DrawSmd(sector, plane, opts );
00481
00482 for ( UInt_t ii=0;ii<mClusterKey.size();ii++ )
00483 {
00484 if ( sector == mClusterSector[ii] &&
00485 plane == mClusterPlane[ii] )
00486 {
00487 DrawCluster(ii,"same");
00488 }
00489 }
00490
00491
00492 if ( draw_stats )
00493 for ( UInt_t ii=0;ii<mClusterKey.size();ii++ )
00494 {
00495 if ( sector == mClusterSector[ii] &&
00496 plane == mClusterPlane[ii] )
00497 {
00498
00499 Int_t key = mClusterKey[ii];
00500 Float_t energy = mClusterEnergy[ii];
00501 Float_t nmips = energy * mEnergy2Mip;
00502 Float_t mean = mClusterMean[ii];
00503 Float_t sigma = mClusterSigma[ii];
00504 Int_t sector = mClusterSector[ii];
00505 Int_t plane = mClusterPlane[ii];
00506 Int_t color = mClusterColor[ii];
00507 Int_t fill = mClusterFill[ii];
00508 TCanvas *c = (plane==0)? smdu : smdv;
00509 c->cd();
00510
00511 Int_t imean=(Int_t)mean;
00512 Float_t Iright = hSmds[sector][plane]->Integral( imean+6,imean+10 );
00513 Float_t Ileft = hSmds[sector][plane]->Integral( imean-10, imean-6);
00514
00515 Float_t xpave = mean + 6.0;
00516 Float_t ypave = hSmds[sector][plane]->GetBinContent(imean+1);
00517 if ( Iright > 0.4 * nmips && Ileft < 0.4 * nmips )
00518 {
00519 xpave = mean - 25.0;
00520 }
00521
00522 TPaveText *text=new TPaveText( xpave, ypave*0.7, xpave+20, ypave );
00523 text->SetFillColor( color );
00524 text->SetFillStyle( fill );
00525 text->AddText(Form("cluster id = %i",key));
00526 text->AddText(Form("energy = %5.2f MeV",energy*1000.0));
00527 text->AddText(Form("mean = %5.1f", mean));
00528 text->AddText(Form("sigma = %5.3f", sigma));
00529 if ( mClusterSplit[ii] )
00530 text->AddText(Form("split cluster"));
00531
00532
00533 hsmd->GetListOfFunctions()->Add( text );
00534 text->Draw();
00535
00536 }
00537 }
00538
00539
00540 return hsmd;
00541
00542 }
00543
00544
00545
00546
00547 TH1F *StEEmcDisplay::DrawCluster( Int_t icluster, Option_t *opts )
00548 {
00549
00550
00551 Int_t plane = mClusterPlane [ icluster ];
00552
00553 assert( (plane==0)?smdu:smdv );
00554
00555 if ( plane==0 ) smdu->cd();
00556 if ( plane==1 ) smdv->cd();
00557
00558
00559
00560 if ( mClusterHisto.size() )
00561 {
00562 mClusterHisto[ icluster ]->Draw(opts);
00563 return mClusterHisto[icluster];
00564 }
00565
00566
00567 const Char_t *name_uv[]={"U","V"};
00568 for ( UInt_t ii=0;ii<mClusterKey.size();ii++ )
00569 {
00570
00571 Int_t sector = mClusterSector[ ii ];
00572 Int_t plane = mClusterPlane[ ii ];
00573 TString UV=name_uv[plane];
00574
00575 LOG_INFO <<"+ cluster "
00576 << ( (sector<9)?"0":"" )
00577 << (sector+1)
00578 << UV
00579 << " key=" << mClusterKey[ii]
00580 << " col=" << mClusterColor[ii]
00581 << " fill="<< mClusterFill[ii]
00582 << endm;
00583
00584 TString hname="h";
00585 if ( sector+1<10 ) hname+="0";
00586 hname+=(sector+1);
00587 hname+=name_uv[plane];
00588 hname+="key";
00589 hname+=mClusterKey[ii];
00590 hname+="::";
00591 hname+=GetName();
00592 hname+=ii;
00593
00594 TH1F *histo = new TH1F(hname,GetTitle(),kEEmcNumStrips,0.,(Float_t)kEEmcNumStrips);
00595
00596 for ( UInt_t jj=0;jj<mClusterStrips[ii].size();jj++ )
00597 {
00598 Int_t index=mClusterStrips[ii][jj];
00599 Float_t energy = mStripEnergy[ sector ][ plane ][ index ];
00600 histo->SetBinContent( index+1, energy*mEnergy2Mip );
00601 }
00602
00603 histo->SetFillColor( mClusterColor[ii] );
00604 histo->SetFillStyle( mClusterFill[ii] );
00605
00606 mClusterHisto.push_back( histo );
00607
00608 }
00609
00610
00611 mClusterHisto[icluster]->Draw(opts);
00612
00613 return mClusterHisto[icluster];
00614
00615
00616 }
00617
00618
00619 void StEEmcDisplay::failTower( Int_t sec, Int_t sub, Int_t eta, TH2F *histo )
00620 {
00621 Float_t x1=5*sec+sub;
00622 Float_t x2=x1+1.0;
00623 Float_t y1=eta;
00624 Float_t y2=eta+1;
00625 TLine *l1=new TLine(x1,y1,x2,y2);l1->SetLineColor(2);
00626 TLine *l2=new TLine(x2,y1,x1,y2);l2->SetLineColor(2);
00627 histo->GetListOfFunctions()->Add(l1);
00628 histo->GetListOfFunctions()->Add(l2);
00629 }
00630
00631
00632 Float_t StEEmcDisplay::sumEnergy(Int_t layer)
00633 {
00634
00635 if ( layer > 3 ) {
00636 LOG_WARN<<" sumEnergy not yet implemented for SMD'ss"<<endm;
00637 return -1.0;
00638 }
00639
00640 Float_t sum = 0.;
00641 for ( Int_t sec=0;sec<12;sec++ )
00642 for ( Int_t sub=0;sub<5;sub++ )
00643 for ( Int_t eta=0;eta<12;eta++ )
00644 {
00645 if ( layer==0 ) {
00646 sum += mTowerEnergy[sec][sub][eta];
00647 }
00648 else {
00649 sum += mPrepostEnergy[sec][sub][eta][layer-1];
00650 }
00651 }
00652
00653 if ( layer > 0 ) sum *= 1000.0;
00654 return sum;
00655
00656 }
00657
00658 Int_t StEEmcDisplay::hitMultiplicity(Int_t layer, Float_t threshold)
00659 {
00660
00661 if ( layer > 3 ) {
00662 LOG_WARN<<" sumEnergy not yet implemented for SMD'ss"<<endm;
00663 return -1;
00664 }
00665
00666 Int_t sum = 0;
00667 for ( Int_t sec=0;sec<12;sec++ )
00668 for ( Int_t sub=0;sub<5;sub++ )
00669 for ( Int_t eta=0;eta<12;eta++ )
00670 {
00671 if ( layer==0 ) {
00672 if ( mTowerEnergy[sec][sub][eta] > threshold ) sum++;
00673 }
00674 else {
00675 if ( mPrepostEnergy[sec][sub][eta][layer-1] *1000.0 > threshold ) sum++;
00676 }
00677 }
00678
00679 return sum;
00680
00681 }