[Avida-cvs] [Avida2-svn] r155 - in trunk/source: bindings/Boost.Python main python python/AvidaGui2

kaben at myxo.css.msu.edu kaben at myxo.css.msu.edu
Fri May 13 14:09:17 PDT 2005


Author: kaben
Date: 2005-05-13 17:09:17 -0400 (Fri, 13 May 2005)
New Revision: 155

Added:
   trunk/source/python/AvidaGui2/Avida_ED_startup.py
   trunk/source/python/AvidaGui2/Avida_ED_startup_utils.py
   trunk/source/python/AvidaGui2/avidalogo.png
Removed:
   trunk/source/python/AvidaEd-interactive.py
Modified:
   trunk/source/bindings/Boost.Python/change_list.pyste
   trunk/source/main/population.cc
   trunk/source/main/stats.cc
   trunk/source/main/stats.hh
   trunk/source/python/AvidaEd-osx.py
   trunk/source/python/AvidaGui2/pyAvida.py
   trunk/source/python/AvidaGui2/pyEduSessionMenuBarHdlr.py
   trunk/source/python/AvidaGui2/pyEduWorkspaceCtrl.py
   trunk/source/python/AvidaGui2/pyGradientScaleCtrl.py
   trunk/source/python/AvidaGui2/pyGradientScaleView.py
   trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py
   trunk/source/python/AvidaGui2/pyLiveControlsCtrl.py
   trunk/source/python/AvidaGui2/pyMapProfile.py
   trunk/source/python/AvidaGui2/pyOnePop_GraphCtrl.py
   trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py
   trunk/source/python/AvidaGui2/pyOnePop_PetriDishView.ui
   trunk/source/python/AvidaGui2/pyOnePop_StatsCtrl.py
   trunk/source/python/AvidaGui2/pyOnePop_TimelineCtrl.py
   trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py
   trunk/source/python/AvidaGui2/pyOrganismScopeView.py
   trunk/source/python/AvidaGui2/pyPetriConfigureCtrl.py
   trunk/source/python/AvidaGui2/pyPetriDishCtrl.py
   trunk/source/python/AvidaGui2/pySessionControllerFactory.py
   trunk/source/python/AvidaGui2/pySessionCtrl.py
   trunk/source/python/AvidaGui2/pySessionDumbCtrl.py
   trunk/source/python/AvidaGui2/pySessionWorkThreadHdlr.py
   trunk/source/python/setup_osx.py.in
Log:

* Reorganized PyQt signals in Avida-ED code by collapsing the
  hierarchies of mediators that carry the signals.

* Moved as much as I could think of to move of the Avida-ED startup code
  into the AvidaGUI2 Python module, which is under Subversion source
  control in the Avida-ED application bundle.

* Some further cleanup of optimizations of the petri dish map view.

* Added a splash screen at Avida-ED launch to indicate startup progress
  to user.

* Added some unworkable changes to the organism scope view -- using
  filled splines to track the progress of organism instruction pointers.
  Will need to be rewritten.



Modified: trunk/source/bindings/Boost.Python/change_list.pyste
===================================================================
--- trunk/source/bindings/Boost.Python/change_list.pyste	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/bindings/Boost.Python/change_list.pyste	2005-05-13 21:09:17 UTC (rev 155)
@@ -6,6 +6,9 @@
 inline unsigned int cChangeList__len__(const cChangeList &change_list) {
   return change_list.GetChangeCount();
 }
+/*
+Crap. This doesn't work at all. @kgn
+*/
 inline unsigned int cChangeList__getitem__(const cChangeList &change_list, unsigned int i) {
   return change_list.GetChangeAt(i);
 }

Modified: trunk/source/main/population.cc
===================================================================
--- trunk/source/main/population.cc	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/main/population.cc	2005-05-13 21:09:17 UTC (rev 155)
@@ -41,6 +41,8 @@
 #include <algorithm>
 #include <set>
 
+#include <math.h>
+
 using namespace std;
 
 
@@ -1179,6 +1181,12 @@
   int max_gestation_time = 0;
   int max_genome_length = 0;
 
