Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
TGeoSphereEditor.cxx
Go to the documentation of this file.
1// @(#):$Id$
2// Author: M.Gheata
3
4/*************************************************************************
5 * Copyright (C) 1995-2002, 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/** \class TGeoSphereEditor
13\ingroup Geometry_builder
14
15Editor for a TGeoSphere.
16
17\image html geom_sphe_pic.png
18
19\image html geom_sphe_ed.png
20
21*/
22
23#include "TGeoSphereEditor.h"
24#include "TGeoTabManager.h"
25#include "TGeoSphere.h"
26#include "TGeoManager.h"
27#include "TVirtualGeoPainter.h"
28#include "TVirtualPad.h"
29#include "TView.h"
30#include "TGButton.h"
31#include "TGTextEntry.h"
32#include "TGNumberEntry.h"
33#include "TGLabel.h"
34#include "TGDoubleSlider.h"
35
36
50
51////////////////////////////////////////////////////////////////////////////////
52/// Constructor for sphere editor
53
55 : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
56{
57 fShape = nullptr;
59 fNamei = "";
62 fLock = kFALSE;
63
64 // TextEntry for shape name
65 MakeTitle("Name");
66 fShapeName = new TGTextEntry(this, new TGTextBuffer(50), kSPHERE_NAME);
67 fShapeName->Resize(135, fShapeName->GetDefaultHeight());
68 fShapeName->SetToolTipText("Enter the sphere name");
69 fShapeName->Associate(this);
71
72 TGTextEntry *nef;
73 MakeTitle("Sphere dimensions");
74 TGCompositeFrame *compxyz = new TGCompositeFrame(this, 118, 30, kVerticalFrame | kRaisedFrame);
75 // Number entry for rmin
77 f1->AddFrame(new TGLabel(f1, "Rmin"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
78 fERmin = new TGNumberEntry(f1, 0., 5, kSPHERE_RMIN);
80 nef = (TGTextEntry *)fERmin->GetNumberEntry();
81 nef->SetToolTipText("Enter the inner radius");
82 fERmin->Associate(this);
83 fERmin->Resize(100, fERmin->GetDefaultHeight());
84 f1->AddFrame(fERmin, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
85 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 4, 4));
86
87 // Number entry for Rmax
88 f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame | kFitWidth | kOwnBackground);
89 f1->AddFrame(new TGLabel(f1, "Rmax"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
90 fERmax = new TGNumberEntry(f1, 0., 5, kSPHERE_RMAX);
92 nef = (TGTextEntry *)fERmax->GetNumberEntry();
93 nef->SetToolTipText("Enter the outer radius");
94 fERmax->Associate(this);
95 fERmax->Resize(100, fERmax->GetDefaultHeight());
96 f1->AddFrame(fERmax, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
97 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 4, 4));
98 AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
99
100 MakeTitle("Phi/theta range");
101 TGCompositeFrame *f11 = new TGCompositeFrame(this, 150, 200, kHorizontalFrame);
102 compxyz = new TGCompositeFrame(f11, 75, 200, kHorizontalFrame | kRaisedFrame);
103 // Vertical slider
104 fSPhi = new TGDoubleVSlider(compxyz, 140);
105 fSPhi->SetRange(0., 720.);
106 compxyz->AddFrame(fSPhi, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 2, 2, 4, 4));
107 f1 = new TGCompositeFrame(compxyz, 50, 200, kVerticalFrame);
108 f1->AddFrame(new TGLabel(f1, "Phi min."), new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 2, 2));
109 fEPhi1 = new TGNumberEntry(f1, 0., 5, kSPHERE_PHI1);
110 fEPhi1->Resize(30, fEPhi1->GetDefaultHeight());
112 nef = (TGTextEntry *)fEPhi1->GetNumberEntry();
113 nef->SetToolTipText("Enter the phi1 value");
114 fEPhi1->Associate(this);
115 f1->AddFrame(fEPhi1, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
116
117 fEPhi2 = new TGNumberEntry(f1, 0., 5, kSPHERE_PHI2);
118 fEPhi2->Resize(30, fEPhi2->GetDefaultHeight());
120 nef = (TGTextEntry *)fEPhi2->GetNumberEntry();
121 nef->SetToolTipText("Enter the phi2 value");
122 fEPhi2->Associate(this);
123 fEPhi2->Resize(30, fEPhi2->GetDefaultHeight());
124 f1->AddFrame(fEPhi2, new TGLayoutHints(kLHintsBottom | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
125 f1->AddFrame(new TGLabel(f1, "Phi max."), new TGLayoutHints(kLHintsBottom | kLHintsLeft, 2, 2, 2, 2));
126 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2));
127
128 compxyz->Resize(75, 150);
129 f11->AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
130
131 compxyz = new TGCompositeFrame(f11, 75, 200, kHorizontalFrame | kRaisedFrame);
132 // Vertical slider
133 fSTheta = new TGDoubleVSlider(compxyz, 140);
134 fSTheta->SetRange(0., 180.);
135 compxyz->AddFrame(fSTheta, new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 2, 2, 4, 4));
136 f1 = new TGCompositeFrame(compxyz, 50, 200, kVerticalFrame);
137 f1->AddFrame(new TGLabel(f1, "Theta min."), new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 2, 2));
139 fETheta1->Resize(30, fETheta1->GetDefaultHeight());
141 nef = (TGTextEntry *)fETheta1->GetNumberEntry();
142 nef->SetToolTipText("Enter the theta1 value");
143 fETheta1->Associate(this);
144 f1->AddFrame(fETheta1, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
145
147 fETheta2->Resize(30, fETheta2->GetDefaultHeight());
149 nef = (TGTextEntry *)fETheta2->GetNumberEntry();
150 nef->SetToolTipText("Enter the theta2 value");
151 fETheta2->Associate(this);
152 f1->AddFrame(fETheta2, new TGLayoutHints(kLHintsBottom | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
153 f1->AddFrame(new TGLabel(f1, "Theta max."), new TGLayoutHints(kLHintsBottom | kLHintsLeft, 2, 2, 2, 2));
154 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2));
155
156 compxyz->Resize(75, 150);
157 f11->AddFrame(compxyz, new TGLayoutHints(kLHintsRight, 0, 0, 0, 0));
158
159 AddFrame(f11, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
160
161 // Delayed draw
163 fDelayed = new TGCheckButton(f1, "Delayed draw");
164 f1->AddFrame(fDelayed, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
165 AddFrame(f1, new TGLayoutHints(kLHintsLeft, 6, 6, 4, 4));
166
167 // Buttons
168 f1 = new TGCompositeFrame(this, 155, 10, kHorizontalFrame | kFixedWidth);
169 fApply = new TGTextButton(f1, "Apply");
170 f1->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
171 fApply->Associate(this);
172 fUndo = new TGTextButton(f1, "Undo");
173 f1->AddFrame(fUndo, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
174 fUndo->Associate(this);
175 AddFrame(f1, new TGLayoutHints(kLHintsLeft, 6, 6, 4, 4));
176 fUndo->SetSize(fApply->GetSize());
177}
178
179////////////////////////////////////////////////////////////////////////////////
180/// Destructor.
181
183{
184 TGFrameElement *el;
185 TIter next(GetList());
186 while ((el = (TGFrameElement *)next())) {
187 if (el->fFrame->IsComposite())
189 }
190 Cleanup();
191}
192
193////////////////////////////////////////////////////////////////////////////////
194/// Connect signals to slots.
195
197{
198 fApply->Connect("Clicked()", "TGeoSphereEditor", this, "DoApply()");
199 fUndo->Connect("Clicked()", "TGeoSphereEditor", this, "DoUndo()");
200 fShapeName->Connect("TextChanged(const char *)", "TGeoSphereEditor", this, "DoModified()");
201 fERmin->Connect("ValueSet(Long_t)", "TGeoSphereEditor", this, "DoRmin()");
202 fERmax->Connect("ValueSet(Long_t)", "TGeoSphereEditor", this, "DoRmax()");
203 fEPhi1->Connect("ValueSet(Long_t)", "TGeoSphereEditor", this, "DoPhi1()");
204 fEPhi2->Connect("ValueSet(Long_t)", "TGeoSphereEditor", this, "DoPhi2()");
205 fETheta1->Connect("ValueSet(Long_t)", "TGeoSphereEditor", this, "DoTheta1()");
206 fETheta2->Connect("ValueSet(Long_t)", "TGeoSphereEditor", this, "DoTheta2()");
207 fSPhi->Connect("PositionChanged()", "TGeoSphereEditor", this, "DoPhi()");
208 fSTheta->Connect("PositionChanged()", "TGeoSphereEditor", this, "DoTheta()");
209 fInit = kFALSE;
210}
211
212////////////////////////////////////////////////////////////////////////////////
213/// Connect to a given sphere.
214
216{
217 if (obj == nullptr || (obj->IsA() != TGeoSphere::Class())) {
219 return;
220 }
221 fShape = (TGeoSphere *)obj;
222 fRmini = fShape->GetRmin();
223 fRmaxi = fShape->GetRmax();
224 fPhi1i = fShape->GetPhi1();
225 fPhi2i = fShape->GetPhi2();
226 fTheta1i = fShape->GetTheta1();
227 fTheta2i = fShape->GetTheta2();
228 fNamei = fShape->GetName();
229 fShapeName->SetText(fShape->GetName());
230 fERmin->SetNumber(fRmini);
231 fERmax->SetNumber(fRmaxi);
232 fEPhi1->SetNumber(fPhi1i);
233 fEPhi2->SetNumber(fPhi2i);
234 fETheta1->SetNumber(fTheta1i);
235 fETheta2->SetNumber(fTheta2i);
236 fSPhi->SetPosition(fPhi1i, fPhi2i);
237 fSTheta->SetPosition(fTheta1i, fTheta2i);
238
239 fApply->SetEnabled(kFALSE);
240 fUndo->SetEnabled(kFALSE);
241
242 if (fInit)
244 SetActive();
245}
246
247////////////////////////////////////////////////////////////////////////////////
248/// Check if shape drawing is delayed.
249
251{
252 return (fDelayed->GetState() == kButtonDown);
253}
254
255////////////////////////////////////////////////////////////////////////////////
256/// Slot for name.
257
259{
260 DoModified();
261}
262
263////////////////////////////////////////////////////////////////////////////////
264/// Slot for applying modifications.
265
267{
268 const char *name = fShapeName->GetText();
269 if (strcmp(name, fShape->GetName()))
270 fShape->SetName(name);
271 Double_t rmin = fERmin->GetNumber();
272 Double_t rmax = fERmax->GetNumber();
273 Double_t phi1 = fEPhi1->GetNumber();
274 Double_t phi2 = fEPhi2->GetNumber();
275 if ((phi2 - phi1) > 360.001) {
276 phi1 = 0.;
277 phi2 = 360.;
278 fEPhi1->SetNumber(phi1);
279 fEPhi2->SetNumber(phi2);
280 fLock = kTRUE;
281 fSPhi->SetPosition(phi1, phi2);
282 fLock = kFALSE;
283 }
284 Double_t theta1 = fETheta1->GetNumber();
285 Double_t theta2 = fETheta2->GetNumber();
286 fShape->SetSphDimensions(rmin, rmax, theta1, theta2, phi1, phi2);
287 fShape->ComputeBBox();
288 fUndo->SetEnabled();
289 fApply->SetEnabled(kFALSE);
290 if (fPad) {
291 if (gGeoManager && gGeoManager->GetPainter() && gGeoManager->GetPainter()->IsPaintingShape()) {
292 fShape->Draw();
293 fPad->GetView()->ShowAxis();
294 } else
295 Update();
296 }
297}
298
299////////////////////////////////////////////////////////////////////////////////
300/// Slot for signaling modifications.
301
303{
304 fApply->SetEnabled();
305}
306
307////////////////////////////////////////////////////////////////////////////////
308/// Slot for undoing last operation.
309
311{
312 fERmin->SetNumber(fRmini);
313 fERmax->SetNumber(fRmaxi);
314 fEPhi1->SetNumber(fPhi1i);
315 fEPhi2->SetNumber(fPhi2i);
316 fSPhi->SetPosition(fPhi1i, fPhi2i);
317 fETheta1->SetNumber(fTheta1i);
318 fETheta2->SetNumber(fTheta2i);
319 fSTheta->SetPosition(fTheta1i, fTheta2i);
320 DoApply();
321 fUndo->SetEnabled(kFALSE);
322 fApply->SetEnabled(kFALSE);
323}
324
325////////////////////////////////////////////////////////////////////////////////
326/// Slot for Rmin.
327
329{
330 Double_t rmin = fERmin->GetNumber();
331 Double_t rmax = fERmax->GetNumber();
332 if (rmin <= 0.) {
333 rmin = 0.;
334 fERmin->SetNumber(rmin);
335 }
336 if (rmin >= rmax) {
337 rmin = rmax - 0.1;
338 fERmin->SetNumber(rmin);
339 }
340 DoModified();
341 if (!IsDelayed())
342 DoApply();
343}
344
345////////////////////////////////////////////////////////////////////////////////
346/// Slot for Rmax.
347
349{
350 Double_t rmin = fERmin->GetNumber();
351 Double_t rmax = fERmax->GetNumber();
352 if (rmax <= 0.) {
353 rmax = 0.1;
354 fERmax->SetNumber(rmax);
355 }
356 if (rmax < rmin + 1.e-10) {
357 rmax = rmin + 0.1;
358 fERmax->SetNumber(rmax);
359 }
360 DoModified();
361 if (!IsDelayed())
362 DoApply();
363}
364
365////////////////////////////////////////////////////////////////////////////////
366/// Slot for phi1.
367
369{
370 Double_t phi1 = fEPhi1->GetNumber();
371 Double_t phi2 = fEPhi2->GetNumber();
372 if (phi1 > 360 - 1.e-10) {
373 phi1 = 0.;
374 fEPhi1->SetNumber(phi1);
375 }
376 if (phi2 < phi1 + 1.e-10) {
377 phi1 = phi2 - 0.1;
378 fEPhi1->SetNumber(phi1);
379 }
380 if (!fLock) {
381 DoModified();
382 fLock = kTRUE;
383 fSPhi->SetPosition(phi1, phi2);
384 } else
385 fLock = kFALSE;
386 if (!IsDelayed())
387 DoApply();
388}
389
390////////////////////////////////////////////////////////////////////////////////
391/// Slot for phi2.
392
394{
395 Double_t phi1 = fEPhi1->GetNumber();
396 Double_t phi2 = fEPhi2->GetNumber();
397 if (phi2 - phi1 > 360.) {
398 phi2 -= 360.;
399 fEPhi2->SetNumber(phi2);
400 }
401 if (phi2 < phi1 + 1.e-10) {
402 phi2 = phi1 + 0.1;
403 fEPhi2->SetNumber(phi2);
404 }
405 if (!fLock) {
406 DoModified();
407 fLock = kTRUE;
408 fSPhi->SetPosition(phi1, phi2);
409 } else
410 fLock = kFALSE;
411 if (!IsDelayed())
412 DoApply();
413}
414
415////////////////////////////////////////////////////////////////////////////////
416/// Slot for phi slider.
417
419{
420 if (!fLock) {
421 DoModified();
422 fLock = kTRUE;
423 fEPhi1->SetNumber(fSPhi->GetMinPosition());
424 fLock = kTRUE;
425 fEPhi2->SetNumber(fSPhi->GetMaxPosition());
426 } else
427 fLock = kFALSE;
428 if (!IsDelayed())
429 DoApply();
430}
431
432////////////////////////////////////////////////////////////////////////////////
433/// Slot for theta1.
434
436{
437 Double_t theta1 = fETheta1->GetNumber();
438 Double_t theta2 = fETheta2->GetNumber();
439 if (theta2 < theta1 + 1.e-10) {
440 theta2 = theta1 + 0.1;
441 fETheta2->SetNumber(theta2);
442 }
443 if (!fLock) {
444 DoModified();
445 fLock = kTRUE;
446 fSTheta->SetPosition(theta1, theta2);
447 } else
448 fLock = kFALSE;
449 if (!IsDelayed())
450 DoApply();
451}
452
453////////////////////////////////////////////////////////////////////////////////
454/// Slot for theta2.
455
457{
458 Double_t theta1 = fETheta1->GetNumber();
459 Double_t theta2 = fETheta2->GetNumber();
460 if (theta2 < theta1 + 1.e-10) {
461 theta1 = theta2 - 0.1;
462 fETheta1->SetNumber(theta1);
463 }
464 if (!fLock) {
465 DoModified();
466 fLock = kTRUE;
467 fSTheta->SetPosition(theta1, theta2);
468 } else
469 fLock = kFALSE;
470 if (!IsDelayed())
471 DoApply();
472}
473
474////////////////////////////////////////////////////////////////////////////////
475/// Slot for theta slider.
476
478{
479 if (!fLock) {
480 DoModified();
481 fLock = kTRUE;
482 fETheta1->SetNumber(fSTheta->GetMinPosition());
483 fLock = kTRUE;
484 fETheta2->SetNumber(fSTheta->GetMaxPosition());
485 } else
486 fLock = kFALSE;
487 if (!IsDelayed())
488 DoApply();
489}
@ kRaisedFrame
Definition GuiTypes.h:385
@ kSunkenFrame
Definition GuiTypes.h:384
@ kVerticalFrame
Definition GuiTypes.h:382
@ kFixedWidth
Definition GuiTypes.h:388
@ kFitWidth
Definition GuiTypes.h:387
@ kHorizontalFrame
Definition GuiTypes.h:383
@ kOwnBackground
Definition GuiTypes.h:392
ULong_t Pixel_t
Pixel value.
Definition GuiTypes.h:41
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
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
@ kButtonDown
Definition TGButton.h:54
@ kLHintsRight
Definition TGLayout.h:26
@ kLHintsExpandY
Definition TGLayout.h:31
@ kLHintsLeft
Definition TGLayout.h:24
@ kLHintsBottom
Definition TGLayout.h:29
@ kLHintsTop
Definition TGLayout.h:27
@ kLHintsExpandX
Definition TGLayout.h:30
char name[80]
Definition TGX11.cxx:148
externTGeoManager * gGeoManager
ETGeoSphereWid
@ kSPHERE_UNDO
@ kSPHERE_PHI1
@ kSPHERE_THETA1
@ kSPHERE_APPLY
@ kSPHERE_THETA
@ kSPHERE_NAME
@ kSPHERE_THETA2
@ kSPHERE_PHI2
@ kSPHERE_PHI
@ kSPHERE_RMIN
@ kSPHERE_RMAX
Selects different options.
Definition TGButton.h:264
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=nullptr)
Add frame to the composite frame using the specified layout hints.
Definition TGFrame.cxx:1109
virtual TList * GetList() const
Definition TGFrame.h:312
virtual void Cleanup()
Cleanup and delete all objects contained in this composite frame.
Definition TGFrame.cxx:959
TGCompositeFrame(const TGCompositeFrame &)=delete
Dragging the slider will generate the event:
TGFrame * fFrame
Definition TGLayout.h:112
void Resize(UInt_t w=0, UInt_t h=0) override
Resize the frame.
Definition TGFrame.cxx:597
virtual Bool_t IsComposite() const
Definition TGFrame.h:214
This class handles GUI labels.
Definition TGLabel.h:24
This class describes layout hints used by the layout classes.
Definition TGLayout.h:50
TGNumberEntry is a number entry input widget with up/down buttons.
@ kNEANonNegative
Non-negative number.
A text buffer is used in several widgets, like TGTextEntry, TGFileDialog, etc.
Yield an action as soon as it is clicked.
Definition TGButton.h:142
A TGTextEntry is a one line text input widget.
Definition TGTextEntry.h:24
virtual void SetToolTipText(const char *text, Long_t delayms=500)
Set tool tip text associated with this text entry.
ROOT GUI Window base class.
Definition TGWindow.h:23
Bool_t fInit
init flag for setting signals/slots
Definition TGedFrame.h:47
virtual void MakeTitle(const char *title)
Create attribute frame title.
Definition TGedFrame.cxx:94
void Update() override
Override Update from TGedFrame as fGedEditor can be null.
TVirtualPad * fPad
TGeoGedFrame(const TGWindow *p=nullptr, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor.
virtual void SetActive(Bool_t active=kTRUE)
Set active GUI attribute frames related to the selected object.
TGNumberEntry * fEPhi2
TGCheckButton * fDelayed
virtual void ConnectSignals2Slots()
Connect signals to slots.
TGeoSphereEditor(const TGWindow *p=nullptr, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor for sphere editor.
TGNumberEntry * fERmax
void DoTheta1()
Slot for theta1.
void DoRmin()
Slot for Rmin.
TGNumberEntry * fETheta1
TGNumberEntry * fETheta2
void DoName()
Slot for name.
TGNumberEntry * fERmin
void DoPhi2()
Slot for phi2.
TGDoubleVSlider * fSPhi
Bool_t IsDelayed() const
Check if shape drawing is delayed.
void DoTheta()
Slot for theta slider.
void DoModified()
Slot for signaling modifications.
void DoTheta2()
Slot for theta2.
TGTextEntry * fShapeName
void DoPhi()
Slot for phi slider.
TGeoSphere * fShape
void SetModel(TObject *obj) override
Connect to a given sphere.
TGNumberEntry * fEPhi1
TGDoubleVSlider * fSTheta
void DoPhi1()
Slot for phi1.
void DoRmax()
Slot for Rmax.
virtual void DoUndo()
Slot for undoing last operation.
TGTextButton * fUndo
~TGeoSphereEditor() override
Destructor.
virtual void DoApply()
Slot for applying modifications.
TGTextButton * fApply
static TClass * Class()
static void Cleanup(TGCompositeFrame *frame)
Static method to cleanup hierarchically all daughters of a composite frame.
Mother of all ROOT objects.
Definition TObject.h:42
virtual TClass * IsA() const
Definition TObject.h:248
TF1 * f1
Definition legend1.C:11