def calc_expected(self,a,b,c):
        ada = sum([e*e for e in a])
        bdb = sum([e*e for e in b])

        if numpy.dot(a,a)*numpy.dot(b,b)==0.0:
           return util.num_to_floattype(180.0, floattype)
        else:
           angle = (180.0/util.num_to_floattype(numpy.pi,floattype)) * numpy.arccos(numpy.dot(a,b)/numpy.sqrt(numpy.dot(a,a)*numpy.dot(b,b)))
        sign = cmp(numpy.dot(numpy.cross(a,b),c), 0.0)
        if sign==0: sign=1
        return util.num_to_floattype(sign*angle, floattype)
    def calc_expected(self, a, b, c):
        ada = sum([e * e for e in a])
        bdb = sum([e * e for e in b])

        if numpy.dot(a, a) * numpy.dot(b, b) == 0.0:
            return util.num_to_floattype(180.0, floattype)
        else:
            angle = (180.0 / util.num_to_floattype(numpy.pi, floattype)) * numpy.arccos(
                numpy.dot(a, b) / numpy.sqrt(numpy.dot(a, a) * numpy.dot(b, b))
            )
        sign = cmp(numpy.dot(numpy.cross(a, b), c), 0.0)
        if sign == 0:
            sign = 1
        return util.num_to_floattype(sign * angle, floattype)
 def test_same_plane(self):
     a=numpy.array([1.0, 0.0, 0.0],floattype)
     b=numpy.array([0.0, 1.0, 0.0],floattype)
     c=numpy.array([1.0, 0.0, 0.0],floattype)
     result = sasmath.signed_angle(a,b,c)
     expected = util.num_to_floattype(0.0, floattype)
     self.assertAlmostEqual(result,expected)
 def test_all_zero_arrays(self):
     a=numpy.array([0.0, 0.0, 0.0],floattype)
     b=numpy.array([0.0, 0.0, 0.0],floattype)
     c=numpy.array([0.0, 0.0, 0.0],floattype)
     result = sasmath.signed_angle(a,b,c)
     expected = util.num_to_floattype(180.0, floattype)
     self.assertAlmostEqual(result,expected)
 def test_same_plane(self):
     a = numpy.array([1.0, 0.0, 0.0], floattype)
     b = numpy.array([0.0, 1.0, 0.0], floattype)
     c = numpy.array([1.0, 0.0, 0.0], floattype)
     result = sasmath.signed_angle(a, b, c)
     expected = util.num_to_floattype(0.0, floattype)
     self.assertAlmostEqual(result, expected)
 def test_tiny(self):
     a=numpy.array([util.TINY, 3.0, 0.0],floattype)
     b=numpy.array([6.0, util.TINY, 2.0],floattype)
     c=numpy.array([2.0, 3.2, util.TINY],floattype)
     result = sasmath.signed_angle(a,b,c)
     expected = util.num_to_floattype(90.0, floattype)
     self.assertAlmostEqual(result,expected)
 def test_tiny(self):
     a = numpy.array([util.TINY, 3.0, 0.0], floattype)
     b = numpy.array([6.0, util.TINY, 2.0], floattype)
     c = numpy.array([2.0, 3.2, util.TINY], floattype)
     result = sasmath.signed_angle(a, b, c)
     expected = util.num_to_floattype(90.0, floattype)
     self.assertAlmostEqual(result, expected)
 def test_all_zero_arrays(self):
     a = numpy.array([0.0, 0.0, 0.0], floattype)
     b = numpy.array([0.0, 0.0, 0.0], floattype)
     c = numpy.array([0.0, 0.0, 0.0], floattype)
     result = sasmath.signed_angle(a, b, c)
     expected = util.num_to_floattype(180.0, floattype)
     self.assertAlmostEqual(result, expected)
 def test_zero(self):
     a = numpy.array([util.ZERO, 3.0, 0.0], floattype)
     b = numpy.array([6.0, util.ZERO, 2.0], floattype)
     c = numpy.array([6.7, 1.0, util.ZERO], floattype)
     result = sasmath.signed_angle(a, b, c)
     expected = util.num_to_floattype(90.0, floattype)
     self.assertAlmostEqual(result, expected)
 def test_unit_arrays(self):
     a=numpy.array([0.0, 0.0, 0.0],floattype)
     x=util.num_to_floattype(1.0,floattype)
     y=numpy.array([1.0, 1.0, 1.0],floattype)
     result = sasmath.vec_scale(a,x,y)
     expected = util.list_to_floattype(x*y,floattype)
     self.assert_list_almost_equal(result,expected)
 def test_arb_arrays(self):
     a=numpy.array([0.0, 0.0, 0.0],floattype)
     x=util.num_to_floattype(-35.01,floattype)
     y=numpy.array([-23.1, 0.98, 18.208],floattype)
     result = sasmath.vec_scale(a,x,y)
     expected = util.list_to_floattype(x*y,floattype)
     self.assert_list_almost_equal(result,expected)
 def test_zero(self):
     a=numpy.array([util.ZERO, 3.0, 0.0],floattype)
     b=numpy.array([6.0, util.ZERO, 2.0],floattype)
     c=numpy.array([6.7, 1.0, util.ZERO],floattype)
     result = sasmath.signed_angle(a,b,c)
     expected = util.num_to_floattype(90.0, floattype)
     self.assertAlmostEqual(result,expected)
 def test_six_atoms_about_X_axis_zero(self):
     self.o.setCoor(
         numpy.array(
             [[[1.2, util.ZERO, 3.0], [-2.0, 5.0, 6.0], [7.0, 8.0, 9.0],
               [1.0, 3.0, 5.0], [2.0, 4.0, 6.0], [0.0, 2.0, 3.0]]],
             floattype))
     axis = 'x'
     theta = util.num_to_floattype(128.0 * numpy.pi / 180.0, floattype)
     frame = 0
     #
     cs = numpy.cos(theta)
     si = numpy.sin(theta)
     expected_coor = numpy.array(
         [[[1.2, util.ZERO * cs - 3.0 * si, util.ZERO * si + 3.0 * cs],
           [-2.0, 5.0 * cs - 6.0 * si, 5.0 * si + 6.0 * cs],
           [7.0, 8.0 * cs - 9.0 * si, 8.0 * si + 9.0 * cs],
           [1.0, 3.0 * cs - 5.0 * si, 3.0 * si + 5.0 * cs],
           [2.0, 4.0 * cs - 6.0 * si, 4.0 * si + 6.0 * cs],
           [0.0, 2.0 * cs - 3.0 * si, 2.0 * si + 3.0 * cs]]],
         floattype)[frame]
     print 'expected_coor:\n', expected_coor
     #
     self.o.rotate(frame, axis, theta)
     result_coor = self.o.coor()[frame]
     print 'result_coor:\n', result_coor
     #
     self.assert_list_almost_equal(expected_coor, result_coor, 3)
    def test_two_atoms_about_Y_axis(self):
	#test two atoms rotating about the x axis
        self.o.setCoor(numpy.array([[[-1.0, 2.0, 3.87],[-5.0, 3.2, 6.0]]],floattype))
        axis = 'y'
        theta = util.num_to_floattype(90.0*numpy.pi/180.0, floattype)
        frame = 0
        #
        expected_coor = numpy.array([[[3.87, 2.0, 1.0],[6.0, 3.2, 5.0]]],floattype)[frame]
	print 'expected_coor:\n', expected_coor
        #
        self.o.rotate(frame,axis,theta)
        result_coor = self.o.coor()[frame]
        print 'result_coor:\n',result_coor
        #
        self.assert_list_almost_equal(expected_coor, result_coor,3)
    def test_six_atoms_about_X_axis_zero(self):
        self.o.setCoor(numpy.array([[[1.2, util.ZERO, 3.0],[-2.0, 5.0, 6.0],[7.0, 8.0, 9.0],[1.0, 3.0, 5.0],[2.0, 4.0, 6.0],[0.0, 2.0, 3.0]]],floattype))
        axis = 'x'
        theta = util.num_to_floattype(128.0*numpy.pi/180.0, floattype)
        frame = 0
        #
        cs=numpy.cos(theta)
        si=numpy.sin(theta)
        expected_coor = numpy.array([[[1.2, util.ZERO*cs-3.0*si, util.ZERO*si+3.0*cs],[-2.0, 5.0*cs-6.0*si, 5.0*si+6.0*cs],[7.0, 8.0*cs-9.0*si, 8.0*si+9.0*cs],[1.0, 3.0*cs-5.0*si, 3.0*si+5.0*cs],[2.0, 4.0*cs-6.0*si, 4.0*si+6.0*cs],[0.0, 2.0*cs-3.0*si, 2.0*si+3.0*cs]]],floattype)[frame]
	print 'expected_coor:\n', expected_coor
        #
        self.o.rotate(frame,axis,theta)
        result_coor = self.o.coor()[frame]
        print 'result_coor:\n',result_coor
        #
        self.assert_list_almost_equal(expected_coor, result_coor,3)
 def test_two_atoms_about_Y_axis(self):
     #test two atoms rotating about the x axis
     self.o.setCoor(
         numpy.array([[[-1.0, 2.0, 3.87], [-5.0, 3.2, 6.0]]], floattype))
     axis = 'y'
     theta = util.num_to_floattype(90.0 * numpy.pi / 180.0, floattype)
     frame = 0
     #
     expected_coor = numpy.array([[[3.87, 2.0, 1.0], [6.0, 3.2, 5.0]]],
                                 floattype)[frame]
     print 'expected_coor:\n', expected_coor
     #
     self.o.rotate(frame, axis, theta)
     result_coor = self.o.coor()[frame]
     print 'result_coor:\n', result_coor
     #
     self.assert_list_almost_equal(expected_coor, result_coor, 3)
    def test_one_atom_about_Z_axis(self):
        '''
	test one atom rotating about the z axis
	'''
        self.o.setCoor(numpy.array([[[1.0, 1.0, 1.0]]],floattype))
        axis = 'z'
        theta = util.num_to_floattype(90.0*numpy.pi/180.0, floattype)
        frame = 0
        #
        expected_coor = numpy.array([[[-1.0, 1.0, 1.0]]],floattype)[frame]
	print 'expected_coor:\n', expected_coor
        #
        self.o.rotate(frame,axis,theta)
        result_coor = self.o.coor()[frame]
        print 'result_coor:\n',result_coor
        #
        self.assert_list_almost_equal(expected_coor, result_coor,3)
    def test_one_atom_about_Z_axis(self):
        '''
	test one atom rotating about the z axis
	'''
        self.o.setCoor(numpy.array([[[1.0, 1.0, 1.0]]], floattype))
        axis = 'z'
        theta = util.num_to_floattype(90.0 * numpy.pi / 180.0, floattype)
        frame = 0
        #
        expected_coor = numpy.array([[[-1.0, 1.0, 1.0]]], floattype)[frame]
        print 'expected_coor:\n', expected_coor
        #
        self.o.rotate(frame, axis, theta)
        result_coor = self.o.coor()[frame]
        print 'result_coor:\n', result_coor
        #
        self.assert_list_almost_equal(expected_coor, result_coor, 3)
    def test_two_atoms_about_Z_axis(self):
        '''
	test two atoms rotating about the x axis
        '''
	self.o.setCoor(numpy.array([[[-1.0, 2.0, 3.87],[-5.0, 3.2, 6.0]]],floattype))
        axis = 'z'
        theta = util.num_to_floattype(280.0*numpy.pi/180.0, floattype)
        frame = 0
        #
	#expected_coor = numpy.array([[[-2.0, -1.0, 3.87],[-3.2, -5.0, 6.0]]], floattype)[frame]
	cs=numpy.cos(theta)
	si=numpy.sin(theta)
	expected_coor = numpy.array([[[-1.0*cs-2.0*si, -1.0*si+2.0*cs, 3.87],[-5.0*cs-3.2*si, -5.0*si+3.2*cs, 6.0]]],floattype)[frame]
	print 'expected_coor:\n', expected_coor
        #
        self.o.rotate(frame,axis,theta)
        result_coor = self.o.coor()[frame]
        print 'result_coor:\n',result_coor
        #
        self.assert_list_almost_equal(expected_coor, result_coor,3)
    def test_two_atoms_about_Z_axis(self):
        '''
	test two atoms rotating about the x axis
        '''
        self.o.setCoor(
            numpy.array([[[-1.0, 2.0, 3.87], [-5.0, 3.2, 6.0]]], floattype))
        axis = 'z'
        theta = util.num_to_floattype(280.0 * numpy.pi / 180.0, floattype)
        frame = 0
        #
        #expected_coor = numpy.array([[[-2.0, -1.0, 3.87],[-3.2, -5.0, 6.0]]], floattype)[frame]
        cs = numpy.cos(theta)
        si = numpy.sin(theta)
        expected_coor = numpy.array(
            [[[-1.0 * cs - 2.0 * si, -1.0 * si + 2.0 * cs, 3.87],
              [-5.0 * cs - 3.2 * si, -5.0 * si + 3.2 * cs, 6.0]]],
            floattype)[frame]
        print 'expected_coor:\n', expected_coor
        #
        self.o.rotate(frame, axis, theta)
        result_coor = self.o.coor()[frame]
        print 'result_coor:\n', result_coor
        #
        self.assert_list_almost_equal(expected_coor, result_coor, 3)