modules/chempy/mmd.py (172 lines of code) (raw):
#A* -------------------------------------------------------------------
#B* This file contains source code for the PyMOL computer program
#C* copyright 1998-2000 by Warren Lyford Delano of DeLano Scientific.
#D* -------------------------------------------------------------------
#E* It is unlawful to modify or remove this copyright notice.
#F* -------------------------------------------------------------------
#G* Please see the accompanying LICENSE file for further information.
#H* -------------------------------------------------------------------
#I* Additional authors of this source file include:
#-*
#-*
#-*
#Z* -------------------------------------------------------------------
from __future__ import print_function
from chempy.models import Indexed,Connected
from chempy import Storage,Atom,Bond
import string
import copy
class MMD(Storage):
#---------------------------------------------------------------------------------
def fromList(self,MMODList):
model = Connected()
# get header information
nAtom = int(MMODList[0][1:6])
model.molecule.title = string.strip(MMODList[0][8:])
irec = 1
# loop through atoms
cnt = 0
for a in range(nAtom):
model.bond.append([])
for a in range(nAtom):
at = Atom()
at.numeric_type = int(MMODList[irec][1:4])
# extract connectivity information
tokens = string.splitfields(MMODList[irec][5:52])
at.neighbor = []
at.bondorder = []
for i in range(6):
if tokens[2*i] != "0":
a2 = int(tokens[2*i])-1
if (a2>cnt):
b = Bond()
b.index = [cnt,a2]
b.order = int(tokens[2*i+1])
model.bond[b.index[0]].append(b) # note two refs to same object
model.bond[b.index[1]].append(b) # note two refs to same object
else:
break
# extract other information
at.coord = [float(MMODList[irec][53:64]),
float(MMODList[irec][65:76]), float(MMODList[irec][77:88])]
at.resi = string.strip(MMODList[irec][89:94])
at.resi_number = int(at.resi)
resn_code = string.strip(MMODList[irec][94:95])
if len(resn_code): at.resn_code = resn_code
color_code = string.strip(MMODList[irec][96:100])
if color_code!='':
at.color_code = int(color_code)
else:
at.color_code = 0
chain = string.strip(MMODList[irec][95:96])
if len(chain): at.chain = chain
at.partial_charge = float(MMODList[irec][100:109])
at.resn = MMODList[irec][119:123]
name = string.strip(MMODList[irec][124:128])
if len(name): at.name = name
model.atom.append(at)
irec = irec + 1
cnt = cnt + 1
# fill in remaining datatypes
cnt = 1
for a in model.atom:
a.text_type = MMOD_atom_data[a.numeric_type][0]
a.symbol = MMOD_atom_data[a.numeric_type][1]
a.formal_charge = MMOD_atom_data[a.numeric_type][4]
cnt = cnt + 1
return(model.convert_to_indexed())
#---------------------------------------------------------------------------------
def updateFromList(self,model,list): # updates charges and coordinates
nAtom = int(list[0][1:6])
try:
model.molecule.energy = float(list[0][58:68])/4.184 # convert to kcal
except:
if hasattr(model.molecule,'energy'):
del model.molecule.energy
if nAtom!=model.nAtom:
raise RuntimeError(" mmd: atom count mismatch")
c = 0
for a in list[1:]:
mac = model.atom[c]
mac.coord = [float(a[53:64]),
float(a[65:76]), float(a[77:88])]
mac.partial_charge = float(a[100:109])
c = c + 1
#---------------------------------------------------------------------------------
def toList(self,model,no_blank_names=1):
conn = copy.deepcopy(model)
conn = conn.convert_to_connected()
MMODList = []
MMODList.append(" %5d %-70s\n" %(conn.nAtom,conn.molecule.title))
c = 0
neighbors_len = 6
for i in conn.atom:
# construct neighbor list
neighbors = [0] * neighbors_len
bondorders = [0] * neighbors_len
for j, b in enumerate(conn.bond[c]):
if j >= neighbors_len:
print(" Warning: too many bonds")
break
n = b.index[0]
if n == c:
n = b.index[1]
neighbors[j] = n + 1
bondorders[j] = b.order
# assemble output line
if i.numeric_type>0:
tline = " %3d" % (i.numeric_type)
else:
tline = " %3d" % 64
for j in range(neighbors_len):
tline = tline + " %5d %1d" % (neighbors[j], bondorders[j])
tline = tline + " %11.6f %11.6f %11.6f " % (i.coord[0],
i.coord[1], i.coord[2])
name = i.name
if not len(name):
if no_blank_names:
name = "%s%d" % (i.symbol,c+1)
name = name[0:4]
tline = tline + "%5d%1s%1s%4d%9.5f%9.5f %-4s %4s\n" % \
(i.resi_number,i.resn_code, i.chain, i.color_code,
i.partial_charge, i.partial_charge, i.resn, name)
MMODList.append(tline)
c = c + 1
return(MMODList)
#---------------------------------------------------------------------------------
'#Ntype Atype Elem Hybr Att Chg\n',
MMOD_atom_data = {
1: ['C1','C' ,'sp' , 2, 0],
2: ['C2','C' ,'sp2', 3, 0],
3: ['C3','C' ,'sp3', 4, 0],
4: ['CA','C' ,'sp3', 3, 0],
5: ['CB','C' ,'sp3', 2, 0],
6: ['CC','C' ,'sp3', 1, 0],
7: ['CD','C' ,'sp2', 2, 0],
8: ['CE','C' ,'sp2', 1, 0],
9: ['CF','C' ,'sp' , 1, 0],
10: ['CM','C' ,'unk',-1,-1],
11: ['CP','C' ,'unk',-1, 1],
12: ['CR','C' ,'unk',-1, 0],
14: ['C0','C' ,'unk',-1, 0],
15: ['O2','O' ,'sp2', 1, 0],
16: ['O3','O' ,'sp3', 2, 0],
17: ['OA','O' ,'sp3', 1, 0],
18: ['OM','O' ,'sp3', 1,-1],
19: ['OW','O' ,'sp3', 0, 0],
20: ['OP','O' ,'sp2', 2, 1],
21: ['OQ','O' ,'sp3', 3, 1],
23: ['O0','O' ,'unk',-1, 0],
24: ['N1','N' ,'sp' , 1, 0],
25: ['N2','N' ,'sp2', 2, 0],
26: ['N3','N' ,'sp3', 3, 0],
27: ['NA','N' ,'sp3', 2, 0],
28: ['NB','N' ,'sp3', 1, 0],
29: ['NC','N' ,'sp3', 0, 0],
30: ['ND','N' ,'sp2', 1, 0],
31: ['N4','N' ,'sp2', 3, 1],
32: ['N5','N' ,'sp3', 4, 1],
33: ['NE','N' ,'sp3', 3, 1],
34: ['NF','N' ,'sp3', 2, 1],
35: ['NG','N' ,'sp3', 1, 1],
36: ['NH','N' ,'sp2', 2, 1],
37: ['NI','N' ,'sp2', 1, 1],
40: ['N0','N' ,'unk',-1, 0],
41: ['H1','H' ,'s' , 1, 0],
42: ['H2','H' ,'s' , 1, 0],
43: ['H3','H' ,'s' , 1, 0],
44: ['H4','H' ,'s' , 0, 0],
45: ['H5','H' ,'s' , 0, 0],
48: ['H0','H' ,'s' ,-1, 0],
49: ['S1','S' ,'sp3', 2, 0],
50: ['SA','S' ,'sp3', 1, 0],
51: ['SM','S' ,'sp3', 0,-1],
52: ['S0','S' ,'unk',-1, 0],
53: ['P0','P' ,'unk',-1, 0],
54: ['B2','B' ,'sp2', 2, 0],
55: ['B3','B' ,'sp3', 3, 0],
56: ['F0','F' ,'sp3', 1, 0],
57: ['Cl','Cl','sp3', 1, 0],
58: ['Br','Br','sp3', 1, 0],
59: ['I0','I' ,'sp3', 1, 0],
60: ['Si','Si','unk',-1, 0],
61: ['Du','Du','unk',-1, 0],
62: ['Du','Du','unk',-1, 0],
63: ['Lp','Lp','unk', 1, 0],
64: ['Du','Du','unk',-1, 0]};