Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
TEveCalo2DGL.cxx
Go to the documentation of this file.
1// @(#)root/eve:$Id$
2// Author: Matevz Tadel 2007
3
4/*************************************************************************
5 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#include "TEveCalo2DGL.h"
13#include "TEveCalo.h"
14#include "TEveProjections.h"
16#include "TEveRGBAPalette.h"
17
18#include "TGLRnrCtx.h"
19#include "TGLPhysicalShape.h"
20#include "TGLSelectRecord.h"
21#include "TGLIncludes.h"
22#include "TGLUtil.h"
23#include "TAxis.h"
24
25/** \class TEveCalo2DGL
26\ingroup TEve
27OpenGL renderer class for TEveCalo2D.
28*/
29
30
31////////////////////////////////////////////////////////////////////////////////
32/// Constructor.
33
35 TGLObject(),
36 fM(nullptr)
37{
38 // fDLCache = kFALSE; // Disable display list.
40}
41
42////////////////////////////////////////////////////////////////////////////////
43/// Set model object.
44
46{
48 return kTRUE;
49}
50
51////////////////////////////////////////////////////////////////////////////////
52/// Set bounding box.
53
58
59////////////////////////////////////////////////////////////////////////////////
60/// Is current projection type RPhi
61
63{
64 return fM->fManager->GetProjection()->GetType() == TEveProjection::kPT_RPhi;
65}
66
67////////////////////////////////////////////////////////////////////////////////
68/// Calculate vertices for the calorimeter cell in RPhi projection.
69/// Returns outside radius of the tower.
70
72 Float_t towerH, Float_t offset) const
73{
74 using namespace TMath;
75
76 Float_t r1 = fM->fBarrelRadius + offset;
77 Float_t r2 = r1 + towerH;
78
79 Float_t pnts[8];
80
81 pnts[0] = r1*Cos(phiMin); pnts[1] = r1*Sin(phiMin);
82 pnts[2] = r2*Cos(phiMin); pnts[3] = r2*Sin(phiMin);
83 pnts[4] = r2*Cos(phiMax); pnts[5] = r2*Sin(phiMax);
84 pnts[6] = r1*Cos(phiMax); pnts[7] = r1*Sin(phiMax);
85
86 Float_t x, y, z;
87 glBegin(GL_QUADS);
88 for (Int_t i = 0; i < 4; ++i)
89 {
90 x = pnts[2*i];
91 y = pnts[2*i+1];
92 z = 0.f;
93 fM->fManager->GetProjection()->ProjectPoint(x, y, z, fM->fDepth);
94 glVertex3f(x, y, z);
95 }
96 glEnd();
97}
98
99////////////////////////////////////////////////////////////////////////////////
100/// Draw calorimeter cells in RPhi projection.
101
103{
104 TEveCaloData* data = fM->GetData();
105 Int_t nSlices = data->GetNSlices();
106 Float_t *sliceVal = new Float_t[nSlices];
108 Float_t towerH;
109
110 UInt_t nPhi = data->GetPhiBins()->GetNbins();
111 TAxis* axis = data->GetPhiBins();
112 for(UInt_t phiBin = 1; phiBin <= nPhi; ++phiBin)
113 {
114 if (cellLists[phiBin] )
115 {
116 // reset values
117 Float_t off = 0;
118 for (Int_t s=0; s<nSlices; ++s)
119 sliceVal[s] = 0;
120
121 // sum eta cells
122 TEveCaloData::vCellId_t* cids = cellLists[phiBin];
123 for (TEveCaloData::vCellId_i it = cids->begin(); it != cids->end(); it++)
124 {
125 data->GetCellData(*it, cellData);
126 sliceVal[(*it).fSlice] += cellData.Value(fM->fPlotEt)*(*it).fFraction;
127 }
128
129 if (rnrCtx.SecSelection()) {
130 glLoadName(phiBin); // set name-stack phi bin
131 glPushName(0);
132 }
133 for (Int_t s = 0; s < nSlices; ++s)
134 {
135 if (rnrCtx.SecSelection()) glLoadName(s); // set name-stack slice
136 fM->SetupColorHeight(sliceVal[s], s, towerH);
137 MakeRPhiCell(axis->GetBinLowEdge(phiBin), axis->GetBinUpEdge(phiBin), towerH, off);
138 off += towerH;
139 }
140 if (rnrCtx.SecSelection()) glPopName(); // slice
141 }
142 }
143
144 delete [] sliceVal;
145}
146
147////////////////////////////////////////////////////////////////////////////////
148/// Draw selected calorimeter cells in RPhi projection.
149
150void TEveCalo2DGL::DrawRPhiHighlighted(std::vector<TEveCaloData::vCellId_t*>& cellLists) const
151{
152 static const TEveException eh("TEveCalo2DGL::DrawRPhiHighlighted ");
153
154 TEveCaloData* data = fM->fData;
156 Int_t nSlices = data->GetNSlices();
157 UInt_t nPhiBins = data->GetPhiBins()->GetNbins();
158 Float_t *sliceVal = new Float_t[nSlices];
159 Float_t *sliceValRef = new Float_t[nSlices];
160 Float_t towerH, towerHRef;
161
162 TAxis* axis = data->GetPhiBins();
163 for(UInt_t phiBin = 1; phiBin <= nPhiBins; ++phiBin)
164 {
165 if (cellLists[phiBin])
166 {
167 if (!fM->fCellLists[phiBin]) {
168 delete[] sliceVal;
169 delete[] sliceValRef;
170 throw eh + "selected cell not in cell list cache.";
171 }
172
173 Float_t off = 0;
174 // selected eta sum
175 for (Int_t s=0; s<nSlices; ++s) sliceVal[s] = 0;
176 TEveCaloData::vCellId_t& cids = *(cellLists[phiBin]);
177 for (TEveCaloData::vCellId_i i=cids.begin(); i!=cids.end(); i++) {
178 data->GetCellData((*i), cellData);
179 sliceVal[i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
180 }
181 // referenced eta sum
182 for (Int_t s=0; s<nSlices; ++s) sliceValRef[s] = 0;
183 TEveCaloData::vCellId_t& cidsRef = *(fM->fCellLists[phiBin]);
184 for (TEveCaloData::vCellId_i i=cidsRef.begin(); i!=cidsRef.end(); i++) {
185 data->GetCellData(*i, cellData);
186 sliceValRef[i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
187 }
188 // draw
189 for (Int_t s = 0; s < nSlices; ++s) {
190 fM->SetupColorHeight(sliceValRef[s], s, towerHRef);
191 if (sliceVal[s] > 0)
192 {
193 fM->SetupColorHeight(sliceVal[s], s, towerH);
194 MakeRPhiCell(axis->GetBinLowEdge(phiBin), axis->GetBinUpEdge(phiBin), towerH, off);
195 }
196 off += towerHRef;
197 }
198 }
199 }
200
201 delete [] sliceVal;
202 delete [] sliceValRef;
203}
204
205////////////////////////////////////////////////////////////////////////////////
206/// Draw cell in RhoZ projection.
207
209 Float_t& offset, Bool_t isBarrel, Bool_t phiPlus, Float_t towerH) const
210{
211 using namespace TMath;
212
213 Float_t pnts[8];
214
215 Float_t sin1 = Sin(thetaMin);
216 Float_t cos1 = Cos(thetaMin);
217 Float_t sin2 = Sin(thetaMax);
218 Float_t cos2 = Cos(thetaMax);
219
220 if (isBarrel)
221 {
222 Float_t r1 = fM->fBarrelRadius/Abs(Sin(0.5f*(thetaMin+thetaMax))) + offset;
223 Float_t r2 = r1 + towerH;
224
225 pnts[0] = r1*sin1; pnts[1] = r1*cos1;
226 pnts[2] = r2*sin1; pnts[3] = r2*cos1;
227 pnts[4] = r2*sin2; pnts[5] = r2*cos2;
228 pnts[6] = r1*sin2; pnts[7] = r1*cos2;
229 }
230 else
231 {
232 // endcap
233 Float_t zE = fM->GetForwardEndCapPos();
234 // uses a different theta definition than GetTransitionThetaBackward(), so we need a conversion
235 Float_t transThetaB = TEveCaloData::EtaToTheta(fM->GetTransitionEtaBackward());
236 if (thetaMax >= transThetaB)
237 zE = Abs(fM->GetBackwardEndCapPos());
238 Float_t r1 = zE/Abs(Cos(0.5f*(thetaMin+thetaMax))) + offset;
239 Float_t r2 = r1 + towerH;
240
241 pnts[0] = r1*sin1; pnts[1] = r1*cos1;
242 pnts[2] = r2*sin1; pnts[3] = r2*cos1;
243 pnts[4] = r2*sin2; pnts[5] = r2*cos2;
244 pnts[6] = r1*sin2; pnts[7] = r1*cos2;
245 }
246
247 glBegin(GL_QUADS);
248 Float_t x, y, z;
249 for (Int_t i = 0; i < 4; ++i)
250 {
251 x = 0.f;
252 y = phiPlus ? Abs(pnts[2*i]) : -Abs(pnts[2*i]);
253 z = pnts[2*i+1];
254 fM->fManager->GetProjection()->ProjectPoint(x, y, z, fM->fDepth);
255 glVertex3f(x, y, z);
256 }
257 glEnd();
258}
259
260////////////////////////////////////////////////////////////////////////////////
261/// Draw calorimeter in RhoZ projection.
262
264{
265 TEveCaloData* data = fM->GetData();
266 Int_t nSlices = data->GetNSlices();
267
269 Float_t *sliceValsUp = new Float_t[nSlices];
270 Float_t *sliceValsLow = new Float_t[nSlices];
271 Bool_t isBarrel;
272 Float_t towerH;
273 Float_t transEtaF = fM->GetTransitionEtaForward();
274 Float_t transEtaB = fM->GetTransitionEtaBackward();
275
276 TAxis* axis = data->GetEtaBins();
277 UInt_t nEta = axis->GetNbins();
278 for (UInt_t etaBin = 1; etaBin <= nEta; ++etaBin)
279 {
280 if (cellLists[etaBin] )
281 {
282 assert(fM->fCellLists[etaBin]);
283 Float_t etaMin = axis->GetBinLowEdge(etaBin);
284 Float_t etaMax = axis->GetBinUpEdge(etaBin);
285 Float_t thetaMin = TEveCaloData::EtaToTheta(etaMax);
286 Float_t thetaMax = TEveCaloData::EtaToTheta(etaMin);
287
288 // clear
289 Float_t offUp = 0;
290 Float_t offLow = 0;
291 for (Int_t s = 0; s < nSlices; ++s) {
292 sliceValsUp [s] = 0;
293 sliceValsLow[s] = 0;
294 }
295 // values
296 TEveCaloData::vCellId_t* cids = cellLists[etaBin];
297 for (TEveCaloData::vCellId_i it = cids->begin(); it != cids->end(); ++it)
298 {
299 data->GetCellData(*it, cellData);
300 if (cellData.IsUpperRho())
301 sliceValsUp [it->fSlice] += cellData.Value(fM->fPlotEt)*(*it).fFraction;
302 else
303 sliceValsLow[it->fSlice] += cellData.Value(fM->fPlotEt)*(*it).fFraction;
304 }
305
306 isBarrel = !(etaMax > 0 && etaMax > transEtaF) && !(etaMin < 0 && etaMin < transEtaB);
307
308 // draw
309 if (rnrCtx.SecSelection()) glLoadName(etaBin); // name-stack eta bin
310 if (rnrCtx.SecSelection()) glPushName(0);
311
312 for (Int_t s = 0; s < nSlices; ++s)
313 {
314 if (rnrCtx.SecSelection()) glLoadName(s); // name-stack slice
315 if (rnrCtx.SecSelection()) glPushName(0);
316 // phi +
317 if (sliceValsUp[s])
318 {
319 if (rnrCtx.SecSelection()) glLoadName(1); // name-stack phi sign
320 fM->SetupColorHeight(sliceValsUp[s], s, towerH);
321 MakeRhoZCell(thetaMin, thetaMax, offUp, isBarrel, kTRUE , towerH);
322 offUp += towerH;
323 }
324 // phi -
325 if (sliceValsLow[s])
326 {
327 if (rnrCtx.SecSelection()) glLoadName(0); // name-stack phi sign
328 fM->SetupColorHeight(sliceValsLow[s], s, towerH);
329 MakeRhoZCell(thetaMin, thetaMax, offLow, isBarrel, kFALSE , towerH);
330 offLow += towerH;
331 }
332 if (rnrCtx.SecSelection()) glPopName(); // phi sign is pos
333 }
334 //
335 if (rnrCtx.SecSelection()) glPopName(); // slice
336 }
337 }
338
339 delete [] sliceValsUp;
340 delete [] sliceValsLow;
341}
342
343////////////////////////////////////////////////////////////////////////////////
344/// Draw selected calorimeter cells in RhoZ projection.
345
346void TEveCalo2DGL::DrawRhoZHighlighted(std::vector<TEveCaloData::vCellId_t*>& cellLists) const
347{
348 static const TEveException eh("TEveCalo2DGL::DrawRhoZHighlighted ");
349
350 TEveCaloData* data = fM->GetData();
351 TAxis* axis = data->GetEtaBins();
352 UInt_t nEtaBins = axis->GetNbins();
353 Int_t nSlices = data->GetNSlices();
354 Float_t transEtaF = fM->GetTransitionEtaForward();
355 Float_t transEtaB = fM->GetTransitionEtaBackward();
356
357 Float_t *sliceValsUp = new Float_t[nSlices];
358 Float_t *sliceValsLow = new Float_t[nSlices];
359 Float_t *sliceValsUpRef = new Float_t[nSlices];
360 Float_t *sliceValsLowRef = new Float_t[nSlices];
361
362 Bool_t isBarrel;
363 Float_t towerH, towerHRef, offUp, offLow;
365
366 for (UInt_t etaBin = 1; etaBin <= nEtaBins; ++etaBin)
367 {
368 if (cellLists[etaBin])
369 {
370 if (!fM->fCellLists[etaBin]) {
371 delete[] sliceValsUp;
372 delete[] sliceValsLow;
373 delete[] sliceValsUpRef;
374 delete[] sliceValsLowRef;
375 throw(eh + "selected cell not in cell list cache.");
376 }
377
378 offUp = 0; offLow =0;
379 // selected phi sum
380 for (Int_t s = 0; s < nSlices; ++s) {
381 sliceValsUp[s] = 0; sliceValsLow[s] = 0;
382 }
383 TEveCaloData::vCellId_t& cids = *(cellLists[etaBin]);
384 for (TEveCaloData::vCellId_i i=cids.begin(); i!=cids.end(); i++) {
385 data->GetCellData(*i, cellData);
386 if (cellData.IsUpperRho())
387 sliceValsUp [i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
388 else
389 sliceValsLow[i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
390 }
391
392 // reference phi sum
393 for (Int_t s = 0; s < nSlices; ++s)
394 {
395 sliceValsUpRef[s] = 0; sliceValsLowRef[s] = 0;
396 }
397 TEveCaloData::vCellId_t& cidsRef = *(fM->fCellLists[etaBin]);
398 for (TEveCaloData::vCellId_i i=cidsRef.begin(); i!=cidsRef.end(); i++)
399 {
400 data->GetCellData(*i, cellData);
401 if (cellData.IsUpperRho())
402 sliceValsUpRef [i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
403 else
404 sliceValsLowRef[i->fSlice] += cellData.Value(fM->fPlotEt)*(*i).fFraction;
405 }
406
407 Float_t bincenterEta = axis->GetBinCenter(etaBin);
408 isBarrel = !(bincenterEta > 0 && bincenterEta > transEtaF) && !(bincenterEta < 0 && bincenterEta < transEtaB);
409
410 for (Int_t s = 0; s < nSlices; ++s)
411 {
412 Float_t thetaMin = TEveCaloData::EtaToTheta(axis->GetBinUpEdge(etaBin));
413 Float_t thetaMax = TEveCaloData::EtaToTheta(axis->GetBinLowEdge(etaBin));
414 // phi +
415 fM->SetupColorHeight(sliceValsUpRef[s], s, towerHRef);
416 if (sliceValsUp[s] > 0) {
417 fM->SetupColorHeight(sliceValsUp[s], s, towerH);
418 MakeRhoZCell(thetaMin, thetaMax, offUp, isBarrel, kTRUE , towerH);
419 }
420 offUp += towerHRef;
421
422 // phi -
423 fM->SetupColorHeight(sliceValsLowRef[s], s, towerHRef);
424 if (sliceValsLow[s] > 0) {
425 fM->SetupColorHeight(sliceValsLow[s], s, towerH);
426 MakeRhoZCell(thetaMin, thetaMax, offLow, isBarrel, kFALSE , towerH);
427 }
428 offLow += towerHRef;
429 } // slices
430 } // if eta bin
431 } //eta bin
432
433 delete [] sliceValsUp;
434 delete [] sliceValsLow;
435 delete [] sliceValsUpRef;
436 delete [] sliceValsLowRef;
437}
438
439////////////////////////////////////////////////////////////////////////////////
440/// Render with OpenGL.
441
443{
444 TGLCapabilitySwitch light_off(GL_LIGHTING, kFALSE);
445 TGLCapabilitySwitch cull_off (GL_CULL_FACE, kFALSE);
446
447 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
448 glEnable(GL_BLEND);
449 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
450
451 if (fM->fCellIdCacheOK == kFALSE)
452 fM->BuildCellIdCache();
453
454 fM->AssertPalette();
455
456 if (rnrCtx.SecSelection()) glPushName(0);
457 if (IsRPhi())
458 DrawRPhi(rnrCtx, fM->fCellLists);
459 else
460 DrawRhoZ(rnrCtx, fM->fCellLists);
461 if (rnrCtx.SecSelection()) glPopName();
462 glPopAttrib();
463}
464
465////////////////////////////////////////////////////////////////////////////////
466/// Draw towers in highlight mode.
467
468void TEveCalo2DGL::DrawHighlight(TGLRnrCtx& rnrCtx, const TGLPhysicalShape* /*pshp*/, Int_t /*lvl*/) const
469{
470 static const TEveException eh("TEveCalo2DGL::DrawHighlight ");
471
472 if (fM->fData->GetCellsSelected().empty() && fM->fData->GetCellsHighlighted().empty())
473 {
474 return;
475 }
476
477 TGLCapabilitySwitch cull_off (GL_CULL_FACE, kFALSE);
478
480 try
481 {
482 if (!fM->fData->GetCellsHighlighted().empty())
483 {
484 glColor4ubv(rnrCtx.ColorSet().Selection(3).CArr());
485
486 if (IsRPhi())
487 DrawRPhiHighlighted(fM->fCellListsHighlighted);
488 else
489 DrawRhoZHighlighted(fM->fCellListsHighlighted);
490 }
491 if (!fM->fData->GetCellsSelected().empty())
492 {
493 glColor4ubv(rnrCtx.ColorSet().Selection(1).CArr());
494 if (IsRPhi())
495 DrawRPhiHighlighted(fM->fCellListsSelected);
496 else
497 DrawRhoZHighlighted(fM->fCellListsSelected);
498
499 }
500 }
501 catch (TEveException& exc)
502 {
503 Warning(eh, "%s", exc.what());
504 }
506}
507
508////////////////////////////////////////////////////////////////////////////////
509/// Processes tower selection in eta bin or phi bin.
510/// Virtual function from TGLogicalShape. Called from TGLViewer.
511
513{
515 if (rec.GetN() > 2)
516 {
517 Int_t bin = rec.GetItem(1);
518 Int_t slice = rec.GetItem(2);
519 for (TEveCaloData::vCellId_i it = fM->fCellLists[bin]->begin();
520 it != fM->fCellLists[bin]->end(); ++it)
521 {
522 if ((*it).fSlice == slice)
523 {
524 if (IsRPhi())
525 {
526 sel.push_back(*it);
527 }
528 else
529 {
530 assert(rec.GetN() > 3);
531 Bool_t is_upper = (rec.GetItem(3) == 1);
533 fM->fData->GetCellData(*it, cd);
534 if ((is_upper && cd.IsUpperRho()) || (!is_upper && !cd.IsUpperRho()))
535 sel.push_back(*it);
536 }
537 }
538 }
539 }
540 fM->fData->ProcessSelection(sel, rec);
541}
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
Definition RtypesCore.h:60
bool Bool_t
Boolean (0=false, 1=true) (bool).
Definition RtypesCore.h:77
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
float Float_t
Float 4 bytes (float).
Definition RtypesCore.h:71
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char).
Definition RtypesCore.h:80
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Definition TError.cxx:252
Class to manage histogram axis.
Definition TAxis.h:32
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
Definition TAxis.cxx:482
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
Definition TAxis.cxx:522
Int_t GetNbins() const
Definition TAxis.h:127
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
Definition TAxis.cxx:532
void DrawRPhi(TGLRnrCtx &rnrCtx, TEveCalo2D::vBinCells_t &) const
Draw calorimeter cells in RPhi projection.
void ProcessSelection(TGLRnrCtx &rnrCtx, TGLSelectRecord &rec) override
Processes tower selection in eta bin or phi bin.
void MakeRPhiCell(Float_t phiMin, Float_t phiMax, Float_t towerH, Float_t offset) const
Calculate vertices for the calorimeter cell in RPhi projection.
void DrawRhoZ(TGLRnrCtx &rnrCtx, TEveCalo2D::vBinCells_t &) const
Draw calorimeter in RhoZ projection.
Bool_t IsRPhi() const
Is current projection type RPhi.
void DirectDraw(TGLRnrCtx &rnrCtx) const override
Render with OpenGL.
void SetBBox() override
Set bounding box.
void DrawRPhiHighlighted(std::vector< TEveCaloData::vCellId_t * > &cellLists) const
Draw selected calorimeter cells in RPhi projection.
void DrawRhoZHighlighted(std::vector< TEveCaloData::vCellId_t * > &cellLists) const
Draw selected calorimeter cells in RhoZ projection.
void MakeRhoZCell(Float_t thetaMin, Float_t thetaMax, Float_t &offset, Bool_t isBarrel, Bool_t phiPlus, Float_t towerH) const
Draw cell in RhoZ projection.
void DrawHighlight(TGLRnrCtx &rnrCtx, const TGLPhysicalShape *ps, Int_t lvl=-1) const override
Draw towers in highlight mode.
TEveCalo2DGL()
Constructor.
Bool_t SetModel(TObject *obj, const Option_t *opt=nullptr) override
Set model object.
TEveCalo2D * fM
Visualization of a calorimeter event data in 2D.
Definition TEveCalo.h:202
std::vector< TEveCaloData::vCellId_t * > vBinCells_t
Definition TEveCalo.h:206
A central manager for calorimeter event data.
std::vector< CellId_t > vCellId_t
static Float_t EtaToTheta(Float_t eta)
std::vector< CellId_t >::iterator vCellId_i
Exception class thrown by TEve classes and macros.
Definition TEveUtil.h:102
const char * what() const noexcept override
Definition TEveUtil.h:111
TGLColor & Selection(Int_t i)
Definition TGLUtil.h:855
const UChar_t * CArr() const
Definition TGLUtil.h:800
TObject * fExternalObj
! Also plays the role of ID.
Bool_t fMultiColor
Definition TGLObject.h:28
TT * SetModelDynCast(TObject *obj)
Definition TGLObject.h:37
void SetAxisAlignedBBox(Float_t xmin, Float_t xmax, Float_t ymin, Float_t ymax, Float_t zmin, Float_t zmax)
Set axis-aligned bounding-box.
Definition TGLObject.cxx:85
Concrete physical shape - a GL drawable.
The TGLRnrCtx class aggregates data for a given redering context as needed by various parts of the RO...
Definition TGLRnrCtx.h:41
Bool_t SecSelection() const
Definition TGLRnrCtx.h:224
TGLColorSet & ColorSet()
Return reference to current color-set (top of the stack).
UInt_t GetItem(Int_t i) const
Standard selection record including information about containing scene and details ob out selected ob...
static UInt_t LockColor()
Prevent further color changes.
Definition TGLUtil.cxx:1660
static UInt_t UnlockColor()
Allow color changes.
Definition TGLUtil.cxx:1668
Mother of all ROOT objects.
Definition TObject.h:42
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
TMath.
Definition TMathBase.h:35
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Definition TMath.h:605
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Definition TMath.h:599
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:122
Cell data inner structure.
Float_t Value(Bool_t) const
Return energy value associated with the cell, usually Et.
Bool_t IsUpperRho() const