def scipion_split_particle_stacks(inputStar, inputStack, output, filename_prefix, deleteStack):
    """ Read a STAR file with particles and write as individual images.
    If a stack of images is given, use these instead of the images from the STAR file.
    Also write a new STAR file pointing to these images.
    This function requires that the script is run within Scipion Python environment. """

    import pyworkflow.utils as pwutils
    from pyworkflow.em import ImageHandler
    ih = ImageHandler()
    md = MetaData(inputStar)
    md.addLabels('rlnOriginalName')

    # Initialize progress bar
    progressbar = ProgressBar(width=60, total=len(md))

    for i, particle in enumerate(md, start=1):
        outputImageName = '%s/%s_%06d.mrc' % (output, filename_prefix, i)

        if inputStack:
            ih.convert((i, inputStack), outputImageName )
            particle.rlnOriginalName = '%s/%06d@%s' %(output, i, inputStack)
        else:
            ih.convert(particle.rlnImageName, outputImageName)
            particle.rlnOriginalName = particle.rlnImageName

        particle.rlnImageName = outputImageName

        progressbar.notify()

    print("\n")
    md.write("%s/%s.star" % (output, filename_prefix))

    if inputStack and deleteStack:
        pwutils.cleanPath(inputStack)
def reconstruct_subparticles(threads, output, maxres, sym, angpix, do_halves, library_path):
    """ Reconstruct subparticles. Also create two half maps using random subsets. """

    def run_reconstruct(input, suffix='', extraArgs=''):
        if threads>1 :
            cmd = ('mpirun -np %s relion_reconstruct_mpi ') % (threads)
        else:
            cmd = ('relion_reconstruct ')

        args = ('--sym %s %s --o %s%s.mrc --i %s.star --angpix %s') % (sym, extraArgs, input, suffix, input, angpix)
        run_command(cmd + args,"", library_path)

    for input in [output, output+'_subtracted']:
        args = ""
        inputStarName = input + '.star'
        if os.path.exists(inputStarName):
            md = MetaData(inputStarName)

            if "rlnDefocusU" in md.getLabels():
                args = args + "--ctf "
            else:
                print ("\nWarning: no CTF info found in %s!\n"
                       "The reconstruction will be performed without CTF correction.\n" % inputStarName)

            # reconstruct random halves to Nyquist frequency
            if "rlnRandomSubset" in md.getLabels() and do_halves:
                half1Star, half2Star = split_star_to_random_subsets(input)
                run_reconstruct(half1Star, "_class001_unfil", args)
                run_reconstruct(half2Star, "_class001_unfil", args)

            # reconstruct the map to maximum resolution given
            if maxres:
                args = args + "--maxres %s " % maxres
            run_reconstruct(input, '_class001', args)
def create_initial_stacks(input_star, angpix, masked_map, output, extract_from_micrographs, library_path):
    """ Create initial particle stacks (and STAR files) to be used
    for extraction of subparticles. If the masked_map is passed,
    another stack with subtracted particles will be created. """

    print(" Creating particle images from which nothing is subtracted...")
    split_particle_stacks(extract_from_micrographs, input_star, None, output, 'particles', deleteStack=False)

    if masked_map:
        print(" Creating particle images from which the projections of the masked "
              "particle reconstruction have been subtracted...")

        subtractedStackRoot = "%s/particles_subtracted" % output

        md = MetaData(input_star)
        args = " --i %s --o %s --ang %s --subtract_exp --angpix %s "
        if "rlnDefocusU" in md.getLabels():
            args = args + "--ctf "
        else:
            print ("\nWarning: no CTF info found in %s!\n"
                   "The subtraction will be performed without CTF correction.\n" % input_star)
        run_command("relion_project" + args %
                    (masked_map, subtractedStackRoot, input_star, angpix),"",library_path)
        run_command("mv %s.star %s_orig.star" % (subtractedStackRoot, subtractedStackRoot),"",library_path)

        subtractedStack = subtractedStackRoot + '.mrcs'

        split_particle_stacks(extract_from_micrographs, input_star, subtractedStack, output, 'particles_subtracted', deleteStack=True)
def create_initial_stacks(input_star, angpix, masked_map, output):
    """ Create initial particle stacks (and STAR files) to be used
    for extraction of subparticles. If the masked_map is passed,
    another stack with subtracted particles will be created. """

    print " Creating particle images from which nothing is subtracted..."
    scipion_split_particle_stacks(input_star, None, output, 'particles', deleteStack=False)

    if masked_map:
        print(" Creating particle images from which the projections of the masked "
              "particle reconstruction have been subtracted...")

        subtractedStackRoot = "%s/particles_subtracted" % output

        md = MetaData(input_star)
        args = " --i %s --o %s --ang %s --subtract_exp --angpix %s "
        if "rlnDefocusU" in md.getLabels():
            args = args + "--ctf "
        else:
            print ("\nWarning: no CTF info found in %s!\n"
                   "The subtraction will be performed without CTF correction.\n" % input_star)
        run_command("relion_project" + args %
                    (masked_map, subtractedStackRoot, input_star, angpix))
        run_command("mv %s.star %s_orig.star" % (subtractedStackRoot, subtractedStackRoot))

        subtractedStack = subtractedStackRoot + '.mrcs'

        scipion_split_particle_stacks(input_star, subtractedStack, output, 'particles_subtracted', deleteStack=True)
