added first (still to debug) version of pcluster
authordevicerandom <devnull@localhost>
Fri, 13 Feb 2009 13:48:23 +0000 (13:48 +0000)
committerdevicerandom <devnull@localhost>
Fri, 13 Feb 2009 13:48:23 +0000 (13:48 +0000)
convfilt.conf
hooke.conf
hooke_cli.py
pcluster.py [new file with mode: 0644]

index ef5254ce1d60b05a6a94cf44593cf9707f020c0b..db7134a3819ed98361f7666a803f36bc60157598 100644 (file)
@@ -16,5 +16,5 @@
      blindwindow=nm after the contact point where we do not count peaks.
     -->
 <convfilt minpeaks="5" mindeviation="5" seedouble="10" convolution="[6.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0]" blindwindow="20"/>
-
-</config>
\ No newline at end of file
+<!--convfilt minpeaks="5" mindeviation="5" seedouble="10" convolution="[11.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0]" blindwindow="100"/-->
+</config>
index d929b61f75626dab506593c8fc59fdbc83c08845..439816da8458f5d0829cb7eb186aecdfb89d1d47 100755 (executable)
@@ -34,6 +34,7 @@ This section defines which plugins have to be loaded by Hooke.
     <!-- tutorial/ -->
     <macro/>
     <autopeak/>
+    <pcluster/>
 </plugins>
 
 <!--
@@ -42,7 +43,7 @@ This section defines which drivers have to be loaded by Hooke.
 <drivers>
     <picoforce/>
     <!-- picoforcealt/ -->
-    <!-- hemingclamp/ -->
+    <hemingclamp/>
     <csvdriver/>
     <!-- tutorialdriver/ -->
     <jpk/>
index a822042a4b0de5b522e0cccfdf3888af491b78b3..6b0d314aa0ec3e6b6633ea245b1d4aada97073d0 100755 (executable)
@@ -99,10 +99,10 @@ class HookeCli(cmd.Cmd):
                 pass
            
             
-        self.playlist_saved=0
-        self.playlist_name=''
-        self.notes_saved=1
-        self.notes_filename=None
+        self.playlist_saved=0 #Did we save the playlist?
+        self.playlist_name='' #Name of playlist
+        self.notes_saved=1 #Did we save the notes?
+        self.notes_filename=None #Name of notes
 
         #create outlet
         self.outlet=lout.Outlet()
