Пример #1
0
def main():
	progname = os.path.basename(sys.argv[0])
	usage = """prog [options] 
For more information on ctffind3 please see: Mindell, JA, Grigorieff N.  2003.  Accurate determination of local defocus and specimen tilt in electron microscopy. J Struct Biol. 142:334-47.

"""
	parser = EMArgumentParser(usage=usage,version=EMANVERSION)
	parser.add_header(name="ctffind3header", help='Options below this label are specific to e2ctffind3util.py', title="### e2ctffind3util options (requires that ctffind3 be installed)###", row=0, col=0, rowspan=1, colspan=2, mode="import,run")

	#options associated with e2ctffind3.py
	parser.add_argument("--apix", default=0.0, type=float,help="The angstrom per pixel of the micrographs", guitype='floatbox', row=3, col=0, rowspan=1, colspan=1, mode="import,run")
	parser.add_argument("--cs", default=0.0, type=float,help="The spherical aberration of the microscope", guitype='floatbox', row=3, col=1, rowspan=1, colspan=1, mode="import,run")
	parser.add_argument("--voltage", default=0.0, type=float,help="The voltage (in kV) of the microscope", guitype='floatbox', row=4, col=0, rowspan=1, colspan=1, mode="import,run")
	parser.add_argument("--ac", default=0.0, type=float,help="The amplitude contrast of the micrographs", guitype='floatbox', row=4, col=1, rowspan=1, colspan=1, mode="import,run")
	parser.add_argument("--verbose", "-v", dest="verbose", action="store", metavar="n", type=int, default=0, help="verbose level [0-9], higner number means higher level of verboseness", guitype='intbox', row=5, col=0, rowspan=1, colspan=1, mode="import,run")
	parser.add_argument("--importrelionstar", default=False, action="store_true",help="Import CTFFIND3 data in Relion STAR format. Put STAR files in 'ctffind3' folder", guitype='boolbox', row=6, col=0, rowspan=1, colspan=1, mode='import[True]')
	parser.add_argument("--importctffind3", default=False, action="store_true",help="Import ctffind3 data?", guitype='boolbox', row=6, col=0, rowspan=1, colspan=1, mode='import[True]')
	parser.add_argument("--importctffind4", default=False, action="store_true",help="Import ctffind4 data?", guitype='boolbox', row=6, col=1, rowspan=1, colspan=1, mode='import[False]')
	parser.add_argument("--ppid", type=int, help="Set the PID of the parent process, used for cross platform PPID",default=-1)

	parser.add_pos_argument(name="micrographs",help="List the micrographs to run ctffind3 on here.", default="", guitype='filebox', browser="EMRawDataTable(withmodal=True,multiselect=True)", filecheck=False, row=1, col=0,rowspan=1, colspan=2, mode='run')
	parser.add_argument("--allmicrographs", default=False, action="store_true",help="Run Ctffind3 on all micrographs in the micrographs directory?", guitype='boolbox', row=2, col=0, rowspan=1, colspan=1, mode="run")
	parser.add_argument("--maxres", default=0.0, type=float,help="The highest resolution to be fitted (Angstroms)", guitype='floatbox', row=6, col=0, rowspan=1, colspan=1, mode="run")
	parser.add_argument("--minres", default=0.0, type=float,help="The lowest resolution to be fitted (Angstroms)", guitype='floatbox', row=6, col=1, rowspan=1, colspan=1, mode="run")
	parser.add_argument("--defocusmin", default=0.0, type=float,help="The starting defocus value for grid search (microns)", guitype='floatbox', row=7, col=0, rowspan=1, colspan=1, mode="run")
	parser.add_argument("--defocusmax", default=0.0, type=float,help="The end defocus value for grid search (microns)", guitype='floatbox', row=7, col=1, rowspan=1, colspan=1, mode="run")
	parser.add_argument("--defocusstep", default=0.0, type=float,help="The step width for grid search (microns)", guitype='floatbox', row=8, col=0, rowspan=1, colspan=1, mode="run")
	parser.add_argument("--runctffind3", default=False, action="store_true",help="Run ctffind3 on the selected micrographs?", guitype='boolbox', row=9, col=0, rowspan=1, colspan=1, mode='run[True]')
	parser.add_argument("--runctffind4", default=False, action="store_true",help="Run ctffind4 on the selected micrographs?", guitype='boolbox', row=9, col=1, rowspan=1, colspan=1, mode='run[False]')
	parser.add_argument("--windowsize", default=0, type=int,help="The amplitude contrast of the micrographs", guitype='intbox', row=8, col=1, rowspan=1, colspan=1, mode="run")
	
	(options, args) = parser.parse_args()
	logid=E2init(sys.argv,options.ppid)

	if options.importrelionstar :
		fls=[i for i in os.listdir("ctffind3") if i[-5:]==".star"]
		if len(fls)==0:
			print "please create a folder called 'ctffind3' and put .star files in it before running this option"
			sys.exit(1)
		
		for f in fls:
			star=StarFile("ctffind3/"+f)
			if not star.has_key("rlnMicrographName") :
				print "No rlnMicrographName in ",f
				continue
			
			print f
			for i,imfsp in enumerate(star["rlnMicrographName"]):
				im=info_name(imfsp)		# should work regardless of extension
				jdb=js_open_dict(im)
				
				dfu=star["rlnDefocusU"][i]
				dfv=star["rlnDefocusV"][i]
				dfang=star["rlnDefocusAngle"][i]
				ctf=EMAN2Ctf()
				ctf.from_dict({"defocus":(dfu+dfv)/20000.0,"dfang":dfang,"dfdiff":(dfu-dfv)/10000.0,"voltage":star["rlnVoltage"][i],"cs":star["rlnSphericalAberration"][i],"ampcont":star["rlnAmplitudeContrast"][i]*100.0,"apix":options.apix})
				jdb["ctf_frame"]=[512,ctf,(256,256),tuple(),5,1]
				js_close_dict(im)

		launch_childprocess("e2ctf.py --voltage {} --cs {} --ac {} --apix {} --allparticles --autofit --curdefocusfix --astigmatism".format(ctf.voltage,ctf.cs,ctf.ampcont,ctf.apix))
		
		print "All done"
		sys.exit(0)


	if options.apix<= 0 :
		print "Angstrom per pixel (apix) must be specified!"
		exit(-1)
	if options.cs<= 0 :
		print "Spherical Aberration (cs) must be specified!"
		exit(-2)
	if options.voltage<= 0 :
		print "Voltage must be specified!"
		exit(-3)
	if options.ac<= 0 :
		print "Amplitude Contrast must be specified!"
		exit(-4)
		
	if options.allmicrographs:
		args = []
		for item in os.listdir("micrographs"):
			try: 
				if item.split(".")[1] == "mrc" or item.split(".")[1] == "hdf":
					args.append("micrographs/" + item)
			except:
				pass
	
		
	
	if options.runctffind4:
		version = "ctffind4"
		run_ctffind(options.apix, args, options.cs, options.voltage, options.ac, options.windowsize, options.minres, options.maxres, options.defocusmin*10000, options.defocusmax*10000, options.defocusstep*10000, options.verbose,version)
	elif options.runctffind3:
		version = "ctffind3"
		run_ctffind(options.apix, args, options.cs, options.voltage, options.ac, options.windowsize, options.minres, options.maxres, options.defocusmin*10000, options.defocusmax*10000, options.defocusstep*10000, options.verbose, version)

	if options.importctffind4 or options.runctffind4:
		version = "ctffind4"
	else:
		version = "ctffind3"
	import_ctf(options.voltage, options.cs, options.ac, options.apix, options.verbose, version)

	print "e2ctffind3util.py complete!"
	E2end(logid)
