Re: [Rdkit-discuss] detect dihedral angles in a conformation
Open-Source Cheminformatics and Machine Learning
Brought to you by:
glandrum
|
From: Paolo T. <pao...@un...> - 2015-10-20 09:33:14
|
Dear Jose Manuel,
the enumerateTorsions() function in this Python script should allow to
enumerate all torsions you might want to constrain in a molecule; it'll
be up to you to carry out further filtering, though:
#!/usr/bin/env python
import sys
import rdkit
from rdkit import Chem
def enumerateTorsions(mol):
torsionSmarts = '[!$(*#*)&!D1]~[!$(*#*)&!D1]'
torsionQuery = Chem.MolFromSmarts(torsionSmarts)
matches = mol.GetSubstructMatches(torsionQuery)
torsionList = []
for match in matches:
idx2 = match[0]
idx3 = match[1]
bond = mol.GetBondBetweenAtoms(idx2, idx3)
jAtom = mol.GetAtomWithIdx(idx2)
kAtom = mol.GetAtomWithIdx(idx3)
if (((jAtom.GetHybridization() != Chem.HybridizationType.SP2)
and (jAtom.GetHybridization() != Chem.HybridizationType.SP3))
or ((kAtom.GetHybridization() != Chem.HybridizationType.SP2)
and (kAtom.GetHybridization() != Chem.HybridizationType.SP3))):
continue
for b1 in jAtom.GetBonds():
if (b1.GetIdx() == bond.GetIdx()):
continue
idx1 = b1.GetOtherAtomIdx(idx2)
for b2 in kAtom.GetBonds():
if ((b2.GetIdx() == bond.GetIdx())
or (b2.GetIdx() == b1.GetIdx())):
continue
idx4 = b2.GetOtherAtomIdx(idx3)
# skip 3-membered rings
if (idx4 == idx1):
continue
torsionList.append((idx1, idx2, idx3, idx4))
return torsionList
if (__name__ == "__main__"):
mol = Chem.MolFromSmiles('CCCCCC')
mol = Chem.AddHs(mol)
torsionList = enumerateTorsions(mol)
for torsion in torsionList:
sys.stdout.write(str(torsion) + '\n')
Cheers,
p.
On 20/10/2015 09:41, Jose Manuel Gally wrote:
> Hi RDKitters,
>
> I would like to consider parts of a conformation rigid (fixed dihedral
> angles) during minimization
> My end goal would be to generate only ring conformations starting with
> valid 3D molecules.
>
> I can already consider a specific dihedral angle as rigid:
>
> from rdkit import Chem
> from rdkit.Chem import AllChem, rdMolTransforms
>
> # create test mol
> s = 'COCCN1CCOCC1'
> m = Chem.MolFromSmiles(s)
> m = Chem.AddHs(m)
>
> # add 3D coordinates
> AllChem.EmbedMolecule(m)
>
> # freeze one dihedral angle (composed of atoms 0-3)
> MMFFs_MP = AllChem.MMFFGetMoleculeProperties(m, mmffVariant='MMFF94s')
> MMFFs_FF = AllChem.MMFFGetMoleculeForceField(m, MMFFs_MP)
> MMFFs_FF.MMFFAddTorsionConstraint(0, 1, 2, 3, relative=True,
> minDihedralDeg=0.0, maxDihedralDeg=0.0,forceConstant=99999999999999.0)
> c = m.GetConformer()
> print "before min", rdMolTransforms.GetDihedralDeg(c, 0,1,2,3) #
> -53.0873064656
>
> # minimize molecule with constrained dihedral angle
> MMFFs_FF.Minimize(maxIts=10)
> print "after first min", rdMolTransforms.GetDihedralDeg(c,0,1,2,3) #
> -53.0873064656
> MMFFs_FF.Minimize(maxIts=10)
> print "after second min", rdMolTransforms.GetDihedralDeg(c,0,1,2,3) #
> -53.0873064656
>
> However, I have difficulties to find all dihedral angles to consider
> rigid...
> I would like to detect dihedral angles with 4 atoms where:
> - none is hydrogen
> - no more than 2 atoms are in different rings
>
> First I looked for a function to return me the list of dihedral angles
> and iterate over it, but could not find any.
> My other alternative would be to iterate over atoms to get their
> neighbors, and then get their neighbor' neighbors, but that looks very
> very slow.
> Any other way to do this?
>
> Thank you!
>
> Jose Manuel
>
> ------------------------------------------------------------------------------
> _______________________________________________
> Rdkit-discuss mailing list
> Rdk...@li...
> https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
|