Index: guiframe/local_perspectives/plotting/SectorSlicer.py
===================================================================
--- guiframe/local_perspectives/plotting/SectorSlicer.py	(revision cd84dcae89f5f702b6ad8b4626aa2531188ccf0f)
+++ guiframe/local_perspectives/plotting/SectorSlicer.py	(revision ef0c1700493953c0ec4b1091779caf8c5177bf15)
@@ -8,10 +8,11 @@
 
 # Debug printout
-
+from sans.guicomm.events import StatusEvent 
+from sans.guicomm.events import NewPlotEvent
 from BaseInteractor import _BaseInteractor
 from copy import deepcopy
 import math
 
-from sans.guicomm.events import NewPlotEvent, StatusEvent
+
 import SlicerParameters
 import wx
@@ -31,31 +32,31 @@
         ## Number of points on the plot
         self.nbins = 20
-        theta1=math.pi/8
-        theta2=math.pi/2
-        theta1=2*math.pi/3
-        theta2=-2*math.pi/3
-        r1=self.qmax/2.0
-        r2=self.qmax/1.8
-       
+        self.theta1= math.pi/4
+        self.theta2= math.pi/3
+        self.phi=math.pi/12
+        #self.theta3= 2*self.theta2 -self.theta1
         # Inner circle
-        from Arc import ArcInteractor
-        self.inner_circle = ArcInteractor(self, self.base.subplot, zorder=zorder, r=self.qmax/2.0,theta1= theta1,
-                                           theta2=theta2)
-        self.inner_circle.qmax = self.base.qmax
-        self.outer_circle = ArcInteractor(self, self.base.subplot, zorder=zorder+1, r=self.qmax/1.8,theta1= theta1,
-                                           theta2=theta2)
-        self.outer_circle.qmax = self.base.qmax*1.2
+        self.main_line = LineInteractor(self, self.base.subplot,color='blue', zorder=zorder, r=self.qmax,
+                                           theta= self.theta2)
+        self.main_line.qmax = self.base.qmax
+        #self.left_line = SectionInteractor(self, self.base.subplot, zorder=zorder+1, r=self.qmax,
+        #                                   theta1= self.theta1, theta2= self.theta2)
+        #self.left_line.qmax = self.base.qmax
+        self.right_line= SideInteractor(self, self.base.subplot,color='black', zorder=zorder,
+                                     r=self.qmax,
+                                           phi= -1*self.phi,
+                                           theta2=self.theta2)
+        self.right_line.qmax = self.base.qmax
+        self.left_line= SideInteractor(self, self.base.subplot,color='green', zorder=zorder,
+                                     r=self.qmax,
+                                           phi= self.phi,
+                                           theta2=self.theta2)
+        self.left_line.qmax = self.base.qmax
         #self.outer_circle.set_cursor(self.base.qmax/1.8, 0)
-        from Edge import RadiusInteractor
-        self.right_edge= RadiusInteractor(self, self.base.subplot, zorder=zorder+1,
-                                             arc1=self.inner_circle,
-                                             arc2=self.outer_circle,
-                                            theta=theta1)
-        self.left_edge= RadiusInteractor(self, self.base.subplot, zorder=zorder+1,
-                                             arc1=self.inner_circle,
-                                             arc2=self.outer_circle,
-                                            theta=theta2)
+        
+                      
         self.update()
         self._post_data()
+        
         # Bind to slice parameter events
         self.base.parent.Bind(SlicerParameters.EVT_SLICER_PARS, self._onEVT_SLICER_PARS)
@@ -63,5 +64,5 @@
 
     def _onEVT_SLICER_PARS(self, event):
-        #printEVT("AnnulusSlicer._onEVT_SLICER_PARS")
+        wx.PostEvent(self.base.parent, StatusEvent(status="SectorSlicer._onEVT_SLICER_PARS"))
         event.Skip()
         if event.type == self.__class__.__name__:
@@ -69,10 +70,8 @@
             self.base.update()
 
-    """
     def update_and_post(self):
         self.update()
-        self._post_data()
-
-    """
+        #self._post_data()
+
     def save_data(self, path, image, x, y):
         output = open(path, 'w')
