Add --num-* arguments to calibcant-calibrate.py.
[calibcant.git] / bin / calibcant-calibrate.py
index 3d20ab3dd0127ce1b145fcd227d137a3982927b9..5cf5a92f78570f7234e102866b9a64fd22a1c20d 100755 (executable)
@@ -7,7 +7,7 @@
 (``pyafm.storage.load_afm()``).
 """
 
-import os
+import argparse as _argparse
 import time as _time
 
 from calibcant.calibrate import Calibrator as _Calibrator
@@ -15,7 +15,22 @@ from pyafm.storage import load_afm as _load_afm
 import calibcant.config as _config
 
 
+_module_doc = __doc__
+
 def main(args):
+    parser = _argparse.ArgumentParser(description=_module_doc)
+    parser.add_argument(
+        '--num-bumps', type=int,
+        help='Number of surface bumps')
+    parser.add_argument(
+        '--num-temperatures', type=int,
+        help='Number of temperature measurements')
+    parser.add_argument(
+        '--num-vibrations', type=int,
+        help='Number of thermal vibration measurements')
+
+    args = parser.parse_args(args)
+
     timestamp = '{0}-{1:02d}-{2:02d}T{3:02d}-{4:02d}-{5:02d}'.format(
         *_time.localtime())
     filename = '{}-calibcant-data.h5'.format(timestamp)
@@ -25,6 +40,20 @@ def main(args):
         {'model':_config.Linear, 'initial-position':-150e-9})
     config['temperature'] = _config.TemperatureConfig()
     config['vibration'] = _config.VibrationConfig()
+    if args.num_bumps is None:
+        args.num_bumps = config['num-bumps']
+    else:
+        config['num-bumps'] = args.num_bumps
+    if args.num_temperatures is None:
+        args.num_temperatures = config['num-temperatures']
+    else:
+        config['num-temperatures'] = args.num_temperatures
+    if args.num_vibrations is None:
+        args.num_vibrations = config['num-vibrations']
+    else:
+        config['num-vibrations'] = args.num_vibrations
+    insufficient_calibration_data = 0 in [
+        args.num_bumps, args.num_temperatures, args.num_vibrations]
     devices = []
     try:
         afm = _load_afm()
@@ -34,7 +63,10 @@ def main(args):
         deflection = afm.piezo.read_deflection()
         try:
             afm.stepper_approach(target_deflection=deflection + 1e3)
-            k,k_s,data = calibrator.calibrate(filename=filename)
+            if insufficient_calibration_data:
+                data = calibrator.acquire(filename=filename)
+            else:
+                k,k_s,data = calibrator.calibrate(filename=filename)
         except:
             afm.move_away_from_surface()
             afm.piezo.zero()
@@ -42,7 +74,16 @@ def main(args):
     finally:
         for device in devices:
             device.close()
-    print 'k: {:g} +/- {:g}'.format(k, k_s)
+    if insufficient_calibration_data:
+        for count,field,label in [
+            (args.num_bumps, 'bump', 'photodiode sensitivity (V/m)'),
+            (args.num_temperatures, 'temperature', 'temperature (K)'),
+            (args.num_vibrations, 'vibration', 'variance (V**2)')]:
+            if count:
+                d = data[field]
+                print('{}: {:g} +/- {:g}'.format(label, d.mean(), d.std()))
+    else:
+        print('k: {:g} +/- {:g}'.format(k, k_s))
     return 0
 
 if __name__ == '__main__':