TRatioPlot possible bug

Let’s create and draw the TRatioPlot object:

ratio_plot = TRatioPlot( h1, h2 )

Then let’s go to the upper pad and draw some histograms there

h1.Draw("same hist PE")
h2.Draw("same hist PE")
h3.Draw("same hist PE")

h3 has a bit higher maximum than the TRatioPlot upper pad Y axis range, so, let’s expand a bit that axis. But first of all one needs to know its current minimum and maximum:

ratio_plot.GetUpperPad().GetFrame().GetY2() returns the maximum of the lower TRatioPlot pad.
ratio_plot.GetUpperRefYaxis().GetXmax()) returns 1 which is very crazy.
ROOT.gPad.GetFrame().GetY2() again, returns the maximum of the lower TRatioPlot pad.
ratio_plot.GetUpperPad().GetY2() returns some crazy numbers.

There is no way to use ratio_plot.GetUpperRefYaxis().SetRangeUser(some_min, some_max) without knowing the actual TRatioPlot upper pad Y axis range as hundreds of histograms are created automatically.

So, if the GetUpperPad().GetFrame().GetY2() does not work, how to know these values?

ROOT Version: 6.30.04
Platform: Linux, MacOS
Compiler: gcc, clang

I will do a small example to reproduce what you describe.

You need an Update():

void ratioplot3() {
   auto c1 = new TCanvas("c1", "A ratio example");
   auto h1 = new TH1D("h1", "h1", 50, 0, 10);
   auto h2 = new TH1D("h2", "h2", 50, 0, 10);
   auto f1 = new TF1("f1", "exp(- x/[0] )");
   f1->SetParameter(0, 3);
   h1->FillRandom("f1", 1900);
   h2->FillRandom("f1", 2000);
   h2->Scale(1.9 / 2.);
   auto rp = new TRatioPlot(h1, h2);
   printf(">>> Maximum of the upper pad    : %g\n",rp->GetUpperPad()->GetFrame()->GetY2());

Hi, thank you for the fast reply!
I translated your code to the Python version and it really works, but if you add c1.SetLogy(1) (or c1 -> SetLogy(1) to your macro) the results are getting weird. I forgot to add this to the first post.

#!/usr/bin/env python3

import ROOT
from ROOT import TCanvas, TRatioPlot, TF1
from ROOT import gStyle

c1 = ROOT.TCanvas("c1", "A ratio example")
h1 = ROOT.TH1D("h1", "h1", 50, 0, 10)
h2 = ROOT.TH1D("h2", "h2", 50, 0, 10)
f1 = ROOT.TF1("f1", "exp(- x/[0] )")
f1.SetParameter(0, 3)
h1.FillRandom("f1", 1900)
h2.FillRandom("f1", 2000)
h2.Scale(1.9 / 2.)
rp = ROOT.TRatioPlot(h1, h2)
print(f'>>> Maximum of the upper pad    : {rp.GetUpperPad().GetFrame().GetY2()}')

When a pad is in log scale the pad coordinates are the log of the pad limit.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.