1 # Copyright (C) 2010 W. Trevor King <wking@drexel.edu>
3 # This file is part of Hooke.
5 # Hooke is free software: you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation, either
8 # version 3 of the License, or (at your option) any later version.
10 # Hooke is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with Hooke. If not, see
17 # <http://www.gnu.org/licenses/>.
19 """The driver module provides :class:`Driver`\s for identifying and
22 This allows Hooke to be data-file agnostic. Drivers for various
23 commercial force spectroscopy microscopes are provided, and it's easy
24 to write your own to handle your lab's specific format.
29 from ..config import Setting
30 from ..util.pluggable import IsSubclass, construct_graph
34 # ('csvdriver', True),
36 # ('hemingclamp', True),
39 # ('mfp1dexport', True),
45 """List of driver modules and whether they should be included by
46 default. TODO: autodiscovery
49 DRIVER_SETTING_SECTION = 'drivers'
50 """Name of the config section which controls driver selection.
55 """Base class for file format drivers.
57 :attr:`name` identifies your driver, and should match the module
60 def __init__(self, name):
62 self.setting_section = '%s driver' % self.name
64 def dependencies(self):
65 """Return a list of :class:`Driver`\s we require."""
68 def default_settings(self):
69 """Return a list of :class:`hooke.config.Setting`\s for any
70 configurable driver settings.
72 The suggested section setting is::
74 Setting(section=self.setting_section, help=self.__doc__)
78 def is_me(self, path):
79 """Read the file and return True if the filetype can be
80 managed by the driver. Otherwise return False.
84 def read(self, path, info=None):
85 """Read data from `path` and return a
86 ([:class:`hooke.curve.Data`, ...], `info`) tuple.
88 The input `info` :class:`dict` may contain attributes read
89 from the :class:`~hooke.playlist.FilePlaylist`.
91 The `info` :class:`dict` must contain values for the keys:
92 'filetype' and 'experiment'. See :class:`hooke.curve.Curve`
95 raise NotImplementedError
98 return logging.getLogger('hooke')
100 # Construct driver dependency graph and load default drivers.
102 DRIVER_GRAPH = construct_graph(
103 this_modname=__name__,
104 submodnames=[name for name,include in DRIVER_MODULES],
105 class_selector=IsSubclass(Driver, blacklist=[Driver]))
106 """Topologically sorted list of all possible :class:`Driver`\s.
109 def default_settings():
110 settings = [Setting(DRIVER_SETTING_SECTION,
111 help='Enable/disable default drivers.')]
112 for dnode in DRIVER_GRAPH:
114 default_include = [di for mod_name,di in DRIVER_MODULES
115 if mod_name == driver.name][0]
116 help = driver.__doc__.split('\n', 1)[0]
117 settings.append(Setting(
118 section=DRIVER_SETTING_SECTION,
120 value=str(default_include),
123 for dnode in DRIVER_GRAPH:
125 settings.extend(driver.default_settings())