예제 #1
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()
        self.validate(args)

        print("Performing rotation of particles from star file...")

        md = MetaData(args.i)

        new_particles = []

        particles = self.get_particles(md)

        new_particles.extend(
            self.rotateParticles(particles, rotValue, tiltValue, psiValue,
                                 xValue, yValue, zValue, md.version))
        mdOut = MetaData()

        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, new_particles)

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #2
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        md = MetaData(args.i)

        print("Reading in input star file.....")

        micrographs = self.get_micrographs(md)

        print(
            "Total %s micrographs in input star file. \nRenaming to micXXX convention."
            % str(len(micrographs)))

        self.renameMicrographs(micrographs, args.mic_dir)

        mdOut = MetaData()
        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, micrographs)

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #3
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        md = MetaData(args.i)
        md.addLabels("data_particles", "rlnBeamTiltClass")

        print("Reading in input star file.....")

        particles = self.get_particles(md)

        print(
            "Total %s particles in input star file. \nAdding rlnBeamTiltClass."
            % str(len(particles)))

        self.addBeamTiltClass(particles)

        mdOut = MetaData()
        mdOut.addDataTable("data_")
        mdOut.addLabels("data_", md.getLabels("data_"))
        mdOut.addData("data_", particles)
        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #4
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print("Making orientation heatmap from star file...")

        md = MetaData(args.i)

        particles = self.get_particles(md)

        new_particles = []

        new_particles.extend(self.removePrefOrient(particles, args.sd))

        mdOut = MetaData()

        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, new_particles)
        mdOut.write(args.o)

        print("File %s was created..." % args.o)

        print("Finished. Have fun!")
예제 #5
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print("Selecting particles/micrographs from star file...")

        md = MetaData(args.i)

        if md.version == "3.1":
            ilabels = md.getLabels("data_particles")
        else:
            ilabels = md.getLabels("data_")

        if ("rlnDefocusU" not in ilabels) or ("rlnDefocusV" not in ilabels):
            self.error(
                "No labels rlnDefocusU or rlnDefocusV found in Input file.")
        if ("rlnFinalResolution" not in ilabels) and (args.res > 0):
            print(
                "No label rlnFinalResolution found in input file. Switching off resolution filtering..."
            )
            args.res = 0

        mdOut = MetaData()

        new_particles = []

        particles = self.get_particles(md)

        new_particles.extend(
            self.selParticles(
                particles,
                args.astg,
                args.res,
            ))

        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, new_particles)
        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #6
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()
        compValue, selValue, rangeHi, rangeLo, rangeSel = self.validate(args)

        if args.sellb == "None":
            print("Performing math on all particles from star file...")
        else:
            if rangeSel:
                print(
                    "Performing math on particles where %s is in range <%s, %s>."
                    % (args.sellb, rangeLo, rangeHi))
            else:
                print("Performing math on particles where %s is %s %s." %
                      (args.sellb, args.selop, selValue))

        md = MetaData(args.i)

        if md.version == "3.1":
            ilabels = md.getLabels("data_particles")
        else:
            ilabels = md.getLabels("data_")

        if args.lb not in ilabels:
            self.error("No label " + args.lb + " found in Input file.")

        new_particles = []

        particles = self.get_particles(md)
        new_particles.extend(
            self.mathParticles(particles, args.lb, args.op, compValue,
                               args.selop, args.sellb, selValue, rangeHi,
                               rangeLo, rangeSel))

        mdOut = MetaData()

        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, new_particles)
        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #7
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print("Binning correct input star file. Using binning factor %s." % str(args.bin_factor))

        md = MetaData(args.i)

        new_particles = []

        particles = self.get_particles(md)

        if (hasattr(particles[0], 'rlnOriginX')) and (hasattr(particles[0], 'rlnOriginY')):
            correctOrigin = True
        else:
            print("Note: rlnOriginX or rlnOriginY not found in input star file. Not correcting for particle shift.")
            correctOrigin = False

        if hasattr(particles[0], 'rlnDetectorPixelSize'):
            correctApix = True
        else:
            print("Note: rlnDetectorPixelSize not found in input star file. Not correcting for pixel size.")
            correctApix = False

        new_particles.extend(
            self.binParticles(particles, args.bin_factor, correctOrigin, correctApix, args.suf_orig, args.suf_new))

        mdOut = MetaData()
        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, new_particles)

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #8
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        md = MetaData(args.i)
        if md.version != "3.1":
            self.error("Input file '%s' is not RELION 3.1 format." % args.i)

        new_particles = []

        print("Reading in input star file.....")

        particles = self.get_particles(md)

        optic_groups = self.get_optic_groups(md)

        print("Total %s particles in input star file." % str(len(particles)))

        print("Total %s optic groups found in input star file." %
              str(len(optic_groups)))

        new_particles.extend(self.rel30format(particles, optic_groups))

        mdOut = MetaData()
        particleTableName = "data_"
        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels("data_particles"))

        mdOut.addLabels(particleTableName, [
            'rlnVoltage', 'rlnSphericalAberration', 'rlnAmplitudeContrast',
            'rlnMagnification', 'rlnDetectorPixelSize', 'rlnOriginX',
            'rlnOriginY', 'rlnBeamTiltClass'
        ])
        mdOut.removeLabels(
            "data_", ['rlnOpticsGroup', 'rlnOriginXAngst', 'rlnOriginYAngst'])

        mdOut.addData(particleTableName, new_particles)

        mdOut.write(args.o)

        print("New star file %s in RELION 3.0 format created. Have fun!" %
              args.o)
