Source code for molproperty
# -*- 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.
"""
##############################################################################
Calculation of Molecular physical/chemical properties based on some special
type of approaches(6), including: LogP; LogP2; MR; TPSA, UI and Hy.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 Crippen
from rdkit.Chem import MolSurf as MS
import math
Version=1.0
##############################################################
[docs]def CalculateMolLogP(mol):
"""
#################################################################
Cacluation of LogP value based on Crippen method
---->LogP
Usage:
result=CalculateMolLogP(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return round(Crippen._pyMolLogP(mol),3)
[docs]def CalculateMolLogP2(mol):
"""
#################################################################
Cacluation of LogP^2 value based on Crippen method
---->LogP2
Usage:
result=CalculateMolLogP2(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
res=Crippen._pyMolLogP(mol)
return round(res**2,3)
[docs]def CalculateMolMR(mol):
"""
#################################################################
Cacluation of molecular refraction value based on Crippen method
---->MR
Usage:
result=CalculateMolMR(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return round(Crippen._pyMolMR(mol),3)
[docs]def CalculateTPSA(mol):
"""
#################################################################
calculates the polar surface area of a molecule based upon fragments
Algorithm in:
P. Ertl, B. Rohde, P. Selzer
Fast Calculation of Molecular Polar Surface Area as a Sum of
Fragment-based Contributions and Its Application to the Prediction
of Drug Transport Properties, J.Med.Chem. 43, 3714-3717, 2000
Implementation based on the Daylight contrib program tpsa.
---->TPSA
Usage:
result=CalculateTPSA(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
return round(MS.TPSA(mol),3)
def _CalculateBondNumber(mol,bondtype='SINGLE'):
"""
#################################################################
**Internal used only*
Calculation of bond counts in a molecule. it may be
SINGLE, DOUBLE, TRIPLE and AROMATIC
#################################################################
"""
i=0;
for bond in mol.GetBonds():
if bond.GetBondType().name==bondtype:
i=i+1
return i
[docs]def CalculateUnsaturationIndex(mol):
"""
#################################################################
Calculation of unsaturation index.
---->UI
Usage:
result=CalculateUnsaturationIndex(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
nd=_CalculateBondNumber(mol,bondtype='DOUBLE')
nt=_CalculateBondNumber(mol,bondtype='TRIPLE')
na=_CalculateBondNumber(mol,bondtype='AROMATIC')
res=math.log((1+nd+nt+na),2)
return round(res,3)
[docs]def CalculateHydrophilicityFactor(mol):
"""
#################################################################
Calculation of hydrophilicity factor. The hydrophilicity
index is described in more detail on page 225 of the
Handbook of Molecular Descriptors (Todeschini and Consonni 2000).
---->Hy
Usage:
result=CalculateHydrophilicityFactor(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
nheavy=mol.GetNumAtoms(onlyHeavy=1)
nc=0
for atom in mol.GetAtoms():
if atom.GetAtomicNum()==6:
nc=nc+1
nhy=0
for atom in mol.GetAtoms():
if atom.GetAtomicNum()==7 or atom.GetAtomicNum()==8 or atom.GetAtomicNum()==16:
atomn=atom.GetNeighbors()
for i in atomn:
if i.GetAtomicNum()==1:
nhy=nhy+1
res=(1+nhy)*math.log((1+nhy),2)+nc*(1.0/nheavy*math.log(1.0/nheavy,2))+math.sqrt((nhy+0.0)/(nheavy^2))
return round(res,3)
[docs]def CalculateXlogP(mol):
"""
#################################################################
Calculation of Wang octanol water partition coefficient.
---->XLogP
Usage:
result=CalculateXlogP(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
pass
[docs]def CalculateXlogP2(mol):
"""
#################################################################
Calculation of Wang octanol water partition coefficient (XLogP^2).
---->XLogP2
Usage:
result=CalculateMolLogP(mol)
Input: mol is a molecule object.
Output: result is a numeric value.
#################################################################
"""
pass
MolecularProperty={'LogP':CalculateMolLogP,
'LogP2':CalculateMolLogP2,
'MR':CalculateMolMR,
'TPSA':CalculateTPSA,
'Hy':CalculateHydrophilicityFactor,
'UI':CalculateUnsaturationIndex
}
[docs]def GetMolecularProperty(mol):
"""
#################################################################
Get the dictionary of constitutional descriptors for
given moelcule mol
Usage:
result=GetMolecularProperty(mol)
Input: mol is a molecule object.
Output: result is a dict form containing 6 molecular properties.
#################################################################
"""
result={}
for DesLabel in MolecularProperty.keys():
result[DesLabel]=MolecularProperty[DesLabel](mol)
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',GetMolecularProperty(m)
#f.close()