1 Scripts and python modules to calibrate AFM cantilevers via the
4 The analysis uses the expected power spectral density (PSD) of a
5 damped simple harmonic oscillator to filter out noise from the
10 linfit (depends in turn on scipy.stats.linregress)
12 *** Command line interface ***
16 Create a two-column ascii data file for fitting bumps with (for example)
17 $ int16s_to_ascii_array ~/rsrch/data/z_piezo_calib/20080116/20080116090005_bump_surface_Z_piezo_output \
18 ~/rsrch/data/z_piezo_calib/20080116/20080116090005_bump_surface_Deflection_input > d
21 $ python calibcant_bump_analyze.py -c d > stdout 2> stderr
30 Create a two-column ascii data file for fitting bumps with (for example)
31 $ cd ~/src/comedi_simult_AIO
32 $ cmd -c0 -n1 -F200000 -N2097152 > vib.raw # 2097152 = 2^21 points ~= 10 seconds of data
33 $ unitary_avg_fft_from_raw.py vib.raw
34 Creates vib.raw.psd, with frequency in Hz in the first column, and amplitude in Volts^2/Hz in the second column.
35 Then get the variance with
36 $ cd ~/src/calibrate_cantilever
37 $ python psd_filter_analyze.py -s9 -tmedian -g ~/src/comedi_simult_AIO/vib.raw 2> check.gp
38 <Lorentzian-fit-variance>
39 You can check the validity of the fit with
41 And adjust the min and max of the fitted frequency range as neccessary
42 $ python psd_filter_analyze.py -s9 -tmedian -m1000 -M8500 -g ~/src/comedi_simult_AIO/vib.raw 2> check.gp
43 <new Lorentzian-fit-variance>
44 Until the fit looks reasonable.
49 Once you've assembled a few slopes, vibs, and Ts, put it all together to calculate k with
50 $ python calibcant_analyze.py -vC 0.02,0.03,0.025 22.5,22.1 6e-9,5.5e-9 > stdout 2> stderr
54 Variable (units) : mean +/- std. dev. (relative error)
55 Cantilever k (pN/nm) : 456.07 +/- 146.671 (0.321599)
56 photoSensitivity**2 (V/nm)**2 : 0.000641667 +/- 0.000204464 (0.318645)
57 T (K) : 295.45 +/- 0.2 (0.000676933)
58 1/Vphoto**2 (1/V)**2 : 1.74242e+08 +/- 7.57576e+06 (0.0434783)