From 6268a7aaa32be63b3fe8891344717de993f64374 Mon Sep 17 00:00:00 2001
From: "Michael D. M. Dryden" <mdryden@chem.utoronto.ca>
Date: Tue, 26 Aug 2014 17:46:49 -0400
Subject: [PATCH] Condense all experiment parameter classes into exp_int.py and
 parameter fetching now uses get_params method for all experiments.

---
 .../dstat-interface/interface/acv.py          |  15 --
 .../dstat-interface/interface/chronoamp.py    |  64 ------
 .../dstat-interface/interface/cv.py           |  19 --
 .../dstat-interface/interface/dpv.py          |  20 --
 .../dstat-interface/interface/exp_int.py      | 187 ++++++++++++++++++
 .../dstat-interface/interface/exp_window.py   |  22 +--
 .../dstat-interface/interface/lsv.py          |  18 --
 .../dstat-interface/interface/pd.py           |  12 --
 .../dstat-interface/interface/swv.py          |  21 --
 dstat-interface/dstat-interface/main.py       |  42 +---
 10 files changed, 200 insertions(+), 220 deletions(-)
 delete mode 100644 dstat-interface/dstat-interface/interface/acv.py
 delete mode 100644 dstat-interface/dstat-interface/interface/chronoamp.py
 delete mode 100644 dstat-interface/dstat-interface/interface/cv.py
 delete mode 100644 dstat-interface/dstat-interface/interface/dpv.py
 create mode 100644 dstat-interface/dstat-interface/interface/exp_int.py
 delete mode 100644 dstat-interface/dstat-interface/interface/lsv.py
 delete mode 100644 dstat-interface/dstat-interface/interface/pd.py
 delete mode 100644 dstat-interface/dstat-interface/interface/swv.py

