Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
THStack.cxx
Go to the documentation of this file.
1// @(#)root/hist:$Id$
2// Author: Rene Brun 10/12/2001
3
4/*************************************************************************
5 * Copyright (C) 1995-2001, 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 "TROOT.h"
13#include "TClassRef.h"
14#include "THStack.h"
15#include "TVirtualPad.h"
16#include "TVirtualHistPainter.h"
17#include "THashList.h"
18#include "TH2.h"
19#include "TH3.h"
20#include "TList.h"
21#include "TStyle.h"
22#include "TBrowser.h"
23#include "TMath.h"
24#include "TObjString.h"
25#include "TVirtualMutex.h"
26#include "strlcpy.h"
27
28#include <iostream>
29
31
32////////////////////////////////////////////////////////////////////////////////
33
34/** \class THStack
35 \ingroup Histograms
36The Histogram stack class
37
38A THStack is a collection of TH1 or TH2 histograms. By using THStack::Draw(), the entire
39histogram collection is drawn at once according to the specified drawing option.
40
41THStack::Add() allows adding a new histogram to the list. Note that the THStack does not
42take ownership of the objects in the list.
43
44\anchor HS00
45### Stack painting
46
47By default, histograms are shown stacked:
48 - the first histogram is painted
49 - then the sum of the first and second histograms is painted, and so on
50
51The axis ranges are computed automatically along the X and Y axes to display the complete
52histogram collection.
53
54Warning: Histogram bins with negative content may produce wrong plots.
55
56### Stack's drawing options
57
58The specific stack's drawing options are:
59
60 - **NOSTACK** If option "nostack" is specified, histograms are all painted in the same pad
61 as if the option "same" had been specified.
62
63 - **NOSTACKB** If the option "nostackb" is specified histograms are all painted on the same pad
64 next to each other as bar plots.
65
66 - **PADS** if option "pads" is specified, the current pad/canvas is subdivided into
67 a number of pads equal to the number of histograms and each histogram
68 is painted into a separate pad.
69
70 - **NOCLEAR** By default the background of the histograms is erased before drawing the
71 histograms. The option "noclear" avoids this behavior. This is useful when drawing a
72 THStack on top of another plot. If the patterns used to draw the histograms in the
73 stack are transparent, then the plot behind will be visible.
74
75See the THistPainter class for the list of valid histograms' painting options.
76
77
78Example;
79
80Begin_Macro(source)
81{
82 auto hs = new THStack("hs","");
83 auto h1 = new TH1F("h1","test hstack",10,-4,4);
84 h1->FillRandom("gaus",20000);
85 h1->SetFillColor(kRed);
86 hs->Add(h1);
87 auto h2 = new TH1F("h2","test hstack",10,-4,4);
88 h2->FillRandom("gaus",15000);
89 h2->SetFillColor(kBlue);
90 hs->Add(h2);
91 auto h3 = new TH1F("h3","test hstack",10,-4,4);
92 h3->FillRandom("gaus",10000);
93 h3->SetFillColor(kGreen);
94 hs->Add(h3);
95 auto cs = new TCanvas("cs","cs",10,10,700,900);
96 TText T; T.SetTextFont(42); T.SetTextAlign(21);
97 cs->Divide(2,2);
98 cs->cd(1); hs->Draw(); T.DrawTextNDC(.5,.95,"Default drawing option");
99 cs->cd(2); hs->Draw("nostack"); T.DrawTextNDC(.5,.95,"Option \"nostack\"");
100 cs->cd(3); hs->Draw("nostackb"); T.DrawTextNDC(.5,.95,"Option \"nostackb\"");
101 cs->cd(4); hs->Draw("lego1"); T.DrawTextNDC(.5,.95,"Option \"lego1\"");
102}
103End_Macro
104
105A more complex example:
106
107Begin_Macro(source)
108../../../tutorials/hist/hstack.C
109End_Macro
110
111Note that picking is supported for all drawing modes.
112
113\since **ROOT version 6.07/07:**
114Stacks of 2D histograms can also be painted as candle plots:
115\since **ROOT version 6.09/02:**
116Stacks of 2D histograms can also be painted as violin plots, combinations of candle and
117violin plots are possible as well:
118
119Begin_Macro(source)
120../../../tutorials/hist/candleplotstack.C
121End_Macro
122
123Automatic coloring according to the current palette is available as shown in the
124following example:
125
126Begin_Macro(source)
127../../../tutorials/hist/thstackpalettecolor.C
128End_Macro
129*/
130
131
132////////////////////////////////////////////////////////////////////////////////
133/// constructor with name and title
134
135THStack::THStack(const char *name, const char *title)
136 : TNamed(name,title)
137{
139 gROOT->GetListOfCleanups()->Add(this);
140}
141
142
143////////////////////////////////////////////////////////////////////////////////
144/// Creates a new THStack from a TH2 or TH3.
145/// It is filled with the 1D histograms from GetProjectionX or GetProjectionY
146/// for each bin of the histogram. It illustrates the differences and total
147/// sum along an axis.
148///
149/// Parameters:
150/// - hist: the histogram used for the projections. Can be an object deriving
151/// from TH2 or TH3.
152/// - axis: for TH2: "x" for ProjectionX, "y" for ProjectionY.
153/// for TH3: see TH3::Project3D.
154/// - name: fName is set to name if given, otherwise to histo's name with
155/// "_stack_<axis>" appended, where `<axis>` is the value of the
156/// parameter axis.
157/// - title: fTitle is set to title if given, otherwise to histo's title
158/// with ", stack of <axis> projections" appended.
159/// - firstbin, lastbin:
160/// For each bin within [firstbin,lastbin] a stack entry is created.
161/// See TH2::ProjectionX/Y for use overflow bins.
162/// Defaults to "all bins but under- / overflow"
163/// - firstbin2, lastbin2:
164/// Other axis range for TH3::Project3D, defaults to "all bins but
165/// under- / overflow". Ignored for TH2s
166/// - proj_option:
167/// option passed to TH2::ProjectionX/Y and TH3::Project3D (along
168/// with axis)
169/// - draw_option:
170/// option passed to THStack::Add.
171
172THStack::THStack(TH1* hist, Option_t *axis /*="x"*/,
173 const char *name /*=nullptr*/, const char *title /*=nullptr*/,
174 Int_t firstbin /*=1*/, Int_t lastbin /*=-1*/,
175 Int_t firstbin2 /*=1*/, Int_t lastbin2 /*=-1*/,
176 Option_t* proj_option /*=""*/, Option_t* draw_option /*=""*/)
177 : TNamed(name, title) {
178 {
180 gROOT->GetListOfCleanups()->Add(this);
181 }
182 if (!axis) {
183 Warning("THStack", "Need an axis.");
184 return;
185 }
186 if (!hist) {
187 Warning("THStack", "Need a histogram.");
188 return;
189 }
190 Bool_t isTH2 = hist->IsA()->InheritsFrom(TH2::Class());
191 Bool_t isTH3 = hist->IsA()->InheritsFrom(TH3::Class());
192 if (!isTH2 && !isTH3) {
193 Warning("THStack", "Need a histogram deriving from TH2 or TH3.");
194 return;
195 }
196
197 if (!fName.Length())
198 fName.Form("%s_stack%s", hist->GetName(), axis);
199 if (!fTitle.Length()) {
200 if (hist->GetTitle() && strlen(hist->GetTitle()))
201 fTitle.Form("%s, stack of %s projections", hist->GetTitle(), axis);
202 else
203 fTitle.Form("stack of %s projections", axis);
204 }
205
206 if (isTH2) {
207 TH2* hist2 = (TH2*) hist;
208 Bool_t useX = (strchr(axis,'x')) || (strchr(axis,'X'));
209 Bool_t useY = (strchr(axis,'y')) || (strchr(axis,'Y'));
210 if ((!useX && !useY) || (useX && useY)) {
211 Warning("THStack", "Need parameter axis=\"x\" or \"y\" for a TH2, not none or both.");
212 return;
213 }
214 TAxis* haxis = useX ? hist->GetYaxis() : hist->GetXaxis();
215 if (!haxis) {
216 Warning("THStack","Histogram axis is NULL");
217 return;
218 }
219 Int_t nbins = haxis->GetNbins();
220 if (firstbin < 0) firstbin = 1;
221 if (lastbin < 0) lastbin = nbins;
222 if (lastbin > nbins+1) lastbin = nbins;
223 for (Int_t iBin=firstbin; iBin<=lastbin; iBin++) {
224 TH1* hProj = nullptr;
225 if (useX)
226 hProj = hist2->ProjectionX(TString::Format("%s_px%d",hist2->GetName(), iBin).Data(),
227 iBin, iBin, proj_option);
228 else
229 hProj = hist2->ProjectionY(TString::Format("%s_py%d",hist2->GetName(), iBin).Data(),
230 iBin, iBin, proj_option);
231 Add(hProj, draw_option);
232 }
233 } else {
234 // hist is a TH3
235 TH3* hist3 = (TH3*) hist;
236 TString sAxis(axis);
237 sAxis.ToLower();
238 Int_t dim=3-sAxis.Length();
239 if (dim<1 || dim>2) {
240 Warning("THStack", "Invalid length for parameter axis.");
241 return;
242 }
243
244 if (dim==1) {
245 TAxis* haxis = nullptr;
246 // look for the haxis _not_ in axis
247 if (sAxis.First('x')==kNPOS)
248 haxis = hist->GetXaxis();
249 else if (sAxis.First('y')==kNPOS)
250 haxis = hist->GetYaxis();
251 else if (sAxis.First('z')==kNPOS)
252 haxis = hist->GetZaxis();
253 if (!haxis) {
254 Warning("THStack","Histogram axis is NULL");
255 return;
256 }
257
258 Int_t nbins = haxis->GetNbins();
259 if (firstbin < 0) firstbin = 1;
260 if (lastbin < 0) lastbin = nbins;
261 if (lastbin > nbins+1) lastbin = nbins;
262 Int_t iFirstOld=haxis->GetFirst();
263 Int_t iLastOld=haxis->GetLast();
264 for (Int_t iBin=firstbin; iBin<=lastbin; iBin++) {
265 haxis->SetRange(iBin, iBin);
266 // build projection named axis_iBin (passed through "option")
267 TH1* hProj = hist3->Project3D(TString::Format("%s_%s%s_%d", hist3->GetName(),
268 axis, proj_option, iBin).Data());
269 Add(hProj, draw_option);
270 }
271 haxis->SetRange(iFirstOld, iLastOld);
272 } else {
273 // if dim==2
274 TAxis* haxis1 = nullptr;
275 TAxis* haxis2 = nullptr;
276 // look for the haxis _not_ in axis
277 if (sAxis.First('x')!=kNPOS) {
278 haxis1=hist->GetYaxis();
279 haxis2=hist->GetZaxis();
280 } else if (sAxis.First('y')!=kNPOS) {
281 haxis1=hist->GetXaxis();
282 haxis2=hist->GetZaxis();
283 } else if (sAxis.First('z')!=kNPOS) {
284 haxis1=hist->GetXaxis();
285 haxis2=hist->GetYaxis();
286 }
287 if (!haxis1 || !haxis2) {
288 Warning("THStack","Histogram axis is NULL");
289 return;
290 }
291
292 Int_t nbins1 = haxis1->GetNbins();
293 Int_t nbins2 = haxis2->GetNbins();
294 if (firstbin < 0) firstbin = 1;
295 if (lastbin < 0) lastbin = nbins1;
296 if (lastbin > nbins1+1) lastbin = nbins1;
297 if (firstbin2 < 0) firstbin2 = 1;
298 if (lastbin2 < 0) lastbin2 = nbins2;
299 if (lastbin2 > nbins2+1) lastbin2 = nbins2;
300 Int_t iFirstOld1 = haxis1->GetFirst();
301 Int_t iLastOld1 = haxis1->GetLast();
302 Int_t iFirstOld2 = haxis2->GetFirst();
303 Int_t iLastOld2 = haxis2->GetLast();
304 for (Int_t iBin=firstbin; iBin<=lastbin; iBin++) {
305 haxis1->SetRange(iBin, iBin);
306 for (Int_t jBin=firstbin2; jBin<=lastbin2; jBin++) {
307 haxis2->SetRange(jBin, jBin);
308 // build projection named axis_iBin (passed through "option")
309 TH1* hProj=hist3->Project3D(TString::Format("%s_%s%s_%d", hist3->GetName(),
310 axis, proj_option, iBin).Data());
311 Add(hProj, draw_option);
312 }
313 }
314 haxis1->SetRange(iFirstOld1, iLastOld1);
315 haxis2->SetRange(iFirstOld2, iLastOld2);
316 }
317 } // if hist is TH2 or TH3
318}
319
320////////////////////////////////////////////////////////////////////////////////
321/// THStack destructor.
322
324{
325 {
327 gROOT->GetListOfCleanups()->Remove(this);
328 }
329 if (fHists) {
330 fHists->Clear("nodelete");
331 delete fHists;
332 fHists = nullptr;
333 }
334 if (fStack) {
335 fStack->Delete();
336 delete fStack;
337 fStack = nullptr;
338 }
339 delete fHistogram;
340 fHistogram = nullptr;
341}
342
343////////////////////////////////////////////////////////////////////////////////
344/// THStack copy constructor
345
346THStack::THStack(const THStack &hstack) :
347 TNamed(hstack),
348 fMaximum(hstack.fMaximum),
349 fMinimum(hstack.fMinimum)
350{
351 {
353 gROOT->GetListOfCleanups()->Add(this);
354 }
355
356 TIter next(hstack.GetHists());
357 while (auto h = static_cast<TH1 *>(next()))
358 Add(h);
359}
360
361////////////////////////////////////////////////////////////////////////////////
362/// Add a new histogram to the list.
363/// Only 1-d and 2-d histograms currently supported.
364/// A drawing option may be specified
365
367{
368 if (!h1) return;
369 if (h1->GetDimension() > 2) {
370 Error("Add","THStack supports only 1-d and 2-d histograms");
371 return;
372 }
373 if (!fHists) fHists = new TList();
375 Modified(); //invalidate stack
376}
377
378////////////////////////////////////////////////////////////////////////////////
379/// Browse.
380
382{
383 Draw(b ? b->GetDrawOption() : "");
384 gPad->Update();
385}
386
387////////////////////////////////////////////////////////////////////////////////
388/// Build the sum of all histograms.
389/// Build a separate list fStack containing the running sum of all histograms
390
392{
393 if (fStack) return;
394 if (!fHists) return;
395 Int_t nhists = fHists->GetSize();
396 if (!nhists) return;
397 fStack = new TObjArray(nhists);
400 TH1 *h = (TH1*)fHists->At(0)->Clone();
401 fStack->Add(h);
402 for (Int_t i=1;i<nhists;i++) {
403 h = (TH1*)fHists->At(i)->Clone();
404 if (h->GetMinimum() < 0.) {
405 Warning("BuildStack","Histograms with a negative minimum may produce wrong plots");
406 }
407 h->Add((TH1*)fStack->At(i-1));
408 fStack->AddAt(h,i);
409 }
411}
412
413////////////////////////////////////////////////////////////////////////////////
414/// Compute distance from point px, py to each graph.
415
417{
418 //*-*- Are we on the axis?
419 const Int_t kMaxDiff = 10;
420 Int_t distance = 9999;
421 if (fHistogram) {
422 distance = fHistogram->DistancetoPrimitive(px,py);
423 if (distance <= 0) {return distance;}
424 if (distance <= 1) {gPad->SetSelected(fHistogram);return distance;}
425 }
426
427
428 //*-*- Loop on the list of histograms
429 if (!fHists) return distance;
430 const char *doption = GetDrawOption();
431 Int_t nhists = fHists->GetSize();
432 for (Int_t i=0;i<nhists;i++) {
433 TH1 *h = (TH1*)fHists->At(i);
434 if (fStack && !strstr(doption,"nostack")) h = (TH1*)fStack->At(i);
435 Int_t dist = h->DistancetoPrimitive(px,py);
436 if (dist <= 0) return 0;
437 if (dist < kMaxDiff) {
438 gPad->SetSelected(fHists->At(i));
439 gPad->SetCursor(kPointer);
440 return dist;
441 }
442 }
443 return distance;
444}
445
446////////////////////////////////////////////////////////////////////////////////
447/// Draw this stack with its current attributes.
448///
449/// Options to draw histograms are described in THistPainter::Paint
450/// By default (if the option "nostack" is not specified), histograms will be painted
451/// stacked on top of each other.
452
454{
455 TString opt = option;
456 opt.ToLower();
457 if (gPad) {
458 if (!gPad->IsEditable()) gROOT->MakeDefCanvas();
459 if (!opt.Contains("same") && !opt.Contains("pads")) {
460 //the following statement is necessary in case one attempts to draw
461 //a temporary histogram already in the current pad
462 if (TestBit(kCanDelete)) gPad->Remove(this);
463 gPad->Clear();
464 }
465 }
466 AppendPad(opt.Data());
467}
468
469////////////////////////////////////////////////////////////////////////////////
470/// Returns a pointer to the histogram used to draw the axis.
471/// Takes into account the two following cases:
472/// 1- option 'A' was specified in THStack::Draw. Return fHistogram
473/// 2- user had called TPad::DrawFrame. return pointer to hframe histogram
474///
475/// IMPORTANT NOTES
476/// - You must call Draw before calling this function. The returned histogram
477/// depends on the selected Draw options.
478/// - This function returns a pointer to an intermediate fixed bin size
479/// histogram used to set the range and for picking.
480/// You cannot use this histogram to return the bin information.
481/// You must get a pointer to one of the histograms in the stack,
482/// the first one, for example.
483
485{
486 if (fHistogram) return fHistogram;
487 if (!gPad) return nullptr;
488 gPad->Modified();
489 gPad->Update();
490 if (fHistogram) return fHistogram;
491 return (TH1*)gPad->FindObject("hframe");
492}
493
494////////////////////////////////////////////////////////////////////////////////
495/// Returns the maximum of all added histograms smaller than maxval.
496/// Returns the maximum of all histograms, smaller than maxval, if option "nostack".
497
499{
500 TString opt = option;
501 opt.ToLower();
502 Bool_t lerr = opt.Contains("e");
503 Double_t themax = -std::numeric_limits<Double_t>::max();
504 if (!fHists) return 0;
505 Int_t nhists = fHists->GetSize();
506
507 auto check_error = [&themax](TH1 *h) {
508 Int_t first = h->GetXaxis()->GetFirst();
509 Int_t last = h->GetXaxis()->GetLast();
510 for (Int_t j = first; j <= last; j++) {
511 Double_t e1 = h->GetBinError(j);
512 Double_t c1 = h->GetBinContent(j);
513 themax = TMath::Max(themax, c1 + e1);
514 }
515 };
516
517 if (!opt.Contains("nostack")) {
518 BuildStack();
519 auto h = (TH1 *)fStack->At(nhists - 1);
520 if (fHistogram)
521 h->GetXaxis()->SetRange(fHistogram->GetXaxis()->GetFirst(),
523 themax = h->GetMaximum(maxval);
524 if (lerr)
525 check_error(h);
526 } else {
527 for (Int_t i = 0; i < nhists; i++) {
528 auto h = (TH1 *)fHists->At(i);
529 if (fHistogram)
530 h->GetXaxis()->SetRange(fHistogram->GetXaxis()->GetFirst(),
532 Double_t them = h->GetMaximum(maxval);
533 if (them > themax)
534 themax = them;
535 if (lerr)
536 check_error(h);
537 if (fHistogram)
538 h->GetXaxis()->SetRange(0,0);
539 }
540 }
541
542 return themax;
543}
544
545////////////////////////////////////////////////////////////////////////////////
546/// Returns the minimum of all added histograms larger than minval.
547/// Returns the minimum of all histograms, larger than minval, if option "nostack".
548
550{
551 if (!fHists) return 0;
552
553 TString opt = option;
554 opt.ToLower();
555 Bool_t lerr = opt.Contains("e");
556 Bool_t logy = gPad ? gPad->GetLogy() : kFALSE;
557 Double_t themin = std::numeric_limits<Double_t>::max();
558 Int_t nhists = fHists->GetSize();
559
560 auto check_error = [logy, &themin](TH1 *h) {
561 Int_t first = h->GetXaxis()->GetFirst();
562 Int_t last = h->GetXaxis()->GetLast();
563 for (Int_t j = first; j <= last; j++) {
564 Double_t e1 = h->GetBinError(j);
565 Double_t c1 = h->GetBinContent(j);
566 if (!logy || (c1 - e1 > 0))
567 themin = TMath::Min(themin, c1 - e1);
568 }
569 };
570
571 if (!opt.Contains("nostack")) {
572 BuildStack();
573 auto h = (TH1*)fStack->At(nhists-1);
574 themin = h->GetMinimum(minval);
575 if (themin <= 0 && logy)
576 themin = h->GetMinimum(0);
577 if (lerr)
578 check_error(h);
579 } else {
580 for (Int_t i = 0; i < nhists; i++) {
581 auto h = (TH1 *)fHists->At(i);
582 Double_t them = h->GetMinimum(minval);
583 if (them <= 0 && logy)
584 them = h->GetMinimum(0);
585 if (them < themin)
586 themin = them;
587 if (lerr)
588 check_error(h);
589 }
590 }
591
592 return themin;
593}
594
595////////////////////////////////////////////////////////////////////////////////
596/// Return the number of histograms in the stack
597
599{
600 if (fHists) return fHists->GetSize();
601 return 0;
602}
603
604////////////////////////////////////////////////////////////////////////////////
605/// Return pointer to Stack. Build it if not yet done.
606
608{
609 BuildStack();
610 return fStack;
611}
612
613////////////////////////////////////////////////////////////////////////////////
614/// Get the x-axis of the histogram used to draw the stack.
615///
616/// IMPORTANT NOTE
617/// You must call Draw before calling this function. The returned histogram
618/// depends on the selected Draw options.
619
621{
622 TH1 *h = GetHistogram();
623 return h ? h->GetXaxis() : nullptr;
624}
625
626////////////////////////////////////////////////////////////////////////////////
627/// Get the y-axis of the histogram used to draw the stack.
628///
629/// IMPORTANT NOTE
630/// You must call Draw before calling this function. The returned histogram
631/// depends on the selected Draw options.
632
634{
635 TH1 *h = GetHistogram();
636 return h ? h->GetYaxis() : nullptr;
637}
638
639////////////////////////////////////////////////////////////////////////////////
640/// Get the z-axis of the histogram used to draw the stack.
641///
642/// IMPORTANT NOTE
643/// You must call Draw before calling this function. The returned histogram
644/// depends on the selected Draw options.
645
647{
648 TH1 *h = GetHistogram();
649 if (!h) return nullptr;
650 if (h->GetDimension() == 1)
651 Warning("GetZaxis","1D Histograms don't have a Z axis");
652 return h->GetZaxis();
653}
654
655////////////////////////////////////////////////////////////////////////////////
656/// List histograms in the stack.
657
659{
661 std::cout <<IsA()->GetName()
662 <<" Name= "<<GetName()<<" Title= "<<GetTitle()<<" Option="<<option<<std::endl;
664 if (fHists) fHists->ls(option);
666}
667////////////////////////////////////////////////////////////////////////////////
668/// Merge the THStack in the TList into this stack.
669/// Returns the total number of histograms in the result or -1 in case of an error.
670
672{
673 if (li==nullptr || li->GetEntries()==0) {
674 return fHists->GetEntries();
675 }
676 TIter next(li);
677 TList histLists;
678 while (TObject* o = next()) {
679 THStack *stack = dynamic_cast<THStack*> (o);
680 if (!stack) {
681 Error("Merge",
682 "Cannot merge - an object which doesn't inherit from THStack found in the list");
683 return -1;
684 }
685 histLists.Add(stack->GetHists());
686 }
687 fHists->Merge(&histLists);
688 return fHists->GetEntries();
689}
690
691////////////////////////////////////////////////////////////////////////////////
692/// Note: this method invalidates the sum of histograms.
693
695{
696 if (!fStack) return;
697 fStack->Delete();
698 delete fStack;
699 fStack = nullptr;
700 delete fHistogram;
701 fHistogram = nullptr;
702}
703
704////////////////////////////////////////////////////////////////////////////////
705/// [Paint the list of histograms.](#HS00)
706
708{
709 BuildAndPaint(chopt, kTRUE);
710}
711
712////////////////////////////////////////////////////////////////////////////////
713/// Create all additional objects and stack (if specified).
714
715void THStack::BuildAndPaint(Option_t *choptin, Bool_t paint, Bool_t rebuild_stack)
716{
717 if (!fHists) return;
718 if (!fHists->GetSize()) return;
719
720 char option[128];
721 strlcpy(option,choptin,128);
722
723 // Automatic color
724 char *l1 = strstr(option,"pfc"); // Automatic Fill Color
725 char *l2 = strstr(option,"plc"); // Automatic Line Color
726 char *l3 = strstr(option,"pmc"); // Automatic Marker Color
727 if (l1 || l2 || l3) {
728 TString opt1 = option;
729 if (l1) memcpy(l1," ",3);
730 if (l2) memcpy(l2," ",3);
731 if (l3) memcpy(l3," ",3);
732 TString ws = option;
733 if (ws.IsWhitespace()) strncpy(option,"\0",1);
734 Int_t nhists = fHists->GetSize();
735 gPad->IncrementPaletteColor(nhists, opt1);
736 for (Int_t i = 0; i < nhists; i++) {
737 auto ic = gPad->NextPaletteColor();
738 auto hAti = static_cast<TH1 *>(fHists->At(i));
739 if (l1) hAti->SetFillColor(ic);
740 if (l2) hAti->SetLineColor(ic);
741 if (l3) hAti->SetMarkerColor(ic);
742 if (fStack) {
743 auto hsAti = static_cast<TH1 *>(fStack->At(i));
744 if (l1) hsAti->SetFillColor(ic);
745 if (l2) hsAti->SetLineColor(ic);
746 if (l3) hsAti->SetMarkerColor(ic);
747 }
748 }
749 }
750
751 TString opt = option;
752 opt.ToLower();
753 opt.ReplaceAll(" ","");
754 Bool_t lsame = kFALSE;
755 if (opt.Contains("same")) {
756 lsame = kTRUE;
757 opt.ReplaceAll("same","");
758 }
759 Bool_t lclear = kTRUE;
760 if (opt.Contains("noclear")) {
761 lclear = kFALSE;
762 opt.ReplaceAll("noclear","");
763 }
764 if (opt.Contains("pads")) {
765 if (!paint)
766 return;
767
768 Int_t npads = fHists->GetSize();
769 TVirtualPad *padsav = gPad;
770 //if pad is not already divided into subpads, divide it
771 Int_t nps = 0;
772 TIter nextp(padsav->GetListOfPrimitives());
773 while (auto obj = nextp()) {
774 if (obj->InheritsFrom(TVirtualPad::Class()))
775 nps++;
776 }
777 if (nps < npads) {
778 padsav->Clear();
779 Int_t nx = (Int_t)TMath::Sqrt((Double_t)npads);
780 if (nx*nx < npads) nx++;
781 Int_t ny = nx;
782 if (((nx*ny)-nx) >= npads) ny--;
783 padsav->Divide(nx,ny);
784 }
785
786 Int_t i = 1;
787 auto lnk = fHists->FirstLink();
788 while (lnk) {
789 auto subpad = padsav->GetPad(i++);
790 if (!subpad) break;
791 subpad->Clear();
792 subpad->Add(lnk->GetObject(), lnk->GetOption());
793 lnk = lnk->Next();
794 }
795 padsav->cd();
796 return;
797 }
798
799 // compute the min/max of each axis
800 TH1 *h;
801 TIter next(fHists);
802 Double_t xmin = 1e100;
803 Double_t xmax = -xmin;
804 Double_t ymin = 1e100;
805 Double_t ymax = -xmin;
806 while ((h=(TH1*)next())) {
807 // in case of automatic binning
808 if (h->GetBuffer()) h->BufferEmpty(-1);
809 if (h->GetXaxis()->GetXmin() < xmin) xmin = h->GetXaxis()->GetXmin();
810 if (h->GetXaxis()->GetXmax() > xmax) xmax = h->GetXaxis()->GetXmax();
811 if (h->GetYaxis()->GetXmin() < ymin) ymin = h->GetYaxis()->GetXmin();
812 if (h->GetYaxis()->GetXmax() > ymax) ymax = h->GetYaxis()->GetXmax();
813 }
814
815 TString loption = opt;
816 Bool_t nostack = loption.Contains("nostack");
817 Bool_t nostackb = loption.Contains("nostackb");
818 Bool_t candle = loption.Contains("candle");
819 Bool_t violin = loption.Contains("violin");
820
821
822 if (!nostack && !candle && !violin) {
823 // do not delete the stack by default - only when needed.
824 // Another pad may contain the same object and use it
825 if (rebuild_stack && fStack) {
826 fStack->Delete();
827 delete fStack;
828 fStack = nullptr;
829 }
830 BuildStack();
831 }
832
833 Double_t themax,themin;
834 if (fMaximum == -1111) themax = GetMaximum(option);
835 else themax = fMaximum;
836 if (fMinimum == -1111) {
837 themin = GetMinimum(option);
838 if (gPad->GetLogy()){
839 if (themin>0) themin *= .9;
840 else themin = themax*1.e-3;
841 }
842 else if (themin > 0)
843 themin = 0;
844 }
845 else themin = fMinimum;
846 if (!fHistogram) {
849 h = (TH1*)fHists->At(0);
850 TAxis *xaxis = h->GetXaxis();
851 TAxis *yaxis = h->GetYaxis();
852 const TArrayD *xbins = xaxis->GetXbins();
853 if (h->GetDimension() > 1) {
854 if (loption.IsNull()) loption = "lego1";
855 const TArrayD *ybins = yaxis->GetXbins();
856 if (xbins->fN != 0 && ybins->fN != 0) {
858 xaxis->GetNbins(), xbins->GetArray(),
859 yaxis->GetNbins(), ybins->GetArray());
860 } else if (xbins->fN != 0 && ybins->fN == 0) {
862 xaxis->GetNbins(), xbins->GetArray(),
863 yaxis->GetNbins(), ymin, ymax);
864 } else if (xbins->fN == 0 && ybins->fN != 0) {
866 xaxis->GetNbins(), xmin, xmax,
867 yaxis->GetNbins(), ybins->GetArray());
868 } else {
870 xaxis->GetNbins(), xmin, xmax,
871 yaxis->GetNbins(), ymin, ymax);
872 }
873 } else {
874 if (xbins->fN != 0) {
876 xaxis->GetNbins(), xbins->GetArray());
877 } else {
878 fHistogram = new TH1F(GetName(),GetTitle(),xaxis->GetNbins(),xmin, xmax);
879 }
880 }
881 fHistogram->SetStats(false);
883 } else {
885 }
886
887 if (nostackb) {
888 loption.ReplaceAll("nostackb","");
889 } else {
890 if (nostack) loption.ReplaceAll("nostack","");
892 }
893
895 if (nostack && fMaximum != -1111) fHistogram->SetMaximum(fMaximum);
896 else {
897 if (gPad->GetLogy()) fHistogram->SetMaximum(themax*(1+0.2*TMath::Log10(themax/themin)));
898 else {
899 if (fMaximum != -1111) fHistogram->SetMaximum(themax);
900 else fHistogram->SetMaximum((1+gStyle->GetHistTopMargin())*themax);
901 }
902 }
903 if (nostack && fMinimum != -1111) fHistogram->SetMinimum(fMinimum);
904 else {
905 if (gPad->GetLogy()) fHistogram->SetMinimum(themin/(1+0.5*TMath::Log10(themax/themin)));
906 else fHistogram->SetMinimum(themin);
907 }
908 }
909
910 // Copy the axis labels if needed.
911 TH1 *hfirst = (TH1*)fHists->First();
912 THashList* labels = hfirst->GetXaxis()->GetLabels();
913 if (labels) {
914 TIter iL(labels);
915 Int_t ilab = 1;
916 while (auto lb=(TObjString*)iL()) {
917 fHistogram->GetXaxis()->SetBinLabel(ilab,lb->String().Data());
918 ilab++;
919 }
920 }
921
922 // Set fHistogram attributes and paint it.
923 if (!lsame) {
925 if (paint)
926 fHistogram->Paint(loption.Data());
927 }
928
929 if (fHistogram->GetDimension() > 1)
930 SetDrawOption(loption.Data());
931 if (loption.Index("lego")>=0)
932 return;
933
934 char noption[32];
935 strlcpy(noption,loption.Data(),32);
936 Int_t nhists = fHists->GetSize();
937 if (nostack || candle || violin) {
938 auto lnk = fHists->FirstLink();
939 Double_t bo = 0.03;
940 Double_t bw = (1.-(2*bo))/nhists;
941 for (Int_t i=0;i<nhists;i++) {
942 if (strstr(lnk->GetOption(),"same")) {
943 if (nostackb) loption.Form("%s%s b",noption,lnk->GetOption());
944 else loption.Form("%s%s",noption,lnk->GetOption());
945 } else {
946 TString indivOpt = lnk->GetOption();
947 indivOpt.ToLower();
948 if (nostackb) loption.Form("%ssame%s b",noption,lnk->GetOption());
949 else if (candle && (indivOpt.Contains("candle") || indivOpt.Contains("violin"))) loption.Form("%ssame",lnk->GetOption());
950 else loption.Form("%ssame%s",noption,lnk->GetOption());
951 }
952 TH1* hAti = (TH1*) fHists->At(i);
953 if (nostackb) {
954 hAti->SetBarWidth(bw);
955 hAti->SetBarOffset(bo);
956 bo += bw;
957 }
958 if (candle || violin) {
959 float candleSpace = 1./(nhists*2);
960 float candleOffset = - 1./2 + candleSpace + 2*candleSpace*i;
961 candleSpace *= 1.66; //width of the candle per bin: 1.0 means space is as great as the candle, 2.0 means there is no space
962 hAti->SetBarWidth(candleSpace);
963 hAti->SetBarOffset(candleOffset);
964 }
965 if (paint)
966 hAti->Paint(loption.Data());
967 lnk = lnk->Next();
968 }
969 } else {
970 auto lnk = fHists->LastLink();
971 Int_t h1col, h1fill;
972 for (Int_t i=0;i<nhists;i++) {
973 if (strstr(lnk->GetOption(),"same")) {
974 loption.Form("%s%s",noption,lnk->GetOption());
975 } else {
976 loption.Form("%ssame%s",noption,lnk->GetOption());
977 }
978 TH1 *h1 = (TH1*) fStack->At(nhists-i-1);
979 if ((i > 0) && lclear && paint) {
980 // Erase before drawing the histogram
981 h1col = h1->GetFillColor();
982 h1fill = h1->GetFillStyle();
983 h1->SetFillColor(10);
984 h1->SetFillStyle(1001);
985 h1->Paint(loption.Data());
986 static TClassRef clTFrame = TClass::GetClass("TFrame", kFALSE);
987 TAttFill *frameFill = (TAttFill*)clTFrame->DynamicCast(TAttFill::Class(),gPad->GetFrame());
988 if (frameFill) {
989 h1->SetFillColor(frameFill->GetFillColor());
990 h1->SetFillStyle(frameFill->GetFillStyle());
991 }
992 h1->Paint(loption.Data());
993 h1->SetFillColor(h1col);
994 h1->SetFillStyle(h1fill);
995 }
996 if (paint)
997 h1->Paint(loption.Data());
998 lnk = lnk->Prev();
999 }
1000 }
1001
1002 opt.ReplaceAll("nostack","");
1003 opt.ReplaceAll("candle","");
1004 if (!lsame && !opt.Contains("a") && paint)
1005 fHistogram->Paint("axissame");
1006}
1007
1008////////////////////////////////////////////////////////////////////////////////
1009/// Print the list of histograms
1010
1012{
1013 TIter next(fHists);
1014 while (auto h = next())
1015 h->Print(option);
1016}
1017
1018////////////////////////////////////////////////////////////////////////////////
1019/// Recursively remove the object `obj` from the list of histograms.
1020
1022{
1023 if (!fHists) return;
1024 fHists->RecursiveRemove(obj);
1025 while (fHists->IndexOf(obj) >= 0) fHists->Remove(obj);
1026}
1027
1028////////////////////////////////////////////////////////////////////////////////
1029/// Save primitive as a C++ statement(s) on output stream out.
1030
1031void THStack::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
1032{
1033 char quote = '"';
1034 out<<" "<<std::endl;
1035 if (gROOT->ClassSaved(THStack::Class())) {
1036 out<<" ";
1037 } else {
1038 out<<" THStack *";
1039 }
1040 out<<GetName()<<" = new THStack();"<<std::endl;
1041 out<<" "<<GetName()<<"->SetName("<<quote<<GetName()<<quote<<");"<<std::endl;
1042 out<<" "<<GetName()<<"->SetTitle("<<quote<<GetTitle()<<quote<<");"<<std::endl;
1043
1044 if (fMinimum != -1111) {
1045 out<<" "<<GetName()<<"->SetMinimum("<<fMinimum<<");"<<std::endl;
1046 }
1047 if (fMaximum != -1111) {
1048 out<<" "<<GetName()<<"->SetMaximum("<<fMaximum<<");"<<std::endl;
1049 }
1050
1051 static Int_t frameNumber = 0;
1052 if (fHistogram) {
1053 frameNumber++;
1054 TString hname = fHistogram->GetName();
1055 fHistogram->SetName(TString::Format("%s_stack_%d", hname.Data(), frameNumber).Data());
1056 fHistogram->SavePrimitive(out,"nodraw");
1057 out<<" "<<GetName()<<"->SetHistogram("<<fHistogram->GetName()<<");"<<std::endl;
1058 out<<" "<<std::endl;
1059 fHistogram->SetName(hname.Data()); // restore histogram name
1060 }
1061
1062 if (fHists) {
1063 auto lnk = fHists->FirstLink();
1064 Int_t hcount = 0;
1065 while (lnk) {
1066 auto h = (TH1 *) lnk->GetObject();
1067 TString hname = h->GetName();
1068 h->SetName(TString::Format("%s_stack_%d", hname.Data(), ++hcount).Data());
1069 h->SavePrimitive(out,"nodraw");
1070 out<<" "<<GetName()<<"->Add("<<h->GetName()<<","<<quote<<lnk->GetOption()<<quote<<");"<<std::endl;
1071 lnk = lnk->Next();
1072 h->SetName(hname.Data()); // restore histogram name
1073 }
1074 }
1075 out<<" "<<GetName()<<"->Draw("<<quote<<option<<quote<<");"<<std::endl;
1076}
1077
1078////////////////////////////////////////////////////////////////////////////////
1079/// Set maximum.
1080
1082{
1083 fMaximum = maximum;
1084 if (fHistogram) fHistogram->SetMaximum(maximum);
1085}
1086
1087////////////////////////////////////////////////////////////////////////////////
1088/// Set minimum.
1089
1091{
1092 fMinimum = minimum;
1093 if (fHistogram) fHistogram->SetMinimum(minimum);
1094}
1095
1096
1097////////////////////////////////////////////////////////////////////////////////
1098/// Get an iterator over internal hists list.
1100{
1101 return TIter(fHists);
1102}
@ kPointer
Definition GuiTypes.h:375
#define b(i)
Definition RSha256.hxx:100
#define h(i)
Definition RSha256.hxx:106
int Int_t
Definition RtypesCore.h:45
constexpr Bool_t kFALSE
Definition RtypesCore.h:94
constexpr Ssiz_t kNPOS
Definition RtypesCore.h:117
long long Long64_t
Definition RtypesCore.h:69
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
const char Option_t
Definition RtypesCore.h:66
#define ClassImp(name)
Definition Rtypes.h:382
Option_t Option_t option
char name[80]
Definition TGX11.cxx:110
float xmin
float ymin
float xmax
float ymax
R__EXTERN TVirtualMutex * gROOTMutex
Definition TROOT.h:63
#define gROOT
Definition TROOT.h:406
R__EXTERN TStyle * gStyle
Definition TStyle.h:436
#define R__LOCKGUARD(mutex)
#define gPad
Array of doubles (64 bits per element).
Definition TArrayD.h:27
const Double_t * GetArray() const
Definition TArrayD.h:43
Int_t fN
Definition TArray.h:38
Fill Area Attributes class.
Definition TAttFill.h:19
virtual Color_t GetFillColor() const
Return the fill area color.
Definition TAttFill.h:30
virtual Style_t GetFillStyle() const
Return the fill area style.
Definition TAttFill.h:31
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition TAttFill.h:37
static TClass * Class()
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
Definition TAttFill.h:39
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
Definition TAttLine.h:43
Class to manage histogram axis.
Definition TAxis.h:31
virtual void SetBinLabel(Int_t bin, const char *label)
Set label for bin.
Definition TAxis.cxx:886
const TArrayD * GetXbins() const
Definition TAxis.h:136
Int_t GetLast() const
Return last bin on the axis i.e.
Definition TAxis.cxx:469
Int_t GetNbins() const
Definition TAxis.h:125
virtual void SetRange(Int_t first=0, Int_t last=0)
Set the viewing range for the axis using bin numbers.
Definition TAxis.cxx:1052
Int_t GetFirst() const
Return first bin on the axis i.e.
Definition TAxis.cxx:458
THashList * GetLabels() const
Definition TAxis.h:121
Using a TBrowser one can browse all ROOT objects.
Definition TBrowser.h:37
TClassRef is used to implement a permanent reference to a TClass object.
Definition TClassRef.h:28
void * DynamicCast(const TClass *base, void *obj, Bool_t up=kTRUE)
Cast obj of this class type up to baseclass cl if up is true.
Definition TClass.cxx:4982
Bool_t InheritsFrom(const char *cl) const override
Return kTRUE if this class inherits from a class with name "classname".
Definition TClass.cxx:4941
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Definition TClass.cxx:3035
Collection abstract base class.
Definition TCollection.h:65
void ls(Option_t *option="") const override
List (ls) all objects in this collection.
virtual Int_t GetEntries() const
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
1-D histogram with a float per channel (see TH1 documentation)
Definition TH1.h:622
TH1 is the base class of all histogram classes in ROOT.
Definition TH1.h:59
virtual void SetBarOffset(Float_t offset=0.25)
Set the bar offset as fraction of the bin width for drawing mode "B".
Definition TH1.h:364
TAxis * GetZaxis()
Definition TH1.h:326
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Compute distance from point px,py to a line.
Definition TH1.cxx:2823
void SetTitle(const char *title) override
Change/set the title.
Definition TH1.cxx:6739
virtual Int_t GetDimension() const
Definition TH1.h:283
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
Definition TH1.cxx:1294
@ kIsZoomed
Bit set when zooming on Y axis.
Definition TH1.h:169
TAxis * GetXaxis()
Definition TH1.h:324
TVirtualHistPainter * GetPainter(Option_t *option="")
Return pointer to painter.
Definition TH1.cxx:4511
TObject * FindObject(const char *name) const override
Search object named name in the list of functions.
Definition TH1.cxx:3857
virtual void SetMaximum(Double_t maximum=-1111)
Definition TH1.h:404
TAxis * GetYaxis()
Definition TH1.h:325
virtual void SetMinimum(Double_t minimum=-1111)
Definition TH1.h:405
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
Definition TH1.cxx:7258
void SetName(const char *name) override
Change the name of this histogram.
Definition TH1.cxx:8981
void Paint(Option_t *option="") override
Control routine to paint any kind of histograms.
Definition TH1.cxx:6227
TClass * IsA() const override
Definition TH1.h:444
static Bool_t AddDirectoryStatus()
Static function: cannot be inlined on Windows/NT.
Definition TH1.cxx:754
virtual void SetBarWidth(Float_t width=0.5)
Set the width of bars as fraction of the bin width for drawing mode "B".
Definition TH1.h:365
virtual void SetStats(Bool_t stats=kTRUE)
Set statistics option on/off.
Definition TH1.cxx:9011
2-D histogram with a float per channel (see TH1 documentation)
Definition TH2.h:307
Service class for 2-D histogram classes.
Definition TH2.h:30
TH1D * ProjectionY(const char *name="_py", Int_t firstxbin=0, Int_t lastxbin=-1, Option_t *option="") const
Project a 2-D histogram into a 1-D histogram along Y.
Definition TH2.cxx:2476
TH1D * ProjectionX(const char *name="_px", Int_t firstybin=0, Int_t lastybin=-1, Option_t *option="") const
Project a 2-D histogram into a 1-D histogram along X.
Definition TH2.cxx:2436
static TClass * Class()
The 3-D histogram classes derived from the 1-D histogram classes.
Definition TH3.h:31
static TClass * Class()
virtual TH1 * Project3D(Option_t *option="x") const
Project a 3-d histogram into 1 or 2-d histograms depending on the option parameter,...
Definition TH3.cxx:2409
The Histogram stack class.
Definition THStack.h:40
TIter begin() const
Get an iterator over internal hists list.
Definition THStack.cxx:1099
TClass * IsA() const override
Definition THStack.h:93
~THStack() override
THStack destructor.
Definition THStack.cxx:323
THStack()
Definition THStack.h:57
void BuildAndPaint(Option_t *chopt, Bool_t paint, Bool_t rebuild_stack=kFALSE)
Create all additional objects and stack (if specified).
Definition THStack.cxx:715
virtual Double_t GetMinimum(Option_t *option="", Double_t minval=-std::numeric_limits< Double_t >::max())
Returns the minimum of all added histograms larger than minval.
Definition THStack.cxx:549
void ls(Option_t *option="") const override
List histograms in the stack.
Definition THStack.cxx:658
TObjArray * fStack
! Pointer to array of sums of TH1
Definition THStack.h:46
Double_t fMinimum
Minimum value for plotting along y.
Definition THStack.h:49
void BuildStack()
Build the sum of all histograms.
Definition THStack.cxx:391
TList * GetHists() const
Definition THStack.h:72
TAxis * GetYaxis() const
Get the y-axis of the histogram used to draw the stack.
Definition THStack.cxx:633
virtual Long64_t Merge(TCollection *li, TFileMergeInfo *info)
Merge the THStack in the TList into this stack.
Definition THStack.cxx:671
TH1 * GetHistogram() const
Returns a pointer to the histogram used to draw the axis.
Definition THStack.cxx:484
void RecursiveRemove(TObject *obj) override
Recursively remove the object obj from the list of histograms.
Definition THStack.cxx:1021
virtual void Add(TH1 *h, Option_t *option="")
Add a new histogram to the list.
Definition THStack.cxx:366
void Print(Option_t *chopt="") const override
Print the list of histograms.
Definition THStack.cxx:1011
TObjArray * GetStack()
Return pointer to Stack. Build it if not yet done.
Definition THStack.cxx:607
Int_t GetNhists() const
Return the number of histograms in the stack.
Definition THStack.cxx:598
virtual Double_t GetMaximum(Option_t *option="", Double_t maxval=std::numeric_limits< Double_t >::max())
Returns the maximum of all added histograms smaller than maxval.
Definition THStack.cxx:498
void Draw(Option_t *chopt="") override
Draw this stack with its current attributes.
Definition THStack.cxx:453
void Paint(Option_t *chopt="") override
Paint the list of histograms.
Definition THStack.cxx:707
TList * fHists
Pointer to array of TH1.
Definition THStack.h:45
virtual void SetMaximum(Double_t maximum=-1111)
Set maximum.
Definition THStack.cxx:1081
TH1 * fHistogram
Pointer to histogram used for drawing axis.
Definition THStack.h:47
TAxis * GetZaxis() const
Get the z-axis of the histogram used to draw the stack.
Definition THStack.cxx:646
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
Definition THStack.cxx:1031
void Browse(TBrowser *b) override
Browse.
Definition THStack.cxx:381
static TClass * Class()
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Compute distance from point px, py to each graph.
Definition THStack.cxx:416
virtual void Modified()
Note: this method invalidates the sum of histograms.
Definition THStack.cxx:694
virtual void SetMinimum(Double_t minimum=-1111)
Set minimum.
Definition THStack.cxx:1090
TAxis * GetXaxis() const
Get the x-axis of the histogram used to draw the stack.
Definition THStack.cxx:620
Double_t fMaximum
Maximum value for plotting along y.
Definition THStack.h:48
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
Definition THashList.h:34
A doubly linked list.
Definition TList.h:38
void Clear(Option_t *option="") override
Remove all objects from the list.
Definition TList.cxx:400
virtual TObjLink * LastLink() const
Definition TList.h:105
void RecursiveRemove(TObject *obj) override
Remove object from this collection and recursively remove the object from all other objects (and coll...
Definition TList.cxx:762
void Add(TObject *obj) override
Definition TList.h:81
TObject * Remove(TObject *obj) override
Remove object from the list.
Definition TList.cxx:820
TObject * First() const override
Return the first object in the list. Returns 0 when list is empty.
Definition TList.cxx:657
virtual TObjLink * FirstLink() const
Definition TList.h:102
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
Definition TList.cxx:355
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
const char * GetName() const override
Returns name of object.
Definition TNamed.h:47
const char * GetTitle() const override
Returns title of object.
Definition TNamed.h:48
TString fTitle
Definition TNamed.h:33
TString fName
Definition TNamed.h:32
An array of TObjects.
Definition TObjArray.h:31
void AddAt(TObject *obj, Int_t idx) override
Add object at position ids.
void Delete(Option_t *option="") override
Remove all objects from the array AND delete all heap based objects.
TObject * At(Int_t idx) const override
Definition TObjArray.h:164
void Add(TObject *obj) override
Definition TObjArray.h:68
Collectable string class.
Definition TObjString.h:28
Mother of all ROOT objects.
Definition TObject.h:41
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:199
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
Definition TObject.cxx:241
virtual Option_t * GetDrawOption() const
Get option used by the graphics system to draw this object.
Definition TObject.cxx:440
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:991
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
Definition TObject.cxx:202
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1005
virtual void SetDrawOption(Option_t *option="")
Set drawing option for object.
Definition TObject.cxx:782
@ kCanDelete
if object in a list can be deleted
Definition TObject.h:62
static Int_t IncreaseDirLevel()
Increase the indentation level for ls().
Definition TROOT.cxx:2887
static void IndentLevel()
Functions used by ls() to indent an object hierarchy.
Definition TROOT.cxx:2895
static Int_t DecreaseDirLevel()
Decrease the indentation level for ls().
Definition TROOT.cxx:2746
virtual Int_t IndexOf(const TObject *obj) const
Return index of object in collection.
Long64_t Merge(TCollection *list)
Merge this collection with all collections coming in the input list.
Basic string class.
Definition TString.h:139
Ssiz_t Length() const
Definition TString.h:417
void ToLower()
Change string to lower-case.
Definition TString.cxx:1182
Ssiz_t First(char c) const
Find first occurrence of a character c.
Definition TString.cxx:538
const char * Data() const
Definition TString.h:376
TString & ReplaceAll(const TString &s1, const TString &s2)
Definition TString.h:704
Bool_t IsNull() const
Definition TString.h:414
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition TString.cxx:2378
Bool_t IsWhitespace() const
Definition TString.h:415
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition TString.cxx:2356
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition TString.h:632
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Definition TString.h:651
Double_t GetHistTopMargin() const
Definition TStyle.h:238
virtual void SetStack(TList *stack)=0
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition TVirtualPad.h:51
virtual TList * GetListOfPrimitives() const =0
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
virtual TVirtualPad * GetPad(Int_t subpadnumber) const =0
virtual void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0)=0
static TClass * Class()
void Clear(Option_t *option="") override=0
return c1
Definition legend1.C:41
TH1F * h1
Definition legend1.C:5
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Definition TMathBase.h:250
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:662
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Definition TMathBase.h:198
Double_t Log10(Double_t x)
Returns the common (base-10) logarithm of x.
Definition TMath.h:762
th1 Draw()