def reconstruct_subparticles(threads, output, maxres, sym, angpix):
    """ Reconstruct subparticles. Also create two half maps using random subsets. """

    def run_reconstruct(input, suffix='', extraArgs=''):
        cmd = ('relion_reconstruct ')
        args = ('--sym %s --j %s %s --o %s%s.mrc --i %s.star --angpix %s') % (sym, threads, extraArgs, output, suffix, input, angpix)
        run_command(cmd + args)

    for input in [output, output+'_subtracted']:
        args = ""
        inputStarName = input + '.star'
        if os.path.exists(inputStarName):
            md = MetaData(inputStarName)

            if "rlnDefocusU" in md.getLabels():
                args = args + "--ctf "
            else:
                print ("\nWarning: no CTF info found in %s!\n"
                       "The reconstruction will be performed without CTF correction.\n" % inputStarName)

            # reconstruct random halves to Nyquist frequency
            if "rlnRandomSubset" in md.getLabels():
                half1Star, half2Star = split_star_to_random_subsets(input)
                run_reconstruct(half1Star, "_half1_class001_unfil", args)
                run_reconstruct(half2Star, "_half2_class001_unfil", args)

            # reconstruct the map to maximum resolution given
            if maxres:
                args = args + "--maxres %s " % maxres
            run_reconstruct(input, '_class001', args)
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print "Remove overlapping particles..."

        md = MetaData(args.input_star)
        mdOut = MetaData()
        mdOut.addLabels(md.getLabels())

        new_particles = []

        # get list of tags 'micrographs' but can be anything that defines
        # a set of particles to compare
        if args.originalParticles:
            micrographs = self.get_originalParticleNames(md)
        else:
            micrographs = self.get_micrographs(md)

        for micrograph in micrographs:
            print "Processing micrograph %s..." % micrograph,
            particles = self.get_particles(md, micrograph)
            particles_unique = self.remove_overlapping_particles(particles, args.mindist)
            new_particles.extend(particles_unique)
            print "%s particle(s) kept." % len(particles_unique)

        mdOut.addData(new_particles)
        mdOut.write(args.output)

        print "All done!"
def create_star(subparticles, star_filename):
    """ Create a Relion style STAR file for extracting (using relion_preprocess)
    all the subparticles for a given particle. """

    md = MetaData()
    md.addLabels("rlnCoordinateX", "rlnCoordinateY")
    md.addData(subparticles)
    md.write(star_filename)
示例#8
0
def write_sorted_mic_star(folder, input_files, use_tilt_order_files,
                          custom_tilt_order, tilt_scheme, min_angle,
                          angle_step, starting_tilt_angle, tomo_name,
                          write_tilt_order_files, mic_id,
                          dose_symmetric_group_size,
                          dose_symmetric_groups_not_centered):
    file_list = glob.glob(folder + '/' + input_files)
    if sort_by_name:
        file_list = sorted(file_list)
    else:
        file_list.sort(key=os.path.getmtime)
    total_tilts = len(file_list)

    if total_tilts == 0:
        print('####')
        print('No images found for %s' % tomo_name)
        print('####')
        return MetaData(), mic_id

    order_list, doses_list, tilt_order_path, used_custom_or_file_tilt_order = parse_tilt_order_and_dose(
        folder, False, False, use_tilt_order_files, custom_tilt_order,
        total_tilts, tilt_scheme, min_angle, angle_step, starting_tilt_angle,
        tomo_name, None, None, write_tilt_order_files,
        dose_symmetric_group_size, dose_symmetric_groups_not_centered)
    if not used_custom_or_file_tilt_order:
        tilt_list = [
            min_angle + (angle_step * i) for i in range(0, total_tilts)
        ]
    else:
        print(
            'No tilt angle information available for the tilt angle star from %s.'
            % tomo_name)
        tilt_list = [None] * total_tilts

    md = MetaData()
    for i, (order, tilt) in enumerate(zip(order_list, tilt_list)):
        file = file_list[order - 1]
        p = Item()
        p.rlnMicrographName = file
        p.rlnMicrographId = mic_id
        ## extra labels
        p.rlnTiltAngle = tilt
        p.rlnTiltNumber = i + 1
        p.rlnTomoName = tomo_name
        mic_id += 1
        md.addItem(p)
    return md, mic_id
