review.py plugin allows to review curves in groups of ten (à la Igor Pro), select...
[hooke.git] / review.py
1 #!/usr/bin/env python
2
3 '''review.py
4 Alberto Gomez-Casado (c) 2010 University of Twente
5 '''
6
7 from libhooke import WX_GOOD
8 import wxversion
9 wxversion.select(WX_GOOD)
10 from wx import PostEvent
11 import numpy as np
12 import shutil
13 import libinput as linp
14 import copy
15 import os.path
16
17 import warnings
18 warnings.simplefilter('ignore',np.RankWarning)
19
20
21 class reviewCommands:
22
23     def do_review(self,args):
24         '''
25         REVIEW
26         (review.py)
27         Presents curves (in current playlist) in groups of ten. User can indicate which curves will be selected to be saved in a separate directory for further analysis.
28         By default curves are presented separated -30 nm in x and -100 pN in y. 
29         Curve number one of each set is the one showing the approach.
30         ------------
31         Syntax:
32         review [x spacing (nm)] [y spacing (pN]
33
34         '''
35
36         args=args.split()
37
38         if len(args)==2:
39                 try:
40                         xgap=int(args[0])*1e-9 #scale to SI units 
41                         ygap=int(args[1])*1e-12
42                 except:
43                         print 'Spacings must be numeric! Using defaults'
44                         xgap=-30*1e-9
45                         ygap=-100*1e-12 
46         else:
47                 xgap=-30*1e-9
48                 ygap=-100*1e-12 
49                   
50         print 'Processing playlist...'
51         print '(Please wait)'
52         keep_list=[]
53         
54         c=0
55         print 'You can stop the review at any moment by entering \'q\' you can go back ten curves entering \'b\''
56         print 'What curve no. you would like to start? (Enter for starting from the first)'
57         skip=raw_input()
58         
59         if skip.isdigit()==False:
60             skip=0
61         else:
62             skip=int(skip)
63             print 'Skipping '+str(skip)+ ' curves'
64             c=skip      
65
66         while c < len(self.current_list):
67                 
68         
69             #take a group of ten curves and plot them with some spacing
70                                 
71             curveset=self.current_list[c:c+10]
72         
73             base=self.current_list[c]   
74             self.do_plot(0)     
75             multiplot=copy.deepcopy(self._get_displayed_plot(0))
76
77             for i in range(1,10):
78                 if i >= len(curveset):
79                         print 'End of the list'
80                         print 'WARNING: maybe you want to finish!'
81                         break
82                 nextitem=curveset[i]
83                 nextitem.identify(self.drivers)
84                 nextplot=self.plotmanip_correct(nextitem.curve.default_plots()[0],nextitem)
85                 nextvect=nextplot.vectors
86                 nextitem.curve.close_all()
87
88                 nextx=nextvect[0][0]
89                 nexty=nextvect[0][1]
90                 #center y around 0      
91                 ymedian=np.median(nexty)
92                 pos=0           
93                 for j in range(0,len(nextx)):
94                         nextx[j]=nextx[j]+i*xgap
95                         nexty[j]=nexty[j]+i*ygap-ymedian
96                 multiplot.add_set(nextx,nexty) 
97                 multiplot.styles.append('lines')
98                 multiplot.colors.append(None)
99                 
100             self._send_plot([multiplot])                
101                                 
102             
103             print 'Which ones you want to keep?'        
104             keep=raw_input()
105             if keep.isalpha():
106                 if keep=='b':
107                         print 'Going back ten curves'
108                         c-=10
109                         if c<0:
110                                 print 'We are already at the start'
111                                 c=0
112                         continue
113                 if keep=='q':
114                         break
115             else:
116                 for i in keep.split():
117                         if i.isdigit() and int(i)>0 and int(i)<11: #if it is not digit the int() call is never made, so no exception should be happening
118                                 keep_item=curveset[int(i)-1].path
119                                 if keep_item in keep_list:
120                                         print 'This curve ('+keep_item+') was already selected, skipping'
121                                 else:
122                                         keep_list.append(keep_item)
123                         else:
124                                 print 'You entered an invalid value: '+i
125                                         
126             c+=10
127
128         print 'Kept '+str(len(keep_list))+' curves from '+str(min(c+i+1,len(self.current_list)))
129
130         allok=0  #flag to keep from losing all the work in a slight mistake
131         while allok==0:
132                 save=linp.safeinput('Do you want to save the selected curves?',['y','n'])
133                 if save=='y':
134                         savedir=linp.safeinput('Destination directory?')
135                         savedir=os.path.abspath(savedir)
136                         if not os.path.isdir(savedir):
137                                 print 'Destination is not a directory. Try again'
138                                 continue
139                 if save=='n':
140                         break
141                 
142                 for item in keep_list:
143                         try:
144                                 shutil.copy(item, savedir)
145                                 allok=1
146                         except (OSError, IOError):
147                                 print 'Cannot copy file. '+item+' Perhaps you gave me a wrong directory?'
148                                 allok=0
149                                 break
150
151         return True