From d62a0c378b4cd97c608050196badf60a7c2355c4 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Sun, 13 Jun 2010 17:18:14 -0400 Subject: [PATCH] Removed redundant picoforcealt driver --- hooke/driver/__init__.py | 1 - hooke/driver/picoforcealt.py | 290 ----------------------------------- 2 files changed, 291 deletions(-) delete mode 100644 hooke/driver/picoforcealt.py diff --git a/hooke/driver/__init__.py b/hooke/driver/__init__.py index 8c5b9d0..b1ba57f 100644 --- a/hooke/driver/__init__.py +++ b/hooke/driver/__init__.py @@ -37,7 +37,6 @@ DRIVER_MODULES = [ # ('mfp1dexport', True), ('mfp3d', True), ('picoforce', True), -# ('picoforcealt', True), ('tutorial', True), ('wtk', True), ] diff --git a/hooke/driver/picoforcealt.py b/hooke/driver/picoforcealt.py deleted file mode 100644 index b89fc48..0000000 --- a/hooke/driver/picoforcealt.py +++ /dev/null @@ -1,290 +0,0 @@ -# Copyright (C) 2006-2010 Alberto Gomez-Casado -# Massimo Sandal -# W. Trevor King -# -# 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 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 -# . - -"""Library for interpreting Picoforce force spectroscopy files. - -An alternave implementation of :mod:`hooke.driver.picoforce`. -""" - -import re, struct -from scipy import arange - -from .. import curve as lhc - -__version__='0.0.0.20081706' - - - -class DataChunk(list): - #Dummy class to provide ext and ret methods to the data list. - - def ext(self): - halflen=(len(self)/2) - return self[0:halflen] - - def ret(self): - halflen=(len(self)/2) - return self[halflen:] - -class picoforcealtDriver(lhc.Driver): - - #Construction and other special methods - - def __init__(self,filename): - ''' - constructor method - ''' - - self.textfile=file(filename) - self.binfile=file(filename,'rb') - - #The 0,1,2 data chunks are: - #0: D (vs T) - #1: Z (vs T) - #2: D (vs Z) - - self.forcechunk=0 - self.distancechunk=1 - #TODO eliminate the need to set chunk numbers - - self.filepath=filename - self.debug=True - - self.filetype='picoforce' - self.experiment='smfs' - - - - def _get_samples_line(self): - ''' - Gets the samples per line parameters in the file, to understand trigger behaviour. - ''' - self.textfile.seek(0) - - samps_expr=re.compile(".*Samps") - - samps_values=[] - for line in self.textfile.readlines(): - if samps_expr.match(line): - try: - samps=int(line.split()[2]) #the third word splitted is the offset (in bytes) - samps_values.append(samps) - except: - pass - - #We raise a flag for the fact we meet an offset, otherwise we would take spurious data length arguments. - - return int(samps_values[0]) - - def _get_chunk_coordinates(self): - ''' - This method gets the coordinates (offset and length) of a data chunk in our - Picoforce file. - - It returns a list containing two tuples: - the first element of each tuple is the data_offset, the second is the corresponding - data size. - - In near future probably each chunk will get its own data structure, with - offset, size, type, etc. - ''' - self.textfile.seek(0) - - offset_expr=re.compile(".*Data offset") - length_expr=re.compile(".*Data length") - - data_offsets=[] - data_sizes=[] - flag_offset=0 - - for line in self.textfile.readlines(): - - if offset_expr.match(line): - offset=int(line.split()[2]) #the third word splitted is the offset (in bytes) - data_offsets.append(offset) - #We raise a flag for the fact we meet an offset, otherwise we would take spurious data length arguments. - flag_offset=1 - - #same for the data length - if length_expr.match(line) and flag_offset: - size=int(line.split()[2]) - data_sizes.append(size) - #Put down the offset flag until the next offset is met. - flag_offset=0 - - return zip(data_offsets,data_sizes) - - def _get_data_chunk(self,whichchunk): - ''' - reads a data chunk and converts it in 16bit signed int. - ''' - offset,size=self._get_chunk_coordinates()[whichchunk] - - - self.binfile.seek(offset) - raw_chunk=self.binfile.read(size) - - my_chunk=[] - for data_position in range(0,len(raw_chunk),2): - data_unit_bytes=raw_chunk[data_position:data_position+2] - #The unpack function converts 2-bytes in a signed int ('h'). - #we use output[0] because unpack returns a 1-value tuple, and we want the number only - data_unit=struct.unpack('h',data_unit_bytes)[0] - my_chunk.append(data_unit) - - return DataChunk(my_chunk) - - def _force(self): - #returns force vector - Kspring=self.get_spring_constant() - return DataChunk([(meter*Kspring) for meter in self._deflection()]) - - def _deflection(self): - #for internal use (feeds _force) - voltrange=1 - z_scale=self._get_Z_scale() - deflsensitivity=self.get_deflection_sensitivity() - volts=[((float(lsb))*voltrange*z_scale) for lsb in self.data_chunks[self.forcechunk]] - deflect=[volt*deflsensitivity for volt in volts] - - return deflect - - - def _Z(self): - #returns distance vector (calculated instead than from data chunk) - rampsize=self._get_rampsize() - sampsline=self._get_samples_line() - senszscan=self._get_Z_scan_sens() - - xstep=senszscan*rampsize/sampsline*10**(-9) - - xext=arange(sampsline*xstep,0,-xstep) - xret=arange(sampsline*xstep,0,-xstep) - - return DataChunk(xext.tolist()+xret.tolist()) - - def _get_Z_scale(self): - self.textfile.seek(0) - expr=re.compile(".*@4:Z scale") - - for line in self.textfile.readlines(): - if expr.match(line): - zscale=float((line.split()[5]).strip("() []")) - break - return zscale - - def _get_rampsize(self): - self.textfile.seek(0) - expr=re.compile(".*@4:Ramp size:") - - for line in self.textfile.readlines(): - if expr.match(line): - zsens=float((line.split()[7]).strip("() []")) - break - return zsens - - def _get_Z_scan_sens(self): - self.textfile.seek(0) - expr=re.compile(".*@Sens. Zsens") - - for line in self.textfile.readlines(): - if expr.match(line): - zsens=float((line.split()[3]).strip("() []")) - break - return zsens - - - - def get_deflection_sensitivity(self): - ''' - gets deflection sensitivity - ''' - self.textfile.seek(0) - - def_sensitivity_expr=re.compile(".*@Sens. DeflSens") - - for line in self.textfile.readlines(): - if def_sensitivity_expr.match(line): - def_sensitivity=float(line.split()[3]) - break - #return it in SI units (that is: m/V, not nm/V) - return def_sensitivity*(10**(-9)) - - def get_spring_constant(self): - ''' - gets spring constant. - We actually find *three* spring constant values, one for each data chunk (F/t, Z/t, F/z). - They are normally all equal, but we retain all three for future... - ''' - self.textfile.seek(0) - - springconstant_expr=re.compile(".*Spring Constant") - - constants=[] - - for line in self.textfile.readlines(): - if springconstant_expr.match(line): - constants.append(float(line.split()[2])) - - return constants[0] - - def is_me(self): - ''' - self-identification of file type magic - ''' - curve_file=file(self.filepath) - header=curve_file.read(30) - curve_file.close() - - if header[2:17] == 'Force file list': #header of a picoforce file - #here DONT translate chunk - self.data_chunks=[self._get_data_chunk(num) for num in [0,1,2]] - return True - else: - return False - - def close_all(self): - ''' - Explicitly closes all files - ''' - self.textfile.close() - self.binfile.close() - - def default_plots(self): - ''' - creates the default PlotObject - ''' - force=self._force() - zdomain=self._Z() - samples=self._get_samples_line() - main_plot=lhc.PlotObject() - main_plot.vectors=[[zdomain.ext()[0:samples], force.ext()[0:samples]],[zdomain.ret()[0:samples], force.ret()[0:samples]]] - main_plot.normalize_vectors() - main_plot.units=['meters','newton'] - main_plot.destination=0 - main_plot.title=self.filepath - - - return [main_plot] - - def deflection(self): - #interface for correct plotmanip and others - deflectionchunk=DataChunk(self._deflection()) - return deflectionchunk.ext(),deflectionchunk.ret() -- 2.26.2