def create_star(subparticles, star_filename):
    """ Create a Relion style STAR file for extracting (using relion_preprocess)
    all the subparticles for a given particle. """

    md = MetaData()
    md.addLabels("rlnCoordinateX", "rlnCoordinateY")
    md.addData(subparticles)
    md.write(star_filename)
示例#10
0
    def main(self):

        self.define_parser()
        args = self.parser.parse_args()

        if len(sys.argv) == 1:
            self.error("No input particles STAR file given.")

        print "Creating coordinate files..."

        md = MetaData(args.input_star)

        for particle in md:
            coordinates_file = os.path.splitext(
                particle.rlnMicrographName)[0] + "_" + args.suffix + ".star"

            if "rlnOriginX" in md.getLabels():
                particle.rlnCoordinateX = int(particle.rlnCoordinateX -
                                              particle.rlnOriginX)
            if "rlnOriginY" in md.getLabels():
                particle.rlnCoordinateY = int(particle.rlnCoordinateY -
                                              particle.rlnOriginY)

            if not os.path.isfile(coordinates_file):
                star = open(coordinates_file, "a")
                star.write("\n")
                star.write("data_images\n")
                star.write("\n")
                star.write("loop_\n")
                star.write("_rlnMicrographName #1\n")
                star.write("_rlnCoordinateX #2\n")
                star.write("_rlnCoordinateY #3\n")
                if "rlnAnglePsi" in md.getLabels():
                    star.write("_rlnAnglePsi #4\n")
                if "rlnAnglePsiPrior" in md.getLabels():
                    star.write("_rlnAnglePsiPrior #5\n")
                star.close()

            if os.path.isfile(coordinates_file):
                star = open(coordinates_file, "a")
                star.write("%s\t%f\t%f\t" %
                           (os.path.basename(particle.rlnMicrographName),
                            particle.rlnCoordinateX, particle.rlnCoordinateY))
                if "rlnAnglePsi" in md.getLabels():
                    star.write("%f\t" % (particle.rlnAnglePsi))
                if "rlnAnglePsiPrior" in md.getLabels():
                    star.write("%f\t" % (particle.rlnAnglePsiPrior))
                star.write("\n")
                star.close()
示例#11
0
def test_particles():
    # We can also read particles star files

    md = MetaData("particles.star")

    # For example, we could remove particles meeting some criteria

    good = [particle for particle in md
            if float(particle.rlnParticleSelectZScore) > 0.5]

    # There are some Relion star labels that are read as string
    # so we need to care to convert them to the proper Python data type

    md.setData(good)

    print md.size() # should be 36 for the provided star file

    md.write('particles_good.star')
示例#12
0
def test_ctf():
    # Copy all the values from the micrograph star file to particles

    input_filename = "particles.star"
    ctf_filename = "micrographs.star"

    inputMd = MetaData(input_filename)
    ctfMd = MetaData(ctf_filename)
    # Add labels from CTF star
    ctfLabels =  ctfMd.getLabels()
    inputMd.addLabels(ctfLabels)
    # Index micrographs by name in a dictionary to retrieve from particles
    micDict = {}

    for mic in ctfMd:
        micDict[mic.rlnMicrographName] = mic

    for particle in inputMd:
        mic = micDict[particle.rlnMicrographName]
        particle.copyValues(mic, *ctfLabels)

    inputMd.write('particles_ctf.star')
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print "Creating symmetry related particles..."

        md = MetaData(args.input_star)
        mdOut = MetaData()
        mdOut.addLabels(md.getLabels())
        
        new_particles = []

        symmetry_matrices = matrix_from_symmetry(args.sym)

        for particle in md:
            angles_to_radians(particle)
            new_particles.extend(create_symmetry_related_particles(particle, symmetry_matrices, args.random))
        mdOut.addData(new_particles)
        mdOut.write(args.output)

        print "All done!"
        print " "
示例#14
0
def main(imod_edf_files, ctf_star, version, average_by_angle):
    edf_list = sorted(glob.glob(imod_edf_files))
    edf_folders = [os.path.dirname(i) for i in edf_list]
    edf_folders = ['.'] if edf_folders == [''] else edf_folders
    edf_names = [os.path.splitext(os.path.basename(i))[0] for i in edf_list]
    ctf_md = MetaData(ctf_star)
    md_dict = split_by_folder(ctf_md)
    if average_by_angle != None:
        md_dict = average_defocus_outside_angle(md_dict, edf_folders, edf_names, average_by_angle, do_average_phase_shift)
    for edf_folder, edf_name in zip(edf_folders,edf_names):
        try:
            md = md_dict[edf_folder]
        except:
            print('imod folder "%s" not found in the star file.' % edf_folder)
            continue
        if version == '2' or version == '3':
            write_imod_defocus_file(md, edf_folder, edf_name, int(version))
        elif version == 'novactf':
            write_nova_ctf_defocus(md, edf_folder, edf_name, novactf_append)
        elif version == 'star':
            write_separate_stars(md, edf_folder, edf_name, star_append)