@@ -91,8 +90,7 @@
     def clear(self):
         self.clear_markers()
-        self.outer_circle.clear()
-        self.inner_circle.clear()
-        self.right_edge.clear()
-        self.left_edge.clear()
+        self.main_line.clear()
+        self.left_line.clear()
+        self.right_line.clear()
         #self.base.connect.disconnect()
         self.base.parent.Unbind(SlicerParameters.EVT_SLICER_PARS)
@@ -103,31 +101,33 @@
         resetting the widgets.
         """
-        # Update locations   
-        if self.inner_circle.has_move:    
-            print "inner circle has moved" 
-            self.inner_circle.update()
-            r1=self.inner_circle.get_radius()
-            r2=self.outer_circle.get_radius()
-            self.right_edge.update(r1,r2)
-            self.left_edge.update(r1,r2)
-        if self.outer_circle.has_move:    
-            print "outer circle has moved" 
-            self.outer_circle.update()
-            r1=self.inner_circle.get_radius()
-            r2=self.outer_circle.get_radius()
-            self.left_edge.update(r1,r2)
-            self.right_edge.update(r1,r2)
-        if self.right_edge.has_move:
-            print "right edge has moved"
-            self.right_edge.update()
-            self.inner_circle.update(theta1=self.right_edge.get_angle(), theta2=None)
-            self.outer_circle.update(theta1=self.right_edge.get_angle(), theta2=None)
-        if  self.left_edge.has_move:
-            print "left Edge has moved"
-            self.left_edge.update()
-            self.inner_circle.update(theta1=None, theta2=self.left_edge.get_angle())
-            self.outer_circle.update(theta1=None, theta2=self.left_edge.get_angle())
-             
-        
+        # Update locations        
+        
+        #if self.main_line.has_move:
+        #self.main_line.update()   
+        #self.right_line.update()    
+        #self.left_line.update()     
+        if self.main_line.has_move:
+            self.main_line.update()
+            self.right_line.update( delta = self.main_line.get_radius(),mline= self.main_line)
+            self.left_line.update( delta = self.main_line.get_radius() ,mline= self.main_line)
+            print "Main line has moved ---> phi right",math.degrees(self.main_line.theta-self.right_line.theta)
+            print "Main line has moved ---> phi left",math.degrees(self.main_line.theta-self.left_line.theta)
+        if self.left_line.has_move:
+            print "left line has moved --->"
+            self.main_line.update()
+            self.left_line.update(phi=None,delta=None, mline=self.main_line,side=True)
+            #self.right_line.update(-1*delta,linem=self.main_line,linel=self.left_line)
+            self.right_line.update(phi=-1*self.left_line.phi,delta=None, mline=self.main_line,side=True)
+        if self.right_line.has_move:
+            print "right line has moved --->"
+           
+            self.main_line.update()
+            self.right_line.update(phi=None,delta=None, mline=self.main_line,side=True)
+            #self.right_line.update(-1*delta,linem=self.main_line,linel=self.left_line)
+            self.left_line.update(phi=-1*self.right_line.phi,delta=None, mline=self.main_line,side=True)
+   
+    
+    
+
     def save(self, ev):
         """
@@ -138,29 +138,21 @@
         self.inner_circle.save(ev)
         self.outer_circle.save(ev)
