1
2
3
4
5
6 import Chem,Geometry
7 from Chem import AllChem
8 from Chem.Subshape import SubshapeObjects
9 from Chem.Subshape import BuilderUtils
10 import time,cPickle
11
12
17
18
20 gridDims=(20,15,10)
21 gridSpacing=0.5
22 winRad=3.0
23 nbrCount=7
24 terminalPtRadScale=0.75
25 fraction=0.25
26 stepSize=1.0
27 featFactory=None
28
41
53
55 if conf and skelFromConf:
56 pts = BuilderUtils.FindTerminalPtsFromConformer(conf,self.winRad,self.nbrCount)
57 else:
58 pts = BuilderUtils.FindTerminalPtsFromShape(shape,self.winRad,self.fraction)
59 pts = BuilderUtils.ClusterTerminalPts(pts,self.winRad,self.terminalPtRadScale)
60 BuilderUtils.ExpandTerminalPts(shape,pts,self.winRad)
61 if len(pts)<3:
62 raise ValueError,'only found %d terminals, need at least 3'%len(pts)
63
64 if not terminalPtsOnly:
65 pts = BuilderUtils.AppendSkeletonPoints(shape.grid,pts,self.winRad,self.stepSize)
66 for i,pt in enumerate(pts):
67 BuilderUtils.CalculateDirectionsAtPoint(pt,shape.grid,self.winRad)
68 if conf and self.featFactory:
69 BuilderUtils.AssignMolFeatsToPoints(pts,conf.GetOwningMol(),self.featFactory,self.winRad)
70 shape.skelPts=pts
71
84
85
86 if __name__=='__main__':
87 from Chem import AllChem,ChemicalFeatures
88 from Chem.PyMol import MolViewer
89
90
91 if 1:
92 cmpd = Chem.MolFromSmiles('C1=CC=C1C#CC1=CC=C1')
93 cmpd = Chem.AddHs(cmpd)
94 AllChem.EmbedMolecule(cmpd)
95 AllChem.UFFOptimizeMolecule(cmpd)
96 AllChem.CanonicalizeMol(cmpd)
97 print >>file('testmol.mol','w+'),Chem.MolToMolBlock(cmpd)
98 else:
99 cmpd = Chem.MolFromMolFile('testmol.mol')
100 builder=SubshapeBuilder()
101 if 1:
102 shape=builder.GenerateSubshapeShape(cmpd)
103 v = MolViewer()
104 if 1:
105 import tempfile
106 tmpFile = tempfile.mktemp('.grd')
107 v.server.deleteAll()
108 Geometry.WriteGridToFile(shape.grid,tmpFile)
109 time.sleep(1)
110 v.ShowMol(cmpd,name='testMol',showOnly=True)
111 v.server.loadSurface(tmpFile,'testGrid','',2.5)
112 v.server.resetCGO('*')
113
114 cPickle.dump(shape,file('subshape.pkl','w+'))
115 for i,pt in enumerate(shape.skelPts):
116 v.server.sphere(tuple(pt.location),.5,(1,0,1),'Pt-%d'%i)
117 if not hasattr(pt,'shapeDirs'): continue
118 momBeg = pt.location-pt.shapeDirs[0]
119 momEnd = pt.location+pt.shapeDirs[0]
120 v.server.cylinder(tuple(momBeg),tuple(momEnd),.1,(1,0,1),'v-%d'%i)
121