def readSetOfParticles(self, starFile, partSet, **kwargs): """ Convert a star file into a set of particles. Params: starFile: the filename of the star file partsSet: output particles set Keyword Arguments: blockName: The name of the data block (default particles) alignType: alignment type removeDisabled: Remove disabled items """ self._preprocessImageRow = kwargs.get('preprocessImageRow', None) self._alignType = kwargs.get('alignType', ALIGN_NONE) self._postprocessImageRow = kwargs.get('postprocessImageRow', None) self._optics = OpticsGroups.fromStar(starFile) self._pixelSize = getattr(self._optics.first(), 'rlnImagePixelSize', 1.0) self._invPixelSize = 1. / self._pixelSize partsReader = Table.Reader(starFile, tableName='particles') firstRow = partsReader.getRow() self._setClassId = hasattr(firstRow, 'rlnClassNumber') self._setCtf = partsReader.hasAllColumns(self.CTF_LABELS[:3]) particle = Particle() if self._setCtf: particle.setCTF(CTFModel()) self._setAcq = kwargs.get("readAcquisition", True) acq = Acquisition() acq.setMagnification(kwargs.get('magnification', 10000)) extraLabels = kwargs.get('extraLabels', []) + PARTICLE_EXTRA_LABELS self.createExtraLabels(particle, firstRow, extraLabels) self._rowToPart(firstRow, particle) partSet.setSamplingRate(self._pixelSize) partSet.setAcquisition(acq) self._optics.toImages(partSet) partSet.append(particle) for row in partsReader: self._rowToPart(row, particle) partSet.append(particle) partSet.setHasCTF(self._setCtf) partSet.setAlignment(self._alignType)
def test_iterRows(self): print("Checking iterRows...") dataFile = testfile('star', 'refine3d', 'run_it016_data.star') table = Table(fileName=dataFile, tableName='particles') # Let's open again the same file for iteration with open(dataFile) as f: tableReader = Table.Reader(f, tableName='particles') for c1, c2 in zip(table.getColumns(), tableReader.getColumns()): self.assertEqual(c1, c2, "Column c1 (%s) differs from c2 (%s)" % (c1, c2)) for r1, r2 in zip(table, tableReader): self.assertEqual(r1, r2) # Now try directly with iterRows function for r1, r2 in zip(table, Table.iterRows(dataFile, tableName='particles')): self.assertEqual(r1, r2) defocusSorted = sorted(float(r.rlnDefocusU) for r in table) for d1, row in zip(defocusSorted, Table.iterRows(dataFile, tableName='particles', key=lambda r: r.rlnDefocusU)): self.assertAlmostEqual(d1, row.rlnDefocusU) # Test sorting by imageName column, also using getColumnValues and sort() imageIds = table.getColumnValues('rlnImageName') imageIds.sort() # Check sorted iteration give the total amount of rows rows = [r for r in Table.iterRows(dataFile, tableName='particles', key='rlnImageName')] self.assertEqual(len(imageIds), len(rows)) for id1, row in zip(imageIds, Table.iterRows(dataFile, tableName='particles', key='rlnImageName')): self.assertEqual(id1, row.rlnImageName) def getIter(): """ Test a function to get an iterator. """ return Table.iterRows(dataFile, tableName='particles', key='rlnImageName') iterByIds = getIter() for id1, row in zip(imageIds, iterByIds): self.assertEqual(id1, row.rlnImageName)
def test_readSetOfParticlesAfterCtf(self): if not Plugin.IS_GT30(): print("Skipping test (required Relion > 3.1)") return starFile = self.ds.getFile( "CtfRefine/job023/particles_ctf_refine.star") partsReader = Table.Reader(starFile, tableName='particles') firstRow = partsReader.getRow() partsSet = self.__readParticles(starFile) first = partsSet.getFirstItem() ogLabels = ['rlnBeamTiltX', 'rlnBeamTiltY'] extraLabels = ['rlnCtfBfactor', 'rlnCtfScalefactor', 'rlnPhaseShift'] for l in extraLabels: value = getattr(first, '_%s' % l) self.assertIsNotNone(value, "Missing label: %s" % l) self.assertAlmostEqual(getattr(firstRow, l), value) fog = OpticsGroups.fromImages(partsSet).first() self.assertTrue(all(hasattr(fog, l) for l in ogLabels)) # Also test writing and preserving extra labels outputStar = self.getOutputPath('particles.star') print(">>> Writing to particles star: %s" % outputStar) starWriter = convert.createWriter() starWriter.writeSetOfParticles(partsSet, outputStar) fog = OpticsGroups.fromStar(outputStar).first() self.assertTrue(all(hasattr(fog, l) for l in ogLabels)) partsReader = Table.Reader(outputStar, tableName='particles') firstRow = partsReader.getRow() for l in extraLabels: value = getattr(first, '_%s' % l) self.assertIsNotNone(value, "Missing label: %s" % l) self.assertAlmostEqual(getattr(firstRow, l), value)