예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
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