Fix approacing -> approaching typo in cut and curve plugins
[hooke.git] / hooke / plugin / cut.py
index 15d6bbed2dd352026ff5fd2e286759ef09290990..d42338ddda176067eb77998d667b4ad1721e2ac4 100644 (file)
@@ -1,16 +1,58 @@
-"""Defines :class:`CutPlugin` and :class:`CutCommand`.
+# Copyright (C) 2009-2010 Fabrizio Benedetti
+#                         Massimo Sandal <devicerandom@gmail.com>
+#                         W. Trevor King <wking@drexel.edu>
+#
+# This file is part of Hooke.
+#
+# Hooke is free software: you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation, either
+# version 3 of the License, or (at your option) any later version.
+#
+# Hooke is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with Hooke.  If not, see
+# <http://www.gnu.org/licenses/>.
+
+"""The `cut` module provides :class:`CutPlugin` and
+:class:`CutCommand`.
 """
 
-from ..command import Command, Argument
+import numpy
+
+from ..command import Command, Argument, Failure
 from ..plugin import Plugin
 
 
 class CutPlugin (Plugin):
     def __init__(self):
         super(CutPlugin, self).__init__(name='cut')
+        self._commands = [CutCommand(self)]
+
+
+# Define common or complicated arguments
+
+def current_curve_callback(hooke, command, argument, value):
+    playlist = hooke.playlists.current()
+    if playlist == None:
+        raise Failure('No playlists loaded')
+    curve = playlist.current()
+    if curve == None:
+        raise Failure('No curves in playlist %s' % playlist.name)
+    return curve
 
-    def commands(self):
-        return [CutCommand()]
+CurveArgument = Argument(
+    name='curve', type='curve', callback=current_curve_callback,
+    help="""
+:class:`hooke.curve.Curve` to cut from.  Defaults to the current curve.
+""".strip())
+
+
+# Define commands
 
 class CutCommand (Command):
     """Cut the selected signal between two points and write it to a file.
@@ -18,17 +60,15 @@ class CutCommand (Command):
     The data is saved in TAB-delimited ASCII text, where the first column
     is "x" and the second is "y".  There is no header row.
     """
-    def __init__(self):
+    def __init__(self, plugin):
         super(CutCommand, self).__init__(
             name='cut',
             arguments=[
-                Argument(name='curve', type='curve', optional=False, help="""
-:class:`hooke.curve.Curve` to cut from.
-""".strip()),
+                CurveArgument,
                 Argument(name='block', aliases=['set'], type='int', default=0,
                     help="""
 Data block to save.  For an approach/retract force curve, `0` selects
-the approacing curve and `1` selects the retracting curve.
+the approaching curve and `1` selects the retracting curve.
 """.strip()),
                 Argument(name='bounds', type='point', optional=False, count=2,
                          help="""
@@ -39,9 +79,12 @@ Indicies of points bounding the selected data.
 File name for the output data.
 """.strip()),
                 ],
-            help=self.__doc__)
+            help=self.__doc__, plugin=plugin)
+
+    def _run(self, hooke, inqueue, outqueue, params):
+        if params['curve'] == None:
+            params['curve'] = hooke.playlists.current().current()
 
-    def _run(inqueue, outqueue, params):
        i_min = min([p.index for p in params['points']])
        i_max = max([p.index for p in params['points']])
 
@@ -49,6 +92,4 @@ File name for the output data.
         cut_data = data[i_min:i_max+1,:] # slice rows from row-major data
         # +1 to include data[i_max] row
 
-       f = open(params['output'], 'w')
-        cut_data.tofile(f, sep='\t')
-        f.close()
+        numpy.savetxt(params['output'], cut_data, delimiter='\t')