Usually curves you annotated are useful later. You can create a
playlist for only annotated curves with
- hooke> note_filter_playlist --name c:\curves\nice.hkp
+ hooke> note_filter_playlist --output_playlist nice_list
-will create sub-playlist :file:`c:\curves\nice.hkp`. Make sure that
-the target directory (here :file:`c:\curves\`) already exists before
-doing that.
+will create sub-playlist `nice_list`. Remember to save the new list
+if you like it.
If you change your mind about a note, you can remove it by setting a
blank note string with ``set_note ''``.
as images or text, use the ``export_block`` command. Supported
formats are PNG (Portable Network Graphic, raster) and EPS
(Encapsulated Postscript, vector). The export format is determined by
-the filename extension, so ``export_block foo.png``, ``export_block
-foo.eps``, and ``export_block foo.txt`` will save PNG, EPS, and
-TAB-delimited text files respectively.
+the filename extension, so ``export_block --output foo.png``,
+``export_block --output foo.eps``, and ``export_block --output
+foo.txt`` will save PNG, EPS, and TAB-delimited text files
+respectively.
+
+.. todo:: Currently no PNG or EPS output, use the GUI and the plot
+ panel's toolbar for non-text exports.
.. todo:: Multiple cycles in exported data? Solution: blank lines for
"breaks", add option to extract specific sections using Python's
second point, the distances will appear in the output panel. If you
want to know the coordinates of a single point, left click on it.
+.. todo:: Add description of ``delta``'s command line interface.
+
Hooke automatically adjusts the position of the clicked point to the
nearest point in the graph, so you will be always measuring distances
and forces between points in the graph.
Worm like chain and freely jointed chain fitting
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. todo:: Update WLC fitting tutorial section.
+
You can measure by hand the parameters relative to a force peak using
a worm-like chain fitting with the ``fit`` command. The command by
default automatically finds the contact point, asks for two points
Multiple curve fitting and measuring
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. todo:: Update multiple curve fitting tutorial section.
You can cycle through all your current playlist obtaining WLC fit, FJC
fit, rupture force and slope (loading rate) information from each
Fast curve reviewing and saving
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. todo:: Update curve review tutorial section.
+
When automatic routines are not good enough to filter your data, use
``review`` command to cycle through your playlist presenting ten
curves in the same graph. You can then enter the numbers of the
You can set environment variables to influence the behaviour of
Hooke. The command to use is ``set_config``. Use ``get_config`` to
read a particular option and ``print_config`` to display the entire
-configuration file. Any changes to the configuration will be saved
-when you exit Hooke, see :doc:`config` for details.
+configuration file. To save changes, either run ``save_config`` or
+start Hooke with the ``--save-config`` option. See :doc:`config` for
+details.
--- /dev/null
+# Copyright (C) 2010 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/>.
+
+"""
+Test the commands listed in :file:`doc/tutorial.txt`.
+
+>>> import os
+>>> import os.path
+>>> from hooke.hooke import Hooke, HookeRunner
+>>> h = Hooke()
+>>> r = HookeRunner()
+
+*Help*
+
+>>> h = r.run_lines(h, ['help']) # doctest: +ELLIPSIS
+<BLANKLINE>
+Documented commands (type help <topic>):
+========================================
+...
+>>> h = r.run_lines(h, ['help load_playlist'])
+Command: load_playlist
+<BLANKLINE>
+Arguments:
+<BLANKLINE>
+help BOOL (bool) Print a help message.
+output_playlist STRING (string) Name of the new playlist (defaults to
+ an auto-generated name).
+input FILE (file) File name for the input playlist.
+drivers DRIVER (driver) Drivers for loading curves.
+<BLANKLINE>
+Load a playlist.
+<BLANKLINE>
+----
+Usage: load_playlist [options] input
+
+*Creating a playlist*
+
+>>> h = r.run_lines(h, ['cd --path .'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['pwd']) # doctest: +ELLIPSIS
+/.../hooke
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['ls']) # doctest: +ELLIPSIS +REPORT_UDIFF
+.hg
+...
+AUTHORS
+...
+README
+...
+hooke
+...
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['new_playlist --output_playlist mylist'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['jump_to_playlist -- -1'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_playlist'])
+<FilePlaylist mylist>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['glob_curves_to_playlist test/data/vclamp_picoforce/*']
+... ) # doctest: +ELLIPSIS
+<Curve 0x06130001>
+<Curve 0x07200000>
+<Curve 20071120a_i27_t33.100>
+<Curve 20071120a_i27_t33.101>
+...
+<Curve 20071120a_i27_t33.199>
+Success
+<BLANKLINE>
+>>> playlist_already_exists = os.path.exists('mylist.hkp')
+>>> playlist_already_exists
+False
+>>> h = r.run_lines(h, ['save_playlist --output mylist'])
+Success
+<BLANKLINE>
+>>> os.path.isfile('mylist.hkp')
+True
+>>> h = r.run_lines(h, ['load_playlist --output_playlist other_list mylist'])
+<FilePlaylist other_list>
+Success
+<BLANKLINE>
+>>> if playlist_already_exists == False:
+... os.remove('mylist.hkp')
+
+*Navigating the playlist*
+
+>>> h = r.run_lines(h, ['get_curve'])
+<Curve 0x06130001>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['next_curve'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_curve'])
+<Curve 0x07200000>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['previous_curve'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_curve'])
+<Curve 0x06130001>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['curve_index'])
+0
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['previous_curve'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_curve'])
+<Curve 20071120a_i27_t33.199>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['curve_index'])
+101
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['next_curve'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_curve'])
+<Curve 0x06130001>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['curve_index'])
+0
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['jump_to_curve 14'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_curve'])
+<Curve 20071120a_i27_t33.112>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['curve_index'])
+14
+Success
+<BLANKLINE>
+
+>>> h = r.run_lines(h, ['get_playlist'])
+<FilePlaylist mylist>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['next_playlist'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_playlist'])
+<FilePlaylist other_list>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['previous_playlist'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_playlist'])
+<FilePlaylist mylist>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['playlist_index'])
+0
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['previous_playlist'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_playlist'])
+<FilePlaylist other_list>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['playlist_index'])
+1
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['next_playlist'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_playlist'])
+<FilePlaylist mylist>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['playlist_index'])
+0
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['jump_to_playlist 1'])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['get_playlist'])
+<FilePlaylist other_list>
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['playlist_index'])
+1
+Success
+<BLANKLINE>
+
+*Taking notes*
+
+>>> h = r.run_lines(h, ['''set_note "Hi there.\\nI'm a note"'''])
+Success
+<BLANKLINE>
+>>> h = r.run_lines(h, ['note_filter_playlist --output_playlist filtered'])
+>>> h = r.run_lines(h, ['get_playlist'])
+>>> h = r.run_lines(h, ['jump_to_playlist -- -1'])
+>>> h = r.run_lines(h, ['get_playlist'])
+>>> h = r.run_lines(h, ['get_curve'])
+>>> h = r.run_lines(h, ['curve_index'])
+>>> h = r.run_lines(h, ['jump_to_curve -- -1'])
+>>> h = r.run_lines(h, ['get_curve'])
+>>> h = r.run_lines(h, ['curve_index'])
+>>> h = r.run_lines(h, ['get_note'])
+>>> h = r.run_lines(h, ['set_note ""'])
+>>> h = r.run_lines(h, ['get_note'])
+
+*Exporting curves*
+
+>>> os.path.exists('mycurve.dat')
+>>> h = r.run_lines(h, ['export_bock --output mycurve.dat'])
+>>> os.path.isfile('mycurve.dat')
+
+*Measuring distances and forces*
+
+>>> h = r.run_lines(h, ['delta 300 500'])
+
+*Worm like chain and freely jointed chain fitting*
+
+*Multiple curve fitting and measuring*
+
+*Fast curve reviewing and saving*
+
+*Configuring Hooke*
+
+>>> h = r.run_lines(h, ['set_config conditions temperature 300.0'])
+>>> h = r.run_lines(h, ['get_config conditions temperature'])
+>>> h = r.run_lines(h, ['set_config conditions temperature 295.3'])
+>>> h = r.run_lines(h, ['get_config conditions temperature'])
+>>> h = r.run_lines(h, ['print_config'])
+>>> h = r.run_lines(h, ['save_config'])
+"""