reformatted DamarisGUI.py to make it better readable

This commit is contained in:
Markus Rosenstihl 2014-11-26 13:31:28 +00:00
parent aed38c1c89
commit 7aeb010a83

View File

@ -18,15 +18,19 @@ import xdg.BaseDirectory
# import 3rd party modules # import 3rd party modules
# gui graphics # gui graphics
import gobject import gobject
gobject.threads_init( ) gobject.threads_init( )
import pygtk import pygtk
pygtk.require( "2.0" ) pygtk.require( "2.0" )
import gtk import gtk
gtk_version_missmatch = gtk.check_version( 2, 8, 0 ) gtk_version_missmatch = gtk.check_version( 2, 8, 0 )
if gtk_version_missmatch: if gtk_version_missmatch:
raise Exception( "insufficient gtk version: " + gtk_version_missmatch ) raise Exception( "insufficient gtk version: " + gtk_version_missmatch )
import gtk.gdk import gtk.gdk
gtk.gdk.threads_init( ) gtk.gdk.threads_init( )
import gtk.glade import gtk.glade
@ -46,13 +50,16 @@ matplotlib.rcParams["axes.formatter.limits"]="-3,3"
if matplotlib.rcParams[ "backend" ] == "GTK": if matplotlib.rcParams[ "backend" ] == "GTK":
from matplotlib.backends.backend_gtk import FigureCanvasGTK as FigureCanvas from matplotlib.backends.backend_gtk import FigureCanvasGTK as FigureCanvas
max_points_to_display = 0 # no limit max_points_to_display = 0 # no limit
elif matplotlib.rcParams[ "backend" ] == "GTKCairo": elif matplotlib.rcParams[ "backend" ] == "GTKCairo":
from matplotlib.backends.backend_gtkcairo import FigureCanvasGTKCairo as FigureCanvas from matplotlib.backends.backend_gtkcairo import FigureCanvasGTKCairo as FigureCanvas
max_points_to_display = 1 << 14 # cairo cannot render longer paths than 18??? max_points_to_display = 1 << 14 # cairo cannot render longer paths than 18???
else: else:
# default # default
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
max_points_to_display = 0 max_points_to_display = 0
import matplotlib.axes import matplotlib.axes
@ -75,6 +82,7 @@ debug=False
# version info # version info
__version__ = "0.14-svn-$Revision$" __version__ = "0.14-svn-$Revision$"
class logstream: class logstream:
gui_log = None gui_log = None
text_log = sys.__stdout__ text_log = sys.__stdout__
@ -93,6 +101,7 @@ class logstream:
def __del__( self ): def __del__( self ):
pass pass
global log global log
log = logstream( ) log = logstream( )
sys.stdout = log sys.stdout = log
@ -105,8 +114,8 @@ ExperimentWriter.log=log
BackendDriver.log = log BackendDriver.log = log
DataPool.log = log DataPool.log = log
class DamarisGUI:
class DamarisGUI:
ExpScript_Display = 0 ExpScript_Display = 0
ResScript_Display = 1 ResScript_Display = 1
Monitor_Display = 2 Monitor_Display = 2
@ -120,8 +129,6 @@ class DamarisGUI:
Quit_State = 4 Quit_State = 4
def __init__( self, exp_script_filename=None, res_script_filename=None ): def __init__( self, exp_script_filename=None, res_script_filename=None ):
# state: edit, run, stop, quit # state: edit, run, stop, quit
# state transitions: # state transitions:
# edit -> run|quit # edit -> run|quit
@ -486,7 +493,8 @@ class DamarisGUI:
self.backend_statusbar_label.set_text( b_text ) self.backend_statusbar_label.set_text( b_text )
gtk.gdk.threads_leave( ) gtk.gdk.threads_leave( )
still_running=filter(None,[self.si.exp_handling, self.si.res_handling, self.si.back_driver, self.dump_thread]) still_running = filter( None,
[ self.si.exp_handling, self.si.res_handling, self.si.back_driver, self.dump_thread ] )
if len( still_running ) == 0: if len( still_running ) == 0:
if self.save_thread is None and self.dump_filename != "": if self.save_thread is None and self.dump_filename != "":
print "all subprocesses ended, saving data pool" print "all subprocesses ended, saving data pool"
@ -634,7 +642,8 @@ class DamarisGUI:
try: try:
while len( dir_stack ): while len( dir_stack ):
dir_trunk = os.path.join( dir_trunk, dir_stack.pop( ) ) dir_trunk = os.path.join( dir_trunk, dir_stack.pop( ) )
if os.path.isdir(dir_trunk): continue if os.path.isdir( dir_trunk ):
continue
os.mkdir( dir_trunk ) os.mkdir( dir_trunk )
except OSError, e: except OSError, e:
print e print e
@ -659,7 +668,8 @@ class DamarisGUI:
timeline_tablecols = numpy.recarray( 0, dtype=([ ("time", "S17"), timeline_tablecols = numpy.recarray( 0, dtype=([ ("time", "S17"),
("experiments", "int64"), ("experiments", "int64"),
("results", "int64") ]) ) ("results", "int64") ]) )
timeline_table=dump_file.createTable("/","timeline", timeline_tablecols, title="Timeline of Experiment") timeline_table = dump_file.createTable( "/", "timeline", timeline_tablecols,
title="Timeline of Experiment" )
if tables.__version__[ 0 ] == "1": if tables.__version__[ 0 ] == "1":
logarray = dump_file.createVLArray( where=dump_file.root, logarray = dump_file.createVLArray( where=dump_file.root,
name="log", name="log",
@ -723,7 +733,8 @@ class DamarisGUI:
logtext_end = logtextbuffer.get_end_iter( ) logtext_end = logtextbuffer.get_end_iter( )
logtextbuffer.move_mark( last_end, logtext_end ) logtextbuffer.move_mark( last_end, logtext_end )
# recode from unicode # recode from unicode
logtext=codecs.getencoder("iso-8859-15")(logtextbuffer.get_text(logtext_start , logtext_end),"replace")[0] logtext = codecs.getencoder( "iso-8859-15" )( logtextbuffer.get_text( logtext_start, logtext_end ), "replace" )[
0 ]
# avoid circular references (seems to be necessary with gtk-2.12) # avoid circular references (seems to be necessary with gtk-2.12)
del logtextbuffer, logtext_start, logtext_end, last_end del logtextbuffer, logtext_start, logtext_end, last_end
for l in logtext.splitlines( ): for l in logtext.splitlines( ):
@ -740,11 +751,14 @@ class DamarisGUI:
""" """
pause experiment execution (that means delay backend and let others run) pause experiment execution (that means delay backend and let others run)
""" """
if self.si is None: return False if self.si is None:
return False
pause_state = self.toolbar_pause_button.get_active( ) pause_state = self.toolbar_pause_button.get_active( )
if pause_state: if pause_state:
if self.state!=DamarisGUI.Run_State: return False if self.state != DamarisGUI.Run_State:
if self.spool_dir is None: return False return False
if self.spool_dir is None:
return False
no = self.si.data.get( "__recentresult", -1 ) + 1 no = self.si.data.get( "__recentresult", -1 ) + 1
result_pattern = os.path.join( self.spool_dir, "job.%09d.result" ) result_pattern = os.path.join( self.spool_dir, "job.%09d.result" )
job_pattern = os.path.join( self.spool_dir, "job.%09d" ) job_pattern = os.path.join( self.spool_dir, "job.%09d" )
@ -761,7 +775,8 @@ class DamarisGUI:
self.backend_statusbar_label.set_text( "Backend Paused" ) self.backend_statusbar_label.set_text( "Backend Paused" )
else: else:
if self.state!=DamarisGUI.Pause_State: return False if self.state != DamarisGUI.Pause_State:
return False
self.state = DamarisGUI.Run_State self.state = DamarisGUI.Run_State
for f in self.pause_files: for f in self.pause_files:
os.rename( f, f[ :-6 ] ) os.rename( f, f[ :-6 ] )
@ -770,7 +785,8 @@ class DamarisGUI:
def stop_experiment( self, widget, data=None ): def stop_experiment( self, widget, data=None ):
if self.state in [ DamarisGUI.Run_State, DamarisGUI.Pause_State ]: if self.state in [ DamarisGUI.Run_State, DamarisGUI.Pause_State ]:
if self.si is None: return if self.si is None:
return
still_running = filter( None, [ self.si.exp_handling, self.si.res_handling, self.si.back_driver ] ) still_running = filter( None, [ self.si.exp_handling, self.si.res_handling, self.si.back_driver ] )
for r in still_running: for r in still_running:
r.quit_flag.set( ) r.quit_flag.set( )
@ -836,7 +852,8 @@ class DamarisGUI:
} }
if os.path.isdir( "/usr/share/doc/python%d.%d-doc/html" % (sys.version_info[ :2 ]) ): if os.path.isdir( "/usr/share/doc/python%d.%d-doc/html" % (sys.version_info[ :2 ]) ):
self.doc_urls["Python"]="file:///usr/share/doc/python%d.%d-doc/html/index.html"%(sys.version_info[:2]) self.doc_urls[ "Python" ] = "file:///usr/share/doc/python%d.%d-doc/html/index.html" % (
sys.version_info[ :2 ])
if os.path.isdir( "/usr/share/doc/python-tables-doc/html" ): if os.path.isdir( "/usr/share/doc/python-tables-doc/html" ):
self.doc_urls[ "pytables" ] = "file:///usr/share/doc/python-tables-doc/html/index.html" self.doc_urls[ "pytables" ] = "file:///usr/share/doc/python-tables-doc/html/index.html"
@ -847,7 +864,8 @@ class DamarisGUI:
for i in xrange( 5 ): for i in xrange( 5 ):
installation_base = os.path.dirname( installation_base ) installation_base = os.path.dirname( installation_base )
if os.path.isfile( os.path.join( installation_base, "share", "python-damaris", "doc", "index.html" ) ): if os.path.isfile( os.path.join( installation_base, "share", "python-damaris", "doc", "index.html" ) ):
self.doc_urls["Python DAMARIS"]=os.path.join(installation_base, "share", "python-damaris", "doc", "index.html") self.doc_urls[ "Python DAMARIS" ] = os.path.join( installation_base, "share", "python-damaris", "doc",
"index.html" )
elif os.path.isfile( "/usr/share/doc/python-damaris/html/index.html" ): elif os.path.isfile( "/usr/share/doc/python-damaris/html/index.html" ):
# check generic debian location # check generic debian location
self.doc_urls[ "Python DAMARIS" ] = "file:///usr/share/doc/python-damaris/html/index.html" self.doc_urls[ "Python DAMARIS" ] = "file:///usr/share/doc/python-damaris/html/index.html"
@ -884,8 +902,8 @@ class DamarisGUI:
show_manual = show_doc_menu show_manual = show_doc_menu
class start_browser(threading.Thread):
class start_browser( threading.Thread ):
def __init__( self, url ): def __init__( self, url ):
threading.Thread.__init__( self, name="manual browser" ) threading.Thread.__init__( self, name="manual browser" )
self.my_webbrowser = None self.my_webbrowser = None
@ -916,6 +934,7 @@ class start_browser(threading.Thread):
"import webbrowser\nwebbrowser.open('%s')" % self.start_url ) "import webbrowser\nwebbrowser.open('%s')" % self.start_url )
return True return True
class LogWindow: class LogWindow:
""" """
writes messages to the log window writes messages to the log window
@ -952,8 +971,8 @@ class LogWindow:
self.logstream.gui_log = None self.logstream.gui_log = None
self.logstream = None self.logstream = None
class ScriptWidgets:
class ScriptWidgets:
def __init__( self, xml_gui ): def __init__( self, xml_gui ):
""" """
initialize text widgets with text initialize text widgets with text
@ -1129,10 +1148,12 @@ class ScriptWidgets:
# text widget related events # text widget related events
def check_script( self, widget, data=None ): def check_script( self, widget, data=None ):
if not self.editing_state: return 0 if not self.editing_state:
return 0
current_page = self.main_notebook.get_current_page( ) current_page = self.main_notebook.get_current_page( )
if not current_page in [0,1]: return 0 if not current_page in [ 0, 1 ]:
return 0
script = self.get_scripts( )[ current_page ] script = self.get_scripts( )[ current_page ]
try: try:
compile( script, ("Experiment Script", "Result Script")[ current_page ], "exec" ) compile( script, ("Experiment Script", "Result Script")[ current_page ], "exec" )
@ -1151,7 +1172,8 @@ class ScriptWidgets:
ln = 0 ln = 0
if type( lo ) is not types.IntType: if type( lo ) is not types.IntType:
lo = 0 lo = 0
print "Syntax Error:\n%s in %s at line %d, offset %d"%(str(se), se.filename, ln, lo)+"\n(ToDo: Dialog)" print "Syntax Error:\n%s in %s at line %d, offset %d" % (
str( se ), se.filename, ln, lo) + "\n(ToDo: Dialog)"
if ln > 0 and ln <= tb.get_line_count( ): if ln > 0 and ln <= tb.get_line_count( ):
new_place = tb.get_iter_at_line_offset( ln - 1, 0 ) new_place = tb.get_iter_at_line_offset( ln - 1, 0 )
if lo > 0 and lo <= new_place.get_chars_in_line( ): if lo > 0 and lo <= new_place.get_chars_in_line( ):
@ -1276,7 +1298,8 @@ class ScriptWidgets:
if (event.keyval == 0xFF09 or event.keyval == 0xFF08): if (event.keyval == 0xFF09 or event.keyval == 0xFF08):
textbuffer = widget.get_buffer( ) textbuffer = widget.get_buffer( )
# do not do things during selection # do not do things during selection
if (textbuffer.get_selection_bounds()): return 0 if (textbuffer.get_selection_bounds( )):
return 0
cursor_mark = textbuffer.get_insert( ) cursor_mark = textbuffer.get_insert( )
cursor_iter = textbuffer.get_iter_at_mark( cursor_mark ) cursor_iter = textbuffer.get_iter_at_mark( cursor_mark )
if (cursor_iter.starts_line( )): if (cursor_iter.starts_line( )):
@ -1315,7 +1338,8 @@ class ScriptWidgets:
elif (event.keyval == 0xFF0D): elif (event.keyval == 0xFF0D):
textbuffer = widget.get_buffer( ) textbuffer = widget.get_buffer( )
# do not do things during selection # do not do things during selection
if (textbuffer.get_selection_bounds()): return 0 if (textbuffer.get_selection_bounds( )):
return 0
cursor_mark = textbuffer.get_insert( ) cursor_mark = textbuffer.get_insert( )
cursor_iter = textbuffer.get_iter_at_mark( cursor_mark ) cursor_iter = textbuffer.get_iter_at_mark( cursor_mark )
# determine this line's indent count # determine this line's indent count
@ -1336,7 +1360,8 @@ class ScriptWidgets:
# find last char before cursor # find last char before cursor
lastchar_iter = cursor_iter.copy( ) lastchar_iter = cursor_iter.copy( )
lastchar_iter.backward_char( ) lastchar_iter.backward_char( )
if (lastchar_iter.get_char()==u":"): indent_length+=4 if (lastchar_iter.get_char( ) == u":"):
indent_length += 4
# now find indent of next line... # now find indent of next line...
textbuffer.insert( cursor_iter, u'\n' + (u' ' * indent_length) ) textbuffer.insert( cursor_iter, u'\n' + (u' ' * indent_length) )
widget.scroll_to_mark( cursor_mark, 0.0, 0 ) widget.scroll_to_mark( cursor_mark, 0.0, 0 )
@ -1359,7 +1384,8 @@ class ScriptWidgets:
do the open file dialog, if necessary ask for save do the open file dialog, if necessary ask for save
""" """
# ignore # ignore
if not self.editing_state: return 0 if not self.editing_state:
return 0
# Determining the tab which is currently open # Determining the tab which is currently open
current_page = self.main_notebook.get_current_page( ) current_page = self.main_notebook.get_current_page( )
@ -1421,7 +1447,8 @@ class ScriptWidgets:
save file to associated filename save file to associated filename
""" """
# ignore # ignore
if not self.editing_state: return 0 if not self.editing_state:
return 0
# Determining the tab which is currently open # Determining the tab which is currently open
current_page = self.main_notebook.get_current_page( ) current_page = self.main_notebook.get_current_page( )
@ -1432,7 +1459,8 @@ class ScriptWidgets:
else: else:
return 0 return 0
if filename is None: return 0 if filename is None:
return 0
# save file # save file
if current_page == 0: if current_page == 0:
@ -1488,7 +1516,8 @@ class ScriptWidgets:
dialog = gtk.FileChooserDialog( title=dialog_title, dialog = gtk.FileChooserDialog( title=dialog_title,
parent=parent_window, parent=parent_window,
action=gtk.FILE_CHOOSER_ACTION_SAVE, action=gtk.FILE_CHOOSER_ACTION_SAVE,
buttons = (gtk.STOCK_SAVE, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) buttons=(
gtk.STOCK_SAVE, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) )
dialog.set_default_response( gtk.RESPONSE_OK ) dialog.set_default_response( gtk.RESPONSE_OK )
dialog.set_select_multiple( False ) dialog.set_select_multiple( False )
@ -1522,7 +1551,8 @@ class ScriptWidgets:
def new_file( self, widget, Data=None ): def new_file( self, widget, Data=None ):
if not self.editing_state: return 0 if not self.editing_state:
return 0
current_page = self.main_notebook.get_current_page( ) current_page = self.main_notebook.get_current_page( )
if current_page == 0: if current_page == 0:
if self.experiment_script_textbuffer.get_modified( ): if self.experiment_script_textbuffer.get_modified( ):
@ -1613,6 +1643,7 @@ class ScriptWidgets:
if not (i < end and iter.next_line( )): if not (i < end and iter.next_line( )):
break break
class ConfigTab: class ConfigTab:
""" """
by now all values are saved in the GUI widgets by now all values are saved in the GUI widgets
@ -1633,10 +1664,13 @@ class ConfigTab:
self.config_start_backend_checkbutton = self.xml_gui.get_widget( "start_backend_checkbutton" ) self.config_start_backend_checkbutton = self.xml_gui.get_widget( "start_backend_checkbutton" )
self.config_backend_executable_entry = self.xml_gui.get_widget( "backend_executable_entry" ) self.config_backend_executable_entry = self.xml_gui.get_widget( "backend_executable_entry" )
self.config_spool_dir_entry = self.xml_gui.get_widget( "spool_dir_entry" ) self.config_spool_dir_entry = self.xml_gui.get_widget( "spool_dir_entry" )
self.config_start_experiment_script_checkbutton=self.xml_gui.get_widget("start_experiment_script_checkbutton") self.config_start_experiment_script_checkbutton = self.xml_gui.get_widget(
"start_experiment_script_checkbutton" )
self.config_start_result_script_checkbutton = self.xml_gui.get_widget( "start_result_script_checkbutton" ) self.config_start_result_script_checkbutton = self.xml_gui.get_widget( "start_result_script_checkbutton" )
self.config_del_results_after_processing_checkbutton=self.xml_gui.get_widget("del_results_after_processing_checkbutton") self.config_del_results_after_processing_checkbutton = self.xml_gui.get_widget(
self.config_del_jobs_after_execution_checkbutton=self.xml_gui.get_widget("del_jobs_after_execution_checkbutton") "del_results_after_processing_checkbutton" )
self.config_del_jobs_after_execution_checkbutton = self.xml_gui.get_widget(
"del_jobs_after_execution_checkbutton" )
self.config_data_pool_name_entry = self.xml_gui.get_widget( "data_pool_name_entry" ) self.config_data_pool_name_entry = self.xml_gui.get_widget( "data_pool_name_entry" )
self.config_data_pool_write_interval_entry = self.xml_gui.get_widget( "data_pool_write_interval_entry" ) self.config_data_pool_write_interval_entry = self.xml_gui.get_widget( "data_pool_write_interval_entry" )
self.config_data_pool_complib = self.xml_gui.get_widget( "CompLibs" ) self.config_data_pool_complib = self.xml_gui.get_widget( "CompLibs" )
@ -1967,8 +2001,8 @@ pygobject version %(pygobject)s
configfile.write( " <config key='%s' type='%s'>%s</config>\n" % (k, typename, val) ) configfile.write( " <config key='%s' type='%s'>%s</config>\n" % (k, typename, val) )
configfile.write( "</damaris>\n" ) configfile.write( "</damaris>\n" )
class MonitorWidgets:
class MonitorWidgets:
def __init__( self, xml_gui ): def __init__( self, xml_gui ):
""" """
initialize matplotlib widgets and stuff around initialize matplotlib widgets and stuff around
@ -2021,7 +2055,8 @@ class MonitorWidgets:
self.matplot_canvas.show( ) self.matplot_canvas.show( )
# Matplot Toolbar hinzufuegen (Display_Table, 2. Zeile) # Matplot Toolbar hinzufuegen (Display_Table, 2. Zeile)
self.matplot_toolbar = matplotlib.backends.backend_gtk.NavigationToolbar2GTK(self.matplot_canvas, self.main_window) self.matplot_toolbar = matplotlib.backends.backend_gtk.NavigationToolbar2GTK( self.matplot_canvas,
self.main_window )
self.display_table.attach( self.matplot_toolbar, 0, 1, 1, 2, gtk.FILL | gtk.EXPAND, 0, 0, 0 ) self.display_table.attach( self.matplot_toolbar, 0, 1, 1, 2, gtk.FILL | gtk.EXPAND, 0, 0, 0 )
self.matplot_toolbar.show( ) self.matplot_toolbar.show( )
@ -2051,7 +2086,8 @@ class MonitorWidgets:
self.xml_gui.signal_connect( "on_display_x_scaling_combobox_changed", self.display_scaling_changed ) self.xml_gui.signal_connect( "on_display_x_scaling_combobox_changed", self.display_scaling_changed )
self.xml_gui.signal_connect( "on_display_y_scaling_combobox_changed", self.display_scaling_changed ) self.xml_gui.signal_connect( "on_display_y_scaling_combobox_changed", self.display_scaling_changed )
self.xml_gui.signal_connect( "on_display_save_data_as_text_button_clicked", self.save_display_data_as_text ) self.xml_gui.signal_connect( "on_display_save_data_as_text_button_clicked", self.save_display_data_as_text )
self.xml_gui.signal_connect("on_display_copy_data_to_clipboard_button_clicked", self.copy_display_data_to_clipboard) self.xml_gui.signal_connect( "on_display_copy_data_to_clipboard_button_clicked",
self.copy_display_data_to_clipboard )
# data to observe # data to observe
self.data_pool = None self.data_pool = None
@ -2065,7 +2101,8 @@ class MonitorWidgets:
self.display_source_treestore.clear( ) self.display_source_treestore.clear( )
self.source_list_add( u'None' ) self.source_list_add( u'None' )
none_iter = self.source_list_find( [ u'None' ] ) none_iter = self.source_list_find( [ u'None' ] )
if none_iter is not None: self.display_source_combobox.set_active_iter(none_iter) if none_iter is not None:
self.display_source_combobox.set_active_iter( none_iter )
def source_list_find_one( self, model, iter, what ): def source_list_find_one( self, model, iter, what ):
"""find node in subcategory""" """find node in subcategory"""
@ -2172,7 +2209,8 @@ class MonitorWidgets:
""" """
sort data as fast as possible and get rid of non-interesting data sort data as fast as possible and get rid of non-interesting data
""" """
if event.subject.startswith("__"): return if event.subject.startswith( "__" ):
return
if debug and self.update_counter < 0: if debug and self.update_counter < 0:
print "negative event count!", self.update_counter print "negative event count!", self.update_counter
if self.update_counter > 5: if self.update_counter > 5:
@ -2195,7 +2233,8 @@ class MonitorWidgets:
gobject.idle_add( self.datapool_idle_listener, event, priority=gobject.PRIORITY_DEFAULT_IDLE ) gobject.idle_add( self.datapool_idle_listener, event, priority=gobject.PRIORITY_DEFAULT_IDLE )
else: else:
if event.what == DataPool.Event.updated_value and \ if event.what == DataPool.Event.updated_value and \
(displayed_object is object_to_display or displayed_object.__class__ is object_to_display.__class__): (
displayed_object is object_to_display or displayed_object.__class__ is object_to_display.__class__):
# oh, another category # oh, another category
self.update_counter += 1 self.update_counter += 1
gobject.idle_add( self.update_display_idle_event, self.displayed_data[ 0 ][ : ], gobject.idle_add( self.update_display_idle_event, self.displayed_data[ 0 ][ : ],
@ -2226,11 +2265,13 @@ class MonitorWidgets:
threading.Event( ).wait( 0.05 ) threading.Event( ).wait( 0.05 )
while self.update_counter > 15: while self.update_counter > 15:
threading.Event( ).wait( 0.05 ) threading.Event( ).wait( 0.05 )
if event.origin is not self.displayed_data[1]: return if event.origin is not self.displayed_data[ 1 ]:
return
self.update_counter_lock.acquire( ) self.update_counter_lock.acquire( )
self.update_counter += 1 self.update_counter += 1
self.update_counter_lock.release( ) self.update_counter_lock.release( )
gobject.idle_add(self.update_display_idle_event,self.displayed_data[0][:],priority=gobject.PRIORITY_DEFAULT_IDLE) gobject.idle_add( self.update_display_idle_event, self.displayed_data[ 0 ][ : ],
priority=gobject.PRIORITY_DEFAULT_IDLE )
################### consume idle events ################### consume idle events
@ -2258,7 +2299,8 @@ class MonitorWidgets:
gtk.gdk.threads_leave( ) gtk.gdk.threads_leave( )
else: else:
# unregister old one # unregister old one
if self.displayed_data[1] is not None and hasattr(self.displayed_data[1], "unregister_listener"): if self.displayed_data[ 1 ] is not None and hasattr( self.displayed_data[ 1 ],
"unregister_listener" ):
self.displayed_data[ 1 ].unregister_listener( self.datastructures_listener ) self.displayed_data[ 1 ].unregister_listener( self.datastructures_listener )
self.displayed_data[ 1 ] = None self.displayed_data[ 1 ] = None
# register new one # register new one
@ -2286,7 +2328,8 @@ class MonitorWidgets:
self.displayed_data[ 0 ] == event.subject): self.displayed_data[ 0 ] == event.subject):
self.displayed_data = [ None, None ] self.displayed_data = [ None, None ]
none_iter = self.source_list_find( [ u'None' ] ) none_iter = self.source_list_find( [ u'None' ] )
if none_iter is not None: self.display_source_combobox.set_active_iter(none_iter) if none_iter is not None:
self.display_source_combobox.set_active_iter( none_iter )
# not necessary, because event will be submitted # not necessary, because event will be submitted
#self.clear_display() #self.clear_display()
self.source_list_remove( event.subject ) self.source_list_remove( event.subject )
@ -2322,8 +2365,10 @@ class MonitorWidgets:
def display_source_changed_event( self, widget, data=None ): def display_source_changed_event( self, widget, data=None ):
new_data_name = self.source_list_current( ) new_data_name = self.source_list_current( )
if (self.displayed_data[0] is None and new_data_name==u"None"): return if (self.displayed_data[ 0 ] is None and new_data_name == u"None"):
if (self.displayed_data[0]==new_data_name): return return
if (self.displayed_data[ 0 ] == new_data_name):
return
if self.displayed_data[ 1 ] is not None and hasattr( self.displayed_data[ 1 ], "unregister_listener" ): if self.displayed_data[ 1 ] is not None and hasattr( self.displayed_data[ 1 ], "unregister_listener" ):
self.displayed_data[ 1 ].unregister_listener( self.datastructures_listener ) self.displayed_data[ 1 ].unregister_listener( self.datastructures_listener )
self.displayed_data[ 1 ] = None self.displayed_data[ 1 ] = None
@ -2334,7 +2379,8 @@ class MonitorWidgets:
self.clear_display( ) self.clear_display( )
elif self.data_pool is None or new_data_name not in self.data_pool: elif self.data_pool is None or new_data_name not in self.data_pool:
none_iter = self.source_list_find( [ u'None' ] ) none_iter = self.source_list_find( [ u'None' ] )
if none_iter is not None: self.display_source_combobox.set_active_iter(none_iter) if none_iter is not None:
self.display_source_combobox.set_active_iter( none_iter )
self.display_source_path_label.set_label( u"" ) self.display_source_path_label.set_label( u"" )
else: else:
new_data_struct = self.data_pool[ new_data_name ] new_data_struct = self.data_pool[ new_data_name ]
@ -2411,7 +2457,8 @@ class MonitorWidgets:
dialog = gtk.FileChooserDialog( title=dialog_title, dialog = gtk.FileChooserDialog( title=dialog_title,
parent=self.main_window, parent=self.main_window,
action=gtk.FILE_CHOOSER_ACTION_SAVE, action=gtk.FILE_CHOOSER_ACTION_SAVE,
buttons = (gtk.STOCK_SAVE, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) buttons=(
gtk.STOCK_SAVE, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) )
dialog.set_default_response( gtk.RESPONSE_OK ) dialog.set_default_response( gtk.RESPONSE_OK )
dialog.set_current_name( data_to_save[ 0 ] ) dialog.set_current_name( data_to_save[ 0 ] )
@ -2443,7 +2490,8 @@ class MonitorWidgets:
tmpstring = u"" tmpstring = u""
tmpdata.seek( 0 ) tmpdata.seek( 0 )
for line in tmpdata: for line in tmpdata:
if line[0]=="#": continue if line[ 0 ] == "#":
continue
tmpstring += line tmpstring += line
del tmpdata del tmpdata
clipboard = gtk.clipboard_get( ) clipboard = gtk.clipboard_get( )
@ -2552,7 +2600,8 @@ class MonitorWidgets:
xdata = in_result.get_xdata( ) xdata = in_result.get_xdata( )
chans = in_result.get_number_of_channels( ) chans = in_result.get_number_of_channels( )
data = [ ] data = [ ]
colors = [(0,0,0.8,1), (0.7,0,0,1), (0,0.7,0,1), (0.7,0.5,0,1), (0,0,0,1)] # rgba tuples: blue, red, green, yellow colors = [ (0, 0, 0.8, 1), (0.7, 0, 0, 1), (0, 0.7, 0, 1), (0.7, 0.5, 0, 1),
(0, 0, 0, 1) ] # rgba tuples: blue, red, green, yellow
for i in xrange( chans ): for i in xrange( chans ):
data.append( in_result.get_ydata( i ) ) data.append( in_result.get_ydata( i ) )
@ -2571,11 +2620,14 @@ class MonitorWidgets:
if len( self.graphen ) == 0: if len( self.graphen ) == 0:
for i in xrange( chans ): for i in xrange( chans ):
self.graphen.extend(self.matplot_axes.plot(xdata, data[i], linestyle="-", color=colors[i], linewidth = 2)) self.graphen.extend(
self.matplot_axes.plot( xdata, data[ i ], linestyle="-", color=colors[ i ], linewidth=2 ) )
for i in xrange( chans ): for i in xrange( chans ):
# initialize error bars # initialize error bars
self.graphen.extend(self.matplot_axes.plot([0.0], [0.0], linestyle="-", color=colors[i], linewidth = 0.5)) self.graphen.extend(
self.graphen.extend(self.matplot_axes.plot([0.0], [0.0], linestyle="-", color=colors[i], linewidth = 0.5)) self.matplot_axes.plot( [ 0.0 ], [ 0.0 ], linestyle="-", color=colors[ i ], linewidth=0.5 ) )
self.graphen.extend(
self.matplot_axes.plot( [ 0.0 ], [ 0.0 ], linestyle="-", color=colors[ i ], linewidth=0.5 ) )
else: else:
for i in xrange( chans ): for i in xrange( chans ):
self.graphen[ i ].set_data( xdata, data[ i ] ) self.graphen[ i ].set_data( xdata, data[ i ] )
@ -2660,7 +2712,6 @@ class MonitorWidgets:
self.matplot_axes.lines.remove( self.measurementresultline[ 0 ] ) self.matplot_axes.lines.remove( self.measurementresultline[ 0 ] )
self.measurementresultline = None self.measurementresultline = None
[ k, v, e ] = in_result.get_errorplotdata( ) [ k, v, e ] = in_result.get_errorplotdata( )
if k.shape[ 0 ] != 0: if k.shape[ 0 ] != 0:
xmin = k.min( ) xmin = k.min( )
@ -2729,7 +2780,6 @@ class MonitorWidgets:
self.measurementresultgraph = self.matplot_axes.errorbar( x=k, y=v, yerr=e, fmt="bx" ) self.measurementresultgraph = self.matplot_axes.errorbar( x=k, y=v, yerr=e, fmt="bx" )
[ k, v ] = in_result.get_lineplotdata( ) [ k, v ] = in_result.get_lineplotdata( )
if k.shape[ 0 ] != 0 and v.shape == k.shape: if k.shape[ 0 ] != 0 and v.shape == k.shape:
self.measurementresultline = self.matplot_axes.plot( k, v, 'r-' ) self.measurementresultline = self.matplot_axes.plot( k, v, 'r-' )
@ -2754,7 +2804,8 @@ class MonitorWidgets:
self.clear_display( ) self.clear_display( )
to_draw = self.data_pool[ self.displayed_data[ 0 ] ] to_draw = self.data_pool[ self.displayed_data[ 0 ] ]
if to_draw is None: return if to_draw is None:
return
self.update_display( ) self.update_display( )
def begin_print( self, operation, context, print_data ): def begin_print( self, operation, context, print_data ):
@ -2800,12 +2851,15 @@ class MonitorWidgets:
renderer.height = height_in_points renderer.height = height_in_points
# centered picture # centered picture
renderer.matrix_flipy = cairo.Matrix( yy=-1, xx=1, renderer.matrix_flipy = cairo.Matrix( yy=-1, xx=1,
y0=page_setup.get_top_margin(gtk.UNIT_POINTS)+(height_in_points+freeheight_in*dpi)/2.0, y0=page_setup.get_top_margin( gtk.UNIT_POINTS ) + (
x0=page_setup.get_left_margin(gtk.UNIT_POINTS)+(freewidth_in*dpi-width_in_points)/2.0) height_in_points + freeheight_in * dpi) / 2.0,
x0=page_setup.get_left_margin( gtk.UNIT_POINTS ) + (
freewidth_in * dpi - width_in_points) / 2.0 )
renderer.set_ctx_from_surface( context.get_cairo_context( ).get_target( ) ) renderer.set_ctx_from_surface( context.get_cairo_context( ).get_target( ) )
# unfortunateley there is need for extra treatment of text # unfortunateley there is need for extra treatment of text
renderer.ctx.translate(page_setup.get_left_margin(gtk.UNIT_POINTS)+(freewidth_in*dpi-width_in_points)/2.0, renderer.ctx.translate(
page_setup.get_left_margin( gtk.UNIT_POINTS ) + (freewidth_in * dpi - width_in_points) / 2.0,
page_setup.get_top_margin( gtk.UNIT_POINTS ) - height_in_points / 2.0 + freeheight_in * dpi / 2.0 ) page_setup.get_top_margin( gtk.UNIT_POINTS ) - height_in_points / 2.0 + freeheight_in * dpi / 2.0 )
renderer.ctx.save( ) # important! there will be no effect of previous statement without save renderer.ctx.save( ) # important! there will be no effect of previous statement without save
fc.figure.draw( renderer ) fc.figure.draw( renderer )
@ -2815,12 +2869,14 @@ class MonitorWidgets:
fc.figure.set_facecolor( orig_f_color ) fc.figure.set_facecolor( orig_f_color )
fc.figure.set_edgecolor( orig_e_color ) fc.figure.set_edgecolor( orig_e_color )
class ScriptInterface: class ScriptInterface:
""" """
texts or code objects are executed as experiment and result script the backend is started with sufficient arguments texts or code objects are executed as experiment and result script the backend is started with sufficient arguments
""" """
def __init__(self, exp_script=None, res_script=None, backend_executable=None, spool_dir="spool", clear_jobs=True, clear_results=True): def __init__( self, exp_script=None, res_script=None, backend_executable=None, spool_dir="spool", clear_jobs=True,
clear_results=True ):
""" """
run experiment scripts and result scripts run experiment scripts and result scripts
""" """
@ -2835,17 +2891,24 @@ class ScriptInterface:
self.exp_writer = self.res_reader = self.back_driver = None self.exp_writer = self.res_reader = self.back_driver = None
if self.backend_executable is not None and self.backend_executable != "": if self.backend_executable is not None and self.backend_executable != "":
self.back_driver=BackendDriver.BackendDriver(self.backend_executable, spool_dir, clear_jobs, clear_results) self.back_driver = BackendDriver.BackendDriver( self.backend_executable, spool_dir, clear_jobs,
if self.exp_script: self.exp_writer=self.back_driver.get_exp_writer() clear_results )
if self.res_script: self.res_reader=self.back_driver.get_res_reader() if self.exp_script:
self.exp_writer = self.back_driver.get_exp_writer( )
if self.res_script:
self.res_reader = self.back_driver.get_res_reader( )
elif self.exp_script and self.res_script: elif self.exp_script and self.res_script:
self.back_driver = None self.back_driver = None
self.res_reader=ResultReader.BlockingResultReader(spool_dir, clear_jobs=self.clear_jobs, clear_results=self.clear_results) self.res_reader = ResultReader.BlockingResultReader( spool_dir, clear_jobs=self.clear_jobs,
clear_results=self.clear_results )
self.exp_writer = ExperimentWriter.ExperimentWriter( spool_dir, inform_last_job=self.res_reader ) self.exp_writer = ExperimentWriter.ExperimentWriter( spool_dir, inform_last_job=self.res_reader )
else: else:
self.back_driver = None self.back_driver = None
if self.exp_script: self.exp_writer=ExperimentWriter.ExperimentWriter(spool_dir) if self.exp_script:
if self.res_script: self.res_reader=ResultReader.ResultReader(spool_dir, clear_jobs=self.clear_jobs, clear_results=self.clear_results) self.exp_writer = ExperimentWriter.ExperimentWriter( spool_dir )
if self.res_script:
self.res_reader = ResultReader.ResultReader( spool_dir, clear_jobs=self.clear_jobs,
clear_results=self.clear_results )
self.data = DataPool( ) self.data = DataPool( )
def runScripts( self ): def runScripts( self ):
@ -2864,8 +2927,10 @@ class ScriptInterface:
while (not self.back_driver.quit_flag.isSet( ) and \ while (not self.back_driver.quit_flag.isSet( ) and \
self.back_driver.core_pid is None and self.back_driver.core_pid <= 0): self.back_driver.core_pid is None and self.back_driver.core_pid <= 0):
self.back_driver.quit_flag.wait( 0.1 ) self.back_driver.quit_flag.wait( 0.1 )
if self.exp_handling: self.exp_handling.start() if self.exp_handling:
if self.res_handling: self.res_handling.start() self.exp_handling.start( )
if self.res_handling:
self.res_handling.start( )
finally: finally:
self.exp_writer = self.res_reader = None self.exp_writer = self.res_reader = None