Updated documentation for calibcant.calibrate.calib_aquire.
[calibcant.git] / calibcant / calibrate.py
index 2cfff35758eafd1cc3392c28eafe6fd15c74a286..636b113aa8c25f92ef80e581a2bbe094c7c9c637 100755 (executable)
@@ -1,4 +1,27 @@
 #!/usr/bin/python
+#
+# calibcant - tools for thermally calibrating AFM cantilevers
+#
+# Copyright (C) 2007,2008, William Trevor King
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+#
+# The author may be contacted at <wking@drexel.edu> on the Internet, or
+# write to Trevor King, Drexel University, Physics Dept., 3141 Chestnut St.,
+# Philadelphia PA 19104, USA.
 
 """
 Aquire and analyze cantilever calibration data.
@@ -96,17 +119,19 @@ import analyze
 # bump family
 
 @splittableKwargsFunction()
-def bump_aquire(zpiezo, push_depth=200, npoints=1024, freq=100e3) :
+def bump_aquire(zpiezo, push_depth=200, npoints=1024, push_speed=1000) :
     """
     Ramps closer push_depth and returns to the original position.
     Inputs:
      zpiezo     an opened zpiezo.zpiezo instance
      push_depth distance to approach, in nm
      npoints    number points during the approach and during the retreat
-     freq       rate at which data is aquired
+     push_speed piezo speed during approach and retreat, in nm/s
     Returns the aquired ramp data dictionary, with data in DAC/ADC bits.
     """
     # generate the bump output
+    nm_per_step = float(push_depth) / npoints
+    freq = push_speed / nm_per_step # freq is sample frequency in Hz
     start_pos = zpiezo.curPos()
     pos_dist = zpiezo.pos_nm2out(push_depth) - zpiezo.pos_nm2out(0)
     close_pos = start_pos + pos_dist
@@ -115,7 +140,7 @@ def bump_aquire(zpiezo, push_depth=200, npoints=1024, freq=100e3) :
     out = numpy.concatenate((appr, retr))
     # run the bump, and measure deflection
     if config.TEXT_VERBOSE :
-        print "Bump %g nm" % push_depth
+        print "Bump %g nm at %g nm/s" % (push_depth, push_speed)
     data = zpiezo.ramp(out, freq)
     return data
 
@@ -205,13 +230,14 @@ def vib(**kwargs) :
 # with proper spacing relative to the surface.
 
 @splittableKwargsFunction()
-def move_just_onto_surface(stepper, zpiezo, Depth_nm=100, setpoint=2) :
+def move_just_onto_surface(stepper, zpiezo, Depth_nm=-50, setpoint=2) :
     """
-    Uses z_piezo_utils.getSurfPos() to pinpoint the position of the surface.
-    Adjusts the stepper position as required to get within stepper_tol nm
-    of the surface.
-    Then set Vzp to place the cantilever Depth_nm onto the surface.
-
+    Uses z_piezo_utils.getSurfPos() to pinpoint the position of the
+    surface.  Adjusts the stepper position as required to get within
+    stepper_tol nm of the surface.  Then set Vzp to place the
+    cantilever Depth_nm onto the surface.  Negative Depth_nm values
+    will place the cantilever that many nm _off_ the surface.
+    
     If getSurfPos() fails to find the surface, backs off (for safety)
     and steps in (without moving the zpiezo) until Vphoto > setpoint.
     """
@@ -308,13 +334,12 @@ def move_far_from_surface(stepper, um_back=50) :
 # and finally, the calib family
 
 @splittableKwargsFunction((move_just_onto_surface, 'stepper', 'zpiezo'),
-                          (bump, 'zpiezo', 'freq', 'log_dir', 'Vphoto_in2V'),
+                          (bump, 'zpiezo', 'log_dir', 'Vphoto_in2V'),
                           (move_far_from_surface, 'stepper'),
                           (T, 'log_dir'),
                           (vib, 'zpiezo', 'log_dir', 'Vphoto_in2V'),
                           (analyze.calib_save, 'bumps','Ts','vibs','log_dir'))
 def calib_aquire(stepper, zpiezo, num_bumps=10, num_Ts=10, num_vibs=20,
-                 bump_freq=100e3,
                  log_dir=config.LOG_DIR, Vphoto_in2V=config.Vphoto_in2V,
                  **kwargs):
     """
@@ -323,12 +348,16 @@ def calib_aquire(stepper, zpiezo, num_bumps=10, num_Ts=10, num_vibs=20,
     Inputs :
      stepper       a stepper.stepper_obj for coarse Z positioning
      zpiezo        a z_piezo.z_piezo for fine positioning and deflection readin
-     setpoint      maximum allowed deflection (in Volts) during approaches
-     num_bumps     number of 'a's (see Outputs)
-     push_depth_nm depth of each push when generating a
-     num_temps     number of 'T's (see Outputs)
+     num_bumps     number of 'bumps' (see Outputs)
+     num_temps     number of 'Ts' (see Outputs)
      num_vibs      number of 'vib's (see Outputs)
      log_dir       directory to log data to.  Default 'None' disables logging.
+     Vphoto_in2V   function to convert photodiode input bits to Volts
+
+     + other kwargs.  Run calib_aquire._kwargs(calib_aquire) to see
+     all options.  Run calib_aquire._childSplittables to see a list
+     of kwarg functions that this function calls.
+
     Outputs (all are arrays of recorded data) :
      bumps measured (V_photodiode / nm_tip) proportionality constant
      Ts    measured temperature (K)
@@ -341,7 +370,7 @@ def calib_aquire(stepper, zpiezo, num_bumps=10, num_Ts=10, num_vibs=20,
     move_just_onto_surface(stepper, zpiezo, **move_just_onto_surface_kwargs)
     bumps = numpy.zeros((num_bumps,), dtype=numpy.float)
     for i in range(num_bumps) :
-        bumps[i] = bump(zpiezo=zpiezo, freq=bump_freq, log_dir=log_dir,
+        bumps[i] = bump(zpiezo=zpiezo, log_dir=log_dir,
                         Vphoto_in2V=Vphoto_in2V, **bump_kwargs)
     if config.TEXT_VERBOSE :
         print bumps