def createOutputStep(self): setEnviron() # Set the environment to access localrec modules import localrec import pyrelion # return inputSet = self._getInputParticles() outputSet = self._createSetOfCoordinates(inputSet) params = { "symmetryGroup": self.symmetryGroup.get(), "vector": self.vector.get(), "vectorFile": self.vectorFile.get(), "length": self.length.get(), "unique": self.unique.get(), "mindist": self.mindist.get(), "side": self.side.get(), "top": self.top.get(), "pxSize": self.inputParticles.get().getSamplingRate(), "dim": self.inputParticles.get().getXDim() } symMatrices = localrec.matrix_from_symmetry(self.symmetryGroup.get()) if self.defineVector == CMM: cmmFn = params["vectorFile"] vector = " " else: cmmFn = "" vector = params["vector"] subpartVectorList = localrec.load_vectors(cmmFn, vector, params["length"], params["pxSize"]) # Define some conditions to filter subparticles filters = localrec.load_filters(math.radians(params["side"]), math.radians(params["top"]), params["mindist"]) coord = Coordinate() for part in inputSet: partItem = pyrelion.Item() particleToRow(part, partItem) subparticles = self.getSubparticles(localrec, partItem, symMatrices, params, subpartVectorList, filters) for subpart in subparticles: rowToSubcoordinate(subpart, coord, part) coord.setObjId(None) # Force to insert as a new item outputSet.append(coord) if part.hasAttribute('_rlnRandomSubset'): coord._subparticle.copyAttributes(part, '_rlnRandomSubset') restituteRelionHome() self._defineOutputs(outputCoordinates=outputSet) self._defineSourceRelation(self.inputParticles, outputSet)
def createOutputStep(self): setEnviron() # Set the environment to access localrec modules import localrec import pyrelion # return inputSet = self._getInputParticles() outputSet = self._createSetOfCoordinates(inputSet) params = {"symmetryGroup" : self.symmetryGroup.get(), "vector" : self.vector.get(), "vectorFile" : self.vectorFile.get(), "length" : self.length.get(), "unique" : self.unique.get(), "mindist" : self.mindist.get(), "side" : self.side.get(), "top" : self.top.get(), "pxSize" : self.inputParticles.get().getSamplingRate(), "dim" : self.inputParticles.get().getXDim() } symMatrices = localrec.matrix_from_symmetry(self.symmetryGroup.get()) if self.defineVector == CMM: cmmFn = params["vectorFile"] vector = " " else: cmmFn = "" vector = params["vector"] subpartVectorList = localrec.load_vectors(cmmFn, vector, params["length"], params["pxSize"]) # Define some conditions to filter subparticles filters = localrec.load_filters(math.radians(params["side"]), math.radians(params["top"]), params["mindist"]) coord = Coordinate() for part in inputSet: partItem = pyrelion.Item() particleToRow(part, partItem) subparticles = self.getSubparticles(localrec, partItem, symMatrices, params, subpartVectorList, filters) for subpart in subparticles: rowToSubcoordinate(subpart, coord, part) coord.setObjId(None) # Force to insert as a new item outputSet.append(coord) if part.hasAttribute('_rlnRandomSubset'): coord._subparticle.copyAttributes(part, '_rlnRandomSubset') restituteRelionHome() self._defineOutputs(outputCoordinates=outputSet) self._defineSourceRelation(self.inputParticles, outputSet)
def create_subparticles(particle, symmetry_matrices, subparticle_vector_list, part_image_size, randomize, subparticles_total, align_subparticles): """ Obtain all subparticles from a given particle and set the properties of each such subparticle. """ # Euler angles that take particle to the orientation of the model matrix_particle = inv(particle.getTransform().getMatrix()) shifts, angles = geometryFromMatrix(matrix_particle) subparticles = [] subparticles_total += 1 symmetry_matrix_ids = range(1, len(symmetry_matrices) + 1) if randomize: # randomize the order of symmetry matrices, prevents preferred views random.shuffle(symmetry_matrix_ids) for subparticle_vector in subparticle_vector_list: matrix_from_subparticle_vector = subparticle_vector.get_matrix() for symmetry_matrix_id in symmetry_matrix_ids: # symmetry_matrix_id can be later written out to find out # which symmetry matrix created this subparticle symmetry_matrix = np.array(symmetry_matrices[symmetry_matrix_id - 1][0:3, 0:3]) subpart = particle.clone() m = np.matmul( matrix_particle[0:3, 0:3], (np.matmul(symmetry_matrix.transpose(), matrix_from_subparticle_vector.transpose()))) angles_org = -1.0 * np.ones(3) * euler_from_matrix(m, 'szyz') if align_subparticles: angles = -1.0 * np.ones(3) * euler_from_matrix(m, 'szyz') else: m2 = np.matmul(matrix_particle[0:3, 0:3], symmetry_matrix.transpose()) angles = -1.0 * np.ones(3) * euler_from_matrix(m2, 'szyz') # subparticle origin d = subparticle_vector.get_length() x = -m[0, 2] * d + shifts[0] y = -m[1, 2] * d + shifts[1] z = -m[2, 2] * d # save the subparticle coordinates (integer part) relative to the # user given image size and as a small shift in the origin (decimal part) x_d, x_i = math.modf(x) y_d, y_i = math.modf(y) alignment = em.Transform() alignmentOrg = em.Transform() M = matrixFromGeometry(np.array([-x_d, -y_d, 0]), angles, True) MOrg = matrixFromGeometry(np.array([-x_d, -y_d, 0]), angles_org, True) alignment.setMatrix(M) alignmentOrg.setMatrix(MOrg) subpart._transorg = alignmentOrg.clone() subpart.setTransform(alignment) coord = Coordinate() coord.setObjId(None) coord.setX(int(part_image_size / 2) - x_i) coord.setY(int(part_image_size / 2) - y_i) coord.setMicId(particle.getObjId()) if subpart.hasCTF(): ctf = subpart.getCTF() ctf.setDefocusU(subpart.getDefocusU() + z) ctf.setDefocusV(subpart.getDefocusV() + z) subpart.setCoordinate(coord) coord._subparticle = subpart.clone() subparticles.append(subpart) return subparticles