Package: pyafm
PyafmPyafm is a set of tools for controlling atomic force microscopes.  It
provides control of AFM postition using both short-range (piezo) and
long range (stepper) vertical positioning.  There are separate modules
for controlling the piezo (pypiezo) and stepper (stepper), this
module mostly contains methods that require the capabilities of both.This module can optionally include temperature sensing via apypidbackend.PackagesGentooI’ve packaged pyafm for Gentoo.  You needlaymanand mywtk
overlay.  Install with:# emerge -av app-portage/layman
# layman --add wtk
# emerge -av sci-physics/pyafmAlthough it is not strictly required (thanks toduck typing) you’ll
probably also want mystepperpackage or an equivalent
stepper implementation.DependenciesPyafm requires the following Python modules:Pycomedi(required directly, and viapypiezo)PypiezoStepper(or equivalent stepper implementation)Pypid(optional temperature monitoring and control)H5config(required directly, and viapypiezo)SciPyGetting the sourcePyafm is available as aGitrepository:$ git clone git://tremily.us/pyafm.gitThere are also periodic bundled releases.  For example, get version
0.3 as a gzipped tarball with:$ wget 'http://git.tremily.us/?p=pyafm.git;a=snapshot;h=v0.3;sf=tgz'
$ tar -xzvf pyafm-0.1.tar.gzInstallationAfter downloading, change to the source directory and run:$ python setup.py installto install pyafm.  Run:$ python setup.py install --helpto see a list of installation options you may want to configure.UsageThe docstrings include some pretty detailed tests to get you started.dir()andhelp()are your friends ;).  One neat feature that
I’ve added recently (2012-03-16) is the ability to store and load
complete AFM configurations viah5config.  For example, when you
first use pyafm, it may take you a bit to dig up all the necessary
calibration constants, etc. and plug them into your config:>>> import pycomedi.constant
>>> import pypiezo.config
>>> import pyafm.config
>>> config = pyafm.config.AFMConfig()
>>> config['name'] = '1B3D9'
>>> config['main-axis'] = 'z'
>>> config['piezo'] = pypiezo.config.PiezoConfig()
>>> config['piezo']['name'] = '2253E'
>>> config['piezo']['axes'] = [
...     pypiezo.config.AxisConfig(), pypiezo.config.AxisConfig()]
>>> config['piezo']['axes'][0]['gain'] = 20
>>> config['piezo']['axes'][0]['sensitivity'] = 8.8e-9
>>> config['piezo']['axes'][0]['channel'] = pypiezo.config.OutputChannelConfig()
>>> config['piezo']['axes'][0]['channel']['analog-reference] = pycomedi.constant.AREF.ground
>>> config['piezo']['axes'][0]['channel']['analog-reference] = pycomedi.constant.AREF.groundand on, and on ;).  Don’t worry though, once you finish telling Python
about your particular AFM configuration, you can get a workingAFMinstance quite easily:>>> devices = []
>>> afm = AFM(config=config, devices=devices)That takes care of opening all the channels and initializing all the
pieces you configured above.deviceswill end up full of anypycomedi.device.Deviceinstances that you need.  Once you’re happy
with your setup, make sure theconfigobject is up-to-date with:>>> afm.setup_config()Which copies any new object state into the.configattribute
(e.g. bit-to-volt conversion polynomials).  Then save your
configuration with:>>> import pyafm.storage
>>> pyafm.storage.save_afm(afm=afm, filename='whatever', group='/optional')Which will create a HDF5 file at the specified path, and store the AFM
configutaion under the specified group.  Bothfilenameandgroupare optional.  If you leave them out, they will default to~/.config/pyafm-default.h5and/respectively.The next time you need to do something with the AFM, just load your
old config file.  If you used the default location, that’s as easy
as:>>> import pyafm.storage
>>> devices = []
>>> afm = pyafm.storage.load_afm(devices=devices)
>>> afm.load_from_config()When you’re done using them, it’s good practice to close any devices
indevices:>>> for device in devices:
...     device.close()Usingload_afmwith the default path is a good way to keep your
AFM configuration synchronized across several applications.  That way,
there’s only one place you need to update if you recalibrate your
piezo or rebuild an amplifier.