Allow JPK file versions up to 0.12 (unfinished).
[hooke.git] / hooke / driver / jpk.py
index 9ba649cf87f287a72145e586104bb797d60de0dd..bcacd85e288f8494b4fe48d285eb7a536ac459e5 100644 (file)
@@ -18,6 +18,9 @@
 # <http://www.gnu.org/licenses/>.
 
 """Driver for JPK ForceRobot's velocity clamp data format.
+
+This driver is based on JPK's :file:`JPKForceSpec.txt` version 0.12.
+The specs are freely available from JPK, just email support@jpk.com.
 """
 
 import os.path
@@ -27,7 +30,6 @@ import zipfile
 import numpy
 
 from .. import curve as curve
-from .. import experiment as experiment
 from ..util.util import Closing as Closing
 from ..util.si import join_data_label, split_data_label
 from . import Driver as Driver
@@ -75,7 +77,8 @@ class JPKDriver (Driver):
             for i in range(len([p for p in f.namelist()
                                 if p.endswith('segment-header.properties')])):
                 segments.append(self._zip_segment(f, path, info, zip_info, i))
-        if zip_info['file-format-version'] not in ['0.5']:
+        if zip_info['file-format-version'] not in ['0.%d' % i
+                                                   for i in range(12)]:
             raise NotImplementedError(
                 'JPK file version %s not supported (yet).'
                 % zip_info['file-format-version'])
@@ -145,16 +148,8 @@ class JPKDriver (Driver):
     def _zip_translate_params(self, params, chan_info):
         info = {
             'raw info':params,
-            'filetype':self.name,
             #'time':self._time_from_TODO(raw_info[]),
             }
-        # TODO: distinguish between force clamp and velocity clamp
-        # experiments.  Note that the JPK file format is flexible
-        # enough to support mixed experiments (i.e. both force clamp
-        # and velocity clamp segments in a single experiment), but I
-        # have no idea what sort of analysis such experiments would
-        # require ;).
-        info['experiment'] = experiment.VelocityClamp
         force_unit = chan_info['channel']['vDeflection']['conversion-set']['conversion']['force']['scaling']['unit']['unit']
         assert force_unit == 'N', force_unit
         force_base = chan_info['channel']['vDeflection']['conversion-set']['conversion']['force']['base-calibration-slot']
@@ -201,6 +196,11 @@ class JPKDriver (Driver):
             if name == 'vDeflection':
                 assert unit == 'm', segment.info['columns'][i]
                 segment.info['columns'][i] = join_data_label('deflection', 'm')
+                # Invert because deflection voltage increases as the
+                # tip moves away from the surface, but it makes more
+                # sense to me to have it increase as it moves toward
+                # the surface (positive tension on the protein chain).
+                segment[:,i] *= -1
             elif name == 'height':
                 assert unit == 'm', segment.info['columns'][i]
                 segment.info['columns'][i] = join_data_label('z piezo', 'm')
@@ -222,7 +222,6 @@ class JPKDriver (Driver):
                 channel_name, 'V')
             return segment
         conversion_info = conversion_set['conversion'][conversion]
-        print channel_name, conversion_info.keys()
         if conversion_info['base-calibration-slot'] \
                 != conversion_set['conversions']['base']:
             # Our conversion is stacked on a previous conversion.  Do
@@ -277,4 +276,7 @@ class JPKDriver (Driver):
         return info
 
     def _read_old(self, path, info):
-        raise NotImplementedError('No old-style JPK files were available for testing, please send us yours: %s' % path)
+        raise NotImplementedError(
+            "Early JPK files (pre-zip) are not supported by Hooke.  Please "
+            "use JPK's `out2jpk-force` script to convert your old files "
+            "to a more recent format before loading them with Hooke.")