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