Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TRatioPlot.cxx
Go to the documentation of this file.
1// @(#)root/gpad:$Id$
2// Author: Paul Gessinger 25/08/2016
3
4/*************************************************************************
5 * Copyright (C) 1995-2024, 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 "TRatioPlot.h"
13#include "TROOT.h"
14#include "TBrowser.h"
15#include "TH1.h"
16#include "TF1.h"
17#include "TPad.h"
18#include "TString.h"
19#include "TMath.h"
20#include "TGraphAsymmErrors.h"
21#include "TGraphErrors.h"
22#include "TGaxis.h"
23#include "TLine.h"
24#include "TVirtualFitter.h"
25#include "TFitResult.h"
26#include "THStack.h"
27#include "TStyle.h"
28
29/** \class TRatioPlot
30 \ingroup gpad
31Class for displaying ratios, differences and fit residuals.
32
33TRatioPlot has two constructors, one which accepts two histograms, and is responsible
34for setting up the calculation of ratios and differences. This calculation is in part
35delegated to `TEfficiency`. A single option can be given as a parameter, that is
36used to determine which procedure is chosen. The remaining option string is then
37passed through to the calculation, if applicable. The other constructor uses a
38fitted histogram to calculate the fit residual and plot it with the histogram
39and the fit function.
40
41## Ratios and differences
42The simplest case is passing two histograms without specifying any options. This defaults to using
43`TGraphAsymmErrors::Divide`. The `option` variable is passed through, as are the parameters
44`c1` and `c2`, that you can set via `TRatioPlot::SetC1` and `TRatioPlot::SetC1`. If you set the
45`option` to `divsym` the method `TH1::Divide` will be used instead, also receiving all the parameters.
46
47Using the `option` `diff` or `diffsig`, both histograms will be subtracted, and in the case of diffsig,
48the difference will be divided by the uncertainty. `c1` and `c2` will only be used to
49scale the histograms using `TH1::Scale` prior to subtraction.
50
51Available options are for `option`:
52| Option | Description |
53| ---------- | ------------------------------------------------------------ |
54| divsym | uses the histogram `TH1::Divide` method, yields symmetric errors |
55| diff | subtracts the histograms |
56| diffsig | subtracts the histograms and divides by the uncertainty |
57
58Begin_Macro(source)
59../../../tutorials/hist/ratioplot1.C
60End_Macro
61
62## Fit residuals
63A second constructor only accepts a single histogram, but expects it to have a fitted
64function. The function is used to calculate the residual between the fit and the
65histogram. Here, it is expected that h1 has a fit function in it's list of functions. The class calculates the
66difference between the histogram and the fit function at each point and divides it by the uncertainty. There
67are a few option to steer which error is used (as is the case for `diffsig`). The default is to use
68the statistical uncertainty from h1 using `TH1::GetBinError`. If the `option` string contains `errasym`, asymmetric
69errors will be used. The type of error can be steered by `TH1::SetBinErrorOption`. The corresponding error will be used,
70depending on if the function is below or above the bin content. The third option `errfunc` uses the square root of
71the function value as the error.
72
73
74Begin_Macro(source)
75../../../tutorials/hist/ratioplot2.C
76End_Macro
77
78## Error options for difference divided by uncertainty and fit residual
79The uncertainty that is used in the calculation can be steered by providing
80options to the `option` argument.
81
82| Option | Description |
83| ---------- | ------------------------------------------------------------ |
84| errasym | Uses calculated asymmetric errors from `TH1::GetBinErrorUp`/`TH1::GetBinErrorLow`. Note that you need to set `TH1::SetBinErrorOption` first |
85| errfunc | Uses \f$ \sqrt{f(x)} \f$ as the error |
86
87The asymmetric error case uses the upper or lower error depending on the relative size
88of the bin contents, or the bin content and the function value.
89
90## Access to internal parts
91You can access the internal objects that are used to construct the plot via a series of
92methods. `TRatioPlot::GetUpperPad` and `TRatioPlot::GetLowerPad` can be used to draw additional
93elements on top of the existing ones.
94`TRatioPlot::GetLowerRefGraph` returns a reference to the lower pad's graph that
95is responsible for the range, which enables you to modify the range.
96
97\image html gpad_ratioplot.png
98*/
99
100
101////////////////////////////////////////////////////////////////////////////////
102/// TRatioPlot default constructor
103
104TRatioPlot::TRatioPlot() : fLeftMargin(gStyle->GetPadLeftMargin()), fRightMargin(gStyle->GetPadRightMargin()) {}
105
106////////////////////////////////////////////////////////////////////////////////
107/// Destructor
108
110{
111 delete fSharedXAxis;
112 delete fUpYaxis;
113 delete fLowYaxis;
114
118 }
119
120 // special case when fH1 created from the stack but not drawn - need to delete it
122 delete fH1;
123}
124
125////////////////////////////////////////////////////////////////////////////////
126/// Internal method that shares constructor logic
127
129{
130
131 fH1 = h1;
132 fH2 = h2;
133
134 SetupPads();
135
136 TString optionString = option;
137
138 if (optionString.Contains("divsym")) {
139 optionString.ReplaceAll("divsym", "");
141 } else if (optionString.Contains("diffsig")) {
142 optionString.ReplaceAll("diffsig", "");
144
145 // determine which error style
146 if (optionString.Contains("errasym")) {
148 optionString.ReplaceAll("errasym", "");
149 }
150
151 if (optionString.Contains("errfunc")) {
153 optionString.ReplaceAll("errfunc", "");
154 }
155 } else if (optionString.Contains("diff")) {
156 optionString.ReplaceAll("diff", "");
158 } else {
159 fMode = CalculationMode::kDivideGraph; // <- default
160 }
161
162 fOption = optionString;
163
164
165 fH1DrawOpt = "hist";
166 fH2DrawOpt = "E";
167 fGraphDrawOpt = "AP";
168
169
170 // build ratio, everything is ready
171 if (!BuildLowerPlot()) return;
172
173 // taking x axis information from h1 by cloning it x axis
174 fSharedXAxis = static_cast<TAxis *>(fH1->GetXaxis()->Clone());
175 fUpYaxis = static_cast<TAxis *>(fH1->GetYaxis()->Clone());
176 fLowYaxis = static_cast<TAxis *>(fRatioGraph->GetYaxis()->Clone());
177}
178
179////////////////////////////////////////////////////////////////////////////////
180/// Constructor for two histograms
181///
182/// \param h1 First histogram
183/// \param h2 Second histogram
184/// \param option Steers the error calculation, as well as ratio / difference
185
187{
188 if (!h1 || !h2) {
189 Warning("TRatioPlot", "Need two histograms.");
190 return;
191 }
192
193 Bool_t h1IsTH1 = h1->InheritsFrom(TH1::Class());
194 Bool_t h2IsTH1 = h2->InheritsFrom(TH1::Class());
195
196 if (!h1IsTH1 && !h2IsTH1) {
197 Warning("TRatioPlot", "Need two histograms deriving from TH2 or TH3.");
198 return;
199 }
200
202
203 Init(h1, h2, option);
204
205}
206
207////////////////////////////////////////////////////////////////////////////////
208/// Constructor which accepts a `THStack` and a histogram. Converts the
209/// stack to a regular sum of its containing histograms for processing.
210///
211/// \param st The THStack object
212/// \param h2 The other histogram
213/// \param option Steers the calculation of the lower plot
214
216{
217 if (!st || !h2) {
218 Warning("TRatioPlot", "Need a histogram and a stack");
219 return;
220 }
221
222 TList *stackHists = st->GetHists();
223
224 if (stackHists->GetSize() == 0) {
225 Warning("TRatioPlot", "Stack does not have histograms");
226 return;
227 }
228
229 auto tmpHist = static_cast<TH1 *>(stackHists->At(0)->Clone());
230 tmpHist->Reset();
231
232 for (int i = 0; i < stackHists->GetSize(); ++i) {
233 tmpHist->Add(static_cast<TH1 *>(stackHists->At(i)));
234 }
235
236 fHistDrawProxy = st;
238
239 Init(tmpHist, h2, option);
240
241}
242
243////////////////////////////////////////////////////////////////////////////////
244/// Constructor which accepts a `THStack` and a histogram. Converts the
245/// stack to a regular sum of its containing histograms for processing.
246///
247/// \param h1 The other histogram
248/// \param st The THStack object
249/// \param option Steers the calculation of the lower plot
250
252{
253 if (!st || !h1) {
254 Warning("TRatioPlot", "Need a histogram and a stack");
255 return;
256 }
257
258 TList *stackHists = st->GetHists();
259
260 if (stackHists->GetSize() == 0) {
261 Warning("TRatioPlot", "Stack does not have histograms");
262 return;
263 }
264
265 auto tmpHist = static_cast<TH1 *>(stackHists->At(0)->Clone());
266 tmpHist->Reset();
267
268 for (int i = 0; i < stackHists->GetSize(); ++i) {
269 tmpHist->Add(static_cast<TH1 *>(stackHists->At(i)));
270 }
271
272 fHistDrawProxy = st;
274
275 Init(h1, tmpHist, option);
276
277}
278
279////////////////////////////////////////////////////////////////////////////////
280/// Constructor for one histogram and a fit.
281///
282/// \param h1 The histogram
283/// \param option Steers the error calculation
284/// \param fitres Explicit fit result to be used for calculation. Uses last fit if left empty
285
287{
288 fH1 = h1;
289 if (!fH1) {
290 Warning("TRatioPlot", "Need a histogram.");
291 return;
292 }
293
294 Bool_t h1IsTH1 = fH1->InheritsFrom(TH1::Class());
295
296 if (!h1IsTH1) {
297 Warning("TRatioPlot", "Need a histogram deriving from TH2 or TH3.");
298 return;
299 }
300
301 TList *h1Functions = fH1->GetListOfFunctions();
302
303 if (h1Functions->GetSize() < 1) {
304 Warning("TRatioPlot", "Histogram given needs to have a (fit) function associated with it");
305 return;
306 }
307
308
310
311 fFitResult = fitres;
312
314
315 TString optionString = option;
316
317 // determine which error style
318 if (optionString.Contains("errasym")) {
320 optionString.ReplaceAll("errasym", "");
321 }
322
323 if (optionString.Contains("errfunc")) {
325 optionString.ReplaceAll("errfunc", "");
326 }
327
328 fOption = optionString;
329
330 if (!BuildLowerPlot()) return;
331
332 // emulate option behaviour of TH1
333 if (fH1->GetSumw2N() > 0) {
334 fH1DrawOpt = "E";
335 } else {
336 fH1DrawOpt = "hist";
337 }
338 fGraphDrawOpt = "LX"; // <- default
339
340 fSharedXAxis = static_cast<TAxis *>(fH1->GetXaxis()->Clone());
341 fUpYaxis = static_cast<TAxis *>(fH1->GetYaxis()->Clone());
342 fLowYaxis = static_cast<TAxis *>(fRatioGraph->GetYaxis()->Clone());
343
344 //SyncAxesRanges();
345
346 SetupPads();
347
348}
349
350////////////////////////////////////////////////////////////////////////////////
351/// Sets the drawing option for h1
352
354{
355 fH1DrawOpt = opt;
356}
357
358////////////////////////////////////////////////////////////////////////////////
359/// Sets the drawing option for h2
360
362{
363 TString optString = opt;
364 optString.ReplaceAll("same", "");
365 optString.ReplaceAll("SAME", "");
366
367 fH2DrawOpt = optString;
368}
369
370////////////////////////////////////////////////////////////////////////////////
371/// Sets the drawing option for the lower graph
372
374{
375 fGraphDrawOpt = opt;
376}
377
378////////////////////////////////////////////////////////////////////////////////
379/// Sets the drawing option for the fit in the fit residual case
380
382{
383 fFitDrawOpt = opt;
384}
385
386////////////////////////////////////////////////////////////////////////////////
387/// Setup the pads.
388
390{
391 // this method will delete all the pads before recreating them
392
393 if (fUpperPad) {
394 delete fUpperPad;
395 fUpperPad = nullptr;
396 }
397
398 if (fLowerPad) {
399 delete fLowerPad;
400 fLowerPad = nullptr;
401 }
402
403 if (!gPad) {
404 Error("SetupPads", "need to create a canvas first");
405 return;
406 }
407
408 double pm = fInsetWidth;
409 double width = gPad->GetWNDC();
410 double height = gPad->GetHNDC();
411 double f = height/width;
412
413 fUpperPad = new TPad("upper_pad", "", pm*f, fSplitFraction, 1.-pm*f, 1.-pm);
414 fLowerPad = new TPad("lower_pad", "", pm*f, pm, 1.-pm*f, fSplitFraction);
415
417
418 // connect to the pads signal
419
420 if (fTopPad) {
421 delete fTopPad;
422 fTopPad = nullptr;
423 }
424
425 fTopPad = new TPad("top_pad", "", pm*f, pm, 1-pm*f, 1-pm);
426
428}
429
430////////////////////////////////////////////////////////////////////////////////
431/// Connect some signals from the pads to handle them
432/// Allows correctly work also after reading ratioplot from the file
433
435{
436 static const char *rangeSignal = "RangeAxisChanged()";
437
438 if (fUpperPad->HasConnection(rangeSignal) && fLowerPad->HasConnection(rangeSignal))
439 return;
440
441 fUpperPad->Connect(rangeSignal, ClassName(), this, "RangeAxisChanged()");
442 fLowerPad->Connect(rangeSignal, ClassName(), this, "RangeAxisChanged()");
443
444 fUpperPad->Connect("UnZoomed()", ClassName(), this, "UnZoomed()");
445 fLowerPad->Connect("UnZoomed()", ClassName(), this, "UnZoomed()");
446
447 fUpperPad->Connect("Resized()", ClassName(), this, "SubPadResized()");
448 fLowerPad->Connect("Resized()", ClassName(), this, "SubPadResized()");
449
450}
451
452////////////////////////////////////////////////////////////////////////////////
453/// Sets the top margin of the upper pad.
454///
455/// \param margin The new margin
456
458{
459 fUpTopMargin = margin;
461}
462
463////////////////////////////////////////////////////////////////////////////////
464/// Sets the bottom margin of the upper pad.
465///
466/// \param margin The new margin
467
469{
470 fUpBottomMargin = margin;
472}
473
474////////////////////////////////////////////////////////////////////////////////
475/// Sets the top margin of the lower pad.
476///
477/// \param margin The new margin
478
480{
481 fLowTopMargin = margin;
483}
484
485////////////////////////////////////////////////////////////////////////////////
486/// Sets the bottom margin of the lower pad.
487///
488/// \param margin The new margin
489
491{
492 fLowBottomMargin = margin;
494}
495
496////////////////////////////////////////////////////////////////////////////////
497/// Sets the left margin of both pads.
498/// \param margin The new margin
499
501{
502 fLeftMargin = margin;
504}
505
506////////////////////////////////////////////////////////////////////////////////
507/// Sets the right margin of both pads.
508///
509/// \param margin The new margin
510
512{
513 fRightMargin = margin;
515}
516
517////////////////////////////////////////////////////////////////////////////////
518/// Sets the margin that separates the two pads. The margin is split according
519/// to the relative sizes of the pads
520///
521/// \param margin The new margin
522///
523/// Begin_Macro(source)
524/// ../../../tutorials/hist/ratioplot6.C
525/// End_Macro
526
528{
530 fUpBottomMargin = margin/2./(1-sf);
531 fLowTopMargin = margin/2./sf;
533}
534
535////////////////////////////////////////////////////////////////////////////////
536/// Return the separation margin value.
537
539{
541 Float_t up = fUpBottomMargin * (1-sf);
542 Float_t down = fLowTopMargin * sf;
543 return up+down;
544}
545
546////////////////////////////////////////////////////////////////////////////////
547/// Draws the ratio plot to the currently active pad. Therefore it requires that
548/// a TCanvas has been created first.
549///
550/// It takes the following options
551///
552/// | Option | Description |
553/// | ---------- | ------------------------------------------------------------ |
554/// | grid / nogrid | enable (default) or disable drawing of dashed lines on lower plot |
555/// | hideup | hides the first label of the upper axis if there is not enough space |
556/// | fhideup | always hides the first label of the upper axis |
557/// | hidelow (default) | hides the last label of the lower axis if there is not enough space |
558/// | fhidelow | always hides the last label of the lower axis |
559/// | nohide | does not hide a label if there is not enough space |
560/// | noconfint | does not draw the confidence interval bands in the fit residual case |
561/// | confint | draws the confidence interval bands in the fit residual case (default) |
562
564{
565
566 TString drawOpt = option;
567
568 if (drawOpt.Contains("nogrid")) {
569 drawOpt.ReplaceAll("nogrid", "");
571 } else if (drawOpt.Contains("grid")) {
572 drawOpt.ReplaceAll("grid", "");
574 }
575
576 if (drawOpt.Contains("noconfint")) {
577 drawOpt.ReplaceAll("noconfint", "");
579 } else if (drawOpt.Contains("confint")) {
580 drawOpt.ReplaceAll("confint", "");
581 fShowConfidenceIntervals = kTRUE; // <- default
582 }
583
584 if (drawOpt.Contains("fhideup")) {
586 } else if (drawOpt.Contains("fhidelow")) {
588 } else if (drawOpt.Contains("hideup")) {
590 } else if (drawOpt.Contains("hidelow")) {
592 } else if (drawOpt.Contains("nohide")) {
594 } else {
596 }
597
598 if (!gPad) {
599 Error("Draw", "need to create a canvas first");
600 return;
601 }
602
604
605 // draw ratio plot as very first object
606 // when painting one can update all attributes before other objects are painted
607 AppendPad();
608
612
617
618 // we are a TPad
619
620 fUpperPad->Draw();
621 fLowerPad->Draw();
622
624 fTopPad->Draw();
625
626 fUpperPad->cd();
627
630
632 // use last function in the list
633 TF1 *func = nullptr;
634 for (int i = fH1->GetListOfFunctions()->GetSize()-1; i >= 0; i--) {
635 auto obj = fH1->GetListOfFunctions()->At(i);
636 if (obj->InheritsFrom(TF1::Class()) ) {
637 func = dynamic_cast<TF1*>(obj);
638 break;
639 }
640 }
641 if (!func) {
642 // this is checked in constructor and should thus not occur
643 Error("Draw", "h1 does not have a fit function");
644 return;
645 }
646
647 fH1->Draw("A"+fH1DrawOpt);
648 func->Draw(fFitDrawOpt+"same");
649
650 fLowerPad->cd();
651
656 } else {
657 fRatioGraph->Draw("IA"+fGraphDrawOpt+"SAME");
658 }
659 } else {
660
661 if (fHistDrawProxy) {
664 } else {
665 Warning("Draw", "Draw proxy not of type TH1 or THStack, not drawing it");
666 }
667 }
668
669 fH2->Draw("A"+fH2DrawOpt+"same");
670
671 fLowerPad->cd();
672
675
676 }
677
678 // assign same axis ranges to lower pad as in upper pad
679 // the visual axes will be created on paint
681
683
685
686 // restore active pad at the end
687 fParentPad->cd();
688
689 // only after object drawn connect signals
691}
692
693////////////////////////////////////////////////////////////////////////////////
694/// Returns the reference graph for the lower pad, which means the graph that
695/// is responsible for setting the coordinate system. It is the first graph
696/// added to the primitive list of the lower pad.
697/// This reference can be used to set the minimum and maximum of the lower pad.
698/// Note that `TRatioPlot::Draw` needs to have been called first, since the
699/// graphs are only created then.
700///
701/// Begin_Macro(source)
702/// ../../../tutorials/hist/ratioplot3.C
703/// End_Macro
704
706{
707 if (!fLowerPad) {
708 Error("GetLowerRefGraph", "Lower pad has not been defined");
709 return nullptr;
710 }
711
712 TList *primlist = fLowerPad->GetListOfPrimitives();
713 if (primlist->GetSize() == 0) {
714 Error("GetLowerRefGraph", "Lower pad does not have primitives");
715 return nullptr;
716 }
717
718 TObjLink *lnk = primlist->FirstLink();
719
720 while (lnk) {
721 TObject *obj = lnk->GetObject();
722
723 if (obj->InheritsFrom(TGraph::Class()))
724 return static_cast<TGraph *>(obj);
725
726 lnk = lnk->Next();
727 }
728
729 Error("GetLowerRefGraph", "Did not find graph in list");
730 return nullptr;
731}
732
733////////////////////////////////////////////////////////////////////////////////
734/// Return the reference object. Its the first TH1 or THStack type object
735/// in the upper pads list of primitives.
736/// Note that it returns a `TObject`, so you need to test and cast it to use it.
737
739{
740 TList *primlist = fUpperPad->GetListOfPrimitives();
741 for (Int_t i = 0; i < primlist->GetSize(); ++i) {
742 auto refobj = primlist->At(i);
743 if (refobj->InheritsFrom(TH1::Class()) || refobj->InheritsFrom(THStack::Class())) {
744 return refobj;
745 }
746 }
747
748 Error("GetUpperRefObject", "No upper ref object of TH1 or THStack type found");
749 return nullptr;
750}
751
752////////////////////////////////////////////////////////////////////////////////
753/// Gets the x axis of the object returned by `TRatioPlot::GetUpperRefObject`.
754
756{
757 TObject *refobj = GetUpperRefObject();
758
759 if (!refobj)
760 return nullptr;
761
762 if (refobj->InheritsFrom(TH1::Class())) {
763 return static_cast<TH1 *>(refobj)->GetXaxis();
764 } else if (refobj->InheritsFrom(THStack::Class())) {
765 return static_cast<THStack *>(refobj)->GetXaxis();
766 }
767
768 return nullptr;
769}
770
771////////////////////////////////////////////////////////////////////////////////
772/// Gets the y axis of the object returned by `TRatioPlot::GetUpperRefObject`.
773
775{
776 TObject *refobj = GetUpperRefObject();
777
778 if (!refobj)
779 return nullptr;
780
781 if (refobj->InheritsFrom(TH1::Class())) {
782 return static_cast<TH1 *>(refobj)->GetYaxis();
783 } else if (refobj->InheritsFrom(THStack::Class())) {
784 return static_cast<THStack *>(refobj)->GetYaxis();
785 }
786
787 return nullptr;
788}
789
790////////////////////////////////////////////////////////////////////////////////
791/// Gets the x axis of the lower ref graph.
792/// Shortcut for:
793///
794/// ~~~{.cpp}
795/// rp->GetLowerRefGraph()->GetXaxis();
796/// ~~~
797
799{
800 auto gr = GetLowerRefGraph();
801 return gr ? gr->GetXaxis() : nullptr;
802}
803
804////////////////////////////////////////////////////////////////////////////////
805/// Gets the y axis of the lower ref graph.
806/// Shortcut for:
807///
808/// ~~~{.cpp}
809/// rp->GetLowerRefGraph()->GetYaxis();
810/// ~~~
811
813{
814 auto gr = GetLowerRefGraph();
815 return gr ? gr->GetYaxis() : nullptr;
816}
817
818////////////////////////////////////////////////////////////////////////////////
819/// Create a grid lines
820
822{
823
824 if (!fShowGridlines)
825 return; // don't draw them
826
827 while (fGridlines.size() < fGridlinePositions.size()) {
828 TLine *newline = new TLine(0, 0, 0, 0);
829 newline->SetLineStyle(2);
830 fLowerPad->Add(newline);
831 fGridlines.emplace_back(newline);
832 }
833
835}
836
837////////////////////////////////////////////////////////////////////////////////
838/// Update positions of grid lines
839
841{
844
845 Double_t lowYFirst = fLowerPad->GetUymin();
846 Double_t lowYLast = fLowerPad->GetUymax();
847
848 for (size_t i = 0; i < fGridlines.size(); ++i) {
849 auto line = fGridlines.at(i);
850 Bool_t visible = kFALSE;
851 Double_t y = 0.;
852 if (i < fGridlinePositions.size()) {
854 visible = (y >= lowYFirst && y <= lowYLast);
855 }
856
857 if (visible) {
858 line->SetX1(first);
859 line->SetX2(last);
860 line->SetY1(y);
861 line->SetY2(y);
862 } else {
863 line->SetX1(first);
864 line->SetX2(first);
865 line->SetY1(lowYFirst);
866 line->SetY2(lowYFirst);
867 }
868 }
869}
870
871
872////////////////////////////////////////////////////////////////////////////////
873/// Update the visual axes and grid lines when painting
874
876{
877 // painting invoked before object drawn to the end - just ignore here
878 if (!fUpperGXaxis)
879 return;
880
882
885
886 // in any case reset flag after painting
888}
889
890////////////////////////////////////////////////////////////////////////////////
891/// Syncs the axes ranges from the shared ones to the actual ones.
892
894{
895 // get ranges from the shared axis clone
898
899 // set range on computed graph, have to set it twice because
900 // TGraph's axis looks strange otherwise
901 TAxis *ref = GetLowerRefXaxis();
902 ref->SetLimits(first, last);
903 ref->SetRangeUser(first, last);
904
905 GetUpperRefXaxis()->SetRangeUser(first, last);
906}
907
908////////////////////////////////////////////////////////////////////////////////
909/// Build the lower plot according to which constructor was called, and
910/// which options were passed.
911
913{
914 static const char *thisMethod = "BuildLowerPlot";
915
916 // Clear and delete the graph if not exists
917 if (fRatioGraph) {
918 delete fRatioGraph;
919 fRatioGraph = nullptr;
920 }
921
924
927
928 static Double_t divideGridlines[] = {0.7, 1.0, 1.3};
929 static Double_t diffGridlines[] = {0.0};
930 static Double_t signGridlines[] = {1.0, 0.0, -1.0};
931
932 // Determine the divide mode and create the lower graph accordingly
933 // Pass divide options given in constructor
935 // use TGraphAsymmErrors Divide method to create
936
937 SetGridlines(divideGridlines, 3);
938
939 TH1 *tmpH1 = static_cast<TH1 *>(fH1->Clone());
940 TH1 *tmpH2 = static_cast<TH1 *>(fH2->Clone());
941
942 tmpH1->Scale(fC1);
943 tmpH2->Scale(fC2);
944
945 TGraphAsymmErrors *ratioGraph = new TGraphAsymmErrors();
946 ratioGraph->Divide(tmpH1, tmpH2, fOption.Data());
947 fRatioGraph = ratioGraph;
948
949 delete tmpH1;
950 delete tmpH2;
951
952 } else if (fMode == CalculationMode::kDifference) {
953 SetGridlines(diffGridlines, 3);
954
955 TH1 *tmpHist = static_cast<TH1 *>(fH1->Clone());
956
957 tmpHist->Reset();
958
959 tmpHist->Add(fH1, fH2, fC1, -1*fC2);
960 fRatioGraph = new TGraphErrors(tmpHist);
961
962 delete tmpHist;
964
965 SetGridlines(signGridlines, 3);
966
968 Int_t ipoint = 0;
969
970 for (Int_t i = 0; i <= fH1->GetNbinsX(); ++i) {
971 Double_t val = fH1->GetBinContent(i);
972 Double_t val2 = fH2->GetBinContent(i);
973 Double_t error = 0.;
974
976
977 Double_t errUp = fH1->GetBinErrorUp(i);
978 Double_t errLow = fH1->GetBinErrorLow(i);
979
980 if (val - val2 > 0) {
981 // h1 > h2
982 error = errLow;
983 } else {
984 // h1 < h2
985 error = errUp;
986 }
987
989 error = fH1->GetBinError(i);
990 } else {
991 Warning(thisMethod, "error mode is invalid");
992 }
993
994 if (error != 0.) {
995
996 Double_t res = (val - val2) / error;
997
998 ((TGraphAsymmErrors*)fRatioGraph)->SetPoint(ipoint, fH1->GetBinCenter(i), res);
999 ((TGraphAsymmErrors*)fRatioGraph)->SetPointError(ipoint, fH1->GetBinWidth(i)/2., fH1->GetBinWidth(i)/2., 0.5, 0.5);
1000
1001 ++ipoint;
1002
1003 }
1004 }
1005
1006 } else if (fMode == CalculationMode::kFitResidual) {
1007
1008 SetGridlines(signGridlines, 3);
1009
1010 TF1 *func = dynamic_cast<TF1*>(fH1->GetListOfFunctions()->At(0));
1011
1012 if (!func) {
1013 // this is checked in constructor and should thus not occur
1014 Error(thisMethod, "h1 does not have a fit function");
1015 return 0;
1016 }
1017
1019 Int_t ipoint = 0;
1020
1021 std::vector<double> ci1, ci2;
1022
1023 Int_t nbinsx = fH1->GetNbinsX();
1024
1025 std::vector<Double_t> x_arr(nbinsx, 0.), ci_arr1(nbinsx, 0.), ci_arr2(nbinsx, 0);
1026 for (Int_t i = 0; i < nbinsx; ++i)
1027 x_arr[i] = fH1->GetBinCenter(i+1);
1028
1029 Double_t cl1 = fCl1, cl2 = fCl2;
1030
1031 if (fFitResult) {
1032 // use this to get conf int
1033
1034 fFitResult->GetConfidenceIntervals(nbinsx, 1, 1, x_arr.data(), ci_arr1.data(), cl1);
1035 for (Int_t i = 1; i <= nbinsx; ++i)
1036 ci1.push_back(ci_arr1[i - 1]);
1037
1038 fFitResult->GetConfidenceIntervals(nbinsx, 1, 1, x_arr.data(), ci_arr2.data(), cl2);
1039 for (Int_t i = 1; i <= nbinsx; ++i)
1040 ci2.push_back(ci_arr2[i - 1]);
1041 } else {
1042 TVirtualFitter::GetFitter()->GetConfidenceIntervals(nbinsx, 1, x_arr.data(), ci_arr1.data(), cl1);
1043 for (Int_t i = 1; i <= nbinsx; ++i)
1044 ci1.push_back(ci_arr1[i - 1]);
1045 TVirtualFitter::GetFitter()->GetConfidenceIntervals(nbinsx, 1, x_arr.data(), ci_arr2.data(), cl2);
1046 for (Int_t i = 1; i <= nbinsx; ++i)
1047 ci2.push_back(ci_arr2[i - 1]);
1048 }
1049
1050 for (Int_t i = 1; i <= nbinsx; ++i) {
1051 Double_t val = fH1->GetBinContent(i);
1052 Double_t x = fH1->GetBinCenter(i);
1053 Double_t error = 0.;
1054
1056
1057 Double_t errUp = fH1->GetBinErrorUp(i);
1058 Double_t errLow = fH1->GetBinErrorLow(i);
1059
1060 if (val - func->Eval(fH1->GetBinCenter(i)) > 0) {
1061 // h1 > fit
1062 error = errLow;
1063 } else {
1064 // h1 < fit
1065 error = errUp;
1066 }
1067
1068 } else if (fErrorMode == ErrorMode::kErrorSymmetric) {
1069
1070 error = fH1->GetBinError(i);
1071
1072 } else if (fErrorMode == ErrorMode::kErrorFunc) {
1073
1074 error = sqrt(func->Eval(x));
1075
1076 } else {
1077
1078 Warning(thisMethod, "error mode is invalid");
1079
1080 }
1081
1082 if (error != 0.) {
1083
1084 Double_t res = (fH1->GetBinContent(i) - func->Eval(fH1->GetBinCenter(i))) / error;
1085
1086 ((TGraphAsymmErrors*)fRatioGraph)->SetPoint(ipoint, fH1->GetBinCenter(i), res);
1087 ((TGraphAsymmErrors*)fRatioGraph)->SetPointError(ipoint, fH1->GetBinWidth(i)/2., fH1->GetBinWidth(i)/2., 0.5, 0.5);
1088
1089 fConfidenceInterval1->SetPoint(ipoint, x, 0);
1090 fConfidenceInterval1->SetPointError(ipoint, x, i <= (Int_t)ci1.size() ? ci1[i-1] / error : 0);
1091 fConfidenceInterval2->SetPoint(ipoint, x, 0);
1092 fConfidenceInterval2->SetPointError(ipoint, x, i <= (Int_t)ci2.size() ? ci2[i-1] / error : 0);
1093
1094 ++ipoint;
1095
1096 }
1097 }
1098 } else if (fMode == CalculationMode::kDivideHist){
1099 SetGridlines(divideGridlines, 3);
1100
1101 // Use TH1's Divide method
1102 TH1 *tmpHist = static_cast<TH1 *>(fH1->Clone());
1103 tmpHist->Reset();
1104
1105 tmpHist->Divide(fH1, fH2, fC1, fC2, fOption.Data());
1106 fRatioGraph = new TGraphErrors(tmpHist);
1107
1108 delete tmpHist;
1109 } else {
1110 // this should not occur
1111 Error(thisMethod, "Invalid fMode value");
1112 return 0;
1113 }
1114
1115 // need to set back to "" since recreation. we don't ever want
1116 // title on lower graph
1117
1118 if (!fRatioGraph) {
1119 Error(thisMethod, "Error creating lower graph");
1120 return 0;
1121 }
1122
1123 fRatioGraph->SetTitle("");
1126
1127 return 1;
1128}
1129
1130////////////////////////////////////////////////////////////////////////////////
1131/// Creates the TGaxis objects that are used for consistent display of the axes.
1132
1134{
1135 Bool_t mirroredAxes = fParentPad->GetFrameFillStyle() == 0;
1136 Bool_t axistop = fParentPad->GetTickx() == 1 || mirroredAxes;
1137 Bool_t axisright = fParentPad->GetTicky() == 1 || mirroredAxes;
1138
1141
1142 Double_t upYFirst = fUpperPad->GetUymin();
1143 Double_t upYLast = fUpperPad->GetUymax();
1144 Double_t lowYFirst = fLowerPad->GetUymin();
1145 Double_t lowYLast = fLowerPad->GetUymax();
1146
1147 if (!fUpperGXaxis) {
1148 fUpperGXaxis = new TGaxis(0, 0, 1, 1, 0, 1, 510, "+U");
1150 }
1151
1152 if (!fUpperGYaxis) {
1153 fUpperGYaxis = new TGaxis(0, 0, 1, 1, upYFirst, upYLast, 510, "S");
1155 }
1156
1157 if (!fLowerGXaxis) {
1158 fLowerGXaxis = new TGaxis(0, 0, 1, 1, first, last, 510, "+S");
1160 }
1161
1162 if (!fLowerGYaxis) {
1163 fLowerGYaxis = new TGaxis(0, 0, 1, 1, lowYFirst, lowYLast, 510, "-S");
1165 }
1166
1167 // Create the axes on the other sides of the graphs
1168 // This is steered by an option on the containing pad or self
1169
1170 if (!fUpperGXaxisMirror && axistop) {
1171 fUpperGXaxisMirror = static_cast<TGaxis *>(fUpperGXaxis->Clone());
1173 }
1174
1175 if (!fLowerGXaxisMirror && axistop) {
1176 fLowerGXaxisMirror = static_cast<TGaxis *>(fLowerGXaxis->Clone());
1178 }
1179
1180 if (!fUpperGYaxisMirror && axisright) {
1181 fUpperGYaxisMirror = static_cast<TGaxis *>(fUpperGYaxis->Clone());
1183 }
1184
1185 if (!fLowerGYaxisMirror && axisright) {
1186 fLowerGYaxisMirror = static_cast<TGaxis *>(fLowerGYaxis->Clone());
1188 }
1189
1191}
1192
1193
1194////////////////////////////////////////////////////////////////////////////////
1195/// Update TGaxis attributes
1196
1198{
1199 // this is for errors
1200 static const char *thisMethod = "UpdateVisualAxes";
1201
1202 // figure out where the axis has to go.
1203 // Implicit assumption is, that the top pad spans the full other pads
1208
1209 Double_t lowTM = fLowerPad->GetTopMargin();
1211 Double_t lowLM = fLowerPad->GetLeftMargin();
1213
1216
1217 Double_t upYFirst = fUpperPad->GetUymin();
1218 Double_t upYLast = fUpperPad->GetUymax();
1219 Double_t lowYFirst = fLowerPad->GetUymin();
1220 Double_t lowYLast = fLowerPad->GetUymax();
1221
1223
1224 Bool_t logx = fUpperPad->GetLogx() || fLowerPad->GetLogx();
1225 Bool_t uplogy = fUpperPad->GetLogy();
1226 Bool_t lowlogy = fLowerPad->GetLogy();
1227
1228 if (uplogy) {
1229
1230 upYFirst = TMath::Power(10, upYFirst);
1231 upYLast = TMath::Power(10, upYLast);
1232
1233 if (upYFirst <= 0 || upYLast <= 0) {
1234 Error(thisMethod, "Cannot set upper Y axis to log scale");
1235 }
1236 }
1237
1238 if (lowlogy) {
1239 lowYFirst = TMath::Power(10, lowYFirst);
1240 lowYLast = TMath::Power(10, lowYLast);
1241
1242 if (lowYFirst <= 0 || lowYLast <= 0) {
1243 Error(thisMethod, "Cannot set lower Y axis to log scale");
1244 }
1245
1246 }
1247
1248 // this is different than in y, y already has pad coords converted, x not...
1249 if (logx) {
1250 if (first <= 0 || last <= 0) {
1251 Error(thisMethod, "Cannot set X axis to log scale");
1252 }
1253 }
1254
1255 // determine axes options to create log axes if needed
1256 TString xopt = logx ? "G" : "";
1257 TString upyopt = uplogy ? "G" : "";
1258 TString lowyopt = lowlogy ? "G" : "";
1259
1260 // import infos from TAxis
1265
1266 // lower x axis needs to get title from upper x
1268
1269 // (re)set all the axes properties to what we want them
1271
1272 fUpperGXaxis->SetX1(upLM);
1273 fUpperGXaxis->SetX2(1-upRM);
1274 fUpperGXaxis->SetY1(upBM*(1-sf)+sf);
1275 fUpperGXaxis->SetY2(upBM*(1-sf)+sf);
1276 fUpperGXaxis->SetWmin(first);
1277 fUpperGXaxis->SetWmax(last);
1278
1279 fUpperGYaxis->SetX1(upLM);
1280 fUpperGYaxis->SetX2(upLM);
1281 fUpperGYaxis->SetY1(upBM*(1-sf)+sf);
1282 fUpperGYaxis->SetY2( (1-upTM)*(1-sf)+sf );
1283 fUpperGYaxis->SetWmin(upYFirst);
1284 fUpperGYaxis->SetWmax(upYLast);
1285
1286 fLowerGXaxis->SetX1(lowLM);
1287 fLowerGXaxis->SetX2(1-lowRM);
1288 fLowerGXaxis->SetY1(lowBM*sf);
1289 fLowerGXaxis->SetY2(lowBM*sf);
1290 fLowerGXaxis->SetWmin(first);
1291 fLowerGXaxis->SetWmax(last);
1292
1293 fLowerGYaxis->SetX1(lowLM);
1294 fLowerGYaxis->SetX2(lowLM);
1295 fLowerGYaxis->SetY1(lowBM*sf);
1296 fLowerGYaxis->SetY2((1-lowTM)*sf);
1297 fLowerGYaxis->SetWmin(lowYFirst);
1298 fLowerGYaxis->SetWmax(lowYLast);
1299
1304
1305 fUpperGXaxis->SetOption("+U"+xopt);
1306 fUpperGYaxis->SetOption("S"+upyopt);
1307 fLowerGXaxis->SetOption("+S"+xopt);
1308 fLowerGYaxis->SetOption("-S"+lowyopt);
1309
1310 // normalize the tick sizes. y axis ticks should be consistent
1311 // even if their length is different
1312 Double_t ratio = ( (upBM-(1-upTM))*(1-sf) ) / ( (lowBM-(1-lowTM))*sf );
1314 Double_t ticksize = fUpperGYaxis->GetTickSize()*ratio;
1315 fLowerGYaxis->SetTickSize(ticksize);
1316
1318
1319 fUpperGYaxis->ChangeLabel(1, -1, 0);
1320
1322
1323 fLowerGYaxis->ChangeLabel(-1, -1, 0);
1324
1325 } else {
1326 if (GetSeparationMargin() < 0.025) {
1327
1330 fUpperGYaxis->ChangeLabel(1, -1, 0);
1332 fLowerGYaxis->ChangeLabel(-1, -1, 0);
1333 }
1334 }
1335
1336 } else {
1337 // reset
1342 }
1343
1344 }
1345 }
1346
1347 // move them about and set required positions
1348 if (fUpperGXaxisMirror) {
1352 fUpperGXaxisMirror->SetX2(1-upRM);
1353 fUpperGXaxisMirror->SetY1((1-upTM)*(1-sf)+sf);
1354 fUpperGXaxisMirror->SetY2((1-upTM)*(1-sf)+sf);
1357 fUpperGXaxisMirror->SetOption("-S"+xopt);
1360 }
1361
1362 if (fUpperGYaxisMirror) {
1365 fUpperGYaxisMirror->SetX1(1-upRM);
1366 fUpperGYaxisMirror->SetX2(1-upRM);
1367 fUpperGYaxisMirror->SetY1(upBM*(1-sf)+sf);
1368 fUpperGYaxisMirror->SetY2( (1-upTM)*(1-sf)+sf );
1369 fUpperGYaxisMirror->SetWmin(upYFirst);
1370 fUpperGYaxisMirror->SetWmax(upYLast);
1371 fUpperGYaxisMirror->SetOption("+S"+upyopt);
1374 }
1375
1376 if (fLowerGXaxisMirror) {
1379 fLowerGXaxisMirror->SetX1(lowLM);
1380 fLowerGXaxisMirror->SetX2(1-lowRM);
1381 fLowerGXaxisMirror->SetY1((1-lowTM)*sf);
1382 fLowerGXaxisMirror->SetY2((1-lowTM)*sf);
1385 fLowerGXaxisMirror->SetOption("-S"+xopt);
1388 }
1389
1390 if (fLowerGYaxisMirror) {
1393 fLowerGYaxisMirror->SetX1(1-lowRM);
1394 fLowerGYaxisMirror->SetX2(1-lowRM);
1395 fLowerGYaxisMirror->SetY1(lowBM*sf);
1396 fLowerGYaxisMirror->SetY2((1-lowTM)*sf);
1397 fLowerGYaxisMirror->SetWmin(lowYFirst);
1398 fLowerGYaxisMirror->SetWmax(lowYLast);
1399 fLowerGYaxisMirror->SetOption("+S"+lowyopt);
1403 }
1404
1405}
1406
1407////////////////////////////////////////////////////////////////////////////////
1408/// Sets the margins of all the pads to the value specified in class members.
1409/// This one is called whenever those are changed, e.g. in setters
1410
1412{
1421}
1422
1423////////////////////////////////////////////////////////////////////////////////
1424/// Figures out which pad margin has deviated from the stored ones,
1425/// to figure out what the new nominal is and set the other pad to it
1426/// subsequently.
1427
1429{
1430 Bool_t horizontalChanged = kFALSE, verticalChanged = kFALSE;
1431
1434 horizontalChanged = kTRUE;
1435 } else if (fLowerPad->GetLeftMargin() != fLeftMargin) {
1437 horizontalChanged = kTRUE;
1438 }
1439
1442 horizontalChanged = kTRUE;
1443 } else if (fLowerPad->GetRightMargin() != fRightMargin) {
1445 horizontalChanged = kTRUE;
1446 }
1447
1448
1451 verticalChanged = kTRUE;
1452 }
1453
1456 verticalChanged = kTRUE;
1457 }
1458
1461 verticalChanged = kTRUE;
1462 }
1463
1466 }
1467
1468 // only reset margins, if any of the margins changed
1469 if (horizontalChanged || verticalChanged)
1470 SetPadMargins();
1471
1472 return horizontalChanged || verticalChanged;
1473}
1474
1475////////////////////////////////////////////////////////////////////////////////
1476/// Slot that receives the RangeAxisChanged signal from any of the pads and
1477/// reacts correspondingly.
1478
1480{
1481 // Only run this concurrently once, in case it's called async
1482 if (fIsUpdating)
1483 return;
1484
1486
1487 // find out if logx has changed
1488 if (fParentPad->GetLogx()) {
1489 if (!fUpperPad->GetLogx() || !fLowerPad->GetLogx()) {
1491 }
1492 } else {
1493 if (fUpperPad->GetLogx() || fLowerPad->GetLogx()) {
1495 }
1496 }
1497
1498 // set log to pads
1499 if (fUpperPad->GetLogx() != fParentPad->GetLogx())
1501 if (fLowerPad->GetLogx() != fParentPad->GetLogx())
1503
1504 // get axis ranges for upper and lower
1505 TAxis *uprefx = GetUpperRefXaxis();
1506 Double_t upFirst = uprefx->GetBinLowEdge(uprefx->GetFirst());
1507 Double_t upLast = uprefx->GetBinUpEdge(uprefx->GetLast());
1508
1509 TAxis *lowrefx = GetLowerRefXaxis();
1510 Double_t lowFirst = lowrefx->GetBinLowEdge(lowrefx->GetFirst());
1511 Double_t lowLast = lowrefx->GetBinUpEdge(lowrefx->GetLast());
1512
1515
1516 Bool_t upChanged = kFALSE;
1517 Bool_t lowChanged = kFALSE;
1518
1519 // determine which one has changed
1520 if (upFirst != globFirst || upLast != globLast) {
1521 fSharedXAxis->SetRangeUser(upFirst, upLast);
1522 upChanged = kTRUE;
1523 } else if (lowFirst != globFirst || lowLast != globLast) {
1524 fSharedXAxis->SetRangeUser(lowFirst, lowLast);
1525 lowChanged = kTRUE;
1526 }
1527
1528 if (upChanged || lowChanged)
1530
1531 // sync the margins in case the user has dragged one of them
1532 Bool_t marginsChanged = SyncPadMargins();
1533
1534 if (upChanged || lowChanged || marginsChanged) {
1537 fTopPad->Modified();
1539 }
1540
1544}
1545
1546////////////////////////////////////////////////////////////////////////////////
1547/// Slot for the UnZoomed signal that was introduced to TPad.
1548/// Unzoom both pads
1549
1551{
1552 if (fIsUpdating)
1553 return;
1554
1556
1557 // this is what resets the range
1558 fSharedXAxis->SetRange(0, 0);
1560
1561 // Flushing
1564 fTopPad->Modified();
1566
1568}
1569
1570////////////////////////////////////////////////////////////////////////////////
1571/// Slot that handles common resizing of upper and lower pad.
1572
1574{
1575 if (fIsUpdating)
1576 return;
1577
1579
1580 Float_t upylow = fUpperPad->GetYlowNDC();
1581 Float_t lowylow = fLowerPad->GetYlowNDC();
1582 Float_t lowh = fLowerPad->GetHNDC();
1583 Float_t lowyup = lowylow + lowh;
1584
1585 Bool_t changed = kFALSE;
1586
1587 if (upylow != fSplitFraction) {
1588 // up changed
1589 SetSplitFraction(upylow);
1590 changed = kTRUE;
1591 } else if (lowyup != fSplitFraction) {
1592 // low changed
1593 SetSplitFraction(lowyup);
1594 changed = kTRUE;
1595 }
1596
1597 if (changed)
1599
1601}
1602
1603////////////////////////////////////////////////////////////////////////////////
1604/// Set the fraction of the parent pad, at which the to sub pads should meet
1605
1607{
1608 if (!fParentPad) {
1609 Warning("SetSplitFraction", "Can only be used after TRatioPlot has been drawn.");
1610 return;
1611 }
1612
1613 if ((sf < 0.0001) || (sf > 0.9999)) {
1614 Warning("SetSplitFraction", "Value %f is out of allowed range", sf);
1615 return;
1616 }
1617
1618 fSplitFraction = sf;
1619 double pm = fInsetWidth;
1620 double width = fParentPad->GetWNDC();
1621 double height = fParentPad->GetHNDC();
1622 double f = height/width;
1623
1624 fUpperPad->SetPad(pm*f, fSplitFraction, 1.-pm*f, 1.-pm);
1625 fLowerPad->SetPad(pm*f, pm, 1.-pm*f, fSplitFraction);
1626}
1627
1628////////////////////////////////////////////////////////////////////////////////
1629/// Set the inset on the outer sides of all the pads. It's used to make the outer
1630/// pad draggable.
1631
1633{
1634 if (!fParentPad) {
1635 Warning("SetInsetWidth", "Can only be used after TRatioPlot has been drawn.");
1636 return;
1637 }
1638
1641
1642 double pm = fInsetWidth;
1643 double w = fParentPad->GetWNDC();
1644 double h = fParentPad->GetHNDC();
1645 double f = h/w;
1646 fTopPad->SetPad(pm*f, pm, 1-pm*f, 1-pm);
1647}
1648
1649////////////////////////////////////////////////////////////////////////////////
1650/// Sets the confidence levels used to calculate the bands in the fit residual
1651/// case. Defaults to 1 and 2 sigma.
1652
1654{
1655 fCl1 = c1;
1656 fCl2 = c2;
1657 if (!BuildLowerPlot()) return;
1658}
1659
1660////////////////////////////////////////////////////////////////////////////////
1661/// Set where horizontal, dashed lines are drawn on the lower pad.
1662/// Can be used to override existing default lines (or disable them).
1663///
1664/// \param gridlines Vector of y positions for the dashes lines
1665///
1666/// Begin_Macro(source)
1667/// ../../../tutorials/hist/ratioplot4.C
1668/// End_Macro
1669
1670void TRatioPlot::SetGridlines(std::vector<double> gridlines)
1671{
1672 fGridlinePositions = gridlines;
1673}
1674
1675////////////////////////////////////////////////////////////////////////////////
1676/// Set where horizontal, dashed lines are drawn on the lower pad.
1677/// Can be used to override existing default lines (or disable them).
1678///
1679/// \param gridlines Double_t array of y positions for the dashed lines
1680/// \param numGridlines Length of gridlines
1681
1682void TRatioPlot::SetGridlines(Double_t *gridlines, Int_t numGridlines)
1683{
1684 fGridlinePositions.clear();
1685
1686 for (Int_t i = 0; i < numGridlines; ++i)
1687 fGridlinePositions.emplace_back(gridlines[i]);
1688}
1689
1690////////////////////////////////////////////////////////////////////////////////
1691/// Set the confidence interval colors.
1692///
1693/// \param ci1 Color of the 1 sigma band
1694/// \param ci2 Color of the 2 sigma band
1695/// Sets the color of the 1 and 2 sigma bands in the fit residual case.
1696/// Begin_Macro(source)
1697/// ../../../tutorials/hist/ratioplot5.C
1698/// End_Macro
1699
1701{
1702 fCi1Color = ci1;
1703 fCi2Color = ci2;
1704}
1705
1706////////////////////////////////////////////////////////////////////////////////
1707/// Internal method to import TAxis attributes to a TGaxis. Copied from
1708/// `TGaxis::ImportAxisAttributes`
1709
1711{
1712 gaxis->SetLineColor(axis->GetAxisColor());
1713 gaxis->SetTextColor(axis->GetTitleColor());
1714 gaxis->SetTextFont(axis->GetTitleFont());
1715 gaxis->SetLabelColor(axis->GetLabelColor());
1716 gaxis->SetLabelFont(axis->GetLabelFont());
1717 gaxis->SetLabelSize(axis->GetLabelSize());
1718 gaxis->SetLabelOffset(axis->GetLabelOffset());
1719 gaxis->SetTickSize(axis->GetTickLength());
1720 gaxis->SetTitle(axis->GetTitle());
1721 gaxis->SetTitleOffset(axis->GetTitleOffset());
1722 gaxis->SetTitleSize(axis->GetTitleSize());
1730 if (axis->GetDecimals()) gaxis->SetBit(TAxis::kDecimals); //the bit is in TAxis::fAxis2
1731 gaxis->SetTimeFormat(axis->GetTimeFormat());
1732}
#define f(i)
Definition RSha256.hxx:104
#define h(i)
Definition RSha256.hxx:106
short Color_t
Definition RtypesCore.h:85
float Float_t
Definition RtypesCore.h:57
constexpr Bool_t kFALSE
Definition RtypesCore.h:94
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
const char Option_t
Definition RtypesCore.h:66
Option_t Option_t option
Option_t Option_t width
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
R__EXTERN TStyle * gStyle
Definition TStyle.h:436
#define gPad
void GetConfidenceIntervals(unsigned int n, unsigned int stride1, unsigned int stride2, const double *x, double *ci, double cl=0.95, bool norm=false) const
get confidence intervals for an array of n points x.
virtual Color_t GetTitleColor() const
Definition TAttAxis.h:46
virtual Color_t GetLabelColor() const
Definition TAttAxis.h:38
virtual Int_t GetNdivisions() const
Definition TAttAxis.h:36
virtual Color_t GetAxisColor() const
Definition TAttAxis.h:37
virtual Style_t GetTitleFont() const
Definition TAttAxis.h:47
virtual Float_t GetLabelOffset() const
Definition TAttAxis.h:40
virtual Style_t GetLabelFont() const
Definition TAttAxis.h:39
virtual Float_t GetTitleSize() const
Definition TAttAxis.h:44
virtual Float_t GetLabelSize() const
Definition TAttAxis.h:41
virtual Float_t GetTickLength() const
Definition TAttAxis.h:45
virtual Float_t GetTitleOffset() const
Definition TAttAxis.h:43
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition TAttFill.h:37
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
Definition TAttLine.h:42
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition TAttLine.h:40
virtual void SetBottomMargin(Float_t bottommargin)
Set Pad bottom margin in fraction of the pad height.
Definition TAttPad.cxx:99
virtual void SetLeftMargin(Float_t leftmargin)
Set Pad left margin in fraction of the pad width.
Definition TAttPad.cxx:109
Style_t GetFrameFillStyle() const
Definition TAttPad.h:55
Float_t GetLeftMargin() const
Definition TAttPad.h:44
Float_t GetBottomMargin() const
Definition TAttPad.h:43
virtual void SetRightMargin(Float_t rightmargin)
Set Pad right margin in fraction of the pad width.
Definition TAttPad.cxx:119
Float_t GetRightMargin() const
Definition TAttPad.h:45
virtual void SetTopMargin(Float_t topmargin)
Set Pad top margin in fraction of the pad height.
Definition TAttPad.cxx:129
Float_t GetTopMargin() const
Definition TAttPad.h:46
virtual void SetTextColor(Color_t tcolor=1)
Set the text color.
Definition TAttText.h:44
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
Definition TAttText.h:46
Class to manage histogram axis.
Definition TAxis.h:32
const char * GetTitle() const override
Returns title of object.
Definition TAxis.h:137
@ kTickMinus
Definition TAxis.h:65
@ kCenterTitle
Definition TAxis.h:67
@ kRotateTitle
Definition TAxis.h:69
@ kNoExponent
Definition TAxis.h:71
@ kMoreLogLabels
Definition TAxis.h:77
@ kTickPlus
Definition TAxis.h:64
@ kDecimals
Definition TAxis.h:63
@ kCenterLabels
Bit 13 is used by TObject.
Definition TAxis.h:68
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
Definition TAxis.cxx:513
Bool_t GetDecimals() const
Definition TAxis.h:122
Int_t GetLast() const
Return last bin on the axis i.e.
Definition TAxis.cxx:464
virtual void SetLimits(Double_t xmin, Double_t xmax)
Definition TAxis.h:166
virtual void SetRangeUser(Double_t ufirst, Double_t ulast)
Set the viewing range for the axis from ufirst to ulast (in user coordinates, that is,...
Definition TAxis.cxx:1081
virtual const char * GetTimeFormat() const
Definition TAxis.h:134
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
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
Definition TAxis.cxx:523
Int_t GetFirst() const
Return first bin on the axis i.e.
Definition TAxis.cxx:453
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
1-Dim function class
Definition TF1.h:233
static TClass * Class()
void Draw(Option_t *option="") override
Draw this function with its current attributes.
Definition TF1.cxx:1333
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
Evaluate this function.
Definition TF1.cxx:1439
Extends the ROOT::Fit::Result class with a TNamed inheritance providing easy possibility for I/O.
Definition TFitResult.h:34
The axis painter class.
Definition TGaxis.h:24
void SetTimeFormat(const char *tformat)
Change the format used for time plotting.
Definition TGaxis.cxx:2969
void SetTitleOffset(Float_t titleoffset=1)
Definition TGaxis.h:128
void SetLabelFont(Int_t labelfont)
Definition TGaxis.h:105
void SetTitleSize(Float_t titlesize)
Definition TGaxis.h:129
virtual void SetTitle(const char *title="")
Change the title of the axis.
Definition TGaxis.cxx:2942
void SetLabelOffset(Float_t labeloffset)
Definition TGaxis.h:106
const char * GetTitle() const override
Returns title of object.
Definition TGaxis.h:86
virtual void SetNdivisions(Int_t ndiv)
Definition TGaxis.h:118
void SetWmax(Double_t wmax)
Definition TGaxis.h:133
void SetLabelColor(Int_t labelcolor)
Definition TGaxis.h:104
void ChangeLabel(Int_t labNum=0, Double_t labAngle=-1., Double_t labSize=-1., Int_t labAlign=-1, Int_t labColor=-1, Int_t labFont=-1, const TString &labText="")
Define new text attributes for the label number "labNum".
Definition TGaxis.cxx:2734
Float_t GetTickSize() const
Definition TGaxis.h:91
void SetWmin(Double_t wmin)
Definition TGaxis.h:132
void SetTickSize(Float_t ticksize)
Definition TGaxis.h:122
void SetLabelSize(Float_t labelsize)
Definition TGaxis.h:107
void SetOption(Option_t *option="")
To set axis options.
Definition TGaxis.cxx:2934
TGraph with asymmetric error bars.
virtual void Divide(const TH1 *pass, const TH1 *total, Option_t *opt="cp")
Fill this TGraphAsymmErrors by dividing two 1-dimensional histograms pass/total.
A TGraphErrors is a TGraph with error bars.
virtual void SetPointError(Double_t ex, Double_t ey)
Set ex and ey values for point pointed by the mouse.
A TGraph is an object made of two arrays X and Y with npoints each.
Definition TGraph.h:41
static TClass * Class()
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
Definition TGraph.cxx:2347
void Draw(Option_t *chopt="") override
Draw this graph with its current attributes.
Definition TGraph.cxx:833
TAxis * GetXaxis() const
Get x axis of the graph.
Definition TGraph.cxx:1568
TAxis * GetYaxis() const
Get y axis of the graph.
Definition TGraph.cxx:1577
void SetTitle(const char *title="") override
Change (i.e.
Definition TGraph.cxx:2402
TH1 is the base class of all histogram classes in ROOT.
Definition TH1.h:59
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
Definition TH1.cxx:9174
static TClass * Class()
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.
Definition TH1.cxx:9096
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
Definition TH1.cxx:7132
TAxis * GetXaxis()
Definition TH1.h:325
virtual Int_t GetNbinsX() const
Definition TH1.h:298
virtual Bool_t Add(TF1 *h1, Double_t c1=1, Option_t *option="")
Performs the operation: this = this + c1*f1 if errors are defined (see TH1::Sumw2),...
Definition TH1.cxx:828
TAxis * GetYaxis()
Definition TH1.h:326
virtual Double_t GetBinErrorLow(Int_t bin) const
Return lower error associated to bin number bin.
Definition TH1.cxx:9112
void Draw(Option_t *option="") override
Draw this histogram with options.
Definition TH1.cxx:3068
TList * GetListOfFunctions() const
Definition TH1.h:245
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Definition TH1.cxx:5090
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width for 1D histogram.
Definition TH1.cxx:9196
virtual Double_t GetBinErrorUp(Int_t bin) const
Return upper error associated to bin number bin.
Definition TH1.cxx:9143
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
Definition TH1.cxx:6633
virtual Int_t GetSumw2N() const
Definition TH1.h:316
TObject * Clone(const char *newname="") const override
Make a complete copy of the underlying object.
Definition TH1.cxx:2754
virtual Bool_t Divide(TF1 *f1, Double_t c1=1)
Performs the operation: this = this/(c1*f1) if errors are defined (see TH1::Sumw2),...
Definition TH1.cxx:2842
The Histogram stack class.
Definition THStack.h:40
TList * GetHists() const
Definition THStack.h:72
static TClass * Class()
Use the TLine constructor to create a simple line.
Definition TLine.h:22
virtual void SetY2(Double_t y2)
Definition TLine.h:68
virtual void SetX2(Double_t x2)
Definition TLine.h:66
virtual void SetX1(Double_t x1)
Definition TLine.h:65
virtual void SetY1(Double_t y1)
Definition TLine.h:67
A doubly linked list.
Definition TList.h:38
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
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
Definition TNamed.cxx:74
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 const char * ClassName() const
Returns name of class to which the object belongs.
Definition TObject.cxx:225
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
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:798
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition TObject.cxx:542
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1005
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
Definition TObject.cxx:292
@ kCannotPick
if object in a pad cannot be picked
Definition TObject.h:67
The most important graphics class in the ROOT system.
Definition TPad.h:28
void SetGridx(Int_t value=1) override
Definition TPad.h:336
Double_t GetUymax() const override
Returns the maximum y-coordinate value visible on the pad. If log axis the returned value is in decad...
Definition TPad.h:234
Double_t GetUymin() const override
Returns the minimum y-coordinate value visible on the pad. If log axis the returned value is in decad...
Definition TPad.h:230
TList * GetListOfPrimitives() const override
Definition TPad.h:245
void SetFillStyle(Style_t fstyle) override
Override TAttFill::FillStyle for TPad because we want to handle style=0 as style 4000.
Definition TPad.cxx:6074
void SetPad(const char *name, const char *title, Double_t xlow, Double_t ylow, Double_t xup, Double_t yup, Color_t color=35, Short_t bordersize=5, Short_t bordermode=-1) override
Set all pad parameters.
Definition TPad.cxx:6171
void SetLogy(Int_t value=1) override
Set Lin/Log scale for Y.
Definition TPad.cxx:6100
void Modified(Bool_t flag=true) override
Mark pad modified Will be repainted when TCanvas::Update() will be called next time.
Definition TPad.cxx:7388
void Add(TObject *obj, Option_t *opt="", Bool_t modified=kTRUE) override
Add an object to list of primitives with speicified draw option When.
Definition TPad.cxx:418
void SetGridy(Int_t value=1) override
Definition TPad.h:337
Double_t GetYlowNDC() const override
Definition TPad.h:213
TVirtualPad * cd(Int_t subpadnumber=0) override
Set Current pad.
Definition TPad.cxx:693
Int_t GetLogy() const override
Definition TPad.h:257
void Draw(Option_t *option="") override
Draw Pad in Current pad (re-parent pad if necessary).
Definition TPad.cxx:1364
void SetLogx(Int_t value=1) override
Set Lin/Log scale for X.
Definition TPad.cxx:6086
Int_t GetLogx() const override
Definition TPad.h:256
Double_t GetHNDC() const override
Get height of pad along Y in Normalized Coordinates (NDC)
Definition TPad.h:217
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
Non-static method is used to connect from the signal of this object to the receiver slot.
Definition TQObject.cxx:869
virtual Bool_t HasConnection(const char *signal_name) const
Return true if there is any object connected to this signal.
Definition TQObject.cxx:527
Class for displaying ratios, differences and fit residuals.
Definition TRatioPlot.h:43
void SubPadResized()
Slot that handles common resizing of upper and lower pad.
@ kForceHideUp
Always hide the first label of the upper y axis.
Definition TRatioPlot.h:67
@ kHideUp
Hide the first label of the upper y axis when there is low space.
Definition TRatioPlot.h:64
@ kNoHide
Do not hide labels when there is low space.
Definition TRatioPlot.h:66
@ kHideLow
Hide the last label of the lower y axis when there is low space.
Definition TRatioPlot.h:65
@ kForceHideLow
Always hide the last label of the lower y axis.
Definition TRatioPlot.h:68
TGraphErrors * fConfidenceInterval2
Stores the graph for the 2 sigma band.
Definition TRatioPlot.h:96
TAxis * GetLowerRefXaxis() const
Gets the x axis of the lower ref graph.
Int_t fErrorMode
Stores the error mode, sym, asym or func.
Definition TRatioPlot.h:85
TAxis * GetLowerRefYaxis() const
Gets the y axis of the lower ref graph.
TGaxis * fUpperGXaxisMirror
Upper mirror of the x axis.
Definition TRatioPlot.h:115
TGaxis * fLowerGXaxisMirror
Lower mirror of the x axis.
Definition TRatioPlot.h:116
TAxis * GetUpperRefYaxis() const
Gets the y axis of the object returned by TRatioPlot::GetUpperRefObject.
Float_t fLowBottomMargin
Stores the bottom margin of the lower pad.
Definition TRatioPlot.h:133
void CreateGridlines()
Create a grid lines.
Int_t BuildLowerPlot()
Build the lower plot according to which constructor was called, and which options were passed.
void SetUpBottomMargin(Float_t margin)
Sets the bottom margin of the upper pad.
Float_t fUpBottomMargin
Stores the bottom margin of the upper pad.
Definition TRatioPlot.h:131
TH1 * fH1
Stores the primary histogram.
Definition TRatioPlot.h:79
void SetH2DrawOpt(Option_t *opt)
Sets the drawing option for h2.
TFitResult * fFitResult
Stores the explicit fit result given in the fit residual case. Can be 0.
Definition TRatioPlot.h:108
virtual Bool_t SyncPadMargins()
Figures out which pad margin has deviated from the stored ones, to figure out what the new nominal is...
virtual void UpdateVisualAxes()
Update TGaxis attributes.
Color_t fCi1Color
Stores the color for the 1 sigma band.
Definition TRatioPlot.h:97
TGaxis * fUpperGYaxis
Upper graphical y axis.
Definition TRatioPlot.h:113
Double_t fC2
Stores the scale factor for h2.
Definition TRatioPlot.h:106
void UpdateGridlines()
Update positions of grid lines.
void SetLowBottomMargin(Float_t margin)
Sets the bottom margin of the lower pad.
void SetConfidenceIntervalColors(Color_t ci1=kYellow, Color_t ci2=kGreen)
Set the confidence interval colors.
Double_t fC1
Stores the scale factor for h1 (or THStack sum)
Definition TRatioPlot.h:105
virtual void CreateVisualAxes()
Creates the TGaxis objects that are used for consistent display of the axes.
Float_t fLowTopMargin
Stores the top margin of the lower pad.
Definition TRatioPlot.h:132
TString fH2DrawOpt
Stores draw option for h2 given in constructor.
Definition TRatioPlot.h:88
void SetUpTopMargin(Float_t margin)
Sets the top margin of the upper pad.
TGaxis * fLowerGXaxis
Lower graphical x axis.
Definition TRatioPlot.h:112
TRatioPlot()
TRatioPlot default constructor.
Bool_t fIsUpdating
! Keeps track of whether its currently updating to reject other calls until done
Definition TRatioPlot.h:140
void SetGraphDrawOpt(Option_t *opt)
Sets the drawing option for the lower graph.
Double_t fCl1
Stores the confidence level for the inner confidence interval band.
Definition TRatioPlot.h:102
@ kErrorAsymmetric
Use TH1::GetBinErrorUp and TH1::GetBinErrorLow for the error, depending on y values.
Definition TRatioPlot.h:59
@ kErrorFunc
Use the square root of the function value as the error.
Definition TRatioPlot.h:60
@ kErrorSymmetric
Use the regular TH1::GetBinError as the error.
Definition TRatioPlot.h:58
Float_t GetSeparationMargin() const
Return the separation margin value.
void ImportAxisAttributes(TGaxis *gaxis, TAxis *axis)
Internal method to import TAxis attributes to a TGaxis.
void SetFitDrawOpt(Option_t *opt)
Sets the drawing option for the fit in the fit residual case.
std::vector< TLine * > fGridlines
Keeps TLine objects for the gridlines.
Definition TRatioPlot.h:123
void SetPadMargins()
Sets the margins of all the pads to the value specified in class members.
TPad * fLowerPad
The pad which contains the calculated lower plot part.
Definition TRatioPlot.h:76
TAxis * fSharedXAxis
X axis that stores the range for both plots.
Definition TRatioPlot.h:110
TString fFitDrawOpt
Stores draw option for the fit function in the fit residual case.
Definition TRatioPlot.h:90
virtual void SetGridlines(Double_t *gridlines, Int_t numGridlines)
Set where horizontal, dashed lines are drawn on the lower pad.
TGaxis * fUpperGYaxisMirror
Upper mirror of the y axis.
Definition TRatioPlot.h:117
virtual void SetupPads()
Setup the pads.
TAxis * fUpYaxis
Clone of the upper y axis.
Definition TRatioPlot.h:120
TVirtualPad * fParentPad
Stores the pad the ratio plot was created in.
Definition TRatioPlot.h:74
Float_t fUpTopMargin
Stores the top margin of the upper pad.
Definition TRatioPlot.h:130
void SetH1DrawOpt(Option_t *opt)
Sets the drawing option for h1.
TGraph * fRatioGraph
Stores the lower plot's graph.
Definition TRatioPlot.h:94
virtual TGraph * GetLowerRefGraph() const
Returns the reference graph for the lower pad, which means the graph that is responsible for setting ...
virtual void ConnectPadsSignals()
Connect some signals from the pads to handle them Allows correctly work also after reading ratioplot ...
Int_t fMode
Stores which calculation is supposed to be performed as specified by user option.
Definition TRatioPlot.h:84
void SetSplitFraction(Float_t sf)
Set the fraction of the parent pad, at which the to sub pads should meet.
TObject * fHistDrawProxy
The object which is actually drawn, this might be TH1 or THStack.
Definition TRatioPlot.h:81
Float_t fRightMargin
Stores the common right margin of both pads.
Definition TRatioPlot.h:136
TGaxis * fLowerGYaxisMirror
Lower mirror of the y axis.
Definition TRatioPlot.h:118
Int_t fHideLabelMode
Stores which label to hide if the margin is to narrow, if at all.
Definition TRatioPlot.h:126
TPad * fTopPad
The Pad that drawn on top on the others to have consistent coordinates.
Definition TRatioPlot.h:77
void SetInsetWidth(Double_t width)
Set the inset on the outer sides of all the pads.
virtual void SyncAxesRanges()
Syncs the axes ranges from the shared ones to the actual ones.
void RangeAxisChanged()
Slot that receives the RangeAxisChanged signal from any of the pads and reacts correspondingly.
@ kDifference
Calculate the difference between the histograms.
Definition TRatioPlot.h:52
@ kDivideHist
Use TH1::Divide to create the ratio.
Definition TRatioPlot.h:50
@ kFitResidual
Calculate the fit residual between the histogram and a fit stored within it.
Definition TRatioPlot.h:53
@ kDifferenceSign
Calculate the difference divided by the error.
Definition TRatioPlot.h:54
@ kDivideGraph
Use TGraphAsymmErrors::Divide to create the ratio.
Definition TRatioPlot.h:51
void UnZoomed()
Slot for the UnZoomed signal that was introduced to TPad.
TH1 * fH2
Stores the secondary histogram, if there is one.
Definition TRatioPlot.h:80
Double_t fCl2
Stores the confidence level for the outer confidence interval band.
Definition TRatioPlot.h:103
TAxis * fLowYaxis
Clone of the lower y axis.
Definition TRatioPlot.h:121
TString fOption
Stores the option which is given in the constructor as a string.
Definition TRatioPlot.h:86
TPad * fUpperPad
The pad which contains the upper plot part.
Definition TRatioPlot.h:75
Bool_t fShowConfidenceIntervals
Stores whether to show the confidence interval bands. From Draw option.
Definition TRatioPlot.h:100
void SetLowTopMargin(Float_t margin)
Sets the top margin of the lower pad.
void SetSeparationMargin(Float_t)
Sets the margin that separates the two pads.
Bool_t fHistDrawProxyStack
If stack was assigned as proxy.
Definition TRatioPlot.h:82
Float_t fInsetWidth
Definition TRatioPlot.h:138
TAxis * GetXaxis() const
Definition TRatioPlot.h:186
void SetLeftMargin(Float_t margin)
Sets the left margin of both pads.
Float_t fLeftMargin
Stores the common left margin of both pads.
Definition TRatioPlot.h:135
TAxis * GetUpperRefXaxis() const
Gets the x axis of the object returned by TRatioPlot::GetUpperRefObject.
Float_t fSplitFraction
Stores the fraction at which the upper and lower pads meet.
Definition TRatioPlot.h:92
void Paint(Option_t *opt="") override
Update the visual axes and grid lines when painting.
virtual TObject * GetUpperRefObject() const
Return the reference object.
TGraphErrors * fConfidenceInterval1
Stores the graph for the 1 sigma band.
Definition TRatioPlot.h:95
TGaxis * fUpperGXaxis
Upper graphical x axis.
Definition TRatioPlot.h:111
std::vector< double > fGridlinePositions
Stores the y positions for the gridlines.
Definition TRatioPlot.h:124
TString fH1DrawOpt
Stores draw option for h1 given in constructor.
Definition TRatioPlot.h:87
virtual void Init(TH1 *h1, TH1 *h2, Option_t *option="")
Internal method that shares constructor logic.
Bool_t fShowGridlines
Stores whether to show the gridlines at all.
Definition TRatioPlot.h:125
void Draw(Option_t *chopt="") override
Draws the ratio plot to the currently active pad.
TString fGraphDrawOpt
Stores draw option for the lower plot graph given in constructor.
Definition TRatioPlot.h:89
~TRatioPlot() override
Destructor.
Color_t fCi2Color
Stores the color for the 2 sigma band.
Definition TRatioPlot.h:98
void SetRightMargin(Float_t margin)
Sets the right margin of both pads.
TGaxis * fLowerGYaxis
Lower graphical y axis.
Definition TRatioPlot.h:114
void SetConfidenceLevels(Double_t cl1, Double_t cl2)
Sets the confidence levels used to calculate the bands in the fit residual case.
Basic string class.
Definition TString.h:139
const char * Data() const
Definition TString.h:376
TString & ReplaceAll(const TString &s1, const TString &s2)
Definition TString.h:704
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition TString.h:632
virtual void GetConfidenceIntervals(Int_t n, Int_t ndim, const Double_t *x, Double_t *ci, Double_t cl=0.95)
return confidence intervals in array x of dimension ndim implemented in TFitter and TLinearFitter
static TVirtualFitter * GetFitter()
static: return the current Fitter
virtual void Modified(Bool_t flag=1)=0
virtual void SetLogx(Int_t value=1)=0
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
virtual Bool_t GetGridx() const =0
virtual Int_t GetTicky() const =0
virtual Int_t GetLogy() const =0
virtual Double_t GetHNDC() const =0
virtual Double_t GetWNDC() const =0
virtual Int_t GetTickx() const =0
virtual Int_t GetLogx() const =0
virtual Bool_t GetGridy() const =0
TLine * line
Double_t y[n]
Definition legend1.C:17
return c1
Definition legend1.C:41
Double_t x[n]
Definition legend1.C:17
TGraphErrors * gr
Definition legend1.C:25
TH1F * h1
Definition legend1.C:5
return c2
Definition legend2.C:14
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Definition TMath.h:725