+  // Minimums...
+  cMerit min_merit(HUGE_VAL);
+  double min_fitness = HUGE_VAL;
+  int min_gestation_time = INT_MAX;
+  int min_genome_length = INT_MAX;
+
   for (int i = 0; i < cell_array.GetSize(); i++) {
     // Only look at cells with organisms in them.
     if (cell_array[i].IsOccupied() == false) continue;
@@ -1217,6 +1225,11 @@
     if (cur_gestation_time > max_gestation_time) max_gestation_time = cur_gestation_time;
     if (cur_genome_length > max_genome_length) max_genome_length = cur_genome_length;
 
+    if (cur_merit < min_merit) min_merit = cur_merit;
+    if (cur_fitness < min_fitness) min_fitness = cur_fitness;
+    if (cur_gestation_time < min_gestation_time) min_gestation_time = cur_gestation_time;
+    if (cur_genome_length < min_genome_length) min_genome_length = cur_genome_length;
+
     // Test what tasks this creatures has completed.
     for (int j=0; j < phenotype.GetEnvironment().GetTaskLib().GetSize(); j++) {
       if (phenotype.GetCurTaskCount()[j] > 0)  stats.AddCurTask(j);
@@ -1255,6 +1268,11 @@
   stats.SetMaxGestationTime(max_gestation_time);
   stats.SetMaxGenomeLength(max_genome_length);
 
+  stats.SetMinMerit(min_merit.GetDouble());
+  stats.SetMinFitness(min_fitness);
+  stats.SetMinGestationTime(min_gestation_time);
+  stats.SetMinGenomeLength(min_genome_length);
+
   stats.SetResources(resource_count.GetResources());
   stats.SetSpatialRes(resource_count.GetSpatialRes());
   stats.SetResourcesGeometry(resource_count.GetResourcesGeometry());

Modified: trunk/source/main/stats.cc
===================================================================
--- trunk/source/main/stats.cc	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/main/stats.cc	2005-05-13 21:09:17 UTC (rev 155)
@@ -13,6 +13,7 @@
 #include "string_util.hh"
 #include "tDataEntry.hh"
 
+#include <math.h>
 
 using namespace std;
 
@@ -42,6 +43,12 @@
   , dom_exe_size(0)
   , max_fitness(0)
   , max_merit(0)
+  , max_gestation_time(0)
+  , max_genome_length(0)
+  , min_fitness(HUGE_VAL)
+  , min_merit(HUGE_VAL)
+  , min_gestation_time(INT_MAX)
+  , min_genome_length(INT_MAX)
   , dom_genotype_id(-1)
   , dom_name("(none)")
   , dom_births(0)

Modified: trunk/source/main/stats.hh
===================================================================
--- trunk/source/main/stats.hh	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/main/stats.hh	2005-05-13 21:09:17 UTC (rev 155)
@@ -168,6 +168,10 @@
   double max_merit;
   int max_gestation_time;
   int max_genome_length;
+  double min_fitness;
+  double min_merit;
+  int min_gestation_time;
+  int min_genome_length;
   int dom_genotype_id;
   cString dom_name;
   int dom_births;
@@ -348,6 +352,16 @@
     { max_gestation_time = in_max_gestation_time; }
   inline void SetMaxGenomeLength(int in_max_genome_length)
     { max_genome_length = in_max_genome_length; }
+
+  inline void SetMinFitness(double in_min_fitness)
+    { min_fitness = in_min_fitness; }
+  inline void SetMinMerit(double in_min_merit)
+    { min_merit = in_min_merit; }
+  inline void SetMinGestationTime(int in_min_gestation_time)
+    { min_gestation_time = in_min_gestation_time; }
+  inline void SetMinGenomeLength(int in_min_genome_length)
+    { min_genome_length = in_min_genome_length; }
+
   inline void SetEntropy(double in_entropy)
     { entropy = in_entropy; }
   inline void SetSpeciesEntropy(double in_ent)
@@ -522,7 +536,12 @@
   int GetMaxGestationTime() const { return max_gestation_time; }
   int GetMaxGenomeLength() const { return max_genome_length; }
 
+  double GetMinFitness() const { return min_fitness; }
+  double GetMinMerit() const { return min_merit; }
+  int GetMinGestationTime() const { return min_gestation_time; }
+  int GetMinGenomeLength() const { return min_genome_length; }
 
+
   // this value gets recorded when a creature with the particular
   // fitness value gets born. It will never change to a smaller value,
   // i.e., when the maximum fitness in the population drops, this value will

Deleted: trunk/source/python/AvidaEd-interactive.py
===================================================================
--- trunk/source/python/AvidaEd-interactive.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaEd-interactive.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -1,39 +0,0 @@
-
-import AvidaCore
-import qt
-import iqt
-import sys
-
-def Reload():
-  import AvidaGui2.pyTemporaryReloads
-  reload(AvidaGui2.pyTemporaryReloads)
-  import linecache
-  linecache.checkcache()
-
-def UTs():
-  Reload()
-  AvidaGui2.pyTemporaryReloads.UTs()
-
-def AvidaEd():
-  Reload()
-  edu_main_controller = AvidaGui2.pyEduMainCtrl.pyEduMainCtrl()
-  edu_main_controller.construct()
-  edu_main_controller.m_main_mdl.m_main_mdtr.m_main_controller_factory_mdtr.emit(
-    qt.PYSIGNAL("newMainControllerSig"), ("pySessionCtrl",))
-  sys.exc_clear()
-  sys.exc_traceback = sys.last_traceback = None
-  return edu_main_controller
-
-AvidaCore.cConfig.InitGroupList()
-
-import AvidaGui2.pyTemporaryReloads
-reload(AvidaGui2.pyTemporaryReloads)
-
-#UTs()
-avida_ed=AvidaEd()
-
-print """
-
-Type 'avida_ed=AvidaEd()' to reload the AvidaEd user interface.
-
-"""

Modified: trunk/source/python/AvidaEd-osx.py
===================================================================
--- trunk/source/python/AvidaEd-osx.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaEd-osx.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -1,27 +1,3 @@
-# Modified from IPython sources for use in AvidaEd
-"""IPython -- An enhanced Interactive Python
-
-This is just the startup wrapper script, kept deliberately to a minimum.
-
-The shell's mainloop() takes an optional argument, sys_exit (default=0). If
-set to 1, it calls sys.exit() at exit time. You can use the following code in
-your PYTHONSTARTUP file:
-
-import IPython
-IPython.Shell.IPShell().mainloop(sys_exit=1)
-
-[or simply IPython.Shell.IPShell().mainloop(1) ]
-
-and IPython will be your working environment when you start python. The final
-sys.exit() call will make python exit transparently when IPython finishes, so
-you don't have an extra prompt to get out of.
-
-This is probably useful to developers who manage multiple Python versions and
-don't want to have correspondingly multiple IPython versions. Note that in
-this mode, there is no way to pass IPython any command-line options, as those
-are trapped first by Python itself.
-"""
-
 import sys
 
 # When an OS X application is double-clicked, argv[1] is set to
@@ -30,28 +6,37 @@
 # so we need to find another way to distinguish between launches by
 # double-clicking vs. launches by command-line.
 # @kgn
+
 if len(sys.argv) > 1 and sys.argv[1] >= 5 and sys.argv[1][:5] == '-psn_':
-  import qt
-  import AvidaCore    
-                          
-  def Run():      
-    import AvidaGui2.pyEduMainCtrl
-    edu_main_controller = AvidaGui2.pyEduMainCtrl.pyEduMainCtrl()
-    edu_main_controller.construct()
-    edu_main_controller.m_main_mdl.m_main_mdtr.m_main_controller_factory_mdtr.emit(
-    #sys.exc_clear()
-    #sys.exc_traceback = sys.last_traceback = None
-      qt.PYSIGNAL("newMainControllerSig"), ("pySessionCtrl",))
-    return edu_main_controller
-  
-  AvidaCore.cConfig.InitGroupList()
-  a = qt.QApplication(sys.argv)
-  ctrl=Run()
-  a.exec_loop()
 
+  # NonInteractive Avida-ED
+
+  from AvidaGui2 import Avida_ED_startup
+  Avida_ED_startup.NonInteractive()
+
 else:
+
+  # Interactive Avida-ED
+
+  # The bundled version of Avida-ED has a stripped-down version of
+  # Python, so here I'm adding back some of the missing stuff for the
+  # convenience of developers using the interactive version of Avida-ED.
+
   import site
+
+  class _Helper(object):
+      """Define the built-in 'help'.
+      This is a wrapper around pydoc.help (with a twist).
   
+      """
+  
+      def __repr__(self):
+          return "Type help() for interactive help, " \
+                 "or help(object) for help about object."
+      def __call__(self, *args, **kwds):
+          import pydoc
+          return pydoc.help(*args, **kwds)
+
   class _Printer(object):
       """interactive prompt objects for printing the license text, a list of
       contributors and the copyright notice."""
@@ -112,6 +97,7 @@
                           key = None
                   if key == 'q':
                       break
+
   __builtins__.credits = _Printer("credits", """
   Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
   for supporting Python development.  See www.python.org for more information.""")
@@ -132,15 +118,15 @@
   Copyright (c) 2001-2004 Fernando Perez, Janko Hauser, Nathan Gray.
   All Rights Reserved.""")
   
-  __builtins__.exit = """
-  Use Ctrl-D (i.e. EOF) to exit."""
+  __builtins__.exit = """Use Ctrl-D (i.e. EOF) to exit."""
   
-  __builtins__.quit = """
-  Use Ctrl-D (i.e. EOF) to exit."""
-  
-  
-  import IPython
-  import __builtin__
-  
-  ipython_shell = IPython.Shell.IPShell(argv=['AvidaEd-interactive.py'])
-  ipython_shell.mainloop()
+  __builtins__.quit = """Use Ctrl-D (i.e. EOF) to exit."""
+
+  __builtins__.help = _Helper()
+
+
+  #
+
+  from AvidaGui2 import Avida_ED_startup
+  Avida_ED_startup.Interactive()
+

Added: trunk/source/python/AvidaGui2/Avida_ED_startup.py
===================================================================
--- trunk/source/python/AvidaGui2/Avida_ED_startup.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/Avida_ED_startup.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -0,0 +1,14 @@
+def NonInteractive():
+  import sys
+  import qt
+  a = qt.QApplication(sys.argv)
+  from AvidaGui2 import Avida_ED_startup_utils as Avida_ED_startup_utils
+  Avida_ED_startup_utils.AvidaCore.cConfig.InitGroupList()
+  ctrl = Avida_ED_startup_utils.AvidaEd()
+  a.exec_loop()
+
+def Interactive():
+  import IPython
+  import __builtin__
+  ipython_shell = IPython.Shell.IPShell(argv=["-c", "import iqt; import AvidaGui2; from AvidaGui2.Avida_ED_startup_utils import *; AvidaCore.cConfig.InitGroupList(); avida_ed = AvidaEd();"])
+  ipython_shell.mainloop()

Added: trunk/source/python/AvidaGui2/Avida_ED_startup_utils.py
===================================================================
--- trunk/source/python/AvidaGui2/Avida_ED_startup_utils.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/Avida_ED_startup_utils.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -0,0 +1,65 @@
+
+import qt
+
+# Make a splash screen to give feedback to the user about progress in
+# launchning Avida-ED.
+#
+s_pixmap = qt.QPixmap("avidalogo.png")
+s_splash = qt.QSplashScreen(s_pixmap)
+font = s_splash.font()
+font.setPointSize(9)
+s_splash.setFont(font)
+del font
+s_splash.show()
+s_splash.message("Loading core Avida modules ...")
+
+import AvidaCore
+import sys
+
+# For developers : this asks the pyTemporaryReloads class to reload
+# certain parts of the python source code for the Avida gui, picking up
+# any changes since the last launch of the gui. This can be called
+# without restarting the application (convenient for quickly checking
+# the results of changes to the source code).
+#
+def Reload():
+  import AvidaGui2.pyTemporaryReloads
+  reload(AvidaGui2.pyTemporaryReloads)
+  # Ask the linecache module to refresh its cache with new versions of
+  # the source code.
+  import linecache
+  linecache.checkcache()
+
+# Runs unit tests. Can be called while gui is running, and will
+# instantiate a new copy of Avida for testing (but this will disturb
+# Avida's random number generator).
+#
+def UTs():
+  Reload()
+  AvidaGui2.pyTemporaryReloads.UTs()
+
+# Instantiate (or reinstantiate) the Avida-ED gui. Return controller for
+# new gui instance.
+#
+def AvidaEd():
+  sys.exc_clear()
+  sys.exc_traceback = sys.last_traceback = None
+  s_splash.message("Loading Avida-ED user-interface ...")
+  s_splash.show()
+  try:
+    Reload()
+    from AvidaGui2.pyEduMainCtrl import pyEduMainCtrl
+    s_splash.message("Assembling Avida-ED user-interface ...")
+    edu_main_controller = pyEduMainCtrl()
+    edu_main_controller.construct()
+    edu_main_controller.m_main_mdl.m_main_mdtr.m_main_controller_factory_mdtr.emit(
+      qt.PYSIGNAL("newMainControllerSig"), ("pySessionCtrl",))
+  finally:
+    s_splash.clear()
+    s_splash.hide()
+    print """
+    
+    Type 'avida_ed=AvidaEd()' to reload the AvidaEd user interface.
+    
+    """
+  return edu_main_controller

Added: trunk/source/python/AvidaGui2/avidalogo.png
===================================================================
(Binary files differ)


Property changes on: trunk/source/python/AvidaGui2/avidalogo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/source/python/AvidaGui2/pyAvida.py
===================================================================
--- trunk/source/python/AvidaGui2/pyAvida.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyAvida.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -85,6 +85,7 @@
     self.m_avida_threaded_driver.removeGuiWorkFunctor(thread_work_functor)
 
   def destruct(self):
+    print("pyAvida.destruct() ...")
     self.m_avida_thread_mdtr.emit(qt.PYSIGNAL("doCloseAvidaSig"),())
     if hasattr(self, "m_update_ck_timer"):
       self.m_update_ck_timer.stop()
@@ -92,33 +93,11 @@
     else:
       print("pyAvida.destruct() self.m_update_ck_timer missing.")
 
-    self.disconnect(
-      self.m_avida_thread_mdtr,
-      qt.PYSIGNAL("doPauseAvidaSig"),
-      self.doPauseAvidaSlot)
-    self.disconnect(
-      self.m_avida_thread_mdtr,
-      qt.PYSIGNAL("doStartAvidaSig"),
-      self.doStartAvidaSlot)
-    self.disconnect(
-      self.m_avida_thread_mdtr,
-      qt.PYSIGNAL("doUpdateAvidaSig"),
-      self.doUpdateAvidaSlot)
-    self.disconnect(
-      self.m_avida_thread_mdtr,
-      qt.PYSIGNAL("doCloseAvidaSig"),
-      self.doCloseAvidaSlot)
-
     if hasattr(self, "m_avida_thread_mdtr"):
       del self.m_avida_thread_mdtr
     else:
-      print("pyAvida.destruct() self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr missing.")
+      print("pyAvida.destruct() self.m_avida_thread_mdtr missing.")
 
-    if hasattr(self, "updated_semaphore"):
-      del self.m_updated_semaphore
-    else:
-      print("pyAvida.destruct() self.m_updated_semaphore missing.")
-
     if hasattr(self, "m_avida_threaded_driver"):
       self.m_avida_threaded_driver.doExit()
       self.m_avida_threaded_driver.m_thread.join()

Modified: trunk/source/python/AvidaGui2/pyEduSessionMenuBarHdlr.py
===================================================================
--- trunk/source/python/AvidaGui2/pyEduSessionMenuBarHdlr.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyEduSessionMenuBarHdlr.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -39,89 +39,88 @@
 
   def construct(self, session_mdl):
     self.m_session_mdl = session_mdl
-    self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr = pyMdtr()
 
-    self.connect(self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr,
+    self.connect(self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doSetupMainWindowMenuBarSig"), self.doSetupMainWindowMenuBarSlot)
 
   def doSetupMainWindowMenuBarSlot(self, main_window):
     main_window.m_menu_bar = main_window.menuBar()
     main_window.m_file_menu = qt.QPopupMenu()
     main_window.m_new_workspace_fmi_id = main_window.m_file_menu.insertItem("New Workspace",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doNewWorkspaceSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doNewWorkspaceSig"),
       qt.Qt.CTRL + qt.Qt.SHIFT + qt.Qt.Key_N)
     main_window.m_open_workspace_fmi_id = main_window.m_file_menu.insertItem("Open Workspace...",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doOpenWorkspaceSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doOpenWorkspaceSig"),
       qt.Qt.CTRL + qt.Qt.Key_O)
     main_window.m_close_workspace_fmi_id = main_window.m_file_menu.insertItem("Close Workspace",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doCloseWorkspaceSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doCloseWorkspaceSig"),
       qt.Qt.CTRL + qt.Qt.Key_W)
     main_window.m_file_menu.insertSeparator()
     main_window.m_save_workspace_fmi_id = main_window.m_file_menu.insertItem("Save Workspace",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doSaveWorkspaceSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doSaveWorkspaceSig"),
       qt.Qt.CTRL + qt.Qt.Key_S)
     main_window.m_save_workspace_as_fmi_id = main_window.m_file_menu.insertItem("Save Workspace As...",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doSaveWorkspaceAsSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doSaveWorkspaceAsSig"),
       qt.Qt.CTRL + qt.Qt.SHIFT + qt.Qt.Key_S)
     main_window.m_file_menu.insertSeparator()
     main_window.m_import_fmi_id = main_window.m_file_menu.insertItem("Import...",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doImportSig"))
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doImportSig"))
     main_window.m_export_fmi_id = main_window.m_file_menu.insertItem("Export...",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doSaveWorkspaceSig"))
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doSaveWorkspaceSig"))
     main_window.m_file_menu.insertSeparator()
     main_window.m_quit_fmi_id = main_window.m_file_menu.insertItem("Quit",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doSaveWorkspaceSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doSaveWorkspaceSig"),
       qt.Qt.CTRL + qt.Qt.Key_Q)
     main_window.m_menu_bar.insertItem("File", main_window.m_file_menu)
 
     main_window.m_edit_menu = qt.QPopupMenu()
     main_window.m_undo_emi_id = main_window.m_edit_menu.insertItem("Undo",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doUndoSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doUndoSig"),
       qt.Qt.CTRL + qt.Qt.Key_Z)
     main_window.m_redo_emi_id = main_window.m_edit_menu.insertItem("Redo",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doRedoSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doRedoSig"),
       qt.Qt.CTRL + qt.Qt.SHIFT + qt.Qt.Key_Z)
     main_window.m_edit_menu.insertSeparator()
     main_window.m_cut_emi_id = main_window.m_edit_menu.insertItem("Cut",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doCutSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doCutSig"),
       qt.Qt.CTRL + qt.Qt.Key_X)
     main_window.m_copy_emi_id = main_window.m_edit_menu.insertItem("Copy",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doCopySig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doCopySig"),
       qt.Qt.CTRL + qt.Qt.Key_C)
     main_window.m_paste_emi_id = main_window.m_edit_menu.insertItem("Paste",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doPasteSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doPasteSig"),
       qt.Qt.CTRL + qt.Qt.Key_V)
     main_window.m_edit_menu.insertSeparator()
     main_window.m_select_all_emi_id = main_window.m_edit_menu.insertItem("Select All",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doSelectAllSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doSelectAllSig"),
       qt.Qt.CTRL + qt.Qt.Key_A)
     main_window.m_menu_bar.insertItem("Edit", main_window.m_edit_menu)
 
     main_window.m_control_menu = qt.QPopupMenu()
     main_window.m_start_cmi_id = main_window.m_control_menu.insertItem("Start",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doStartSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doStartSig"),
       qt.Qt.Key_Space)
     main_window.m_pause_cmi_id = main_window.m_control_menu.insertItem("Pause",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doPauseSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doPauseSig"),
       qt.Qt.Key_Space)
     main_window.m_next_update_cmi_id = main_window.m_control_menu.insertItem("Next Update",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doNextUpdateSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doNextUpdateSig"),
       qt.Qt.Key_Return)
     main_window.m_next_step_cmi_id = main_window.m_control_menu.insertItem("Next Step",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doNextStepSig"),
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doNextStepSig"),
       qt.Qt.Key_Return)
     main_window.m_menu_bar.insertItem("Control", main_window.m_control_menu)
 
     main_window.m_view_menu = qt.QPopupMenu()
     main_window.m_tmp_view_window_vmi_id = main_window.m_view_menu.insertItem("Workspace Window (tmp)",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doWorkspaceWindowTmpSig"))
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doWorkspaceWindowTmpSig"))
     main_window.m_menu_bar.insertItem("View", main_window.m_view_menu)
 
     main_window.m_window_menu = qt.QPopupMenu()
     main_window.m_zoom_window_wmi_id = main_window.m_window_menu.insertItem("Zoom Window",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doZoomWindowSig"))
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doZoomWindowSig"))
     main_window.m_minimize_window_wmi_id = main_window.m_window_menu.insertItem("Minimize Window",
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr, qt.PYSIGNAL("doMinimizeWindowSig"))
+      self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doMinimizeWindowSig"))
     main_window.m_menu_bar.insertItem("Window", main_window.m_window_menu)
 
     if hasattr(main_window, 'setupCustomMenus'):

Modified: trunk/source/python/AvidaGui2/pyEduWorkspaceCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyEduWorkspaceCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyEduWorkspaceCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -17,7 +17,6 @@
 
   def construct(self, session_mdl):
     self.m_session_mdl = session_mdl
-    self.m_session_mdl.m_session_mdtr.m_workspace_mdtr = pyMdtr()
     self.m_avida = None
     self.startStatus = True
     self.m_nav_bar_ctrl.construct(session_mdl)
@@ -72,15 +71,15 @@
       self.doStartAvidaSlot)
 
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       PYSIGNAL("doStartSig"),
       self.doStartAvidaSlot)
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       PYSIGNAL("doPauseSig"),
       self.doPauseAvidaSlot)
     # self.connect(
-    #   self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr,
+    #   self.m_session_mdl.m_session_mdtr,
     #   PYSIGNAL("doNextUpdateSig"),
     #   self.updatePBClickedSlot)
 
@@ -176,8 +175,8 @@
   # public slot
 
   def filePrint(self):
-    print "pyEduWorkspaceCtrl.filePrint() emitting printGraphSig via self.m_session_mdl.m_session_mdtr.m_workspace_mdtr"
-    self.m_session_mdl.m_session_mdtr.m_workspace_mdtr.emit(PYSIGNAL("printGraphSig"), ())
+    print "pyEduWorkspaceCtrl.filePrint() emitting printGraphSig via self.m_session_mdl.m_session_mdtr"
+    self.m_session_mdl.m_session_mdtr.emit(PYSIGNAL("printGraphSig"), ())
 
   # public slot
 
@@ -244,14 +243,17 @@
       print "send pause signal"
     
   def setAvidaSlot(self, avida):
+    print "pyEduWorkspaceCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
-    if(old_avida):
+    if old_avida:
+      print "pyEduWorkspaceCtrl.setAvidaSlot() disconnecting old_avida ..."
       self.disconnect(
-        self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
+        old_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
       del old_avida
-    if(self.m_avida):
+    if self.m_avida:
+      print "pyEduWorkspaceCtrl.setAvidaSlot() connecting self.m_avida ..."
       self.connect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)

Modified: trunk/source/python/AvidaGui2/pyGradientScaleCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyGradientScaleCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyGradientScaleCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -17,17 +17,20 @@
       self.setAvidaSlot)
 
   def setAvidaSlot(self, avida):
+    print "pyGradientScaleCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
     if(old_avida):
+      print "pyGradientScaleCtrl.setAvidaSlot() disconnecting old_avida ..."
       self.disconnect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
       del old_avida
     if(self.m_avida):
+      print "pyGradientScaleCtrl.setAvidaSlot() connecting self.m_avida ..."
       self.connect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
 
   def avidaUpdatedSlot(self):
-    pass
\ No newline at end of file
+    pass

Modified: trunk/source/python/AvidaGui2/pyGradientScaleView.py
===================================================================
--- trunk/source/python/AvidaGui2/pyGradientScaleView.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyGradientScaleView.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -14,9 +14,15 @@
   s_bottom_margin = 6
   s_right_margin = 6
   s_spacing = 6
-  s_stripe_width = 20
+  s_stripe_height = 20
   s_stripes = 100
   s_step = 10
+  s_empty_text = "(empty)"
+  s_off_scale_text = "(off scale)"
+  s_empty_text_width = 0
+  s_off_scale_text_width = 0
+  s_label_text_width = 0
+  s_text_height = 0
 
   def __init__(self,parent = None,name = None,fl = 0):
     QWidget.__init__(self,parent,name,fl)
@@ -33,9 +39,14 @@
     self.recalcSize()
 
     font = QFont(self.font())
-    font.setPointSize(10)
+    font.setPointSize(9)
     self.setFont(font)
 
+    self.s_empty_text_width = self.fontMetrics().width(self.s_empty_text)
+    self.s_off_scale_text_width = self.fontMetrics().width(self.s_off_scale_text)
+    self.s_label_text_width = self.fontMetrics().width("0.00000")
+    self.s_text_height = self.fontMetrics().height()
+
     if not name:
       setName("pyGradientScaleView")
 
@@ -74,30 +85,58 @@
     h = self.height()
     p = QPainter(self)
   
-    stripe_height = (h-self.s_top_margin-self.s_bottom_margin)/self.s_stripes + 1
-    plot_height = h-self.s_top_margin-self.s_bottom_margin-stripe_height+1
+    stripe_width = (w-self.s_left_margin-self.s_right_margin)/self.s_stripes + 1
+    plot_width = w-self.s_left_margin-self.s_right_margin+1
+    #plot_width = w-self.s_left_margin-self.s_right_margin-stripe_width+1
   
-    text_width = w - self.s_left_margin - self.s_stripe_width - self.s_spacing
+    #text_height = self.fontMetrics().height()
+    #label_width = self.fontMetrics().width("0.00000")
   
     for i in range(self.s_stripes):
       x = float(i) / float(self.s_stripes);
       p.fillRect(
-        self.s_left_margin,
-        (self.s_top_margin + (1-x)*plot_height),
-        self.s_stripe_width,
-        stripe_height,
+        (self.s_left_margin + x*plot_width),
+        #self.s_top_margin + text_height + self.s_spacing,
+        self.s_top_margin + self.s_text_height + self.s_spacing,
+        stripe_width,
+        self.s_stripe_height,
         QBrush(self.doubleToColor(x))
         )
-      if i%self.s_step == 0:
-        p.drawText(
-          self.s_left_margin+self.s_stripe_width + self.s_spacing,
-          (self.s_top_margin + (1-x)*plot_height-(self.s_step-1)*stripe_height/2),
-          text_width,
-          self.s_step*stripe_height,
-          Qt.AlignVCenter | Qt.AlignLeft,
-          self.getLabelString( self.m_min_value+x*(self.m_max_value - self.m_min_value))
-          )
 
+    p.drawText(
+      self.s_left_margin,
+      self.s_top_margin,
+      self.s_label_text_width,
+      self.s_text_height,
+      #label_width,
+      #text_height,
+      Qt.AlignBottom | Qt.AlignLeft,
+      self.getLabelString(self.m_min_value)
+    )
+    p.drawText(
+      #w - self.s_right_margin - label_width,
+      w - self.s_right_margin - self.s_label_text_width,
+      self.s_top_margin,
+      self.s_label_text_width,
+      self.s_text_height,
+      #label_width,
+      #text_height,
+      Qt.AlignBottom | Qt.AlignRight,
+      self.getLabelString(self.m_max_value)
+    )
+
+      #self.s_spacing + 2 * self.fontMetrics().width("0.0e+02")
+
+      #if i%self.s_step == 0:
+      #  p.drawText(
+      #    self.s_left_margin+self.s_stripe_height + self.s_spacing,
+      #    (self.s_top_margin + (1-x)*plot_width-(self.s_step-1)*stripe_width/2),
+      #    text_width,
+      #    self.s_step*stripe_width,
+      #    Qt.AlignVCenter | Qt.AlignLeft,
+      #    self.getLabelString( self.m_min_value+x*(self.m_max_value - self.m_min_value))
+      #    )
+
   #def drawColorList(self):
   #  QValueVector<QString>::const_iterator str_it = m_descr_vector.begin();
   #  QValueVector<QColor>::const_iterator color_it = m_color_vector.begin();
@@ -106,10 +145,10 @@
   #  h = self.height()
   #  p = QPainter(self)
   #
-  #  stripe_height = (h-self.s_top_margin-self.s_bottom_margin)/len(m_color_vector)
-  #  plot_height = h-self.s_top_margin-self.s_bottom_margin-stripe_height
+  #  stripe_width = (h-self.s_top_margin-self.s_bottom_margin)/len(m_color_vector)
+  #  plot_width = h-self.s_top_margin-self.s_bottom_margin-stripe_width
   #
-  #  text_width = w - self.s_left_margin - self.s_stripe_width - self.s_spacing;
+  #  text_width = w - self.s_left_margin - self.s_stripe_height - self.s_spacing;
   #
   #  int i,j;
   #  i = j = m_color_list_length-1;
@@ -117,9 +156,9 @@
   #    if ( !(*str_it).isNull() ){ // draw only if description exists
   #      double x = (double) j / (double)(m_color_list_length-1);
   #      // the colored stripe
-  #      p.fillRect( m_left_margin, (int) (m_top_margin + (1-x)*plot_height + .1*stripe_height), m_stripe_width, (int) (.8*stripe_height), *color_it );
+  #      p.fillRect( m_left_margin, (int) (m_top_margin + (1-x)*plot_width + .1*stripe_width), m_stripe_width, (int) (.8*stripe_width), *color_it );
   #      // the label
-  #      p.drawText( m_left_margin+m_stripe_width + m_spacing, (int) (m_top_margin + (1-x)*plot_height), text_width, stripe_height, Qt::AlignVCenter | Qt::AlignLeft, *str_it );
+  #      p.drawText( m_left_margin+m_stripe_width + m_spacing, (int) (m_top_margin + (1-x)*plot_width), text_width, stripe_width, Qt::AlignVCenter | Qt::AlignLeft, *str_it );
   #      j--;
   #    } 
   #  } 
@@ -130,15 +169,16 @@
     h = 1
     if self.m_activated:
       if self.m_continuous:
-        w = (
-          self.s_left_margin +
-          self.s_stripe_width +
+        #w = self.s_left_margin + self.s_right_margin + self.s_spacing + 2 * self.fontMetrics().width("0.0e+02")
+        w = self.s_left_margin + self.s_right_margin + self.s_spacing + 2 * self.s_label_text_width
+        h = (
+          self.s_top_margin +
+          #self.fontMetrics().height() +
+          self.s_label_text_width +
           self.s_spacing +
-          self.s_right_margin +
-          self.fontMetrics().width("0.0e+02")
-          #self.fontMetrics().width(self.getLabelString(self.m_max_value))
-          )
-        h = self.fontMetrics().height() * self.s_stripes / self.s_step
+          self.s_stripe_height +
+          self.s_bottom_margin
+        )
       else:
         min_label_width = 0
         for desc in self.m_descr_vector: 
@@ -147,7 +187,7 @@
             min_label_width = x
         w = (
           self.s_left_margin +
-          self.s_stripe_width +
+          self.s_stripe_height +
           self.s_spacing +
           self.s_right_margin +
           min_label_width
@@ -155,9 +195,10 @@
         h = self.fontMetrics().height() * len(self.m_color_vector)
 
     self.setMinimumWidth(w)
-    self.setMaximumWidth(w)
+    #self.setMaximumWidth(w)
 
     self.setMinimumHeight(h)
+    self.setMaximumHeight(h)
 
   def getLabelString(self, x):
 

Modified: trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py
===================================================================
--- trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -16,6 +16,10 @@
     self.m_register_cx_info = []
     self.m_read_label_info = []
     self.m_last_copy_info = []
+    self.m_ihead_moves = []
+    self.m_ihead_moves_info = []
+    self.m_ihead_moves_counts = {}
+
     self.m_last_copied_instruction = 0
 
     self.m_is_viable = None
@@ -41,6 +45,15 @@
     )
     self.m_last_copy_info.append(self.m_last_copied_instruction)
 
+    if 1 < len(self.m_ihead_info):
+      if self.m_ihead_info[-2] != self.m_ihead_info[-1]:
+        move_count = 1
+        if self.m_ihead_moves_counts.has_key((self.m_ihead_info[-2], self.m_ihead_info[-1])):
+          move_count = self.m_ihead_moves_counts[(self.m_ihead_info[-2], self.m_ihead_info[-1])] + 1
+        self.m_ihead_moves_counts[(self.m_ihead_info[-2], self.m_ihead_info[-1])] = move_count
+        self.m_ihead_moves.append((self.m_ihead_info[-2], self.m_ihead_info[-1], move_count))
+    self.m_ihead_moves_info.append(len(self.m_ihead_moves))
+
   def recordGenotypeSummary(self, analyze_genotype):
     self.m_is_viable = analyze_genotype.GetViable()
     self.m_gestation_time = analyze_genotype.GetGestTime()

Modified: trunk/source/python/AvidaGui2/pyLiveControlsCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyLiveControlsCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyLiveControlsCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -29,14 +29,17 @@
       self.clickedPauseAvidaSlot)
 
   def setAvidaSlot(self, avida):
+    print "pyLiveControlsCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
     if(old_avida):
+      print "pyLiveControlsCtrl.setAvidaSlot() disconnecting old_avida ..."
       self.disconnect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
       del old_avida
     if(self.m_avida):
+      print "pyLiveControlsCtrl.setAvidaSlot() connecting self.m_avida ..."
       self.connect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)

Modified: trunk/source/python/AvidaGui2/pyMapProfile.py
===================================================================
--- trunk/source/python/AvidaGui2/pyMapProfile.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyMapProfile.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -1,5 +1,5 @@
 
-from qt import PYSIGNAL, QColor, QObject
+from qt import PYSIGNAL, QColor, QObject, Qt
 from math import exp
 
 class pyMapProfile:
@@ -11,10 +11,8 @@
       def continuousIndexingFunction(population_cell_item, min, range):
         population_cell = population_cell_item.m_population_cell
         if 0.0 < range:
-          index = population_cell.IsOccupied() and ((float(idx_functor(population_cell)) - min) / range) or 0.0
-        else: index = 0.0
-        if index < 0.0: index = 0.0
-        elif 1.0 < index: index = 1.0
+          index = population_cell.IsOccupied() and ((float(idx_functor(population_cell)) - min) / range) or -1.0
+        else: index = -1.0
 
         if population_cell_item.m_index == index: return False
         else:
@@ -39,10 +37,11 @@
         self.m_sup = 0.0
         self.m_target_inf = 0.0
         self.m_target_sup = 0.0
-        self.m_inf_tol_coef = 0.1
-        self.m_sup_tol_coef = 0.1
+        self.m_inf_tolerance_coeff = 0.1
+        self.m_sup_tolerance_coeff = 0.1
         self.m_inf_rescale_rate = 0.0
         self.m_sup_rescale_rate = 0.0
+        self.m_max_rescale_factor = 0.03
         self.m_updates_to_rescale = 40
         self.m_should_reset = True
 
@@ -57,7 +56,8 @@
 
       def resetRange(self, population):
         (inf, sup) = self.m_range.getRange()
-        (self.m_target_inf, self.m_target_sup) = (self.m_inf, self.m_sup) = (inf, sup)
+        #(self.m_target_inf, self.m_target_sup) = (self.m_inf, self.m_sup) = (inf, sup)
+        (self.m_target_inf, self.m_target_sup) = (self.m_inf, self.m_sup) = (0, sup)
         self.m_inf_rescale_rate = self.m_sup_rescale_rate = 0
 
         return self.getRange()
@@ -67,17 +67,40 @@
           return self.resetRange(population)
 
         (inf, sup) = self.m_range.getRange()
-        if (sup < (1 - self.m_sup_tol_coef) * self.m_target_sup) or (self.m_target_sup < sup):
-          new_target_sup = sup * (1 + self.m_sup_tol_coef)
+        if (sup < (1 - self.m_sup_tolerance_coeff) * self.m_target_sup) or (self.m_target_sup < sup):
+          new_target_sup = sup * (1 + self.m_sup_tolerance_coeff)
+          #self.m_sup_rescale_rate = float(new_target_sup - self.m_sup)
           self.m_sup_rescale_rate = float(new_target_sup - self.m_sup) / self.m_updates_to_rescale
           self.m_target_sup = new_target_sup
 
+        #if (inf > (1 + self.m_inf_tolerance_coeff) * self.m_target_inf) or (self.m_target_inf > inf):
+        #  new_target_inf = inf * (1 - self.m_inf_tolerance_coeff)
+        #  #self.m_sup_rescale_rate = float(new_target_sup - self.m_sup)
+        #  self.m_inf_rescale_rate = float(self.m_inf - new_target_inf) / self.m_updates_to_rescale
+        #  self.m_target_inf = new_target_inf
+
         if self.m_sup_rescale_rate != 0:
-          self.m_sup += self.m_sup_rescale_rate
+          if inf <= self.m_sup:
+            #self.m_sup = self.m_target_sup
+            self.m_sup += self.m_sup_rescale_rate
+          else:
+            max_rate = self.m_sup * self.m_max_rescale_factor
+            self.m_sup += min(self.m_sup_rescale_rate, max_rate)
           if abs(self.m_target_sup - self.m_sup) < abs(self.m_sup_rescale_rate):
             self.m_sup = self.m_target_sup
             self.m_sup_rescale_rate = 0
 
+        #if self.m_inf_rescale_rate != 0:
+        #  if self.m_inf <= inf:
+        #    #self.m_sup = self.m_target_sup
+        #    self.m_inf -= self.m_sup_rescale_rate
+        #  else:
+        #    max_rate = self.m_inf * self.m_max_rescale_factor
+        #    self.m_inf -= min(self.m_inf_rescale_rate, max_rate)
+        #  if abs(self.m_target_inf - self.m_inf) < abs(self.m_inf_rescale_rate):
+        #    self.m_inf = self.m_target_inf
+        #    self.m_inf_rescale_rate = 0
+
         return self.getRange()
 
     class RangeReport(QObject):
@@ -88,14 +111,21 @@
         self.m_avida = None
         self.m_range = (0, 0)
       def setAvidaSlot(self, avida):
+        print "RangeReport.setAvidaSlot() ..."
         old_avida = self.m_avida
         self.m_avida = avida
         if(old_avida):
-          self.disconnect(
-            self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
-            self.avidaUpdatedSlot)
+          print "RangeReport.setAvidaSlot() unsetting old_avida ..."
+          if hasattr(old_avida, "m_avida_thread_mdtr"):
+            print "RangeReport.setAvidaSlot() disconnect old_avida ..."
+            self.disconnect(
+              old_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
+              self.avidaUpdatedSlot)
+          print "RangeReport.setAvidaSlot() deleting old_avida ..."
           del old_avida
+          print "RangeReport.setAvidaSlot() done ..."
         if(self.m_avida):
+          print "RangeReport.setAvidaSlot() connecting self.m_avida ..."
           self.connect(
             self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
             self.avidaUpdatedSlot)
@@ -106,10 +136,10 @@
         return self.m_range
 
     NullRng = lambda p: (0, 0)
-    MeritRng = lambda p: (0, p.GetStats().GetMaxMerit())
-    FitnessRng = lambda p: (0, p.GetStats().GetMaxFitness())
-    GestationTimeRng = lambda p: (0, p.GetStats().GetMaxGestationTime())
-    SizeRng = lambda p: (0, p.GetStats().GetMaxGenomeLength())
+    MeritRng = lambda p: (p.GetStats().GetMinMerit(), p.GetStats().GetMaxMerit())
+    FitnessRng = lambda p: (p.GetStats().GetMinFitness(), p.GetStats().GetMaxFitness())
+    GestationTimeRng = lambda p: (p.GetStats().GetMinGestationTime(), p.GetStats().GetMaxGestationTime())
+    SizeRng = lambda p: (p.GetStats().GetMinGenomeLength(), p.GetStats().GetMaxGenomeLength())
 
 
     def sigmoid(x, midpoint, steepness):
@@ -119,18 +149,20 @@
       #x = max(0, min(x, 1)) * (1 - 0.1) + 0.1
       x = 1 < x and 1 or x
       x = x < 0 and 0 or x
-      x = 0.1 + 0.9*x
+      x = 0.1 + 0.8*x
       h = (x * 360 + 100) % 360
       v = sigmoid(x, 0.3, 10) * 255
       s = sigmoid(1 - x, 0.1, 30) * 255
       return QColor(h, s, v, QColor.Hsv)
 
     self.m_color_cache = [sigmoidDoubleToColor(float(n)/(self.m_color_cache_size - 1)) for n in range(self.m_color_cache_size)]
+    self.m_empty_color = QColor(Qt.black)
+    self.m_off_scale_color = QColor(Qt.white)
     def sigmoidColorLookup(x):
       sup = self.m_color_cache_size - 1
       x *= sup
-      x = sup < x and sup or x
-      x = x < 0 and 0 or x
+      if sup < x: return self.m_off_scale_color
+      if x < 0: return self.m_empty_color
       return self.m_color_cache[int(x)]
 
     self.m_entries = (

Modified: trunk/source/python/AvidaGui2/pyOnePop_GraphCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOnePop_GraphCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyOnePop_GraphCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -61,7 +61,7 @@
     self.modeActivatedSlot(self.m_combo_box.currentItem())
 
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_workspace_mdtr, PYSIGNAL("printGraphSig"),
+      self.m_session_mdl.m_session_mdtr, PYSIGNAL("printGraphSig"),
       self.printGraphSlot)
 
   def load(self, filename, colx, coly):
@@ -102,14 +102,17 @@
     self.m_graph_ctrl.replot()
       
   def setAvidaSlot(self, avida):
+    print "pyOnePop_GraphCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
     if(old_avida):
+      print "pyOnePop_GraphCtrl.setAvidaSlot() disconnecting old_avida ..."
       self.disconnect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
       del old_avida
     if(self.m_avida):
+      print "pyOnePop_GraphCtrl.setAvidaSlot() connecting self.m_avida ..."
       self.connect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)

Modified: trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -45,14 +45,17 @@
     #self.m_petri_dish_ctrl.emit(PYSIGNAL("zoomSig"), (self.m_petri_dish_ctrl.m_initial_target_zoom,))
 
   def setAvidaSlot(self, avida):
+    print "pyOnePop_PetriDishCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
     if(old_avida):
+      print "pyOnePop_PetriDishCtrl.setAvidaSlot() disconnecting old_avida ..."
       self.disconnect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
       del old_avida
     if(self.m_avida):
+      print "pyOnePop_PetriDishCtrl.setAvidaSlot() connecting self.m_avida ..."
       self.connect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)

Modified: trunk/source/python/AvidaGui2/pyOnePop_PetriDishView.ui
===================================================================
--- trunk/source/python/AvidaGui2/pyOnePop_PetriDishView.ui	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyOnePop_PetriDishView.ui	2005-05-13 21:09:17 UTC (rev 155)
@@ -177,218 +177,198 @@
                             <property name="name">
                                 <cstring>unnamed</cstring>
                             </property>
+                            <widget class="pyPetriDishCtrl">
+                                <property name="name">
+                                    <cstring>m_petri_dish_ctrl</cstring>
+                                </property>
+                                <property name="sizePolicy">
+                                    <sizepolicy>
+                                        <hsizetype>5</hsizetype>
+                                        <vsizetype>5</vsizetype>
+                                        <horstretch>5</horstretch>
+                                        <verstretch>0</verstretch>
+                                    </sizepolicy>
+                                </property>
+                            </widget>
+                            <widget class="pyGradientScaleCtrl">
+                                <property name="name">
+                                    <cstring>m_gradient_scale_ctrl</cstring>
+                                </property>
+                                <property name="sizePolicy">
+                                    <sizepolicy>
+                                        <hsizetype>1</hsizetype>
+                                        <vsizetype>0</vsizetype>
+                                        <horstretch>1</horstretch>
+                                        <verstretch>0</verstretch>
+                                    </sizepolicy>
+                                </property>
+                                <property name="minimumSize">
+                                    <size>
+                                        <width>50</width>
+                                        <height>50</height>
+                                    </size>
+                                </property>
+                                <property name="backgroundMode">
+                                    <enum>PaletteDark</enum>
+                                </property>
+                            </widget>
                             <widget class="QLayoutWidget">
                                 <property name="name">
-                                    <cstring>layout10</cstring>
+                                    <cstring>layout1</cstring>
                                 </property>
-                                <vbox>
+                                <hbox>
                                     <property name="name">
                                         <cstring>unnamed</cstring>
                                     </property>
-                                    <widget class="QLayoutWidget">
+                                    <widget class="QLabel">
                                         <property name="name">
-                                            <cstring>layout91</cstring>
+                                            <cstring>textLabel11</cstring>
                                         </property>
-                                        <hbox>
-                                            <property name="name">
-                                                <cstring>unnamed</cstring>
-                                            </property>
-                                            <widget class="pyPetriDishCtrl">
-                                                <property name="name">
-                                                    <cstring>m_petri_dish_ctrl</cstring>
-                                                </property>
-                                                <property name="sizePolicy">
-                                                    <sizepolicy>
-                                                        <hsizetype>3</hsizetype>
-                                                        <vsizetype>3</vsizetype>
-                                                        <horstretch>5</horstretch>
-                                                        <verstretch>0</verstretch>
-                                                    </sizepolicy>
-                                                </property>
-                                            </widget>
-                                            <widget class="pyGradientScaleCtrl">
-                                                <property name="name">
-                                                    <cstring>m_gradient_scale_ctrl</cstring>
-                                                </property>
-                                                <property name="sizePolicy">
-                                                    <sizepolicy>
-                                                        <hsizetype>0</hsizetype>
-                                                        <vsizetype>1</vsizetype>
-                                                        <horstretch>1</horstretch>
-                                                        <verstretch>0</verstretch>
-                                                    </sizepolicy>
-                                                </property>
-                                                <property name="minimumSize">
-                                                    <size>
-                                                        <width>50</width>
-                                                        <height>50</height>
-                                                    </size>
-                                                </property>
-                                                <property name="backgroundMode">
-                                                    <enum>PaletteDark</enum>
-                                                </property>
-                                            </widget>
-                                        </hbox>
+                                        <property name="sizePolicy">
+                                            <sizepolicy>
+                                                <hsizetype>0</hsizetype>
+                                                <vsizetype>1</vsizetype>
+                                                <horstretch>0</horstretch>
+                                                <verstretch>0</verstretch>
+                                            </sizepolicy>
+                                        </property>
+                                        <property name="text">
+                                            <string>&lt;font size="-1"&gt;&lt;p align="right"&gt;Update:&lt;/p&gt;&lt;/font&gt;</string>
+                                        </property>
                                     </widget>
-                                    <widget class="QLayoutWidget">
+                                    <widget class="QLabel">
                                         <property name="name">
-                                            <cstring>layout1</cstring>
+                                            <cstring>m_update_label</cstring>
                                         </property>
-                                        <hbox>
-                                            <property name="name">
-                                                <cstring>unnamed</cstring>
+                                        <property name="sizePolicy">
+                                            <sizepolicy>
+                                                <hsizetype>0</hsizetype>
+                                                <vsizetype>1</vsizetype>
+                                                <horstretch>0</horstretch>
+                                                <verstretch>0</verstretch>
+                                            </sizepolicy>
+                                        </property>
+                                        <property name="text">
+                                            <string>&lt;font size="-1"&gt;-&lt;/font&gt;</string>
+                                        </property>
+                                    </widget>
+                                    <widget class="QComboBox">
+                                        <item>
+                                            <property name="text">
+                                                <string>Merit</string>
                                             </property>
-                                            <widget class="QLabel">
-                                                <property name="name">
-                                                    <cstring>textLabel11</cstring>
-                                                </property>
-                                                <property name="sizePolicy">
-                                                    <sizepolicy>
-                                                        <hsizetype>0</hsizetype>
-                                                        <vsizetype>1</vsizetype>
-                                                        <horstretch>0</horstretch>
-                                                        <verstretch>0</verstretch>
-                                                    </sizepolicy>
-                                                </property>
-                                                <property name="text">
-                                                    <string>&lt;font size="-1"&gt;&lt;p align="right"&gt;Update:&lt;/p&gt;&lt;/font&gt;</string>
-                                                </property>
-                                            </widget>
-                                            <widget class="QLabel">
-                                                <property name="name">
-                                                    <cstring>m_update_label</cstring>
-                                                </property>
-                                                <property name="sizePolicy">
-                                                    <sizepolicy>
-                                                        <hsizetype>0</hsizetype>
-                                                        <vsizetype>1</vsizetype>
-                                                        <horstretch>0</horstretch>
-                                                        <verstretch>0</verstretch>
-                                                    </sizepolicy>
-                                                </property>
-                                                <property name="text">
-                                                    <string>&lt;font size="-1"&gt;-&lt;/font&gt;</string>
-                                                </property>
-                                            </widget>
-                                            <widget class="QComboBox">
-                                                <item>
-                                                    <property name="text">
-                                                        <string>Merit</string>
-                                                    </property>
-                                                </item>
-                                                <property name="name">
-                                                    <cstring>m_mode_combobox</cstring>
-                                                </property>
-                                                <property name="sizePolicy">
-                                                    <sizepolicy>
-                                                        <hsizetype>1</hsizetype>
-                                                        <vsizetype>0</vsizetype>
-                                                        <horstretch>0</horstretch>
-                                                        <verstretch>0</verstretch>
-                                                    </sizepolicy>
-                                                </property>
-                                                <property name="font">
-                                                    <font>
-                                                        <pointsize>11</pointsize>
-                                                    </font>
-                                                </property>
-                                            </widget>
-                                            <widget class="QLabel">
-                                                <property name="name">
-                                                    <cstring>textLabel10</cstring>
-                                                </property>
-                                                <property name="sizePolicy">
-                                                    <sizepolicy>
-                                                        <hsizetype>0</hsizetype>
-                                                        <vsizetype>1</vsizetype>
-                                                        <horstretch>0</horstretch>
-                                                        <verstretch>0</verstretch>
-                                                    </sizepolicy>
-                                                </property>
-                                                <property name="text">
-                                                    <string>&lt;font size="-1"&gt;&lt;p align="right"&gt;Zoom:&lt;/p&gt;&lt;/font&gt;</string>
-                                                </property>
-                                            </widget>
-                                            <widget class="QSpinBox">
-                                                <property name="name">
-                                                    <cstring>m_zoom_spinbox</cstring>
-                                                </property>
-                                                <property name="sizePolicy">
-                                                    <sizepolicy>
-                                                        <hsizetype>0</hsizetype>
-                                                        <vsizetype>0</vsizetype>
-                                                        <horstretch>0</horstretch>
-                                                        <verstretch>0</verstretch>
-                                                    </sizepolicy>
-                                                </property>
-                                            </widget>
-                                        </hbox>
+                                        </item>
+                                        <property name="name">
+                                            <cstring>m_mode_combobox</cstring>
+                                        </property>
+                                        <property name="sizePolicy">
+                                            <sizepolicy>
+                                                <hsizetype>1</hsizetype>
+                                                <vsizetype>0</vsizetype>
+                                                <horstretch>0</horstretch>
+                                                <verstretch>0</verstretch>
+                                            </sizepolicy>
+                                        </property>
+                                        <property name="font">
+                                            <font>
+                                                <pointsize>11</pointsize>
+                                            </font>
+                                        </property>
                                     </widget>
-                                    <widget class="QLayoutWidget">
+                                    <widget class="QLabel">
                                         <property name="name">
-                                            <cstring>layout229</cstring>
+                                            <cstring>textLabel10</cstring>
                                         </property>
-                                        <hbox>
-                                            <property name="name">
-                                                <cstring>unnamed</cstring>
-                                            </property>
-                                            <spacer>
-                                                <property name="name">
-                                                    <cstring>spacer169_2</cstring>
-                                                </property>
-                                                <property name="orientation">
-                                                    <enum>Horizontal</enum>
-                                                </property>
-                                                <property name="sizeType">
-                                                    <enum>MinimumExpanding</enum>
-                                                </property>
-                                                <property name="sizeHint">
-                                                    <size>
-                                                        <width>10</width>
-                                                        <height>10</height>
-                                                    </size>
-                                                </property>
-                                            </spacer>
-                                            <widget class="pyLiveControlsCtrl">
-                                                <property name="name">
-                                                    <cstring>m_live_controls_ctrl</cstring>
-                                                </property>
-                                                <property name="sizePolicy">
-                                                    <sizepolicy>
-                                                        <hsizetype>0</hsizetype>
-                                                        <vsizetype>0</vsizetype>
-                                                        <horstretch>0</horstretch>
-                                                        <verstretch>0</verstretch>
-                                                    </sizepolicy>
-                                                </property>
-                                                <property name="minimumSize">
-                                                    <size>
-                                                        <width>0</width>
-                                                        <height>50</height>
-                                                    </size>
-                                                </property>
-                                            </widget>
-                                            <spacer>
-                                                <property name="name">
-                                                    <cstring>spacer169</cstring>
-                                                </property>
-                                                <property name="orientation">
-                                                    <enum>Horizontal</enum>
-                                                </property>
-                                                <property name="sizeType">
-                                                    <enum>MinimumExpanding</enum>
-                                                </property>
-                                                <property name="sizeHint">
-                                                    <size>
-                                                        <width>10</width>
-                                                        <height>10</height>
-                                                    </size>
-                                                </property>
-                                            </spacer>
-                                        </hbox>
+                                        <property name="sizePolicy">
+                                            <sizepolicy>
+                                                <hsizetype>0</hsizetype>
+                                                <vsizetype>1</vsizetype>
+                                                <horstretch>0</horstretch>
+                                                <verstretch>0</verstretch>
+                                            </sizepolicy>
+                                        </property>
+                                        <property name="text">
+                                            <string>&lt;font size="-1"&gt;&lt;p align="right"&gt;Zoom:&lt;/p&gt;&lt;/font&gt;</string>
+                                        </property>
                                     </widget>
-                                </vbox>
+                                    <widget class="QSpinBox">
+                                        <property name="name">
+                                            <cstring>m_zoom_spinbox</cstring>
+                                        </property>
+                                        <property name="sizePolicy">
+                                            <sizepolicy>
+                                                <hsizetype>0</hsizetype>
+                                                <vsizetype>0</vsizetype>
+                                                <horstretch>0</horstretch>
+                                                <verstretch>0</verstretch>
+                                            </sizepolicy>
+                                        </property>
+                                    </widget>
+                                </hbox>
                             </widget>
+                            <widget class="QLayoutWidget">
+                                <property name="name">
+                                    <cstring>layout229</cstring>
+                                </property>
+                                <hbox>
+                                    <property name="name">
+                                        <cstring>unnamed</cstring>
+                                    </property>
+                                    <spacer>
+                                        <property name="name">
+                                            <cstring>spacer169_2</cstring>
+                                        </property>
+                                        <property name="orientation">
+                                            <enum>Horizontal</enum>
+                                        </property>
+                                        <property name="sizeType">
+                                            <enum>MinimumExpanding</enum>
+                                        </property>
+                                        <property name="sizeHint">
+                                            <size>
+                                                <width>10</width>
+                                                <height>10</height>
+                                            </size>
+                                        </property>
+                                    </spacer>
+                                    <widget class="pyLiveControlsCtrl">
+                                        <property name="name">
+                                            <cstring>m_live_controls_ctrl</cstring>
+                                        </property>
+                                        <property name="sizePolicy">
+                                            <sizepolicy>
+                                                <hsizetype>0</hsizetype>
+                                                <vsizetype>0</vsizetype>
+                                                <horstretch>0</horstretch>
+                                                <verstretch>0</verstretch>
+                                            </sizepolicy>
+                                        </property>
+                                        <property name="minimumSize">
+                                            <size>
+                                                <width>0</width>
+                                                <height>50</height>
+                                            </size>
+                                        </property>
+                                    </widget>
+                                    <spacer>
+                                        <property name="name">
+                                            <cstring>spacer169</cstring>
+                                        </property>
+                                        <property name="orientation">
+                                            <enum>Horizontal</enum>
+                                        </property>
+                                        <property name="sizeType">
+                                            <enum>MinimumExpanding</enum>
+                                        </property>
+                                        <property name="sizeHint">
+                                            <size>
+                                                <width>10</width>
+                                                <height>10</height>
+                                            </size>
+                                        </property>
+                                    </spacer>
+                                </hbox>
+                            </widget>
                         </vbox>
                     </widget>
                     <widget class="QWidget">
@@ -478,6 +458,12 @@
         <property type="0">-1</property>
         <property type="1">pyPetriDishCtrl</property>
         <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
         <property type="pyPetriDishCtrl"></property>
         <property type="-1">1</property>
     </customwidget>
@@ -527,6 +513,12 @@
         <property type="0">-1</property>
         <property type="1">pyGradientScaleCtrl</property>
         <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
         <property type="pyGradientScaleCtrl"></property>
         <property type="-1">1</property>
     </customwidget>
@@ -576,6 +568,12 @@
         <property type="0">-1</property>
         <property type="1">pyLiveControlsCtrl</property>
         <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
         <property type="pyLiveControlsCtrl"></property>
         <property type="-1">1</property>
     </customwidget>
@@ -593,7 +591,7 @@
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
         </sizepolicy>
-        <pixmap>image3</pixmap>
+        <pixmap>image2</pixmap>
     </customwidget>
 </customwidgets>
 <images>
@@ -604,9 +602,6 @@
         <data format="PNG" length="528">89504e470d0a1a0a0000000d494844520000000f0000000e0806000000f08a46ef000001d749444154789c8592cd6a53511485bf9b5c098969a3adb645c1e24f1a9d288a139180c1d0a9e044a18238a8934ed4e2d41770208a5121fa04fa06058722c46141090d0435850493e6aff626b9e72c076dd33411ba6071e0ecb3ce62efbd90c4205bad96969f3c55a552d1706d980106d06eb7957991e5883b85319683e04802a0d3e928f332cb4c608edfb53c53735142a1d0bec7b1588c542a45381c76fa62dff7f5e65596e39ca356dee2d8d418963d6721ac0c5e6f8b5223cfdd07b74824128e238977afdf2bd63dc546b983acc0d91581248c8495c5f37da6a7c7215a63e1e16d82972f5e5577fd30ed3f86dd16f63b8295c5588b91a5d6dce4686492466f9dc0cdf91b14367ee0197f48b80dbbf3a19130b20868793dcabfea04a2d1a8b3f4688192f79dae35fb5ca5edd358db77b7b2f47a066fabbb37edc25a4199e79f383d769e4dbfc3df6e1383b0560870022eae13c2c8303931ce89b303ab02c8e5bee9e3872f6c7a75aea5cf100c06fbb566a34deeeb1a13e10bb8ee21aecf4f32929a9595cfba776749d56a752461f97c5e8bf79fe9f1e25b158b45b9c3a949a7534e28e42a12898c242a1e8f3b3327a3aa55eaccce!
 ce3a2362806432e9fcef1ee0d29504eb3f6b3b533d20fcc35c5d5d55a9549224fe01033d5afa3250e5560000000049454e44ae426082</data>
     </image>
     <image name="image2">
-        <data format="XBM.GZ" length="79">789c534e494dcbcc4b554829cdcdad8c2fcf4c29c95030e0524611cd48cd4ccf28010a1797249664262b2467241641a592324b8aa363156c15aab914146aadb90067111b1f</data>
-    </image>
-    <image name="image3">
         <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7!
 ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e05!
 82c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454e44a!
 e426082<
/data>
     </image>
 </images>

Modified: trunk/source/python/AvidaGui2/pyOnePop_StatsCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOnePop_StatsCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyOnePop_StatsCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -21,14 +21,17 @@
     self.m_clicked_cell_number = -99
 
   def setAvidaSlot(self, avida):
+    print "pyOnePop_StatsCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
     if(old_avida):
+      print "pyOnePop_StatsCtrl.setAvidaSlot() disconnecting old_avida ..."
       self.disconnect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
       del old_avida
     if(self.m_avida):
+      print "pyOnePop_StatsCtrl.setAvidaSlot() connecting self.m_avida ..."
       self.connect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)

Modified: trunk/source/python/AvidaGui2/pyOnePop_TimelineCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOnePop_TimelineCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyOnePop_TimelineCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -17,17 +17,20 @@
       self.setAvidaSlot)
 
   def setAvidaSlot(self, avida):
+    print "pyOnePop_TimelineCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
     if(old_avida):
+      print "pyOnePop_TimelineCtrl.setAvidaSlot() disconnecting old_avida ..."
       self.disconnect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
       del old_avida
     if(self.m_avida):
+      print "pyOnePop_TimelineCtrl.setAvidaSlot() connecting self.m_avida ..."
       self.connect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
 
   def avidaUpdatedSlot(self):
-    pass
\ No newline at end of file
+    pass

Modified: trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -30,9 +30,12 @@
       self.setDebugOrganismFileSlot)
 
   def setAvidaSlot(self, avida):
+    print "pyOrganismScopeCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
-    if(old_avida): del old_avida
+    if(old_avida):
+      print "pyOrganismScopeCtrl.setAvidaSlot() deleting old_avida ..."
+      del old_avida
 
   def setDebugOrganismFileSlot(self, organism_filename):
     print "pyOrganismScopeCtrl.setDebugOrganismFileSlot"

Modified: trunk/source/python/AvidaGui2/pyOrganismScopeView.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOrganismScopeView.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyOrganismScopeView.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 
 
-from qt import PYSIGNAL, QFont, QFontMetrics, QScrollView, QWMatrix
-from qtcanvas import QCanvas, QCanvasView, QCanvasText
+from qt import PYSIGNAL, QBrush, QColor, QFont, QFontMetrics, QPointArray, QPoint, QScrollView, Qt, QWMatrix
+from qtcanvas import QCanvas, QCanvasSpline, QCanvasText, QCanvasView
 import math
 
 class pyOrganismScopeView(QCanvasView):
@@ -37,6 +37,7 @@
     self.m_rhead_item = None
     self.m_whead_item = None
     self.m_fhead_item = None
+    self.m_rhead_move_items = None
 
     self.m_task_names = None
     self.m_inst_names = None
@@ -44,12 +45,14 @@
     self.m_frames = None
     self.m_max_genome_size = 0
     self.m_current_frame_number = 0
+    self.m_current_radius = None
     self.m_current_genome = None
     self.m_current_tasks = None
     self.m_current_ihead = None
     self.m_current_rhead = None
     self.m_current_whead = None
     self.m_current_fhead = None
+    self.m_current_rhead_move = None
 
     # Hmm; can't emit gestationTimeChangedSig(0) without causing absurd slider values. @kgn
     self.emit(PYSIGNAL("gestationTimeChangedSig"),(1,))
@@ -70,6 +73,8 @@
       if self.m_frames.m_genome_info is not None:
         self.m_max_genome_size = max([len(genome) for genome in self.m_frames.m_genome_info])
         self.m_instruction_items = [QCanvasText(self.m_canvas) for i in range(self.m_max_genome_size)]
+      if self.m_frames.m_ihead_moves is not None:
+        self.m_rhead_move_items = [QCanvasSpline(self.m_canvas) for i in range(len(self.m_frames.m_ihead_moves))]
       self.emit(PYSIGNAL("gestationTimeChangedSig"),(self.m_frames.m_gestation_time,))
       self.updateCircle()
       self.showFrame(0)
@@ -98,6 +103,7 @@
       for instruction_item in self.m_instruction_items:
         instruction_item.setFont(font)
       self.m_circles = []
+      self.m_circle_radii = []
       for frame_no in range(self.m_frames.m_gestation_time):
         organism_current_size = max(self.m_frames.m_last_copy_info[frame_no] + 1, self.m_frames.m_size)
         circumference = text_height * organism_current_size
@@ -113,29 +119,37 @@
           y = radius * s + self.m_circle_center_y
           circle_pts.append((x,y))
         self.m_circles.append(circle_pts)
+        self.m_circle_radii.append(radius)
 
   def showFrame(self, frame_number = 0):
     old_frame_number = self.m_current_frame_number
+    old_radius = self.m_current_radius
     old_genome = self.m_current_genome
     old_tasks = self.m_current_tasks
     old_ihead = self.m_current_ihead
     old_rhead = self.m_current_rhead
     old_whead = self.m_current_whead
     old_fhead = self.m_current_fhead
+    old_rhead_move = self.m_current_rhead_move
 
     self.m_current_frame_number = 0
+    self.m_current_radius = None
     self.m_current_genome = None
     self.m_current_tasks = None
     self.m_current_ihead = None
     self.m_current_rhead = None
     self.m_current_whead = None
     self.m_current_fhead = None
+    self.m_current_rhead_move = None
 
+    circle_pts = None
+
     if self.m_frames is not None and frame_number < self.m_frames.m_gestation_time:
       self.m_current_frame_number = frame_number
+      self.m_current_radius = self.m_circle_radii[frame_number]
+      circle_pts = self.m_circles[frame_number]
       if self.m_frames.m_genome_info is not None:
         self.m_current_genome = self.m_frames.m_genome_info[frame_number]
-        circle_pts = self.m_circles[self.m_current_frame_number]
         if old_genome is None:
           displayed_genome_size = max(self.m_frames.m_last_copy_info[self.m_current_frame_number], self.m_frames.m_size)
           # Update all instruction_items.
@@ -151,27 +165,99 @@
           new_length = max(self.m_frames.m_last_copy_info[self.m_current_frame_number] + 1, self.m_frames.m_size)
           compare_max = min(old_length, new_length)
           range_end = max(old_length, new_length)
+
+          if old_radius != self.m_current_radius:
+            for i in range(compare_max):
+              instruction_item = self.m_instruction_items[i]
+              instruction_item.setX(circle_pts[i][0])
+              instruction_item.setY(circle_pts[i][1])
+            if old_length < new_length:
+              for i in range(compare_max, range_end):
+                instruction_item = self.m_instruction_items[i]
+                instruction_item.setX(circle_pts[i][0])
+                instruction_item.setY(circle_pts[i][1])
+
           for i in range(compare_max):
             instruction_item = self.m_instruction_items[i]
-            instruction_item.setX(circle_pts[i][0])
-            instruction_item.setY(circle_pts[i][1])
             if old_genome[i] == self.m_current_genome[i]:
               pass
             else:
-              #self.m_instruction_items[i].setText(self.m_current_genome[i])
-              instruction_item.setText(self.m_current_genome[i])
+              self.m_instruction_items[i].setText(self.m_current_genome[i])
 
           if old_length < new_length:
             for i in range(compare_max, range_end):
               instruction_item = self.m_instruction_items[i]
-              instruction_item.setX(circle_pts[i][0])
-              instruction_item.setY(circle_pts[i][1])
               instruction_item.setText(self.m_current_genome[i])
               instruction_item.show()
           else:
             for i in range(compare_max, range_end):
               self.m_instruction_items[i].hide()
 
+      if self.m_frames.m_ihead_moves_info is not None:
+        self.m_current_rhead_move = self.m_frames.m_ihead_moves_info[frame_number]
+        if old_rhead_move is None:
+          # Update all rhead_move_items.
+          for i in range(self.m_current_rhead_move):
+            rhead_move_item = self.m_rhead_move_items[self.m_current_rhead_move]
+            anchor_radius = float(m_current_radius - 10)
+            anchor_radii_ratio = anchor_radius / self.m_current_radius
+            control_radii_ratio = (0.5 + 0.4/math.ldexp(1, self.m_frames.m_ihead_moves[rhead_move_item][2])) * anchor_radii_ratio
+            point_array = QPointArray(4)
+            from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[rhead_move_item][0]]
+            to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[rhead_move_item][1]]
+            point_array[0] = QPoint(
+              self.m_circle_center_x + anchor_radii_ratio * (from_circle_pt[0] - self.m_circle_center_x),
+              self.m_circle_center_y + anchor_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
+            )
+            point_array[1] = QPoint(
+              self.m_circle_center_x + control_radii_ratio * (from_circle_pt[0] - self.m_circle_center_x),
+              self.m_circle_center_y + control_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
+            )
+            point_array[2] = QPoint(
+              self.m_circle_center_x + control_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
+              self.m_circle_center_y + control_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
+            )
+            point_array[3] = QPoint(
+              self.m_circle_center_x + anchor_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
+              self.m_circle_center_y + anchor_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
+            )
+            rhead_move_item.setControlPoints(point_array, False)
+            rhead_move_item.setBrush(QBrush(Qt.blue))
+            rhead_move_item.show()
+        else:
+          # Update changed rhead_move_items.
+          for i in range(self.m_current_rhead_move):
+            rhead_move_item = self.m_rhead_move_items[i]
+            anchor_radius = float(self.m_current_radius - 10)
+            anchor_radii_ratio = anchor_radius / self.m_current_radius
+            control_radii_ratio = (0.5 + 0.4/math.ldexp(1, self.m_frames.m_ihead_moves[i][2])) * anchor_radii_ratio
+            point_array = QPointArray(4)
+            from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
+            to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
+            point_array.setPoint(0, QPoint(
+              self.m_circle_center_x + anchor_radii_ratio * (from_circle_pt[0] - self.m_circle_center_x),
+              self.m_circle_center_y + anchor_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
+            ) )
+            point_array.setPoint(1, QPoint(
+              self.m_circle_center_x + control_radii_ratio * (from_circle_pt[0] - self.m_circle_center_x),
+              self.m_circle_center_y + control_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
+            ) )
+            point_array.setPoint(2, QPoint(
+              self.m_circle_center_x + control_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
+              self.m_circle_center_y + control_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
+            ) )
+            point_array.setPoint(3, QPoint(
+              self.m_circle_center_x + anchor_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
+              self.m_circle_center_y + anchor_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
+            ) )
+            rhead_move_item.setControlPoints(point_array, False)
+            rhead_move_item.setBrush(QBrush(Qt.blue))
+            rhead_move_item.show()
+          if self.m_current_rhead_move < old_rhead_move:
+            for i in range(self.m_current_rhead_move, old_rhead_move):
+              self.m_rhead_move_items[i].hide()
+          pass
+
       if self.m_frames.m_tasks_info is not None:
         self.m_current_tasks = self.m_frames.m_tasks_info[frame_number]
         # Update tasks_item.

Modified: trunk/source/python/AvidaGui2/pyPetriConfigureCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyPetriConfigureCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyPetriConfigureCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -1,22 +1,36 @@
 # -*- coding: utf-8 -*-
 
-from qt import *
-import os
-import math
+from pyAvida import pyAvida
+from pyFreezeDialogCtrl import pyFreezeDialogCtrl
 from pyPetriConfigureView import pyPetriConfigureView
 from pyWriteGenesis import pyWriteGenesis
-from pyFreezeDialogCtrl import pyFreezeDialogCtrl
 from pyWriteToFreezer import pyWriteToFreezer
 
+from AvidaCore import cGenesis, cString
 
+from qt import *
+
+import os
+import math
+
 class pyPetriConfigureCtrl(pyPetriConfigureView):
 
   def __init__(self,parent = None,name = None,fl = 0):
     pyPetriConfigureView.__init__(self,parent,name,fl)
 
+
+  def setAvidaSlot(self, avida):
+    old_avida = self.m_avida
+    self.m_avida = avida
+    if old_avida:
+      del old_avida
+    if self.m_avida:
+      pass
+    
   def construct(self, session_mdl):
     self.m_session_mdl = session_mdl
     self.m_session_petri_view = pyPetriConfigureView()
+    self.m_avida = None
     self.full_petri_dict = {}
     self.DishDisabled = False
     self.connect(self.MutationSlider, SIGNAL("valueChanged(int)"), 
@@ -45,6 +59,9 @@
       self.DisablePetriConfigureSlot)
     self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("doInitializeAvidaPhaseISig"),
       self.CreateFilesFromPetriSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"), self.setAvidaSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("doInitializeAvidaPhaseIISig"),
+      self.doLoadPetriDishConfigFileSlot)
     self.ChangeMutationTextSlot()
     self.ChangeWorldSizeTextSlot()
     self.populated = False
@@ -235,3 +252,26 @@
       print "sending quit signal from pyPetriConfigureCtrl:FreezePetriSlot"
       self.m_session_mdl.m_session_mdtr.emit(
         PYSIGNAL("quitAvidaPhaseIISig"), ())
+
+  def doLoadPetriDishConfigFileSlot(self, genesisFileName = None):
+    genesis = cGenesis()
+    genesis.Open(cString(genesisFileName))
+    if 0 == genesis.IsOpen():
+      print "Warning: Unable to find file '", genesisFileName
+      return
+    avida = pyAvida()
+    avida.construct(genesis)
+    self.setAvidaSlot(avida)
+
+    # Stops self from hearing own setAvidaSig signal
+
+    self.disconnect(
+      self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"),
+      self.setAvidaSlot)
+    self.m_session_mdl.m_session_mdtr.emit(
+      PYSIGNAL("setAvidaSig"),
+      (self.m_avida,))
+    self.connect(
+      self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"),
+      self.setAvidaSlot)
+      

Modified: trunk/source/python/AvidaGui2/pyPetriDishCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyPetriDishCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pyPetriDishCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -16,6 +16,11 @@
 from pyPopulationCellItem import pyPopulationCellItem
 #from pyPetriDishView import pyPetriDishView
 
+class pySquareVBoxLayout(QVBoxLayout):
+  def __init__(self, *args): apply(QVBoxLayout.__init__, (self,)+args)
+  def hasHeightForWidth(self): return True
+  def heightForWidth(self, w): return w
+
 #class pyPetriDishCtrl(pyPetriDishView):
 class pyPetriDishCtrl(QWidget):
   def __init__(self,parent = None,name = None,fl = 0):
@@ -23,7 +28,7 @@
     QWidget.__init__(self,parent,name,fl)
     if not name: self.setName("pyPetriDishCtrl")
 
-    self.resize(QSize(202,202).expandedTo(self.minimumSizeHint()))
+    #self.resize(QSize(202,202).expandedTo(self.minimumSizeHint()))
     self.clearWState(Qt.WState_Polished)
 
   def construct(self, session_mdl):
@@ -32,8 +37,10 @@
 
     self.m_canvas = None
     self.m_cell_info = None
-    self.m_petri_dish_layout = QVBoxLayout(self,0,0,"m_petri_dish_layout")
-    self.m_petri_dish_layout.setResizeMode(QLayout.Minimum)
+    #self.m_petri_dish_layout = QVBoxLayout(self,0,0,"m_petri_dish_layout")
+    self.m_petri_dish_layout = pySquareVBoxLayout(self,0,0,"m_petri_dish_layout")
+    print "pyPetriDishCtrl.construct() self.m_petri_dish_layout.heightForWidth(20) :", self.m_petri_dish_layout.heightForWidth(20)
+    #self.m_petri_dish_layout.setResizeMode(QLayout.Minimum)
     self.m_canvas_view = pyPetriCanvasView(None, self,"m_canvas_view")
     self.m_petri_dish_layout.addWidget(self.m_canvas_view)
     self.m_changed_cell_items = []
@@ -64,9 +71,11 @@
       self.m_canvas)
 
   def setAvidaSlot(self, avida):
+    print "pyPetriDishCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
     self.m_avida = avida
     if(old_avida):
+      print "pyPetriDishCtrl.setAvidaSlot() deleting old_avida ..."
       del old_avida
     if(self.m_avida):
       pass

Modified: trunk/source/python/AvidaGui2/pySessionControllerFactory.py
===================================================================
--- trunk/source/python/AvidaGui2/pySessionControllerFactory.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pySessionControllerFactory.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -10,10 +10,9 @@
     self.m_session_mdl = m_session_mdl
     self.m_controller_creators_dict = {}
     self.m_session_controllers_list = []
-    self.m_session_mdl.m_session_mdtr.m_session_controller_factory_mdtr = pyMdtr()
-    self.connect(self.m_session_mdl.m_session_mdtr.m_session_controller_factory_mdtr,
+    self.connect(self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("newSessionControllerSig"), self.newSessionControllerSlot)
-    self.connect(self.m_session_mdl.m_session_mdtr.m_session_controller_factory_mdtr,
+    self.connect(self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("deleteControllerSig"), self.deleteControllerSlot)
     return self
   def addControllerCreator(self, creator_key, creator):
@@ -47,17 +46,12 @@
       def test(self):
         class pyMdl: pass
         stub_mdl = pyMdl()
-        stub_mdl.m_session_mdtr = pyMdtr()
         session_controller_factory_factory = lambda : pySessionControllerFactory().construct(stub_mdl)
 
         things_that_will_live_on = [
           # I instantiated these above, and (on purpose) they won't be deleted.
           '.m_session_mdl',
           '.m_session_mdl.m_session_mdtr',
-          # pySessionControllerFactory creates
-          # m_session_controller_factory_mdtr, but by design doesn't
-          # delete it.
-          '.m_session_mdl.m_session_mdtr.m_session_controller_factory_mdtr',
         ]
 
         endotests = recursiveDeleteChecks(session_controller_factory_factory, things_that_will_live_on)

Modified: trunk/source/python/AvidaGui2/pySessionCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pySessionCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pySessionCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -4,7 +4,6 @@
 from pyMdtr import *
 from pySessionControllerFactory import *
 from pySessionDumbCtrl import *
-from pySessionWorkThreadHdlr import *
 
 from AvidaCore import cString
 
@@ -59,14 +58,14 @@
     self.m_session_controller_factory.addControllerCreator("pySessionDumbCtrl", pySessionDumbCtrl)
     self.m_session_controller_factory.addControllerCreator("pyEduWorkspaceCtrl", pyEduWorkspaceCtrl)
 
-    self.m_session_mdl.m_session_mdtr.m_session_controller_factory_mdtr.emit(
+    self.m_session_mdl.m_session_mdtr.emit(
       qt.PYSIGNAL("newSessionControllerSig"), ("pyEduSessionMenuBarHdlr",))
     
     ## XXX Temporary. Cause instantiation of a dumb gui for testing. @kgn
-    self.m_session_mdl.m_session_mdtr.m_session_controller_factory_mdtr.emit(
+    self.m_session_mdl.m_session_mdtr.emit(
       qt.PYSIGNAL("newSessionControllerSig"), ("pySessionDumbCtrl",))
 
-    self.m_session_mdl.m_session_mdtr.m_session_controller_factory_mdtr.emit(
+    self.m_session_mdl.m_session_mdtr.emit(
       qt.PYSIGNAL("newSessionControllerSig"), ("pyEduWorkspaceCtrl",))
 
     self.connect(self.m_session_mdl.m_session_mdtr, qt.PYSIGNAL("doOrphanSessionSig"), self.doOrphanSessionSlot)
@@ -107,7 +106,6 @@
     self.adoptUnitTestSuite("pyMdtr")
     self.adoptUnitTestSuite("pySessionControllerFactory")
     self.adoptUnitTestSuite("pySessionDumbCtrl")
-    self.adoptUnitTestSuite("pySessionWorkThreadHdlr")
 
     class deleteChecks(pyTestCase):
       def test(self):

Modified: trunk/source/python/AvidaGui2/pySessionDumbCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pySessionDumbCtrl.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pySessionDumbCtrl.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -14,13 +14,13 @@
   def setAvidaSlot(self, avida):
     old_avida = self.m_avida
     self.m_avida = avida
-    if(old_avida):
-      print "pySessionDumbCtrl.setAvidaSlot(): disconnecting..."
+    if old_avida and hasattr(old_avida, "m_avida_thread_mdtr"):
+      print "pySessionDumbCtrl.setAvidaSlot(): disconnecting old_avida ..."
       self.disconnect(
         old_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
       self.disconnect(
-       self.m_session_mdl.m_session_mdtr, PYSIGNAL("doStartAvidaSig"),
+        self.m_session_mdl.m_session_mdtr, PYSIGNAL("doStartAvidaSig"),
         old_avida.m_avida_thread_mdtr, PYSIGNAL("doStartAvidaSig"))
       self.disconnect(
         self.m_session_mdl.m_session_mdtr, PYSIGNAL("doPauseAvidaSig"),
@@ -32,9 +32,10 @@
         self.m_session_mdl.m_session_mdtr, 
         PYSIGNAL("fromLiveCtrlUpdateAvidaSig"),
         old_avida.m_avida_thread_mdtr, PYSIGNAL("doUpdateAvidaSig"))
+      print "pySessionDumbCtrl.setAvidaSlot(): deleting old_avida ..."
       del old_avida
-    if(self.m_avida):
-      print "pySessionDumbCtrl.setAvidaSlot(): connecting..."
+    if self.m_avida and hasattr(self.m_avida, "m_avida_thread_mdtr"):
+      print "pySessionDumbCtrl.setAvidaSlot(): connecting self.m_avida ..."
       self.connect(
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
@@ -62,35 +63,6 @@
     self.connect(
       self, PYSIGNAL("doDebugLoadOrganismSig"),
       self.doDebugLoadOrganismSlot)
-
-  def doLoadPetriDishConfigFileSlot(self, genesisFileName = None):
-#    s = QFileDialog.getOpenFileName(
-#      ".",
-#      "(*.avida)",
-#      None,
-#      "open file dialog",
-#      "Choose a file")
-#    print "s:", s
-    genesis = cGenesis()
-    genesis.Open(cString(genesisFileName))
-    if 0 == genesis.IsOpen():
-      print "Warning: Unable to find file '", genesisFileName
-      return
-    avida = pyAvida()
-    avida.construct(genesis)
-    self.setAvidaSlot(avida)
-
-    # Stops self from hearing own setAvidaSig signal
-
-    self.disconnect(
-      self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"),
-      self.setAvidaSlot)
-    self.m_session_mdl.m_session_mdtr.emit(
-      PYSIGNAL("setAvidaSig"),
-      (self.m_avida,))
-    self.connect(
-      self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"),
-      self.setAvidaSlot)
       
   def doDebugLoadOrganismSlot(self):
     if self.m_avida:
@@ -122,20 +94,20 @@
       self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"),
       self.setAvidaSlot)
 
-    self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr.emit(
+    self.m_session_mdl.m_session_mdtr.emit(
         PYSIGNAL("doSetupMainWindowMenuBarSig"),
         (self,))
 
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       PYSIGNAL("doStartSig"),
       self.doStart)
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       PYSIGNAL("doPauseSig"),
       self.doPause)
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_edu_session_menu_bar_hdlr_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       PYSIGNAL("doNextUpdateSig"),
       self.updatePBClickedSlot)
 
@@ -148,10 +120,6 @@
       
     self.connect(
       self.m_session_mdl.m_session_mdtr, 
-      PYSIGNAL("doInitializeAvidaPhaseIISig"),
-      self.doLoadPetriDishConfigFileSlot)
-    self.connect(
-      self.m_session_mdl.m_session_mdtr, 
       PYSIGNAL("fromLiveCtrlPauseAvidaSig"),
       self.doPause)
     self.connect(
@@ -174,13 +142,16 @@
     self.show()
 
   def __del__(self):
-    self.setAvidaSlot(None)
+    print "pySessionDumbCtrl.__del__() disconnecting ..."
     self.disconnect(
       self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"),
       self.setAvidaSlot)
+    print "pySessionDumbCtrl.__del__() sending setAvidaSig(None) ..."
     self.m_session_mdl.m_session_mdtr.emit(
       PYSIGNAL("setAvidaSig"),
       (None,))
+    #self.setAvidaSlot(None)
+    print "pySessionDumbCtrl.__del__() done ..."
       
   def doStart(self):
     if self.sessionInitialized == False:

Modified: trunk/source/python/AvidaGui2/pySessionWorkThreadHdlr.py
===================================================================
--- trunk/source/python/AvidaGui2/pySessionWorkThreadHdlr.py	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/AvidaGui2/pySessionWorkThreadHdlr.py	2005-05-13 21:09:17 UTC (rev 155)
@@ -31,21 +31,20 @@
     self.m_session_mdl.m_population = \
       self.m_avida_threaded_driver.GetPopulation()
 
-    self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr = pyMdtr()
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doPauseAvidaSig"),
       self.doPauseAvidaSlot)
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doStartAvidaSig"),
       self.doStartAvidaSlot)
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doUpdateAvidaSig"),
       self.doUpdateAvidaSlot)
     self.connect(
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doCloseAvidaSig"),
       self.doCloseAvidaSlot)
 
@@ -59,7 +58,7 @@
 
   def destruct(self):
     print("pySessionWorkThreadHdlr.destruct()...")
-    self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr.emit(
+    self.m_session_mdl.m_session_mdtr.emit(
       qt.PYSIGNAL("doCloseAvidaSig"),())
     if hasattr(self, "m_update_ck_timer"):
       self.m_update_ck_timer.stop()
@@ -68,27 +67,22 @@
       print("pySessionWorkThreadHdlr.destruct() self.m_update_ck_timer missing.")
 
     self.disconnect(
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doPauseAvidaSig"),
       self.doPauseAvidaSlot)
     self.disconnect(
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doStartAvidaSig"),
       self.doStartAvidaSlot)
     self.disconnect(
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doUpdateAvidaSig"),
       self.doUpdateAvidaSlot)
     self.disconnect(
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr,
+      self.m_session_mdl.m_session_mdtr,
       qt.PYSIGNAL("doCloseAvidaSig"),
       self.doCloseAvidaSlot)
 
-    if hasattr(self.m_session_mdl.m_session_mdtr, "m_avida_threaded_driver_mdtr"):
-      del self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr
-    else:
-      print("pySessionWorkThreadHdlr.destruct() self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr missing.")
-
     if hasattr(self, "updated_semaphore"):
       del self.m_updated_semaphore
     else:
@@ -105,11 +99,6 @@
       #print("pySessionWorkThreadHdlr.destruct() self.m_session_mdl.m_avida_threaded_driver missing.")
       print("pySessionWorkThreadHdlr.destruct() self.m_avida_threaded_driver missing.")
 
-    if hasattr(self, "m_session_mdl"):
-      del self.m_session_mdl
-    else:
-      print("pySessionWorkThreadHdlr.destruct() self.m_session_mdl missing.")
-
     print("pySessionWorkThreadHdlr.destruct() done.")
 
   def __del__(self):
@@ -119,7 +108,7 @@
 
   def updateCheckSlot(self):
     if self.m_updated_semaphore.acquire(False):
-      self.m_session_mdl.m_session_mdtr.m_avida_threaded_driver_mdtr.emit(
+      self.m_session_mdl.m_session_mdtr.emit(
 	qt.PYSIGNAL("AvidaUpdatedSig"),())
       if True == self.m_should_update:
         self.doUpdateAvidaSlot()

Modified: trunk/source/python/setup_osx.py.in
===================================================================
--- trunk/source/python/setup_osx.py.in	2005-05-02 14:46:24 UTC (rev 154)
+++ trunk/source/python/setup_osx.py.in	2005-05-13 21:09:17 UTC (rev 155)
@@ -52,9 +52,7 @@
   ),
   data_files=[
     ('../Resources',
-      # script to launch AvidaEd from command-line, then drop into
-      # python shell (for convenience of developers)
-      [ '${CMAKE_CURRENT_SOURCE_DIR}/AvidaEd-interactive.py' ]
+      [ '${CMAKE_CURRENT_SOURCE_DIR}/AvidaGui2/avidalogo.png' ]
       #+
       ## Avida configuration files
       ## FIXME # these only temporarily live in Resources, until we make




More information about the Avida-cvs mailing list