Exemple #1
0
def getXmippPrograms():
    '''Return the list of Xmipp's programs, taken from from bin/ folder'''
    programs = [
        os.path.basename(p) for p in glob(getXmippPath('bin', 'xmipp_*'))
    ]
    programs.sort()
    return programs
Exemple #2
0
def getXmippLabels():
    ''' Parse the labels definition from the 'libraries/data/metadata_label.h' file '''
    labelHeader = getXmippPath('libraries', 'data', 'metadata_label.h')
    f = open(labelHeader)
    labels = []
    comments = {}
    labelsPrefixes = ['MDL_', 'RLN_', 'BSOFT_']
    
    for line in f:
        line = line.strip()
        for prefix in labelsPrefixes:
            if line.startswith(prefix) and '///<' in line:
                parts = line.split('///<')
                mdl = parts[0].strip()[:-1] # remove last comma
                comm = parts[1].strip()
                comments[mdl] = comm
            if line.startswith('MDL::addLabel(' + prefix):
                l = line.find('(')
                r = line.find(')')
                parts = line[l + 1:r].split(',')
                label = {}
                label['name'] = parts[2].replace('"', '').strip()
                label['type'] = parts[1].strip()
                label['enum'] = parts[0].strip()
                label['comment'] = comments.get(label['enum'], "")
                labels.append(label)
    return labels
Exemple #3
0
def getXmippLabels():
    ''' Parse the labels definition from the 'libraries/data/metadata_label.h' file '''
    labelHeader = getXmippPath('libraries', 'data', 'metadata_label.h')
    f = open(labelHeader)
    labels = []
    comments = {}
    labelsPrefixes = ['MDL_', 'RLN_', 'BSOFT_']

    for line in f:
        line = line.strip()
        for prefix in labelsPrefixes:
            if line.startswith(prefix) and '///<' in line:
                parts = line.split('///<')
                mdl = parts[0].strip()[:-1]  # remove last comma
                comm = parts[1].strip()
                comments[mdl] = comm
            if line.startswith('MDL::addLabel(' + prefix):
                l = line.find('(')
                r = line.find(')')
                parts = line[l + 1:r].split(',')
                label = {}
                label['name'] = parts[2].replace('"', '').strip()
                label['type'] = parts[1].strip()
                label['enum'] = parts[0].strip()
                label['comment'] = comments.get(label['enum'], "")
                labels.append(label)
    return labels
Exemple #4
0
def getXmippLabelsName():
    ''' Parse the labels name from the 'libraries/data/metadata_label.h' file '''
    labelHeader = getXmippPath('libraries', 'data', 'metadata_label.h')
    f = open(labelHeader)
    labels = []
    comments = {}
    
    for line in f:
        line = line.strip()
        if line.startswith('MDL_') and '///<' in line:
            parts = line.split('///<')
            mdl = parts[0].strip()[:-1] # remove last comma
            comm = parts[1].strip()
            comments[mdl] = comm
        if line.startswith('MDL::addLabel(MDL_'):
            l = line.find('(')
            r = line.find(')')
            parts = line[l + 1:r].split(',')
            labels.append(parts[2].replace('"', '').strip())
    return labels
Exemple #5
0
def getXmippLabelsName():
    ''' Parse the labels name from the 'libraries/data/metadata_label.h' file '''
    labelHeader = getXmippPath('libraries', 'data', 'metadata_label.h')
    f = open(labelHeader)
    labels = []
    comments = {}

    for line in f:
        line = line.strip()
        if line.startswith('MDL_') and '///<' in line:
            parts = line.split('///<')
            mdl = parts[0].strip()[:-1]  # remove last comma
            comm = parts[1].strip()
            comments[mdl] = comm
        if line.startswith('MDL::addLabel(MDL_'):
            l = line.find('(')
            r = line.find(')')
            parts = line[l + 1:r].split(',')
            labels.append(parts[2].replace('"', '').strip())
    return labels
Exemple #6
0
def getXmippPrograms():
    '''Return the list of Xmipp's programs, taken from from bin/ folder'''     
    programs = [os.path.basename(p) for p in glob(getXmippPath('bin', 'xmipp_*'))]
    programs.sort()
    return programs
Exemple #7
0
def getProgramsDbName():
    return getXmippPath('.xmipp_programs.sqlite')
Exemple #8
0
def getProgramsDbName():
    return getXmippPath('.xmipp_programs.sqlite')
