Index: guitools/PlotPanel.py
===================================================================
--- guitools/PlotPanel.py	(revision f52bea1de61984ae151243e2fed0972a4c7d83d5)
+++ guitools/PlotPanel.py	(revision 3d3a0e586aa105e3407fa91ff7a5f9657818eb78)
@@ -148,9 +148,19 @@
         else:
             raise ValueError,"cannot be computed"
-    def toLogYX2(self):
+    def toLogYX2(self,x,y):
         if y*(x**2) >0:
             return math.log(y*(x**2))
         else:
              raise ValueError,"cannot be computed"
+         
+         
+    def toYX2(self,x,y):
+        return (x**2)*y
+    
+    
+    def toXY(self,x,y):
+        return x*y
+    
+    
     def toLogXY(self,x,y):
         """
@@ -432,4 +442,26 @@
                 name, units = item.get_yaxis()
                 self.graph.yaxis("%s^2" % name,  "%s^{-2}" % units)
+            if ( self.yscales =="1/y"):
+                item.transform_y( self.toOneOverX ,self.errOneOverX )
+                self.set_yscale("linear")
+                name, units = item.get_yaxis()
+                self.graph.yaxis("%s" % name,  "%s" % units)
+            if ( self.yscales =="1/sqrt(y)" ):
+                item.transform_y( self.toOneOverSqrtX ,self.errOneOverSqrtX )
+                self.set_yscale("linear")
+                name, units = item.get_yaxis()
+                self.graph.yaxis("%s" %name,  "%s" % units)
+            if ( self.yscales =="Log(y*x)"):
+                item.transform_xy( self.toXY ,self.errToXY )
+                self.set_yscale("log")
+                yname, yunits = item.get_yaxis()
+                xname, xunits = item.get_xaxis()
+                self.graph.yaxis("%s"+"*"+"%s" % (yname,xname),  "%s^{-1}"+"*"+"s^{-1}" % (yunits,xunits))
+            if ( self.yscales =="Log(y*x^(2)"):
+                item.transform_xy( self.toYX2 ,self.errToYX2 )
+                self.set_yscale("log")
+                yname, yunits = item.get_yaxis()
+                xname, xunits = item.get_xaxis()
+                self.graph.yaxis("%s"+"*"+"%s^{2}" % (yname,xname),  "%s^{-1}"+"*"+"s^{-2}" % (yunits,xunits))
    
         self.prevXtrans = self.xscales 
@@ -500,4 +532,22 @@
         
         return math.fabs(err)
+    def errToXY(self, x, y, dx=None, dy=None):
+        if dx==None:
+            dx=0
+        if dy==None:
+            dy=0
+        err =math.sqrt((y*dx)**2 +(x*dy)**2)
+        if err >= math.fabs(x):
+            err =0.9*x
+        return err 
+    def errToYX2(self, x, y, dx=None, dy=None):
+        if dx==None:
+            dx=0
+        if dy==None:
+            dy=0
+        err =math.sqrt((2*x*y*dx)**2 +((x**2)*dy)**2)
+        if err >= math.fabs(x):
+            err =0.9*x
+        return err 
         
     def errToLogXY(self,x,y,dx=None, dy=None):
@@ -505,16 +555,64 @@
             calculate error of Log(xy)
         """
-        if dx==None:
-            err = x*(dy**2)/y
-        elif dy==None:
-            err = y*(dx**2)/x
-        elif (x!=0) and (y!=0):
-            err = y*(dx**2)/x + x*(dy**2)/y
-        if err >= 0:
-            if  math.sqrt(err)> x:
+        if (x!=0) and (y!=0):
+            if dx == None:
+                dx = 0
+            if dy == None:
+                dy = 0
+            err = (dx/x)**2 + (dy/y)**2
+            if  math.sqrt(math.fabs(err)) >= math.fabs(x):
                 err= 0.9*x
-            return math.sqrt(err)
         else:
             raise ValueError, "cannot compute this error"
