Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 "TColor.h"
14#include "TROOT.h"
15#include "TBrowser.h"
16#include "TH1.h"
17#include "TF1.h"
18#include "TPad.h"
19#include "TString.h"
20#include "TMath.h"
21#include "TGraphAsymmErrors.h"
22#include "TGraphErrors.h"
23#include "TGaxis.h"
24#include "TLine.h"
25#include "TVirtualFitter.h"
26#include "TFitResult.h"
27#include "THStack.h"
28#include "TStyle.h"
29
30/** \class TRatioPlot
31 \ingroup gpad
32Class for displaying ratios, differences and fit residuals.
33
34TRatioPlot has two constructors, one which accepts two histograms, and is responsible
35for setting up the calculation of ratios and differences. This calculation is in part
36delegated to `TEfficiency`. A single option can be given as a parameter, that is
37used to determine which procedure is chosen. The remaining option string is then
38passed through to the calculation, if applicable. The other constructor uses a
39fitted histogram to calculate the fit residual and plot it with the histogram
40and the fit function.
41
42## Ratios and differences
43The simplest case is passing two histograms without specifying any options. This defaults to using
44`TGraphAsymmErrors::Divide`. The `option` variable is passed through, as are the parameters
45`c1` and `c2`, that you can set via `TRatioPlot::SetC1` and `TRatioPlot::SetC1`. If you set the
46`option` to `divsym` the method `TH1::Divide` will be used instead, also receiving all the parameters.
47
48Using the `option` `diff` or `diffsig`, both histograms will be subtracted, and in the case of diffsig,
49the difference will be divided by the uncertainty. `c1` and `c2` will only be used to
50scale the histograms using `TH1::Scale` prior to subtraction.
51
52Available options are for `option`:
53| Option | Description |
54| ---------- | ------------------------------------------------------------ |
55| divsym | uses the histogram `TH1::Divide` method, yields symmetric errors |
56| diff | subtracts the histograms |
57| diffsig | subtracts the histograms and divides by the uncertainty |
58
59Begin_Macro(source)
60../../../tutorials/hist/hist029_TRatioPlot_simple.C
61End_Macro
62
63## Fit residuals
64A second constructor only accepts a single histogram, but expects it to have a fitted
65function. The function is used to calculate the residual between the fit and the
66histogram. Here, it is expected that h1 has a fit function in it's list of functions. The class calculates the
67difference between the histogram and the fit function at each point and divides it by the uncertainty. There
68are a few option to steer which error is used (as is the case for `diffsig`). The default is to use
69the statistical uncertainty from h1 using `TH1::GetBinError`. If the `option` string contains `errasym`, asymmetric
70errors will be used. The type of error can be steered by `TH1::SetBinErrorOption`. The corresponding error will be used,
71depending on if the function is below or above the bin content. The third option `errfunc` uses the square root of
72the function value as the error.
73
74
75Begin_Macro(source)
76../../../tutorials/hist/hist030_TRatioPlot_residual.C
77End_Macro
78
79## Error options for difference divided by uncertainty and fit residual
80The uncertainty that is used in the calculation can be steered by providing
81options to the `option` argument.
82
83| Option | Description |
84| ---------- | ------------------------------------------------------------ |
85| errasym | Uses calculated asymmetric errors from `TH1::GetBinErrorUp`/`TH1::GetBinErrorLow`. Note that you need to
86set `TH1::SetBinErrorOption` first | | errfunc | Uses \f$ \sqrt{f(x)} \f$ as the error |
87
88The asymmetric error case uses the upper or lower error depending on the relative size
89of the bin contents, or the bin content and the function value.
90
91## Access to internal parts
92You can access the internal objects that are used to construct the plot via a series of
93methods. `TRatioPlot::GetUpperPad` and `TRatioPlot::GetLowerPad` can be used to draw additional
94elements on top of the existing ones.
95`TRatioPlot::GetLowerRefGraph` returns a reference to the lower pad's graph that
96is responsible for the range, which enables you to modify the range.
97
98\image html gpad_ratioplot.png
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
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
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
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
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
274
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
295
296 if (!h1IsTH1) {
297 Warning("TRatioPlot", "Need a histogram deriving from TH2 or TH3.");
298 return;
299 }
300
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
312
314
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
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
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
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/hist034_TRatioPlot_fit_margin.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
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
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/hist031_TRatioPlot_residual_fit.C
703/// End_Macro
704
706{
707 if (!fLowerPad) {
708 Error("GetLowerRefGraph", "Lower pad has not been defined");
709 return nullptr;
710 }
711
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{
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{
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{
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);
831 fGridlines.emplace_back(newline);
832 }
833
835}
836
837////////////////////////////////////////////////////////////////////////////////
838/// Update positions of grid lines
839
841{
844
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);
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
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
946 ratioGraph->Divide(tmpH1, tmpH2, fOption.Data());
948
949 delete tmpH1;
950 delete tmpH2;
951
952 } else if (fMode == CalculationMode::kDifference) {
954
955 TH1 *tmpHist = static_cast<TH1 *>(fH1->Clone());
956
957 tmpHist->Reset();
958
959 tmpHist->Add(fH1, fH2, fC1, -1*fC2);
961
962 delete tmpHist;
964
966
968 Int_t ipoint = 0;
969
970 for (Int_t i = 0; i <= fH1->GetNbinsX(); ++i) {
971 Double_t val = fH1->GetBinContent(i);
973 Double_t error = 0.;
974
976
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
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
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
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
1090 fConfidenceInterval1->SetPointError(ipoint, x, i <= (Int_t)ci1.size() ? ci1[i-1] / error : 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){
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());
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{
1138
1141
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
1213
1216
1221
1223
1224 Bool_t logx = fUpperPad->GetLogx() || fLowerPad->GetLogx();
1227
1228 if (uplogy) {
1229
1232
1233 if (upYFirst <= 0 || upYLast <= 0) {
1234 Error(thisMethod, "Cannot set upper Y axis to log scale");
1235 }
1236 }
1237
1238 if (lowlogy) {
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
1274 fUpperGXaxis->SetY1(upBM*(1-sf)+sf);
1275 fUpperGXaxis->SetY2(upBM*(1-sf)+sf);
1276 fUpperGXaxis->SetWmin(first);
1277 fUpperGXaxis->SetWmax(last);
1278
1281 fUpperGYaxis->SetY1(upBM*(1-sf)+sf);
1282 fUpperGYaxis->SetY2( (1-upTM)*(1-sf)+sf );
1285
1290 fLowerGXaxis->SetWmin(first);
1291 fLowerGXaxis->SetWmax(last);
1292
1296 fLowerGYaxis->SetY2((1-lowTM)*sf);
1299
1304
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 );
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) {
1353 fUpperGXaxisMirror->SetY1((1-upTM)*(1-sf)+sf);
1354 fUpperGXaxisMirror->SetY2((1-upTM)*(1-sf)+sf);
1360 }
1361
1362 if (fUpperGYaxisMirror) {
1368 fUpperGYaxisMirror->SetY2( (1-upTM)*(1-sf)+sf );
1374 }
1375
1376 if (fLowerGXaxisMirror) {
1388 }
1389
1390 if (fLowerGYaxisMirror) {
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
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
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
1506 Double_t upFirst = uprefx->GetBinLowEdge(uprefx->GetFirst());
1507 Double_t upLast = uprefx->GetBinUpEdge(uprefx->GetLast());
1508
1510 Double_t lowFirst = lowrefx->GetBinLowEdge(lowrefx->GetFirst());
1511 Double_t lowLast = lowrefx->GetBinUpEdge(lowrefx->GetLast());
1512
1515
1518
1519 // determine which one has changed
1520 if (upFirst != globFirst || upLast != globLast) {
1522 upChanged = kTRUE;
1523 } else if (lowFirst != globFirst || lowLast != globLast) {
1525 lowChanged = kTRUE;
1526 }
1527
1528 if (upChanged || lowChanged)
1530
1531 // sync the margins in case the user has dragged one of them
1533
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
1584
1586
1587 if (upylow != fSplitFraction) {
1588 // up changed
1590 changed = kTRUE;
1591 } else if (lowyup != fSplitFraction) {
1592 // low changed
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
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);
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/hist032_TRatioPlot_fit_lines.C
1668/// End_Macro
1669
1670void TRatioPlot::SetGridlines(std::vector<double> gridlines)
1671{
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
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/hist033_TRatioPlot_fit_confidence.C
1698/// End_Macro
1699
1705
1706
1707////////////////////////////////////////////////////////////////////////////////
1708/// Set the confidence interval colors.
1709
1715
1716////////////////////////////////////////////////////////////////////////////////
1717/// Internal method to import TAxis attributes to a TGaxis. Copied from
1718/// `TGaxis::ImportAxisAttributes`
1719
1721{
1722 gaxis->SetLineColor(axis->GetAxisColor());
1723 gaxis->SetTextColor(axis->GetTitleColor());
1724 gaxis->SetTextFont(axis->GetTitleFont());
1725 gaxis->SetLabelColor(axis->GetLabelColor());
1726 gaxis->SetLabelFont(axis->GetLabelFont());
1727 gaxis->SetLabelSize(axis->GetLabelSize());
1728 gaxis->SetLabelOffset(axis->GetLabelOffset());
1729 gaxis->SetTickSize(axis->GetTickLength());
1730 gaxis->SetTitle(axis->GetTitle());
1731 gaxis->SetTitleOffset(axis->GetTitleOffset());
1732 gaxis->SetTitleSize(axis->GetTitleSize());
1740 if (axis->GetDecimals()) gaxis->SetBit(TAxis::kDecimals); //the bit is in TAxis::fAxis2
1741 gaxis->SetTimeFormat(axis->GetTimeFormat());
1742}
#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
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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:442
#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:47
virtual Color_t GetLabelColor() const
Definition TAttAxis.h:39
virtual Int_t GetNdivisions() const
Definition TAttAxis.h:37
virtual Color_t GetAxisColor() const
Definition TAttAxis.h:38
virtual Style_t GetTitleFont() const
Definition TAttAxis.h:48
virtual Float_t GetLabelOffset() const
Definition TAttAxis.h:41
virtual Style_t GetLabelFont() const
Definition TAttAxis.h:40
virtual Float_t GetTitleSize() const
Definition TAttAxis.h:45
virtual Float_t GetLabelSize() const
Definition TAttAxis.h:42
virtual Float_t GetTickLength() const
Definition TAttAxis.h:46
virtual Float_t GetTitleOffset() const
Definition TAttAxis.h:44
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition TAttFill.h:38
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
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:1084
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:1053
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:26
virtual void SetTitle(const char *title="")
Change the title of the axis.
Definition TGaxis.cxx:2942
const char * GetTitle() const override
Returns title of object.
Definition TGaxis.h:88
virtual void SetNdivisions(Int_t ndiv)
Definition TGaxis.h:120
void SetWmax(Double_t wmax)
Definition TGaxis.h:135
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:93
void SetWmin(Double_t wmin)
Definition TGaxis.h:134
void SetTickSize(Float_t ticksize)
Definition TGaxis.h:124
void SetLabelSize(Float_t labelsize)
Definition TGaxis.h:109
void SetOption(Option_t *option="")
To set axis options.
Definition TGaxis.cxx:2934
TGraph with asymmetric error bars.
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:2337
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:1567
TAxis * GetYaxis() const
Get y axis of the graph.
Definition TGraph.cxx:1576
void SetTitle(const char *title="") override
Change (i.e.
Definition TGraph.cxx:2392
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:9143
static TClass * Class()
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.
Definition TH1.cxx:9065
TAxis * GetXaxis()
Definition TH1.h:340
virtual Int_t GetNbinsX() const
Definition TH1.h:313
TAxis * GetYaxis()
Definition TH1.h:341
virtual Double_t GetBinErrorLow(Int_t bin) const
Return lower error associated to bin number bin.
Definition TH1.cxx:9081
void Draw(Option_t *option="") override
Draw this histogram with options.
Definition TH1.cxx:3037
TList * GetListOfFunctions() const
Definition TH1.h:260
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Definition TH1.cxx:5059
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width for 1D histogram.
Definition TH1.cxx:9165
virtual Double_t GetBinErrorUp(Int_t bin) const
Return upper error associated to bin number bin.
Definition TH1.cxx:9112
virtual Int_t GetSumw2N() const
Definition TH1.h:331
TObject * Clone(const char *newname="") const override
Make a complete copy of the underlying object.
Definition TH1.cxx:2723
The Histogram stack class.
Definition THStack.h:40
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
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:201
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:1006
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:813
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:1020
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:69
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:44
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:68
@ kHideUp
Hide the first label of the upper y axis when there is low space.
Definition TRatioPlot.h:65
@ kNoHide
Do not hide labels when there is low space.
Definition TRatioPlot.h:67
@ kHideLow
Hide the last label of the lower y axis when there is low space.
Definition TRatioPlot.h:66
@ kForceHideLow
Always hide the last label of the lower y axis.
Definition TRatioPlot.h:69
TGraphErrors * fConfidenceInterval2
Stores the graph for the 2 sigma band.
Definition TRatioPlot.h:97
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:86
TAxis * GetLowerRefYaxis() const
Gets the y axis of the lower ref graph.
TGaxis * fUpperGXaxisMirror
Upper mirror of the x axis.
Definition TRatioPlot.h:116
TGaxis * fLowerGXaxisMirror
Lower mirror of the x axis.
Definition TRatioPlot.h:117
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:134
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:132
TH1 * fH1
Stores the primary histogram.
Definition TRatioPlot.h:80
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:109
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:98
TGaxis * fUpperGYaxis
Upper graphical y axis.
Definition TRatioPlot.h:114
Double_t fC2
Stores the scale factor for h2.
Definition TRatioPlot.h:107
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:106
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:133
TString fH2DrawOpt
Stores draw option for h2 given in constructor.
Definition TRatioPlot.h:89
void SetUpTopMargin(Float_t margin)
Sets the top margin of the upper pad.
TGaxis * fLowerGXaxis
Lower graphical x axis.
Definition TRatioPlot.h:113
TRatioPlot()
TRatioPlot default constructor.
Bool_t fIsUpdating
! Keeps track of whether its currently updating to reject other calls until done
Definition TRatioPlot.h:141
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:103
@ kErrorAsymmetric
Use TH1::GetBinErrorUp and TH1::GetBinErrorLow for the error, depending on y values.
Definition TRatioPlot.h:60
@ kErrorFunc
Use the square root of the function value as the error.
Definition TRatioPlot.h:61
@ kErrorSymmetric
Use the regular TH1::GetBinError as the error.
Definition TRatioPlot.h:59
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:124
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:77
TAxis * fSharedXAxis
X axis that stores the range for both plots.
Definition TRatioPlot.h:111
TString fFitDrawOpt
Stores draw option for the fit function in the fit residual case.
Definition TRatioPlot.h:91
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:118
virtual void SetupPads()
Setup the pads.
TAxis * fUpYaxis
Clone of the upper y axis.
Definition TRatioPlot.h:121
TVirtualPad * fParentPad
Stores the pad the ratio plot was created in.
Definition TRatioPlot.h:75
Float_t fUpTopMargin
Stores the top margin of the upper pad.
Definition TRatioPlot.h:131
void SetH1DrawOpt(Option_t *opt)
Sets the drawing option for h1.
TGraph * fRatioGraph
Stores the lower plot's graph.
Definition TRatioPlot.h:95
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:85
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:82
Float_t fRightMargin
Stores the common right margin of both pads.
Definition TRatioPlot.h:137
TGaxis * fLowerGYaxisMirror
Lower mirror of the y axis.
Definition TRatioPlot.h:119
Int_t fHideLabelMode
Stores which label to hide if the margin is to narrow, if at all.
Definition TRatioPlot.h:127
TPad * fTopPad
The Pad that drawn on top on the others to have consistent coordinates.
Definition TRatioPlot.h:78
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:53
@ kDivideHist
Use TH1::Divide to create the ratio.
Definition TRatioPlot.h:51
@ kFitResidual
Calculate the fit residual between the histogram and a fit stored within it.
Definition TRatioPlot.h:54
@ kDifferenceSign
Calculate the difference divided by the error.
Definition TRatioPlot.h:55
@ kDivideGraph
Use TGraphAsymmErrors::Divide to create the ratio.
Definition TRatioPlot.h:52
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:81
Double_t fCl2
Stores the confidence level for the outer confidence interval band.
Definition TRatioPlot.h:104
TAxis * fLowYaxis
Clone of the lower y axis.
Definition TRatioPlot.h:122
TString fOption
Stores the option which is given in the constructor as a string.
Definition TRatioPlot.h:87
TPad * fUpperPad
The pad which contains the upper plot part.
Definition TRatioPlot.h:76
Bool_t fShowConfidenceIntervals
Stores whether to show the confidence interval bands. From Draw option.
Definition TRatioPlot.h:101
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:83
Float_t fInsetWidth
Definition TRatioPlot.h:139
TAxis * GetXaxis() const
Definition TRatioPlot.h:187
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:136
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:93
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:96
TGaxis * fUpperGXaxis
Upper graphical x axis.
Definition TRatioPlot.h:112
std::vector< double > fGridlinePositions
Stores the y positions for the gridlines.
Definition TRatioPlot.h:125
TString fH1DrawOpt
Stores draw option for h1 given in constructor.
Definition TRatioPlot.h:88
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:126
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:90
~TRatioPlot() override
Destructor.
Color_t fCi2Color
Stores the color for the 2 sigma band.
Definition TRatioPlot.h:99
void SetRightMargin(Float_t margin)
Sets the right margin of both pads.
TGaxis * fLowerGYaxis
Lower graphical y axis.
Definition TRatioPlot.h:115
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
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