Hi,
I’m trying to make a simple python cgi that will allow me to view a root file in a browser. Unfortunately it dies at the point where it tries to save the png file.
Here’s what I have so far:
#!/usr/bin/python
import os, sys, cgi
import cgitb; cgitb.enable()
sys.path.insert(0, '/usr/local/root/lib')
from ROOT import *
gROOT.SetBatch(1)
display = None
mydir = "/path/to/my/data"
print "Content-Type: text/html"
print """
<h1>hello world</h1>
"""
form = cgi.FieldStorage()
if form.has_key('file') :
rf = TFile(mydir+'/'+form['file'].value)
rkeys = rf.GetListOfKeys()
if not form.has_key('key') :
for k in rkeys :
print '<a href="foo.py?file='+form['file'].value+ '&key='+k.GetName()+'">'+k.GetName()+'</a><br/>'
else :
hist = rf.Get(form['key'].value)
canvas = TCanvas()
hist.Draw()
hist.Print()
canvas.SaveAs('foo.png')
print '<img src="foo.png"/>'
rf.Close()
else :
l = os.listdir(mydir)
for i in l :
if i.find('.root') > -1:
print '<a href="foo.py?file='+i+'">'+i+'</a><br/>'
I think for the off-screen rendering the TCanvas-less TPad subclass is a better choice for Web application (there no overhead and no event loop is required). I have prototyped such class:
It is included as part of Qt/Root (there is a short “HelloLife” working example there to test). However it has nothing to do with Qt and can be used with any other ROOT GUI layers. (another way to implement this is to add one extra constructor to the TPad class directly.
in addition, this:from ROOT import *
gROOT.SetBatch(1) doesn’t quite work as you’d expect it to. I have a chicken & egg problem that I do not know how to solve elegantly.
Please do:sys.argv.append( '-b' )
from ROOT import * which will forward the ‘-b’ to ROOT with the same effect as ‘root -b’. Normally, “python <myscript.py> -b” would be the way to go.
Note also that “from ROOT import *” incurs an overhead compared to “import ROOT” and that overhead grows fast with increased complexitiy of your script.
not to encourage the usage of “from ROOT import *”, but HEAD CVS now has an implementation that performs and scales much better, even when used in scripts.