Add min-slope-ratio option to BumpConfig.
[calibcant.git] / calibcant / config.py
1 # calibcant - tools for thermally calibrating AFM cantilevers
2 #
3 # Copyright (C) 2008-2011 W. Trevor King <wking@drexel.edu>
4 #
5 # This file is part of calibcant.
6 #
7 # calibcant is free software: you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation, either
10 # version 3 of the License, or (at your option) any later version.
11 #
12 # calibcant is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU Lesser General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with calibcant.  If not, see
19 # <http://www.gnu.org/licenses/>.
20
21 """Define some variables to configure the package for a particular lab
22 and workflow."""
23
24 import sys as _sys
25
26 from FFT_tools import window_hann as _window_hann
27 import h5config.config as _config
28 import h5config.tools as _h5config_tools
29
30
31 class PackageConfig (_h5config_tools.PackageConfig):
32     "Configure `calibcant` module operation"
33     settings = _h5config_tools.PackageConfig.settings + [
34         _config.BooleanSetting(
35             name='matplotlib',
36             help='Plot piezo motion using `matplotlib`.',
37             default=False),
38         _config.FloatSetting(
39             name='temperature',
40             help=('Default temperature for thermal calibration in degrees '
41                   'Celsius.'),
42             default=22),
43         ]
44
45 class _TemperatureUnit (object):
46     pass
47 class Celsius (_TemperatureUnit):
48     pass
49 class Kelvin (_TemperatureUnit):
50     pass
51
52 class TemperatureConfig (_config.Config):
53     "Configure `calibcant` temperature operation"
54     settings = [
55         _config.ChoiceSetting(
56             name='units',
57             help='Units of raw temperature measurements.',
58             default=Celsius,
59             choices=[
60                 ('Celsius', Celsius),
61                 ('Kelvin', Kelvin),
62                 ]),
63         _config.BooleanSetting(
64             name='default',
65             help=('The temperature values are defaults (vs. real '
66                   'measurements).'),
67             default=True),
68         ]
69
70 class _BumpModel (object):
71     pass
72 class Linear (_BumpModel):
73     pass
74 class Quadratic (_BumpModel):
75     pass
76
77 class BumpConfig (_config.Config):
78     "Configure `calibcant` bump operation"
79     settings = [
80         _config.FloatSetting(
81             name='initial-position',
82             help=('Position relative to surface for start of bump in meters.  '
83                   'Should be less than zero to ensure non-contact region '
84                   'before you hit the surface.'),
85             default=-50e-9),
86         _config.FloatSetting(
87             name='setpoint',
88             help=('Maximum deflection in volts in case of stepper positioning '
89                   'to achieve the initial position.'),
90             default=2.0),
91         _config.FloatSetting(
92             name='min-slope-ratio',
93             help=('Set the minimum ratio between the deflection/displacement '
94                   'of the contact and the non-contact regions for bumps '
95                   'seeking the surface.  Bumps without sufficient difference '
96                   'assume they need to move closer to find the surface.'),
97             default=10.0),
98         _config.IntegerSetting(
99             name='far-steps',
100             help=('Number of stepper steps to move "far" away from the '
101                   'surface.  For possible stepper adjustments while initially '
102                   'locating the surface.'),
103             default=200),
104         _config.FloatSetting(
105             name='push-depth',
106             help='Distance to approach in meters.',
107             default=200e-9),
108         _config.FloatSetting(
109             name='push-speed',
110             help='Approach/retract speed in meters/second.',
111             default=1e-6),
112         _config.FloatSetting(
113             name='samples',
114             help='Number of samples during approach and during retreat.',
115             default=1024),
116         _config.ChoiceSetting(
117             name='model',
118             help='Bump deflection model.',
119             default=Quadratic,
120             choices=[
121                 ('linear', Linear),
122                 ('quadratic', Quadratic),
123                 ]),
124         ]
125
126
127 class _VibrationModel (object):
128     pass
129 class Variance (_VibrationModel):
130     pass
131 class BreitWigner (_VibrationModel):
132     pass
133 class OffsetBreitWigner (_VibrationModel):
134     pass
135
136 class VibrationConfig (_config.Config):
137     "Configure `calibcant` vibration operation"
138     settings = [
139         _config.FloatSetting(
140             name='frequency',
141             help='Sampling frequency in Hz.',
142             default=50e3),
143         _config.FloatSetting(
144             name='sample-time',
145             help=('Aquisition time in seconds.  This is rounded up as required '
146                   'so the number of samples will be an integer power of two.'),
147             default=1),
148         _config.ChoiceSetting(
149             name='model',
150             help='Vibration model.',
151             default=BreitWigner,
152             choices=[
153                 ('variance', Variance),
154                 ('Breit-Wigner', BreitWigner),
155                 ('offset Breit-Wigner', OffsetBreitWigner),
156                 ]),
157         _config.IntegerSetting(
158             name='chunk-size',
159             help='FFT chunk size (for PSD fits).',
160             default=2048),
161         _config.BooleanSetting(
162             name='overlap',
163             help='Overlap FFT chunks (for PSD fits).'),
164         _config.ChoiceSetting(
165             name='window',
166             help='FFT chunk window (for PSD fits).',
167             default=_window_hann,
168             choices=[
169                 ('Hann', _window_hann),
170                 ]),
171         _config.FloatSetting(
172             name='minimum-fit-frequency',
173             help='Lower bound of Lorentzian fitting region.',
174             default=500.),
175         _config.FloatSetting(
176             name='maximum-fit-frequency',
177             help='Upper bound of Lorentzian fitting region.',
178             default=25e3),
179         ]
180
181
182 class CalibrationConfig (_config.Config):
183     "Configure a full `calibcant` calibration run"
184     settings = [
185         _config.ConfigSetting(
186             name='bump',
187             help='Configure the surface bumps',
188             config_class=BumpConfig),
189         _config.IntegerSetting(
190             name='num-bumps',
191             help='Number of surface bumps.',
192             default=10),
193         _config.ConfigSetting(
194             name='temperature',
195             help='Configure the temperature measurements',
196             config_class=TemperatureConfig),
197         _config.IntegerSetting(
198             name='num-temperatures',
199             help='Number of temperature measurements.',
200             default=10),
201         _config.ConfigSetting(
202             name='vibration',
203             help='Configure the temperature measurements',
204             config_class=VibrationConfig),
205         _config.IntegerSetting(
206             name='num-vibrations',
207             help='Number of thermal vibration measurements.',
208             default=20),
209         _config.FloatSetting(
210             name='temperature-sleep',
211             help=('Time between temperature measurements (in seconds) to get '
212                   'independent measurements when reading from slow sensors.'),
213             default=1),
214         _config.FloatSetting(
215             name='vibration-spacing',
216             help=('Approximate distance from the surface in meters for the '
217                   'vibration measurements.  This should be large enough that '
218                   'surface effects are negligable.'),
219             default=50e-6),
220         ]