예제 #1
0
    def mergeClassesStep(self):
        if self.doGrouping:
            from cryomethods.functions import NumpyImgHandler
            npIh = NumpyImgHandler()
            makePath(self._getLevelPath(self._level))
            listVol = self._getFinalMaps()
            matrix = npIh.getAllNpList(listVol, 2)
            labels = self._clusteringData(matrix)

            clsChange = 0
            prevStar = self._getFileName('rawFinalData')
            pTable = Table()
            origStar = self._getFileName('input_star', lev=1, rLev=1)
            opticsTable = Table(fileName=origStar, tableName='optics')
            print("OPTABLE: ", origStar, opticsTable.size())
            for row in pTable.iterRows(prevStar, key="rlnClassNumber",
                                       tableName='particles'):
                clsPart = row.rlnClassNumber
                newClass = labels[clsPart - 1] + 1
                newRow = row._replace(rlnClassNumber=newClass)

                if not newClass == clsChange:
                    if not clsChange == 0:
                        self.writeStar(fn, ouTable, opticsTable)
                    clsChange = newClass
                    fn = self._getFileName('input_star', lev=self._level,
                                           rLev=newClass)
                    tableIn = Table(fileName=prevStar, tableName='particles')
                    cols = [str(c) for c in tableIn.getColumnNames()]
                    ouTable = Table(columns=cols, tableName='particles')
                ouTable.addRow(*newRow)
            print("mergeClassesStep ouTable.size: ", ouTable.size())
            self.writeStar(fn, ouTable, opticsTable)

        else:
            prevData = self._getFileName('rawFinalData')
            finalData = self._getFileName('finalData')
            prevModel = self._getFileName('rawFinalModel')
            finalModel = self._getFileName('finalModel')
            copyFile(prevData, finalData)
            copyFile(prevModel, finalModel)
 def _getNumberOfBodies(self):
     table = Table(fileName=self._getFileName('input'))
     return int(table.size())
예제 #3
0
    def _mergeDataStar(self, rLev, callback):
        def _getMapId(rMap):
            try:
                return self._mapsDict[rMap]
            except:
                return None

        iters = self._lastIter(rLev)
        #metadata to save all particles that continues
        outData = self._getFileName('outputData', lev=self._level)
        #metadata to save all final particles
        finalData = self._getFileName('rawFinalData')
        imgStar = self._getFileName('data', iter=iters,
                                    lev=self._level, rLev=rLev)
        opTable = Table(filename=imgStar, tableName='optics')
        tableIn = Table(fileName=imgStar, tableName='particles')
        print("IMGSTAR: ", imgStar, "PARTS: ", tableIn.size())
        cols = [str(c) for c in tableIn.getColumnNames()]
        outTable = Table(columns=cols, tableName='particles')
        finalTable = Table(columns=cols, tableName='particles')

        if os.path.exists(outData):
            print("Exists ", outData)
            tmpTable = Table()
            for row in tmpTable.iterRows(outData, tableName='particles'):
                outTable.addRow(*row)

        if os.path.exists(finalData):
            print("Exists ", finalData)
            tpTable = Table()
            for row in tpTable.iterRows(finalData, tableName='particles'):
                finalTable.addRow(*row)

        pTable = Table()
        for row in pTable.iterRows(imgStar, key="rlnClassNumber",
                                   tableName='particles'):
            clsPart = row.rlnClassNumber
            rMap = callback(iters, rLev, clsPart)
            mapId = _getMapId(rMap)

            while mapId is None:
                for clsPart in range(1, self.numberOfClasses.get()+1):
                    rMap = callback(iters, rLev, clsPart)
                    mapId = _getMapId(rMap)
                    if mapId is not None:
                        break

            if self.stopDict[mapId]:
                # if mapId != newMapId:
                #     if newMapId != '00.000':
                #         print(mdClass)
                #         mdClass.write(classMd)
                #     classMd = self._getFileName('mdataForClass', id=mapId)
                #     mdClass = self._getMetadata(classMd)
                #     newMapId = mapId
                classId = self._clsIdDict[mapId]
                newRow = row._replace(rlnClassNumber=classId)
                finalTable.addRow(*newRow)
            else:
                classId = int(mapId.split('.')[1])
                newRow = row._replace(rlnClassNumber=classId)
                outTable.addRow(*newRow)
        # if self.stopDict[mapId]:
        #     if mdClass.size() != 0:
        #         mdClass.write(classMd)

        if finalTable.size() != 0:
            print("finalTable.size: ", finalTable.size())
            self.writeStar(finalData, finalTable)

        if outTable.size() != 0:
            print("outTable.size: ", outTable.size())
            self.writeStar(outData, outTable, opTable)
예제 #4
0
    def convertInputStep(self, resetDeps, copyAlignment):
        import random
        """ Create the input file in STAR format as expected by Relion.
        If the input particles comes from Relion, just link the file.
        """
        if self._level == 0:
            makePath(self._getRunPath(self._level, 1))
            imgStar = self._getFileName('input_star', lev=self._level, rLev=0)
            self._convertStar(copyAlignment, imgStar)
            opticsTable = Table(fileName=imgStar, tableName='optics')
            partsTable = Table(fileName=imgStar, tableName='particles')
            self._convertVol(ImageHandler(), self.inputVolumes.get())
            mdSize = partsTable.size()

            for i in range(9, 1, -1):
                makePath(self._getRunPath(self._level, i))
                mStar = self._getFileName('input_star', lev=self._level, rLev=i)
                size = 10000 * i if mdSize >= 100000 else int(mdSize * 0.1 * i)
                print("partsTable: ", size, i, mdSize)
                partsTable._rows = random.sample(partsTable._rows, k=size)
                self.writeStar(mStar, partsTable, opticsTable)

        elif self._level == 1:
            imgStar = self._getFileName('input_star', lev=self._level, rLev=1)
            makePath(self._getRunPath(self._level, 1))
            self._convertStar(copyAlignment, imgStar)

            # find a clever way to avoid volume conversion if its already done.
            self._convertVol(ImageHandler(), self.inputVolumes.get())
        else:
            lastCls = None
            prevStar = self._getFileName('outputData', lev=self._level - 1)
            firstStarFn = self._getFileName('input_star', lev=1, rLev=1)
            # mdData = md.MetaData(prevStar)
            opTable = Table(fileName=firstStarFn, tableName='optics')

            tableIn = Table(fileName=prevStar, tableName='particles')
            cols = [str(c) for c in tableIn.getColumnNames()]

            pTable = Table()
            for row in pTable.iterRows(prevStar, key="rlnClassNumber",
                                       tableName='particles'):
                clsPart = row.rlnClassNumber
                if clsPart != lastCls:
                    makePath(self._getRunPath(self._level, clsPart))

                    if lastCls is not None:
                        print("writing %s" % fn)
                        # mdInput.write(fn)
                        self.writeStar(fn, newPTable, opTable)
                    paths = self._getRunPath(self._level, clsPart)
                    makePath(paths)
                    print ("Path: %s and newRlev: %d" % (paths, clsPart))
                    lastCls = clsPart
                    newPTable = Table(columns=cols, tableName='particles')
                    fn = self._getFileName('input_star', lev=self._level,
                                           rLev=clsPart)
                # objId = mdInput.addObject()
                newPTable.addRow(*row)
                # row.writeToMd(mdInput, objId)
            print("writing %s and ending the loop" % fn)
            self.writeStar(fn, newPTable, opTable)