diff --git a/dstat-interface/dstat-interface/interface/acv.py b/dstat-interface/dstat-interface/interface/acv.py
deleted file mode 100644
index 214af83..0000000
--- a/dstat-interface/dstat-interface/interface/acv.py
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env python
-
-import gtk
-
-class acv:
-    def __init__(self):
-        self.builder = gtk.Builder()
-        self.builder.add_from_file('interface/acv.glade')
-        self.builder.connect_signals(self)
-
-        self.start_entry = self.builder.get_object('start_entry')
-        self.stop_entry = self.builder.get_object('stop_entry')
-        self.slope_entry = self.builder.get_object('slope_entry')
-        self.amplitude_entry = self.builder.get_object('amplitude_entry')
-        self.freq_entry = self.builder.get_object('freq_entry')
\ No newline at end of file
diff --git a/dstat-interface/dstat-interface/interface/chronoamp.py b/dstat-interface/dstat-interface/interface/chronoamp.py
deleted file mode 100644
index 39e9136..0000000
--- a/dstat-interface/dstat-interface/interface/chronoamp.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-
-import gtk
-
-class Chronoamp:
-    def __init__(self):
-        self.builder = gtk.Builder()
-        self.builder.add_from_file('interface/chronoamp.glade')
-        self.builder.connect_signals(self)
-        
-        self.statusbar = self.builder.get_object('statusbar')
-        self.model = self.builder.get_object('ca_list')
-        self.treeview = self.builder.get_object('treeview')
-        self.cell_renderer = gtk.CellRendererText()
-        
-        self.treeview.insert_column_with_attributes(-1, "Time",
-                                    self.cell_renderer, text=1).set_expand(True)
-        self.treeview.insert_column_with_attributes(-1, "Potential",
-                                    self.cell_renderer, text=0).set_expand(True)
-        
-        self.selection = self.treeview.get_selection()
-        self.selection.set_mode(gtk.SELECTION_MULTIPLE)
-
-    def on_add_button_clicked(self, widget):
-        """Add current values in potential_entry and time_entry to model."""
-        
-        self.statusbar.remove_all(0)
-        
-        try:
-            potential = int(
-                          self.builder.get_object('potential_entry').get_text())
-            time = int(self.builder.get_object('time_entry').get_text())
-            
-            if (potential > 1499 or potential < -1500):
-                raise ValueError("Potential out of range")
-            if (time < 1 or time > 65535):
-                raise ValueError("Time out of range")
-        
-            self.model.append([potential, time])
-        
-        except ValueError as err:
-            self.statusbar.push(0, str(err))
-        except TypeError as err:
-            self.statusbar.push(0, str(err))
-
-    def on_remove_button_clicked(self, widget):
-        """Remove currently selected items from model."""
-        # returns 2-tuple: treemodel, list of paths of selected rows
-        selected_rows = list(self.selection.get_selected_rows()[1])
-        referencelist = []
-        
-        for i in selected_rows:
-            referencelist.append(gtk.TreeRowReference(self.model, i))
-        
-        for i in referencelist:
-            self.model.remove(self.model.get_iter(i.get_path()))
-
-    def get_params(self):
-        """Returns a dict of parameters for experiment."""
-        parameters = {}
-        parameters['potential'] = [int(r[0]) for r in self.model]
-        parameters['time'] = [int(r[1]) for r in self.model]
-        
-        return parameters
\ No newline at end of file
diff --git a/dstat-interface/dstat-interface/interface/cv.py b/dstat-interface/dstat-interface/interface/cv.py
deleted file mode 100644
index 0aadf29..0000000
--- a/dstat-interface/dstat-interface/interface/cv.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env python
-
-import gtk
-
-class cv:
-    def __init__(self):
-        self.builder = gtk.Builder()
-        self.builder.add_from_file('interface/cv.glade')
-        self.builder.connect_signals(self)
-
-        self.clean_mV = self.builder.get_object('clean_mV')
-        self.clean_s = self.builder.get_object('clean_s')
-        self.dep_mV = self.builder.get_object('dep_mV')
-        self.dep_s = self.builder.get_object('dep_s')
-        self.start_entry = self.builder.get_object('start_entry')
-        self.v1_entry = self.builder.get_object('v1_entry')
-        self.v2_entry = self.builder.get_object('v2_entry')
-        self.slope_entry = self.builder.get_object('slope_entry')
-        self.scans_entry = self.builder.get_object('scans_entry')
\ No newline at end of file
diff --git a/dstat-interface/dstat-interface/interface/dpv.py b/dstat-interface/dstat-interface/interface/dpv.py
deleted file mode 100644
index deb81bf..0000000
--- a/dstat-interface/dstat-interface/interface/dpv.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env python
-
-import gtk
-
-class dpv:
-    def __init__(self):
-        self.builder = gtk.Builder()
-        self.builder.add_from_file('interface/dpv.glade')
-        self.builder.connect_signals(self)
-
-        self.clean_mV = self.builder.get_object('clean_mV')
-        self.clean_s = self.builder.get_object('clean_s')
-        self.dep_mV = self.builder.get_object('dep_mV')
-        self.dep_s = self.builder.get_object('dep_s')
-        self.start_entry = self.builder.get_object('start_entry')
-        self.stop_entry = self.builder.get_object('stop_entry')
-        self.step_entry = self.builder.get_object('step_entry')
-        self.pulse_entry = self.builder.get_object('pulse_entry')
-        self.period_entry = self.builder.get_object('period_entry')
-        self.width_entry = self.builder.get_object('width_entry')
\ No newline at end of file
diff --git a/dstat-interface/dstat-interface/interface/exp_int.py b/dstat-interface/dstat-interface/interface/exp_int.py
new file mode 100644
index 0000000..8208eeb
--- /dev/null
+++ b/dstat-interface/dstat-interface/interface/exp_int.py
@@ -0,0 +1,187 @@
+#!/usr/bin/env python
+
+import gtk
+
+class ExpInterface(object):
+    """Generic experiment interface class. Should be subclassed to implement
+    experiment interfaces by populating self.entry.
+    
+    Public methods:
+    get_params(self)
+    """
+    def __init__(self, glade_path):
+        self.builder = gtk.Builder()
+        self.builder.add_from_file(glade_path)
+        self.builder.connect_signals(self)
+        self.entry = {}
+
+    def get_params(self):
+        """Returns a dict of parameters for experiment."""
+        parameters = {}    
+        for key, value in self.entry.iteritems():
+            parameters[key] = int(value.get_text())    
+        return parameters
+        
+class Chronoamp(ExpInterface):
+    """Experiment class for chronoamperometry. Extends ExpInterface class to
+    support treeview neeeded for CA.
+    
+    Public methods:
+    on_add_button_clicked(self, widget)
+    on_remove_button_clicked(self, widget)
+    get_params(self)
+    """
+    def __init__(self):
+        """Extends superclass method to support treeview."""
+        super(Chronoamp, self).__init__('interface/chronoamp.glade')
+        
+        self.statusbar = self.builder.get_object('statusbar')
+        self.model = self.builder.get_object('ca_list')
+        self.treeview = self.builder.get_object('treeview')
+        self.cell_renderer = gtk.CellRendererText()
+        
+        self.treeview.insert_column_with_attributes(-1, "Time",
+                                    self.cell_renderer, text=1).set_expand(True)
+        self.treeview.insert_column_with_attributes(-1, "Potential",
+                                    self.cell_renderer, text=0).set_expand(True)
+        
+        self.selection = self.treeview.get_selection()
+        self.selection.set_mode(gtk.SELECTION_MULTIPLE)
+
+    def on_add_button_clicked(self, widget):
+        """Add current values in potential_entry and time_entry to model."""
+        
+        self.statusbar.remove_all(0)
+        
+        try:
+            potential = int(
+                          self.builder.get_object('potential_entry').get_text())
+            time = int(self.builder.get_object('time_entry').get_text())
+            
+            if (potential > 1499 or potential < -1500):
+                raise ValueError("Potential out of range")
+            if (time < 1 or time > 65535):
+                raise ValueError("Time out of range")
+        
+            self.model.append([potential, time])
+        
+        except ValueError as err:
+            self.statusbar.push(0, str(err))
+        except TypeError as err:
+            self.statusbar.push(0, str(err))
+
+    def on_remove_button_clicked(self, widget):
+        """Remove currently selected items from model."""
+        # returns 2-tuple: treemodel, list of paths of selected rows
+        selected_rows = list(self.selection.get_selected_rows()[1])
+        referencelist = []
+        
+        for i in selected_rows:
+            referencelist.append(gtk.TreeRowReference(self.model, i))
+        
+        for i in referencelist:
+            self.model.remove(self.model.get_iter(i.get_path()))
+
+    def get_params(self):
+        """Returns a dict of parameters for experiment. Overrides superclass
+        method.
+        """
+        parameters = {}
+        parameters['potential'] = [int(r[0]) for r in self.model]
+        parameters['time'] = [int(r[1]) for r in self.model]
+        
+        return parameters
+              
+class LSV(ExpInterface):
+    """Experiment class for LSV."""
+    def __init__(self):
+        """Adds entry listings to superclass's self.entry dict"""
+        super(LSV, self).__init__('interface/lsv.glade')
+
+        self.entry['clean_mV'] = self.builder.get_object('clean_mV')
+        self.entry['clean_s'] = self.builder.get_object('clean_s')
+        self.entry['dep_mV'] = self.builder.get_object('dep_mV')
+        self.entry['dep_s'] = self.builder.get_object('dep_s')
+        self.entry['start'] = self.builder.get_object('start_entry')
+        self.entry['stop'] = self.builder.get_object('stop_entry')
+        self.entry['slope'] = self.builder.get_object('slope_entry')
+        
+class CV(ExpInterface):
+    """Experiment class for CV."""
+    def __init__(self):
+        """Adds entry listings to superclass's self.entry dict"""
+        super(CV, self).__init__('interface/cv.glade')
+
+        self.entry['clean_mV'] = self.builder.get_object('clean_mV')
+        self.entry['clean_s'] = self.builder.get_object('clean_s')
+        self.entry['dep_mV'] = self.builder.get_object('dep_mV')
+        self.entry['dep_s'] = self.builder.get_object('dep_s')
+        self.entry['start'] = self.builder.get_object('start_entry')
+        self.entry['v1'] = self.builder.get_object('v1_entry')
+        self.entry['v2'] = self.builder.get_object('v2_entry')
+        self.entry['slope'] = self.builder.get_object('slope_entry')
+        self.entry['scans'] = self.builder.get_object('scans_entry')
+
+class SWV(ExpInterface):
+    """Experiment class for SWV."""
+    def __init__(self):
+        """Adds entry listings to superclass's self.entry dict"""
+        super(SWV, self).__init__('interface/swv.glade')
+
+        self.entry['clean_mV'] = self.builder.get_object('clean_mV')
+        self.entry['clean_s'] = self.builder.get_object('clean_s')
+        self.entry['dep_mV'] = self.builder.get_object('dep_mV')
+        self.entry['dep_s'] = self.builder.get_object('dep_s')
+        self.entry['start'] = self.builder.get_object('start_entry')
+        self.entry['stop'] = self.builder.get_object('stop_entry')
+        self.entry['step'] = self.builder.get_object('step_entry')
+        self.entry['pulse'] = self.builder.get_object('pulse_entry')
+        self.entry['freq'] = self.builder.get_object('freq_entry')
+        self.entry['scans'] = self.builder.get_object('scans_entry')
+        
+    def get_params(self):
+        """Extends superclass method to pass status of cyclic_checkbutton"""
+        parameters = {}
+        parameters['cyclic_checkbutton'] = self.builder.get_object(
+                                              'cyclic_checkbutton').get_active()
+        parameters.update(super(SWV, self).get_params())
+        
+        return parameters
+        
+class DPV(ExpInterface):
+    """Experiment class for DPV."""
+    def __init__(self):
+        """Adds entry listings to superclass's self.entry dict"""
+        super(DPV, self).__init__('interface/dpv.glade')
+
+        self.entry['clean_mV'] = self.builder.get_object('clean_mV')
+        self.entry['clean_s'] = self.builder.get_object('clean_s')
+        self.entry['dep_mV'] = self.builder.get_object('dep_mV')
+        self.entry['dep_s'] = self.builder.get_object('dep_s')
+        self.entry['start'] = self.builder.get_object('start_entry')
+        self.entry['stop'] = self.builder.get_object('stop_entry')
+        self.entry['step'] = self.builder.get_object('step_entry')
+        self.entry['pulse'] = self.builder.get_object('pulse_entry')
+        self.entry['period'] = self.builder.get_object('period_entry')
+        self.entry['width'] = self.builder.get_object('width_entry')
+        
+class ACV(ExpInterface):
+    """Experiment class for ACV."""
+    def __init__(self):
+        """Adds entry listings to superclass's self.entry dict"""
+        super(ACV, self).__init__('interface/acv.glade')
+        
+        self.entry['start'] = self.builder.get_object('start_entry')
+        self.entry['stop'] = self.builder.get_object('stop_entry')
+        self.entry['slope'] = self.builder.get_object('slope_entry')
+        self.entry['amplitude'] = self.builder.get_object('amplitude_entry')
+        self.entry['freq'] = self.builder.get_object('freq_entry')
+
+class PD(ExpInterface):
+    """Experiment class for PD."""
+    def __init__(self):
+        """Adds entry listings to superclass's self.entry dict"""
+        super(PD, self).__init__('interface/pd.glade')
+        
+        self.entry['voltage'] = self.builder.get_object('voltage_entry')
+        self.entry['time'] = self.builder.get_object('time_entry')
\ No newline at end of file
diff --git a/dstat-interface/dstat-interface/interface/exp_window.py b/dstat-interface/dstat-interface/interface/exp_window.py
index 34e3ca9..6038229 100644
--- a/dstat-interface/dstat-interface/interface/exp_window.py
+++ b/dstat-interface/dstat-interface/interface/exp_window.py
@@ -1,23 +1,17 @@
-import chronoamp
-import lsv
-import cv
-import swv
-import dpv
-import acv
-import pd
+import interface.exp_int as exp
 
 class Experiments:
     def __init__(self, builder):
         self.builder = builder
         
         self.classes = {}