diff --git a/pcluster.py b/pcluster.py
new file mode 100644 (file)
index 0000000..a70a7b7
--- /dev/null
@@ -0,0 +1,183 @@
+#!/usr/bin/env python
+
+from libhooke import WX_GOOD, ClickedPoint
+import wxversion
+wxversion.select(WX_GOOD)
+from wx import PostEvent
+import numpy as np
+import scipy as sp
+import copy
+import os.path
+import time
+
+import warnings
+warnings.simplefilter('ignore',np.RankWarning)
+
+
+class pclusterCommands:
+
+               def do_pcluster(self,args):
+                               '''
+                               pCLUSTER
+                               (pcluster.py)
+                               '''
+                               
+                               #configuration variables
+                               min_npks = 5
+                               min_deviation = 5
+                               
+                               # ------ FUNCTION ------
+                               def fit_interval_nm(start_index,plot,nm,backwards):
+                                               '''
+                                               Calculates the number of points to fit, given a fit interval in nm
+                                               start_index: index of point
+                                               plot: plot to use
+                                               backwards: if true, finds a point backwards.
+                                               '''
+                                               whatset=1 #FIXME: should be decidable
+                                               x_vect=plot.vectors[1][0]
+                                               
+                                               c=0
+                                               i=start_index
+                                               start=x_vect[start_index]
+                                               maxlen=len(x_vect)
+                                               while abs(x_vect[i]-x_vect[start_index])*(10**9) < nm:
+                                                               if i==0 or i==maxlen-1: #we reached boundaries of vector!
+                                                                               return c
+                                                               if backwards:
+                                                                               i-=1
+                                                               else:
+                                                                               i+=1
+                                                               c+=1
+                                               return c
+                               
+                               def plot_informations(itplot):
+                                               '''
+                                               OUR VARIABLES
+                                               contact_point.absolute_coords           (2.4584142802103689e-007, -6.9647135616234017e-009)
+                                               peak_point.absolute_coords                      (3.6047748250571423e-008, -7.7142802788854212e-009)
+                                               other_fit_point.absolute_coords (4.1666139243838867e-008, -7.3759393477579707e-009)
+                                               peak_location                                                                           [510, 610, 703, 810, 915, 1103]
+                                               peak_size                                                                                               [-1.2729111505202212e-009, -9.1632775347399312e-010, -8.1707438353929907e-010, -8.0335812578148904e-010, -8.7483955226387558e-010, -3.6269619757067322e-009]
+                                               params                                                                                                  [2.2433999931959462e-007, 3.3230248825175678e-010]
+                                               fit_errors                                                                                      [6.5817195369767644e-010, 2.4415923138871498e-011]
+                                               '''
+                                               fit_points=int(self.config['auto_fit_points']) # number of points to fit before the peak maximum <50>
+                                               pl_value=None # persistent length <None>
+                                               T=self.config['temperature'] #temperature of the system in kelvins. By default it is 293 K. <301.0>
+                                               cindex=self.find_contact_point() #Automatically find contact point <158, libhooke.ClickedPoint>
+                                               contact_point=self._clickize(itplot[0].vectors[1][0], itplot[0].vectors[1][1], cindex)
+                                               self.basepoints=[]
+                                               base_index_0=peak_location[-1]+fit_interval_nm(peak_location[-1], itplot[0], self.config['auto_right_baseline'],False)
+                                               self.basepoints.append(self._clickize(itplot[0].vectors[1][0],itplot[0].vectors[1][1],base_index_0))
+                                               base_index_1=self.basepoints[0].index+fit_interval_nm(self.basepoints[0].index, itplot[0], self.config['auto_left_baseline'],False)
+                                               self.basepoints.append(self._clickize(itplot[0].vectors[1][0],itplot[0].vectors[1][1],base_index_1))
+                                               self.basecurrent=self.current.path
+                                               boundaries=[self.basepoints[0].index, self.basepoints[1].index]
+                                               boundaries.sort()
+                                               to_average=itplot[0].vectors[1][1][boundaries[0]:boundaries[1]] #y points to average
+                                               avg=np.mean(to_average)
+                                               return fit_points, contact_point, pl_value, T, cindex, avg
+                                               
+                               def features_peaks(itplot, peak, fit_points, contact_point, pl_value, T, cindex, avg):
+                                               '''
+                                               calculate informations for each peak and add they in 
+                                               c_lengths, p_lengths, sigma_c_lengths, sigma_p_lengths, forces, slopes
+                                               '''
+                                                c_leng=None
+                                                p_leng=None
+                                                sigma_c_leng=None
+                                                sigma_p_leng=None
+                                                force=None
+                                                slope=None
+                                                
+                                               delta_force=10
+                                               slope_span=int(self.config['auto_slope_span'])
+                                               
+                                                peak_point=self._clickize(itplot[0].vectors[1][0],itplot[0].vectors[1][1],peak)
+                                               other_fit_point=self._clickize(itplot[0].vectors[1][0],itplot[0].vectors[1][1],peak-fit_points)
+                                               
+                                                points=[contact_point, peak_point, other_fit_point]
+                                               
+                                                params, yfit, xfit, fit_errors = self.wlc_fit(points, itplot[0].vectors[1][0], itplot[0].vectors[1][1], pl_value, T, return_errors=True)
+                                               
+                                                #Measure forces
+                                               delta_to_measure=itplot[0].vectors[1][1][peak-delta_force:peak+delta_force]
+                                               y=min(delta_to_measure)
+                                               #Measure slopes
+                                               slope=self.linefit_between(peak-slope_span,peak)[0]
+                                               #check fitted data and, if right, add peak to the measurement
+                                               if len(params)==1: #if we did choose 1-value fit
+                                                               p_leng=pl_value
+                                                               c_leng=params[0]*(1.0e+9)
+                                                               sigma_p_lengths=0
+                                                               sigma_c_lengths=fit_errors[0]*(1.0e+9)
+                                                               force = abs(y-avg)*(1.0e+12)
+                                               else: #2-value fit
+                                                               p_leng=params[1]*(1.0e+9)
+                                                               #check if persistent length makes sense. otherwise, discard peak.
+                                                               if p_leng>self.config['auto_min_p'] and p_leng<self.config['auto_max_p']:
+                                                                               '''
+                                                                                p_lengths.append(p_leng)       
+                                                                               c_lengths.append(params[0]*(1.0e+9))
+                                                                               sigma_c_lengths.append(fit_errors[0]*(1.0e+9))
+                                                                               sigma_p_lengths.append(fit_errors[1]*(1.0e+9))
+                                                                               forces.append(abs(y-avg)*(1.0e+12))
+                                                                               slopes.append(slope)     
+                                                                                '''
+                                                                                c_leng=params[0]*(1.0e+9)
+                                                                                sigma_c_leng=fit_errors[0]*(1.0e+9)
+                                                                                sigma_p_leng=fit_errors[1]*(1.0e+9)
+                                                                                force=abs(y-avg)*(1.0e+12)
+                                                                                
+                                                               else:
+                                                                               p_leng=None
+                                                                                slope=None
+                                               #return c_lengths, p_lengths, sigma_c_lengths, sigma_p_lengths, forces, slopes
+                                                return  c_leng, p_leng, sigma_c_leng, sigma_p_leng, force, slope
+
+                               
+                               # ------ PROGRAM -------
+                               c=0
+                               for item in self.current_list:
+                                               c+=1
+                                               item.identify(self.drivers)
+                                               itplot=item.curve.default_plots()
+                                               peak_location,peak_size=self.exec_has_peaks(item,min_deviation)
+                                               fit_points, contact_point, pl_value, T, cindex, avg = plot_informations(itplot)
+                                               print '\n\nCurve',item.path, 'is',c,'of',len(self.current_list),': found '+str(len(peak_location))+' peaks.'
+                                               
+                                               #initialize output data vectors
+                                               c_lengths=[]
+                                               p_lengths=[]
+                                               sigma_c_lengths=[]
+                                               sigma_p_lengths=[]
+                                               forces=[]
+                                               slopes=[]
+                                               
+                                               #loop each peak of my curve
+                                               for peak in peak_location:
+                                                    c_leng, p_leng, sigma_c_leng, sigma_p_leng, force, slope = features_peaks(itplot, peak, fit_points, contact_point, pl_value, T, cindex, avg)
+                                                    for var, vector in zip([c_leng, p_leng, sigma_c_leng, sigma_p_leng, force, slope],[c_lengths, p_lengths, sigma_c_lengths, sigma_p_lengths, forces, slopes]):
+                                                        if var is not None:
+                                                            vector.append(var)
+                                                    
+                                                    '''
+                                                    c_lengths.append(c_leng)
+                                                    p_lengths.append(p_leng)
+                                                    sigma_c_lengths.append(sigma_c_leng)
+                                                   sigma_p_lengths.append(sigma_p_leng)
+                                                   forces.append(force)
+                                                   slopes.append(slope)
+                                                    '''
+                                                                                               
+                                               print 'Measurements for all peaks detected:'
+                                               print 'contour (nm)', c_lengths
+                                               print 'sigma contour (nm)',sigma_c_lengths
+                                               print 'p (nm)',p_lengths
+                                               print 'sigma p (nm)',sigma_p_lengths
+                                               print 'forces (pN)',forces
+                                               print 'slopes (N/m)',slopes
+                                                                               
+                               print ""
+                               
\ No newline at end of file