Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
calorimeters.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_eve
3 /// Demonstrates usage of EVE calorimetry classes.
4 ///
5 /// \image html eve_calorimeters.png
6 /// \macro_code
7 ///
8 /// \author Alja Mrak-Tadel
9 
10 #include "TEveProjections.h"
11 #include "TSystem.h"
12 #include "TEveCalo.h"
13 #include "TEveWindow.h"
14 #include "TEveManager.h"
15 #include "TEveBrowser.h"
16 #include "TEveProjectionAxes.h"
17 #include "TEveScene.h"
18 #include "TEveViewer.h"
19 #include "TEveTrans.h"
20 #include "TEveCaloLegoOverlay.h"
21 #include "TEveLegoEventHandler.h"
22 #include "TEveGedEditor.h"
23 #include "TEveJetCone.h"
24 
25 #include "TGLWidget.h"
26 #include "TGLViewer.h"
27 #include "TGTab.h"
28 
29 #include "TFile.h"
30 #include "TAxis.h"
31 
32 
33 const char* histFile =
34  "http://amraktad.web.cern.ch/amraktad/cms_calo_hist.root";
35 
36 TEveCaloLego* MakeCaloLego(TEveCaloData* data, TEveWindowSlot* slot);
37 TEveCalo2D* MakeCalo2D(TEveCalo3D* calo3d, TEveWindowSlot* slot, TEveProjection::EPType_e t);
38 TEveCalo3D* MakeCalo3D(TEveCaloData* data, TEveWindowSlot* slot);
39 TEveCalo2D* MakeCalo2D(TEveCalo3D* calo3d, TEveWindowSlot* slot, TEveProjection::EPType_e t);
40 void MakeViewerScene(TEveWindowSlot* slot, TEveViewer*& v, TEveScene*& s);
41 void add_jet(TEveElement*, const char*, Float_t, Float_t, Float_t, Float_t);
42 
43 void calorimeters()
44 {
45  // gSystem->IgnoreSignal(kSigSegmentationViolation, true);
46  TEveManager::Create();
47 
48  // event data
49  TFile::SetCacheFileDir(".");
50  auto hf = TFile::Open(histFile, "CACHEREAD");
51  auto ecalHist = (TH2F*)hf->Get("ecalLego");
52  auto hcalHist = (TH2F*)hf->Get("hcalLego");
53  auto data = new TEveCaloDataHist();
54  data->AddHistogram(ecalHist);
55  data->RefSliceInfo(0).Setup("ECAL", 0.3, kBlue);
56  data->AddHistogram(hcalHist);
57  data->RefSliceInfo(1).Setup("HCAL", 0.1, kRed);
58  data->GetEtaBins()->SetTitleFont(120);
59  data->GetEtaBins()->SetTitle("h");
60  data->GetPhiBins()->SetTitleFont(120);
61  data->GetPhiBins()->SetTitle("f");
62  data->IncDenyDestroy();
63  gEve->AddToListTree(data, kFALSE);
64 
65 
66  // first tab
67  auto lego = MakeCaloLego(data, 0);
68 
69  //
70  // second tab
71  //
72 
73  // frames
74  auto slot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
75  auto packH = slot->MakePack();
76  packH->SetElementName("Projections");
77  packH->SetHorizontal();
78  packH->SetShowTitleBar(kFALSE);
79 
80  slot = packH->NewSlot();
81  auto pack0 = slot->MakePack();
82  pack0->SetShowTitleBar(kFALSE);
83  auto slotLeftTop = pack0->NewSlot();
84  auto slotLeftBottom = pack0->NewSlot();
85 
86  slot = packH->NewSlot();
87  auto pack1 = slot->MakePack();
88  pack1->SetShowTitleBar(kFALSE);
89  auto slotRightTop = pack1->NewSlot();
90  auto slotRightBottom = pack1->NewSlot();
91 
92  // viewers ans scenes in second tab
93  auto calo3d = MakeCalo3D(data, slotRightTop);
94  MakeCalo2D(calo3d, slotLeftTop, TEveProjection::kPT_RPhi);
95  MakeCalo2D(calo3d, slotLeftBottom, TEveProjection::kPT_RhoZ);
96  lego = MakeCaloLego(data, slotRightBottom);
97 
98 
99  gEve->GetBrowser()->GetTabRight()->SetTab(1);
100  gEve->Redraw3D(kTRUE);
101 }
102 
103 //______________________________________________________________________________
104 TEveCaloLego* MakeCaloLego(TEveCaloData* data, TEveWindowSlot* slot)
105 {
106  // Eta-phi lego view.
107 
108  TEveViewer* v;
109  TEveScene* s;
110  if (slot) {
111  MakeViewerScene(slot, v, s);
112  } else {
113  v = gEve->GetDefaultViewer();
114  s = gEve->GetEventScene();
115  }
116  v->SetElementName("Viewer - Lego");
117  s->SetElementName("Scene - Lego");
118 
119  auto lego = new TEveCaloLego(data);
120  s->AddElement(lego);
121 
122  // By the default lego extends is (1x1x1). Resize it to put in 'natural'
123  // coordinates, so that y extend in 2*Pi and set height of lego two times
124  // smaller than y extend to have better view in 3D perspective.
125  lego->InitMainTrans();
126  lego->RefMainTrans().SetScale(TMath::TwoPi(), TMath::TwoPi(), TMath::Pi());
127 
128  // draws scales and axis on borders of window
129  auto glv = v->GetGLViewer();
130  TEveCaloLegoOverlay* overlay = new TEveCaloLegoOverlay();
131  glv->AddOverlayElement(overlay);
132  overlay->SetCaloLego(lego);
133 
134  // set event handler to move from perspective to orthographic view.
135  glv->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
136  glv->SetEventHandler
137  (new TEveLegoEventHandler(glv->GetGLWidget(), glv, lego));
138  gEve->AddToListTree(lego, kTRUE);
139 
140  return lego;
141 }
142 
143 //______________________________________________________________________________
144 TEveCalo3D* MakeCalo3D(TEveCaloData* data, TEveWindowSlot* slot)
145 {
146  // 3D cartesian view.
147 
148  TEveViewer* v; TEveScene* s;
149  MakeViewerScene(slot, v, s);
150  v->SetElementName("Viewer - 3D");
151  s->SetElementName("Scene - 3D");
152 
153  auto calo3d = new TEveCalo3D(data);
154  calo3d->SetBarrelRadius(129.00);
155  calo3d->SetEndCapPos(268.36);
156  s->AddElement(calo3d);
157 
158  add_jet(calo3d, "JetCone Lojz", 1.4, 1.0, 0.4, 0.2);
159  add_jet(calo3d, "JetCone Mici", -2.0, -2.1, 0.2, 0.4);
160 
161  return calo3d;
162 }
163 
164 //______________________________________________________________________________
165 TEveCalo2D* MakeCalo2D(TEveCalo3D* calo3d, TEveWindowSlot* slot,
166  TEveProjection::EPType_e t)
167 {
168  // Projected calorimeter.
169 
170  TEveViewer* v; TEveScene* s;
171  MakeViewerScene(slot, v, s);
172  v->SetElementName("Viewer - 2D");
173  s->SetElementName("Scene - 2D");
174 
175  auto mng = new TEveProjectionManager();
176  mng->SetProjection(t);
177 
178  auto axes = new TEveProjectionAxes(mng);
179  s->AddElement(axes);
180  TEveCalo2D* calo2d = (TEveCalo2D*) mng->ImportElements(calo3d);
181  s->AddElement(calo2d);
182 
183  v->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
184 
185  gEve->AddToListTree(mng, kTRUE);
186  gEve->AddToListTree(calo2d, kTRUE);
187 
188  return calo2d;
189 }
190 
191 //______________________________________________________________________________
192 void MakeViewerScene(TEveWindowSlot* slot, TEveViewer*& v, TEveScene*& s)
193 {
194  // Create a scene and a viewer in the given slot.
195 
196  v = new TEveViewer("Viewer");
197  v->SpawnGLViewer(gEve->GetEditor());
198  slot->ReplaceWindow(v);
199  gEve->GetViewers()->AddElement(v);
200  s = gEve->SpawnNewScene("Scene");
201  v->AddScene(s);
202 }
203 
204 //______________________________________________________________________________
205 void add_jet(TEveElement* parent, const char* name,
206  Float_t eta, Float_t phi,
207  Float_t deta, Float_t dphi)
208 {
209  auto jet = new TEveJetCone(name, name);
210  jet->SetMainTransparency(60);
211  jet->SetLineColor(kRed);
212  jet->SetCylinder(129 - 10, 268.36 - 10);
213  jet->AddEllipticCone(eta, phi, deta, dphi);
214  jet->SetPickable(kTRUE);
215  jet->SetHighlightFrame(kFALSE);
216  parent->AddElement(jet);
217 }