-        self.classes['cae'] = chronoamp.Chronoamp()
-        self.classes['lsv'] = lsv.lsv()
-        self.classes['cve'] = cv.cv()
-        self.classes['swv'] = swv.swv()
-        self.classes['dpv'] = dpv.dpv()
-        self.classes['acv'] = acv.acv()
-        self.classes['pde'] = pd.pd()
+        self.classes['cae'] = exp.Chronoamp()
+        self.classes['lsv'] = exp.LSV()
+        self.classes['cve'] = exp.CV()
+        self.classes['swv'] = exp.SWV()
+        self.classes['dpv'] = exp.DPV()
+        self.classes['acv'] = exp.ACV()
+        self.classes['pde'] = exp.PD()
  
         #fill exp_section
         exp_section = self.builder.get_object('exp_section_box')
diff --git a/dstat-interface/dstat-interface/interface/lsv.py b/dstat-interface/dstat-interface/interface/lsv.py
deleted file mode 100644
index 990ca64..0000000
--- a/dstat-interface/dstat-interface/interface/lsv.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python
-
-import gtk
-
-class lsv:
-    def __init__(self):
-        self.builder = gtk.Builder()
-        self.builder.add_from_file('interface/lsv.glade')
-        self.builder.connect_signals(self)
-        
-        
-        self.clean_mV = self.builder.get_object('clean_mV')
-        self.clean_s = self.builder.get_object('clean_s')
-        self.dep_mV = self.builder.get_object('dep_mV')
-        self.dep_s = self.builder.get_object('dep_s')
-        self.start_entry = self.builder.get_object('start_entry')
-        self.stop_entry = self.builder.get_object('stop_entry')
-        self.slope_entry = self.builder.get_object('slope_entry')
\ No newline at end of file
diff --git a/dstat-interface/dstat-interface/interface/pd.py b/dstat-interface/dstat-interface/interface/pd.py
deleted file mode 100644
index bd6652d..0000000
--- a/dstat-interface/dstat-interface/interface/pd.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env python
-
-import gtk
-
-class pd:
-    def __init__(self):
-        self.builder = gtk.Builder()
-        self.builder.add_from_file('interface/pd.glade')
-        self.builder.connect_signals(self)
-
-        self.voltage_entry = self.builder.get_object('voltage_entry')
-        self.time_entry = self.builder.get_object('time_entry')
\ No newline at end of file
diff --git a/dstat-interface/dstat-interface/interface/swv.py b/dstat-interface/dstat-interface/interface/swv.py
deleted file mode 100644
index a78c44b..0000000
--- a/dstat-interface/dstat-interface/interface/swv.py
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env python
-
-import gtk
-
-class swv:
-    def __init__(self):
-        self.builder = gtk.Builder()
-        self.builder.add_from_file('interface/swv.glade')
-        self.builder.connect_signals(self)
-
-        self.clean_mV = self.builder.get_object('clean_mV')
-        self.clean_s = self.builder.get_object('clean_s')
-        self.dep_mV = self.builder.get_object('dep_mV')
-        self.dep_s = self.builder.get_object('dep_s')
-        self.start_entry = self.builder.get_object('start_entry')
-        self.stop_entry = self.builder.get_object('stop_entry')
-        self.step_entry = self.builder.get_object('step_entry')
-        self.pulse_entry = self.builder.get_object('pulse_entry')
-        self.freq_entry = self.builder.get_object('freq_entry')
-        self.cyclic_checkbutton = self.builder.get_object('cyclic_checkbutton')
-        self.scans_entry = self.builder.get_object('scans_entry')
\ No newline at end of file
diff --git a/dstat-interface/dstat-interface/main.py b/dstat-interface/dstat-interface/main.py
index c8c9842..f54dbf8 100644
--- a/dstat-interface/dstat-interface/main.py
+++ b/dstat-interface/dstat-interface/main.py
@@ -226,13 +226,7 @@ class Main(object):
                 return
         
             elif selection == 1: # LSV
