Index: sansdataloader/src/sans/dataloader/data_info.py
===================================================================
--- sansdataloader/src/sans/dataloader/data_info.py	(revision 0008f540c023d66c540368b01cd137a0fcdefd36)
+++ sansdataloader/src/sans/dataloader/data_info.py	(revision cdeed9fcf306d4983c87b07e31ec7f74faaf00ed)
@@ -1034,32 +1034,27 @@
         
         """
-        print "numpy.size(self.data)=", numpy.size(self.data)
         # First, check the data compatibility
         dy, dy_other = self._validity_check(other)
         result = self.clone_without_data(numpy.size(self.data))
-        result.data = self.data
-        result.qx_data = self.qx_data
-        result.qy_data = self.qy_data
-        result.q_data = self.q_data
-        result.mask = self.mask
-        result.xmin = self.xmin
-        result.xmax = self.xmax
-        result.ymin = self.ymin
-        result.ymax = self.ymax
-        
-        if self.err_data is not None:
-            result.err_data = self.err_data    
-        if self.dqx_data is not None:
-            result.dqx_data = self.dqx_data
-        if self.dqy_data is not None:
-            result.dqy_data = self.dqy_data
         if self.dqx_data == None or self.dqy_data == None:
             result.dqx_data = None
             result.dqy_data = None
         else:
-            result.dqx_data = numpy.zeros(numpy.size(self.data))
-            result.dqy_data = numpy.zeros(numpy.size(self.data))
-        
+            result.dqx_data = numpy.zeros(len(self.data))
+            result.dqy_data = numpy.zeros(len(self.data))
         for i in range(numpy.size(self.data)):
+            result.data[i] = self.data[i]
+            if self.err_data is not None and \
+                numpy.size(self.data) == numpy.size(self.err_data):
+                result.err_data[i] = self.err_data[i]    
+            if self.dqx_data is not None:
+                result.dqx_data[i] = self.dqx_data[i]
+            if self.dqy_data is not None:
+                result.dqy_data[i] = self.dqy_data[i]
+            result.qx_data[i] = self.qx_data[i]
+            result.qy_data[i] = self.qy_data[i]
+            result.q_data[i] = self.q_data[i]
+            result.mask[i] = self.mask[i]
+            
             a = Uncertainty(self.data[i], dy[i]**2)
             if isinstance(other, Data2D):
Index: sansdataloader/test/utest_manipulations.py
===================================================================
--- sansdataloader/test/utest_manipulations.py	(revision cdeed9fcf306d4983c87b07e31ec7f74faaf00ed)
+++ sansdataloader/test/utest_manipulations.py	(revision cdeed9fcf306d4983c87b07e31ec7f74faaf00ed)
@@ -0,0 +1,242 @@
+"""
+    Unit tests for data manipulations
+"""
+#TODO: what happens if you add a Data1D to a Data2D?
+
+import unittest
+import numpy, math
+from sans.dataloader.loader import  Loader
+from sans.dataloader.data_info import Data1D, Data2D
+ 
+import os.path
+
+class data_info_tests(unittest.TestCase):
+    
+    def setUp(self):
+        self.data = Loader().load("cansas1d.xml")
+        
+    def test_clone1D(self):
+        """
+            Test basic cloning
+        """
+        clone = self.data.clone_without_data()
+        
+        for i in range(len(self.data.detector)):
+            self.assertEqual(self.data.detector[i].distance, clone.detector[i].distance)
+            
+
+class manip_tests(unittest.TestCase):
+    
+    def setUp(self):
+        # Create two data sets to play with
+        x_0 = numpy.ones(5)
+        for i in range(5):
+            x_0[i] = x_0[i]*(i+1.0)
+            
+        y_0 = 2.0*numpy.ones(5)
+        dy_0 = 0.5*numpy.ones(5)
+        self.data = Data1D(x_0, y_0, dy=dy_0)
+        
+        x = self.data.x
+        y = numpy.ones(5)
+        dy = numpy.ones(5)
+        self.data2 = Data1D(x, y, dy=dy)
+        
+        
+    def test_load(self):
+        """
+            Test whether the test file was loaded properly
+        """
+        # There should be 5 entries in the file
+        self.assertEqual(len(self.data.x), 5)
+        
+        for i in range(5):
+            # The x values should be from 1 to 5
+            self.assertEqual(self.data.x[i], float(i+1))
+        
+            # All y-error values should be 0.5
+            self.assertEqual(self.data.dy[i], 0.5)    
+            
+            # All y values should be 2.0
+            self.assertEqual(self.data.y[i], 2.0)    
+        
+    def test_add(self):
+        result = self.data2+self.data
+        for i in range(5):
+            self.assertEqual(result.y[i], 3.0)
+            self.assertEqual(result.dy[i], math.sqrt(0.5**2+1.0))
+        
+    def test_sub(self):
+        result = self.data2-self.data
+        for i in range(5):
+            self.assertEqual(result.y[i], -1.0)
+            self.assertEqual(result.dy[i], math.sqrt(0.5**2+1.0))
+        
+    def test_mul(self):
+        result = self.data2*self.data
+        for i in range(5):
+            self.assertEqual(result.y[i], 2.0)
+            self.assertEqual(result.dy[i], math.sqrt((0.5*1.0)**2+(1.0*2.0)**2))
+        
+    def test_div(self):
+        result = self.data2/self.data
+        for i in range(5):
+            self.assertEqual(result.y[i], 0.5)
+            self.assertEqual(result.dy[i], math.sqrt((1.0/2.0)**2+(0.5*1.0/4.0)**2))
+        
+    def test_radd(self):
+        result = self.data+3.0
+        for i in range(5):
+            self.assertEqual(result.y[i], 5.0)
+            self.assertEqual(result.dy[i], 0.5)
+            
+        result = 3.0+self.data
+        for i in range(5):
+            self.assertEqual(result.y[i], 5.0)
+            self.assertEqual(result.dy[i], 0.5)
+            
+    def test_rsub(self):
+        result = self.data-3.0
+        for i in range(5):
+            self.assertEqual(result.y[i], -1.0)
+            self.assertEqual(result.dy[i], 0.5)
+            
+        result = 3.0-self.data
+        for i in range(5):
+            self.assertEqual(result.y[i], 1.0)
+            self.assertEqual(result.dy[i], 0.5)
+            
+    def test_rmul(self):
+        result = self.data*3.0
+        for i in range(5):
+            self.assertEqual(result.y[i], 6.0)
+            self.assertEqual(result.dy[i], 1.5)
+            
+        result = 3.0*self.data
+        for i in range(5):
+            self.assertEqual(result.y[i], 6.0)
+            self.assertEqual(result.dy[i], 1.5)
+            
+    def test_rdiv(self):
+        result = self.data/4.0
+        for i in range(5):
+            self.assertEqual(result.y[i], 0.5)
+            self.assertEqual(result.dy[i], 0.125)
+            
+        result = 6.0/self.data
+        for i in range(5):
+            self.assertEqual(result.y[i], 3.0)
+            self.assertEqual(result.dy[i], 6.0*0.5/4.0)
+            
+class manip_2D(unittest.TestCase):
+    
+    def setUp(self):
+        # Create two data sets to play with
+        x_0 = 2.0*numpy.ones(25)
+        dx_0 = 0.5*numpy.ones(25)
+        qx_0 = numpy.arange(25)
+        qy_0 = numpy.arange(25)
+        mask_0 = numpy.zeros(25)
+        dqx_0 = numpy.arange(25)/100
+        dqy_0 = numpy.arange(25)/100
+        q_0 = numpy.sqrt(qx_0 * qx_0 + qy_0 * qy_0)
+        self.data = Data2D(data=x_0, err_data=dx_0, qx_data=qx_0, 
+                           qy_data=qy_0, q_data=q_0, mask=mask_0, 
+                           dqx_data=dqx_0, dqy_data=dqy_0)
+        
+        y = numpy.ones(25)
+        dy = numpy.ones(25)
+        qx = numpy.arange(25)
+        qy = numpy.arange(25)
+        mask = numpy.zeros(25)
+        q = numpy.sqrt(qx * qx + qy * qy)
+        self.data2 = Data2D(data=y, err_data=dy, qx_data=qx, qy_data=qy, 
+                            q_data=q, mask=mask)
+        
+        
+    def test_load(self):
+        """
+            Test whether the test file was loaded properly
+        """
+        # There should be 5 entries in the file
+        self.assertEqual(numpy.size(self.data.data), 25)
+        
+        for i in range(25):
+            # All y-error values should be 0.5
+            self.assertEqual(self.data.err_data[i], 0.5)    
+            
+            # All y values should be 2.0
+            self.assertEqual(self.data.data[i], 2.0)    
+        
+    def test_add(self):
+        result = self.data2+self.data
+        for i in range(25):
+            self.assertEqual(result.data[i], 3.0)
+            self.assertEqual(result.err_data[i], math.sqrt(0.5**2+1.0))
+        
+    def test_sub(self):
+        result = self.data2-self.data
+        for i in range(25):
+                self.assertEqual(result.data[i], -1.0)
+                self.assertEqual(result.err_data[i], math.sqrt(0.5**2+1.0))
+        
+    def test_mul(self):
+        result = self.data2*self.data
+        for i in range(25):
+            self.assertEqual(result.data[i], 2.0)
+            self.assertEqual(result.err_data[i], math.sqrt((0.5*1.0)**2+(1.0*2.0)**2))
+        
+    def test_div(self):
+        result = self.data2/self.data
+        for i in range(25):
+            self.assertEqual(result.data[i], 0.5)
+            self.assertEqual(result.err_data[i], math.sqrt((1.0/2.0)**2+(0.5*1.0/4.0)**2))
+        
+    def test_radd(self):
+        result = self.data+3.0
+        for i in range(25):
+            self.assertEqual(result.data[i], 5.0)
+            self.assertEqual(result.err_data[i], 0.5)
+   
+        result = 3.0+self.data
+        for i in range(25):
+            self.assertEqual(result.data[i], 5.0)
+            self.assertEqual(result.err_data[i], 0.5)
+            
+    def test_rsub(self):
+        result = self.data-3.0
+        for i in range(25):
+            self.assertEqual(result.data[i], -1.0)
+            self.assertEqual(result.err_data[i], 0.5)
+    
+        result = 3.0-self.data
+        for i in range(25):
+            self.assertEqual(result.data[i], 1.0)
+            self.assertEqual(result.err_data[i], 0.5)
+            
+    def test_rmul(self):
+        result = self.data*3.0
+        for i in range(25):
+            self.assertEqual(result.data[i], 6.0)
+            self.assertEqual(result.err_data[i], 1.5)
+ 
+        result = 3.0*self.data
+        for i in range(25):
+            self.assertEqual(result.data[i], 6.0)
+            self.assertEqual(result.err_data[i], 1.5)
+            
+    def test_rdiv(self):
+        result = self.data/4.0
+        for i in range(25):
+            self.assertEqual(result.data[i], 0.5)
+            self.assertEqual(result.err_data[i], 0.125)
+
+        result = 6.0/self.data
+        for i in range(25):
+            self.assertEqual(result.data[i], 3.0)
+            self.assertEqual(result.err_data[i], 6.0*0.5/4.0)
+    
+
+if __name__ == '__main__':
+    unittest.main()
+   