示例#15
0
def split_particle_stacks(extract_from_micrographs, inputStar, inputStack, output, filename_prefix, deleteStack):
    """ Read a STAR file with particles and write as individual images.
    If a stack of images is given, use these instead of the images from the STAR file.
    Also write a new STAR file pointing to these images.
    This function requires that the script is run within Scipion Python environment. """

    md = MetaData(inputStar)
    md.addLabels('rlnOriginalName')

    # Initialize progress bar
    progressbar = ProgressBar(width=60, total=len(md))

    for i, particle in enumerate(md, start=1):
        outputImageName = '%s/%s_%06d.mrc' % (output, filename_prefix, i)

        # split stacks only if not extracting directly from micrographs
        if not extract_from_micrographs:
            if inputStack:
                splitMrcStack('%06d@%s' %(i, inputStack), outputImageName)
                particle.rlnOriginalName = '%s/%06d@%s' %(output, i, inputStack)
            else:
                splitMrcStack(particle.rlnImageName, outputImageName)
                particle.rlnOriginalName = particle.rlnImageName
            particle.rlnImageName = outputImageName
            particle.rlnMicrographName = outputImageName
        else:
            particle.rlnOriginalName = particle.rlnImageName
            particle.rlnImageName = '%s/%s' % (output, particle.rlnMicrographName.split('/').pop())

        progressbar.notify()

    print("\n")
    md.write("%s/%s.star" % (output, filename_prefix))

    if inputStack and deleteStack:
        cleanPath(inputStack)
示例#16
0
def test_micrographs():
    # Create a new metadata and read micrograph star file

    md = MetaData("micrographs.star")

    # Just print its content
    md.printStar()

    # We can query the number of rows (micrographs in this case)  in the metadata

    print md.size() # should be 15 for the provided  micrographs.star file


    # We can checkout the columns (or labels) of the star file

    print md.getLabels()

    # We can remove the CTF related columns and write a new star file

    md.removeLabels('rlnDefocusU', 'rlnDefocusV', 'rlnDefocusAngle')


    # We can fill a column value with a constant
    # (if the column does not exists, it will be added)

    md.setLabels(rlnCtfFigureOfMerit=0, rlnDetectorPixelSize=7,
                 rlnRandomSubset=999)

    # Finally let's write our new micrographs star file
    md.write('micrograhs_noctf.star')
    def main(self):

        self.define_parser()
        args = self.parser.parse_args()

        #self.validate(args)

        md = MetaData(args.input_star)
        mdOut = MetaData()
        mdOut.addLabels(md.getLabels())
        cl = MetaData(args.classes)
        particle_halfsize = args.size / 2

        particles_out = []

        for reference in cl:
            self.angles_to_radians(reference, cl.getLabels())

        for i, particle in enumerate(md):
            self.angles_to_radians(particle, md.getLabels())

            print "doing particle %s" % i

            referenceOriginX = 0
            referenceOriginY = 0

            # search for the right reference for this particle
            for reference in cl:
                if reference.rlnClassNumber == particle.rlnClassNumber:
                    referenceOriginX = reference.rlnCoordinateX - particle_halfsize
                    referenceOriginY = reference.rlnCoordinateY - particle_halfsize
                    psi = particle.rlnAnglePsi
                    particle.rlnOriginX = particle.rlnOriginX - (
                        referenceOriginX * math.cos(-psi) -
                        referenceOriginY * math.sin(-psi))
                    particle.rlnOriginY = particle.rlnOriginY - (
                        referenceOriginY * math.cos(-psi) +
                        referenceOriginX * math.sin(-psi))
                    if "rlnAngleRot" in cl.getLabels():
                        particle.rlnAngleRot = particle.rlnAngleRot + reference.rlnAngleRot
                    if "rlnAngleTilt" in cl.getLabels():
                        particle.rlnAngleTilt = particle.rlnAngleTilt + reference.rlnAngleTilt
                    if "rlnAnglePsi" in cl.getLabels():
                        particle.rlnAnglePsi = particle.rlnAnglePsi + reference.rlnAnglePsi

                    particles_out.append(particle)
                    break

            self.angles_to_degrees(particle, md)

        mdOut.addData(particles_out)
        mdOut.write(args.output)
