From TTree to TGraph

Dear all,

I would like to read some tree branches and ‘convert’ them to graphs so I can manipulate it.
Can you help me with this?

For example, this is code:

f1 = TFile("file.root","r")
c1 = TCanvas('c1','The Ntuple canvas',200,10,700,780)
c1.SetGrid()
c1.SetName("name1")
ntuple = gROOT.FindObject('arcBPM_Right')
ntuple.Draw('S1X:ScanLB',"Option==1")

Now, how can I get this plot S1X:ScanLB and add it to TGraph so I can easily manipulate it?

Thanks in advance,
Veljko M.

Hi Velijko,
possibly simpler, if your ROOT version is new enough (and it returns the TGraph object): the lines above can be substituted with

graph = ROOT.RDataFrame("arcBPM_Right", "file.root")\
            .Filter("Option==1")\
            .Graph("S1X", "ScanLB")
c1 = ROOT.TCanvas(‘c1’,‘The Ntuple canvas’,200,10,700,780)
graph.Draw()

Cheers,
Enrico

Thank you Enrico for quick response. I tried with your suggestion but an error occurs:

SyntaxError: Non-ASCII character ‘\xe2’ in file read.py on line 23, but no encoding declared;

It could be I don`t have ROOT verions new enough. I use
ROOT 6.10/04
From tag v6-10-04, 28 July 2017

All the best,
Veljko M.

That’s a Python error that does not have to do with ROOT, I think it’s because the TCanvas arguments use backticks ` instead of double quotes ". I fixed my original snippet.

In any case RDataFrame is not available in v6.10 I’m afraid.

I guess you can retrieve the TGraph from the canvas or gROOT instead.
Cheers,
Enrico

I agree with you, I can use TGraph from canvas, but there`s a problem since I draw multiple plots with the ‘same’ option and some data points are lost. This happens because sometimes first drawn graph has y-axis ranges smaller then the next one. Maybe you can help me with this?
For example:

beam=B1X
draw="AcquisitionFlag==1"
ntuple = gROOT.FindObject('arcBPM_Left')
ntuple.SetMarkerColor(2)
ntuple.SetMarkerStyle(8)
ntuple.Draw('%s:ScanLB'%beam,draw)

ntuple1 = gROOT.FindObject('arcBPM_Right')
ntuple1.SetMarkerColor(4)
ntuple1.SetMarkerStyle(8)
#gr=TGraph(ntuple1.GetSelect('%s:ScanLB'%beam,draw))
ntuple1.Draw('%s:ScanLB'%beam,draw, 'same')

All the best,
Veljko M.

@couet can probably help with axis range issues :smile:
It would probably be helpful if you could provide a self-contained reproducer (something we can run ourselves, or the data needed to run the snippet above).

You can find attached *py code and *root file which are standalone to run the macro.
OrbitDriftData_2018_900GeV_S1.root (120.4 KB) print_plot.py (639 Bytes)

After running the print_plot.py you can find some points lost ‘in translation’

Thanks in advance,
Veljko M.

Group the graph in a TMultiGraph which will compute for you the global range.

On a side note, the “same” option is not a TGraph::Draw option. By default a graph is drawn on the current plot (unlike the histograms which need “same” to do that). On the opposite the option “A” for TGraph allows to start a new plot. We have been obliged to handle the case of “SAME” for TGraph, as many people (like you) did that mistake. So “SAME” on TGraph is simply ignored.

Thanks for replay,

Actually I`m familiar with the TMultiGraph class, but there is a problem how can I ‘convert’ TTree content to TGraph and than everything will be easier? Enrico came out with an idea but it was not working for my ROOT version.

root [0] ntuple->Draw("px:py")
root [1] auto graph = (TGraph*)gPad->GetPrimitive("Graph");
root [2] graph->Draw("L")

Thanks, guys, you helped me a lot.

All the best,
Veljko M.