예제 #9
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print("Modifying star file to be compatible with helix refinement.")

        md = MetaData(args.i)

        if md.version == "3.1":
            ilabels = md.getLabels("data_particles")
        else:
            ilabels = md.getLabels("data_")

        if 'rlnAnglePsiFlipRatio' not in ilabels:
            md.addLabels(['rlnAnglePsiFlipRatio'])
        if 'rlnHelicalTubeID' not in ilabels:
            md.addLabels(['rlnHelicalTubeID'])
        if 'rlnHelicalTrackLength' not in ilabels:
            md.addLabels(['rlnHelicalTrackLength'])

        mdOut = MetaData()

        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))

        particles = self.get_particles(md)

        self.helixParticles(particles)

        mdOut.addData(particleTableName, particles)
        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        md = MetaData(args.i)

        # create output star file
        mdOut = MetaData()
        mdOut.version = "3.1"
        mdOut.addDataTable("data_optics")
        mdOut.addLabels("data_optics", md.getLabels("data_optics"))
        mdOut.addDataTable("data_particles")
        mdOut.addLabels("data_particles", md.getLabels("data_particles"))

        print("Reading in input star file.....")
        particles = self.get_particles(md)
        print(
            "Total %s particles in input star file. \nAdding rlnOpticsGroup." %
            str(len(particles)))

        new_particles, opticsGroupsNames = self.addOpticGroupsToParticles(
            particles, args.word_count)

        # create new optics groups
        opticGroup = md.data_optics[0]
        opticsGroups = []

        for opticGroupNr, opticGroupName in enumerate(opticsGroupsNames):
            newOpticGroup = deepcopy(opticGroup)
            newOpticGroup.rlnOpticsGroup = opticGroupNr + 1
            newOpticGroup.rlnOpticsGroupName = "opticsGroup_" + str(
                opticGroupName)
            opticsGroups.append(newOpticGroup)

        mdOut.addData("data_optics", opticsGroups)

        mdOut.addData("data_particles", new_particles)

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #11
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()
        compValue, rangeHi, rangeLo, rangeSel, prctl_l, prctl_h = self.validate(
            args)

        if rangeSel:
            print(
                "Selecting particles particles where %s is in range <%s, %s>."
                % (args.lb, rangeLo, rangeHi))
        elif args.prctl_l == "-1" and args.prctl_h == "-1":
            print("Selecting particles particles where %s is %s %s." %
                  (args.lb, args.op, compValue))

        md = MetaData(args.i)

        new_particles = []

        particles = self.get_particles(md)

        new_particles.extend(
            self.selParticles(particles, args.lb, args.op, compValue, rangeHi,
                              rangeLo, rangeSel, prctl_l, prctl_h))

        mdOut = MetaData()
        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, new_particles)

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #12
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        md = MetaData(args.i)

        new_particles = []

        print("Reading in input star file.....")

        particles = self.get_particles(md)

        print(
            "Total %s particles in input star file. \nSelecting random particles from their symmetry copies."
            % str(len(particles)))

        new_particles.extend(self.randParticles(particles))

        mdOut = MetaData()
        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, new_particles)

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #13
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()

        self.validate(args)

        print("Selecting particles from star file...")

        md = MetaData(args.i)

        new_particles = []

        particles = self.get_particles(md)

        new_particles.extend(
            self.selParticles(particles, args.rot_min, args.rot_max,
                              args.tilt_min, args.tilt_max, args.psi_min,
                              args.psi_max))
        mdOut = MetaData()

        if md.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md.getLabels(particleTableName))
        mdOut.addData(particleTableName, new_particles)

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #14
0
        print(
            "No particle star input file given. Please, define one by --istar")
        sys.exit(2)

    # read in particle star file
    md = MetaData(args.istar)

    particles = []

    for particle in md:
        particles.append(particle)

    # create output star file
    mdOut = MetaData()
    mdOut.version = "3.1"
    mdOut.addDataTable("data_optics")
    mdOut.addLabels("data_optics", md.getLabels("data_optics"))
    mdOut.addDataTable("data_particles")
    mdOut.addLabels("data_particles", md.getLabels("data_particles"))

    # create optics groups
    opticGroup = md.data_optics[0]
    opticsGroups = []

    for opticGroupNr in range(max(pred_y)):
        newOpticGroup = deepcopy(opticGroup)
        newOpticGroup.rlnOpticsGroup = opticGroupNr + 1
        newOpticGroup.rlnOpticsGroupName = "opticsGroup" + str(opticGroupNr +
                                                               1)
        opticsGroups.append(newOpticGroup)