def main():
    progname = os.path.basename(sys.argv[0])
    usage = """prog [options] <relion STAR file>

This program will take data from a Relion project and convert it into a basic EMAN2 project and generate a .lst file. Provide 
the name of the Relion STAR file associated with the raw particle data. An eman2 subdirectory will be
created, and the images, and available metadata will be copied into the new project. CTF parameters
will be extracted from the STAR file and will be automatically processed through EMAN1's CTF procedure
(this takes most of the time the script will require).

"""
    parser = EMArgumentParser(usage=usage, version=EMANVERSION)

    parser.add_argument("--lst", type=str, default='', help='.lst file.')
    parser.add_argument('--boxsize', type=int, default=0, help='box size')
    parser.add_argument(
        '--allrelion',
        type=int,
        default=0,
        help='convert all relion parameters to lst file if set to 1')
    parser.add_argument(
        "--verbose",
        "-v",
        dest="verbose",
        action="store",
        metavar="n",
        type=int,
        default=0,
        help=
        "verbose level [0-9], higner number means higher level of verboseness")
    parser.add_argument(
        "--ny",
        type=int,
        help="Particle NY size, so no need to read image to get this value",
        default=0)
    parser.add_argument(
        "--ppid",
        type=int,
        help="Set the PID of the parent process, used for cross platform PPID",
        default=-1)

    (options, args) = parser.parse_args()

    logid = E2init(sys.argv, options.ppid)

    inputStarFileName = args[0]
    if not os.path.islink(inputStarFileName):
        inputStarFileName = os.path.abspath(inputStarFileName)
    else:
        #print "%s is a link file"%(inputStarFileName)
        inputStarFileName = os.path.abspath(os.readlink(inputStarFileName))

    topdir = os.path.dirname(inputStarFileName)

    #	try: os.mkdir("particles")
    #	except: pass

    if options.verbose > 0:
        print "Parsing STAR file %s" % (inputStarFileName)

    star = StarFile(inputStarFileName)
    #print star

    if (options.lst):
        lstfile = options.lst
    else:
        lstfile = os.path.basename(inputStarFileName)
        lstfile = lstfile[0:lstfile.rfind('.')] + '.lst'

    oldname = ""
    olddf = -1.0
    micronum = 0  # number of micrograph
    fnum = 0  # image number in new file
    params = []
    for i in xrange(len(star["rlnImageName"])):
        name = star["rlnImageName"][i].split("@")[1]
        name = os.path.join(topdir, name)
        imgnum = int(star["rlnImageName"][i].split("@")[0]) - 1

        if (star.has_key("rlnMagnificationCorrection")
            ):  #for old version relion star filr
            apix = 1e4 * float(star["rlnDetectorPixelSize"][i]) / (
                float(star["rlnMagnification"][i]) *
                float(star["rlnMagnificationCorrection"][i]))
        else:
            apix = 1e4 * float(star["rlnDetectorPixelSize"][i]) / (float(
                star["rlnMagnification"][i]))

        if name != oldname:
            #		hdr=EMData(name,0,True)
            #		nx=hdr["nx"]
            #		ny=hdr["ny"]
            nx = options.ny
            ny = options.ny
            oldname = name

        if i == 0 or star["rlnDefocusU"][i - 1] != star["rlnDefocusU"][i]:
            #this line will not run when i==0 (the 1st loop)
            if micronum > 0 and options.verbose > 1:
                print "Image {}: {} particles, df={}, size={}x{}".format(
                    micronum, fnum, ctf.defocus, nx, ny)

            micronum += 1
            fnum = 0  #when reaching a new micrograph, fnum need to start from 0 for write_image to a new good particle HDF stack
            microname = "particles/{}_{:04d}.hdf".format(
                base_name(name), micronum)

        boxsize = options.boxsize
        if boxsize <= 0:
            boxsize = ny

        # Make a "micrograph" CTF entry for each set of different defocuses to use when fitting
        # check ctffind3.f function CTF(CS,WL,WGH1,WGH2,DFMID1,DFMID2,ANGAST,THETATR, IX, IY)
        dfu = star["rlnDefocusU"][i] / 1e4
        dfv = star["rlnDefocusV"][i] / 1e4
        dfang = star["rlnDefocusAngle"][i]

        defocus = (dfu + dfv) / 2.
        dfdiff = math.fabs(dfu -
                           dfv) / 2.  # dfu can be larger or smaller than dfv
        if dfu > dfv:
            dfang = math.fmod(
                dfang + 360. + 90., 360.
            )  # largest defocus direction to smallest defocus direction
        else:
            pass  # already at smallest defocus direction

        ctf = EMAN1Ctf()
        ctf.from_dict({
            "defocus": defocus,
            "dfang": dfang,
            "dfdiff": dfdiff,
            "voltage": star["rlnVoltage"][i],
            "cs": star["rlnSphericalAberration"][i],
            "ampcont": star["rlnAmplitudeContrast"][i] * 100.0,
            "apix": apix,
            "amplitude": 1,
            "bfactor": 1e-5
        })

        # copy the image
        #	if name[-5:]==".mrcs":
        #		img=EMData(name,imgnum)		# read one slice from the MRC stack
        #	else:
        #		img=EMData(name,0,False,Region(0,0,imgnum,nx,ny,1))		# read one slice from the MRC stack

        #	img["ctf"] = ctf
        #	img['apix_x'] = apix
        #	img['apix_y'] = apix

        #	if options.verbose>2:
        #		print "Particle %d: %s" % (i, img["ctf"].to_dict())

        #	img.write_image(microname,fnum,EMUtil.ImageType.IMAGE_HDF,False) #microname is a .hdf file, False tells it to write both header and image data

        #print star["rlnAngleRot"][i], star["rlnAngleTilt"][i], star["rlnAnglePsi"][i]
        alt, az, phi, x, y = relion2EMAN2(star["rlnAngleRot"][i],
                                          star["rlnAngleTilt"][i],
                                          star["rlnAnglePsi"][i],
                                          star["rlnOriginX"][i],
                                          star["rlnOriginY"][i], boxsize)

        #all particles in eman2/particles folder are good particles, so the 1st column in .lst file should be 0,1,2,3,4,... in order
        new_file = os.path.relpath(microname, os.getcwd())
        param = [fnum, new_file, alt, az, phi, x, y, defocus, dfdiff, dfang]

        if (options.allrelion):
            for var in sorted(star.keys()):
                param.append(star[var][i])

        params.append(param)
        fnum += 1

    #generate .lst file corresponding to EMAN2 convention
    fp = open(lstfile, 'w')
    fp.write("#LST\n")
    for p in params:
        fp.write(
            "%d\t%s\teuler=%g,%g,%g\tcenter=%g,%g\tdefocus=%s\tdfdiff=%s\tdfang=%s"
            % (p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]))
        if options.allrelion:
            vars = sorted(star.keys())
            for vi, var in enumerate(vars):
                fp.write("\t%s=%s" % (var.split("rln")[-1], p[10 + vi]))
        fp.write("\n")
    fp.close()

    if options.verbose > 0:
        print "%d particles saved to %s" % (len(star["rlnImageName"]), lstfile)

    E2end(logid)
