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())
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)
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)