Assorted plots and bug-fixes in unfolder.py.
authorW. Trevor King <wking@drexel.edu>
Tue, 24 Jan 2012 13:08:42 +0000 (08:08 -0500)
committerW. Trevor King <wking@drexel.edu>
Tue, 24 Jan 2012 13:19:08 +0000 (08:19 -0500)
* Updated `ExceptionTooFar` plot and `Unfolder._plot` to use `FIGURE`
  and `_pyplot`.
* Fix configs used in `Unfolder._unfold`'s bit/meter conversions.
* Remove unrecognized keyword `dtype` from the `.astype` call.
* Reshape `out` so it is 2D (as required by `Piezo.ramp`).
* Don't force unfold log values to be integers.
* Fix filename generation in `Unfolder._save`.
* Removed trailing whitespace.

unfold_protein/unfolder.py

index fb289dc317455d979c34d252e8ab59853e323bb2..874faf614729e68ec83c0a37dad971173b2caf25 100755 (executable)
@@ -110,16 +110,17 @@ class Unfolder (object):
                        '(def {} < target {})').format(
                         data['deflection'].max(), setpoint_bits))
             self.afm.piezo.jump(self.afm.axis_name, start_pos)
-            #if PYLAB_INTERACTIVE_VERBOSE == True:
-            #    figure(BASE_FIG_NUM+1)
-            #    hold(False)
-            #    plot_dict(data, 'Approach')
-            #    hold(True)
-            #    title('Unfolding too far')
+            if _package_config['matplotlib']:
+                print data
+                FIGURE.clear()
+                axes = FIGURE.add_subplot(1, 1, 1)
+                axes.plot(data['z'], data['deflection'], label='Approach')
+                axes.set_title('Unfolding too far')
+                _pyplot.show()
             _LOG.debug('raising ExceptionTooFar')
             raise ExceptionTooFar
         return data
-        
+
     def _bind(self):
         """Wait on the surface while the protein binds."""
         time = self.config['bind time']
@@ -132,21 +133,33 @@ class Unfolder (object):
         velocity = config['velocity']
         _LOG.info('unfold at {:g} m/s'.format(velocity))
         axis = self.afm.piezo.axis_by_name(self.afm.axis_name)
-        d = self.afm.piezo.channel_by_name('deflection')    
+        axis_config = self.afm.piezo.config.select_config(
+                'axes', self.afm.axis_name,
+                get_attribute=_pypiezo_base.get_axis_name
+                )
+        d = self.afm.piezo.channel_by_name('deflection')
+        def_config = self.afm.piezo.config.select_config(
+            'inputs', 'deflection')
         start_pos = self.afm.piezo.last_output[self.afm.axis_name]
-        start_pos_m = _pypiezo_base.convert_bits_to_meters(axis, start_pos)
-        final_pos_m = bind_pos_m - config['distance']
-        final_pos = _pypiezo_base.convert_meters_to_bits(axis, final_pos_m)
-        dtype = afm.piezo.channel_dtype(self.afm.axis_name, direction='output')
+
+        start_pos_m = _pypiezo_base.convert_bits_to_meters(
+            axis_config, start_pos)
+        final_pos_m = start_pos_m - config['distance']
+        final_pos = _pypiezo_base.convert_meters_to_bits(
+            axis_config, final_pos_m)
+        dtype = self.afm.piezo.channel_dtype(
+            self.afm.axis_name, direction='output')
         num_steps = int(
             config['distance'] / config['velocity'] * config['frequency']) + 1
         #   (m)                * (s/m)              * (samples/s)
         out = _numpy.linspace(
-            start_pos, final_pos, num_steps).astype(dtype=dtype)
+            start_pos, final_pos, num_steps).astype(dtype)
+        # TODO: check size of output buffer.
+        out = out.reshape((len(out), 1))
         _LOG.debug(
-            'unfolding from {:d} to {:d} in {:d} steps at {:g} Hz'.format(
+            'unfolding from {} to {} in {} steps at {} Hz'.format(
                 start_pos, final_pos, num_steps, config['frequency']))
-        data = afm.piezo.ramp(
+        data = self.afm.piezo.ramp(
             data=out, frequency=config['frequency'],
             output_names=[self.afm.axis_name], input_names=['deflection'])
         return {self.afm.axis_name:out, 'deflection':data}
@@ -156,8 +169,8 @@ class Unfolder (object):
         time_tuple = _email_utils.parsedate(timestamp)
         filename = _os_path.join(
             config['base directory'],
-            '{0}-{1:02d}-{2:02d}_{3:02d}-{4:02d}-{5:02d}.h5'.format(
-                time_tuple))
+            '{0}-{1:02d}-{2:02d}T{3:02d}-{4:02d}-{5:02d}.h5'.format(
+                *time_tuple))
         _LOG.info('saving {}'.format(filename))
         with _h5py.File(filename, 'a') as f:
             storage = _HDF5_Storage()
@@ -172,19 +185,17 @@ class Unfolder (object):
 
     def _plot(self, temperature, approach, unfold, timestamp):
         "Plot the unfolding cycle"
-        if not _matplotlib:
+        if not _pyplot:
             raise _matplotlib_import_error
         FIGURE.clear()
-        # TODO...
-        #if PYLAB_INTERACTIVE_VERBOSE == True:
-        #    figure(BASE_FIG_NUM)
-        #    hold(False)
-        #    plot_dict(approach_data, 'Approach')
-        #    hold(True)
-        #    plot_dict(out['data'], 'Unfold')
-        #    legend(loc='best')
-        #    title('Unfolding')
-        #    draw()
+        axes = FIGURE.add_subplot(1, 1, 1)
+        axes.hold(True)
+        axes.plot(approach['z'], approach['deflection'], label='Approach')
+        axes.plot(unfold['z'], unfold['deflection'], label='Unfold')
+        axes.set_title('Unfolding too far')
+        axes.legend(loc='best')
+        axes.set_title('Unfolding')
+        _pyplot.show()
 
     def zero_piezo(self):
         _LOG.info('zero piezo')