+       
+        return math.sqrt(math.fabs(err))
+        
+    def errToLogYX2(self,x,y,dx=None, dy=None):
+        """
+            calculate error of Log(yx**2)
+        """
+        if (x > 0) and (y > 0):
+            if (dx == None):
+                dx = 0
+            if (dy == None):
+                dy = 0
+            err = 4*(dx**2)/(x**2) + (dy**2)/(y**2)
+            if math.fabs(err) >= math.fabs(x):
+                err =0.9*x
+        else:
+             raise ValueError, "cannot compute this error"
+         
+        return math.sqrt(math.fabs(err)) 
+            
+    def errOneOverX(self,x,dx):
+        """
+             calculate error on 1/x
+        """
+        if (x != 0) and (dx!=None):
+            if dx ==None:
+                dx= 0
+            err = -(dx)**2/x**2
+        else:
+            raise ValueError,"Cannot compute this error"
+        
+        if math.fabs(err)>= math.fabs(x):
+            err= 0.9*x
+        return math.fabs(err)
+    
+    def errOneOverSqrtX(self):
+        """
+            Calculate error on 1/sqrt(x)
+        """
+        if (x >0) and (dx!=None):
+            if dx==None:
+                dx =0
+            err= -1/2*math.pow(x, -3/2)* dx
+            if math.fabs(err)>= math.fabs(x):
+                err=0.9*x
+        else:
+            raise ValueError, "Cannot compute this error"
+        
+        return math.fabs(err)
+    
                       
     def onFitDisplay(self, plottable):
Index: guitools/plottables.py
===================================================================
--- guitools/plottables.py	(revision f52bea1de61984ae151243e2fed0972a4c7d83d5)
+++ guitools/plottables.py	(revision 3d3a0e586aa105e3407fa91ff7a5f9657818eb78)
@@ -391,4 +391,11 @@
         self.view.transform_y(func, errfunc, self.y, self.dy)
         
+    def transform_xy(self,func,errfunc):
+        """
+            @param func: reference to y transformation function
+            
+        """
+        self.view.transform_xy(func, errfunc, self.x, self.y,self.dx,self.dy)
+        
     def returnValuesOfView(self):
         
@@ -460,4 +467,41 @@
                  else:
                      self.dy[i] = errfunc(y[i])
+        def transform_xy(self, func, errfunc, x, y, dx, dy):
+            """
+                Transforms the x, y, dx,and dy vectors and stores the output.
+                
+                @param func: function to apply to the data
+                @param x: array of x values
+                @param dx: array of error values
+                @param y: array of y values
+                @param dy: array of error values
+                @param errfunc: function to apply to errors
+            """
+            import copy
+            import numpy
+            # Sanity check
+            if dx and not len(x)==len(dx):
+                raise ValueError, "Plottable.View: Given x and dx are not of the same length"
+            if dy and not len(y)==len(dy):
+                raise ValueError, "Plottable.View: Given y and dy are not of the same length"
+            if not len(x)==len(y):
+                raise ValueError, "Plottable.View: Given x and y are not of the same length"
+            
+            self.x = numpy.zeros(len(x))
+            self.dx = numpy.zeros(len(x))
+            self.y = numpy.zeros(len(y))
+            self.dy = numpy.zeros(len(y))
+            
+           
+            for i in range(len(y)):
+                 self.y[i] = func(x[i],y[i])
+                 if (dx!=None) and (dy !=None):
+                     self.dy[i] = errfunc(x[i], y[i], dx[i], dy[i])
+                 elif (dx != None):
+                     self.dy[i] = errfunc(x[i], y[i], dx[i])
+                 elif (dy != None):
+                     self.dy[i] = errfunc(x[i], y[i],dy[i])
+                 else:
+                     self.dy[i] = errfunc(x[i], y[i])
                      
         def returnXview(self):
Index: guitools/requirements.txt
===================================================================
--- guitools/requirements.txt	(revision f52bea1de61984ae151243e2fed0972a4c7d83d5)
+++ guitools/requirements.txt	(revision 3d3a0e586aa105e3407fa91ff7a5f9657818eb78)
@@ -51,4 +51,7 @@
   
   2- There are additional y scales we need: y, y^2, log(y), 1/y, 1/sqrt(y), log(y * x), log(y * x^2)
+  [QUESTION] when plottong y=log(y*x) is the user allowed to do transformation on x at the same time 
+  for example x---> log X with  y=log(x*y)
+  [PROBLEM]WITH  log(y * x), log(y * x^2)
   	
   3-[DONE] You should change the label according to what the user chose, and not hard-code them.