class TestXmippPythonInterface(unittest.TestCase):
    
    testsPath = getXmippPath("resources", "test")
    # Temporary filenames used

    def getTmpName(self, suffix='.xmd'):
        """ Get temporary filenames in /tmp' that will be removed 
        after tests execution. 
        """
        ntf = NamedTemporaryFile(dir="/tmp/", suffix=suffix)
        self.tempNames.append(ntf)
        return ntf.name

    def setUp(self):
        """This function performs all the setup stuff.      
        """
        os.chdir(self.testsPath)
        self.tempNames = []

    def tearDown(self):
        for ntf in self.tempNames:
            ntf.close()

    def test_xmipp_Euler_angles2matrix(self):
        from numpy  import array

        a = array([[ 0.70710678, 0.70710678, -0.        ],
                   [-0.70710678, 0.70710678, 0.        ],
                   [ 0., 0., 1.        ]])
        rot = 45.
        tilt = 0.
        psi = 0.
        b = Euler_angles2matrix(rot, tilt, psi)
        self.assertAlmostEqual(a.all(), b.all(), 2)

    def test_xmipp_Euler_matrix2angles(self):
        from numpy  import array

        a = array([[ 0.70710678, 0.70710678, -0.        ],
                   [-0.70710678, 0.70710678, 0.        ],
                   [ 0., 0., 1.        ]])
        rot = 45.
        tilt = 0.
        psi = 0.
        rot1,tilt1,psi1 = Euler_matrix2angles(a)
        if psi1 > 1:
            rot1 = psi1
            psi1=0.
        self.assertAlmostEqual(rot, rot1, 4)
        self.assertAlmostEqual(tilt, tilt1, 4)
        self.assertAlmostEqual(psi, psi1, 4)

    def test_xmipp_activateMathExtensions(self):
        '''activateMathExtensions'''
        md1 = MetaData()
        activateMathExtensions()
        id = md1.addObject()
        md1.setValue(MDL_ANGLE_ROT, 4., id)
        md1.setValue(MDL_ANGLE_TILT, 3., id)
        id = md1.addObject()
        md1.setValue(MDL_ANGLE_ROT, 9., id)
        md1.setValue(MDL_ANGLE_TILT, 5., id)
        md2 = MetaData()
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 2., id)
        md2.setValue(MDL_ANGLE_TILT, 3., id)
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 3., id)
        md2.setValue(MDL_ANGLE_TILT, 5., id)
        angleRotLabel = label2Str(MDL_ANGLE_ROT)
        operateString = angleRotLabel + "= sqrt(" + angleRotLabel+")"
        md1.operate(operateString)
        self.assertEqual(md1, md2)

    def test_xmipp_errorBetween2CTFs(self):
        '''activateMathExtensions'''
        md1 = MetaData()
        id = md1.addObject()
        #         md1.setValue(MDL_CTF_SAMPLING_RATE, 1., id)
        #         md1.setValue(MDL_CTF_VOLTAGE, 300., id);
        #         md1.setValue(MDL_CTF_DEFOCUSU, 5000., id);
        #         md1.setValue(MDL_CTF_DEFOCUSV, 7500., id);
        #         md1.setValue(MDL_CTF_DEFOCUS_ANGLE, -45., id);
        #         md1.setValue(MDL_CTF_CS, 2., id);
        #         md1.setValue(MDL_CTF_Q0, 0.1, id);
        #
        #         md2 = MetaData()
        #         id = md2.addObject()
        #         md2.setValue(MDL_CTF_SAMPLING_RATE, 1., id)
        #         md2.setValue(MDL_CTF_VOLTAGE, 300., id);
        #         md2.setValue(MDL_CTF_DEFOCUSU, 10000., id);
        #         md2.setValue(MDL_CTF_DEFOCUSV, 10000., id);
        #         md2.setValue(MDL_CTF_DEFOCUS_ANGLE, 45., id);
        #         md2.setValue(MDL_CTF_CS, 2., id);
        #         md2.setValue(MDL_CTF_Q0, 0.1, id);

        md1.setValue(MDL_CTF_SAMPLING_RATE, 1., id)
        md1.setValue(MDL_CTF_VOLTAGE, 200., id);
        md1.setValue(MDL_CTF_DEFOCUSU, 18306.250000, id);
        md1.setValue(MDL_CTF_DEFOCUSV, 16786.470000, id);
        md1.setValue(MDL_CTF_DEFOCUS_ANGLE, 30.100000, id);
        md1.setValue(MDL_CTF_CS, 2., id);
        md1.setValue(MDL_CTF_Q0, 0.07, id);

        md2 = MetaData()
        id = md2.addObject()
        md2.setValue(MDL_CTF_SAMPLING_RATE, 1., id)
        md2.setValue(MDL_CTF_VOLTAGE, 200., id);
        md2.setValue(MDL_CTF_DEFOCUSU, 17932.700000, id);
        md2.setValue(MDL_CTF_DEFOCUSV, 16930.300000, id);
        md2.setValue(MDL_CTF_DEFOCUS_ANGLE, 45., id);
        md2.setValue(MDL_CTF_CS, 2., id);
        md2.setValue(MDL_CTF_Q0, 0.07, id);


        error = errorBetween2CTFs(md1,md2, 256, 0.05,0.25)

        self.assertAlmostEqual(error, 5045.79,0)

    def test_xmipp_errorMaxFreqCTFs(self):
        '''activateMathExtensions'''
        from math import pi
        md1 = MetaData()
        id = md1.addObject()
        md1.setValue(MDL_CTF_SAMPLING_RATE, 2., id)
        md1.setValue(MDL_CTF_VOLTAGE, 300., id);
        md1.setValue(MDL_CTF_DEFOCUSU, 6000., id);
        md1.setValue(MDL_CTF_DEFOCUSV, 7500., id);
        md1.setValue(MDL_CTF_DEFOCUS_ANGLE, 45., id);
        md1.setValue(MDL_CTF_CS, 2., id);
        md1.setValue(MDL_CTF_Q0, 0.1, id);

        resolution = errorMaxFreqCTFs(md1,pi/2.)

        self.assertAlmostEqual(resolution, 7.6852355,2)


    def test_xmipp_errorMaxFreqCTFs2D(self):
        '''activateMathExtensions'''
        md1 = MetaData()
        id = md1.addObject()
        md1.setValue(MDL_CTF_SAMPLING_RATE, 2., id)
        md1.setValue(MDL_CTF_VOLTAGE, 300., id);
        md1.setValue(MDL_CTF_DEFOCUSU, 10000., id);
        md1.setValue(MDL_CTF_DEFOCUSV, 5400., id);
        md1.setValue(MDL_CTF_DEFOCUS_ANGLE, 45., id);
        md1.setValue(MDL_CTF_CS, 2., id);
        md1.setValue(MDL_CTF_Q0, 0.1, id);

        md2 = MetaData()
        id = md2.addObject()
        md2.setValue(MDL_CTF_SAMPLING_RATE, 2., id)
        md2.setValue(MDL_CTF_VOLTAGE, 300., id);
        md2.setValue(MDL_CTF_DEFOCUSU, 5000., id);
        md2.setValue(MDL_CTF_DEFOCUSV, 5000., id);
        md2.setValue(MDL_CTF_DEFOCUS_ANGLE, 45., id);
        md2.setValue(MDL_CTF_CS, 2., id);
        md2.setValue(MDL_CTF_Q0, 0.1, id);
        resolution = errorMaxFreqCTFs2D(md1,md2)

        self.assertAlmostEqual(resolution, 13.921659080780355,2)


    def test_FileName_compose(self):
        fn1 = FileName("kk000001.xmp")
        fn2 = FileName("")
        fn2.compose("kk", 1, "xmp")
        self.assertEqual(str(fn1), str(fn2))
        self.assertNotEqual(str(fn1) + 'kk', str(fn2))

        fn1 = FileName("*****@*****.**")
        fn2 = FileName("")
        fn2.compose(1, "kk.xmp")
        self.assertEqual(str(fn1), str(fn2))

        fn1 = FileName("*****@*****.**")
        fn2 = FileName("")
        fn2.compose("jj", "kk.xmp")
        self.assertEqual(str(fn1), str(fn2))

    def test_FileName_isInStack(self):
        fn1 = FileName("[email protected]")
        fn2 = FileName("1.xmp")
        self.assertTrue (fn1.isInStack())
        self.assertFalse(fn2.isInStack())

    def test_FileName_isMetaData(self):
        imgPath = testFile("smallStack.stk")
        fn1 = FileName(imgPath)
        try:
            result = fn1.isMetaData()
        except:
            print("cannot open file:", fn1)
            exit()
        self.assertFalse(result)

        imgPath = testFile("test.xmd")
        fn2 = FileName(imgPath)
        self.assertTrue (fn2.isMetaData())

    def test_Image_add(self):
        stackPath = testFile("smallStack.stk")
        img1 = Image("1@" + stackPath)
        img2 = Image("2@" + stackPath)
        sum = img1 + img2
        sum2 = Image("1@" + stackPath)
        sum2.inplaceAdd(img2)

        sumRef = Image(testFile("sum.spi"))
        self.assertEqual(sum, sumRef)
        self.assertEqual(sum2, sumRef)

        img1 += img2
        self.assertEqual(sum, img1)
        img1 += img2
        self.assertNotEqual(sum, img1)

    def test_Image_multiplyDivide(self):
        imgPath = testFile("singleImage.spi")
        img1 = Image(imgPath)
        img2 = Image(imgPath)
        imgSum = Image(imgPath)
        imgSum2 = Image(imgPath)

        for i in range(2):
            imgSum += img1
            imgSum2.inplaceAdd(img1)

        imgMult = img1 * 3
        imgMult2 = Image(imgPath)
        imgMult2.inplaceMultiply(3)

        self.assertEqual(imgSum, imgMult)
        self.assertEqual(imgSum, imgSum2)
        self.assertEqual(imgSum, imgMult2)

        img1 *= 3
        self.assertEqual(imgSum, img1)


        imgSum2.inplaceDivide(3.)
        # TODO: division does not work
        # imgSum /= 3.
        imgSum *= 0.3333333

        self.assertEqual(imgSum, imgSum2)
        self.assertNotEqual(imgSum, img1)
        self.assertEqual(imgSum, img2)

    def test_Image_multiplyInplace(self):
        # Test multiplication inplace by value and image
        from numpy  import array
        
        def _createImage(data):
            img = Image()
            img.setDataType(DT_FLOAT)
            img.resize(3, 3)
            img.setData(data)
            return img

        img1 = _createImage(array([[2., 0., 0.],
                                   [2., 0., 0.],
                                   [2., 0., 0.]]))
        img2 = _createImage(array([[3., 0., 0.],
                                   [3., 0., 0.],
                                   [3., 0., 0.]]))
        img3 = _createImage(array([[6., 0., 0.],
                                   [6., 0., 0.],
                                   [6., 0., 0.]]))
        img1.inplaceMultiply(3.)
        self.assertEqual(img1, img3)

        img1 = _createImage(array([[2., 0., 0.],
                                   [2., 0., 0.],
                                   [2., 0., 0.]]))
        img1.inplaceMultiply(img2)
        self.assertEqual(img1, img3)

    def test_Image_compare(self):
        imgPath = testFile("singleImage.spi")
        img1 = Image()
        img1.read(imgPath)
        img2 = Image(imgPath)
        # Test that image is equal to itself
        self.assertEqual(img1, img2)
        # Test different images
        imgPath = "1@" + testFile("smallStack.stk")
        img2.read(imgPath)
        self.assertNotEqual(img1, img2)

    def test_Image_computeStatistics(self):
        stackPath = testFile("smallStack.stk")
        img1 = Image("1@" + stackPath)
        mean, dev, min, max = img1.computeStats()
        self.assertAlmostEqual(mean, -0.000360, 5)
        self.assertAlmostEqual(dev, 0.105687, 5)
        self.assertAlmostEqual(min, -0.415921, 5)
        self.assertAlmostEqual(max, 0.637052, 5)

    def test_Image_equal(self):
        img = Image()
        img2 = Image()
        img.setDataType(DT_FLOAT)
        img2.setDataType(DT_FLOAT)
        img.resize(3, 3)
        img2.resize(3, 3)
        img.setPixel(0, 0, 1, 1, 1.)
        img2.setPixel(0, 0, 1, 1, 1.01)

        self.assertFalse(img.equal(img2, 0.005))
        self.assertTrue(img.equal(img2, 0.1))

    def test_Image_getData(self):
        from numpy import array
        img1 = Image(testFile("singleImage.spi"))
        Z = img1.getData()
        Zref = array([[-0.27623099,-0.13268562, 0.32305956],
                      [ 1.07257104, 0.73135602, 0.49813408],
                      [ 0.90717429, 0.6812411, -0.09380955]])
        self.assertEqual(Z.all(), Zref.all())

    def test_Image_initConstant(self):
        imgPath = testFile("tinyImage.spi")
        img = Image(imgPath)
        img.initConstant(1.)
        for i in range(0, 3):
            for j in range (0, 3):
                p = img.getPixel(0, 0, i, j)
                self.assertAlmostEqual(p, 1.0)

    def test_Image_initRandom(self):
        imgPath = testFile("tinyImage.spi")
        img = Image(imgPath)
        img.resize(1024, 1024)
        img.initRandom(0., 1., XMIPP_RND_GAUSSIAN)
        mean, dev, min, max = img.computeStats()
        self.assertAlmostEqual(mean, 0., 2)
        self.assertAlmostEqual(dev, 1., 2)

    def test_Image_minus(self):
        pathSum = testFile("sum.spi")
        imgAdd = Image(pathSum)
        path1 = "1@" + testFile("smallStack.stk")
        img1 = Image(path1)
        path2 = "2@" + testFile("smallStack.stk")
        img2 = Image(path2)

        imgAdd -= img2
        self.assertEqual(img1, imgAdd)

    def test_Image_project(self):
        vol=Image(testFile('progVol.vol'))
        vol.convert2DataType(DT_DOUBLE)
        proj=projectVolumeDouble(vol,0.,0.,0.)
        self.assertEqual(1,1)

    def test_Image_projectFourier(self):
        vol = Image(testFile('progVol.vol'))
        vol.convert2DataType(DT_DOUBLE)
        proj = Image()
        proj.setDataType(DT_DOUBLE)

        padding = 2
        maxFreq = 0.5
        splineDegree = 2
        vol.write('/tmp/vol1.vol')
        fp = FourierProjector(vol, padding, maxFreq, splineDegree)
        # After creating the f
        fp.projectVolume(proj, 0, 0, 0)

        #vol.write('/tmp/vol2.vol')
        proj.write('/tmp/kk.spi')

    def test_Image_read(self):
        imgPath = testFile("tinyImage.spi")
        img = Image(imgPath)
        count = 0.
        for i in range(0, 3):
            for j in range (0, 3):
                p = img.getPixel(0, 0, i, j)
                self.assertAlmostEqual(p, count)
                count += 1.

    def test_Image_read_header(self):
        imgPath = testFile("tinyImage.spi")
        img = Image()
        img.read(imgPath, HEADER)

        (x, y, z, n) = img.getDimensions()

        self.assertEqual(x, 3)
        self.assertEqual(y, 3)
        self.assertEqual(z, 1)
        self.assertEqual(n, 1)

    def test_Image_readApplyGeo(self):
        imgPath = testFile("tinyRotated.spi")
        img = Image(imgPath)
        imgPath = testFile("tinyImage.spi")
        md = MetaData()
        id = md.addObject()
        md.setValue(MDL_IMAGE, imgPath, id)
        md.setValue(MDL_ANGLE_PSI, 90., id)
        img2 = Image()
        img2.readApplyGeo(md, id)
        self.assertEqual(img, img2)

    def test_Image_setDataType(self):
        img = Image()
        img.setDataType(DT_FLOAT)
        img.resize(3, 3)
        img.setPixel(0, 0, 1, 1, 1.)
        img.computeStats()
        mean, dev, min, max = img.computeStats()
        self.assertAlmostEqual(mean, 0.111111, 5)
        self.assertAlmostEqual(dev, 0.314270, 5)
        self.assertAlmostEqual(min, 0., 5)
        self.assertAlmostEqual(max, 1., 5)

    def test_Image_mirrorY(self):
        img = Image()
        img.setDataType(DT_FLOAT)
        imgY = Image()
        imgY.setDataType(DT_FLOAT)
        dim=3
        img.resize(dim, dim)
        imgY.resize(dim, dim)
        for i in range(0,dim):
            for j in range(0,dim):
                img.setPixel(0, 0, i, j, 1.*dim*i+j)
        img.mirrorY();
        for i in range(0,dim):
            for j in range(0,dim):
                imgY.setPixel(0, 0, dim -1 -i, j, 1.*dim*i+j)
        self.assertEqual(img, imgY)

    def test_Image_applyTransforMatScipion(self):
        img = Image()
        img2 = Image()
        img.setDataType(DT_FLOAT)
        img2.setDataType(DT_FLOAT)
        dim=3
        img.resize(dim, dim)
        img2.resize(dim, dim)
        for i in range(0,dim):
            for j in range(0,dim):
                img.setPixel(0, 0, dim -1 -i, j, 1.*dim*i+j)
        A=[0.,-1.,0.,0.,
           1.,0.,0.,0.,
           0.,0.,1.,1.]
        img2.setPixel(0, 0, 0,0,0)
        img2.setPixel(0, 0, 0,1,3.)
        img2.setPixel(0, 0, 0,2,6.)

        img2.setPixel(0, 0, 1,0,1.)
        img2.setPixel(0, 0, 1,1,4.)
        img2.setPixel(0, 0, 1,2,7.)

        img2.setPixel(0, 0, 2,0,2.)
        img2.setPixel(0, 0, 2,1,5.)
        img2.setPixel(0, 0, 2,2,8.)

        img.applyTransforMatScipion(A)
        #print img.getData(),"\n", img2.getData()
        for i in range(0, dim):
            for j in range (0, dim):
                p1 = img.getPixel(0, 0, i, j)
                p2 = img2.getPixel(0, 0, i, j)
                self.assertAlmostEqual(p1, p2)

    def test_Metadata_getValue(self):
        '''MetaData_GetValues'''
        mdPath = testFile("test.xmd")
        mdPath2 = testFile("proj_ctf_1.stk")
        mD = MetaData(mdPath)
        img = mD.getValue(MDL_IMAGE, 1)
        self.assertEqual(img, '000001@' + mdPath2)
        defocus = mD.getValue(MDL_CTF_DEFOCUSU, 2)
        self.assertAlmostEqual(defocus, 200)
        count = mD.getValue(MDL_COUNT, 3)
        self.assertEqual(count, 30)
        list = mD.getValue(MDL_CLASSIFICATION_DATA, 1)
        self.assertEqual(list, [1.0, 2.0, 3.0])
        ref = mD.getValue(MDL_REF3D, 2)
        self.assertEqual(ref, 2)

    def test_Metadata_importObjects(self):
        '''import metadata subset'''
        mdPath = testFile("test.xmd")
        mD = MetaData(mdPath)
        mDout = MetaData()
        mDout.importObjects(mD, MDValueEQ(MDL_REF3D, -1))
        mdPath = testFile("importObject.xmd")
        mD = MetaData(mdPath)
        self.assertEqual(mD, mDout)

    def test_Metadata_iter(self):
        mdPath = testFile("test.xmd")
        mD = MetaData(mdPath)
        i = 1
        for id in mD:
            img = mD.getValue(MDL_IMAGE, id)
            expImg = testFile("test.xmd")
            expImg = ("00000%d@" % i) + testFile("proj_ctf_1.stk")
            #expImg = '00000%d@Images/proj_ctf_1.stk' % i
            self.assertEqual(img, expImg)
            i += 1

    def test_Metadata_existsBlockInMetaDataFile(self):
        mdPath = "b2@"+testFile("testBlock.xmd")
        self.assertTrue(existsBlockInMetaDataFile(mdPath))
        mdPath = "nonexisting@"+testFile("testBlock.xmd")
        self.assertFalse(existsBlockInMetaDataFile(mdPath))
        mdPath = "gggg@"+testFile("testBlock.xmd")
        self.assertRaises(Exception,existsBlockInMetaDataFile(mdPath))

    def test_Metadata_operate(self):
        md = MetaData()
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 1., id)
        md.setValue(MDL_ANGLE_TILT, 2., id)
        md.setValue(MDL_ANGLE_PSI, 3., id)
        md.setValue(MDL_ANGLE_ROT2, 6., id)
        md.setValue(MDL_ANGLE_TILT2, 5., id)
        md.setValue(MDL_ANGLE_PSI2, 4., id)
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 11., id)
        md.setValue(MDL_ANGLE_TILT, 12., id)
        md.setValue(MDL_ANGLE_PSI, 13., id)
        md.setValue(MDL_ANGLE_ROT2, 16., id)
        md.setValue(MDL_ANGLE_TILT2, 15., id)
        md.setValue(MDL_ANGLE_PSI2, 14., id)

        md2 = MetaData(md)
        anglePsiLabel = label2Str(MDL_ANGLE_PSI)
        angleRotLabel = label2Str(MDL_ANGLE_ROT)
        operateString = angleRotLabel + "=3*" + angleRotLabel
        operateString += "," + anglePsiLabel + "=2*" + anglePsiLabel
        md.operate(operateString)
        for id in md2:
            md2.setValue(MDL_ANGLE_ROT, md2.getValue(MDL_ANGLE_ROT, id) * 3., id);
            md2.setValue(MDL_ANGLE_PSI, md2.getValue(MDL_ANGLE_PSI, id) * 2., id);
        self.assertEqual(md, md2)

    def test_xmipp_addLabelAlias(self):
        tmpFileName = '/tmp/test_pythoninterface_readPlain1.xmd'
        line1="""# XMIPP_STAR_1 * 
# 
data_images

loop_
_rlnVoltage #1
_rlnDefocusU #2
  200.0 10000.0
  201.0 10000.0"""
        #createTestImage
        f = open(tmpFileName,'w')
        f.write(line1)
        f.flush()
        f.close()
        addLabelAlias(MDL_CTF_VOLTAGE,"rlnVoltage")
        addLabelAlias(MDL_CTF_DEFOCUSU,"rlnDefocusU")
        md=MetaData(tmpFileName)
        md2=MetaData()
        id = md2.addObject()
        md2.setValue(MDL_CTF_VOLTAGE, 200.0, id)
        md2.setValue(MDL_CTF_DEFOCUSU, 10000.0, id)
        id = md2.addObject()
        md2.setValue(MDL_CTF_VOLTAGE, 201.0, id)
        md2.setValue(MDL_CTF_DEFOCUSU, 10000.0, id)
        self.assertEqual(md, md2)
        os.remove(tmpFileName)

    def test_Metadata_renameColumn(self):
        '''test_Metadata_renameColumn'''
        md = MetaData()
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 1., id)
        md.setValue(MDL_ANGLE_TILT, 2., id)
        md.setValue(MDL_ANGLE_PSI, 3., id)
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 11., id)
        md.setValue(MDL_ANGLE_TILT, 12., id)
        md.setValue(MDL_ANGLE_PSI, 13., id)

        md2 = MetaData()
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT2, 1., id)
        md2.setValue(MDL_ANGLE_TILT2, 2., id)
        md2.setValue(MDL_ANGLE_PSI2, 3., id)
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT2, 11., id)
        md2.setValue(MDL_ANGLE_TILT2, 12., id)
        md2.setValue(MDL_ANGLE_PSI2, 13., id)

        md.renameColumn(MDL_ANGLE_ROT,MDL_ANGLE_ROT2)
        md.renameColumn(MDL_ANGLE_TILT,MDL_ANGLE_TILT2)
        md.renameColumn(MDL_ANGLE_PSI,MDL_ANGLE_PSI2)
        self.assertEqual(md, md2)


        md.clear()
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 1., id)
        md.setValue(MDL_ANGLE_TILT, 2., id)
        md.setValue(MDL_ANGLE_PSI, 3., id)
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 11., id)
        md.setValue(MDL_ANGLE_TILT, 12., id)
        md.setValue(MDL_ANGLE_PSI, 13., id)
        oldLabel=[MDL_ANGLE_ROT,MDL_ANGLE_TILT,MDL_ANGLE_PSI]
        newLabel=[MDL_ANGLE_ROT2,MDL_ANGLE_TILT2,MDL_ANGLE_PSI2]
        md.renameColumn(oldLabel,newLabel)
        self.assertEqual(md, md2)

    def test_Metadata_sort(self):
        '''test_Metadata_sort'''
        md = MetaData()
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 1., id)
        md.setValue(MDL_ANGLE_TILT, 2., id)
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 11., id)
        md.setValue(MDL_ANGLE_TILT, 12., id)
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 5., id)
        md.setValue(MDL_ANGLE_TILT, 12., id)
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 6., id)
        md.setValue(MDL_ANGLE_TILT, 12., id)

        md2 = MetaData()
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 11., id)
        md2.setValue(MDL_ANGLE_TILT, 12., id)
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 6., id)
        md2.setValue(MDL_ANGLE_TILT, 12., id)
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 5., id)
        md2.setValue(MDL_ANGLE_TILT, 12., id)
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 1., id)
        md2.setValue(MDL_ANGLE_TILT, 2., id)

        mdAux=MetaData(md)
        mdAux.sort(MDL_ANGLE_ROT,False)
        self.assertEqual(mdAux, md2)

        mdAux=MetaData(md)
        mdAux.sort(MDL_ANGLE_ROT,False,2)#limit
        md2 = MetaData()
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 11., id)
        md2.setValue(MDL_ANGLE_TILT, 12., id)
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 6., id)
        md2.setValue(MDL_ANGLE_TILT, 12., id)
        self.assertEqual(mdAux, md2)

        mdAux=MetaData(md)
        mdAux.sort(MDL_ANGLE_ROT,False,2,1)#limit && offset
        md2 = MetaData()
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 6., id)
        md2.setValue(MDL_ANGLE_TILT, 12., id)
        id = md2.addObject()
        md2.setValue(MDL_ANGLE_ROT, 5., id)
        md2.setValue(MDL_ANGLE_TILT, 12., id)
        self.assertEqual(mdAux, md2)

    #tests for join1 and join2 pending
    def test_Metadata_joinNatural(self):
        #create metadta
        md = MetaData()
        md2 = MetaData()
        mdout = MetaData()
        listOrig = [1.0, 2.0, 3.0]
        for i in range(1, 4):
            id = md.addObject()
            img = '%06d@pythoninterface/proj_ctf_1.stk' % i
            md.setValue(MDL_IMAGE, img, id)
            md.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)
            md.setValue(MDL_COUNT, (i * 10), id)
        for i in range(1, 3):
            id = md2.addObject()
            img = '%06d@pythoninterface/proj_ctf_1.stk' % i
            md2.setValue(MDL_IMAGE, img, id)
            md2.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)
            md2.setValue(MDL_ANGLE_PSI, 1., id)
        mdout.joinNatural(md, md2)

        md.clear()
        for i in range(1, 3):
            id = md.addObject()
            img = '%06d@pythoninterface/proj_ctf_1.stk' % i
            md.setValue(MDL_IMAGE, img, id)
            md.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)
            md.setValue(MDL_COUNT, (i * 10), id)
            md.setValue(MDL_ANGLE_PSI, 1., id)
        self.assertEqual(mdout, md)

    def test_Metadata_intersect(self):
        #create metadta
        md = MetaData()
        md2 = MetaData()
        mdout = MetaData()
        listOrig = [1.0, 2.0, 3.0]
        for i in range(1, 4):
            id = md.addObject()
            img = '%06d@pythoninterface/proj_ctf_1.stk' % i
            md.setValue(MDL_IMAGE, img, id)
            md.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)
            md.setValue(MDL_COUNT, (i * 10), id)
            md.setValue(MDL_ANGLE_PSI, 1., id)
        for i in range(1, 3):
            id = md2.addObject()
            img = '%06d@pythoninterface/proj_ctf_1.stk' % i
            md2.setValue(MDL_IMAGE, img, id)
        md.intersection (md2, MDL_IMAGE)

        for i in range(1, 3):
            id = mdout.addObject()
            img = '%06d@pythoninterface/proj_ctf_1.stk' % i
            mdout.setValue(MDL_IMAGE, img, id)
            mdout.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)
            mdout.setValue(MDL_COUNT, (i * 10), id)
            mdout.setValue(MDL_ANGLE_PSI, 1., id)

        self.assertEqual(mdout, md)

    def test_Metadata_read(self):
        '''MetaData_setValues'''
        '''This test should produce the following metadata, which is the same of 'test.xmd'
        data_
        loop_
         _image
         _CTFModel
         _CTF_Defocus_U
         _count
         _classificationData
         _ref3d
         000001@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam  -100.000000         10 ' 1.000000     2.000000     3.000000 '         -1
         000002@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam   200.000000         20 ' 1.000000     4.000000     9.000000 '          2
         000003@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam  -300.000000         30 ' 1.000000     8.000000    27.000000 '         -3
        '''
        mdPath = testFile("test.xmd")
        mdRef = MetaData(mdPath)
        md = MetaData()
        ii = -1
        listOrig = [1.0, 2.0, 3.0]
        for i in range(1, 4):
            id = md.addObject()
            img = '00000%i@pythoninterface/proj_ctf_1.stk' % i
            md.setValue(MDL_IMAGE, img, id)
            md.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)
            md.setValue(MDL_CTF_DEFOCUSU, (i * ii * 100.0), id)
            md.setValue(MDL_COUNT, (i * 10), id)
            list = [x ** i for x in listOrig]
            md.setValue(MDL_CLASSIFICATION_DATA, list, id)
            md.setValue(MDL_REF3D, (i * ii), id)
            ii *= -1

        tmpFileName = '/tmp/test_pythoninterface_read_tmp.xmd'
        md.write(tmpFileName)

        md2 = MetaData()
        md2.read(tmpFileName)
        os.remove(tmpFileName)
        self.assertEqual(md, md2)

    def test_Metadata_read_with_labels(self):
        '''MetaData_setValues'''
        '''This test should produce the following metadata, which is the same of 'test.xmd'
        data_
        loop_
         _image
         _CTFModel
         _CTF_Defocus_U
         _count
         _angleComparison
         _ref3d
         000001@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam  -100.000000         10 ' 1.000000     2.000000     3.000000 '         -1
         000002@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam   200.000000         20 ' 1.000000     4.000000     9.000000 '          2
         000003@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam  -300.000000         30 ' 1.000000     8.000000    27.000000 '         -3
        '''
        mdPath = testFile("test.xmd")
        mdRef = MetaData(mdPath)
        md = MetaData()
        ii = -1
        listOrig = [1.0, 2.0, 3.0]
        for i in range(1, 4):
            id = md.addObject()
            img = '00000%i@pythoninterface/proj_ctf_1.stk' % i
            md.setValue(MDL_IMAGE, img, id)
            md.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)
            md.setValue(MDL_CTF_DEFOCUSU, (i * ii * 100.0), id)
            md.setValue(MDL_COUNT, (i * 10), id)
            list = [x ** i for x in listOrig]
            md.setValue(MDL_CLASSIFICATION_DATA, list, id)
            md.setValue(MDL_REF3D, (i * ii), id)
            ii *= -1

        tmpFileName = '/tmp/test_pythoninterface_read_tmp.xmd'
        md.write(tmpFileName)

        mdList = [MDL_IMAGE, MDL_COUNT]
        md.read(tmpFileName, mdList)
        os.remove(tmpFileName)

        md2 = MetaData()
        for i in range(1, 4):
            id = md2.addObject()
            img = '00000%i@pythoninterface/proj_ctf_1.stk' % i
            md2.setValue(MDL_IMAGE, img, id)
            md2.setValue(MDL_COUNT, (i * 10), id)
        self.assertEqual(md, md2)

    def test_Metadata_setColumnFormat(self):
        '''MetaData_setValues'''
        '''This test should produce the following metadata, which is the same of 'test_row.xmd'
        data_
         _image 000001@Images/proj_ctf_1.stk
         _CTFModel CTFs/10.ctfparam
        '''
        mdPath = testFile("test_row.xmd")
        mdRef = MetaData(mdPath)
        md = MetaData()
        ii = -1
        listOrig = [1.0, 2.0, 3.0]
        id = md.addObject()
        img = '000001@Images/proj_ctf_1.stk'
        md.setValue(MDL_IMAGE, img, id)
        md.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)

        md.setColumnFormat(False)
        rowFileName = '/tmp/test_row_tmp.xmd'
        md.write(rowFileName)

        equalBool = binaryFileComparison(mdPath, rowFileName)
        self.assertEqual(equalBool, True)
        os.remove(rowFileName)

    def test_Metadata_setValue(self):
        '''MetaData_setValues'''
        '''This test should produce the following metadata, which is the same of 'test.xmd'
        data_
        loop_
         _image
         _CTFModel
         _CTF_Defocus_U
         _count
         _angleComparison
         _ref3d
         000001@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam  -100.000000         10 [     1.000000     2.000000     3.000000 ]         -1
         000002@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam   200.000000         20 [     1.000000     4.000000     9.000000 ]          2
         000003@pythoninterface/proj_ctf_1.stk  CTFs/10.ctfparam  -300.000000         30 [     1.000000     8.000000    27.000000 ]         -3
        '''
        mdPath = testFile("test.xmd")
        mdRef = MetaData(mdPath)
        md = MetaData()
        ii = -1
        listOrig = [1.0, 2.0, 3.0]
        for i in range(1, 4):
            id = md.addObject()
            img = '00000%i@pythoninterface/proj_ctf_1.stk' % i
            md.setValue(MDL_IMAGE, img, id)
            md.setValue(MDL_CTF_MODEL, 'CTFs/10.ctfparam', id)
            md.setValue(MDL_CTF_DEFOCUSU, (i * ii * 100.0), id)
            md.setValue(MDL_COUNT, (i * 10), id)
            list = [x ** i for x in listOrig]
            md.setValue(MDL_CLASSIFICATION_DATA, list, id)
            md.setValue(MDL_REF3D, (i * ii), id)
            ii *= -1


        self.assertEqual(mdRef, md)
        print("THIS IS NOT AN ERROR: we are testing exceptions: an error message should appear regarding count and DOUBLE")
        self.assertRaises(XmippError, md.setValue, MDL_COUNT, 5.5, 1)


    def test_Metadata_compareTwoMetadataFiles(self):

        try:
            from tempfile import NamedTemporaryFile

            fn = self.getTmpName()
            fn2 = self.getTmpName()
            fn3 = self.getTmpName()

            auxMd = MetaData()
            auxMd2 = MetaData()

            auxMd.setValue(MDL_IMAGE, "image_1.xmp", auxMd.addObject())
            auxMd.setValue(MDL_IMAGE, "image_2.xmp", auxMd.addObject())

            auxMd.write("block_000000@" + fn, MD_OVERWRITE)
            auxMd.clear()
            auxMd.setValue(MDL_IMAGE, "image_data_1_1.xmp", auxMd.addObject())
            auxMd.setValue(MDL_IMAGE, "image_data_1_2.xmp", auxMd.addObject())
            auxMd.write("block_000001@" + fn, MD_APPEND)
            auxMd.clear()
            auxMd.setValue(MDL_IMAGE, "image_data_2_1.xmp", auxMd.addObject())
            auxMd.setValue(MDL_IMAGE, "image_data_2_2.xmp", auxMd.addObject())
            auxMd.write("block_000000@" + fn2, MD_OVERWRITE)
            auxMd.clear()
            auxMd.setValue(MDL_IMAGE, "image_data_A_1.xmp", auxMd.addObject())
            auxMd.setValue(MDL_IMAGE, "image_data_A_2.xmp", auxMd.addObject())
            auxMd.write("block_000001@" + fn2, MD_APPEND)
            auxMd.clear()

            self.assertFalse(compareTwoMetadataFiles(fn, fn2))
            self.assertTrue(compareTwoMetadataFiles(fn, fn))

            sfnFN = FileName(fn)
            sfn2FN = FileName(fn2)
            self.assertFalse(compareTwoMetadataFiles(sfnFN, sfn2FN))
            self.assertTrue(compareTwoMetadataFiles(sfnFN, sfnFN))

            auxMd.setValue(MDL_IMAGE, "image_1.xmpSPACE", auxMd.addObject())
            auxMd.setValue(MDL_IMAGE, "image_2.xmp", auxMd.addObject())
            auxMd.write("block_000000@" + fn2, MD_OVERWRITE)
            auxMd.clear()
            auxMd.setValue(MDL_IMAGE, "image_data_1_1.xmp", auxMd.addObject())
            auxMd.setValue(MDL_IMAGE, "image_data_1_2.xmp", auxMd.addObject())
            auxMd.write("block_000001@" + fn2, MD_APPEND)

            command = "sed 's/SPACE/ /g' " + fn2 + ">" + fn3
            os.system(command)

            self.assertTrue(compareTwoMetadataFiles(fn, fn3))

        except Exception as e:
            print(str(e))

    def test_Metadata_agregate(self):
        mdOut = MetaData()
        md    = MetaData()
        mdResult = MetaData()
        for linea in range(1, 101):
            id = md.addObject()
            md.setValue(MDL_IMAGE, '*****@*****.**' % linea, id)
            md.setValue(MDL_XCOOR, int(linea%3), id)
        mdOut.aggregate(md, AGGR_COUNT, MDL_XCOOR, MDL_XCOOR, MDL_COUNT)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 0, id)
        mdResult.setValue(MDL_COUNT, 33, id)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 1, id)
        mdResult.setValue(MDL_COUNT, 34, id)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 2, id)
        mdResult.setValue(MDL_COUNT, 33, id)

        self.assertEqual(mdOut, mdResult)

    def test_Metadata_aggregateMdGroupBy(self):
        mdOut = MetaData()
        md    = MetaData()
        mdResult = MetaData()
        for linea in range(1, 101):
            id = md.addObject()
            md.setValue(MDL_IMAGE, '*****@*****.**' % linea, id)
            md.setValue(MDL_XCOOR, int(linea%3), id)
            md.setValue(MDL_YCOOR, int(linea%2), id)
        mdOut.aggregateMdGroupBy(md, AGGR_COUNT, [MDL_XCOOR,MDL_YCOOR], MDL_XCOOR, MDL_COUNT)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 0, id)
        mdResult.setValue(MDL_YCOOR, 0, id)
        mdResult.setValue(MDL_COUNT, 16, id)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 0, id)
        mdResult.setValue(MDL_YCOOR, 1, id)
        mdResult.setValue(MDL_COUNT, 17, id)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 1, id)
        mdResult.setValue(MDL_YCOOR, 0, id)
        mdResult.setValue(MDL_COUNT, 17, id)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 1, id)
        mdResult.setValue(MDL_YCOOR, 1, id)
        mdResult.setValue(MDL_COUNT, 17, id)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 2, id)
        mdResult.setValue(MDL_YCOOR, 0, id)
        mdResult.setValue(MDL_COUNT, 17, id)
        id = mdResult.addObject()
        mdResult.setValue(MDL_XCOOR, 2, id)
        mdResult.setValue(MDL_YCOOR, 1, id)
        mdResult.setValue(MDL_COUNT, 16, id)

        self.assertEqual(mdOut, mdResult)

    def test_Metadata_fillExpand(self):
        '''MetaData_fillExpand'''
        ctf = MetaData()
        objId = ctf.addObject()
        ctf.setColumnFormat(False)
        # Create ctf param metadata 1
        u1, v1 = 10000.0, 10001.0
        u2, v2 = 20000.0, 20001.0

        ctf.setValue(MDL_CTF_DEFOCUSU, u1, objId)
        ctf.setValue(MDL_CTF_DEFOCUSV, v1, objId)
        ctfFn1 = self.getTmpName(suffix='_ctf1.param')
        ctf.write(ctfFn1)

        # Create ctf param metadata 2
        ctf.setValue(MDL_CTF_DEFOCUSU, u2, objId)
        ctf.setValue(MDL_CTF_DEFOCUSV, v2, objId)
        ctfFn2 = self.getTmpName(suffix='_ctf2.param')
        ctf.write(ctfFn2)

        # True values
        ctfs = [ctfFn1, ctfFn1, ctfFn2]
        defocusU = [u1, u1, u2]
        defocusV = [v1, v1, v2]
        # Create image metadata
        md1 = MetaData()
        for i in range(3):
            objId = md1.addObject()
            img = '00000%i@pythoninterface/proj_ctf_1.stk' % (i + 1)
            md1.setValue(MDL_IMAGE, img, objId)
            md1.setValue(MDL_CTF_MODEL, ctfs[i], objId)

        # Create the expected metadata after call fillExpand
        md2 = MetaData()
        for i in range(3):
            objId = md2.addObject()
            img = '00000%i@pythoninterface/proj_ctf_1.stk' % (i + 1)
            md2.setValue(MDL_IMAGE, img, objId)
            md2.setValue(MDL_CTF_MODEL, ctfs[i], objId)
            md2.setValue(MDL_CTF_DEFOCUSU, defocusU[i], objId)
            md2.setValue(MDL_CTF_DEFOCUSV, defocusV[i], objId)
        md1.fillExpand(MDL_CTF_MODEL)
        self.assertEqual(md1, md2)

    def test_metadata_stress(self):
        numberMetadatas=10+1
        numberLines=10+1
        md = MetaData()
        fnStar   = self.getTmpName('.xmd')
        fnSqlite = self.getTmpName('.sqlite')
        outFileName=""
        #fill buffers so comparison is fair
        #if you do not fill buffers first meassurements will be muchfaster
        print("fill buffers so comparisons are fair")
        tmpFn="/tmp/deleteme.xmd"
        timestamp1 = time.time()
        if exists(tmpFn):
            os.remove(tmpFn)
        for met in range(1, numberMetadatas):
            outFileName = "b%06d@%s" % (met,tmpFn)
            for lin in range(1, numberLines):
                id = md.addObject()

                md.setValue(MDL_IMAGE, '*****@*****.**' % met, id)
                md.setValue(MDL_XCOOR,   lin+met*(numberLines-1), id)
                md.setValue(MDL_YCOOR, 1+lin+met*(numberLines-1), id)
            md.write(outFileName,MD_APPEND)
            md.clear()
        timestamp2 = time.time()
        print("\nBUFFER FILLING took %.2f seconds" % (timestamp2 - timestamp1))

        #write sqlite lineal
        timestamp1 = time.time()
        for met in range(1, numberMetadatas):
            outFileName = "b%06d@%s" % (met,fnSqlite)
            for lin in range(1, numberLines):
                id = md.addObject()

                md.setValue(MDL_IMAGE, '*****@*****.**' % met, id)
                md.setValue(MDL_XCOOR,   lin+met*(numberLines-1), id)
                md.setValue(MDL_YCOOR, 1+lin+met*(numberLines-1), id)
            md.write(outFileName,MD_APPEND)
            md.clear()
        timestamp2 = time.time()
        print("\nwrite(append) sqlite took %.2f seconds" % (timestamp2 - timestamp1))
        #write star lineal
        timestamp1 = time.time()
        for met in range(1, numberMetadatas):
            outFileName = "b%06d@%s" % (met,fnStar)
            for lin in range(1, numberLines):
                id = md.addObject()

                md.setValue(MDL_IMAGE, '*****@*****.**' % met, id)
                md.setValue(MDL_XCOOR,   lin+met*(numberLines-1), id)
                md.setValue(MDL_YCOOR, 1+lin+met*(numberLines-1), id)
            md.write(outFileName,MD_APPEND)
            md.clear()
        timestamp2 = time.time()
        print("\nwrite(append) star took %.2f seconds" % (timestamp2 - timestamp1))
        self.assertEqual(1, 1)

        #read random ///////////////////////////////////////////////////7
        timestamp1 = time.time()
        for met in range(1, numberMetadatas):
            outFileName = "b%06d@%s" % (met,fnSqlite)
            md.read(outFileName)
            md.clear()
        timestamp2 = time.time()
        print("\nread(secuential) sqlite took %.2f seconds" % (timestamp2 - timestamp1))

        timestamp1 = time.time()
        for met in range(1, numberMetadatas):
            outFileName = "b%06d@%s" % (met,fnStar)
            md.read(outFileName)
            md.clear()
        timestamp2 = time.time()
        print("\nread(secuential) star took %.2f seconds" % (timestamp2 - timestamp1))

    def test_SymList_readSymmetryFile(self):
        '''readSymmetryFile'''
        a = SymList()
        a.readSymmetryFile("i3")
        self.assertEqual(True, True)

    def test_SymList_computeDistance(self):
        '''computeDistance'''
        SL = SymList()
        SL.readSymmetryFile("i3h")
        md = MetaData()
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 1., id)
        md.setValue(MDL_ANGLE_TILT, 2., id)
        md.setValue(MDL_ANGLE_PSI, 3., id)
        md.setValue(MDL_ANGLE_ROT2, 6., id)
        md.setValue(MDL_ANGLE_TILT2, 5., id)
        md.setValue(MDL_ANGLE_PSI2, 4., id)
        id = md.addObject()
        md.setValue(MDL_ANGLE_ROT, 11., id)
        md.setValue(MDL_ANGLE_TILT, 12., id)
        md.setValue(MDL_ANGLE_PSI, 13., id)
        md.setValue(MDL_ANGLE_ROT2, 16., id)
        md.setValue(MDL_ANGLE_TILT2, 15., id)
        md.setValue(MDL_ANGLE_PSI2, 14., id)
        mdOut = MetaData(md)
        SL.computeDistance(md, False, False, False)
        id = md.firstObject()
        total = md.getValue(MDL_ANGLE_DIFF, id)
        self.assertAlmostEqual(total, 5.23652, 4)

    def test_SymList_getSymmetryMatrices(self):
        try:
            SL = SymList()
            _symList = SL.getSymmetryMatrices("C4")
        except Exception as err:
            print(err)
        m = _symList[1]
        l = [[0.0, -1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]]
        self.assertAlmostEqual(m[1][1],l[1][1])
        self.assertAlmostEqual(m[0][0],l[0][0])
        self.assertAlmostEqual(m[1][1],0.)