예제 #15
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()
        self.validate(args)

        print("Selecting particles from star file...")

        md1 = MetaData(args.i1)
        md2 = MetaData(args.i2)

        if md1.version == "3.1":
            i1labels = md1.getLabels("data_particles")
            i2labels = md2.getLabels("data_particles")
        else:
            i1labels = md1.getLabels("data_")
            i2labels = md2.getLabels("data_")

        if args.col_lb in i1labels:
            self.error("Column %s is already in Input1 star file. Please remove it first..." % args.col_lb)
        if args.col_lb not in i2labels:
            self.error("Column %s is not present in Input2 star file." % args.col_lb)
        if args.comp_lb not in i1labels:
            self.error("Column %s is not present in Input1 star file." % args.comp_lb)
        if args.comp_lb not in i2labels:
            self.error("Column %s is not present in Input2 star file." % args.comp_lb)

        if LABELS[args.col_lb] == float:
            # add label with default values 0.0
            print("Adding label %s to Input1 data with default value 0.0." % args.col_lb)
            dic = {args.col_lb: 0.0}
        if LABELS[args.col_lb] == int:
            # add label with default values 0
            print("Adding label %s to Input1 data with default value 0." % args.col_lb)
            dic = {args.col_lb: 0}
        if LABELS[args.col_lb] == str:
            # add label with default values "dummy"
            print("Adding label %s to Input1 data with default value \"dummy\"" % args.col_lb)
            dic = {args.col_lb: "dummy"}

        if md1.version == "3.1":
            md1.setLabels("data_particles", **dic)
        else:
            md1.setLabels("data_", **dic)

        particles1 = self.get_particles(md1)
        particles2 = self.get_particles(md2)

        print(
            "Assigning values for Input1 label %s where the %s of Input2 matches Input1" % (args.col_lb, args.comp_lb))

        mdOut = MetaData()

        if md1.version == "3.1":
            mdOut.version = "3.1"
            mdOut.addDataTable("data_optics")
            mdOut.addLabels("data_optics", md1.getLabels("data_optics"))
            mdOut.addData("data_optics", getattr(md1, "data_optics"))
            particleTableName = "data_particles"
        else:
            particleTableName = "data_"

        mdOut.addDataTable(particleTableName)
        mdOut.addLabels(particleTableName, md1.getLabels(particleTableName))
        mdOut.addData(particleTableName, self.assign_column(particles1, particles2, args.col_lb, args.comp_lb))

        print("%s particles were processed..." % str((len(particles1) + len(particles2))))

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)
예제 #16
0
    def main(self):
        self.define_parser()
        args = self.parser.parse_args()
        self.validate(args)

        print("Selecting particles from star file...")

        md1 = MetaData(args.i1)
        md2 = MetaData(args.i2)
        # UNION
        if args.op == "union":
            # check if both stars contains same labels
            if md1.version == "3.1":
                i1labels = md1.getLabels("data_particles")
                i2labels = md2.getLabels("data_particles")
            else:
                i1labels = md1.getLabels("data_")
                i2labels = md2.getLabels("data_")
            if len(i1labels) != len(i2labels):
                if len(i1labels) > len(i2labels):
                    print("WARNING: Input2 does not contain all the labels of Input1.")
                    missingLabels = [Labels for Labels in i1labels if Labels not in i2labels]
                    for label in missingLabels:
                        if LABELS[label] == float:
                            # add label with default values 0.0
                            print("Adding label %s to Input2 data with default value 0.0." % label)
                            dic = {label: 0.0}
                            md2.setLabels("data_particles", **dic)
                        if LABELS[label] == int:
                            # add label with default values 0
                            print("Adding label %s to Input2 data with default value 0." % label)
                            dic = {label: 0}
                            md2.setLabels("data_particles", **dic)
                        if LABELS[label] == str:
                            # add label with default values "dummy"
                            print("Adding label %s to Input2 data with default value \"dummy\"" % label)
                            dic = {label: "dummy"}
                            md2.setLabels("data_particles", **dic)
                if len(i1labels) < len(i2labels):
                    print("WARNING: Input1 does not contain all the labels of Input2.")
                    missingLabels = [Labels for Labels in i2labels if Labels not in i1labels]
                    for label in missingLabels:
                        if LABELS[label] == float:
                            # add label with default values 0.0
                            print("Adding label %s to Input1 data with default value 0.0." % label)
                            dic = {label: 0.0}
                            md1.setLabels("data_particles", **dic)
                        if LABELS[label] == int:
                            # add label with default values 0
                            print("Adding label %s to Input1 data with default value 0." % label)
                            dic = {label: 0}
                            md1.setLabels("data_particles", **dic)
                        if LABELS[label] == str:
                            # add label with default values "dummy"
                            print("Adding label %s to Input1 data with default value \"dummy\"" % label)
                            dic = {label: "dummy"}
                            md1.setLabels("data_particles", **dic)

            mdOut = MetaData()

            if md1.version == "3.1":
                mdOut.version = "3.1"
                mdOut.addDataTable("data_optics")
                mdOut.addLabels("data_optics", md1.getLabels("data_optics"))
                mdOut.addData("data_optics", getattr(md1, "data_optics"))
                particleTableName = "data_particles"
            else:
                particleTableName = "data_"

            mdOut.addDataTable(particleTableName)
            mdOut.addLabels(particleTableName, md1.getLabels(particleTableName))
            particles1 = self.get_particles(md1)
            particles2 = self.get_particles(md2)
            mdOut.addData(particleTableName, particles1)
            mdOut.addData(particleTableName, particles2)
            print("%s particles were selected..." % str((len(particles1) + len(particles2))))
        # INTERSECT
        if args.op == "intersect":
            # create intersect unique values
            if md1.version == "3.1":
                i1labels = md1.getLabels("data_particles")
                i2labels = md2.getLabels("data_particles")
            else:
                i1labels = md1.getLabels("data_")
                i2labels = md2.getLabels("data_")
            if (args.lb not in i1labels) or (args.lb not in i2labels):
                self.error("No label %s found in Input1 or Input2 file." % args.lb)

            particles1 = self.get_particles(md1)
            particles2 = self.get_particles(md2)
            intersectParticles = []
            selectedValues = []

            while len(particles2) > 0:
                selectedParticle = particles2.pop(0)
                if getattr(selectedParticle, args.lb) not in selectedValues:
                    selectedValues.append(getattr(selectedParticle, args.lb))

            for particle in particles1:
                if getattr(particle, args.lb) in selectedValues:
                    intersectParticles.append(particle)
            mdOut = MetaData()

            if md1.version == "3.1":
                mdOut.version = "3.1"
                mdOut.addDataTable("data_optics")
                mdOut.addLabels("data_optics", md1.getLabels("data_optics"))
                mdOut.addData("data_optics", getattr(md1, "data_optics"))
                particleTableName = "data_particles"
            else:
                particleTableName = "data_"

            mdOut.addDataTable(particleTableName)
            mdOut.addLabels(particleTableName, md1.getLabels(particleTableName))
            mdOut.addData(particleTableName, intersectParticles)

            print("%s particles were selected..." % str(len(intersectParticles)))
        # EXCEPT
        if args.op == "except":
            # create unique values for except
            if md1.version == "3.1":
                i1labels = md1.getLabels("data_particles")
                i2labels = md2.getLabels("data_particles")
            else:
                i1labels = md1.getLabels("data_")
                i2labels = md2.getLabels("data_")
            if (args.lb not in i1labels) or (args.lb not in i2labels):
                self.error("No label %s found in Input1 or Input2 file." % args.lb)

            particles1 = self.get_particles(md1)
            particles2 = self.get_particles(md2)
            exceptParticles = []
            selectedValues = []

            while len(particles2) > 0:
                selectedParticle = particles2.pop(0)
                if getattr(selectedParticle, args.lb) not in selectedValues:
                    selectedValues.append(getattr(selectedParticle, args.lb))

            for particle in particles1:
                if getattr(particle, args.lb) not in selectedValues:
                    exceptParticles.append(particle)
            mdOut = MetaData()

            if md1.version == "3.1":
                mdOut.version = "3.1"
                mdOut.addDataTable("data_optics")
                mdOut.addLabels("data_optics", md1.getLabels("data_optics"))
                mdOut.addData("data_optics", getattr(md1, "data_optics"))
                particleTableName = "data_particles"
            else:
                particleTableName = "data_"

            mdOut.addDataTable(particleTableName)
            mdOut.addLabels(particleTableName, md1.getLabels(particleTableName))
            mdOut.addData(particleTableName, exceptParticles)

            print("%s particles were selected..." % str(len(exceptParticles)))

        mdOut.write(args.o)

        print("New star file %s created. Have fun!" % args.o)