#### Corin Wagen and Eugene Kwan, 2019 filenames = sys.argv[1] info = [] text_width = 70 to_rotate = [[1, 3, 5, 7], [9, 11, 13, 15], [5, 3, 6, 8], [12, 11, 14, 16]] ensemble = ConformationalEnsemble() for filename in sorted(glob.glob(filenames, recursive=True)): if re.search("slurm", filename): continue try: output_file = GaussianFile.read_file(filename) if len(output_file.energies) > 0: mol = output_file.get_molecule() ensemble.add_molecule(mol, energy=output_file.energies[-1] * 627.509) except: print(f"skipping f{filename} due to error...") print(f"{len(ensemble.molecules)} conformers before elimination of redundant") ensemble.eliminate_redundant(cutoff=0.6) print(f"{len(ensemble.molecules)} conformers after elimination of redundant") best_confs = ensemble.get_within_cutoff(cutoff=10) for idx, molecule in enumerate(best_confs): GaussianFile.write_molecule_to_file(
filenames = sys.argv[1] energies = {} dipole = {} nics = {} C1_charge = {} O7_charge = {} C8_charge = {} C9_charge = {} C12_charge = {} for filename in sorted(glob.glob(filenames, recursive=True)): if re.search("slurm", filename): continue (output_file, lines) = GaussianFile.read_file(filename, return_lines=True) dist = int(round(output_file.get_molecule().get_distance(1, 8) * 1000)) energies[dist] = output_file.energies[-1] try: nics[dist] = -1 * parse.find_parameter(lines, "17 Bq Isotropic", 8, 4)[0] except: pass try: dipole_line = parse.search_for_block(lines, "Dipole", "Quadrupole") fields = re.split(" +", dipole_line) fields = list(filter(None, fields)) dipole[dist] = float(fields[-1])
#### Corin Wagen and Eugene Kwan, 2019 filenames = sys.argv[1] cent = 1 lg = 7 nu = 8 plot = np.zeros(shape=(18, 18)) for filename in sorted(glob.glob(filenames, recursive=True)): if re.search("slurm", filename): continue output_file = GaussianFile.read_file(filename) energy = float(output_file.energies[-1]) * 627.509 mol = output_file.get_molecule() lg_dist = mol.get_distance(cent, lg) nu_dist = mol.get_distance(cent, nu) idx1 = int(round((lg_dist - 1.5) * 10)) idx2 = int(round((nu_dist - 1.2) * 10)) plot[idx1][idx2] = energy min_energy = np.min(plot) plot = plot - min_energy #### now to generate the graph...
list of cctk.Molecule objects (with len(thetas) * len(structures) elements) """ if idx >= len(angles): return structures else: new_structures = [None] * (len(structures) * len(thetas)) current_idx = 0 for structure in structures: for theta in thetas: new_structures[current_idx] = copy.deepcopy( structure.set_dihedral(*angles[idx], theta, check_result=False)) current_idx += 1 print(len(structures)) return rotate_angles_one_by_one(idx + 1, angles, thetas, new_structures) mols = rotate_angles_one_by_one(0, to_rotate, angles, [output_file.molecule]) mols = rotate_angles_one_by_one(0, to_bin_rotate, bin_angles, mols) for idx, molecule in enumerate(mols): try: molecule.check_for_conflicts() GaussianFile.write_molecule_to_file(f"conformer_{idx:05d}.gjf", molecule, "#p opt pm7", None) except: pass
import sys, argparse, re from cctk import GaussianFile, XYZFile #### Usage: python read_from_xyz.py -h "#p opt freq=noraman b3lyp/6-31g(d)" path/to/file.xyz parser = argparse.ArgumentParser(prog="read_from_xyz.py") parser.add_argument("--header", "-H", type=str) parser.add_argument("filename") args = vars(parser.parse_args(sys.argv[1:])) assert args["filename"], "Can't read file without a filename!" assert args["header"], "Can't write file without a header!" file = XYZFile.read_file(args["filename"]) newfile = args["filename"].rsplit('/',1)[-1] newfile = re.sub(r"xyz$", "gjf", newfile) GaussianFile.write_molecule_to_file( newfile, file.molecule, route_card=args["header"], link0={"nprocshared": 16, "mem": "32GB"}, footer=None, )
import sys, os, argparse, glob, re, copy import numpy as np from cctk import GaussianFile, Molecule, Group, Ensemble from cctk.load_groups import load_group parser = argparse.ArgumentParser(prog="hammett_swap.py") parser.add_argument("filename") args = vars(parser.parse_args(sys.argv[1:])) assert args["filename"], "Can't resubmit files without a filename!" #### read in output file output_file = GaussianFile.read_file(args["filename"]) #### read in genecp footer footer = "" with open('footer', 'r') as file: footer = file.read() #### define groups and atoms groups = ["NMe2", "OMe", "Me", "CF3", "CO2Me", "CN", "NO2", "F", "Cl", "SF5"] p_atoms = [19, 30, 41] ensemble = Ensemble() headers = [] args = [] for group_name in groups: print(f"adding {group_name}") mol = copy.deepcopy(output_file.get_molecule().assign_connectivity()) group = load_group(group_name)
import numpy as np from cctk import ConformationalEnsemble, GaussianFile path = "starting_structure.gjf" cent = 1 lg = 7 nu = 8 file = GaussianFile.read_file(path) mol = file.get_molecule() mol.assign_connectivity() footer = f"B {cent} {lg} F\nB {cent} {nu} F\n" for lg_dist in np.arange(1.5, 3.3, 0.1): for nu_dist in np.arange(1.2, 3.0, 0.1): mol.set_distance(cent, lg, lg_dist) mol.set_distance(cent, nu, nu_dist) mol.check_for_conflicts() GaussianFile.write_molecule_to_file( f"scan_{int(round(lg_dist*100))}_{int(round(nu_dist*100))}.gjf", mol, "#p opt=modredundant b3lyp/6-31+g(d) scrf=(smd, solvent=tetrahydrofuran)", footer=footer)
#### Usage: ``python generate_pop.py "path/to/output/*.out"`` #### NOTE: It's crucial to wrap the wildcard-containing path in quotes! #### NOTE: This file will reject any file that contains the string "slurm." #### Corin Wagen and Eugene Kwan, 2019 parser = argparse.ArgumentParser(prog="resubmit.py") parser.add_argument("filename") args = vars(parser.parse_args(sys.argv[1:])) assert args["filename"], "Can't resubmit files without a filename!" ensembles = [] for filename in glob.iglob(args["filename"], recursive=True): if re.search("slurm", filename): continue output_file = GaussianFile.read_file(filename) ensembles.append(output_file.molecules) new_ensemble = ConformationalEnsemble.join_ensembles(ensembles) for mol in new_ensemble.molecules: cc_dist = mol.get_distance(1, 8) newfile = f"pop_{int(round(cc_dist*1000))}.gjf" GaussianFile.write_molecule_to_file(newfile, mol, "#p pop=hirshfeld m062x/6-31g(d)", None) print(f"generating {newfile}...")
import glob import cctk from cctk import GaussianFile, ConformationalEnsemble filenames = sorted(list(glob.iglob("path*.gjf"))) ensemble = ConformationalEnsemble() for filename in filenames: output_file = GaussianFile.read_file(filename) molecule = output_file.ensemble.molecules[-1] ensemble.add_molecule(molecule) template = ensemble.molecules[0] atoms = [1, 2, 3, 4, 5, 6] #ensemble = ensemble.align(to_geometry=0, comparison_atoms="heavy", compute_RMSD=False) ensemble = ensemble.align(to_geometry=0, comparison_atoms=atoms, compute_RMSD=False) template = ensemble.molecules[0] for i, molecule in enumerate(ensemble.molecules): filename = f"aligned_path_{i+1:03d}.gjf" header = "#p" footer = "\n" GaussianFile.write_molecule_to_file(filename, molecule, header, footer)
ensemble = ConformationalEnsemble() angles = [0, 60, 120, 180, 240, 241, 300] for x in angles: for y in angles: mol.set_dihedral(1, 7, 6, 8, x) mol.set_dihedral(23, 24, 25, 1, y) ensemble.add_molecule(mol, copy=True) old_num = len(ensemble) ensemble = ensemble.eliminate_redundant() new_num = len(ensemble) print( f"originally {old_num} conformers, but after eliminating redundant there are {new_num}!" ) count = 0 for molecule in ensemble.molecules: x = int(round(molecule.get_dihedral(1, 7, 6, 8))) y = int(round(molecule.get_dihedral(23, 24, 25, 1))) if molecule.check_for_conflicts(): GaussianFile.write_molecule_to_file(f"CpG_{x}_{y}.gjf", molecule, route_card="#p opt b3lyp/6-31g(d)") count += 1 else: print(f"x={x} y={y} no good - error") print(f"wrote {count} molecules to files")