def split_star_to_random_subsets(inputStarRoot):
    inputStarName = inputStarRoot+'.star'
    md = MetaData(inputStarName)
    mdHalf1 = MetaData()
    mdHalf2 = MetaData()

    half1StarRoot = inputStarRoot+'_half1'
    half2StarRoot = inputStarRoot+'_half2'

    half1StarName = half1StarRoot+'.star'
    half2StarName = half2StarRoot+'.star'

    particlesHalf1 = []
    particlesHalf2 = []

    for particle in md:
        if particle.rlnRandomSubset % 2 == 1:
            particlesHalf1.append(particle.clone())
        if particle.rlnRandomSubset % 2 == 0:
            particlesHalf2.append(particle.clone())

    mdHalf1.addData(particlesHalf1)
    mdHalf2.addData(particlesHalf2)
    labels = md.getLabels()
    mdHalf1.addLabels(labels)
    mdHalf2.addLabels(labels)
    mdHalf1.write(half1StarName)
    mdHalf2.write(half2StarName)

    return half1StarRoot, half2StarRoot
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        # Validate input arguments and required software
        self.validate(args)

        run_command("mkdir -p " + args.output, "/dev/null")

        if args.prepare_particles:
            print "Preparing particles for extracting subparticles."
            create_initial_stacks(args.input_star, args.angpix, args.masked_map, args.output)
            print "\nFinished preparing the particles!\n"

        if args.create_subparticles:
            # Load subparticle vectors either from Chimera CMM file or from
            # command line (command and semi-colon separated)
            # Distances can also be specified to modify vector lengths
            subparticle_vector_list = load_vectors(args.cmm, args.vector,
                                                   args.length, args.angpix)

            particles_star = args.output + "/particles.star"

            if not os.path.exists(args.output + "/particles.star"):
                self.error("Input file '%s not found. "
                           "Run the script first with --prepare_particles option."
                           % particles_star)

            md = MetaData(particles_star)
            print "Creating subparticles..."

            # Initialize progress bar
            progressbar = ProgressBar(width=60, total=len(md))

            # Generate symmetry matrices with Relion convention
            symmetry_matrices = matrix_from_symmetry(args.sym)

            # Define some conditions to filter subparticles
            filters = load_filters(radians(args.side), radians(args.top), args.mindist)

            # Compute all subparticles (included subtracted if masked_map given)
            mdOut = MetaData()
            mdOutSub = MetaData()

            for particle in md:
                subparticles, subtracted = create_subparticles(particle,
                                                       symmetry_matrices,
                                                       subparticle_vector_list,
                                                       args.particle_size,
                                                       args.randomize,
                                                       args.output,
                                                       args.unique,
                                                       len(mdOut),
                                                       args.align_subparticles,
                                                       args.masked_map,
                                                       True,
                                                       filters,
                                                       args.angpix)

                mdOut.addData(subparticles)
                mdOutSub.addData(subtracted)

                progressbar.notify()

            md.removeLabels('rlnOriginZ', 'rlnOriginalName')
            write_output_starfiles(md.getLabels(), mdOut, mdOutSub, args.output)

            print "\nFinished creating the subparticles!\n"

        if args.extract_subparticles:
            print "Extracting subparticles..."
            extract_subparticles(args.subparticle_size, args.np, args.masked_map, args.output, deleteParticles=True)
            print "\nFinished extracting the subparticles!\n"

        if args.reconstruct_subparticles:
            print "Reconstructing subparticles..."
            reconstruct_subparticles(args.j, args.output, args.maxres, args.subsym, args.angpix)
            print "\nFinished reconstructing the subparticles!\n"

        print "\nAll done!\n"
示例#20
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print "Creating rotated particles..."

        md = MetaData(args.input_star)

        if args.vector and len(args.angles) != 0:
            print "Please only provide a vector or a triplet of Euler angles for the particle rotation."
            sys.exit(0)
        elif args.vector:
            vectors = load_vectors(None, args.vector, None, 1)
            rot_matrix = vectors[0].matrix()
        elif len(args.angles) != 0:
            angles = args.angles.split(',')
            if len(angles) != 3:
                print "Please provide exactly 3 Euler angles for the particle rotation."
                sys.exit(0)
            else:
                rot_rot = math.radians(float(angles[0]))
                rot_tilt = math.radians(float(angles[1]))
                rot_psi = math.radians(float(angles[2]))
                rot_matrix = matrix_from_euler(rot_rot, rot_tilt, rot_psi)
        else:
            print "Please provide a vector or a triplet of Euler angles for the particle rotation."
            sys.exit(0)

        new_particles = []
        mdOut = MetaData()
        mdOut.addLabels(md.getLabels())
        for particle in md:
            new_particle = particle.clone()
            
            angles_to_radians(particle)

            rot = particle.rlnAngleRot
            tilt = particle.rlnAngleTilt
            psi = particle.rlnAnglePsi

            matrix_particle = matrix_from_euler(rot, tilt, psi)

            m = matrix_multiply(matrix_particle, matrix_transpose(rot_matrix))
            rotNew, tiltNew, psiNew = euler_from_matrix(m)

            new_particle.rlnAngleRot = rotNew
            new_particle.rlnAngleTilt = tiltNew
            new_particle.rlnAnglePsi = psiNew

            angles_to_degrees(new_particle)
            new_particles.append(new_particle)

        mdOut.addData(new_particles)
        mdOut.write(args.output)

        print "All done!"
        print " "
