source: sasview/guiframe/local_perspectives/plotting/boxSum.py @ 3bae6c8

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 3bae6c8 was 0f6d05f8, checked in by Gervaise Alina <gervyh@…>, 16 years ago

boxaveraging still bugging on set_params

  • Property mode set to 100644
File size: 17.0 KB
Line 
1#TODO: the line slicer should listen to all 2DREFRESH events, get the data and slice it
2#      before pushing a new 1D data update.
3
4#
5#TODO: NEED MAJOR REFACTOR
6#
7
8
9# Debug printout
10#from config import printEVT
11from BaseInteractor import _BaseInteractor
12from copy import deepcopy
13import math
14
15#from Plotter1D import AddPlotEvent
16import SlicerParameters
17import wx
18
19class BoxSum(_BaseInteractor):
20    """
21         Select an annulus through a 2D plot
22    """
23    def __init__(self,base,axes,color='black', zorder=3, x_min=0.0025, x_max=0.0025, y_min=0.0025, y_max=0.0025):
24       
25        _BaseInteractor.__init__(self, base, axes, color=color)
26        self.markers = []
27        self.axes = axes
28        self.qmax = self.base.qmax
29        self.connect = self.base.connect
30       
31        self.xmin= -1* x_min
32        self.ymin= -1* y_min
33        self.xmax= x_max
34        self.ymax=  y_max
35        # center of the figure
36        self.center_x= 0.0
37        self.center_y= 0.0
38       
39        ## Number of points on the plot
40        self.nbins = 20
41        self.count=0
42        self.error=0
43       
44        self.left_line = VerticalLine(self, self.base.subplot,color='blue', zorder=zorder, 
45                                        ymin= self.ymin, ymax= self.ymax,
46                                        x= self.xmin,
47                                        center_x= self.center_x,
48                                        center_y= self.center_y)
49        self.left_line.qmax = self.base.qmax
50       
51        self.right_line= VerticalLine(self, self.base.subplot,color='black', zorder=zorder,
52                                     ymin= self.ymin, ymax= self.ymax,
53                                     x=self.xmax,
54                                     center_x= self.center_x,
55                                     center_y= self.center_y)
56        self.right_line.qmax = self.base.qmax
57       
58        self.top_line= HorizontalLine(self, self.base.subplot,color='green', zorder=zorder,
59                                    y= self.ymax,
60                                    xmin= self.xmin, xmax= self.xmax,
61                                    center_x= self.center_x,
62                                    center_y= self.center_y)
63        self.top_line.qmax = self.base.qmax
64       
65        self.bottom_line= HorizontalLine(self, self.base.subplot,color='red', zorder=zorder,
66                                    y =self.ymin,
67                                    xmin= self.xmin, xmax= self.xmax,
68                                    center_x= self.center_x,
69                                    center_y= self.center_y)
70        self.bottom_line.qmax = self.base.qmax
71        #self.outer_circle.set_cursor(self.base.qmax/1.8, 0)
72       
73        self.connect_markers([])
74                     
75        self.update()
76        self._post_data()
77       
78        # Bind to slice parameter events
79        self.base.parent.Bind(SlicerParameters.EVT_SLICER_PARS, self._onEVT_SLICER_PARS)
80
81
82    def _onEVT_SLICER_PARS(self, event):
83        #printEVT("AnnulusSlicer._onEVT_SLICER_PARS")
84        event.Skip()
85        if event.type == self.__class__.__name__:
86            self.set_params(event.params)
87            self.base.update()
88
89    def update_and_post(self):
90        self.update()
91        self._post_data()
92
93    def save_data(self, path, image, x, y):
94        output = open(path, 'w')
95       
96        data_x, data_y = self.get_data(image, x, y)
97       
98        output.write("<phi>  <average>\n")
99        for i in range(len(data_x)):
100            output.write("%g  %g\n" % (data_x[i], data_y[i]))
101        output.close()
102
103    def set_layer(self, n):
104        self.layernum = n
105        self.update()
106       
107    def clear(self):
108        self.clear_markers()
109        self.left_line.clear()
110        self.right_line.clear()
111        self.top_line.clear()
112        self.bottom_line.clear()
113       
114        #self.base.connect.disconnect()
115        self.base.parent.Unbind(SlicerParameters.EVT_SLICER_PARS)
116       
117    def update(self):
118        """
119        Respond to changes in the model by recalculating the profiles and
120        resetting the widgets.
121        """
122        if self.left_line.has_move:
123            print "left has moved"
124            self.left_line.update(mline=[self.center_x, self.center_y],translation=True)
125           
126            #self.right_line.update(mline= [self.center_x, self.center_y],translation=True)
127            self.top_line.update( xmin= self.left_line.x ,xmax= self.right_line.x,
128                                  mline= [self.center_x, self.center_y],translation=True)
129            self.bottom_line.update(xmin= self.left_line.x ,xmax= self.right_line.x,
130                                    mline= [self.center_x, self.center_y],translation=True)
131        if self.right_line.has_move:
132            print "right has moved"
133            self.right_line.update(mline= [self.center_x, self.center_y],translation=True)
134            #self.left_line.update(mline=[self.center_x, self.center_y],translation=True)
135            #self.left_line.update(xmin= self.right_line.x ,xmax=-1*self.right_line.x)
136            self.top_line.update( xmin= self.left_line.x ,xmax= self.right_line.x,
137                                  mline= [self.center_x, self.center_y],translation=True)
138            self.bottom_line.update(xmin= self.left_line.x ,xmax= self.right_line.x,
139                                    mline= [self.center_x, self.center_y],translation=True)
140           
141           
142        if self.bottom_line.has_move:
143            print "bottom has moved"
144            self.bottom_line.update(mline= [self.center_x, self.center_y],translation=True)
145            #self.top_line.update(y= -1*self.top_line.y,translation=True)
146            self.left_line.update( ymin= self.bottom_line.y ,ymax= self.top_line.y,
147                                   mline= [self.center_x, self.center_y],translation=True)
148            self.right_line.update(ymin= self.bottom_line.y ,ymax= self.top_line.y,
149                                   mline= [self.center_x, self.center_y],translation=True)
150           
151        if self.top_line.has_move:
152            print "top has moved"
153            self.top_line.update(mline= [self.center_x, self.center_y],translation=True)
154           
155            #self.bottom_line.update(y= -1*self.top_line.y,mline= [self.center_x, self.center_y],
156            #                        translation=True )
157            self.left_line.update(ymin= self.bottom_line.y ,ymax= self.top_line.y,
158                                  mline= [self.center_x, self.center_y],translation=True)
159            self.right_line.update(ymin= self.bottom_line.y ,ymax= self.top_line.y,
160                                   mline= [self.center_x, self.center_y],translation=True)
161           
162   
163    def save(self, ev):
164        """
165        Remember the roughness for this layer and the next so that we
166        can restore on Esc.
167        """
168        self.base.freeze_axes()
169        self.inner_circle.save(ev)
170        self.outer_circle.save(ev)
171
172    def _post_data(self):
173        # Compute data
174        data = self.base.data2D
175        from DataLoader.manipulations import  Boxavg
176        radius = math.sqrt(math.pow(self.qmax,2)+math.pow(self.qmax,2))
177        x_min= self.left_line.x
178        x_max= self.right_line.x
179        y_min= self.bottom_line.y
180        y_max= self.top_line.y
181        box =  Boxavg (x_min=x_min, x_max=x_max, y_min=y_min, y_max=y_max)
182        self.count, self.error = box(self.base.data2D)
183        print "count, error",self.count, self.error
184       
185                                       
186    def moveend(self, ev):
187        self.base.thaw_axes()
188       
189        # Post paramters
190        event = SlicerParameters.SlicerParameterEvent()
191        event.type = self.__class__.__name__
192        print "event type boxsum: ", event.type
193        event.params = self.get_params()
194       
195        wx.PostEvent(self.base.parent, event)
196
197        self._post_data()
198           
199    def restore(self):
200        """
201        Restore the roughness for this layer.
202        """
203        self.inner_circle.restore()
204        self.outer_circle.restore()
205
206    def move(self, x, y, ev):
207        """
208        Process move to a new position, making sure that the move is allowed.
209        """
210        print "in move"
211        if self.xmin <= x and x <= self.xmax:
212            print "has move whole", x
213       
214    def set_cursor(self, x, y):
215        pass
216       
217    def get_params(self):
218        params = {}
219        params["x_min"] = self.left_line.x
220        params["x_max"] = self.right_line.x
221        params["y_min"] = self.bottom_line.y
222        params["y_max"] = self.top_line.y
223        params["count"] = self.count
224        params["errors"]= self.error
225        return params
226   
227   
228    def get_result(self):
229        """
230            return the result of box summation
231        """
232        result={}
233        result["count"] = self.count
234        result["error"] = self.error
235        return result
236       
237       
238    def set_params(self, params):
239       
240        x_min = -math.fabs(params["x_min"] )
241        x_max = math.fabs(params["x_max"] )
242        y_min = -math.fabs(params["y_min"])
243        y_max = math.fabs(params["y_max"]) 
244       
245        self.left_line.update(ymin= y_min ,ymax= y_max , x= x_min)
246        self.right_line.update(ymin= y_min ,ymax= y_max, x= x_max)
247        self.top_line.update( xmin= x_min ,xmax= x_max, y= y_max)
248        self.bottom_line.update(xmin= x_min ,xmax= x_max, y=y_min)
249        """
250        self.left_line.update(mline= [center_x, center_y],ymin= y_min ,ymax= y_max)
251        self.right_line.update(mline= [center_x, center_y],ymin= y_min ,ymax= y_max)
252        self.top_line.update(mline= [center_x, center_y], xmin= x_min ,xmax= xmax)
253        self.bottom_line.update(mline= [center_x, center_y],xmin= xmin ,xmax= xmax)
254        """
255       
256        self._post_data()
257    def freeze_axes(self):
258        self.base.freeze_axes()
259       
260    def thaw_axes(self):
261        self.base.thaw_axes()
262
263    def draw(self):
264        self.base.draw()
265
266class HorizontalLine(_BaseInteractor):
267    """
268         Select an annulus through a 2D plot
269    """
270    def __init__(self,base,axes,color='black', zorder=5, y=0.5,
271                 xmin=0.0,xmax=0.5,
272                 center_x= 0.0,
273                 center_y= 0.0):
274       
275        _BaseInteractor.__init__(self, base, axes, color=color)
276        self.markers = []
277        self.axes = axes
278        # center
279        self.center_x = center_x
280        self.center_y = center_y
281       
282        self.y= y - self.center_y
283        self.save_y= y- self.center_y
284       
285        self.xmin = xmin - self.center_x
286        self.save_xmin = xmin - self.center_x
287        self.xmax = xmax - self.center_x
288        self.save_xmax = xmax - self.center_x
289       
290       
291        self.line = self.axes.plot([self.xmin,self.xmax],[self.y,self.y],
292                                      linestyle='-', marker='',
293                                      color=self.color,
294                                      visible=True)[0]
295 
296
297        self.npts = 20
298        self.has_move=False
299        self.connect_markers([self.line])
300        self.update()
301
302    def set_layer(self, n):
303        self.layernum = n
304        self.update()
305       
306    def clear(self):
307        self.clear_markers()
308        try:
309           
310            self.line.remove()
311        except:
312            # Old version of matplotlib
313            for item in range(len(self.axes.lines)):
314                del self.axes.lines[0]
315       
316    def get_radius(self):
317       
318        return 0
319   
320    def update(self,xmin=None, xmax=None,y=None, mline=None,translation=False):
321        """
322        Draw the new roughness on the graph.
323        """
324        #print "update main line", self.has_move
325        if xmin !=None:
326            self.xmin = xmin # - self.center_x
327        if xmax !=None:
328            self.xmax = xmax #- self.center_x
329        if y !=None:
330            self.y = y #- self.center_y
331       
332        self.line.set(xdata=[self.xmin,self.xmax], ydata=[self.y,self.y])
333     
334       
335       
336    def save(self, ev):
337        """
338        Remember the roughness for this layer and the next so that we
339        can restore on Esc.
340        """
341        self.save_xmin= self.xmin
342        self.save_xmax= self.xmax
343       
344        self.save_y= self.y
345        self.base.freeze_axes()
346
347    def moveend(self, ev):
348       
349        self.has_move=False
350        self.base.moveend(ev)
351           
352    def restore(self):
353        """
354        Restore the roughness for this layer.
355        """
356        self.y= self.save_y
357       
358    def move(self, x, y, ev):
359        """
360        Process move to a new position, making sure that the move is allowed.
361        """
362        self.y= y - self.center_y
363       
364        self.has_move=True
365        self.base.base.update()
366       
367    def set_cursor(self, x, y):
368        self.move(x, y, None)
369        self.update()
370       
371       
372    def get_params(self):
373        params = {}
374        params["radius"] = self.xmin
375        params["theta"] = self.xmax
376       
377        return params
378   
379    def set_params(self, params):
380
381        x = params["radius"] 
382        self.set_cursor(x, self._inner_mouse_y)
383       
384
385
386
387class VerticalLine(_BaseInteractor):
388    """
389         Select an annulus through a 2D plot
390    """
391    def __init__(self,base,axes,color='black', zorder=5, ymin=0.0, 
392                 ymax=0.5,x= 0.5,
393                   center_x= 0,
394                 center_y= 0):
395       
396        _BaseInteractor.__init__(self, base, axes, color=color)
397        self.markers = []
398        self.axes = axes
399        # x coordinate of the vertical line
400        self.center_x= center_x
401        self.center_y= center_y
402        self.x = x - center_x
403        self.save_x = x - center_x
404        # minimum value of y coordinate of the vertical line
405        self.ymin = ymin - center_y
406        self.save_ymin = ymin - center_y
407        # maximum value of y coordinate of the vertical line
408        self.ymax= ymax - center_y
409        self.save_ymax= ymax - center_y
410       
411        # Draw vertical line
412        self.line = self.axes.plot([self.x,self.x],[self.ymin,self.ymax],
413                                      linestyle='-', marker='',
414                                      color=self.color,
415                                      visible=True)[0]
416     
417        self.npts = 20
418        # Check vertical line motion
419        self.has_move=False
420        self.connect_markers([self.line])
421        self.update()
422
423    def set_layer(self, n):
424        self.layernum = n
425        self.update()
426       
427    def clear(self):
428        self.clear_markers()
429        try:
430           
431            self.line.remove()
432        except:
433            # Old version of matplotlib
434            for item in range(len(self.axes.lines)):
435                del self.axes.lines[0]
436       
437    def get_radius(self):
438        return 0
439   
440    def update(self,x=None,ymin=None, ymax=None, mline=None,translation=False):
441        """
442        Draw the new roughness on the graph.
443        """
444        if x!=None:
445            self.x = x #-self.center_x
446        if ymin !=None:
447            self.ymin = ymin #- self.center_y
448        if ymax !=None:
449            self.ymax = ymax #- self.center_y
450       
451        self.line.set(xdata=[self.x,self.x], ydata=[self.ymin,self.ymax])
452     
453       
454       
455    def save(self, ev):
456        """
457        Remember the roughness for this layer and the next so that we
458        can restore on Esc.
459        """
460        self.save_x= self.x
461        self.save_ymin= self.ymin
462        self.save_ymax= self.ymax
463       
464        self.base.freeze_axes()
465
466    def moveend(self, ev):
467       
468        self.has_move=False
469        self.base.moveend(ev)
470           
471    def restore(self):
472        """
473        Restore the roughness for this layer.
474        """
475        self.x = self.save_x
476       
477        self.ymin=self.save_ymin
478        self.ymax=self.save_ymax
479    def move(self, x, y, ev):
480        """
481        Process move to a new position, making sure that the move is allowed.
482        """
483        self.x = x - self.center_x
484       
485        self.has_move=True
486        self.base.base.update()
487       
488       
489    def set_cursor(self, x, y):
490        self.move(x, y, None)
491        self.update()
492       
493       
494    def get_params(self):
495        params = {}
496        params["x"] = self.xmin
497        params["ymin"] = self.ymin
498        params["ymax"] = self.ymax
499        return params
500   
501    def set_params(self, params):
502        """
503            Draw a vertical line given some value of params
504            @param params: a dictionary containing value for x, ymin , ymax to draw
505            a vertical line
506        """
507        x = params["x"] 
508        ymin = params["ymin"] 
509        ymax = params["ymax"] 
510        #self.set_cursor(x, self._inner_mouse_y)
511        self.update(self,x =x,ymin =ymin, ymax =ymax)
512       
513
514         
Note: See TracBrowser for help on using the repository browser.