Source code for kappa
# -*- 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 Kier and Hall's kappa indices based on its topological
structure. You can get 7 molecular kappa 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 pyPeriodicTable as PeriodicTable
periodicTable = rdchem.GetPeriodicTable()
Version=1.0
################################################################
[docs]def CalculateKappa1(mol):
"""
#################################################################
Calculation of molecular shape index for one bonded fragment
---->kappa1
Usage:
result=CalculateKappa1(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
P1=mol.GetNumBonds(onlyHeavy=1)
A=mol.GetNumAtoms(onlyHeavy=1)
denom=P1+0.0
if denom:
kappa=(A)*(A-1)**2/denom**2
else:
kappa=0.0
return round(kappa,3)
[docs]def CalculateKappa2(mol):
"""
#################################################################
Calculation of molecular shape index for two bonded fragment
---->kappa2
Usage:
result=CalculateKappa2(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
P2=len(Chem.FindAllPathsOfLengthN(mol,2))
A=mol.GetNumAtoms(onlyHeavy=1)
denom=P2+0.0
if denom:
kappa=(A-1)*(A-2)**2/denom**2
else:
kappa=0.0
return round(kappa,3)
[docs]def CalculateKappa3(mol):
"""
#################################################################
Calculation of molecular shape index for three bonded fragment
---->kappa3
Usage:
result=CalculateKappa3(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
P3=len(Chem.FindAllPathsOfLengthN(mol,3))
A=mol.GetNumAtoms(onlyHeavy=1)
denom=P3+0.0
if denom:
if A % 2 == 1:
kappa=(A-1)*(A-3)**2/denom**2
else:
kappa=(A-3)*(A-2)**2/denom**2
else:
kappa=0.0
return round(kappa,3)
def _HallKierAlpha(mol):
"""
#################################################################
*Internal Use Only*
Calculation of the Hall-Kier alpha value for a molecule
#################################################################
"""
alphaSum=0.0
rC=PeriodicTable.nameTable['C'][5]
for atom in mol.GetAtoms():
atNum=atom.GetAtomicNum()
if not atNum: continue
symb=atom.GetSymbol()
alphaV = PeriodicTable.hallKierAlphas.get(symb,None)
if alphaV is not None:
hyb=atom.GetHybridization()-2
if hyb<len(alphaV):
alpha=alphaV[hyb]
if alpha is None:
alpha=alphaV[-1]
else:
alpha=alphaV[-1]
else:
rA=PeriodicTable.nameTable[symb][5]
alpha=rA/rC-1
alphaSum += alpha
return alphaSum
[docs]def CalculateKappaAlapha1(mol):
"""
#################################################################
Calculation of molecular shape index for one bonded fragment
with Alapha
---->kappam1
Usage:
result=CalculateKappaAlapha1(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
P1=mol.GetNumBonds(onlyHeavy=1)
A=mol.GetNumAtoms(onlyHeavy=1)
alpha=_HallKierAlpha(mol)
denom=P1+alpha
if denom:
kappa=(A+alpha)*(A+alpha-1)**2/denom**2
else:
kappa=0.0
return round(kappa,3)
[docs]def CalculateKappaAlapha2(mol):
"""
#################################################################
Calculation of molecular shape index for two bonded fragment
with Alapha
---->kappam2
Usage:
result=CalculateKappaAlapha2(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
P2=len(Chem.FindAllPathsOfLengthN(mol,2))
A=mol.GetNumAtoms(onlyHeavy=1)
alpha=_HallKierAlpha(mol)
denom=P2+alpha
if denom:
kappa=(A+alpha-1)*(A+alpha-2)**2/denom**2
else:
kappa=0.0
return round(kappa,3)
[docs]def CalculateKappaAlapha3(mol):
"""
#################################################################
Calculation of molecular shape index for three bonded fragment
with Alapha
---->kappam3
Usage:
result=CalculateKappaAlapha3(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
P3=len(Chem.FindAllPathsOfLengthN(mol,3))
A=mol.GetNumAtoms(onlyHeavy=1)
alpha=_HallKierAlpha(mol)
denom=P3+alpha
if denom:
if A % 2 == 1:
kappa=(A+alpha-1)*(A+alpha-3)**2/denom**2
else:
kappa=(A+alpha-3)*(A+alpha-2)**2/denom**2
else:
kappa=0.0
return round(kappa,3)
[docs]def CalculateFlexibility(mol):
"""
#################################################################
Calculation of Kier molecular flexibility index
---->phi
Usage:
result=CalculateFlexibility(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
kappa1=CalculateKappaAlapha1(mol)
kappa2=CalculateKappaAlapha2(mol)
A=mol.GetNumAtoms(onlyHeavy=1)
phi=kappa1*kappa2/(A+0.0)
return phi
[docs]def GetKappa(mol):
"""
#################################################################
Calculation of all kappa values.
Usage:
result=GetKappa(mol)
Input: mol is a molecule object.
Output: result is a dcit form containing 6 kappa values.
#################################################################
"""
res={}
res['kappa1']=CalculateKappa1(mol)
res['kappa2']=CalculateKappa2(mol)
res['kappa3']=CalculateKappa3(mol)
res['kappam1']=CalculateKappaAlapha1(mol)
res['kappam2']=CalculateKappaAlapha2(mol)
res['kappam3']=CalculateKappaAlapha3(mol)
res['phi']=CalculateFlexibility(mol)
return res
################################################################
if __name__ =='__main__':
smis = ['CCCC','CCCCC','CCCCCC','CC(N)C(=O)O','CC(N)C(=O)[O-].[Na+]']
for index, smi in enumerate(smis):
m = Chem.MolFromSmiles(smi)
print index+1
print smi
print '\t',GetKappa(m)
print '\t',len(GetKappa(m))