GRSISort "v4.0.0.5"
An extension of the ROOT analysis Framework
Loading...
Searching...
No Matches
hist_tab.py
Go to the documentation of this file.
1#!/usr/bin/env python2
2
3import itertools
4import Tkinter as tk
5import ttk
6
7import ROOT
8ROOT.PyConfig.IgnoreCommandLineOptions = True
9
10from .util import unpack_tdirectory, update_tcanvases, TKeyDict
11
12shown = 0
13
14class 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()
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.OnHistClickOnHistClick)
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
58 update_tcanvases()
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_PeriodicHistogramCheck)
169
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)
void Write(const std::shared_ptr< TMidasEvent > &evt, TMidasFile *outfile)
Insert(self, obj, parent='', objname=None, icon=None)
Definition hist_tab.py:98
__init__(self, main, frame)
Definition hist_tab.py:16
_refresh(self, name, obj)
Definition hist_tab.py:78
_find_parent(self, name, base='')
Definition hist_tab.py:83
Resort(self, parent='')
Definition hist_tab.py:187
_load_compiled_histograms(self, filename)
Definition hist_tab.py:64
_MakeHistView(self, parent)
Definition hist_tab.py:29
InsertHist(self, hist)
Definition hist_tab.py:200
AddActiveDirectory(self, tdir)
Definition hist_tab.py:36
_setup_GUI(self, frame)
Definition hist_tab.py:25
OnHistClick(self, event)
Definition hist_tab.py:41
_insert_single_nonrecursive(self, obj, parent, name, objname=None, icon=None)
Definition hist_tab.py:139
_compiled_histogram_filename(self)
Definition hist_tab.py:70