Source code for bcut

# -*- 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 Burden eigvenvalue descriptors. You can get 64

molecular decriptors. 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

##############################################################################
"""

from rdkit import Chem
from AtomProperty import GetRelativeAtomicProperty

import numpy
import numpy.linalg


Version=1.0
################################################################

def _GetBurdenMatrix(mol,propertylabel='m'):
    """
    #################################################################
    *Internal used only**
    
    Calculate Burden matrix and their eigenvalues.
    #################################################################
    """
    mol=Chem.AddHs(mol)
    Natom=mol.GetNumAtoms()

    AdMatrix=Chem.GetAdjacencyMatrix(mol)
    bondindex=numpy.argwhere(AdMatrix)
    AdMatrix1=numpy.array(AdMatrix,dtype=numpy.float32)
    
    #The diagonal elements of B, Bii, are either given by 
    #the carbon normalized atomic mass,
    #van der Waals volume, Sanderson electronegativity,
    #and polarizability of atom i.

    for i in range(Natom):
        atom=mol.GetAtomWithIdx(i)
        temp=GetRelativeAtomicProperty(element=atom.GetSymbol(),propertyname=propertylabel)
        AdMatrix1[i,i]=round(temp,3)
        
    #The element of B connecting atoms i and j, Bij, 
    #is equal to the square root of the bond
    #order between atoms i and j.
    
    for i in bondindex:
        bond=mol.GetBondBetweenAtoms(int(i[0]),int(i[1]))
        if bond.GetBondType().name =='SINGLE':
            AdMatrix1[i[0],i[1]]=round(numpy.sqrt(1),3)
        if bond.GetBondType().name=="DOUBLE":
            AdMatrix1[i[0],i[1]]=round(numpy.sqrt(2),3)
        if bond.GetBondType().name=="TRIPLE":
            AdMatrix1[i[0],i[1]]=round(numpy.sqrt(3),3)
        if bond.GetBondType().name=="AROMATIC":
            AdMatrix1[i[0],i[1]]=round(numpy.sqrt(1.5),3)
    
    ##All other elements of B (corresponding non bonded 
    #atom pairs) are set to 0.001       
    bondnonindex=numpy.argwhere(AdMatrix==0)
    
    for i in bondnonindex:
        if i[0]!=i[1]:
            
            AdMatrix1[i[0],i[1]]=0.001  
     
    return numpy.real(numpy.linalg.eigvals(AdMatrix1))
    
    

[docs]def CalculateBurdenMass(mol): """ ################################################################# Calculate Burden descriptors based on atomic mass. res--->dict type with 16 descriptors ################################################################# """ temp=_GetBurdenMatrix(mol,propertylabel='m') temp1=numpy.sort(temp[temp>=0]) temp2=numpy.sort(numpy.abs(temp[temp<0])) if len(temp1)<8: temp1=numpy.concatenate((numpy.zeros(8),temp1)) if len(temp2)<8: temp2=numpy.concatenate((numpy.zeros(8),temp2)) bcut=["bcutm16","bcutm15","bcutm14","bcutm13","bcutm12","bcutm11","bcutm10", "bcutm9","bcutm8","bcutm7","bcutm6","bcutm5","bcutm4","bcutm3", "bcutm2","bcutm1"] bcutvalue=numpy.concatenate((temp2[-8:],temp1[-8:])) bcutvalue=[round(i,3) for i in bcutvalue] res=dict(zip(bcut,bcutvalue)) return res
[docs]def CalculateBurdenVDW(mol): """ ################################################################# Calculate Burden descriptors based on atomic vloumes res-->dict type with 16 descriptors ################################################################# """ temp=_GetBurdenMatrix(mol,propertylabel='V') temp1=numpy.sort(temp[temp>=0]) temp2=numpy.sort(numpy.abs(temp[temp<0])) if len(temp1)<8: temp1=numpy.concatenate((numpy.zeros(8),temp1)) if len(temp2)<8: temp2=numpy.concatenate((numpy.zeros(8),temp2)) bcut=["bcutv16","bcutv15","bcutv14","bcutv13","bcutv12","bcutv11","bcutv10", "bcutv9","bcutv8","bcutv7","bcutv6","bcutv5","bcutv4","bcutv3", "bcutv2","bcutv1"] bcutvalue=numpy.concatenate((temp2[-8:],temp1[-8:])) bcutvalue=[round(i,3) for i in bcutvalue] res=dict(zip(bcut,bcutvalue)) return res
[docs]def CalculateBurdenElectronegativity(mol): """ ################################################################# Calculate Burden descriptors based on atomic electronegativity. res-->dict type with 16 descriptors ################################################################# """ temp=_GetBurdenMatrix(mol,propertylabel='En') temp1=numpy.sort(temp[temp>=0]) temp2=numpy.sort(numpy.abs(temp[temp<0])) if len(temp1)<8: temp1=numpy.concatenate((numpy.zeros(8),temp1)) if len(temp2)<8: temp2=numpy.concatenate((numpy.zeros(8),temp2)) bcut=["bcute16","bcute15","bcute14","bcute13","bcute12","bcute11","bcute10", "bcute9","bcute8","bcute7","bcute6","bcute5","bcute4","bcute3", "bcute2","bcute1"] bcutvalue=numpy.concatenate((temp2[-8:],temp1[-8:])) bcutvalue=[round(i,3) for i in bcutvalue] res=dict(zip(bcut,bcutvalue)) return res
[docs]def CalculateBurdenPolarizability(mol): """ ################################################################# Calculate Burden descriptors based on polarizability. res-->dict type with 16 descriptors ################################################################# """ temp=_GetBurdenMatrix(mol,propertylabel='alapha') temp1=numpy.sort(temp[temp>=0]) temp2=numpy.sort(numpy.abs(temp[temp<0])) if len(temp1)<8: temp1=numpy.concatenate((numpy.zeros(8),temp1)) if len(temp2)<8: temp2=numpy.concatenate((numpy.zeros(8),temp2)) bcut=["bcutp16","bcutp15","bcutp14","bcutp13","bcutp12","bcutp11","bcutp10", "bcutp9","bcutp8","bcutp7","bcutp6","bcutp5","bcutp4","bcutp3", "bcutp2","bcutp1"] bcutvalue=numpy.concatenate((temp2[-8:],temp1[-8:])) bcutvalue=[round(i,3) for i in bcutvalue] res=dict(zip(bcut,bcutvalue)) return res
[docs]def GetBurden(mol): """ ################################################################# Calculate all 64 Burden descriptors res-->dict type ################################################################# """ bcut={} bcut.update(CalculateBurdenMass(mol)) bcut.update(CalculateBurdenVDW(mol)) bcut.update(CalculateBurdenElectronegativity(mol)) bcut.update(CalculateBurdenPolarizability(mol)) return bcut
def _GetHTMLDoc(): """ ################################################################# Write HTML documentation for this module. ################################################################# """ import pydoc pydoc.writedoc('bcut') ######################################################################## if __name__ =='__main__': smi5=['CCOCCC','CCC(C)CC','CC(C)CCC','CC(C)C(C)C','CCCCCN','c1ccccc1N','C'] for index, smi in enumerate(smi5): m = Chem.MolFromSmiles(smi) print index+1 print smi, '\n' print GetBurden(m) print len(GetBurden(m))