示例#21
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print "Calculating symmetry related orientations..."

        md = MetaData(args.input_star)
        mdOut = MetaData()
        mdOut.addLabels(md.getLabels())
        mdOut.addLabels('rlnAngleRotPrior', 'rlnAngleTiltPrior',
                        'rlnAnglePsiPrior')
        mdOut.removeLabels('rlnOriginalParticleName', 'rlnParticleName')

        new_particles = []

        symmetry_matrices = matrix_from_symmetry(args.sym)

        for particle in md:
            angles_to_radians(particle)
            new_particles.extend(
                create_symmetry_related_particles(particle, symmetry_matrices,
                                                  True))
        mdOut.addData(new_particles)

        for particle in mdOut:
            particle.rlnAngleRotPrior = particle.rlnAngleRot
            particle.rlnAngleTiltPrior = particle.rlnAngleTilt
            particle.rlnAnglePsiPrior = particle.rlnAnglePsi

        mdOut.write(args.output)

        print "Calculating an asymmetric reconstruction..."
        runProgram(
            'relion_reconstruct',
            '--i %s --o %s --ctf --sym C1 --angpix %s --maxres %s --j %s' %
            (args.output, args.map, args.angpix, args.maxres, args.j))

        print " "
        print "All done!"
        print " "
示例#22
0
def split_by_folder(md):
    current_dir = os.path.dirname(md._data[0].rlnMicrographName) if os.path.dirname(md._data[0].rlnMicrographName) != "" else '.'
    temp_md = MetaData()
    md_dict = {}
    for p in md:
        folder = os.path.dirname(p.rlnMicrographName) if os.path.dirname(p.rlnMicrographName) != "" else '.'
        if folder == current_dir:
            temp_md.addItem(p)
        else:
            temp_md.addLabels(md.getLabels())
            md_dict[current_dir] = temp_md
            current_dir = folder
            temp_md = MetaData()
            temp_md.addItem(p)
    temp_md.addLabels(md.getLabels())
    md_dict[current_dir] = temp_md
    return md_dict
