source: sasview/guiframe/local_perspectives/plotting/boxMask.py @ b35d3d1

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 b35d3d1 was 83f4445, checked in by Gervaise Alina <gervyh@…>, 15 years ago

working on documentation

  • Property mode set to 100644
File size: 8.9 KB
Line 
1
2
3
4import math
5import wx
6from copy import deepcopy
7from BaseInteractor import _BaseInteractor
8from boxSum import PointInteractor,VerticalDoubleLine,HorizontalDoubleLine
9from sans.guicomm.events import SlicerParamUpdateEvent
10
11
12class BoxMask(_BaseInteractor):
13    """
14    BoxMask Class: determine 2 rectangular area to find the pixel of
15    a Data inside of box.
16   
17    Uses PointerInteractor , VerticalDoubleLine,HorizontalDoubleLine.
18   
19    :param zorder:  Artists with lower zorder values are drawn first.
20    :param x_min: the minimum value of the x coordinate
21    :param x_max: the maximum value of the x coordinate
22    :param y_min: the minimum value of the y coordinate
23    :param y_max: the maximum value of the y coordinate
24
25    """
26    def __init__(self,base,axes,color='black', zorder=3, side=None, 
27                   x_min=0.008, x_max=0.008, y_min=0.0025, y_max=0.0025):
28       
29        _BaseInteractor.__init__(self, base, axes, color=color)
30        ## class initialization
31        ## list of Boxmask markers
32        self.markers = []
33        self.axes = axes
34        self.is_inside = side
35        ## connect the artist for the motion
36        self.connect = self.base.connect
37        ## when qmax is reached the selected line is reset the its previous value
38        self.qmax = min(self.base.data.xmax, self.base.data.xmin)
39        ## Define the box limits
40        self.xmin= -1* 0.5*min(math.fabs(self.base.data.xmax),math.fabs( self.base.data.xmin))
41        self.ymin= -1* 0.5*min(math.fabs(self.base.data.xmax),math.fabs( self.base.data.xmin))
42       
43        self.xmax= 0.5*min(math.fabs(self.base.data.xmax),math.fabs( self.base.data.xmin))
44        self.ymax=  0.5*min(math.fabs(self.base.data.xmax),math.fabs( self.base.data.xmin))
45        ## center of the box
46        self.center_x= 0.0002
47        self.center_y= 0.0003
48        ## Number of points on the plot
49        self.nbins = 20
50        ## Define initial result the summation
51        self.count=0
52        self.error=0
53        self.data = self.base.data
54        ## Flag to determine if the current figure has moved
55        ## set to False == no motion , set to True== motion
56        self.has_move= False
57        ## Create Box edges
58        self.horizontal_lines= HorizontalDoubleLine(self, self.base.subplot,color='blue',
59                                                      zorder=zorder,
60                                    y= self.ymax,
61                                    x= self.xmax,
62                                    center_x= self.center_x,
63                                    center_y= self.center_y)
64        self.horizontal_lines.qmax = self.qmax
65       
66        self.vertical_lines= VerticalDoubleLine(self, self.base.subplot,color='grey',
67                                                      zorder=zorder,
68                                    y= self.ymax,
69                                    x= self.xmax,
70                                    center_x= self.center_x,
71                                    center_y= self.center_y)
72        self.vertical_lines.qmax = self.qmax
73       
74        self.center= PointInteractor(self, self.base.subplot,color='grey',
75                                                      zorder=zorder,
76                                    center_x= self.center_x,
77                                    center_y= self.center_y)
78        ## Save the name of the slicer panel associate with this slicer
79        self.panel_name=""   
80        ## Update and post slicer parameters 
81        self.update()
82        self._post_data()
83       
84       
85    def clear(self):
86        """
87        Clear the slicer and all connected events related to this slicer
88        """
89        self.clear_markers()
90        self.horizontal_lines.clear()
91        self.vertical_lines.clear()
92        self.center.clear()
93        self.base.connect.clearall()
94        #self.base.Unbind(EVT_SLICER_PARS)
95   
96    def update(self):
97        """
98        Respond to changes in the model by recalculating the profiles and
99        resetting the widgets.
100        """
101        ## check if the center point has moved and update the figure accordingly
102        if self.center.has_move:
103            self.center.update()
104            self.horizontal_lines.update( center= self.center)
105            self.vertical_lines.update( center= self.center)
106        ## check if the horizontal lines have moved and update the figure accordingly   
107        if self.horizontal_lines.has_move:
108            self.horizontal_lines.update()
109            self.vertical_lines.update(y1=self.horizontal_lines.y1,
110                                       y2=self.horizontal_lines.y2,
111                                       height= self.horizontal_lines.half_height )
112        ## check if the vertical lines have moved and update the figure accordingly   
113        if self.vertical_lines.has_move:
114            self.vertical_lines.update()
115            self.horizontal_lines.update(x1=self.vertical_lines.x1,
116                                         x2=self.vertical_lines.x2,
117                                         width=self.vertical_lines.half_width)
118        #if self.is_inside != None:
119        out = self._post_data()
120        return out
121       
122    def save(self, ev):
123        """
124        Remember the roughness for this layer and the next so that we
125        can restore on Esc.
126        """
127        self.base.freeze_axes()
128        self.horizontal_lines.save(ev)
129        self.vertical_lines.save(ev)
130        self.center.save(ev)
131       
132    def _post_data(self):
133        """
134        Get the limits of the boxsum and compute the sum of the pixel
135        contained in that region and the error on that sum
136        """
137        from DataLoader.manipulations import Boxcut
138        ## Data 2D for which the pixel will be summed
139        data = self.base.data
140        mask = data.mask
141        ## the region of the summation
142        x_min= self.horizontal_lines.x2
143        x_max= self.horizontal_lines.x1
144        y_min= self.vertical_lines.y2
145        y_max= self.vertical_lines.y1
146        mask = Boxcut(x_min=x_min, x_max=x_max, y_min=y_min, y_max=y_max)
147
148        if self.is_inside:
149            out = (mask(data)==False)
150        else:
151            out = (mask(data))
152        #self.base.data.mask=out
153        return out 
154             
155    def moveend(self, ev):
156        """
157        After a dragging motion this function is called to compute
158        the error and the sum of pixel of a given data 2D
159        """
160        self.base.thaw_axes()
161        ## post
162        self._post_data()
163           
164    def restore(self):
165        """
166        Restore the roughness for this layer.
167        """
168        self.horizontal_lines.restore()
169        self.vertical_lines.restore()
170        self.center.restore()
171       
172    def move(self, x, y, ev):
173        """
174        Process move to a new position, making sure that the move is allowed.
175        """
176        pass
177   
178    def set_cursor(self, x, y):
179        pass
180       
181    def get_params(self):
182        """
183        Store a copy of values of parameters of the slicer into a dictionary.
184       
185        :return params: the dictionary created
186       
187        """
188        params = {}
189        params["Width"] = math.fabs(self.vertical_lines.half_width)*2
190        params["Height"] = math.fabs(self.horizontal_lines.half_height)*2 
191        params["center_x"] = self.center.x
192        params["center_y"] =self.center.y
193        return params
194   
195    def get_mask(self):
196        """
197        return mask as a result of boxcut
198        """
199        mask = self.mask
200        return mask
201   
202    def set_params(self, params):
203        """
204        Receive a dictionary and reset the slicer with values contained
205        in the values of the dictionary.
206       
207        :param params: a dictionary containing name of slicer parameters and
208           values the user assigned to the slicer.
209        """
210        x_max = math.fabs(params["Width"] )/2
211        y_max = math.fabs(params["Height"] )/2
212       
213        self.center_x=params["center_x"] 
214        self.center_y=params["center_y"]
215        #update the slicer given values of params
216        self.center.update(center_x=self.center_x,center_y=self.center_y)
217        self.horizontal_lines.update(center= self.center,
218                                     width=x_max,
219                                     height=y_max)
220        self.vertical_lines.update(center= self.center,
221                                    width=x_max,
222                                    height=y_max)
223        #compute the new error and sum given values of params
224        self._post_data()
225               
226    def freeze_axes(self):
227        self.base.freeze_axes()
228       
229    def thaw_axes(self):
230        self.base.thaw_axes()
231
232
233    def draw(self):
234        self.base.update()
235
236class inner_BoxMask(BoxMask):   
237    def __call__(self):     
238        self.base.data.mask=(self._post_data()==False)
239         
Note: See TracBrowser for help on using the repository browser.