1
2
3
4
5
6
7
8
9
10
11
12
13
14 import Tkinter, Numeric
15 import Pmw
16 import glob
17 from math import pi, sqrt, ceil
18 from string import split, strip
19 from os.path import basename, exists
20 from types import StringType
21
22 from sff.amber import Amber94, AmberParm
23 from sff.amber import prmlib
24 from sff.amber import BinTrajectory
25
26 from ViewerFramework.VFCommand import CommandGUI
27
28 from Pmv.mvCommand import MVCommand
29 from Pmv.stringSelectorGUI import StringSelectorGUI
30
31 from MolKit.molecule import Atom, AtomSet, Bond
32 from MolKit.protein import Chain,Residue
33 from MolKit.amberPrmTop import Parm
34 from MolKit import data
35
36 from mglutil.gui.InputForm.Tk.gui import InputFormDescr
37 from mglutil.gui.BasicWidgets.Tk.customizedWidgets import ListChooser
38 from mglutil.gui.BasicWidgets.Tk.thumbwheel import ThumbWheel
39 from mglutil.util.callback import CallBackFunction
40
41 from DejaVu.Geom import Geom
42 from DejaVu.Spheres import Spheres
43 from DejaVu.IndexedPolylines import IndexedPolylines
44
45 from DejaVu.glfLabels import GlfLabels
46
47 Amber94Config = {}
48 CurrentAmber94 = {}
49
50
51
53 """This command creates an instance of Amber94 class and enters it in Amber94Config dictionary with specified name as the key. The Amber94 instance requires a Parm instance, which can be built from scratch or readin from a file.
54 \nPackage : Pmv
55 \nModule : amberCommands
56 \nClass : SetupAmber94
57 \nCommand : setupAmber94
58 \nSynopsis:\n
59 None<-setup_Amber94(chains, key, filename=None, dataDict={}, **kw)\n
60 \nArguments:\n
61 chains --- atoms to be minimized\n
62 key --- identifier to be key for this Amber94 instance in Amber94Config dictionary\n
63 filename --- optional filename to read in for prmtop\n
64 dataDict --- optional dictionary of parameter data to use for Parm instance\n
65 """
66
67
68 from Pmv.amberCommands import CurrentAmber94
69
70
72 MVCommand.__init__(self)
73 self.useFile = Tkinter.IntVar()
74 self.useFile.set(0)
75 self.specData = Tkinter.IntVar()
76 self.specData.set(0)
77 self.file = None
78 self.keyStr = Tkinter.StringVar()
79 self.fileTypes = [('prm files:', '*.prm'), ('prmtop files:', '*.prmtop'), ('allfiles', '*')]
80 self.fileBrowserTitle = "Read Amber PrmTop File"
81 self.lastDir = "."
82
83
84 - def __call__(self, chains, key, filename=None, dataDict = {},**kw):
85 """None<---setup_Amber94(chains, key, filename=None, dataDict={}, **kw)
86 \nchains --- atoms to be minimized
87 \nkey --- identifier to be key for this Amber94 instance in Amber94Config dictionary
88 \nfilename --- optional filename to read in for prmtop
89 \ndataDict --- optional dictionary of parameter data to use for Parm instance
90 """
91 chains = self.vf.expandNodes(chains)
92 if not len(chains):
93 return 'ERROR'
94 chains = chains.findType(Chain)
95 kw['dataDict'] = dataDict
96 kw['filename'] = filename
97 return apply(self.doitWrapper, (chains, key), kw)
98
99
100 - def doit(self, chains, key, **kw):
101 atoms = chains.residues.atoms
102 filename = kw['filename']
103 if filename is not None:
104 if not exists(filename):
105 print filename, " does not exist"
106 return "ERROR"
107 amb_ins = Amber94(atoms, prmfile=filename)
108
109
110 else:
111 dataDict = kw.get('dataDict', {})
112 print 'calling Amber94 init with dataDict=', dataDict
113 amb_ins = Amber94(atoms, dataDict = dataDict)
114 amb_ins.key = key
115 Amber94Config[key] = [amb_ins]
116 self.CurrentAmber94 = amb_ins
117 print 'set CurrentAmber94 to', self.CurrentAmber94
118
119
120
121
123 if self.useFile.get():
124 self.file = self.vf.askFileOpen(types=self.fileTypes,
125 idir = self.lastDir,
126 title=self.fileBrowserTitle)
127
128
130
131 if not len(self.vf.Mols):
132 self.warningMsg('must load molecule first')
133 return "ERROR"
134 nodes = self.vf.getSelection()
135 if not len(nodes):
136 self.warningMsg('nothing in the selection')
137 return "ERROR"
138
139 chains = nodes.findType(Chain).uniq()
140 ifd = self.ifd = InputFormDescr(title = " Set Up Amber94 instance:")
141 ifd.append({'name':'fileRB0',
142 'widgetType':Tkinter.Radiobutton,
143 'wcfg':{'text':'Read from file',
144 'variable': self.useFile,
145 'command': self.getFile,
146 'value':1,
147 },
148 'gridcfg':{'sticky':'w'}})
149 ifd.append({'name':'fileRB1',
150 'widgetType':Tkinter.Radiobutton,
151 'wcfg':{'text':'Build from atoms',
152 'variable': self.useFile,
153 'value':0,
154 },
155 'gridcfg':{'sticky':'w', 'row':-1, 'column':1}})
156 ifd.append({'name':'parmDCB',
157 'widgetType':Tkinter.Checkbutton,
158 'wcfg':{'text':'Specify parm data',
159 'variable': self.specData,
160 'command': self.setData,
161 },
162 'gridcfg':{'sticky':'w', 'row':-1, 'column':2}})
163 ifd.append({'name': 'nameStr',
164 'widgetType':Tkinter.Entry,
165 'wcfg':{
166 'label': 'Enter identifier',
167 'textvariable': self.keyStr,
168 },
169 'gridcfg':{'sticky':'we', 'columnspan':3}})
170 vals = self.vf.getUserInput(self.ifd, modal=0, blocking=1, okcancel=1)
171 if len(vals)>0:
172 if not self.useFile.get():
173 file = None
174 else:
175 file = self.file
176 key = vals['nameStr']
177 kw = {}
178 if hasattr(self, 'dataDict'):
179 kw['dataDict'] = self.dataDict
180 kw['filename'] = file
181 return apply(self.doitWrapper, (chains, key), kw)
182 else:
183 return 'ERROR'
184
185
187 print 'in setData'
188
189 if not self.specData.get():
190 return
191
192
193
194
195
196
197 ntList = []
198 for i in glob.glob(data.__path__[0] + '/*nt_dat.py'):
199 ent = split(basename(i),'.')[0]
200 ntList.append((ent, None))
201
202 for i in glob.glob(data.__path__[0] + '/*nt94_dat.py'):
203 ent = split(basename(i),'.')[0]
204 ntList.append((ent, None))
205
206 ctList = []
207 for i in glob.glob(data.__path__[0] + '/*ct_dat.py'):
208 ent = split(basename(i),'.')[0]
209 ctList.append((ent, None))
210
211 for i in glob.glob(data.__path__[0] + '/*ct94_dat.py'):
212 ent = split(basename(i),'.')[0]
213 ctList.append((ent, None))
214
215 allList = []
216 for i in glob.glob(data.__path__[0] + '/*_dat.py'):
217 n = basename(i)
218 ent = split(basename(i),'.')[0]
219 t = (ent, None)
220 if not (t in ntList) and not (t in ctList):
221 allList.append(t)
222
223 ifd2 = InputFormDescr(title = " Select Amber94 data dictionaries:")
224 ifd2.append({'name':'allDictLB',
225 'widgetType':ListChooser,
226 'wcfg':{'entries':allList,
227 'mode': 'multiple',
228 'title': 'data files for\n\nnon-terminal residues:',
229
230 'lbwcfg':{'height':5,
231 'selectforeground': 'red',
232 'exportselection': 0,
233 'width': 30},
234 },
235 'gridcfg':{'sticky':'we'}})
236 ifd2.append({'name':'ntDictLB',
237 'widgetType':ListChooser,
238 'wcfg':{'entries':ntList,
239 'mode': 'multiple',
240 'title': 'n-terminus residues:',
241
242 'lbwcfg':{'height':5,
243 'selectforeground': 'red',
244 'exportselection': 0,
245 'width': 30},
246 },
247 'gridcfg':{'sticky':'we'}})
248 ifd2.append({'name': 'ctDictLB',
249 'widgetType':ListChooser,
250 'wcfg':{'entries':ctList,
251 'mode': 'multiple',
252 'title': 'c-terminus residues:',
253
254 'lbwcfg':{'height':5,
255 'selectforeground': 'red',
256 'exportselection': 0,
257 'width': 30},
258 },
259 'gridcfg':{'sticky':'we'}})
260 vals2 = self.vf.getUserInput(ifd2, modal=0, blocking=1, okcancel=1)
261 if len(vals2)>0:
262 dataDict = self.dataDict = {}
263 dataDict['allDictList'] = vals2['allDictLB']
264 dataDict['ntDictList'] = vals2['ntDictLB']
265 dataDict['ctDictList'] = vals2['ctDictLB']
266
267
268
269 SetupAmber94CommandGUI = CommandGUI()
270 SetupAmber94CommandGUI.addMenuCommand('menuRoot', 'Amber', 'Setup Amber94')
271
272
273
275 """
276 This class allows you to set minimization options of a Amber94 instance
277 These options include cut, nsnb, dield and verbose. NB: this is written as
278 a separate class in order to create a clear log.
279 \nPackage : Pmv
280 \nModule : amberCommands
281 \nClass : SetMinimOptsAmber94
282 \nCommand : setMinimOptsAmber94
283 \nSynopsis:\n
284 None<-setminimOpts_Amber94(key, **kw)
285 \nArguments:\n
286 key --- identifier to be key for this Amber94 instance in Amber94Config dictionary\n
287 """
288
289 from Pmv.amberCommands import CurrentAmber94
290
291
293 """
294 None<-setminimOpts_Amber94(key, **kw)
295
296 """
297 return apply(self.doitWrapper, (key,), kw)
298
299
300 - def doit(self, key, **kw):
301 if key not in Amber94Config.keys():
302 print 'key: ', key, " is not in current Amber94Config "
303 return 'ERROR'
304 amber94instance = Amber94Config[key][0]
305 amb_ins = self.CurrentAmber94 = amber94instance
306 for k in kw.keys():
307 assert k in ['cut', 'nsnb', 'ntpr', 'scnb','scee',
308 'mme_init_first', 'dield', 'verbosemm']
309 apply(amb_ins.setMinimizeOptions, (), kw)
310
311
313 form = ifd.form
314 form.withdraw()
315
316
412
413
415
416 self.form.withdraw()
417
418 key = self.ifd.entryByName['amberIds']['widget'].get()
419 amb_ins = Amber94Config[key][0]
420
421 minOptD = {}
422 for v in ['cut_tw', 'nsnb_tw','ntpr_tw']:
423 val = self.ifd.entryByName[v]['widget'].get()
424 s = split(v,'_')[0]
425 minOptD[s] = val
426
427 w = self.ifd.entryByName['verbose_cb']['widget'].get()
428 if w not in self.verbose_list:
429 minOptD['verbosemm'] = 1
430 else:
431 minOptD['verbosemm'] = self.verbose_list.index(w)
432 minOptD['dield'] = self.dield.get()
433 apply(self.doitWrapper, (key,), minOptD )
434
435
436
437 - def update(self, event=None):
441
442
443
444
445
446
448 if not len(Amber94Config.keys()):
449 self.warningMsg('no Amber94 objects present: SetupAmber94 first')
450 return 'ERROR'
451
452 if self.CurrentAmber94=={}:
453 self.CurrentAmber94 = Amber94Config.values()[0][0]
454
455
456 if not hasattr(self, 'ifd'):
457 self.buildForm()
458 else:
459 lb = self.ifd.entryByName['amberIds']['widget']._list
460
461 lb.delete(0, 'end')
462 for k in Amber94Config.keys():
463 lb.insert('end', k)
464 self.form.deiconify()
465
466
467 SetMinimOptsAmber94CommandGUI = CommandGUI()
468 SetMinimOptsAmber94CommandGUI.addMenuCommand('menuRoot', 'Amber', 'Minimization',
469 cascadeName = 'Set Options')
470
471
472
474 """
475 This class allows you to select an Amber94 instance from Amber94Config
476 whose keys are ids specified in setup_Amber94 for the Amber94 instances.
477 You can also set minimization options, freeze atoms, specify constrained
478 atoms and anchor atoms and set maxIter, drms and dfpred. The minimization
479 can be run repeatedly.
480 \nPackage : Pmv
481 \nModule : amberCommands
482 \nClass : MinimizeAmber94
483 \nCommand : minimizeAmber94
484 \nSynopsis:\n
485 return_code<-minimize_amber94(key, **kw)
486 \nArguments:\n
487 key --- key into Amber94Config dictionary\n
488 """
489
490 from Pmv.amberCommands import CurrentAmber94
491
493 self.energyLabel = GlfLabels('minimize Energy',
494 inheritMaterial=0,
495 shape=(0,3))
496 self.vf.GUI.VIEWER.AddObject(self.energyLabel)
497
498
500 """return_code<-minimize_amber94(key, **kw)
501
502 \npossible return codes:\n
503 >0 converged, final iteration number\n
504 -1 bad line search, probably an error in the relation
505 of the funtion to its gradient (perhaps from
506 round-off if you push too hard on the minimization).\n
507 -2 search direction was uphill\n
508 -3 exceeded the maximum number of iterations\n
509 -4 could not further reduce function value\n
510 -5 stopped via signal (bsd)\n
511
512 key is key into Amber94Config dictionary\n
513 \nkw is dictionary with keys:\n
514 maxIter -maximum number of iterations\n
515 drms -convergence criterion for energy gradient\n
516 dfpred -predicted drop in conj grad func on 1st iteration\n
517 \nkeys removed before call to minimize:\n
518 callback\n
519 callback_freq\n
520 """
521 return apply(self.doitWrapper, (key,), kw)
522
523
524 - def doit(self, key, **kw):
525 if key not in Amber94Config.keys():
526 print 'key: ', key, " is not in current Amber94Config "
527 return 'ERROR'
528 amber94instance = Amber94Config[key][0]
529 amb = self.CurrentAmber94 = amber94instance
530
531
532
533 freq = int(kw.get('callback_freq', 0))
534 callback = kw.get('callback')
535
536 for k in ['callback_freq', 'callback']:
537 if kw.has_key(k):
538 del kw[k]
539
540
541
542 if callback:
543
544 if not hasattr(amb, 'coord_index'):
545 amb.atoms.addConformation(amb.atoms.coords[:])
546 amb.coord_index = len(amb.atoms[0]._coords)-1
547
548 print 'setting callback to updateCoords'
549 amb.setCallback(self.updateCoords, freq)
550
551 return_code = apply(amber94instance.minimize,(), kw)
552 print 'return_code=', return_code
553 return return_code
554
555
556 - def updateCoords(self, cbNum=0, nbat=300, coords=[], energies=[], step=[]):
557
558
559 amb = self.CurrentAmber94
560 mols = amb.atoms.top.uniq()
561 allAtoms = mols.chains.residues.atoms
562 newcoords = Numeric.array(amb.coords[:])
563 newcoords.shape = (-1,3)
564 allAtoms.updateCoords(newcoords.tolist(), amb.coord_index)
565 self.vf.displayLines(allAtoms, topCommand=0)
566 pos = Numeric.maximum.reduce(amb.atoms.coords).astype('f')
567 self.energyLabel.Set(vertices=[pos],
568 labels=[str(amb.energies[8])], tagModified=False)
569 self.vf.GUI.VIEWER.currentCamera.update()
570
571
573 form = ifd.form
574 form.withdraw()
575
576
720
721
722
724 w = self.ifd.entryByName['callback_ent']['widget']
725 if self.callback.get():
726 w.config(state='normal', fg='black', selectbackground='#c3c3c3',
727 selectforeground='black')
728 else:
729 w.config(state='disabled', fg='grey', selectbackground='#d9d9d9',
730 selectforeground='grey')
731
732
734 self.form.withdraw()
735
736 key = self.ifd.entryByName['amberIds']['widget'].get()
737
738
739
740
741
742
743
744
745
746
747
748 d = {}
749
750 for v in [ 'maxIter_tw','drms_tw','dfpred_tw']:
751 s = split(v,'_')[0]
752 val = self.ifd.entryByName[v]['widget'].get()
753
754
755 d[s] = val
756 d['callback'] = self.callback.get()
757 d['callback_freq'] = self.callbackFreq.get()
758 return apply(self.doitWrapper, (key,), d)
759
760
762
763 self.ifd.entryByName['setminopts_cb']['widget'].toggle()
764 self.vf.setminimOpts_Amber94.guiCallback()
765
766
768
769 self.ifd.entryByName['setfroz_cb']['widget'].toggle()
770 print 'calling freezeAtoms'
771 numFroz = self.vf.freezeAtoms_Amber94.guiCallback()
772
773
774
775
777
778 self.ifd.entryByName['setcons_cb']['widget'].toggle()
779 print 'calling constrainAtoms'
780 numConstr = self.vf.constrainAtoms_Amber94.guiCallback()
781 cstr = 'Currently ' + str(numConstr) + ' constrained atoms'
782 self.constrLab.set(cstr)
783
784
785 - def update(self, event=None):
789
790
791
792
793
794
796 if not len(Amber94Config.keys()):
797 self.warningMsg('no Amber94 objects present: SetupAmber94 first')
798 return 'ERROR'
799
800 if self.CurrentAmber94=={}:
801 self.CurrentAmber94 = Amber94Config.values()[0][0]
802
803
804 if not hasattr(self, 'ifd'):
805 self.buildForm()
806 else:
807 lb = self.ifd.entryByName['amberIds']['widget']._list
808
809 lb.delete(0, 'end')
810 for k in Amber94Config.keys():
811 lb.insert('end', k)
812 self.form.deiconify()
813
814
815 MinimizeAmber94CommandGUI = CommandGUI()
816 MinimizeAmber94CommandGUI.addMenuCommand('menuRoot', 'Amber', 'Minimize')
817
818
819
820
822 """
823 This class allows you to freeze atoms of an Amber94 instance
824 \nPackage : Pmv
825 \nModule : amberCommands
826 \nClass : FreezeAtomsAmber94
827 \nCommand : freezeAtomsAmber94
828 \nSynopsis:\n
829 len(frozenAtoms)<-freezeAtoms_amber94(key, atsToFreeze)\n
830 \nArguments:\n
831 key --- identifier to be key for this Amber94 instance in Amber94Config dictionary\n
832 """
833
834 from Pmv.amberCommands import CurrentAmber94
835
836
837 - def __call__(self, key, atsToFreeze, **kw):
838 """
839 len(frozenAtoms)<-freezeAtoms_amber94(key, atsToFreeze)
840 """
841
842 if key not in Amber94Config.keys():
843 print 'key: ', key, " is not in current Amber94Config "
844 return 'ERROR'
845
846 atsToFreeze = self.vf.expandNodes(atsToFreeze)
847 if not len(atsToFreeze):
848 return 'ERROR'
849
850 atsToFreeze = atsToFreeze.findType(Atom)
851 return apply(self.doitWrapper, (key, atsToFreeze), kw)
852
853
854 - def doit(self, key, atsToFreeze, **kw):
855 amb_ins = Amber94Config[key][0]
856 self.CurrentAmber94 = amb_ins
857
858
859 chain_ids = {}
860 for c in amb_ins.atoms.parent.uniq().parent.uniq():
861 chain_ids[id(c)] = 0
862
863 for c in atsToFreeze.parent.uniq().parent.uniq():
864 assert chain_ids.has_key(id(c)), 'atoms to freeze not in Amber94 instance.atoms'
865
866 atsToFreezeIDS = {}
867 for at in atsToFreeze:
868 atsToFreezeIDS[id(at)] = 0
869 atomIndices = map(lambda x, d=atsToFreezeIDS: d.has_key(id(x)), amb_ins.atoms)
870
871
872
873 apply(amb_ins.freezeAtoms, (atomIndices,), {})
874 numFrozen = Numeric.add.reduce(Numeric.array(amb_ins.frozen))
875 print 'numFrozen=', numFrozen
876 return numFrozen
877
878
880 form = ifd.form
881 form.withdraw()
882
883
944
945
947 for c in [self, self.vf.minimize_Amber94, self.vf.md_Amber94]:
948 if hasattr(c, 'frozenLab'):
949 fstr = 'Currently ' + str(numFroz) + ' frozen Atoms'
950 c.frozenLab.set(fstr)
951
952
954
955 self.form.withdraw()
956
957 key = self.ifd.entryByName['amberIds']['widget'].get()
958
959
960 frozAts = self.ifd.entryByName['frozAts']['widget'].get()
961 if len(frozAts):
962 frozAts = frozAts.findType(Atom)
963 numFroz = self.doitWrapper(key, frozAts)
964
965 self.updateLabels(numFroz)
966 else:
967 self.Unfreeze_cb()
968
969
971 key = self.ifd.entryByName['amberIds']['widget'].get()
972 amb_ins = self.CurrentAmber94
973 l = []
974 for i in range(len(amb_ins.atoms)):
975 l.append(0)
976 apply(amb_ins.freezeAtoms, (l,), {})
977 numFrozen = Numeric.add.reduce(Numeric.array(amb_ins.frozen))
978 self.updateLabels(numFrozen)
979
980
981 - def update(self, event=None):
986
987
988
989
990
991
993 if not len(Amber94Config.keys()):
994 self.warningMsg('no Amber94 objects present: SetupAmber94 first')
995 return 'ERROR'
996
997
998
999
1000
1001
1002 if self.CurrentAmber94=={}:
1003 self.CurrentAmber94 = Amber94Config.values()[0][0]
1004
1005
1006 amb_ins = self.CurrentAmber94
1007 key = amb_ins.key
1008 mols = amb_ins.atoms.top.uniq()
1009
1010 tstr = "Set atoms to be frozen for " + key + ":"
1011 if not hasattr(self, 'ifd'):
1012 self.buildForm(tstr, mols, amb_ins)
1013 else:
1014 lb = self.ifd.entryByName['amberIds']['widget']._list
1015
1016 lb.delete(0, 'end')
1017 for k in Amber94Config.keys():
1018 lb.insert('end', k)
1019 self.ifd.entryByName['frozAts']['widget'].molSet = mols
1020 self.ifd.title = tstr
1021 self.ifd.form.root.title(tstr)
1022 self.form.deiconify()
1023
1024
1025 FreezeAtomsAmber94CommandGUI = CommandGUI()
1026 FreezeAtomsAmber94CommandGUI.addMenuCommand('menuRoot', 'Amber', 'Freeze Atoms',
1027 cascadeName = 'Set Options')
1028
1029
1030
1032 """
1033 This class allows you to constrain atoms of an Amber94 instance
1034 \nPackage : Pmv
1035 \nModule : amberCommands
1036 \nClass : ConstrainAtomsAmber94
1037 \nCommand : constrainAtomsAmber94
1038 \nSynopsis:\n
1039 NumConstr<---constrainAtoms_amber94(key, atsToConstrain, anchorPts)\n
1040 \nArguments:\n
1041 key --- identifier to be key for this Amber94 instance in Amber94Config dictionary\n
1042 atsToConstrain --- atomset for which 3D-constrain points are specified in\n
1043 anchorPts --- a list of 3-D points, one per atsToConstrain\n
1044 kw --- possible md options\n
1045 """
1046
1047
1048 from Pmv.amberCommands import CurrentAmber94
1049
1050
1052 if self.vf.hasGui:
1053 self.masterGeom = Geom('constrAtsGeom',shape=(0,0),
1054 pickable=0, protected=True)
1055 self.masterGeom.isScalable = 0
1056 self.vf.GUI.VIEWER.AddObject(self.masterGeom)
1057
1058 self.lines = IndexedPolylines('constrAtsLines', materials = ((1,1,0),),
1059 inheritMaterial=0, lineWidth=3,
1060 stippleLines=1, protected=True)
1061 self.spheres = Spheres(name='constrAtsSpheres', shape=(0,3),
1062 inheritMaterial=0, radii=0.2, quality=15,
1063 materials = ((1.,1.,0.),), protected=True)
1064 for item in [self.lines, self.spheres]:
1065 self.vf.GUI.VIEWER.AddObject(item, parent=self.masterGeom)
1066
1067
1068 self.constrList = []
1069
1070
1071 - def __call__(self, key, atsToConstrain, anchorPts, **kw):
1072 """NumConstr<-constrainAtoms_amber94(key, atsToConstrain, anchorPts)
1073 \nkey --- identifier to be key for this Amber94 instance in Amber94Config dictionary
1074 \natsToConstrain --- atomset for which 3D-constrain points are specified in
1075 \nanchorPts: a list of 3-D points, one per atsToConstrain
1076 \nkw: possible md options
1077 """
1078 atsToConstrain = self.vf.expandNodes(atsToConstrain)
1079 if not len(atsToConstrain):
1080 return 'ERROR'
1081 if key not in Amber94Config.keys():
1082 print 'key: ', key, " is not in current Amber94Config "
1083 return 'ERROR'
1084
1085
1086 return apply(self.doitWrapper, (key, atsToConstrain, anchorPts), kw)
1087
1088
1089 - def doit(self, key, atsToConstrain, anchorPts,**kw):
1090 amb_ins = Amber94Config[key][0]
1091 self.CurrentAmber94 = amb_ins
1092
1093 chain_ids = {}
1094 for c in amb_ins.atoms.parent.uniq().parent.uniq():
1095 chain_ids[id(c)] = 0
1096
1097 for c in atsToConstrain.parent.uniq().parent.uniq():
1098 assert chain_ids.has_key(id(c)), 'atoms to constrain not in Amber94 instance.atoms'
1099
1100 atsToConstrainIDS = {}
1101 for at in atsToConstrain:
1102 atsToConstrainIDS[id(at)] = 0
1103 atomIndices = map(lambda x, d=atsToConstrainIDS: d.has_key(id(x)), amb_ins.atoms)
1104
1105 if len(kw):
1106 apply(amb_ins.setMinimizeOptions,(), kw)
1107
1108
1109
1110 if prmlib.SFFoptions_wcons_get(amb_ins.sff_opts) == 0:
1111 self.warningMsg(" currently 0 constraint weight!")
1112
1113
1114 clist = []
1115 k = 0
1116 junkCoords = amb_ins.atoms.coords[:]
1117 for i in range(len(amb_ins.atoms)):
1118 if atomIndices[i]:
1119 clist.append(anchorPts[k])
1120 k = k + 1
1121 else:
1122 clist.append(junkCoords[i])
1123 anchors = Numeric.array(clist).flat
1124 apply(amb_ins.constrainAtoms, (atomIndices, anchors), {})
1125 numConstr = Numeric.add.reduce(Numeric.array(amb_ins.constrained))
1126 print 'returning numConstr=', numConstr
1127 return numConstr
1128
1129
1131 form = ifd.form
1132 form.withdraw()
1133
1134
1222
1223
1224 - def update(self, event=None):
1228
1229
1231 amb_ins = self.CurrentAmber94
1232 ats = amb_ins.atoms
1233 atInd = map(lambda x:x==2, ats)
1234 anchors = Numeric.array(ats.coords).flat
1235 apply(amb_ins.constrainAtoms, (atInd, anchors,), {})
1236 numConstr = Numeric.add.reduce(amb_ins.constrained)
1237 self.updateLabels(numConstr)
1238
1239
1241 print 'in updateLabels'
1242 if numConstr==None:
1243 print 'skipping update to None'
1244 raise 'abc'
1245 return
1246 cstr = 'Currently ' + str(numConstr) + ' constrained Atoms'
1247 for c in [self.vf.minimize_Amber94, self.vf.md_Amber94, self]:
1248 if hasattr(c, 'constrLab'):
1249 c.constrLab.set(cstr)
1250
1251
1252
1254
1255 self.form.withdraw()
1256
1257 key = self.ifd.entryByName['amberIds']['widget'].get()
1258 amb_ins = Amber94Config[key][0]
1259
1260 kw = {}
1261
1262 wcons = round(self.ifd.entryByName['wcons_tw']['widget'].get(),4)
1263 if wcons:
1264 kw['wcons'] = wcons
1265
1266
1267 constrAts = self.ifd.entryByName['constrAts']['widget'].get()
1268 constrAts = constrAts.findType(Atom)
1269 if hasattr(self, 'geomDict'):
1270 anchorPts = []
1271 for a in constrAts:
1272 anchorPts.append(self.geomDict[id(a)])
1273 else:
1274 anchorPts = constrAts.coords[:]
1275
1276 numConstr = apply(self.doitWrapper,(key, constrAts, anchorPts,), kw)
1277 print 'updating labels with ', numConstr
1278 if numConstr!=None:
1279 self.updateLabels(numConstr)
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1295
1296 if self.adjAnchors.get():
1297 self.ifd.entryByName['anchorCB']['widget'].toggle()
1298 self.ss.sets = self.vf.sets
1299 ats = self.atSET = self.ss.get().findType(Atom)
1300 ok = 0
1301 self.spheres.Set(visible=1, tagModified=False)
1302 if hasattr(self, 'form2') and hasattr(self, 'geomDict'):
1303
1304 ok = 1
1305 for a in ats:
1306 if not self.geomDict.has_key(id(a)):
1307 ok = 0
1308 break
1309 for g in [self.spheres, self.lines]:
1310 g.Set(visible=1, tagModified=False)
1311 g.RedoDisplayList()
1312 if not ok:
1313
1314 self.spheres.Set(vertices=ats.coords, visible=1, tagModified=False)
1315 numAts = 2*len(ats)
1316 fcs = []
1317 for i in range(0, numAts):
1318 if i%2==1:
1319 fcs.append((i-1, i))
1320
1321 linePts = []
1322 for a in ats:
1323 linePts.append(a.coords[:])
1324 linePts.append(a.coords[:])
1325 self.lines.Set(vertices=linePts, faces=fcs, visible=1,
1326 tagModified=False)
1327
1328 self.geomDict = {}
1329 for a in ats:
1330 self.geomDict[id(a)] = a.coords[:]
1331 self.updateForm2()
1332 self.vf.GUI.VIEWER.Redraw()
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1504 self.cur_at = at
1505 lstr= 'current atom: '+ self.cur_at.full_name()
1506 self.curAtLab.set(lstr)
1507
1508 coords = self.geomDict[id(at)]
1509
1510 self.x_tw.set(coords[0])
1511 self.y_tw.set(coords[1])
1512 self.z_tw.set(coords[2])
1513 self.updateGeoms()
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1527 key = id(self.cur_at)
1528 ind = self.currentAt.get()
1529
1530 currentPos = self.geomDict[key]
1531 newPos = ( self.x_tw.get(), self.y_tw.get(), self.z_tw.get())
1532 self.geomDict[key] = newPos
1533 self.spheres.vertexSet.vertices.array[ind] = newPos
1534 self.spheres.RedoDisplayList()
1535
1536 lineInd = 2*ind + 1
1537
1538 self.lines.vertexSet.vertices.array[lineInd] = newPos
1539 self.lines.RedoDisplayList()
1540
1541
1542
1543 self.vf.GUI.VIEWER.Redraw()
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1556 ats = self.atSET = self.ss.get().findType(Atom)
1557 self.geomDict = {}
1558 for a in ats:
1559 self.geomDict[id(a)] = a.coords[:]
1560 self.spheres.Set(vertices=ats.coords, visible=1, tagModified=False)
1561 linePts = []
1562 for a in ats:
1563 linePts.append(a.coords[:])
1564 linePts.append(a.coords[:])
1565 self.lines.Set(vertices=linePts,visible=1, tagModified=False)
1566 self.vf.GUI.VIEWER.Redraw()
1567
1568
1570 for g in [self.spheres, self.lines]:
1571 g.Set(visible=0, tagModified=False)
1572 self.vf.GUI.VIEWER.Redraw()
1573 self.form2.withdraw()
1574
1575
1576
1578 if not len(Amber94Config.keys()):
1579 self.warningMsg('no Amber94 objects present: SetupAmber94 first')
1580 return 'ERROR'
1581
1582
1583
1584 if self.CurrentAmber94=={}:
1585 self.CurrentAmber94 = Amber94Config.values()[0][0]
1586 key = self.CurrentAmber94.key
1587 mols = self.CurrentAmber94.atoms.top.uniq()
1588 tstr = "Set atoms to be constrained for " + key + ":"
1589 if not hasattr(self, 'ifd'):
1590 self.buildForm(tstr, mols)
1591 else:
1592 lb = self.ifd.entryByName['amberIds']['widget']._list
1593
1594 lb.delete(0, 'end')
1595 for k in Amber94Config.keys():
1596 lb.insert('end', k)
1597 self.ifd.entryByName['constrAts']['widget'].molSet = mols
1598 self.ifd.title = tstr
1599 self.ifd.form.root.title(tstr)
1600 self.form.deiconify()
1601
1602
1603 ConstrainAtomsAmber94CommandGUI = CommandGUI()
1604 ConstrainAtomsAmber94CommandGUI.addMenuCommand('menuRoot', 'Amber', 'Constrain Atoms',
1605 cascadeName = 'Set Options')
1606
1607
1608
1610 """This class allows you to set md options of a Amber94 instance these options include t, dt, tautp, temp0, verbose, vlimit, ntpr_md, zerov,tempi and idum. NB: this is written as a separate class in order to create a straight-forward log.
1611 \nPackage : Pmv
1612 \nModule : amberCommands
1613 \nClass : SetMDOptsAmber94
1614 \nCommand : setMDOptsAmber94
1615 \nSynopsis:\n
1616 None<-setmdOpts_Amber94(key, **kw)\n
1617 \nArguments:\n
1618 key --- identifier to be key for this Amber94 instance in Amber94Config dictionary\n
1619 """
1620
1621 from Pmv.amberCommands import CurrentAmber94
1622
1623
1625 """None<-setmdOpts_Amber94(key, **kw)
1626 \nkey --- identifier to be key for this Amber94 instance in Amber94Config dictionary\n
1627 """
1628 return apply(self.doitWrapper, (key,), kw)
1629
1630
1631 - def doit(self, key, **kw):
1632 if key not in Amber94Config.keys():
1633 print 'key: ', key, " is not in current Amber94Config "
1634 return 'ERROR'
1635 amber94instance = Amber94Config[key][0]
1636 amb_ins = self.CurrentAmber94 = amber94instance
1637 for k in kw.keys():
1638 assert k in ['t','dt','tautp','temp0','verbosemd','ntwx',
1639 'vlimit', 'ntpr_md',
1640 'zerov', 'tempi', 'idum']
1641 apply(amb_ins.setMdOptions, (), kw)
1642
1643
1645 form = ifd.form
1646 form.withdraw()
1647
1648
1842
1843
1845
1846 self.form.withdraw()
1847
1848 key = self.ifd.entryByName['amberIds']['widget'].get()
1849
1850
1851
1852 mdOptD = {}
1853 for v in ['t_tw','dt_tw', 'tautp_tw','temp0_tw','vlimit_tw',
1854 'ntwx_tw', 'tempi_tw','idum_tw']:
1855 val = self.ifd.entryByName[v]['widget'].get()
1856 s = split(v,'_')[0]
1857 mdOptD[s] = val
1858 mdOptD['ntpr_md'] = self.ifd.entryByName['ntpr_md_tw']['widget'].get()
1859 w = self.ifd.entryByName['verbose_cb']['widget'].get()
1860 if w not in self.verbose_list:
1861 mdOptD['verbosemd'] = 1
1862 else:
1863 mdOptD['verbosemd'] = self.verbose_list.index(w)
1864 mdOptD['zerov'] = self.zerov.get()
1865
1866 apply(self.doitWrapper, (key,), mdOptD)
1867
1868
1869 - def update(self, event=None):
1873
1874
1875
1876
1877
1878
1879
1881 if not len(Amber94Config.keys()):
1882 self.warningMsg('no Amber94 objects present: SetupAmber94 first')
1883 return 'ERROR'
1884
1885 if self.CurrentAmber94=={}:
1886 self.CurrentAmber94 = Amber94Config.values()[0][0]
1887
1888
1889 if not hasattr(self, 'ifd'):
1890 self.buildForm()
1891 else:
1892 lb = self.ifd.entryByName['amberIds']['widget']._list
1893
1894 lb.delete(0, 'end')
1895 for k in Amber94Config.keys():
1896 lb.insert('end', k)
1897 self.form.deiconify()
1898
1899
1900 SetMDOptsAmber94CommandGUI = CommandGUI()
1901 SetMDOptsAmber94CommandGUI.addMenuCommand('menuRoot', 'Amber', 'Molecular Dynamics',
1902 cascadeName = 'Set Options')
1903
1904
1905
1907 """
1908 This class allows you to select an Amber94 instance from Amber94Config whose keys are ids specified in setup_Amber94 for the Amber94 instances.You can also set md options, freeze atoms, specify constrained atoms and anchor atoms and set maxStep. The md
1909 can be run repeatedly.
1910 \nPackage : Pmv
1911 \nModule : amberCommands
1912 \nClass : MolecularDynamicsAmber94
1913 \nCommand : molecularDynamicsAmber94
1914 \nSynopsis:\n
1915 return_code<-md_Amber94(key, maxStep, **kw)\n
1916 \nArguments\n:
1917 key --- is key into Amber94Config dictionary\n
1918 """
1919
1920
1921 from Pmv.amberCommands import CurrentAmber94
1922
1923
1924 - def __call__(self, key, maxStep, **kw):
1925 """return_code<-md_Amber94(key, maxStep, **kw)\n
1926 \npossible return codes:\n
1927 >0 converged, final iteration number\n
1928 -1 bad line search, probably an error in the relation
1929 of the funtion to its gradient (perhaps from
1930 round-off if you push too hard on the minimization).\n
1931 -2 search direction was uphill\n
1932 -3 exceeded the maximum number of iterations\n
1933 -4 could not further reduce function value\n
1934 -5 stopped via signal (bsd)\n
1935 key is key into Amber94Config dictionary\n
1936 """
1937
1938
1939 return apply(self.doitWrapper, (key, maxStep,), kw)
1940
1941
1942 - def doit(self, key, maxStep, **kw):
1943 if key not in Amber94Config.keys():
1944 print 'key: ', key, " is not in current Amber94Config "
1945 return 'ERROR'
1946 amb_ins = Amber94Config[key][0]
1947 self.CurrentAmber94 = amb_ins
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960 freq = kw.get('callback_freq', 0)
1961 del kw['callback_freq']
1962 callback = kw.get('callback')
1963 del kw['callback']
1964 wcons = kw.get('wcons')
1965 if wcons:
1966 del kw['wcons']
1967
1968 numConst = Numeric.add.reduce(amb_ins.constrained)
1969 if numConst:
1970 mdopt={}
1971 mdopt['wcons'] = wcons
1972 apply(amb_ins.setMinimizeOptions, (), mdopt)
1973
1974 if callback:
1975
1976 if not hasattr(amb_ins, 'coord_index'):
1977 amb_ins.atoms.addConformation(amb_ins.atoms.coords[:])
1978 amb_ins.coord_index = len(amb_ins.atoms[0]._coords)-1
1979
1980 print 'setting callback to updateCoords'
1981 amb_ins.setCallback(self.updateCoords, freq)
1982
1983 return_code = apply(amb_ins.md,(maxStep,), kw)
1984 print 'return_code=', return_code
1985 return return_code
1986
1987
1988 - def updateCoords(self, cbNum=0, nbat=300, coords=[], energies=[], step=[]):
1989
1990
1991 amb = self.CurrentAmber94
1992 mols = amb.atoms.top.uniq()
1993 allAtoms = mols.chains.residues.atoms
1994 newcoords = Numeric.array(amb.coords[:])
1995 newcoords.shape = (-1,3)
1996 allAtoms.updateCoords(newcoords.tolist(), amb.coord_index)
1997 self.vf.displayLines(allAtoms, topCommand=0)
1998 self.vf.GUI.VIEWER.currentCamera.update()
1999
2000
2002 form = ifd.form
2003 form.withdraw()
2004
2005
2142
2143
2145 w = self.ifd.entryByName['callback_ent']['widget']
2146 if self.callback.get():
2147 w.config(state='normal', fg='black', selectbackground='#c3c3c3',
2148 selectforeground='black')
2149 else:
2150 w.config(state='disabled', fg='grey', selectbackground='#d9d9d9',
2151 selectforeground='grey')
2152
2153
2155 self.ifd.entryByName['trjCB']['widget'].toggle()
2156
2157 if prmlib.SFFoptions_ntwx_get(self.CurrentAmber94.sff_opts) == 0:
2158 self.warningMsg("must set ntwx first!")
2159 return
2160 file = self.vf.askFileSave(types=[('trj files:', '*.trj'),('allfiles:','*.*')],
2161 title='amber94 md trajectory file:')
2162 if file:
2163 self.TrjFilename.set(file)
2164 else:
2165 self.TrjFilename.set('')
2166
2167
2169 self.form.withdraw()
2170
2171 key = self.ifd.entryByName['amberIds']['widget'].get()
2172 amb_ins = Amber94Config[key][0]
2173 if self.callback.get():
2174
2175 amb_ins = Amber94Config[key][0]
2176 if not hasattr(amb_ins, 'coord_index'):
2177 amb_ins.atoms.addConformation(amb_ins.atoms.coords[:])
2178 amb_ins.coord_index = len(amb_ins.atoms[0]._coords)-1
2179
2180
2181 freq = int(self.callbackFreq.get())
2182 print 'setting callback to updateCoords'
2183 amb_ins.setCallback(self.updateCoords, freq)
2184 else:
2185 amb_ins.coord_index = 1
2186
2187 d = {}
2188 d['callback'] = self.callback.get()
2189 d['callback_freq'] = int(self.callbackFreq.get())
2190
2191 wcons = round(self.ifd.entryByName['wcons_tw']['widget'].get(),4)
2192 if wcons:
2193 d['wcons'] = wcons
2194 maxStep = self.ifd.entryByName['maxStep_tw']['widget'].get()
2195 if hasattr(self, 'TrjFilename'):
2196 filename = self.TrjFilename.get()
2197 if len(filename):
2198 d['filename'] = filename
2199 return apply(self.doitWrapper, (key, maxStep,), d)
2200
2201
2203
2204 self.ifd.entryByName['setmdopts_cb']['widget'].toggle()
2205 self.vf.setmdOpts_Amber94.guiCallback()
2206
2207
2209
2210 self.ifd.entryByName['setfroz_cb']['widget'].toggle()
2211 print 'calling freezeAtoms'
2212 numFrozen = self.vf.freezeAtoms_Amber94.