Пример #3
0
def main():
    progname = os.path.basename(sys.argv[0])
    usage = """prog [options] 
For more information on ctffind3 please see: Mindell, JA, Grigorieff N.  2003.  Accurate determination of local defocus and specimen tilt in electron microscopy. J Struct Biol. 142:334-47.

"""
    parser = EMArgumentParser(usage=usage, version=EMANVERSION)
    parser.add_header(
        name="ctffind3header",
        help='Options below this label are specific to e2ctffind3util.py',
        title=
        "### e2ctffind3util options (requires that ctffind3 be installed)###",
        row=0,
        col=0,
        rowspan=1,
        colspan=2,
        mode="import,run")

    #options associated with e2ctffind3.py
    parser.add_argument("--apix",
                        default=0.0,
                        type=float,
                        help="The angstrom per pixel of the micrographs",
                        guitype='floatbox',
                        row=3,
                        col=0,
                        rowspan=1,
                        colspan=1,
                        mode="import,run")
    parser.add_argument("--cs",
                        default=0.0,
                        type=float,
                        help="The spherical aberration of the microscope",
                        guitype='floatbox',
                        row=3,
                        col=1,
                        rowspan=1,
                        colspan=1,
                        mode="import,run")
    parser.add_argument("--voltage",
                        default=0.0,
                        type=float,
                        help="The voltage (in kV) of the microscope",
                        guitype='floatbox',
                        row=4,
                        col=0,
                        rowspan=1,
                        colspan=1,
                        mode="import,run")
    parser.add_argument("--ac",
                        default=0.0,
                        type=float,
                        help="The amplitude contrast of the micrographs",
                        guitype='floatbox',
                        row=4,
                        col=1,
                        rowspan=1,
                        colspan=1,
                        mode="import,run")
    parser.add_argument(
        "--verbose",
        "-v",
        dest="verbose",
        action="store",
        metavar="n",
        type=int,
        default=0,
        help=
        "verbose level [0-9], higner number means higher level of verboseness",
        guitype='intbox',
        row=5,
        col=0,
        rowspan=1,
        colspan=1,
        mode="import,run")
    parser.add_argument(
        "--importrelionstar",
        default=False,
        action="store_true",
        help=
        "Import CTFFIND3 data in Relion STAR format. Put STAR files in 'ctffind3' folder",
        guitype='boolbox',
        row=6,
        col=0,
        rowspan=1,
        colspan=1,
        mode='import[True]')
    parser.add_argument("--importctffind3",
                        default=False,
                        action="store_true",
                        help="Import ctffind3 data?",
                        guitype='boolbox',
                        row=6,
                        col=0,
                        rowspan=1,
                        colspan=1,
                        mode='import[True]')
    parser.add_argument("--importctffind4",
                        default=False,
                        action="store_true",
                        help="Import ctffind4 data?",
                        guitype='boolbox',
                        row=6,
                        col=1,
                        rowspan=1,
                        colspan=1,
                        mode='import[False]')
    parser.add_argument(
        "--ppid",
        type=int,
        help="Set the PID of the parent process, used for cross platform PPID",
        default=-1)

    parser.add_pos_argument(
        name="micrographs",
        help="List the micrographs to run ctffind3 on here.",
        default="",
        guitype='filebox',
        browser="EMRawDataTable(withmodal=True,multiselect=True)",
        filecheck=False,
        row=1,
        col=0,
        rowspan=1,
        colspan=2,
        mode='run')
    parser.add_argument(
        "--allmicrographs",
        default=False,
        action="store_true",
        help="Run Ctffind3 on all micrographs in the micrographs directory?",
        guitype='boolbox',
        row=2,
        col=0,
        rowspan=1,
        colspan=1,
        mode="run")
    parser.add_argument("--maxres",
                        default=0.0,
                        type=float,
                        help="The highest resolution to be fitted (Angstroms)",
                        guitype='floatbox',
                        row=6,
                        col=0,
                        rowspan=1,
                        colspan=1,
                        mode="run")
    parser.add_argument("--minres",
                        default=0.0,
                        type=float,
                        help="The lowest resolution to be fitted (Angstroms)",
                        guitype='floatbox',
                        row=6,
                        col=1,
                        rowspan=1,
                        colspan=1,
                        mode="run")
    parser.add_argument(
        "--defocusmin",
        default=0.0,
        type=float,
        help="The starting defocus value for grid search (microns)",
        guitype='floatbox',
        row=7,
        col=0,
        rowspan=1,
        colspan=1,
        mode="run")
    parser.add_argument("--defocusmax",
                        default=0.0,
                        type=float,
                        help="The end defocus value for grid search (microns)",
                        guitype='floatbox',
                        row=7,
                        col=1,
                        rowspan=1,
                        colspan=1,
                        mode="run")
    parser.add_argument("--defocusstep",
                        default=0.0,
                        type=float,
                        help="The step width for grid search (microns)",
                        guitype='floatbox',
                        row=8,
                        col=0,
                        rowspan=1,
                        colspan=1,
                        mode="run")
    parser.add_argument("--runctffind3",
                        default=False,
                        action="store_true",
                        help="Run ctffind3 on the selected micrographs?",
                        guitype='boolbox',
                        row=9,
                        col=0,
                        rowspan=1,
                        colspan=1,
                        mode='run[True]')
    parser.add_argument("--runctffind4",
                        default=False,
                        action="store_true",
                        help="Run ctffind4 on the selected micrographs?",
                        guitype='boolbox',
                        row=9,
                        col=1,
                        rowspan=1,
                        colspan=1,
                        mode='run[False]')
    parser.add_argument("--windowsize",
                        default=0,
                        type=int,
                        help="The amplitude contrast of the micrographs",
                        guitype='intbox',
                        row=8,
                        col=1,
                        rowspan=1,
                        colspan=1,
                        mode="run")

    (options, args) = parser.parse_args()
    logid = E2init(sys.argv, options.ppid)

    if options.importrelionstar:
        fls = [i for i in os.listdir("ctffind3") if i[-5:] == ".star"]
        if len(fls) == 0:
            print "please create a folder called 'ctffind3' and put .star files in it before running this option"
            sys.exit(1)

        for f in fls:
            star = StarFile("ctffind3/" + f)
            if not star.has_key("rlnMicrographName"):
                print "No rlnMicrographName in ", f
                continue

            print f
            for i, imfsp in enumerate(star["rlnMicrographName"]):
                im = info_name(imfsp)  # should work regardless of extension
                jdb = js_open_dict(im)

                dfu = star["rlnDefocusU"][i]
                dfv = star["rlnDefocusV"][i]
                dfang = star["rlnDefocusAngle"][i]
                ctf = EMAN2Ctf()
                ctf.from_dict({
                    "defocus": (dfu + dfv) / 20000.0,
                    "dfang": dfang,
                    "dfdiff": (dfu - dfv) / 10000.0,
                    "voltage": star["rlnVoltage"][i],
                    "cs": star["rlnSphericalAberration"][i],
                    "ampcont": star["rlnAmplitudeContrast"][i] * 100.0,
                    "apix": options.apix
                })
                jdb["ctf_frame"] = [512, ctf, (256, 256), tuple(), 5, 1]
                js_close_dict(im)

        launch_childprocess(
            "e2ctf.py --voltage {} --cs {} --ac {} --apix {} --allparticles --autofit --curdefocusfix --astigmatism"
            .format(ctf.voltage, ctf.cs, ctf.ampcont, ctf.apix))

        print "All done"
        sys.exit(0)

    if options.apix <= 0:
        print "Angstrom per pixel (apix) must be specified!"
        exit(-1)
    if options.cs <= 0:
        print "Spherical Aberration (cs) must be specified!"
        exit(-2)
    if options.voltage <= 0:
        print "Voltage must be specified!"
        exit(-3)
    if options.ac <= 0:
        print "Amplitude Contrast must be specified!"
        exit(-4)

    if options.allmicrographs:
        args = []
        for item in os.listdir("micrographs"):
            try:
                if item.split(".")[1] == "mrc" or item.split(".")[1] == "hdf":
                    args.append("micrographs/" + item)
            except:
                pass

    if options.runctffind4:
        version = "ctffind4"
        run_ctffind(options.apix, args, options.cs, options.voltage,
                    options.ac, options.windowsize, options.minres,
                    options.maxres, options.defocusmin * 10000,
                    options.defocusmax * 10000, options.defocusstep * 10000,
                    options.verbose, version)
    elif options.runctffind3:
        version = "ctffind3"
        run_ctffind(options.apix, args, options.cs, options.voltage,
                    options.ac, options.windowsize, options.minres,
                    options.maxres, options.defocusmin * 10000,
                    options.defocusmax * 10000, options.defocusstep * 10000,
                    options.verbose, version)

    if options.importctffind4 or options.runctffind4:
        version = "ctffind4"
    else:
        version = "ctffind3"
    import_ctf(options.voltage, options.cs, options.ac, options.apix,
               options.verbose, version)

    print "e2ctffind3util.py complete!"
    E2end(logid)