-        self.right_edge.save(ev)
-        self.left_edge.save(ev)
-        
-    def _post_data(self):
-        pass
-    
-    def post_data(self,new_sector ):
-        """ post data averaging in Q"""
-        if self.inner_circle.get_radius() < self.outer_circle.get_radius():
-            rmin=self.inner_circle.get_radius()
-            rmax=self.outer_circle.get_radius()
-        else:
-            rmin=self.outer_circle.get_radius()
-            rmax=self.inner_circle.get_radius()
-        if self.right_edge.get_angle() < self.left_edge.get_angle():
-            phimin=self.right_edge.get_angle()
-            phimax=self.left_edge.get_angle()
-        else:
-            phimin=self.left_edge.get_angle()
-            phimax=self.right_edge.get_angle()
-            
-        print "phimin, phimax, rmin ,rmax",math.degrees(phimin), math.degrees(phimax), rmin ,rmax
-        #from DataLoader.manipulations import SectorQ
-        
-        sect = new_sector(r_min=rmin, r_max=rmax, phi_min=phimin, phi_max=phimax)
+
+    def _post_data(self, nbins=None):
+        # Compute data
+        data = self.base.data2D
+        # If we have no data, just return
+        if data == None:
+            return
+
+        name = "Sector "
+        from DataLoader.manipulations import SectorQ
+        radius = math.sqrt(math.pow(self.qmax,2)+math.pow(self.qmax,2))
+        phimin = self.right_line.theta
+        phimax = self.left_line.theta
+        sect = SectorQ(r_min=-1*radius , r_max= radius , phi_min=phimin, phi_max=phimax)
+        if nbins!=None:
+            sect.nbins = nbins
+        
         sector = sect(self.base.data2D)
         
@@ -176,5 +168,5 @@
        
         new_plot = Data1D(x=sector.x,y=sector.y,dy=sector.dy,dxl=dxl,dxw=dxw)
-        new_plot.name = str(new_sector.__name__) +"("+ self.base.data2D.name+")"
+        new_plot.name = "SectorQ" +"("+ self.base.data2D.name+")"
         
        
@@ -188,18 +180,18 @@
         new_plot.xaxis("\\rm{Q}", 'rad')
         new_plot.yaxis("\\rm{Intensity} ","cm^{-1}")
-        new_plot.group_id = str(new_sector.__name__)+self.base.data2D.name
+        new_plot.group_id = "SectorQ"+self.base.data2D.name
         wx.PostEvent(self.base.parent, NewPlotEvent(plot=new_plot,
-                                                 title=str(new_sector.__name__) ))
-        
+                                                 title="SectorQ" ))
+        
+         
         
     def moveend(self, ev):
-        #self.base.thaw_axes()
-        
-         # Post paramters
-        #event = SlicerParameters.SlicerParameterEvent()
-        #event.type = self.__class__.__name__
-        #event.params = self.get_params()
-        #print "main moveend ", event.params
-        #wx.PostEvent(self.base.parent, event)
+        self.base.thaw_axes()
+        
+        # Post paramters
+        event = SlicerParameters.SlicerParameterEvent()
+        event.type = self.__class__.__name__
+        event.params = self.get_params()
+        wx.PostEvent(self.base.parent, event)
         self._post_data()
             