示例#23
0
def average_defocus_outside_angle(md_dict, edf_folders, edf_names, angle, do_average_phase_shift):
    corrected_md_dict = {}
    corrected_md = MetaData()
    labels = md_dict[edf_folders[0]].getLabels()
    do_average_phase_shift = False if 'rlnPhaseShift' not in labels else do_average_phase_shift
    corrected_md.addLabels(labels)
    for edf_folder, edf_name in zip(edf_folders,edf_names):
        try:
            md = md_dict[edf_folder]
        except:
            print('imod folder "%s" not found in the star file.' % edf_folder)
            continue
        imod_file_root = get_imod_file_root(edf_name, edf_folder)
        if use_estimated_tilt_angles:
            tlt_file_name = '%s.tlt' % (imod_file_root)
        else:
            tlt_file_name = '%s.rawtlt' % (imod_file_root)
        if not os.path.isfile(tlt_file_name):
            print('Cannot find "%s". Make sure the tilt series has been aligned before executing this script!' % tlt_file_name)
            return
        tilt_list = read_tilt_angles(tlt_file_name)
        average_list = []
        average_md = MetaData()
        apply_list = []
        for i,(tilt,p) in enumerate(zip(tilt_list, md)):
            if abs(tilt) <= abs(angle):
                average_list.append(i)
                average_md.addItem(p)
            else:
                apply_list.append(i)
        if len(average_list) == 0: #check that averaging is possible
            print('No tilt angles found with the range specified for %s' % edf_name)
            corrected_md_dict[edf_folder] = md
            corrected_md.addData(md)
            continue
        if len(apply_list) == 0:
            print('No tilt angles found outside the range specified to apply defocus to for %s' % edf_name)
            corrected_md_dict[edf_folder] = md
            corrected_md.addData(md)
            continue
        #caluclate the average
        average = sum([(p.rlnDefocusU+p.rlnDefocusV)/2 for p in average_md])/len(average_list)
        if do_average_phase_shift:
            phase_average = sum([float(p.rlnPhaseShift) for p in average_md])/len(average_list)
        print('Taking the average defocus of tilts %d to %d (%f angstrom) and applying it to the following tilts for %s; %s' % (min(average_list)+1, max(average_list)+1, average, edf_name, ', '.join([str(apply+1) for apply in apply_list])))
        if do_average_phase_shift:
            print('Also applying the average phase shift (%f degrees) to those tilts' % (phase_average))
        for i,p in enumerate(md):
            if i in apply_list:
                p.rlnDefocusU = average
                p.rlnDefocusV = average
                p.rlnDefocusAngle = 0
                if do_average_phase_shift:
                    p.rlnPhaseShift = phase_average
        corrected_md_dict[edf_folder] = md
        corrected_md.addData(md)
    if write_averaged_defocus_star:
        print('Writing out star file with averaged defocus values to %s' % averaged_defocus_star_file)
        corrected_md.write(averaged_defocus_star_file)
    return corrected_md_dict
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        # Validate input arguments and required software
        self.validate(args)

        try:
            os.makedirs(args.output)
        except OSError:
            if not os.path.isdir(args.output):
                raise

        if args.prepare_particles:
            print("Preparing particles for extracting subparticles.")
            create_initial_stacks(args.input_star, args.angpix,
                                  args.masked_map, args.output,
                                  args.extract_from_micrographs,
                                  args.library_path)
            print("\nFinished preparing the particles!\n")

        if args.create_subparticles:
            # Load subparticle vectors either from Chimera CMM file or from
            # command line (command and semi-colon separated)
            # Distances can also be specified to modify vector lengths
            subparticle_vector_list = load_vectors(args.cmm, args.vector,
                                                   args.length, args.angpix)

            particles_star = args.output + "/particles.star"

            if not os.path.exists(args.output + "/particles.star"):
                self.error(
                    "Input file '%s not found. "
                    "Run the script first with --prepare_particles option." %
                    particles_star)

            md = MetaData(particles_star)

            # Get particle / micrograph size
            if args.extract_from_micrographs:
                mrcFilename = md._data[0].rlnMicrographName
                print("Micrograph image size:")
            else:
                mrcFilename = md._data[0].rlnImageName
                print("Particle image size:")

            mrcFile = open(mrcFilename, "rb")
            particleImageSizeX = int(struct.unpack('i', mrcFile.read(4))[0])
            particleImageSizeY = int(struct.unpack('i', mrcFile.read(4))[0])
            mrcFile.close()
            print("%s, %s pixels\n" % (particleImageSizeX, particleImageSizeY))

            print("Creating subparticles...")

            # Generate symmetry matrices with Relion convention
            symmetry_matrices = matrix_from_symmetry(args.sym,
                                                     args.library_path)

            # Initialize progress bar
            progressbar = ProgressBar(width=60, total=len(md))

            # Define some conditions to filter subparticles
            filters = load_filters(radians(args.side), radians(args.top),
                                   args.mindist)

            # Compute all subparticles (included subtracted if masked_map given)
            mdOut = MetaData()
            mdOutSub = MetaData()

            for particle in md:
                subparticles, subtracted = create_subparticles(
                    particle, symmetry_matrices, subparticle_vector_list,
                    particleImageSizeX, particleImageSizeY, args.randomize,
                    args.output, args.unique, len(mdOut),
                    args.align_subparticles, args.masked_map,
                    args.extract_from_micrographs, True, filters, args.angpix)

                mdOut.addData(subparticles)
                mdOutSub.addData(subtracted)

                progressbar.notify()

            md.removeLabels('rlnOriginZ', 'rlnOriginalName')

            write_output_starfiles(md.getLabels(), mdOut, mdOutSub,
                                   args.output)

            if args.extract_from_micrographs:
                md.setData(unique_micrographs(md))

            md.write("%s/%s.star" % (args.output, 'micrographs'))

            if len(mdOutSub):
                mdOutSub.setData(unique_micrographs(mdOutSub))
                mdOutSub.write("%s/%s.star" %
                               (args.output, 'micrographs_subtracted'))

            print("\nFinished creating the subparticles!\n")

        if args.extract_subparticles:
            print("Extracting subparticles...")
            if args.extract_from_micrographs:
                if not args.create_subparticles:
                    md = MetaData(args.output + "/particles.star")
                extract_subparticles(
                    args.subparticle_size, args.np, args.masked_map,
                    args.output, args.library_path,
                    args.only_extract_unfinished, args.invert_contrast,
                    args.normalize, False,
                    md._data[0].rlnMicrographName.split('/').pop(0))
            else:
                extract_subparticles(args.subparticle_size, args.np,
                                     args.masked_map, args.output,
                                     args.library_path,
                                     args.only_extract_unfinished,
                                     args.invert_contrast, args.normalize,
                                     True, args.output)
            print("\nFinished extracting the subparticles!\n")

        if args.reconstruct_subparticles:
            print("Reconstructing subparticles...")
            reconstruct_subparticles(args.j, args.output, args.maxres,
                                     args.subsym, args.angpix, args.do_halves,
                                     args.library_path)
            print("\nFinished reconstructing the subparticles!\n")

        print("\nAll done!\n")