Пример #4
0
def main():
    progname = os.path.basename(sys.argv[0])
    usage = """prog [options] <relion STAR file>

This program will take data from a Relion project and convert it into a basic EMAN2 project. Provide 
the name of the Relion STAR file associated with the raw particle data. An eman2 subdirectory will be
created, and the images, and available metadata will be copied into the new project. CTF parameters
will be extracted from the STAR file and stored as frame CTF parameters. You will still need to run
CTF autoprocessing after importing is complete.

"""
    parser = EMArgumentParser(usage=usage, version=EMANVERSION)

    #options associated with e2refine.py
    parser.add_header(
        name="text1",
        help='Important instructions',
        title="Use this to create an EMAN2.1 project from a Relion project:",
        row=0,
        col=0,
        rowspan=1,
        colspan=3)
    parser.add_header(name="text2",
                      help='Important instructions',
                      title="* cd <folder with Relion STAR file>",
                      row=1,
                      col=0,
                      rowspan=1,
                      colspan=3)
    parser.add_header(name="text3",
                      help='Important instructions',
                      title="* run e2projectmanager, and use this tool",
                      row=2,
                      col=0,
                      rowspan=1,
                      colspan=3)
    parser.add_header(
        name="text4",
        help='Important instructions',
        title="* exit PM, cd eman2, run PM from new eman2 folder",
        row=3,
        col=0,
        rowspan=1,
        colspan=3)
    parser.add_pos_argument(
        name="star_file",
        help="Select STAR file",
        default="",
        guitype='filebox',
        browser="EMParticlesEditTable(withmodal=True,multiselect=False)",
        row=6,
        col=0,
        rowspan=1,
        colspan=3)
    parser.add_argument("--apix",
                        default=0,
                        type=float,
                        help="The angstrom per pixel of the input particles.",
                        guitype='floatbox',
                        row=8,
                        col=0,
                        rowspan=1,
                        colspan=1)
    parser.add_argument(
        "--verbose",
        "-v",
        dest="verbose",
        action="store",
        metavar="n",
        type=int,
        default=0,
        help=
        "verbose level [0-9], higner number means higher level of verboseness")
    parser.add_argument(
        "--ppid",
        type=int,
        help="Set the PID of the parent process, used for cross platform PPID",
        default=-1)

    (options, args) = parser.parse_args()

    logid = E2init(sys.argv, options.ppid)

    try:
        os.mkdir("eman2")
    except:
        pass
    try:
        os.mkdir("eman2/particles")
    except:
        pass
    os.chdir(
        "eman2"
    )  # many things need to happen with the project directory as a base

    if options.verbose > 0: print("Parsing STAR file")
    star = StarFile("../" + args[0])

    if options.apix <= 0:
        try:
            options.apix = star["rlnDetectorPixelSize"][0] / star[
                "rlnMagnification"][0] * 10000.0
            print("Using {} A/pix from Relion file".format(options.apix))
        except:
            print("A/pix not specified and not found in STAR file")
            sys.exit(1)

    prj = js_open_dict("info/project.json")
    try:
        prj["global.apix"] = options.apix
        prj["global.microscope_cs"] = star["rlnSphericalAberration"][0]
        if prj["global.microscope_cs"] <= 0.0:
            prj["global.microscope_cs"] = 0.001
        prj["global.microscope_voltage"] = star["rlnVoltage"][0]
        print("V={} Cs={}".format(prj["global.microscope_voltage"],
                                  prj["global.microscope_cs"]))
    except:
        print("Did not find Voltage and Cs in Relion file")

    if star.has_key("rlnMicrographName"): difkey = "rlnMicrographName"
    else: difkey = "rlnDefocusU"

    oldname = ""
    olddf = -1.0
    micronum = 0  # number of micrograph
    fnum = 0  # image number in new file
    for i in xrange(len(star["rlnImageName"])):
        name = star["rlnImageName"][i].split("@")[1]
        imgnum = int(star["rlnImageName"][i].split("@")[0]) - 1

        if name != oldname:
            hdr = EMData("../" + name, 0, True)
            nx = hdr["nx"]
            ny = hdr["ny"]
            oldname = name
            if options.verbose > 0:
                print("Particle dimensions: {}x{}".format(nx, ny))

        if i == 0 or star[difkey][i - 1] != star[difkey][i]:
            if micronum > 0 and options.verbose > 0:
                print("Image {}: {} particles processed, df={}".format(
                    micronum, fnum, ctf.defocus))
            micronum += 1
            fnum = 0
            microname = "particles/{}_{:04d}.hdf".format(
                base_name(name), micronum)
            jdb = js_open_dict(info_name(microname))

            # Make a "micrograph" CTF entry for each set of different defocuses to use when fitting
            dfu = star["rlnDefocusU"][i]
            dfv = star["rlnDefocusV"][i]
            dfang = star["rlnDefocusAngle"][i]
            ctf = EMAN2Ctf()
            ctf.from_dict({
                "defocus": (dfu + dfv) / 20000.0,
                "dfang": dfang,
                "dfdiff": (dfu - dfv) / 10000.0,
                "voltage": star["rlnVoltage"][i],
                "cs": max(star["rlnSphericalAberration"][i], 0.0001),
                "ampcont": star["rlnAmplitudeContrast"][i] * 100.0,
                "apix": options.apix
            })
            jdb["ctf_frame"] = [512, ctf, (256, 256), tuple(), 5, 1]

        # copy the image
        if name[-5:] == ".mrcs":
            img = EMData("../" + name,
                         imgnum)  # read one slice from the MRC stack
        else:
            img = EMData("../" + name, 0, False,
                         Region(0, 0, imgnum, nx, ny,
                                1))  # read one slice from the MRC stack
        img.write_image(microname, fnum)
        fnum += 1

    E2end(logid)