ROOT  6.07/01
Reference Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
ROOT.py
Go to the documentation of this file.
1 from __future__ import generators
2 # @(#)root/pyroot:$Id$
3 # Author: Wim Lavrijsen (WLavrijsen@lbl.gov)
4 # Created: 02/20/03
5 # Last: 03/25/15
6 
7 """PyROOT user module.
8 
9  o) install lazy ROOT class/variable lookup as appropriate
10  o) feed gSystem and gInterpreter for display updates
11  o) add readline completion (if supported by python build)
12  o) enable some ROOT/Cling style commands
13  o) handle a few special cases such as gPad, STL, etc.
14  o) execute rootlogon.py/.C scripts
15 
16 """
17 
18 __version__ = '8.0.0'
19 __author__ = 'Wim Lavrijsen (WLavrijsen@lbl.gov)'
20 
21 
22 ### system and interpreter setup ------------------------------------------------
23 import os, sys, types
24 import cppyy
25 
26 ## there's no version_info in 1.5.2
27 if sys.version[0:3] < '2.2':
28  raise ImportError( 'Python Version 2.2 or above is required.' )
29 
30 ## 2.2 has 10 instructions as default, > 2.3 has 100 ... make same
31 if sys.version[0:3] == '2.2':
32  sys.setcheckinterval( 100 )
33 
34 ## readline support, if available
35 try:
36  import rlcompleter, readline
37 
38  class RootNameCompleter( rlcompleter.Completer ):
39  def file_matches( self, text ):
40  matches = []
41  path, name = os.path.split( text )
42 
43  try:
44  for fn in os.listdir( path or os.curdir ):
45  if fn[:len(name)] == name:
46  full = os.path.join( path, fn )
47  matches.append( full )
48 
49  if os.path.isdir( full ):
50  matches += map( lambda x: os.path.join( full, x ), os.listdir( full ) )
51  except OSError:
52  pass
53 
54  return matches
55 
56  def root_global_matches( self, text, prefix = '' ):
57  gClassTable = _root.GetCppGlobal( 'gClassTable' )
58  all = [ gClassTable.At(i) for i in xrange(gClassTable.Classes()) ]
59  all += [ g.GetName() for g in _root.gROOT.GetListOfGlobals() ]
60  matches = filter( lambda x: x[:len(text)] == text, all )
61  return [prefix + x for x in matches]
62 
63  def global_matches( self, text ):
64  matches = rlcompleter.Completer.global_matches( self, text )
65  if not matches: matches = []
66  matches += self.file_matches( text )
67  return matches
68 
69  def attr_matches( self, text ):
70  matches = rlcompleter.Completer.attr_matches( self, text )
71  if not matches: matches = []
72  b = text.find('.')
73  try:
74  if 0 <= b and self.namespace[text[:b]].__name__ == 'ROOT':
75  matches += self.root_global_matches( text[b+1:], text[:b+1] )
76  except AttributeError: # not all objects have a __name__
77  pass
78  return matches
79 
80  readline.set_completer( RootNameCompleter().complete )
81  readline.set_completer_delims(
82  readline.get_completer_delims().replace( os.sep , '' ) )
83 
84  readline.parse_and_bind( 'tab: complete' )
85  readline.parse_and_bind( 'set show-all-if-ambiguous On' )
86 except:
87  # module readline typically doesn't exist on non-Unix platforms
88  pass
89 
90 ## special filter on MacOS X (warnings caused by linking that is still required)
91 if sys.platform == 'darwin':
92  import warnings
93  warnings.filterwarnings( action='ignore', category=RuntimeWarning, module='ROOT',\
94  message='class \S* already in TClassTable$' )
95 
96 ### load PyROOT C++ extension module, special case for linux and Sun ------------
97 _root = cppyy._backend
98 
99 ## convince 2.2 it's ok to use the expand function
100 if sys.version[0:3] == '2.2':
101  import copy_reg
102  copy_reg.constructor( _root._ObjectProxy__expand__ )
103 
104 ## convince inspect that PyROOT method proxies are possible drop-ins for python
105 ## methods and classes for pydoc
106 import inspect
107 
108 inspect._old_isfunction = inspect.isfunction
109 def isfunction( object ):
110  if type(object) == _root.MethodProxy and not object.im_class:
111  return True
112  return inspect._old_isfunction( object )
113 inspect.isfunction = isfunction
114 
115 inspect._old_ismethod = inspect.ismethod
116 def ismethod( object ):
117  if type(object) == _root.MethodProxy:
118  return True
119  return inspect._old_ismethod( object )
120 inspect.ismethod = ismethod
121 
122 del isfunction, ismethod
123 
124 
125 ### configuration ---------------------------------------------------------------
126 class _Configuration( object ):
127  __slots__ = [ 'IgnoreCommandLineOptions', 'StartGuiThread', 'ExposeCppMacros', '_gts' ]
128 
129  def __init__( self ):
131  self.StartGuiThread = True
132  self.ExposeCppMacros = False
133  self._gts = []
134 
135  def __setGTS( self, value ):
136  for c in value:
137  if not callable( c ):
138  raise ValueError( '"%s" is not callable' % str(c) );
139  self._gts = value
140 
141  def __getGTS( self ):
142  return self._gts
143 
144  GUIThreadScheduleOnce = property( __getGTS, __setGTS )
145 
146 PyConfig = _Configuration()
147 del _Configuration
148 
149 
150 ### choose interactive-favored policies -----------------------------------------
151 _root.SetMemoryPolicy( _root.kMemoryHeuristics )
152 _root.SetSignalPolicy( _root.kSignalSafe )
153 
154 
155 ### data ________________________________________________________________________
156 __pseudo__all__ = [ 'gROOT', 'gSystem', 'gInterpreter',
157  'AddressOf', 'MakeNullPointer', 'Template', 'std' ]
158 __all__ = [] # purposedly empty
159 
160 _orig_ehook = sys.excepthook
161 
162 ## for setting memory and speed policies; not exported
163 _memPolicyAPI = [ 'SetMemoryPolicy', 'SetOwnership', 'kMemoryHeuristics', 'kMemoryStrict' ]
164 _sigPolicyAPI = [ 'SetSignalPolicy', 'kSignalFast', 'kSignalSafe' ]
165 
166 
167 ### helpers ---------------------------------------------------------------------
168 def split( str ):
169  npos = str.find( ' ' )
170  if 0 <= npos:
171  return str[:npos], str[npos+1:]
172  else:
173  return str, ''
174 
175 
176 ### put std namespace directly onto ROOT ----------------------------------------
177 _root.std = cppyy.gbl.std
178 sys.modules['ROOT.std'] = cppyy.gbl.std
179 
180 
181 ### special cases for gPad, gVirtualX (are C++ macro's) -------------------------
182 class _ExpandMacroFunction( object ):
183  def __init__( self, klass, func ):
184  c = _root.CreateScopeProxy( klass )
185  self.func = getattr( c, func )
186 
187  def __getattr__( self, what ):
188  return getattr( self.__dict__[ 'func' ](), what )
189 
190  def __cmp__( self, other ):
191  return cmp( self.func(), other )
192 
193  def __nonzero__( self ):
194  if self.func():
195  return True
196  return False
197 
198  def __repr__( self ):
199  return repr( self.func() )
200 
201  def __str__( self ):
202  return str( self.func() )
203 
204 _root.gPad = _ExpandMacroFunction( "TVirtualPad", "Pad" )
205 _root.gVirtualX = _ExpandMacroFunction( "TVirtualX", "Instance" )
206 _root.gDirectory = _ExpandMacroFunction( "TDirectory", "CurrentDirectory" )
207 _root.gFile = _ExpandMacroFunction( "TFile", "CurrentFile" )
208 _root.gInterpreter = _ExpandMacroFunction( "TInterpreter", "Instance" )
209 
210 
211 ### special case pythonization --------------------------------------------------
212 def _TTree__iter__( self ):
213  i = 0
214  bytes_read = self.GetEntry(i)
215  while 0 < bytes_read:
216  yield self # TODO: not sure how to do this w/ C-API ...
217  i += 1
218  bytes_read = self.GetEntry(i)
219 
220  if bytes_read == -1:
221  raise RuntimeError( "TTree I/O error" )
222 
223 _root.CreateScopeProxy( "TTree" ).__iter__ = _TTree__iter__
224 
225 
226 ### RINT command emulation ------------------------------------------------------
227 def _excepthook( exctype, value, traceb ):
228  # catch syntax errors only (they contain the full line)
229  if isinstance( value, SyntaxError ) and value.text:
230  cmd, arg = split( value.text[:-1] )
231 
232  # mimic ROOT/Cling commands
233  if cmd == '.q':
234  sys.exit( 0 )
235  elif cmd == '.?' or cmd == '.help':
236  sys.stdout.write( """PyROOT emulation of Cling commands.
237 All emulated commands must be preceded by a . (dot).
238 ===========================================================================
239 Help: ? : this help
240  help : this help
241 Shell: ![shell] : execute shell command
242 Evaluation: x [file] : load [file] and evaluate {statements} in the file
243 Load/Unload: L [lib] : load [lib]
244 Quit: q : quit python session
245 
246 The standard python help system is available through a call to 'help()' or
247 'help(<id>)' where <id> is an identifier, e.g. a class or function such as
248 TPad or TPad.cd, etc.
249 """ )
250  return
251  elif cmd == '.!' and arg:
252  return os.system( arg )
253  elif cmd == '.x' and arg:
254  import __main__
255  fn = os.path.expanduser( os.path.expandvars( arg ) )
256  execfile( fn, __main__.__dict__, __main__.__dict__ )
257  return
258  elif cmd == '.L':
259  return _root.gSystem.Load( arg )
260  elif cmd == '.cd' and arg:
261  os.chdir( arg )
262  return
263  elif cmd == '.ls':
264  return sys.modules[ __name__ ].gDirectory.ls()
265  elif cmd == '.pwd':
266  return sys.modules[ __name__ ].gDirectory.pwd()
267  elif isinstance( value, SyntaxError ) and \
268  value.msg == "can't assign to function call":
269  sys.stdout.write( """Are you trying to assign a value to a reference return, for example to the
270 result of a call to "double& SMatrix<>::operator()(int,int)"? If so, then
271 please use operator[] instead, as in e.g. "mymatrix[i][j] = somevalue".
272 """ )
273 
274  # normal exception processing
275  _orig_ehook( exctype, value, traceb )
276 
277 if not '__IPYTHON__' in __builtins__:
278  # IPython has its own ways of executing shell commands etc.
279  sys.excepthook = _excepthook
280 
281 
282 ### call EndOfLineAction after each interactive command (to update display etc.)
283 _orig_dhook = sys.displayhook
284 def _displayhook( v ):
285  _root.gInterpreter.EndOfLineAction()
286  return _orig_dhook( v )
287 
288 
289 ### set import hook to be able to trigger auto-loading as appropriate
290 try:
291  import __builtin__
292 except ImportError:
293  import builtins as __builtin__ # name change in p3
294 _orig_ihook = __builtin__.__import__
295 def _importhook( name, *args, **kwds ):
296  if name[0:5] == 'ROOT.':
297  try:
298  sys.modules[ name ] = getattr( sys.modules[ 'ROOT' ], name[5:] )
299  except Exception:
300  pass
301  return _orig_ihook( name, *args, **kwds )
302 
303 __builtin__.__import__ = _importhook
304 
305 
306 ### helper to prevent GUIs from starving
307 def _processRootEvents( controller ):
308  import time
309  gSystemProcessEvents = _root.gSystem.ProcessEvents
310 
311  if sys.platform == 'win32':
312  import thread
313  _root.gROOT.ProcessLineSync('((TGWin32 *)gVirtualX)->SetUserThreadId(%ld)' % (thread.get_ident()))
314 
315  while controller.keeppolling:
316  try:
317  gSystemProcessEvents()
318  if PyConfig.GUIThreadScheduleOnce:
319  for guicall in PyConfig.GUIThreadScheduleOnce:
320  guicall()
321  PyConfig.GUIThreadScheduleOnce = []
322  time.sleep( 0.01 )
323  except: # in case gSystem gets destroyed early on exit
324  pass
325 
326 
327 ### allow loading ROOT classes as attributes ------------------------------------
328 class ModuleFacade( types.ModuleType ):
329  def __init__( self, module ):
330  types.ModuleType.__init__( self, 'ROOT' )
331 
332  self.__dict__[ 'module' ] = module
333 
334  self.__dict__[ '__doc__' ] = self.module.__doc__
335  self.__dict__[ '__name__' ] = self.module.__name__
336  self.__dict__[ '__file__' ] = self.module.__file__
337 
338  self.__dict__[ 'keeppolling' ] = 0
339  self.__dict__[ 'PyConfig' ] = self.module.PyConfig
340 
341  class gROOTWrapper( object ):
342  def __init__( self, gROOT, master ):
343  self.__dict__[ '_master' ] = master
344  self.__dict__[ '_gROOT' ] = gROOT
345 
346  def __getattr__( self, name ):
347  if name != 'SetBatch' and self._master.__dict__[ 'gROOT' ] != self._gROOT:
348  self._master._ModuleFacade__finalSetup()
349  del self._master.__class__._ModuleFacade__finalSetup
350  return getattr( self._gROOT, name )
351 
352  def __setattr__( self, name, value ):
353  return setattr( self._gROOT, name, value )
354 
355  self.__dict__[ 'gROOT' ] = gROOTWrapper( _root.gROOT, self )
356  del gROOTWrapper
357 
358  # begin with startup gettattr/setattr
359  self.__class__.__getattr__ = self.__class__.__getattr1
360  del self.__class__.__getattr1
361  self.__class__.__setattr__ = self.__class__.__setattr1
362  del self.__class__.__setattr1
363 
364  def __setattr1( self, name, value ): # "start-up" setattr
365  # create application, thread etc.
366  self.__finalSetup()
367  del self.__class__.__finalSetup
368 
369  # let "running" setattr handle setting
370  return setattr( self, name, value )
371 
372  def __setattr2( self, name, value ): # "running" getattr
373  # to allow assignments to ROOT globals such as ROOT.gDebug
374  if not name in self.__dict__:
375  try:
376  # assignment to an existing ROOT global (establishes proxy)
377  setattr( self.__class__, name, _root.GetCppGlobal( name ) )
378  except LookupError:
379  # allow a few limited cases where new globals can be set
380  if sys.hexversion >= 0x3000000:
381  pylong = int
382  else:
383  pylong = long
384  tcnv = { bool : 'bool %s = %d;',
385  int : 'int %s = %d;',
386  pylong : 'long %s = %d;',
387  float : 'double %s = %f;',
388  str : 'string %s = "%s";' }
389  try:
390  _root.gROOT.ProcessLine( tcnv[ type(value) ] % (name,value) );
391  setattr( self.__class__, name, _root.GetCppGlobal( name ) )
392  except KeyError:
393  pass # can still assign normally, to the module
394 
395  # actual assignment through descriptor, or normal python way
396  return super( self.__class__, self ).__setattr__( name, value )
397 
398  def __getattr1( self, name ): # "start-up" getattr
399  # special case, to allow "from ROOT import gROOT" w/o starting GUI thread
400  if name == '__path__':
401  raise AttributeError( name )
402 
403  # create application, thread etc.
404  self.__finalSetup()
405  del self.__class__.__finalSetup
406 
407  # let "running" getattr handle lookup
408  return getattr( self, name )
409 
410  def __getattr2( self, name ): # "running" getattr
411  # handle "from ROOT import *" ... can be called multiple times
412  if name == '__all__':
413  if '__IPYTHON__' in __builtins__:
414  import warnings
415  warnings.warn( '"from ROOT import *" is not supported under IPython' )
416  # continue anyway, just in case it works ...
417 
418  caller = sys.modules[ sys._getframe( 1 ).f_globals[ '__name__' ] ]
419 
420  # we may be calling in from __getattr1, verify and if so, go one frame up
421  if caller == self:
422  caller = sys.modules[ sys._getframe( 2 ).f_globals[ '__name__' ] ]
423 
424  # setup the pre-defined globals
425  for name in self.module.__pseudo__all__:
426  caller.__dict__[ name ] = getattr( _root, name )
427 
428  # install the hook
429  _root.SetRootLazyLookup( caller.__dict__ )
430 
431  # return empty list, to prevent further copying
432  return self.module.__all__
433 
434  # lookup into ROOT (which may cause python-side enum/class/global creation)
435  try:
436  attr = _root.LookupCppEntity( name, PyConfig.ExposeCppMacros )
437  if type(attr) == _root.PropertyProxy:
438  setattr( self.__class__, name, attr ) # descriptor
439  return getattr( self, name )
440  else:
441  self.__dict__[ name ] = attr # normal member
442  return attr
443  except AttributeError:
444  pass
445 
446  # reaching this point means failure ...
447  raise AttributeError( name )
448 
449  def __delattr__( self, name ):
450  # this is for convenience, as typically lookup results are kept at two places
451  try:
452  delattr( self.module._root, name )
453  except AttributeError:
454  pass
455 
456  return super( self.__class__, self ).__delattr__( name )
457 
458  def __finalSetup( self ):
459  # prevent this method from being re-entered through the gROOT wrapper
460  self.__dict__[ 'gROOT' ] = _root.gROOT
461 
462  # switch to running gettattr/setattr
463  self.__class__.__getattr__ = self.__class__.__getattr2
464  del self.__class__.__getattr2
465  self.__class__.__setattr__ = self.__class__.__setattr2
466  del self.__class__.__setattr2
467 
468  # normally, you'll want a ROOT application; don't init any further if
469  # one pre-exists from some C++ code somewhere
470  hasargv = hasattr( sys, 'argv' )
471  if hasargv and PyConfig.IgnoreCommandLineOptions:
472  argv = sys.argv
473  sys.argv = []
474 
475  appc = _root.CreateScopeProxy( 'PyROOT::TPyROOTApplication' )
476  if appc.CreatePyROOTApplication():
477  appc.InitROOTGlobals()
478  # TODO Cling equivalent needed: appc.InitCINTMessageCallback();
479  appc.InitROOTMessageCallback();
480 
481  if hasargv and PyConfig.IgnoreCommandLineOptions:
482  sys.argv = argv
483 
484  # must be called after gApplication creation:
485  if '__IPYTHON__' in __builtins__:
486  # IPython's FakeModule hack otherwise prevents usage of python from Cling (TODO: verify necessity)
487  _root.gROOT.ProcessLine( 'TPython::Exec( "" );' )
488  sys.modules[ '__main__' ].__builtins__ = __builtins__
489 
490  # special case for cout (backwards compatibility)
491  if hasattr( cppyy.gbl.std, '__1' ):
492  attr_1 = getattr( cppyy.gbl.std, '__1' )
493  if hasattr( attr_1, 'cout' ):
494  self.__dict__[ 'cout' ] = attr_1.cout
495 
496  # custom logon file (must be after creation of ROOT globals)
497  if hasargv and not '-n' in sys.argv:
498  rootlogon = os.path.expanduser( '~/.rootlogon.py' )
499  if os.path.exists( rootlogon ):
500  # could also have used execfile, but import is likely to give fewer surprises
501  import imp
502  imp.load_module( 'rootlogon', open( rootlogon, 'r' ), rootlogon, ('.py','r',1) )
503  del imp
504  else: # if the .py version of rootlogon exists, the .C is ignored (the user can
505  # load the .C from the .py, if so desired)
506 
507  # system logon, user logon, and local logon (skip Rint.Logon)
508  name = '.rootlogon.C'
509  logons = [ os.path.join( str(self.gRootDir), 'etc', 'system' + name ),
510  os.path.expanduser( os.path.join( '~', name ) ) ]
511  if logons[-1] != os.path.join( os.getcwd(), name ):
512  logons.append( name )
513  for rootlogon in logons:
514  if os.path.exists( rootlogon ):
515  appc.ExecuteFile( rootlogon )
516  del rootlogon, logons
517 
518  # use either the input hook or thread to send events to GUIs
519  if self.PyConfig.StartGuiThread and \
520  not ( self.keeppolling or _root.gROOT.IsBatch() ):
521  if self.PyConfig.StartGuiThread == 'inputhook' or\
522  _root.gSystem.InheritsFrom( 'TMacOSXSystem' ):
523  # new, PyOS_InputHook based mechanism
524  if PyConfig.GUIThreadScheduleOnce:
525  for guicall in PyConfig.GUIThreadScheduleOnce:
526  guicall()
527  PyConfig.GUIThreadScheduleOnce = []
528  _root.InstallGUIEventInputHook()
529  else:
530  # original, threading based approach
531  import threading
532  self.__dict__[ 'keeppolling' ] = 1
533  self.__dict__[ 'PyGUIThread' ] = \
534  threading.Thread( None, _processRootEvents, None, ( self, ) )
535 
536  def _finishSchedule( ROOT = self ):
537  import threading
538  if threading.currentThread() != self.PyGUIThread:
539  while self.PyConfig.GUIThreadScheduleOnce:
540  self.PyGUIThread.join( 0.1 )
541 
542  self.PyGUIThread.finishSchedule = _finishSchedule
543  self.PyGUIThread.setDaemon( 1 )
544  self.PyGUIThread.start()
545 
546  # store already available ROOT objects to prevent spurious lookups
547  for name in self.module.__pseudo__all__ + _memPolicyAPI + _sigPolicyAPI:
548  self.__dict__[ name ] = getattr( _root, name )
549 
550  # the macro NULL is not available from Cling globals, but might be useful
551  setattr( _root, 'NULL', 0 )
552 
553  for name in cppyy.gbl.std.stlclasses:
554  setattr( _root, name, getattr( cppyy.gbl.std, name ) )
555 
556  # set the display hook
557  sys.displayhook = _displayhook
558 
559  # manually load libMathCore, for example to obtain gRandom
560  # This can be removed once autoloading on selected variables is available
561  _root.gSystem.Load( "libMathCore" )
562 
563 sys.modules[ __name__ ] = ModuleFacade( sys.modules[ __name__ ] )
564 del ModuleFacade
565 
566 ### Add some infrastructure if we are in a Jupiter Notebook ---------------------
567 # We check if the ZMQ shell is in use, which is a sign of usage in the notebook.
568 if '__IPYTHON__' in __builtins__ and __IPYTHON__:
569  from IPython import get_ipython
570  pre_execute_callbacks = get_ipython().events.callbacks['pre_execute']
571  zmqIshellName = 'ZMQInteractiveShell'
572  if any(zmqIshellName == callBack.im_class.__name__ for callBack in pre_execute_callbacks if hasattr(callBack, 'im_class')):
573  import JupyROOT
574 
575 ### b/c of circular references, the facade needs explicit cleanup ---------------
576 import atexit
577 def cleanup():
578  # save for later
579  isCocoa = _root.gSystem.InheritsFrom( 'TMacOSXSystem' )
580 
581  # restore hooks
582  import sys
583  sys.displayhook = sys.__displayhook__
584  if not '__IPYTHON__' in __builtins__:
585  sys.excepthook = sys.__excepthook__
586  __builtin__.__import__ = _orig_ihook
587 
588  facade = sys.modules[ __name__ ]
589 
590  # shutdown GUI thread, as appropriate (always save to call)
591  _root.RemoveGUIEventInputHook()
592 
593  # prevent further spurious lookups into ROOT libraries
594  del facade.__class__.__getattr__
595  del facade.__class__.__setattr__
596 
597  # shutdown GUI thread, as appropriate
598  if hasattr( facade, 'PyGUIThread' ):
599  facade.keeppolling = 0
600 
601  # if not shutdown from GUI (often the case), wait for it
602  import threading
603  if threading.currentThread() != facade.PyGUIThread:
604  facade.PyGUIThread.join( 3. ) # arbitrary
605  del threading
606 
607  # remove otherwise (potentially) circular references
608  import types
609  items = facade.module.__dict__.items()
610  for k, v in items:
611  if type(v) == types.ModuleType:
612  facade.module.__dict__[ k ] = None
613  del v, k, items, types
614 
615  # destroy facade
616  facade.__dict__.clear()
617  del facade
618 
619  # run part the gROOT shutdown sequence ... running it here ensures that
620  # it is done before any ROOT libraries are off-loaded, with unspecified
621  # order of static object destruction;
622  gROOT = sys.modules[ 'libPyROOT' ].gROOT
623  gROOT.EndOfProcessCleanups()
624  del gROOT
625 
626  # cleanup cached python strings
627  sys.modules[ 'libPyROOT' ]._DestroyPyStrings()
628 
629  # destroy ROOT extension module and ROOT module
630  del sys.modules[ 'libPyROOT' ]
631  del sys.modules[ 'ROOT' ]
632 
633 atexit.register( cleanup )
634 del cleanup, atexit
def _TTree__iter__
Definition: ROOT.py:212
allow loading ROOT classes as attributes ---------------------------------—
Definition: ROOT.py:328
def _processRootEvents
helper to prevent GUIs from starving
Definition: ROOT.py:307
def __delattr__
Definition: ROOT.py:449
def split
helpers ------------------------------------------------------------------—
Definition: ROOT.py:168
configuration ------------------------------------------------------------—
Definition: ROOT.py:126
def cleanup
Definition: ROOT.py:577
def _excepthook
RINT command emulation ---------------------------------------------------—.
Definition: ROOT.py:227
def _importhook
Definition: ROOT.py:295
_orig_ihook
Definition: ROOT.py:294
def _displayhook
Definition: ROOT.py:284
def __setattr2
Definition: ROOT.py:372
def __getattr2
Definition: ROOT.py:410
def __finalSetup
Definition: ROOT.py:458
int type
Definition: TGX11.cxx:120
_orig_dhook
call EndOfLineAction after each interactive command (to update display etc.)
Definition: ROOT.py:283
def root_global_matches
Definition: ROOT.py:56
_orig_ehook
Definition: ROOT.py:160
def __setattr1
Definition: ROOT.py:364
def isfunction
Definition: ROOT.py:109
put std namespace directly onto ROOT ----------------------------------——
Definition: ROOT.py:182
def ismethod
Definition: ROOT.py:116
def __getattr1
Definition: ROOT.py:398