示例#25
0
def main(input_files, input_folders, mic_star, tomo_name, tilt_scheme,
         min_angle, angle_step, pixel_size, only_make_sorted_mic_star,
         only_do_unfinished, use_tilt_order_files, custom_tilt_order,
         write_tilt_order_files, starting_tilt_angle, only_print_command,
         rln_version, ctf_software, CS, HT, AmpCnst, Box, ResMin, ResMax,
         dFMin, dFMax, FStep, dAst, ctfWin, cores, gpu, ctf_exe, ctf_star,
         write_tilt_angle_star, do_phaseshift, phase_min, phase_max,
         phase_step, dose_symmetric_group_size,
         dose_symmetric_groups_not_centered):

    if mic_star == None:
        if input_folders != None:
            folder_list = sorted(glob.glob(input_folders))
            folder_list = [dir for dir in folder_list if os.path.isdir(dir)]
        else:
            folder = '/'.join(input_files.split('/')[0:-1])
            folder_list = ['.'] if folder == '' else [folder]
            input_files = input_files.split('/')[-1]

        mic_md = MetaData()
        mic_id = 1
        for folder in folder_list:
            if input_folders != None:
                tomo_name = folder.split('/')[-1]

            #Main script for individual tilt series
            tomo_mic_md, mic_id = write_sorted_mic_star(
                folder, input_files, use_tilt_order_files, custom_tilt_order,
                tilt_scheme, min_angle, angle_step, starting_tilt_angle,
                tomo_name, write_tilt_order_files, mic_id,
                dose_symmetric_group_size, dose_symmetric_groups_not_centered)
            mic_md.addData(tomo_mic_md)

        mic_md.addLabels(['rlnMicrographName'])

        mic_md.write(default_micrograph_star_file)

        if write_tilt_angle_star:
            mic_md.addLabels('rlnMicrographId', 'rlnTiltNumber',
                             'rlnTiltAngle', 'rlnTomoName')
            mic_md.write(default_tilt_angle_star_file)

        mic_star = default_micrograph_star_file

    if only_make_sorted_mic_star == True:
        print('Only making sorted micrograph star... quitting.')
        return

    run_ctffind(mic_star, ctf_star, pixel_size, ctfWin, CS, HT, AmpCnst, Box,
                ResMin, ResMax, dFMin, dFMax, FStep, dAst, ctf_exe, cores,
                only_print_command, rln_version, ctf_software, gpu,
                only_do_unfinished, do_phaseshift, phase_min, phase_max,
                phase_step)

    print("")
    print(
        "You can inspect the ctf estimation quality by running 'relion_display' on the resulting star file with the '--display rlnCtfImage option'"
    )
    print(
        "Once you have aligned the tilt series in imod, use the 'tomo_write_imod_defocus' script to write the estimated ctf parameters into imod compatible .defocus files."
    )
示例#26
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print "Creating symmetry related particles..."

        md = MetaData(args.input_star)
        mdOut = MetaData()
        mdOut.addLabels(md.getLabels())

        new_particles = []

        symmetry_matrices = matrix_from_symmetry(args.sym)

        for particle in md:
            angles_to_radians(particle)
            new_particles.extend(
                create_symmetry_related_particles(particle, symmetry_matrices,
                                                  args.random))
        mdOut.addData(new_particles)
        mdOut.write(args.output)

        print "All done!"
        print " "
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print "Remove overlapping particles..."

        md = MetaData(args.input_star)
        mdOut = MetaData()
        mdOut.addLabels(md.getLabels())
        
        new_particles = []
        
        # get list of tags 'micrographs' but can be anything that defines
        # a set of particles to compare
        if args.originalParticles:
            micrographs = self.get_originalParticleNames(md)
        else:
            micrographs = self.get_micrographs(md)

        for micrograph in micrographs:
            print "Processing micrograph %s..." % micrograph,
            particles = self.get_particles(md, micrograph)           
            particles_unique = self.remove_overlapping_particles(particles, args.mindist)
            new_particles.extend(particles_unique)
            print "%s particle(s) kept." % len(particles_unique)

        mdOut.addData(new_particles)
        mdOut.write(args.output)

        print "All done!"
示例#28
0
def split_star_to_random_subsets(inputStarRoot):
    inputStarName = inputStarRoot+'.star'
    md = MetaData(inputStarName)
    mdHalf1 = MetaData()
    mdHalf2 = MetaData()

    half1StarRoot = inputStarRoot+'_half1'
    half2StarRoot = inputStarRoot+'_half2'

    half1StarName = half1StarRoot+'.star'
    half2StarName = half2StarRoot+'.star'

    particlesHalf1 = []
    particlesHalf2 = []

    for particle in md:
        if particle.rlnRandomSubset % 2 == 1:
            particlesHalf1.append(particle.clone())
        if particle.rlnRandomSubset % 2 == 0:
            particlesHalf2.append(particle.clone())

    mdHalf1.addData(particlesHalf1)
    mdHalf2.addData(particlesHalf2)
    labels = md.getLabels()
    mdHalf1.addLabels(labels)
    mdHalf2.addLabels(labels)
    mdHalf1.write(half1StarName)
    mdHalf2.write(half2StarName)

    return half1StarRoot, half2StarRoot