コード例 #1
0
ファイル: extract_unique.py プロジェクト: ekwan/cctk
#### 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(
コード例 #2
0
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])
コード例 #3
0
ファイル: plot.py プロジェクト: ekwan/cctk
#### 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...
コード例 #4
0
        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
コード例 #5
0
ファイル: read_from_xyz.py プロジェクト: ekwan/cctk
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,
)
コード例 #6
0
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)
コード例 #7
0
ファイル: generate.py プロジェクト: ekwan/cctk
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)
コード例 #8
0
#### 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}...")

コード例 #9
0
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)
コード例 #10
0
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")