Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TRatioPlot.h
Go to the documentation of this file.
1 // @(#)root/gpad:$Id$
2 // Author: Paul Gessinger 25/08/2016
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2016, 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 #ifndef ROOT_TRatioPlot
13 #define ROOT_TRatioPlot
14 
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // ROOT_TRatioPlot //
19 // //
20 // A collection of histograms //
21 // //
22 //////////////////////////////////////////////////////////////////////////
23 
24 #include "TObject.h"
25 
26 #include "TString.h"
27 
28 #include "TGraph.h"
29 
30 class TH1;
31 class TPad;
32 class TVirtualPad;
33 class TGraphAsymmErrors;
34 class TGraphErrors;
35 class TAxis;
36 class TGaxis;
37 class TLine;
38 class TFitResultPtr;
39 class TFitResult;
40 class THStack;
41 class TBrowser;
42 
43 class TRatioPlot : public TObject {
44 
45 private:
46  TRatioPlot& operator=(const TRatioPlot&) = delete; // Not implemented
47  TRatioPlot(const TRatioPlot &hrp) = delete;
48 
49  enum CalculationMode {
50  kDivideHist = 1, ///< Use `TH1::Divide` to create the ratio.
51  kDivideGraph = 2, ///< Use `TGraphAsymmErrors::Divide` to create the ratio.
52  kDifference = 3, ///< Calculate the difference between the histograms.
53  kFitResidual = 4, ///< Calculate the fit residual between the histogram and a fit stored within it.
54  kDifferenceSign = 5 ///< Calculate the difference divided by the error.
55  };
56 
57  enum ErrorMode {
58  kErrorSymmetric = 1, ///< Use the regular `TH1::GetBinError` as the error
59  kErrorAsymmetric = 2, ///< Use `TH1::GetBinErrorUp` and `TH1::GetBinErrorLow` for the error, depending on y values.
60  kErrorFunc = 3 ///< Use the square root of the function value as the error.
61  };
62 
63  enum HideLabelMode {
64  kHideUp = 1, ///< Hide the first label of the upper y axis when there is low space.
65  kHideLow = 2, ///< Hide the last label of the lower y axis when there is low space.
66  kNoHide = 3, ///< Do not hide labels when there is low space.
67  kForceHideUp = 4, ///< Always hide the first label of the upper y axis
68  kForceHideLow = 5 ///< Always hide the last label of the lower y axis
69  };
70 
71 
72 protected:
73 
74  TVirtualPad *fParentPad = 0; ///< Stores the pad the ratio plot was created in
75  TPad *fUpperPad = 0; ///< The pad which contains the upper plot part
76  TPad *fLowerPad = 0; ///< The pad which contains the calculated lower plot part
77  TPad *fTopPad = 0; ///< The Pad that drawn on top on the others to have consistent coordinates
78 
79  TH1 *fH1 = 0; ///< Stores the primary histogram
80  TH1 *fH2 = 0; ///< Stores the secondary histogram, if there is one
81  TObject *fHistDrawProxy = 0; ///< The object which is actually drawn, this might be TH1 or THStack
82 
83  Int_t fMode = 0; ///< Stores which calculation is supposed to be performed as specified by user option
84  Int_t fErrorMode = TRatioPlot::ErrorMode::kErrorSymmetric; ///< Stores the error mode, sym, asym or func
85  TString fOption = ""; ///< Stores the option which is given in the constructor as a string
86  TString fH1DrawOpt = ""; ///< Stores draw option for h1 given in constructor
87  TString fH2DrawOpt = ""; ///< Stores draw option for h2 given in constructor
88  TString fGraphDrawOpt = ""; ///< Stores draw option for the lower plot graph given in constructor
89  TString fFitDrawOpt = ""; ///< Stores draw option for the fit function in the fit residual case
90 
91  Float_t fSplitFraction = 0.3; ///< Stores the fraction at which the upper and lower pads meet
92 
93  TGraph *fRatioGraph = 0; ///< Stores the lower plot's graph
94  TGraphErrors *fConfidenceInterval1 = 0; ///< Stores the graph for the 1 sigma band
95  TGraphErrors *fConfidenceInterval2 = 0; ///< Stores the graph for the 2 sigma band
96  Color_t fCi1Color = kGreen; ///< Stores the color for the 1 sigma band
97  Color_t fCi2Color = kYellow; ///< Stores the color for the 2 sigma band
98 
99  Bool_t fShowConfidenceIntervals = kTRUE; ///< Stores whether to show the confidence interval bands. From Draw option
100 
101  Double_t fCl1 = 0.6827; ///< Stores the confidence level for the inner confidence interval band
102  Double_t fCl2 = 0.9545; ///< Stores the confidence level for the outer confidence interval band
103 
104  Double_t fC1 = 1.; ///< Stores the scale factor for h1 (or THStack sum)
105  Double_t fC2 = 1.; ///< Stores the scale factor for h2
106 
107  TFitResult *fFitResult = 0; ///< Stores the explicit fit result given in the fit residual case. Can be 0
108 
109  TAxis *fSharedXAxis = 0; ///< X axis that stores the range for both plots
110  TGaxis *fUpperGXaxis = 0; ///< Upper graphical x axis
111  TGaxis *fLowerGXaxis = 0; ///< Lower graphical x axis
112  TGaxis *fUpperGYaxis = 0; ///< Upper graphical y axis
113  TGaxis *fLowerGYaxis = 0; ///< Lower graphical y axis
114  TGaxis *fUpperGXaxisMirror = 0; ///< Upper mirror of the x axis
115  TGaxis *fLowerGXaxisMirror = 0; ///< Lower mirror of the x axis
116  TGaxis *fUpperGYaxisMirror = 0; ///< Upper mirror of the y axis
117  TGaxis *fLowerGYaxisMirror = 0; ///< Lower mirror of the y axis
118 
119  TAxis *fUpYaxis = 0; ///< Clone of the upper y axis
120  TAxis *fLowYaxis = 0; ///< Clone of the lower y axis
121 
122  std::vector<TLine*> fGridlines; ///< Keeps TLine objects for the gridlines
123  std::vector<double> fGridlinePositions; ///< Stores the y positions for the gridlines
124  Bool_t fShowGridlines = kTRUE; ///< Stores whether to show the gridlines at all
125  Int_t fHideLabelMode = TRatioPlot::HideLabelMode::kHideLow; ///< Stores which label to hide if the margin is to narrow, if at all
126 
127  // store margins to be able do determine
128  // what has changed when user drags
129  Float_t fUpTopMargin = 0.1; ///< Stores the top margin of the upper pad
130  Float_t fUpBottomMargin = 0.05; ///< Stores the bottom margin of the upper pad
131  Float_t fLowTopMargin = 0.05; ///< Stores the top margin of the lower pad
132  Float_t fLowBottomMargin = 0.3; ///< Stores the bottom margin of the lower pad
133 
134  Float_t fLeftMargin = 0.1; ///< Stores the common left margin of both pads
135  Float_t fRightMargin = 0.1; ///< Stores the common right margin of both pads
136 
137  Float_t fInsetWidth = 0.0025;
138 
139  Bool_t fIsUpdating = kFALSE; ///< Keeps track of whether its currently updating to reject other calls until done
140  Bool_t fIsPadUpdating = kFALSE; ///< Keeps track whether pads are updating during resizing
141 
142  virtual void SyncAxesRanges();
143  virtual void SetupPads();
144  virtual void CreateVisualAxes();
145  virtual Bool_t SyncPadMargins();
146  void SetPadMargins();
147  void CreateGridline();
148  Int_t BuildLowerPlot();
149 
150  void ImportAxisAttributes(TGaxis* gaxis, TAxis* axis);
151 
152  Bool_t IsDrawn();
153 
154  virtual void Init(TH1* h1, TH1* h2, Option_t *option = "");
155 
156 public:
157 
158  TRatioPlot();
159  virtual ~TRatioPlot();
160  TRatioPlot(TH1* h1, TH1* h2, Option_t *option = "pois");
161 
162  TRatioPlot(THStack* st, TH1* h2, Option_t *option = "pois");
163 
164  TRatioPlot(TH1* h1, Option_t *option = "", TFitResult *fitres = 0);
165 
166  void SetH1DrawOpt(Option_t *opt);
167  void SetH2DrawOpt(Option_t *opt);
168  void SetGraphDrawOpt(Option_t *opt);
169  void SetFitDrawOpt(Option_t *opt);
170 
171  void SetInsetWidth(Double_t width);
172 
173  virtual void Draw(Option_t *chopt="");
174  virtual void Browse(TBrowser *b);
175 
176 
177  virtual void Paint(Option_t *opt = "");
178 
179  // Slots for signal receiving
180  void UnZoomed();
181  void RangeAxisChanged();
182  void SubPadResized();
183 
184  // Getters
185  TAxis *GetXaxis() const { return fSharedXAxis; }
186  TAxis *GetUpYaxis() const { return fUpYaxis; }
187  TAxis *GetLowYaxis() const { return fLowYaxis; }
188 
189  virtual TGraph *GetLowerRefGraph() const;
190 
191  ////////////////////////////////////////////////////////////////////////////////
192  /// Shortcut for:
193  ///
194  /// ~~~{.cpp}
195  /// rp->GetLowerRefGraph()->GetXaxis();
196  /// ~~~
197 
198  TAxis *GetLowerRefXaxis() const { return GetLowerRefGraph()->GetXaxis(); }
199 
200  ////////////////////////////////////////////////////////////////////////////////
201  /// Shortcut for:
202  ///
203  /// ~~~{.cpp}
204  /// rp->GetLowerRefGraph()->GetYaxis();
205  /// ~~~
206 
207  TAxis *GetLowerRefYaxis() const { return GetLowerRefGraph()->GetYaxis(); }
208 
209  virtual TObject *GetUpperRefObject() const;
210  TAxis *GetUpperRefXaxis() const;
211  TAxis *GetUpperRefYaxis() const;
212 
213  ////////////////////////////////////////////////////////////////////////////////
214  /// Get the output of the calculation in the form of a graph. The type of
215  /// the return value depends on the input option that was given in the constructor.
216 
217  TGraph *GetCalculationOutputGraph() const { return fRatioGraph; }
218 
219  ////////////////////////////////////////////////////////////////////////////////
220  /// Returns the graph for the 1 sigma confidence interval in the fit residual case
221 
222  TGraphErrors *GetConfidenceInterval1() const { return fConfidenceInterval1; }
223 
224  ////////////////////////////////////////////////////////////////////////////////
225  /// Returns the graph for the 2 sigma confidence interval in the fit residual case
226 
227  TGraphErrors *GetConfidenceInterval2() const { return fConfidenceInterval2; }
228 
229  TPad * GetUpperPad() const { return fUpperPad; }
230  TPad * GetLowerPad() const { return fLowerPad; }
231 
232  // Setters
233 
234  ////////////////////////////////////////////////////////////////////////////////
235  /// Explicitly specify the fit result that is to be used for fit residual calculation.
236  /// If it is not provided, the last fit registered in the global fitter is used.
237  /// The fit result can also be specified in the constructor.
238  ///
239  /// \param fitres The fit result coming from the fit function call
240 
241  void SetFitResult(TFitResultPtr fitres) { fFitResult = fitres.Get(); }
242 
243  // Setters for margins
244  void SetUpTopMargin(Float_t margin);
245  void SetUpBottomMargin(Float_t margin);
246  void SetLowTopMargin(Float_t margin);
247  void SetLowBottomMargin(Float_t margin);
248  void SetLeftMargin(Float_t margin);
249  void SetRightMargin(Float_t margin);
250 
251  void SetSeparationMargin(Float_t);
252  Float_t GetSeparationMargin() const;
253  void SetSplitFraction(Float_t sf);
254  void SetConfidenceLevels(Double_t cl1, Double_t cl2);
255 
256  virtual void SetGridlines(Double_t *gridlines, Int_t numGridlines);
257  virtual void SetGridlines(std::vector<double> gridlines);
258 
259  void SetConfidenceIntervalColors(Color_t ci1 = kGreen, Color_t ci2 = kYellow);
260 
261  void SetC1(Double_t c1) { fC1 = c1; }
262  void SetC2(Double_t c2) { fC2 = c2; }
263 
264  ClassDef(TRatioPlot, 1) //A ratio of histograms
265 };
266 
267 #endif