samusmaster210
samusmaster210

Reputation: 31

RdKit Coordinates for atoms in a molecule

Hey everyone I need some help formatting coordinates for atoms in a molecule and I'm coding with Python. What I am needing is along the lines of:

(atom) x y z coordinates

For every atom in the molecule. So far my code is:

for molecule in mol_list:
    molecule = Chem.AddHs(molecule)
    print(molecule.GetNumAtoms())
    AllChem.EmbedMolecule(molecule)
    AllChem.UFFOptimizeMolecule(molecule)
    molecule.GetConformer()

    print()

    for atom in molecule.GetAtoms():
        # positions = molecule.GetConformer().GetAtomPosition(0)
        positions = molecule.GetConformer().GetPositions()
        print(atom.GetSymbol(), positions)
    
        print()

But this gives me the output of:

(Atom) x y z coordinates for every atom

This repeats so that every atom in the molecule has the entire molecule's x, y, and z coordinates. mol_list in the for loop is a list of strings that I converted to the object: rdkit.Chem.rdchem.Mol. I've tried the geometry.xyz function in Chemml, but ran into issues with the Molecule object. Also, I've tried using the RdKit function getAtomPos() with no luck. Any help with this would be awesome!

Upvotes: 3

Views: 8530

Answers (1)

betelgeuse
betelgeuse

Reputation: 1266

You have to pass the atom number to get its coordinates. The following code snippet should do what you're looking for

from rdkit import Chem
from rdkit.Chem import AllChem

for molecule in mol_list:
    molecule = Chem.AddHs(molecule)
    print(molecule.GetNumAtoms())
    AllChem.EmbedMolecule(molecule)
    AllChem.UFFOptimizeMolecule(molecule)
    molecule.GetConformer()
    print()

    for i, atom in enumerate(molecule.GetAtoms()):
        positions = molecule.GetConformer().GetAtomPosition(i)
        print(atom.GetSymbol(), positions.x, positions.y, positions.z)

Upvotes: 4

Related Questions