-                parameters['clean_mV'] = int(self.lsv.clean_mV.get_text())
-                parameters['clean_s'] = int(self.lsv.clean_s.get_text())
-                parameters['dep_mV'] = int(self.lsv.dep_mV.get_text())
-                parameters['dep_s'] = int(self.lsv.dep_s.get_text())
-                parameters['start'] = int(self.lsv.start_entry.get_text())
-                parameters['stop'] = int(self.lsv.stop_entry.get_text())
-                parameters['slope'] = int(self.lsv.slope_entry.get_text())
+                parameters.update(self.exp_window.get_params('lsv'))
                 
                 #check parameters are within hardware limits
                 if (parameters['clean_mV'] > 1499 or 
@@ -285,15 +279,7 @@ class Main(object):
                 return
             
             elif selection == 2: # CV
-                parameters['clean_mV'] = int(self.cve.clean_mV.get_text())
-                parameters['clean_s'] = int(self.cve.clean_s.get_text())
-                parameters['dep_mV'] = int(self.cve.dep_mV.get_text())
-                parameters['dep_s'] = int(self.cve.dep_s.get_text())
-                parameters['start'] = int(self.cve.start_entry.get_text())
-                parameters['slope'] = int(self.cve.slope_entry.get_text())
-                parameters['v1'] = int(self.cve.v1_entry.get_text())
-                parameters['v2'] = int(self.cve.v2_entry.get_text())
-                parameters['scans'] = int(self.cve.scans_entry.get_text())
+                parameters.update(self.exp_window.get_params('cve'))
                 
                 # check parameters are within hardware limits
                 if (parameters['clean_mV'] > 1499 or
@@ -352,18 +338,9 @@ class Main(object):
                 return
                 
             elif selection == 3:  # SWV
-                parameters['clean_mV'] = int(self.swv.clean_mV.get_text())
-                parameters['clean_s'] = int(self.swv.clean_s.get_text())
-                parameters['dep_mV'] = int(self.swv.dep_mV.get_text())
-                parameters['dep_s'] = int(self.swv.dep_s.get_text())
-                parameters['start'] = int(self.swv.start_entry.get_text())
-                parameters['stop'] = int(self.swv.stop_entry.get_text())
-                parameters['step'] = int(self.swv.step_entry.get_text())
-                parameters['pulse'] = int(self.swv.pulse_entry.get_text())
-                parameters['freq'] = int(self.swv.freq_entry.get_text())
+                parameters.update(self.exp_window.get_params('swv'))
                 
-                if self.swv.cyclic_checkbutton.get_active():
-                    parameters['scans'] = int(self.swv.scans_entry.get_text())
+                if parameters['cyclic_checkbutton'] :
                     if parameters['scans'] < 1:
                         raise InputError(parameters['scans'],
                                         "Must have at least one scan.")
@@ -429,16 +406,7 @@ class Main(object):
                 return
         
             elif selection == 4:  # DPV
-                parameters['clean_mV'] = int(self.dpv.clean_mV.get_text())
-                parameters['clean_s'] = int(self.dpv.clean_s.get_text())
-                parameters['dep_mV'] = int(self.dpv.dep_mV.get_text())
-                parameters['dep_s'] = int(self.dpv.dep_s.get_text())
-                parameters['start'] = int(self.dpv.start_entry.get_text())
-                parameters['stop'] = int(self.dpv.stop_entry.get_text())
-                parameters['step'] = int(self.dpv.step_entry.get_text())
-                parameters['pulse'] = int(self.dpv.pulse_entry.get_text())
-                parameters['period'] = int(self.dpv.period_entry.get_text())
-                parameters['width'] = int(self.dpv.width_entry.get_text())
+                parameters.update(self.exp_window.get_params('dpv'))
                 
                 if (parameters['clean_mV'] > 1499 or
                         parameters['clean_mV'] < -1500):
-- 
GitLab