generate-xyz-files.py 1.15 KB
Newer Older
Gao, Xiang's avatar
Gao, Xiang committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from ase import Atoms
from ase.md import Langevin
import ase.units as units
from rdkit import Chem
from rdkit.Chem import AllChem
# from asap3 import EMT
from ase.calculators.emt import EMT
import argparse


# parse command line arguments
parser = argparse.ArgumentParser()
parser.add_argument('smiles')
parser.add_argument('--conformations', type=int, default=2048)
parser.add_argument('--temperature', type=int, default=30)
parser = parser.parse_args()


def save(smiles, species, coordinates):
    print(len(species))
    print(smiles)
    for s, c in zip(species, coordinates):
        print(s, *c)


smiles = parser.smiles
m = Chem.MolFromSmiles(smiles)
m = Chem.AddHs(m)
AllChem.EmbedMolecule(m, useRandomCoords=True)
AllChem.UFFOptimizeMolecule(m)
pos = m.GetConformer().GetPositions()
natoms = m.GetNumAtoms()
species = [m.GetAtomWithIdx(j).GetSymbol() for j in range(natoms)]

atoms = Atoms(species, positions=pos)

atoms.calc = EMT()
md = Langevin(atoms, 1 * units.fs, temperature=parser.temperature * units.kB,
              friction=0.01)

for _ in range(parser.conformations):
    md.run(1)
    positions = atoms.get_positions()
    save(smiles, species, positions)