1 # calibcant - tools for thermally calibrating AFM cantilevers
3 # Copyright (C) 2008-2011 W. Trevor King <wking@drexel.edu>
5 # This file is part of calibcant.
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.
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.
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/>.
21 """Temperature analysis.
23 Separate the more general `T_analyze()` from the other `T_*()`
24 functions in calibcant.
26 The relevant physical quantities are:
28 * `T` Temperature at which thermal vibration measurements were acquired
33 >>> from .config import HDF5_TemperatureConfig
34 >>> from h5config.hdf5 import pprint_HDF5
36 >>> fd,filename = tempfile.mkstemp(suffix='.h5', prefix='calibcant-')
39 >>> temperature_config = HDF5_TemperatureConfig(
40 ... filename=filename, group='/T/config/')
42 >>> raw_T = numpy.array([22, 23.5, 24])
43 >>> processed_T = T_analyze(raw_T, temperature_config)
44 >>> T_plot(raw_T=raw_T, processed_T=processed_T)
45 >>> T_save(filename=filename, group='/T/', raw_T=raw_T,
46 ... temperature_config=temperature_config, processed_T=processed_T)
48 >>> pprint_HDF5(filename) # doctest: +REPORT_UDIFF
52 <HDF5 dataset "default": shape (), type "|S3">
54 <HDF5 dataset "units": shape (), type "|S7">
56 <HDF5 dataset "processed": shape (3,), type "<f8">
57 [ 295.15 296.65 297.15]
58 <HDF5 dataset "raw": shape (3,), type "<f8">
61 >>> raw_T,temperature_config,processed_T = T_load(
62 ... filename=filename, group='/T/')
63 >>> print temperature_config.dump()
67 array([ 22. , 23.5, 24. ])
69 <type 'numpy.ndarray'>
71 array([ 295.15, 296.65, 297.15])
73 >>> os.remove(filename)
77 from scipy.constants import C2K as _C2K
80 import matplotlib as _matplotlib
81 import matplotlib.pyplot as _matplotlib_pyplot
82 import time as _time # for timestamping lines on plots
83 except (ImportError, RuntimeError), e:
85 _matplotlib_import_error = e
87 from h5config.hdf5 import h5_create_group as _h5_create_group
89 from . import LOG as _LOG
90 from . import package_config as _package_config
91 from .config import Celsius as _Celsius
92 from .config import Kelvin as _Kelvin
93 from .config import HDF5_TemperatureConfig as _HDF5_TemperatureConfig
96 def T_analyze(T, temperature_config):
97 """Convert measured temperature to Kelvin.
99 `T` should be a numpy ndarray or scalar. `temperature_config`
100 should be a `config._TemperatureConfig` instance.
102 if temperature_config['units'] == _Celsius:
107 def T_save(filename, group='/', raw_T=None, temperature_config=None,
109 with _h5py.File(filename, 'a') as f:
110 cwg = _h5_create_group(f, group)
111 if raw_T is not None:
117 if temperature_config:
118 config_cwg = _h5_create_group(cwg, 'config')
119 temperature_config.save(group=config_cwg)
120 if processed_T is not None:
125 cwg['processed'] = processed_T
127 def T_load(filename, group='/'):
128 assert group.endswith('/')
129 raw_T = processed_T = None
130 with _h5py.File(filename, 'a') as f:
132 raw_T = f[group+'raw'][...]
135 temperature_config = _HDF5_TemperatureConfig(
136 filename=filename, group=group+'config/')
138 processed_T = f[group+'processed'][...]
141 temperature_config.load()
142 return (raw_T, temperature_config, processed_T)
144 def T_plot(raw_T=None, processed_T=None):
146 raise _matplotlib_import_error
147 figure = _matplotlib_pyplot.figure()
148 timestamp = _time.strftime('%H%M%S')
150 if processed_T is None:
151 return # nothing to plot
153 axes2 = figure.add_subplot(1, 1, 1)
154 elif processed_T is None:
155 axes1 = figure.add_subplot(1, 1, 1)
158 axes1 = figure.add_subplot(2, 1, 1)
159 axes2 = figure.add_subplot(2, 1, 2)
161 axes1.set_title('Raw Temperatures %s' % timestamp)
162 axes1.plot(raw_T, label='raw')
164 axes2.set_title('Processed Temperatures %s' % timestamp)
165 axes2.plot(processed_T, label='processed')