X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=hooke%2Fplugin%2Fconvfilt.py;h=b8d967ae6be224b92d1252af6bd0503e0219b84d;hb=45c5d07228fbe9cefd209012849faa86dd7a020f;hp=b85348a6feae57a679a2e41de7980a45b6f2e290;hpb=9e871c054ff8792b5a7fc25dd61b0b271746d68e;p=hooke.git diff --git a/hooke/plugin/convfilt.py b/hooke/plugin/convfilt.py index b85348a..b8d967a 100644 --- a/hooke/plugin/convfilt.py +++ b/hooke/plugin/convfilt.py @@ -7,15 +7,15 @@ # # This file is part of Hooke. # -# Hooke is free software: you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation, either -# version 3 of the License, or (at your option) any later version. +# Hooke is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. # -# Hooke is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. +# Hooke is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General +# Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Hooke. If not, see @@ -45,6 +45,7 @@ from ..plugin import Plugin, argument_to_setting from ..plugin.curve import CurveArgument from ..plugin.playlist import FilterCommand from ..plugin.vclamp import scale +from ..util.fit import PoorFit from ..util.peak import find_peaks, find_peaks_arguments, Peak, _kwargs @@ -54,7 +55,7 @@ class ConvFiltPlugin (Plugin): def __init__(self): super(ConvFiltPlugin, self).__init__(name='convfilt') self._arguments = [ # for Command initialization - Argument('convolution', type='float', count='-1', + Argument('convolution', type='float', count=-1, default=[11.0]+[-1.0]*11, help=""" Convolution vector roughly matching post-peak cantilever rebound. This should roughly match the shape of the feature you're looking for. @@ -74,7 +75,7 @@ Minimum number of peaks for curve acceptance. ('max cut', 0.2), ('min deviations', 5.0), ('min points', 1), - ('see double', 10e-9), + ('see double', 10), # TODO: points vs. meters. 10e-9), ]: argument = [a for a in self._arguments if a.name == key][0] argument.default = value @@ -130,7 +131,7 @@ class ConvolutionPeaksCommand (Command): help=self.__doc__, plugin=plugin) def _run(self, hooke, inqueue, outqueue, params): - z_data,d_data,params = self._setup(params) + z_data,d_data,params = self._setup(hooke, params) start_index = 0 while z_data[start_index] < params['bind window']: start_index += 1 @@ -144,7 +145,7 @@ class ConvolutionPeaksCommand (Command): peak.index += start_index outqueue.put(peaks) - def _setup(self, params): + def _setup(self, hooke, params): """Setup `params` from config and return the z piezo and deflection arrays. """ @@ -152,9 +153,9 @@ class ConvolutionPeaksCommand (Command): if curve.info['experiment'] != VelocityClamp: raise Failure('%s operates on VelocityClamp experiments, not %s' % (self.name, curve.info['experiment'])) - for col in ['surface z piezo (m)', 'deflection (N)']: + for col in ['surface distance (m)', 'deflection (N)']: if col not in curve.data[0].info['columns']: - scale(curve) + scale(hooke, curve) data = None for block in curve.data: if block.info['name'].startswith('retract'): @@ -162,7 +163,7 @@ class ConvolutionPeaksCommand (Command): break if data == None: raise Failure('No retraction blocks in %s.' % curve) - z_data = data[:,data.info['columns'].index('surface z piezo (m)')] + z_data = data[:,data.info['columns'].index('surface distance (m)')] if 'flattened deflection (N)' in data.info['columns']: params['deflection column name'] = 'flattened deflection (N)' else: @@ -204,16 +205,22 @@ class ConvolutionFilterCommand (FilterCommand): self.arguments.extend(plugin._arguments) def filter(self, curve, hooke, inqueue, outqueue, params): + params['curve'] = curve inq = Queue() outq = Queue() conv_command = [c for c in self.hooke.commands if c.name=='convolution peaks'][0] conv_command.run(hooke, inq, outq, **params) peaks = outq.get() + if isinstance(peaks, UncaughtException) \ + and isinstance(peaks.exception, PoorFit): + return False if not (isinstance(peaks, list) and (len(peaks) == 0 or isinstance(peaks[0], Peak))): raise Failure('Expected a list of Peaks, not %s' % peaks) ret = outq.get() if not isinstance(ret, Success): raise ret + if params['min peaks'] == None: # Use configured default value. + params['min peaks'] = self.plugin.config['min peaks'] return len(peaks) >= params['min peaks']