GRSISort
Created by P.C. Bender
Developement Team: P.C. Bender, R. Dunlop, V. Bildstein
An extension of the ROOT analysis Framework
hist_tab.py
Go to the documentation of this file.
1 #!/usr/bin/env python2
2 
3 import itertools
4 import Tkinter as tk
5 import ttk
6 
7 import ROOT
8 ROOT.PyConfig.IgnoreCommandLineOptions = True
9 
10 from .util import unpack_tdirectory, update_tcanvases, TKeyDict
11 
12 shown = 0
13 
14 class HistTab(object):
15 
16  def __init__(self, main, frame):
17  self.main = main
18  self._setup_GUI(frame)
19  self.active_dirs = []
20 
21  self._requires_resort = False
22  self.CheckOnlineHists()
23  self.main.window.after_idle(self._PeriodicHistogramCheck)
24 
25  def _setup_GUI(self, frame):
26  self.frame = frame
27  self._MakeHistView(frame)
28 
29  def _MakeHistView(self,parent):
30  self.treeview = ttk.Treeview(parent)
31  self.treeview.pack(fill=tk.BOTH,expand=True)
32  # Map from treeview name to ROOT object
34  self.treeview.bind("<Double-1>", self.OnHistClick)
35 
36  def AddActiveDirectory(self, tdir):
37  #if tdir.GetName() not in [d.GetName() for d in self.active_dirs]:
38  if tdir not in self.active_dirs:
39  self.active_dirs.append(tdir)
40 
41  def OnHistClick(self,event):
42  objects = {name:self.hist_lookup[name]
43  for name in event.widget.selection()}
44  histograms = {name:h for name,h in objects.items()
45  if isinstance(h, ROOT.TH1)}
46 
47  color = 1;
48  for name,obj in sorted(histograms.items()):
49  if isinstance(obj, ROOT.GH2Base):
50  self._refresh(name, obj)
51 
52  self.main._draw_single(obj,color,len(histograms))
53  if self.main.plotlocation.get()=='Overlay':
54  color+=1
55  if color == 5:
56  color+=1
57 
59 
60  def _dump_to_tfile(self):
61  for key in self.hist_lookup:
62  self.hist_lookup[key].Write()
63 
64  def _load_compiled_histograms(self, filename):
65  print 'load compiled histograms called.'
66  #pipeline = ROOT.GetPipeline(0)
67  #if outfile:
68  # pipeline.SetHistogramLibrary(filename)
69 
71  print ' _compiled_histogram_filename called.\n'
72  #pipeline = ROOT.GetPipeline(0)
73  #if pipeline:
74  # return pipeline.GetLibraryName()
75  #else:
76  return ''
77 
78  def _refresh(self, name, obj):
79  parent = self._find_parent(name)
80  if parent is not None:
81  self.Insert(obj, parent)
82 
83  def _find_parent(self, name, base=''):
84  children = self.treeview.get_children(base)
85  if name in children:
86  # Found it, done
87  return base
88  elif children:
89  # Search in the children
90  for child in children:
91  parent = self._find_parent(name, child)
92  if parent:
93  return parent
94  else:
95  # Not here.
96  return None
97 
98  def Insert(self,obj,parent='',objname=None,icon=None):
99  if not obj:
100  return
101 
102  if objname is None:
103  objname = obj.GetName()
104 
105  if (isinstance(obj, ROOT.TKey) and
106  not issubclass(getattr(ROOT, obj.GetClassName()), ROOT.TH1) and
107  not issubclass(getattr(ROOT, obj.GetClassName()), ROOT.TChannel)):
108  obj = obj.ReadObj()
109 
110  if (isinstance(obj, ROOT.TTree) or
111  isinstance(obj, ROOT.TCutG) or
112  isinstance(obj, ROOT.TProcessID)):
113  return
114 
115  if parent:
116  name = parent + '/' + objname
117  else:
118  name = objname
119 
120  self._insert_single_nonrecursive(obj, parent, name, objname, icon)
121 
122  if isinstance(obj, ROOT.TList):
123  iterable = obj
124  elif isinstance(obj, ROOT.TDirectory):
125  iterable = obj.GetListOfKeys()
126  if not iterable:
127  iterable = obj.GetList()
128  elif isinstance(obj, ROOT.GH2Base):
129  iterable = itertools.chain(obj.GetProjections(),
130  obj.GetSummaryProjections())
131  else:
132  iterable = None
133 
134  if iterable is not None:
135  for obj in iterable:
136  self.Insert(obj, name)
137 
138  def _insert_single_nonrecursive(self, obj, parent, name,
139  objname=None, icon=None):
140  is_histogram_key = (isinstance(obj, ROOT.TKey) and
141  issubclass(getattr(ROOT, obj.GetClassName()), ROOT.TH1))
142  is_histogram = isinstance(obj, ROOT.TH1)
143 
144  if objname is None:
145  objname = obj.GetName()
146 
147  if (is_histogram_key and
148  name in self.hist_lookup and
149  not self.hist_lookup.is_tkey(name)):
150  # If the histogram has already been read, copy it in
151  orig = self.hist_lookup[name]
152  obj.Copy(orig)
153  orig.SetDirectory(0)
154  else:
155  # TKeyDict makes a Clone, so the histograms updating won't
156  # require an update of the canvas.
157  self.hist_lookup[name] = obj
158 
159  if name not in self.treeview.get_children(parent):
160  #print 'Performing insertion of',name,'into',parent
161  self._requires_resort = True
162  if icon is None:
163  icon = self.main._PickIcon(obj)
164  self.treeview.insert(parent,'end', name, text=objname,image=icon)
165 
167  self.CheckOnlineHists()
168  self.main.window.after(1000, self._PeriodicHistogramCheck)
169 
170  def CheckOnlineHists(self):
171  for tdir in self.active_dirs:
172  name = tdir.GetName()
173  if name == '/dev/null':
174  name = tdir.GetTitle()
175 
176  if tdir.GetList():
177  self.Insert(tdir.GetList(),
178  objname=name, icon=self.main.icons['tfile'])
179  if tdir.GetListOfKeys():
180  self.Insert(tdir.GetListOfKeys(),
181  objname=name, icon=self.main.icons['tfile'])
182 
183  if self._requires_resort:
184  self.Resort()
185  self._requires_resort = False
186 
187  def Resort(self, parent=''):
188  children = list(self.treeview.get_children(parent))
189  if not children:
190  return
191 
192  children.sort()
193  for index, name in enumerate(children):
194  self.treeview.move(name, parent, index)
195 
196  for child in children:
197  self.Resort(child)
198 
199 
200  def InsertHist(self, hist):
201  dirname = hist.GetDirectory().GetName()
202 
203  if dirname in self.treeview.get_children(''):
204  icon = self.main._PickIcon(hist)
205  name = dirname + '/' + hist.GetName()
206  self._insert_single_nonrecursive(hist, dirname, name)
def _setup_GUI(self, frame)
Definition: hist_tab.py:25
def OnHistClick(self, event)
Definition: hist_tab.py:41
void Write(std::shared_ptr< TMidasEvent > evt, TMidasFile *outfile)
def _refresh(self, name, obj)
Definition: hist_tab.py:78
def Resort(self, parent='')
Definition: hist_tab.py:187
def _load_compiled_histograms(self, filename)
Definition: hist_tab.py:64
def _compiled_histogram_filename(self)
Definition: hist_tab.py:70
def _find_parent(self, name, base='')
Definition: hist_tab.py:83
def InsertHist(self, hist)
Definition: hist_tab.py:200
def update_tcanvases(objects=None)
Definition: util.py:16
def AddActiveDirectory(self, tdir)
Definition: hist_tab.py:36
def Insert(self, obj, parent='', objname=None, icon=None)
Definition: hist_tab.py:98
def _MakeHistView(self, parent)
Definition: hist_tab.py:29
def CheckOnlineHists(self)
Definition: hist_tab.py:170
def _PeriodicHistogramCheck(self)
Definition: hist_tab.py:166
def _dump_to_tfile(self)
Definition: hist_tab.py:60
def _insert_single_nonrecursive(self, obj, parent, name, objname=None, icon=None)
Definition: hist_tab.py:139
def __init__(self, main, frame)
Definition: hist_tab.py:16