if sub.conf_num > 1: s += "%-20s" % name # if (i + 1) % 3 == 0: if (i + 1) % 1 == 0: s += "\n" print(s.strip()) sys.exit(0) detect_subs = False s = "" skipped = 0 for infile in glob_files(args.infile, parser=makeconf_parser): if isinstance(infile, str): if args.input_format is not None: f = FileReader((infile, args.input_format[0], infile)) else: f = FileReader(infile) else: if args.input_format is not None: f = FileReader(("from stdin", args.input_format[0], infile)) else: f = FileReader(("from stdin", "xyz", infile)) geom = Geometry(f) target_list = [] explicit_subnames = []
help="print all diastereomers for selected chiral centers") changechiral_parser.add_argument( "-m", "--minimize", action="store_true", default=False, dest="minimize", help="rotate substituents to mitigate steric clashing", ) args = changechiral_parser.parse_args() s = "" for infile in glob_files(args.infile, parser=changechiral_parser): if isinstance(infile, str): if args.input_format is not None: f = FileReader((infile, args.input_format[0], infile)) else: f = FileReader(infile) else: if args.input_format is not None: f = FileReader(("from stdin", args.input_format[0], stdin)) else: f = FileReader(("from stdin", "xyz", stdin)) geom = Geometry(f) target_list = [] if args.targets is None:
) args = maplig_parser.parse_args() if args.list_avail is not False: s = "" for i, name in enumerate(sorted(get_matching_ligands(args.list_avail))): s += "%-35s" % name if (i + 1) % 3 == 0: # if (i + 1) % 1 == 0: s += "\n" print(s.strip()) sys.exit(0) for infile in glob_files(args.infile, parser=maplig_parser): if isinstance(infile, str): if args.input_format is not None: f = FileReader((infile, args.input_format[0], infile)) else: f = FileReader(infile) else: if args.input_format is not None: f = FileReader(("from stdin", args.input_format[0], infile)) else: f = FileReader(("from stdin", "xyz", infile)) cat = Geometry(f) if args.center: cat.detect_components(center=args.center)
def main(argv): vbur_parser = argparse.ArgumentParser( description= "calculate Boltzmann-weighted percent buried volume parameters", formatter_class=argparse.RawTextHelpFormatter) vbur_parser.add_argument("infiles", metavar="input files", type=str, nargs="+", help="file containing coordinates and energy") vbur_parser.add_argument("-if", "--input-format", type=str, default=None, choices=["log", "out", "dat"], dest="input_format", help="file format of input") vbur_parser.add_argument("-o", "--output", type=str, default=False, required=False, metavar="output destination", dest="outfile", help="output destination\n" + "Default: stdout") vbur_parser.add_argument( "-l", "--ligand-atoms", default=None, required=False, dest="targets", help= "atoms to consider in calculation\nDefault: use all atoms except the center", ) vbur_parser.add_argument( "-e", "--exclude-atoms", default=None, required=False, dest="exclude_atoms", help= "atoms to exclude from the calculation\nDefault: exclude no ligand atoms", ) vbur_parser.add_argument( "-c", "--center", action="append", default=None, required=False, dest="center", help="atom the sphere is centered on\n" + "Default: detect metal center (centroid of all metals if multiple are present)", ) vbur_parser.add_argument( "-r", "--radius", default=3.5, type=float, dest="radius", help="radius around center\nDefault: 3.5 Ångström") vbur_parser.add_argument( "-vdw", "--vdw-radii", type=str, default="bondi", choices=["bondi", "umn"], dest="radii", help="VDW radii to use in calculation\n" + "umn: main group vdw radii from J. Phys. Chem. A 2009, 113, 19, 5806–5812\n" + " (DOI: 10.1021/jp8111556)\n" + " transition metals are crystal radii from Batsanov, S.S. Van der Waals\n" + " Radii of Elements. Inorganic Materials 37, 871–885 (2001).\n" + " (DOI: 10.1023/A:1011625728803)\n" + "bondi: radii from J. Phys. Chem. 1964, 68, 3, 441–451 (DOI: 10.1021/j100785a001)\n" + "Default: bondi") vbur_parser.add_argument( "-s", "--scale", default=1.17, type=float, dest="scale", help="scale VDW radii by this amount\nDefault: 1.17", ) vbur_parser.add_argument("-t", "--temperature", type=str, default=298.15, required=False, dest="temperature", help="temperature in K\nDefault: 298.15") vbur_parser.add_argument( "-f", "--frequency", action="store_true", default=False, required=False, dest="frequency", help="input files are frequency job output files\n" "additional average values will be calculated for ZPE, H, G, etc.") vbur_parser.add_argument( "-w0", "--frequency-cutoff", type=float, default=100.0, required=False, dest="w0", help="cutoff frequency for quasi free energy corrections (1/cm)\n" + "Default: 100 cm^-1") vbur_parser.add_argument("-v", "--verbose", action="store_true", default=False, required=False, dest="verbose", help="also print population") vbur_parser.add_argument( "-m", "--method", default="Lebedev", type=lambda x: x.capitalize() if x.lower() == "lebedev" else x.upper(), choices=["MC", "Lebedev"], dest="method", help= "integration method - Monte-Carlo (MC) or Lebedev quadrature (Lebedev)\nDefault: Lebedev" ) grid_options = vbur_parser.add_argument_group( "Lebedev integration options") grid_options.add_argument( "-rp", "--radial-points", type=int, default=20, choices=[20, 32, 64, 75, 99, 127], dest="rpoints", help="number of radial shells for Gauss-Legendre integration\n" + "of the radial component\n" + "lower values are faster, but at the cost of accuracy\nDefault: 20") grid_options.add_argument( "-ap", "--angular-points", type=int, default=1454, choices=[110, 194, 302, 590, 974, 1454, 2030, 2702, 5810], dest="apoints", help="number of angular points for Lebedev integration\n" + "lower values are faster, but at the cost of accuracy\nDefault: 1454") mc_options = vbur_parser.add_argument_group( "Monte-Carlo integration options") mc_options.add_argument( "-i", "--minimum-iterations", type=int, default=25, metavar="ITERATIONS", dest="min_iter", help="minimum iterations - each is a batch of 3000 points\n" + "MC will continue after this until convergence criteria are met\n" + "Default: 25", ) args = vbur_parser.parse_args(args=argv) targets = None if args.exclude_atoms and not args.targets: targets = (NotAny(args.exclude_atoms)) elif args.exclude_atoms and args.targets: targets = (NotAny(args.exclude_atoms), args.targets) else: targets = NotAny(args.center) geoms = [] energies = {"E": []} if args.frequency: energies["E+ZPE"] = [] energies["H(RRHO)"] = [] energies["G(RRHO)"] = [] energies["G(Quasi-RRHO)"] = [] energies["G(Quasi-Harmonic)"] = [] for infile in glob_files(args.infiles, parser=vbur_parser): if args.input_format is not None: fr = FileReader((infile, args.input_format, infile), just_geom=False) else: fr = FileReader(infile, just_geom=False) geom = Geometry(fr) geoms.append(geom) nrg = fr.other["energy"] energies["E"].append(nrg) if args.frequency: co = CompOutput(fr) dE, dH, entropy = co.therm_corr(temperature=args.temperature) rrho_dG = co.calc_G_corr(v0=0, temperature=args.temperature, method="RRHO") qrrho_dG = co.calc_G_corr(v0=args.w0, temperature=args.temperature, method="QRRHO") qharm_dG = co.calc_G_corr(v0=args.w0, temperature=args.temperature, method="QHARM") energies["E+ZPE"].append(nrg + co.ZPVE) energies["H(RRHO)"].append(nrg + dH) energies["G(RRHO)"].append(nrg + rrho_dG) energies["G(Quasi-RRHO)"].append(nrg + qrrho_dG) energies["G(Quasi-Harmonic)"].append(nrg + qharm_dG) s = "" for nrg_type in energies: energies_arr = np.array(energies[nrg_type]) energies_arr *= UNIT.HART_TO_KCAL if args.verbose and nrg_type == "E": s += "\t".join(["%Vbur", "file"]) s += "\n" for f, geom in zip(args.infiles, geoms): data = geom.percent_buried_volume( targets=targets, center=args.center, radius=args.radius, radii=args.radii, scale=args.scale, method=args.method, rpoints=args.rpoints, apoints=args.apoints, min_iter=args.min_iter, ) s += "%.1f%%\t%s\n" % (data, f) s += "\n" s += "weighted using %s:\n" % nrg_type data = Geometry.weighted_percent_buried_volume( geoms, energies_arr, args.temperature, targets=targets, center=args.center, radius=args.radius, radii=args.radii, scale=args.scale, method=args.method, rpoints=args.rpoints, apoints=args.apoints, min_iter=args.min_iter, ) if args.verbose: coeff = boltzmann_coefficients(energies_arr, args.temperature) coeff /= sum(coeff) coeff *= 100 for f, c, e in zip(args.infiles, coeff, energies_arr): s += "%s %.1f%% (%.1f kcal/mol)\n" % (f, c, e - min(energies_arr)) s += "%%Vbur: %.2f\n\n" % data if not args.outfile: print(s) else: with open(args.outfile, "w") as f: f.write(s)
) args = substitute_parser.parse_args() if args.list_avail: s = "" for i, name in enumerate(sorted(Substituent.list())): s += "%-20s" % name # if (i + 1) % 3 == 0: if (i + 1) % 1 == 0: s += "\n" print(s.strip()) sys.exit(0) for infile in glob_files(args.infile, parser=substitute_parser): if isinstance(infile, str): if args.input_format is not None: f = FileReader((infile, args.input_format, infile)) else: f = FileReader(infile) else: if args.input_format is not None: f = FileReader(("from stdin", args.input_format, infile)) else: f = FileReader(("from stdin", "xyz", infile)) geom = Geometry(f) target_list = [] for sub in args.substitutions:
def main(argv): sterimol_parser = argparse.ArgumentParser( description= "calculate B1-B5, and L sterimol parameters for ligands - see Verloop, A. and Tipker, J. (1976), Use of linear free energy related and other parameters in the study of fungicidal selectivity. Pestic. Sci., 7: 379-390.", formatter_class=argparse.RawTextHelpFormatter) sterimol_parser.add_argument("infile", metavar="input file", type=str, nargs="*", default=[sys.stdin], help="a coordinate file") sterimol_parser.add_argument( "-if", "--input-format", type=str, default=None, choices=read_types, dest="input_format", help="file format of input\nxyz is assumed if input is stdin") sterimol_parser.add_argument( "-k", "--key-atoms", type=str, required=True, dest="key", help="1-indexed position of the ligand's coordinating atoms") sterimol_parser.add_argument("-c", "--center-atom", type=str, required=True, dest="center", help="atom the ligand is coordinated to") sterimol_parser.add_argument( "-r", "--radii", type=str, default="bondi", choices=["bondi", "umn"], dest="radii", help="VDW radii to use in calculation\n" "umn: main group vdw radii from J. Phys. Chem. A 2009, 113, 19, 5806–5812\n" " (DOI: 10.1021/jp8111556)\n" " transition metals are crystal radii from Batsanov, S.S. Van der Waals\n" " Radii of Elements. Inorganic Materials 37, 871–885 (2001).\n" " (DOI: 10.1023/A:1011625728803)\n" "bondi: radii from J. Phys. Chem. 1964, 68, 3, 441–451\n(DOI: 10.1021/j100785a001)\n" "Default: bondi") sterimol_parser.add_argument( "-bl", "--bisect-L", action="store_true", required=False, dest="bisect_L", help="L axis will bisect (or analogous for higher denticity\n" "ligands) the L-M-L angle\n" "Default: center to centroid of key atoms") sterimol_parser.add_argument( "-al", "--at-L", default=[None], dest="L_value", type=lambda x: [float(v) for v in x.split(",")], help="get widths at specific L values (comma-separated)\n" "can be used for Sterimol2Vec parameters\n" "Default: use the entire ligand", ) sterimol_parser.add_argument( "-v", "--vector", action="store_true", required=False, dest="vector", help= "print Chimera/ChimeraX bild file for vectors instead of parameter values" ) sterimol_parser.add_argument("-o", "--output", type=str, default=False, required=False, metavar="output destination", dest="outfile", help="output destination\n" + "Default: stdout") args = sterimol_parser.parse_args(args=argv) s = "" if not args.vector: s += "B1\tB2\tB3\tB4\tB5\tL\tfile\n" for infile in glob_files(args.infile, parser=sterimol_parser): if isinstance(infile, str): if args.input_format is not None: f = FileReader((infile, args.input_format, infile)) else: f = FileReader(infile) else: if args.input_format is not None: f = FileReader(("from stdin", args.input_format, infile)) else: f = FileReader(("from stdin", "xyz", infile)) geom = Geometry(f, refresh_ranks=False) comp = Component( geom.get_fragment(args.key, stop=args.center), to_center=geom.find(args.center), key_atoms=args.key, detect_backbone=False, ) for val in args.L_value: data = comp.sterimol( to_center=geom.find(args.center), return_vector=args.vector, radii=args.radii, bisect_L=args.bisect_L, at_L=val, ) if args.vector: for key, color in zip( ["B1", "B2", "B3", "B4", "B5", "L"], ["black", "green", "purple", "orange", "red", "blue"]): start, end = data[key] s += ".color %s\n" % color s += ".note Sterimol %s\n" % key s += ".arrow %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f\n" % ( *start, *end) else: s += "%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%s\n" % ( data["B1"], data["B2"], data["B3"], data["B4"], data["B5"], data["L"], infile, ) if not args.outfile: print(s) else: with open(args.outfile, "w") as f: f.write(s)
help= "CSV file containing observed spectrum data, which will be plotted on top\n" "frequency job files should not come directly after this flag") args = ir_parser.parse_args() exp_data = None if args.exp_data: exp_data = [] for f in args.exp_data: data = np.loadtxt(f, delimiter=",") for i in range(1, data.shape[1]): exp_data.append((data[:, 0], data[:, i], None)) for f in glob_files(args.infiles, parser=ir_parser): fr = FileReader(f, just_geom=False) freq = fr.other["frequency"] fig = plt.gcf() fig.clear() freq.plot_ir( fig, centers=args.centers, widths=args.widths, plot_type=args.plot_type, peak_type=args.peak_type, reverse_x=args.reverse_x, fwhm=args.fwhm,
help="print all symmetry elements", ) pg_parser.add_argument( "-b", "--bild", action="store_true", default=False, dest="print_bild", help="print Chimera(X) bild file to display various symmetry elements", ) args = pg_parser.parse_args() s = "" for f in glob_files(args.infile, parser=pg_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None), just_geom=True) else: infile = FileReader(f, just_geom=True) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format[0], f), just_geom=True) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f), just_geom=True) geom = Geometry(infile) pg = PointGroup(
if args.csv: if args.csv == "comma": sep = "," elif args.csv == "tab": sep = "\t" elif args.csv == "semicolon": sep = ";" else: sep = " " s = "" np.set_printoptions(precision=5) for f in glob_files(args.infile, parser=info_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format[0], None), just_geom=False) else: infile = FileReader(f, just_geom=False) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format[0], f), just_geom=False) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f), just_geom=False) if args.list:
help="also try swapping target order when minimizing") args = ring_parser.parse_args() if args.list_avail: s = "" for i, name in enumerate(sorted(Ring.list())): s += "%-20s" % name # if (i + 1) % 3 == 0: if (i + 1) % 1 == 0: s += "\n" print(s.strip()) exit(0) for infile in glob_files(args.infile, parser=ring_parser): if isinstance(infile, str): if args.input_format is not None: f = FileReader((infile, args.input_format, infile)) else: f = FileReader(infile) else: if args.input_format is not None: f = FileReader(("from stdin", args.input_format, stdin)) else: f = FileReader(("from stdin", "xyz", stdin)) geom = Geometry(f) targets = {}
help= "put structures in specified directory\nDefault: don't output structures", ) args = unique_parser.parse_args() if args.energy_filter is None: args.energy_filter = 0.2 mirror_mat = np.eye(3) mirror_mat[0][0] *= -1 # dictionary of structures, which will be ordered by number of atoms, elements, etc. structures = {} for f in glob_files(args.infile, parser=unique_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None), just_geom=False) else: infile = FileReader(f, just_geom=False) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f), just_geom=False) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f), just_geom=False) geom = Geometry(infile) geom.other = infile.other
if args.angle is None and args.num is None: raise ValueError("must specified one of ('--angle', '--number')") elif args.num is None and args.angle is not None: args.num = 1 args.angle = args.angle elif args.num is not None and args.angle is None: args.num = args.num args.angle = 360.0 / args.num elif args.num is not None and args.angle is not None: args.num = args.num args.angle = args.angle if not args.radians: args.angle = np.deg2rad(args.angle) for f in glob_files(args.infile, parser=rotate_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None)) else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f)) else: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) center = args.center if args.fragment is not None:
dest="comment", help="comment line" ) xyz_parser.add_argument( "-a", "--append", action="store_true", default=False, required=False, dest="append", help="append structures to output file if it already exists\nDefault: false" ) args = xyz_parser.parse_args() for f in glob_files(args.infile, parser=xyz_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None)) else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f)) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile, refresh_connected=False, refresh_ranks=False) if args.comment: geom.comment = args.comment
angle_parser.add_argument( "-o", "--output", type=str, default=False, required=False, dest="outfile", metavar="output destination", help="output destination\n" + "$INFILE will be replaced with the name of the input file\n" + "Default: stdout") args = angle_parser.parse_args() for f in glob_files(args.infile, parser=angle_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format[0], None)) else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format[0], f)) else: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) #set angle to specified value for angle in args.set_ang:
stat_parser.add_argument("-o", "--output", type=str, nargs="+", default=None, required=False, dest="outfile", help="output destination\nDefault: stdout") args = stat_parser.parse_args() s = "" header_vals = [None] for f in glob_files(args.infile, parser=stat_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format[0], None), just_geom=False) else: infile = FileReader(f, just_geom=False) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format[0], f), just_geom=False) else: stat_parser.print_help() raise RuntimeError( "when no input file is given, stdin is read and a format must be specified" )
kwargs[pos].extend(opt) for pos in [PSI4_BEFORE_GEOM, PSI4_AFTER_JOB, PSI4_BEFORE_JOB, GAUSSIAN_POST]: opt = getattr(args, pos) if opt: if pos not in kwargs: kwargs[pos] = [] kwargs[pos].extend([" ".join(word) for word in opt]) if args.comments: kwargs["comments"] = [" ".join(comment) for comment in args.comments] # Theory() is made for each file because we might be using things from the input file for f in glob_files(args.infile, parser=theory_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format[0], None), just_geom=False, get_all=True) else: infile = FileReader(f, just_geom=False, get_all=True) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format[0], f), just_geom=False, get_all=True) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f),
anharm_header = delim.join([ "E", "E+ZPE", "E+ZPE(anh)", "H(RRHO)", "G(RRHO)", "G(Quasi-RRHO)", "G(Quasi-harmonic)", "ZPE", "ZPE(anh)", "dH(RRHO)", "dG(RRHO)", "dG(Quasi-RRHO)", "dG(Quasi-harmonic)", "SP_File", "Thermo_File" ]) harm_header = delim.join([ "E", "E+ZPE", "H(RRHO)", "G(RRHO)", "G(Quasi-RRHO)", "G(Quasi-harmonic)", "ZPE", "dH(RRHO)", "dG(RRHO)", "dG(Quasi-RRHO)", "dG(Quasi-harmonic)", "SP_File", "Thermo_File" ]) header = None output = "" if args.pattern is None: infiles = glob_files(args.infile, parser=thermo_parser) else: infiles = [] if args.infile == [sys.stdin]: directories = [os.getcwd()] else: directories = [] for directory in args.infile: directories.extend(glob(directory)) for directory in directories: for root, dirs, files in os.walk(directory, topdown=True): for pattern in args.pattern: full_glob = os.path.join(root, pattern) infiles.extend(glob(full_glob))
eye = np.identity(3) if args.yz_plane: eye[0, 0] *= -1 if args.xz_plane: eye[1, 1] *= -1 if args.xy_plane: eye[2, 2] *= -1 if np.sum(eye) == 3: eye[0, 0] *= -1 for f in glob_files(args.infile, parser=mirror_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None)) else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f)) else: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) geom.update_geometry(np.dot(geom.coords, eye))
help="translate the centroid of the targets to the destination") translate_parser.add_argument( "-o", "--output", type=str, default=False, required=False, dest="outfile", help="output destination\n" + "$INFILE will be replaced with the name of the input file\n" + "Default: stdout") args = translate_parser.parse_args() for f in glob_files(args.infile, parser=translate_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None)) else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f)) else: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) # targets to move targets = []
mc_options.add_argument( "-i", "--minimum-iterations", type=int, default=25, metavar="ITERATIONS", dest="min_iter", help="minimum iterations - each is a batch of 3000 points\n" + "MC will continue after this until convergence criteria are met\n" + "Default: 25", ) args = vbur_parser.parse_args() s = "" for f in glob_files(args.infile, parser=vbur_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format[0], None)) else: infile = FileReader(f, just_geom=False) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format[0], f)) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) targets = None
"Default: umn", ) cone_parser.add_argument( "-b", "--cone-bild", action="store_true", default=False, dest="print_cones", help="print Chimera/ChimeraX bild file containing cones", ) args = cone_parser.parse_args() s = "" for f in glob_files(args.infile, parser=cone_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format[0], None)) else: infile = FileReader(f, just_geom=False) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format[0], f)) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) ligand = geom.get_fragment(args.key_atoms, stop=args.center)
def main(argv): sterimol_parser = argparse.ArgumentParser( description= "calculate Boltzmann-weighted Sterimol parameters - see doi 10.1021/acscatal.8b04043", formatter_class=argparse.RawTextHelpFormatter) sterimol_parser.add_argument("infiles", metavar="input files", type=str, nargs="+", help="file containing coordinates and energy") sterimol_parser.add_argument("-if", "--input-format", type=str, default=None, choices=["log", "out", "dat"], dest="input_format", help="file format of input") sterimol_parser.add_argument( "-s", "--substituent-atom", type=str, required=True, dest="targets", help="substituent atom\n" + "1-indexed position of the starting position of the\n" + "substituent of which you are calculating sterimol\nparameters") sterimol_parser.add_argument( "-a", "--attached-to", type=str, required=True, dest="avoid", help="non-substituent atom\n" + "1-indexed position of the starting position of the atom\n" + "connected to the substituent of which you are calculating\n" + "sterimol parameters") sterimol_parser.add_argument( "-r", "--radii", type=str, default="bondi", choices=["bondi", "umn"], dest="radii", help="VDW radii to use in calculation\n" + "umn: main group vdw radii from J. Phys. Chem. A 2009, 113, 19, 5806–5812\n" + " (DOI: 10.1021/jp8111556)\n" + " transition metals are crystal radii from Batsanov, S.S. Van der Waals\n" + " Radii of Elements. Inorganic Materials 37, 871–885 (2001).\n" + " (DOI: 10.1023/A:1011625728803)\n" + "bondi: radii from J. Phys. Chem. 1964, 68, 3, 441–451 (DOI: 10.1021/j100785a001)\n" + "Default: bondi") sterimol_parser.add_argument( "-l", "--old-l", action="store_true", required=False, dest="old_L", help="approximate FORTRAN Sterimol method for determining L\n" "This is 0.4 + the ideal bond length for a target-H bond\n" "to outer VDW radii of atoms projected onto L-axis\n" "Default: L value is from VDW radii of target atom to outer\n" "VDW radii of atoms projected onto L-axis") sterimol_parser.add_argument("-t", "--temperature", type=float, default=298.15, required=False, dest="temperature", help="temperature in K\nDefault: 298.15") sterimol_parser.add_argument( "-f", "--frequency", action="store_true", default=False, required=False, dest="frequency", help="input files are frequency job output files\n" "additional average values will be calculated for ZPE, H, G, etc.") sterimol_parser.add_argument( "-w0", "--frequency-cutoff", type=float, default=100.0, required=False, dest="w0", help="cutoff frequency for quasi free energy corrections (1/cm)\n" + "Default: 100 cm^-1") sterimol_parser.add_argument("-v", "--verbose", action="store_true", default=False, required=False, dest="verbose", help="also print population") sterimol_parser.add_argument("-o", "--output", type=str, default=False, required=False, metavar="output destination", dest="outfile", help="output destination\n" + "Default: stdout") args = sterimol_parser.parse_args(args=argv) subs = [] energies = {"E": []} if args.frequency: energies["E+ZPE"] = [] energies["H(RRHO)"] = [] energies["G(RRHO)"] = [] energies["G(Quasi-RRHO)"] = [] energies["G(Quasi-Harmonic)"] = [] for infile in glob_files(args.infiles, parser=sterimol_parser): if args.input_format is not None: fr = FileReader((infile, args.input_format, infile), just_geom=False) else: fr = FileReader(infile, just_geom=False) geom = Geometry(fr) target = args.targets avoid = args.avoid end = geom.find(avoid)[0] frag = geom.get_fragment(target, stop=end) sub = Substituent(frag, end=end, detect=False) subs.append(sub) nrg = fr.other["energy"] energies["E"].append(nrg) if args.frequency: co = CompOutput(fr) dE, dH, entropy = co.therm_corr(temperature=args.temperature) rrho_dG = co.calc_G_corr(v0=0, temperature=args.temperature, method="RRHO") qrrho_dG = co.calc_G_corr(v0=args.w0, temperature=args.temperature, method="QRRHO") qharm_dG = co.calc_G_corr(v0=args.w0, temperature=args.temperature, method="QHARM") energies["E+ZPE"].append(nrg + co.ZPVE) energies["H(RRHO)"].append(nrg + dH) energies["G(RRHO)"].append(nrg + rrho_dG) energies["G(Quasi-RRHO)"].append(nrg + qrrho_dG) energies["G(Quasi-Harmonic)"].append(nrg + qharm_dG) s = "" for nrg_type in energies: energies_arr = np.array(energies[nrg_type]) energies_arr *= UNIT.HART_TO_KCAL if args.verbose and nrg_type == "E": s += "\t".join(["B1", "B2", "B3", "B4", "B5", "L", "file"]) s += "\n" for f, sub in zip(args.infiles, subs): data = sub.sterimol( radii=args.radii, old_L=args.old_L, ) s += "\t".join([ "%.2f" % data[x] for x in ["B1", "B2", "B3", "B4", "B5", "L"] ]) s += "\t%s\n" % f s += "weighted using %s:\n" % nrg_type data = Substituent.weighted_sterimol( subs, energies_arr, args.temperature, radii=args.radii, old_L=args.old_L, ) if args.verbose: coeff = boltzmann_coefficients(energies_arr, args.temperature) coeff /= sum(coeff) coeff *= 100 for f, c, e in zip(args.infiles, coeff, energies_arr): s += "%s %.1f%% (%.1f kcal/mol)\n" % (f, c, e - min(energies_arr)) s += "\t".join(["B1", "B2", "B3", "B4", "B5", "L"]) s += "\n" s += "\t".join( ["%.2f" % data[x] for x in ["B1", "B2", "B3", "B4", "B5", "L"]]) s += "\n" s += "\n" if not args.outfile: print(s) else: with open(args.outfile, "w") as f: f.write(s)
if args.geometry: new_vsepr = args.geometry.replace("_", " ") if adjust_hs == 0 and new_vsepr is None: adjust_structure = False elif adjust_hs == 0 and new_vsepr: goal = len(Atom.get_shape(new_vsepr)) - 1 def goal_func(atom, goal=goal): return goal - len(atom.connected) adjust_structure = (goal_func, new_vsepr) elif adjust_hs is True: adjust_structure = True else: adjust_structure = (adjust_hs, new_vsepr) for f in glob_files(args.infile, parser=element_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None)) else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f)) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) target_list = []
help="scale VDW radii by this amount\nDefault: 1.17") args = steric_parser.parse_args() oop_vector = args.oop_vector if args.oop_vector is not None: oop_vector = np.array(args.oop_vector) ip_vector = args.ip_vector if args.ip_vector is not None: ip_vector = np.array(args.ip_vector) if args.vbur is None: args.vbur = "Lebedev" for f in glob_files(args.infile, parser=steric_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format[0], None)) else: infile = FileReader(f, just_geom=False) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format[0], f)) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) x, y, z, min_alt, max_alt, basis, targets = geom.steric_map(
dihedral_parser.add_argument( "-o", "--output", type=str, default=False, required=False, dest="outfile", metavar="output destination", help="output destination\n" + "$INFILE will be replaced with the name of the input file\n" + "Default: stdout") args = dihedral_parser.parse_args() for f in glob_files(args.infile, dihedral_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None)) else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f)) else: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) # set dihedral to specified value for dihedral in args.set_ang:
if args.chiral: finders.append(ChiralCenters()) if args.delim == "comma": delim = "," elif args.delim == "space": delim = " " elif args.delim == "tab": delim = "\t" elif args.delim == "semicolon": delim = ";" s = "" for f in glob_files(args.infile, parser=find_parser): if isinstance(f, str): if args.input_format is not None: infile = FileReader((f, args.input_format, None)) else: infile = FileReader(f) else: if args.input_format is not None: infile = FileReader(("from stdin", args.input_format, f)) else: if len(sys.argv) >= 1: infile = FileReader(("from stdin", "xyz", f)) geom = Geometry(infile) geom_finders = [x for x in finders]
"atom on the molecule that is connected to the fragment being removed\nDefault: longest fragment", ) remove_frag_parser.add_argument( "-a", "--add-hydrogen", action="store_true", required=False, default=False, dest="add_H", help="add hydrogen to cap where the fragment was removed", ) args = remove_frag_parser.parse_args() for infile in glob_files(args.infile, parser=remove_frag_parser): if isinstance(infile, str): if args.input_format is not None: f = FileReader((infile, args.input_format[0], infile)) else: f = FileReader(infile) else: if args.input_format is not None: f = FileReader(("from stdin", args.input_format[0], infile)) else: f = FileReader(("from stdin", "xyz", infile)) geom = Geometry(f) for atom in geom.find(args.target): if atom in geom.atoms:
dest="wait_last", help="wait for the last job to finish before exiting", ) submit_parser.add_argument( "-we", "--wait-each", action="store_true", default=False, dest="wait_each", help="wait for each job to finish before submitting the next", ) args = submit_parser.parse_args() for i, f in enumerate(glob_files(args.infile, parser=submit_parser)): # TODO: if processors etc. is not specified, read the input file to see if # processors were specified processors = args.processors memory = args.memory walltime = args.time template = args.template if args.section is not None: if args.processors is None: processors = config.getint(args.section, "processors", fallback=None) if args.memory is None: memory = config.getint(args.section, "memory", fallback=None)
def main(argv): sterimol_parser = argparse.ArgumentParser( description="calculate B1-B5, and L sterimol parameters for substituents - see Verloop, A. and Tipker, J. (1976), Use of linear free energy related and other parameters in the study of fungicidal selectivity. Pestic. Sci., 7: 379-390.", formatter_class=argparse.RawTextHelpFormatter ) sterimol_parser.add_argument( "infile", metavar="input file", type=str, nargs="*", default=[sys.stdin], help="a coordinate file" ) sterimol_parser.add_argument( "-if", "--input-format", type=str, default=None, choices=read_types, dest="input_format", help="file format of input\nxyz is assumed if input is stdin" ) sterimol_parser.add_argument( "-s", "--substituent-atom", type=str, required=True, dest="targets", help="substituent atom\n" + "1-indexed position of the starting position of the\n" + "substituent of which you are calculating sterimol\nparameters" ) sterimol_parser.add_argument( "-a", "--attached-to", type=str, required=True, dest="avoid", help="non-substituent atom\n" + "1-indexed position of the starting position of the atom\n" + "connected to the substituent of which you are calculating\n" + "sterimol parameters" ) sterimol_parser.add_argument( "-r", "--radii", type=str, default="bondi", choices=["bondi", "umn"], dest="radii", help="VDW radii to use in calculation\n" + "umn: main group vdw radii from J. Phys. Chem. A 2009, 113, 19, 5806–5812\n" + " (DOI: 10.1021/jp8111556)\n" + " transition metals are crystal radii from Batsanov, S.S. Van der Waals\n" + " Radii of Elements. Inorganic Materials 37, 871–885 (2001).\n" + " (DOI: 10.1023/A:1011625728803)\n" + "bondi: radii from J. Phys. Chem. 1964, 68, 3, 441–451 (DOI: 10.1021/j100785a001)\n" + "Default: bondi" ) sterimol_parser.add_argument( "-l", "--old-l", action="store_true", required=False, dest="old_L", help="approximate FORTRAN Sterimol method for determining L\n" "This is 0.4 + the ideal bond length for a target-H bond\n" "Default: L value is from VDW radii of target atom to outer\n" "VDW radii of atoms projected onto L-axis" ) sterimol_parser.add_argument( "-al", "--at-L", default=[None], dest="L_value", type=lambda x: [float(v) for v in x.split(",")], help="get widths at specific L values (comma-separated)\n" "Default: use the entire ligand", ) sterimol_parser.add_argument( "-v", "--vector", action="store_true", required=False, dest="vector", help="print Chimera/ChimeraX bild file for vectors instead of parameter values" ) sterimol_parser.add_argument( "-o", "--output", type=str, default=False, required=False, metavar="output destination", dest="outfile", help="output destination\n" + "Default: stdout" ) args = sterimol_parser.parse_args(args=argv) s = "" if not args.vector: s += "B1\tB2\tB3\tB4\tB5\tL\tfile\n" for infile in glob_files(args.infile, parser=sterimol_parser): if isinstance(infile, str): if args.input_format is not None: f = FileReader((infile, args.input_format, infile)) else: f = FileReader(infile) else: if args.input_format is not None: f = FileReader(("from stdin", args.input_format, infile)) else: f = FileReader(("from stdin", "xyz", infile)) geom = Geometry(f) target = args.targets avoid = args.avoid end = geom.find(avoid)[0] frag = geom.get_fragment(target, stop=end) sub = Substituent(frag, end=end, detect=False) for val in args.L_value: data = sub.sterimol( return_vector=args.vector, radii=args.radii, old_L=args.old_L, at_L=val, ) if args.vector: for key, color in zip( ["B1", "B2", "B3", "B4", "B5", "L"], ["black", "green", "purple", "orange", "red", "blue"] ): start, end = data[key] s += ".color %s\n" % color s += ".note Sterimol %s\n" % key s += ".arrow %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f\n" % (*start, *end) else: s += "%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%s\n" % ( data["B1"], data["B2"], data["B3"], data["B4"], data["B5"], data["L"], infile, ) if not args.outfile: print(s) else: with open(args.outfile, "w") as f: f.write(s)