Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
calo_detail.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_eve
3 /// Calorimeter detailed view by using TEveCaloDataVec as data-source.
4 /// Demonstrates how to plot calorimeter data with irregular bins.
5 ///
6 /// \image html eve_calo_detail.png
7 /// \macro_code
8 ///
9 /// \author Alja Mrak-Tadel
10 
11 #include "calorimeters.C"
12 
13 TEveCaloDataVec* MakeVecData(Int_t ncells=0);
14 
15 void calo_detail()
16 {
17  TEveManager::Create();
18 
19  // data
20  auto data = MakeVecData(20);
21  data->IncDenyDestroy(); // don't delete if zero parent
22 
23  // frames
24  auto slot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
25  auto packH = slot->MakePack();
26  packH->SetElementName("Projections");
27  packH->SetHorizontal();
28  packH->SetShowTitleBar(kFALSE);
29 
30  slot = packH->NewSlot();
31  auto pack0 = slot->MakePack();
32  pack0->SetShowTitleBar(kFALSE);
33  auto slotLeftTop = pack0->NewSlot();
34  auto slotLeftBottom = pack0->NewSlot();
35 
36  slot = packH->NewSlot();
37  auto pack1 = slot->MakePack();
38  pack1->SetShowTitleBar(kFALSE);
39  auto slotRightTop = pack1->NewSlot();
40  auto slotRightBottom = pack1->NewSlot();
41 
42  // viewers ans scenes in second tab
43  Float_t maxH = 300;
44  TEveCalo3D* calo3d = MakeCalo3D(data, slotRightTop);
45  calo3d->SetMaxTowerH(maxH);
46 
47  TEveCalo2D* calo2d;
48  calo2d = MakeCalo2D(calo3d, slotLeftTop, TEveProjection::kPT_RPhi);
49  calo2d->SetMaxTowerH(maxH);
50  calo2d = MakeCalo2D(calo3d, slotLeftBottom, TEveProjection::kPT_RhoZ);
51  calo2d->SetMaxTowerH(maxH);
52 
53  TEveCaloLego* lego = MakeCaloLego(data, slotRightBottom);
54  lego->SetAutoRebin(kFALSE);
55  lego->Set2DMode(TEveCaloLego::kValSizeOutline);
56 
57  gEve->AddElement(lego);
58  gEve->GetDefaultGLViewer()->SetCurrentCamera(TGLViewer::kCameraPerspXOY);
59 
60  gEve->GetBrowser()->GetTabRight()->SetTab(1);
61  gEve->FullRedraw3D(kTRUE);
62 
63 }
64 
65 //______________________________________________________________________________
66 TEveCaloDataVec* MakeVecData(Int_t ncells)
67 {
68  // Example how to fill data when bins can be irregular.
69  // If ncells = 0 (default) whole histogram is taken,
70  // otherwise just ncells cells around the maximum.
71 
72  TFile::SetCacheFileDir(".");
73  auto hf = TFile::Open(histFile, "CACHEREAD");
74  TH2F* h1 = (TH2F*)hf->Get("ecalLego");
75  TH2F* h2 = (TH2F*)hf->Get("hcalLego");
76 
77  auto data = new TEveCaloDataVec(2);
78  data->RefSliceInfo(0).Setup("ECAL", 0.3, kRed);
79  data->RefSliceInfo(1).Setup("HCAL", 0.1, kBlue);
80 
81  auto ax = h1->GetXaxis();
82  auto ay = h1->GetYaxis();
83 
84  Int_t xm = 1, xM = ax->GetNbins();
85  Int_t ym = 1, yM = ay->GetNbins();
86  if (ncells != 0)
87  {
88  Int_t cx, cy, cz;
89  h1->GetMaximumBin(cx, cy, cz);
90  xm = TMath::Max(xm, cx-ncells);
91  xM = TMath::Min(xM, cx+ncells);
92  ym = TMath::Max(ym, cy-ncells);
93  yM = TMath::Min(yM, cy+ncells);
94  }
95 
96  // Take every second cell and set a random size.
97  for (Int_t i=xm; i<=xM; i+=2) {
98  for (Int_t j=ym; j<=yM; j+=2) {
99  if ( (i+j) % 3) {
100  data->AddTower(ax->GetBinLowEdge(i), ax->GetBinUpEdge(i),
101  ay->GetBinLowEdge(j), ay->GetBinUpEdge(j));
102  data->FillSlice(0, h1->GetBinContent(i, j));
103  data->FillSlice(1, h2->GetBinContent(i, j));
104  } else {
105  data->AddTower(ax->GetBinLowEdge(i),
106  2 * ax->GetBinWidth(i) + ax->GetBinLowEdge(i),
107  ay->GetBinLowEdge(j),
108  2 * ay->GetBinWidth(j) + ay->GetBinLowEdge(j));
109  data->FillSlice(0, h2->GetBinContent(i, j));
110  data->FillSlice(1, h2->GetBinContent(i, j));
111  }
112  }
113  }
114 
115  data->SetEtaBins(ax);
116  data->SetPhiBins(ay);
117  data->DataChanged();
118  return data;
119 }