# -*- coding: utf-8 -*-
# Copyright (c) 2016-2017, Zhijiang Yao, Jie Dong and Dongsheng Cao
# All rights reserved.
# This file is part of the PyBioMed.
# The contents are covered by the terms of the BSD license
# which is included in the file license.txt, found at the root
# of the PyBioMed source tree.
"""
##############################################################################
The calculation of molecular constitutional indices based on its topological
structure. You can get 30 molecular connectivity descriptors. You can freely
use and distribute it. If you hava any problem, you could contact with us timely!
Authors: Zhijiang Yao and Dongsheng Cao.
Date: 2016.06.04
Email: gadsby@163.com and oriental-cds@163.com
##############################################################################
"""
from rdkit import Chem
#from rdkit.Chem import rdchem
from rdkit.Chem import Lipinski as LPK
#import math
Version=1.0
#############################################################
[docs]def CalculateMolWeight(mol):
"""
#################################################################
Calculation of molecular weight
Note that not including H
---->Weight
Usage:
result=CalculateMolWeight(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
MolWeight=0
for atom in mol.GetAtoms():
MolWeight=MolWeight+atom.GetMass()
return MolWeight
[docs]def CalculateAverageMolWeight(mol):
"""
#################################################################
Calcualtion of average molecular weight
Note that not including H
---->AWeight
Usage:
result=CalculateAverageMolWeight(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
MolWeight=0
for atom in mol.GetAtoms():
MolWeight=MolWeight+atom.GetMass()
return MolWeight/mol.GetNumAtoms()
[docs]def CalculateHydrogenNumber(mol):
"""
#################################################################
Calculation of Number of Hydrogen in a molecule
---->nhyd
Usage:
result=CalculateHydrogenNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
i=0
Hmol=Chem.AddHs(mol)
for atom in Hmol.GetAtoms():
if atom.GetAtomicNum()==1:
i=i+1
return i
[docs]def CalculateHalogenNumber(mol):
"""
#################################################################
Calculation of Halogen counts in a molecule
---->nhal
Usage:
result=CalculateHalogenNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
i=0
for atom in mol.GetAtoms():
if atom.GetAtomicNum()==9 or atom.GetAtomicNum()==17 or atom.GetAtomicNum()==35 or atom.GetAtomicNum()==53:
i=i+1
return i
[docs]def CalculateHeteroNumber(mol):
"""
#################################################################
Calculation of Hetero counts in a molecule
---->nhet
Usage:
result=CalculateHeteroNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
i=0
for atom in mol.GetAtoms():
if atom.GetAtomicNum()==6 or atom.GetAtomicNum()==1:
i=i+1
return mol.GetNumAtoms()-i
[docs]def CalculateHeavyAtomNumber(mol):
"""
#################################################################
Calculation of Heavy atom counts in a molecule
---->nhev
Usage:
result=CalculateHeavyAtomNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return mol.GetNumAtoms(onlyHeavy=1)
def _CalculateElementNumber(mol,AtomicNumber=6):
"""
#################################################################
**Internal used only**
Calculation of element counts with atomic number equal to n in a molecule
#################################################################
"""
i=0
for atom in mol.GetAtoms():
if atom.GetAtomicNum()==AtomicNumber:
i=i+1
return i
[docs]def CalculateFluorinNumber(mol):
"""
#################################################################
Calculation of Fluorin counts in a molecule
---->ncof
Usage:
result=CalculateFluorinNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=9)
[docs]def CalculateChlorinNumber(mol):
"""
#################################################################
Calculation of Chlorin counts in a molecule
---->ncocl
Usage:
result=CalculateChlorinNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=17)
[docs]def CalculateBromineNumber(mol):
"""
#################################################################
Calculation of Bromine counts in a molecule
---->ncobr
Usage:
result=CalculateBromineNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=35)
[docs]def CalculateIodineNumber(mol):
"""
#################################################################
Calculation of Iodine counts in a molecule
---->ncoi
Usage:
result=CalculateIodineNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=53)
[docs]def CalculateCarbonNumber(mol):
"""
#################################################################
Calculation of Carbon number in a molecule
---->ncarb
Usage:
result=CalculateCarbonNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=6)
[docs]def CalculatePhosphorNumber(mol):
"""
#################################################################
Calcualtion of Phosphor number in a molecule
---->nphos
Usage:
result=CalculatePhosphorNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=15)
[docs]def CalculateSulfurNumber(mol):
"""
#################################################################
Calculation of Sulfur counts in a molecule
---->nsulph
Usage:
result=CalculateSulfurNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=16)
[docs]def CalculateOxygenNumber(mol):
"""
#################################################################
Calculation of Oxygen counts in a molecule
---->noxy
Usage:
result=CalculateOxygenNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=8)
[docs]def CalculateNitrogenNumber(mol):
"""
#################################################################
Calculation of Nitrogen counts in a molecule
---->nnitro
Usage:
result=CalculateNitrogenNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return _CalculateElementNumber(mol,AtomicNumber=7)
[docs]def CalculateRingNumber(mol):
"""
#################################################################
Calculation of ring counts in a molecule
---->nring
Usage:
result=CalculateRingNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return Chem.GetSSSR(mol)
[docs]def CalculateRotationBondNumber(mol):
"""
#################################################################
Calculation of rotation bonds counts in a molecule
---->nrot
Note that this is the same as calculation of single bond
counts in a molecule.
Usage:
result=CalculateRotationBondNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return LPK.NumRotatableBonds(mol)
[docs]def CalculateHdonorNumber(mol):
"""
#################################################################
Calculation of Hydrongen bond donor counts in a molecule
---->ndonr
Usage:
result=CalculateHdonorNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return LPK.NumHDonors(mol)
[docs]def CalculateHacceptorNumber(mol):
"""
#################################################################
Calculation of Hydrogen bond acceptor counts in a molecule
---->naccr
Usage:
result=CalculateHacceptorNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return LPK.NumHAcceptors(mol)
[docs]def CalculateSingleBondNumber(mol):
"""
#################################################################
Calculation of single bond counts in a molecule
---->nsb
Usage:
result=CalculateSingleBondNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
i=0;
for bond in mol.GetBonds():
if bond.GetBondType().name=='SINGLE':
i=i+1
return i
[docs]def CalculateDoubleBondNumber(mol):
"""
#################################################################
Calculation of double bond counts in a molecule
---->ndb
Usage:
result=CalculateDoubleBondNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
i=0;
for bond in mol.GetBonds():
if bond.GetBondType().name=='DOUBLE':
i=i+1
return i
[docs]def CalculateTripleBondNumber(mol):
"""
#################################################################
Calculation of triple bond counts in a molecule
---->ntb
Usage:
result=CalculateTripleBondNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
i=0;
for bond in mol.GetBonds():
if bond.GetBondType().name=='TRIPLE':
i=i+1
return i
[docs]def CalculateAromaticBondNumber(mol):
"""
#################################################################
Calculation of aromatic bond counts in a molecule
---->naro
Usage:
result=CalculateAromaticBondNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
i=0;
for bond in mol.GetBonds():
if bond.GetBondType().name=='AROMATIC':
i=i+1
return i
[docs]def CalculateAllAtomNumber(mol):
"""
#################################################################
Calculation of all atom counts in a molecule
---->nta
Usage:
result=CalculateAllAtomNumber(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return Chem.AddHs(mol).GetNumAtoms()
def _CalculatePathN(mol,PathLength=2):
"""
#################################################################
*Internal Use Only*
Calculation of the counts of path length N for a molecule
---->PC1-PC6
Usage:
result=CalculateMolWeight(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return len(Chem.FindAllPathsOfLengthN(mol,PathLength,useBonds=1))
[docs]def CalculatePath1(mol):
"""
#################################################################
Calculation of the counts of path length 1 for a molecule
#################################################################
"""
return _CalculatePathN(mol,1)
[docs]def CalculatePath2(mol):
"""
#################################################################
Calculation of the counts of path length 2 for a molecule
#################################################################
"""
return _CalculatePathN(mol,2)
[docs]def CalculatePath3(mol):
"""
#################################################################
Calculation of the counts of path length 3 for a molecule
#################################################################
"""
return _CalculatePathN(mol,3)
[docs]def CalculatePath4(mol):
"""
#################################################################
Calculation of the counts of path length 4 for a molecule
#################################################################
"""
return _CalculatePathN(mol,4)
[docs]def CalculatePath5(mol):
"""
#################################################################
Calculation of the counts of path length 5 for a molecule
#################################################################
"""
return _CalculatePathN(mol,5)
[docs]def CalculatePath6(mol):
"""
#################################################################
Calculation of the counts of path length 6 for a molecule
#################################################################
"""
return _CalculatePathN(mol,6)
_constitutional={'Weight':CalculateMolWeight,
'AWeight':CalculateAverageMolWeight,
'nhyd':CalculateHydrogenNumber,
'nhal':CalculateHalogenNumber,
'nhet':CalculateHeteroNumber,
'nhev':CalculateHeavyAtomNumber,
'ncof':CalculateFluorinNumber,
'ncocl':CalculateChlorinNumber,
'ncobr':CalculateBromineNumber,
'ncoi':CalculateIodineNumber,
'ncarb':CalculateCarbonNumber,
'nphos':CalculatePhosphorNumber,
'nsulph':CalculateOxygenNumber,
'noxy':CalculateOxygenNumber,
'nnitro':CalculateNitrogenNumber,
'nring':CalculateRingNumber,
'nrot':CalculateRotationBondNumber,
'ndonr':CalculateHdonorNumber,
'naccr':CalculateHacceptorNumber,
'nsb':CalculateSingleBondNumber,
'ndb':CalculateDoubleBondNumber,
'naro':CalculateAromaticBondNumber,
'ntb':CalculateTripleBondNumber,
'nta':CalculateAllAtomNumber,
'PC1':CalculatePath1,
'PC2':CalculatePath2,
'PC3':CalculatePath3,
'PC4':CalculatePath4,
'PC5':CalculatePath5,
'PC6':CalculatePath6
}
[docs]def GetConstitutional(mol):
"""
#################################################################
Get the dictionary of constitutional descriptors for given moelcule mol
Usage:
result=GetConstitutional(mol)
Input: mol is a molecule object.
Output: result is a dict form containing all constitutional values.
#################################################################
"""
result={}
for DesLabel in _constitutional.keys():
result[DesLabel]=round(_constitutional[DesLabel](mol),3)
return result
#############################################################
if __name__ =='__main__':
smis = ['CCCC','CCCCC','CCCCCC','CC(N)C(=O)O','CC(N)C(=O)[O-].[Na+]']
smi5=['CCCCCC','CCC(C)CC','CC(C)CCC','CC(C)C(C)C','CCCCCN','c1ccccc1N']
for index, smi in enumerate(smis):
m = Chem.MolFromSmiles(smi)
print index+1
print smi
print '\t',GetConstitutional(m)
print len(GetConstitutional(m))