@@ -208,8 +200,7 @@
         Restore the roughness for this layer.
         """
-        self.inner_circle.restore()
-        self.outer_circle.restore()
-        self.right_edge.restore()
-        self.left_edge.restore()
+        self.main_line.restore()
+        self.left_line.restore()
+        self.right_line.restore()
 
     def move(self, x, y, ev):
@@ -224,25 +215,23 @@
     def get_params(self):
         params = {}
-        params["r_min"] = self.inner_circle.get_radius()
-        params["r_max"] = self.outer_circle.get_radius()
-        params["phi_min"] = self.right_edge.get_angle()
-        params["phi_max"] = self.left_edge.get_angle()
+        params["main_phi"] = self.main_line.theta
+        if math.fabs(self.left_line.phi) != math.fabs(self.right_line.phi):
+            raise ValueError,"Phi left and phi right are different %f, %f"%(self.left_line.phi, self.right_line.phi)
+        params["left_phi"] = self.left_line.phi
         params["nbins"] = self.nbins
         return params
     
     def set_params(self, params):
-        print "setparams on main slicer ",params
-        inner = params["r_min"] 
-        outer = params["r_max"] 
-        phi_min= params["phi_min"]
-        phi_max=params["phi_max"]
+        
+        main = params["main_phi"] 
+        phi = params["left_phi"] 
         self.nbins = int(params["nbins"])
-        
-        
-        self.inner_circle.set_cursor(inner, phi_min, phi_max,self.nbins)
-        self.outer_circle.set_cursor(outer,  phi_min, phi_max, self.nbins)
-        self.right_edge.set_cursor(inner, outer, phi_min)
-        self.left_edge.set_cursor(inner, outer, phi_max)
-        self._post_data()
+        self.main_line.theta= main
+        
+        self.main_line.update()
+        self.right_line.update(phi=-1*phi,delta=None, mline=self.main_line,side=True)
+        self.left_line.update(phi=phi,delta=None, mline=self.main_line,side=True)
+       
+        self._post_data(nbins=self.nbins)
         
     def freeze_axes(self):
@@ -255,22 +244,260 @@
         self.base.draw()
 
-class SectorInteractorQ(SectorInteractor):
-    def __init__(self,base,axes,color='black', zorder=3):
-        SectorInteractor.__init__(self, base, axes, color=color)
-        self.base=base
-        self._post_data()
-    def _post_data(self):
-        from DataLoader.manipulations import SectorQ
-        self.post_data(SectorQ )   
-        
-
-class SectorInteractorPhi(SectorInteractor):
-    def __init__(self,base,axes,color='black', zorder=3):
-        SectorInteractor.__init__(self, base, axes, color=color)
-        self.base=base
-        self._post_data()
-    def _post_data(self):
-        from DataLoader.manipulations import SectorPhi
-        self.post_data(SectorPhi )   
-        
-        
+        
+class SideInteractor(_BaseInteractor):
+    """
+         Select an annulus through a 2D plot
+    """
+    def __init__(self,base,axes,color='black', zorder=5, r=1.0,phi=math.pi/4, theta2= math.pi/3):
+        
+        _BaseInteractor.__init__(self, base, axes, color=color)
+        self.markers = []
+        self.axes = axes
+        
+        self.save_theta = theta2 + phi
+        self.theta=  theta2 + phi
+        self.theta2 = theta2
+        self.radius = r
+        self.phi = phi
+        self.scale = 10.0
+        #print "init for line side theta2, phi, theta",math.degrees(theta2),math.degrees(phi),math.degrees(self.theta) 
+        #raise "Version error", message
+          
+        # Inner circle
+        x1= self.radius*math.cos(self.theta)
+        y1= self.radius*math.sin(self.theta)
+        x2= -1*self.radius*math.cos(self.theta)
+        y2= -1*self.radius*math.sin(self.theta)
+       
+        self.line = self.axes.plot([x1,x2],[y1,y2],
+                                      linestyle='-', marker='',
+                                      color=self.color,
+                                      visible=True)[0]
+       
+        self.npts = 20
+        self.has_move=False
+        self.connect_markers([self.line])
+        #self.update()
+
+    def set_layer(self, n):
+        self.layernum = n
+        self.update()
+        
+    def clear(self):
+        self.clear_markers()
+        try:
+            
+            self.line.remove()
+        except:
+            # Old version of matplotlib
+            for item in range(len(self.axes.lines)):
+                del self.axes.lines[0]
+        
+        
+        
+    def get_radius(self):
+        
+        return self.theta - self.save_theta
+        
+    def update(self,phi=None,delta=None, mline=None,side=False):
+        """
+        Draw the new roughness on the graph.
+        """
+        #print "update left or right ", self.has_move
+        
+        if phi !=None:
+            self.phi = phi
+        if delta==None:
+            delta = 0
+        if side== True:
+            self.theta=  mline.theta + self.phi
+        if mline!=None:
+            self.theta2 = mline.theta
+        #print "U:for line side theta2, phi, theta",math.degrees(self.theta2),math.degrees(self.phi),math.degrees(self.theta) 
+        #if self.theta2 >= self.theta and self.theta>=0:
+        #    print "between 0-pi",math.degrees(self.theta) 
+        
+        x1= self.radius*math.cos(self.theta + delta)
+        y1= self.radius*math.sin(self.theta + delta)
+        x2= -1*self.radius*math.cos(self.theta + delta)
+        y2= -1*self.radius*math.sin(self.theta + delta)
+       
+        
+        self.line.set(xdata=[x1,x2], ydata=[y1,y2])  
+        
+       
+        
+        
+    def save(self, ev):
+        """
+        Remember the roughness for this layer and the next so that we
+        can restore on Esc.
+        """
+        self.save_theta= self.theta
+        self.base.freeze_axes()
+
+    def moveend(self, ev):
+        
+        self.has_move=False
+        self.base.moveend(ev)
+            
+    def restore(self):
+        """
+        Restore the roughness for this layer.
+        """
+        self.theta = self.save_theta
+
+    def move(self, x, y, ev):
+        """
+        Process move to a new position, making sure that the move is allowed.
+        """
+        
+        self.theta= math.atan2(y,x)
+        self.phi= self.theta2 - self.theta
+        
+        print "move left or right phi ---theta--thetaM", self.phi, self.theta, self.theta2
+        self.has_move=True
+        self.base.base.update()
+        
+    def set_cursor(self, x, y):
+        self.move(x, y, None)
+        self.update()
+        
+        
+    def get_params(self):
+        params = {}
+        params["radius"] = self.radius
+        params["theta"] = self.theta
+        return params
+    
+    def set_params(self, params):
+
+        x = params["radius"] 
+        self.set_cursor(x, self._inner_mouse_y)
+        
+
+
+        
+        
+class LineInteractor(_BaseInteractor):
+    """
+         Select an annulus through a 2D plot
+    """
+    def __init__(self,base,axes,color='black', zorder=5, r=1.0,theta=math.pi/4):
+        
+        _BaseInteractor.__init__(self, base, axes, color=color)
+        self.markers = []
+        self.axes = axes
+        
+        self.save_theta = theta 
+        self.theta= theta
+        
+        self.radius = r
+      
+        self.scale = 10.0
+      
+        #raise "Version error", message
+            
+        # Inner circle
+
+           
+        x1= self.radius*math.cos(self.theta)
+        y1= self.radius*math.sin(self.theta)
+        x2= -1*self.radius*math.cos(self.theta)
+        y2= -1*self.radius*math.sin(self.theta)
+       
+        self.line = self.axes.plot([x1,x2],[y1,y2],
+                                      linestyle='-', marker='',
+                                      color=self.color,
+                                      visible=True)[0]
+      
+        self.npts = 20
+        self.has_move=False
+        self.connect_markers([self.line])
+        self.update()
+
+    def set_layer(self, n):
+        self.layernum = n
+        self.update()
+        
+    def clear(self):
+        self.clear_markers()
+        try:
+            
+            self.line.remove()
+        except:
+            # Old version of matplotlib
+            for item in range(len(self.axes.lines)):
+                del self.axes.lines[0]
+        
+        
+        
+    def get_radius(self):
+        
+        return self.theta - self.save_theta
+        
+    def update(self, theta=None):
+        """
+        Draw the new roughness on the graph.
+        """
+        print "update main line", self.theta
+        if theta !=None:
+            self.theta= theta
+        x1= self.radius*math.cos(self.theta)
+        y1= self.radius*math.sin(self.theta)
+        x2= -1*self.radius*math.cos(self.theta)
+        y2= -1*self.radius*math.sin(self.theta)
+      
+        self.line.set(xdata=[x1,x2], ydata=[y1,y2])  
+     
+        
+        
+    def save(self, ev):
+        """
+        Remember the roughness for this layer and the next so that we
+        can restore on Esc.
+        """
+        self.save_theta= self.theta
+        self.base.freeze_axes()
+
+    def moveend(self, ev):
+        
+        self.has_move=False
+        self.base.moveend(ev)
+            
+    def restore(self):
+        """
+        Restore the roughness for this layer.
+        """
+        self.theta = self.save_theta
+
+    def move(self, x, y, ev):
+        """
+        Process move to a new position, making sure that the move is allowed.
+        """
+        
+        self.theta= math.atan2(y,x)
+        print "main_line previous theta --- next theta ",math.degrees(self.save_theta),math.degrees(self.theta)
+        
+        self.has_move=True
+        self.base.base.update()
+        
+    def set_cursor(self, x, y):
+        self.move(x, y, None)
+        self.update()
+        
+        
+    def get_params(self):
+        params = {}
+        params["radius"] = self.radius
+        params["theta"] = self.theta
+        return params
+    
+    def set_params(self, params):
+
+        x = params["radius"] 
+        self.set_cursor(x, self._inner_mouse_y)
+        
+
+
+        
