1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 """
21 This Module facilitates starting autogrid and autodock jobs and managing them
22
23 """
24 from ViewerFramework.VFCommand import CommandGUI, Command
25
26 from mglutil.gui.InputForm.Tk.gui import InputFormDescr
27 from mglutil.popen2Threads import SysCmdInThread
28 from mglutil.util.callback import CallBackFunction
29 from mglutil.util.packageFilePath import findResourceFile
30 import tkMessageBox
31 from Pmv.mvCommand import MVCommand
32 from Pmv.guiTools import MoleculeChooser, BarButton, Kill
33
34 from MolKit.tree import TreeNode, TreeNodeSet
35 from MolKit.molecule import Atom
36
37 from SimpleDialog import SimpleDialog
38 import types, string, Tkinter, re
39 import commands, os, sys, socket, time
40 from string import splitfields
41
42
43
44 try:
45 import Entropia
46 entropiaPresent = 1
47 except:
48 entropiaPresent = 0
49
50
52 print 'removing PCs from hostTable'
53
54
55 if entropiaPresent:
56 from Entropia.EntropiaDef import entropia_job_dir
57 from Entropia.EntropiaUI import EntropiaUI
58 from Entropia.EntropiaEx import EntropiaError
59 import ftplib
60
61
62
63 menuText = {}
64 menuText['StartMB'] = 'Run'
65
66 menuText['startGridMB'] = 'Run AutoGrid...'
67 menuText['startDockMB'] = 'Run AutoDock...'
68 menuText['processManagerMB'] = 'Job Status...'
69 menuText['editHostsMB'] = 'Host Preferences...'
70
71
72
74
76 self.master=master
77 Kill.__init__(self, master)
78 self.view.set(4)
79 self.bar.file.forget()
80 self.bar.view.forget()
81 self.frame2=Tkinter.Frame(self.master)
82 self.frame2.pack()
83 self.dismiss = Tkinter.Button(self.frame2, text='Dismiss', command=self.quit)
84 self.update.forget()
85 self.dismiss.pack(side = 'right', fill = 'x')
86 self.winfo_toplevel().title('Autodock Process Manager')
87 self.done=0
88
89
90 - def kill(self, selected):
91 if not selected:
92 return
93 c=self.format_list[self.format.get()][2]
94 pid = string.split(selected)[c]
95 host = string.split(selected)[-1]
96
97 t = "Do you wish to kill this process?"
98 d= SimpleDialog(self.master, text=t, buttons=['Yes','No'],
99 default = 0, title = 'Kill Process')
100 ok = d.go()
101 if ok == 0:
102 if host != self.vf.ADstart_manage.localHost:
103 cmdStr="\'kill -9 %s\'"%pid
104 else:
105 cmdStr="ssh " + host+ " -n \'kill -9 %s\'"%pid
106 commands.getoutput(cmdStr)
107 hosts = self.hosts
108 self.do_update(self.psList, hosts)
109
110
112 self.hosts=hostList
113
114
115 - def do_update(self, psList=['autodock'], hosts=None):
116 if not hosts: return
117 self.hosts=hosts
118 self.psList = psList
119 format = self.format_list[self.format.get()][1]
120 view = self.view_list[self.view.get()][1]
121 self.frame.list.delete(0,Tkinter.AtEnd())
122 self.done=1
123 for item in self.hosts:
124 if item == self.vf.ADstart_manage.localHost:
125 cmdStr="ps %s %s"%(view,format)
126 else:
127 cmdStr="ssh " + item+ " -n \'ps %s %s\'"%(view,format)
128 p=commands.getoutput(cmdStr)
129 if p:
130 list = string.splitfields(p,'\n')
131 if len(list) == 1:
132 self.frame.list.insert(0,line)
133 else:
134 del list[0]
135 for line in list:
136 for ps in psList:
137 if string.find(line, ps)>-1:
138
139 line = line + ' ' + item
140 self.frame.list.insert(0,line)
141 self.done=0
142 else:
143 self.hosts.remove(item)
144 return(self.hosts)
145
146
147 - def quit(self, event=None):
148 self.master.withdraw()
149
150
151
153
155 if not self.vf.hasGui:
156 self.root = Tkinter.Tk()
157 self.root.withdraw()
158 self.hostVal=Tkinter.IntVar()
159 self.macroVal=Tkinter.IntVar()
160 self.top = Tkinter.Toplevel()
161 self.top.withdraw()
162 self.kill = ADKill(self.top)
163 self.kill.vf = self.vf
164
173
174
176 if not self.currentHosts: self.currentHosts=[]
177 if not host in self.currentHosts:
178 self.currentHosts.append(host)
179
181 if not self.psList: self.psList=[]
182 if not ps in self.psList:
183 self.psList.append(ps)
184
186
187 if not self.currentHosts: self.currentHosts=[]
188 self.currentHosts = self.kill.do_update(self.psList,self.currentHosts)
189 if self.kill.done:
190 self.kill.master.withdraw()
191 else:
192 self.kill.after(100,self.adUpdate)
193
195 if not self.top.winfo_ismapped():
196 self.top.deiconify()
197 self.kill.after(100, self.adUpdate)
198
200 apply(self.doitWrapper, (), kw)
201
203
204 print 'killed'
205
206 ADProcessManagerGUI=CommandGUI()
207 ADProcessManagerGUI.addMenuCommand('AutoToolsBar', menuText['StartMB'], menuText['processManagerMB'])
208
209
210
212 """Base class for AutoGridStarter and AutoDockStarter, whose command structure is
213 very similar with a few differences such as programType, title for file browser, first letters of required parameter and log file extensions and the presence or absence of possible flags,etc """
214
215
217 if self.vf.hasGui:
218 self.hostVal=Tkinter.IntVar()
219 self.macroVal=Tkinter.IntVar()
220 self.projectVal=Tkinter.IntVar()
221
222
223 - def __init__(self, program=None, dictObj=None,
224 ifdTitle="Run BaseClass",
225 browserPFTitle="baseclassPF", browserEXETitle='baseClass',
226 browserLOGTitle="baseLog", logType='.base',
227 pfType='.bpf', programType=None):
228
229 MVCommand.__init__(self)
230 self.program=program
231 self.programType=programType
232 self.dictObj = dictObj
233 self.ifdTitle=ifdTitle
234 self.browserPFTitle=browserPFTitle
235 self.browserEXETitle=browserEXETitle
236 self.browserLOGTitle=browserLOGTitle
237 self.logType=logType
238 self.pfType=pfType
239 self.qT='int'
240 self.command=None
241 self.RemoteCommand=None
242 self.nqeJobFile=None
243 self.Host=None
244 self.Exe=None
245 self.FlagStr=""
246 self.ParmFile=None
247 self.LogFile=None
248 self.Nice=20
249
250 self.localHost = socket.gethostname()
251 self.invalid=0
252 import AutoDockTools
253 self.hostDict=AutoDockTools.hostDict
254
255
256
258
259 self.customizeGUI()
260 if not hasattr(self, 'form'):
261 if self.vf.hasGui:
262
263 self.form = self.vf.getUserInput(self.ifd, modal=0,blocking=0)
264 self.form.root.protocol('WM_DELETE_WINDOW',self.Close_cb)
265 self.topLevel = self.form.root
266 else:
267
268 from mglutil.gui.InputForm.Tk.gui import InputForm
269 self.form = InputForm(self.vf.master,self.ifd,modal=0, blocking=0)
270 self.form.root.protocol('WM_DELETE_WINDOW',self.Close_cb)
271 self.topLevel = self.form.root
272 if self.dictObj:
273 self.dict=eval('self.vf.%s'%self.dictObj)
274 if hasattr(self.vf, 'hasGui') and hasattr(self.vf, self.dictObj) and len(self.dict.gpf_filename):
275 if self.paramFile.get()=='':
276 self.paramFile.set(self.dict.gpf_filename)
277 self.updateLF()
278
279 entryItems= ['lFentry','eXentry','pFentry','nqeTimeEntry','nqeCpuEntry',\
280 'pbsCpuEntry','pbsTimeEntry','pbsDirEntry','pbsWallTimeEntry',\
281 'pbsCpuEntry', 'niceEntry']
282 for item in entryItems:
283 self.ifd.entryByName[item]['widget'].bind('<Return>', self.getCmd)
284 self.ifd.entryByName['pFentry']['widget'].bind('<Return>', self.updateLF)
285 self.ifd.entryByName['mNentry']['widget'].bind('<Return>', self.getMacro)
286 self.ifd.entryByName['mNMenu']['widget'].bind('<ButtonPress>', self.buildMacroMenu, add='+')
287 self.ifd.entryByName['hNentry']['widget'].bind('<Return>', self.getHost)
288 self.intWids=['niceLab','niceEntry']
289 if sys.platform=='win32':
290 for item in self.intWids:
291 self.ifd.entryByName[item]['widget'].grid_forget()
292 self.niceLevel.set('0')
293 self.commonWids=['hNLab','hNentry','eXLab','eXentry','eXbutton',
294 'pFLab','pFentry','pFbutton',
295 'lFLab','lFentry','lFbutton']
296 self.nqeWids=['nqeCpuLab','nqeCpuEntry','nqeTimeLab','nqeTimeEntry']
297 self.pbsWids=['pbsCpuLab','pbsCpuEntry','pbsDirLab','pbsDirEntry','pbsTimeLab','pbsTimeEntry','pbsWallTimeLab','pbsWallTimeEntry','pbsRerunCB']
298 self.entWids=['pjLab','pjentry','pjMenu','nodesEntLab',
299 'nodesEnt', 'gpfEntLab', 'gpfEnt','pdbqsEntLab','pdbqsEnt',
300 'dpfEntLab','dpfEnt', 'pdbqEntLab','pdbqEnt',
301 'jobDirEntLab','jobDirEnt', 'gpfFilterEnt', 'pdbqsFilterEnt',
302 'dpfFilterEnt','pdbqFilterEnt']
303 self.entWidLCS=['gpfFiles','pdbqsFiles','dpfFiles','pdbqFiles']
304 self.entButs=[ 'uploadGpfFileBut','uploadPdbqFileBut',
305 'uploadDpfFileBut','uploadPdbqsFileBut', 'monitorCB',
306 'ftpBackCB']
307 self.getMacroVal(0)
308 self.flagWids=[]
309 self.form.autoSize()
310
311
313 if not entropiaPresent: return
314 keyList= ['gpf','pdbqs','dpf','pdbq']
315 itemList= ['gpfFiles','pdbqsFiles','dpfFiles','pdbqFiles']
316 fileList=[self.EntropiaUI.gpf_list,self.EntropiaUI.pdbqs_list,self.EntropiaUI.dpf_list,self.EntropiaUI.pdbq_list]
317
318 reList=[]
319 for filterStr in [self.gpfFilter.get(),self.pdbqsFilter.get(),self.dpfFilter.get(), self.pdbqFilter.get()]:
320 reList.append(re.compile(filterStr))
321 if key:
322 ind=keyList.index(key)
323 item=itemList[ind]
324 files=fileList[ind]
325 reitem=reList[ind]
326 lb=self.ifd.entryByName[item]['widget'].lb
327 lb.delete(0,'end')
328 for f in files:
329 match=reitem.match(f)
330 if match!=None:
331 lb.insert(lb.index('end'),match.string)
332
333 else:
334 for i in range(4):
335
336 item=itemList[i]
337 files=fileList[i]
338 reitem=reList[i]
339 lb=self.ifd.entryByName[item]['widget'].lb
340 lb.delete(0,'end')
341 for f in files:
342 match=reitem.match(f)
343 if match!=None:
344 lb.insert(lb.index('end'), match.string)
345
346
348 if not entropiaPresent: return
349 titleStr='Upload '+key+' file:'
350 newfile=self.vf.askFileOpen(types=[(key,'*'+key)], title=titleStr)
351 if newfile:
352 try:
353 self.EntropiaUI.upload(newfile)
354 except EntropiaError, msg:
355 self.vf.warningMsg(msg)
356 return
357 self.updateLCS(key[1:])
358
359 - def setFile(self,item,event=None):
360 pass
361
363
364 if not hasattr(self, 'ifd'):
365
366 self.gpf_list=[]
367 self.dpf_list=[]
368 self.pdbq_list=[]
369 self.pdbqs_list=[]
370
371
372
373
374
375 ifd=self.ifd=InputFormDescr(title=self.ifdTitle)
376 self.execPath = Tkinter.StringVar()
377 self.queueType = Tkinter.StringVar()
378 self.queueType.set('int')
379 self.jobFile = Tkinter.StringVar()
380 self.jobFile.set('')
381 self.paramFile = Tkinter.StringVar()
382 self.paramFile.set('')
383 self.niceLevel=Tkinter.StringVar()
384 self.niceLevel.set('20')
385 self.nqeTime=Tkinter.StringVar()
386 self.nqeTime.set('144000')
387 self.nqeCpu=Tkinter.StringVar()
388 self.nqeCpu.set('1')
389 self.pbsCpu=Tkinter.StringVar()
390 self.pbsCpu.set('1')
391 self.pbsCpuTime=Tkinter.StringVar()
392 self.pbsCpuTime.set('24:00:00')
393 self.pbsWallTime=Tkinter.StringVar()
394 self.pbsWallTime.set('24:30:00')
395 self.pbsRerun=Tkinter.StringVar()
396 self.pbsRerun.set('y')
397 self.logFile = Tkinter.StringVar()
398 self.cmd = Tkinter.StringVar()
399 self.setUpFlagVars()
400 self.pidStr = Tkinter.StringVar()
401 self.macroName = Tkinter.StringVar()
402 self.hostName = Tkinter.StringVar()
403 self.remoteDir = Tkinter.StringVar()
404 try:
405 usr = os.environ['USER']
406 self.remoteDir.set('/usr/people/'+usr)
407 except:
408 self.remoteDir.set('./')
409 self.showMacroMenu = Tkinter.IntVar()
410 self.showHostMenu = Tkinter.IntVar()
411
412 self.projectName=Tkinter.StringVar()
413 self.gpf=Tkinter.StringVar()
414 self.dpf=Tkinter.StringVar()
415 self.pdbq=Tkinter.StringVar()
416 self.pdbqs=Tkinter.StringVar()
417 self.jobDir=Tkinter.StringVar()
418 if entropiaPresent:
419 self.jobDir.set(entropia_job_dir + 'job_id')
420 self.nodes=Tkinter.StringVar()
421 self.nodes.set('1')
422 self.gpfFilter=Tkinter.StringVar()
423 self.pdbqsFilter=Tkinter.StringVar()
424 self.dpfFilter=Tkinter.StringVar()
425 self.pdbqFilter=Tkinter.StringVar()
426 self.monitorVar=Tkinter.IntVar()
427 self.ftpBackVar=Tkinter.IntVar()
428 ifd.append( {'name': 'mNLab',
429 'widgetType': Tkinter.Label,
430 'text': 'Macro Name:',
431 'gridcfg':{'sticky':Tkinter.E}})
432 ifd.append( {'name': 'mNentry',
433 'widgetType':Tkinter.Entry,
434 'wcfg':{
435 'width':25,
436 'textvariable': self.macroName,},
437 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
438 ifd.append( {'name': 'mNMenu',
439 'widgetType':Tkinter.Menubutton,
440 'text': 'macros',
441 'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':2}})
442 ifd.append( {'name': 'hNLab',
443 'widgetType': Tkinter.Label,
444 'text': 'Host Name:',
445 'gridcfg':{'sticky':Tkinter.E}})
446 ifd.append( {'name': 'hNentry',
447 'widgetType':Tkinter.Entry,
448 'wcfg':{
449 'width':25,
450 'textvariable': self.hostName,
451 },
452 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
453 ifd.append( {'name': 'eXLab',
454 'widgetType': Tkinter.Label,
455 'text': 'Program Pathname:',
456 'gridcfg':{'sticky':Tkinter.E}})
457 ifd.append( {'name': 'eXentry',
458 'widgetType':Tkinter.Entry,
459 'wcfg':{
460 'width':65,
461 'textvariable': self.execPath,
462 },
463 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
464 ifd.append({'name': 'eXbutton',
465 'widgetType': Tkinter.Button,
466 'text':'Browse',
467 'wcfg':{'bd':6},
468 'command':self.browseEX,
469 'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':13}})
470 ifd.append( {'name': 'pFLab',
471 'widgetType': Tkinter.Label,
472 'text': 'Parameter Filename:',
473 'gridcfg':{'sticky':Tkinter.E}})
474 ifd.append( {'name': 'pFentry',
475 'widgetType':Tkinter.Entry,
476 'wcfg':{
477 'width':65,
478 'textvariable': self.paramFile,
479 },
480 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
481 ifd.append({'name': 'pFbutton',
482 'widgetType': Tkinter.Button,
483 'text':'Browse',
484 'wcfg':{'bd':6},
485 'command':self.browsePF,
486 'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':13}})
487 ifd.append( {'name': 'lFLab',
488 'widgetType': Tkinter.Label,
489 'text': 'Log Filename:',
490 'gridcfg':{'sticky':Tkinter.E}})
491 ifd.append( {'name': 'lFentry',
492 'widgetType':Tkinter.Entry,
493 'wcfg':{
494 'width':65,
495 'textvariable': self.logFile,
496 },
497 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
498 ifd.append({'name': 'lFbutton',
499 'widgetType': Tkinter.Button,
500 'text':'Browse',
501 'wcfg':{'bd':6},
502 'command':self.browseLF,
503 'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':13}})
504 self.getFlags()
505 ifd.append({'name':'niceLab',
506 'widgetType':Tkinter.Label,
507 'text': 'Nice Level:',
508 'gridcfg':{'sticky':Tkinter.E}})
509 ifd.append( {'name': 'niceEntry',
510 'widgetType':Tkinter.Entry,
511 'wcfg':{
512 'width':25,
513 'textvariable': self.niceLevel,
514 },
515 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
516 ifd.append({'name':'pbsDirLab',
517 'widgetType':Tkinter.Label,
518 'text': 'PBS: Remote Directory:',
519 'gridcfg':{'sticky':Tkinter.E}})
520 ifd.append( {'name': 'pbsDirEntry',
521 'widgetType':Tkinter.Entry,
522 'wcfg':{
523 'width':65,
524 'textvariable': self.remoteDir,
525 },
526 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
527 ifd.append({'name':'nqeTimeLab',
528 'widgetType':Tkinter.Label,
529 'text': 'NQE: Time Limit:',
530 'gridcfg':{'sticky':Tkinter.E}})
531 ifd.append( {'name': 'nqeTimeEntry',
532 'widgetType':Tkinter.Entry,
533 'wcfg':{
534 'width':25,
535 'textvariable': self.nqeTime,
536 },
537 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
538 ifd.append({'name':'pbsTimeLab',
539 'widgetType':Tkinter.Label,
540 'text': 'PBS: CpuTime Limit:',
541 'gridcfg':{'sticky':Tkinter.E}})
542 ifd.append( {'name': 'pbsTimeEntry',
543 'widgetType':Tkinter.Entry,
544 'wcfg':{
545 'width':25,
546 'textvariable': self.pbsCpuTime,
547 },
548 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
549 ifd.append({'name':'pbsWallTimeLab',
550 'widgetType':Tkinter.Label,
551 'text': 'PBS: WallTime Limit:',
552 'gridcfg':{'sticky':Tkinter.E}})
553 ifd.append( {'name': 'pbsWallTimeEntry',
554 'widgetType':Tkinter.Entry,
555 'wcfg':{
556 'width':25,
557 'textvariable': self.pbsWallTime,
558 },
559 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
560 ifd.append({'name':'pbsRerunCB',
561 'widgetType':Tkinter.Checkbutton,
562 'text': 'PBS: Rerun on System Crash',
563 'onvalue':'y',
564 'offvalue':'n',
565 'variable':self.pbsRerun,
566 'command': self.getCmd,
567 'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'columnspan':2}})
568 ifd.append({'name':'pbsCpuLab',
569 'widgetType':Tkinter.Label,
570 'text': 'PBS: Number of Processors:',
571 'gridcfg':{'sticky':Tkinter.E}})
572 ifd.append( {'name': 'pbsCpuEntry',
573 'widgetType':Tkinter.Entry,
574 'wcfg':{
575 'width':25,
576 'textvariable': self.pbsCpu,
577 },
578 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
579 ifd.append({'name':'nqeCpuLab',
580 'widgetType':Tkinter.Label,
581 'text': 'NQE: Number of Processors:',
582 'gridcfg':{'sticky':Tkinter.E}})
583 ifd.append( {'name': 'nqeCpuEntry',
584 'widgetType':Tkinter.Entry,
585 'wcfg':{
586 'width':25,
587 'textvariable': self.nqeCpu,
588 },
589 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
590
591 self.showProjectMenu = Tkinter.IntVar()
592 ifd.append( {'name': 'pjLab',
593 'widgetType': Tkinter.Label,
594 'text': 'project:',
595 'gridcfg':{'sticky':Tkinter.E}})
596 ifd.append( {'name': 'pjentry',
597 'widgetType':Tkinter.Entry,
598 'wcfg':{
599 'width':25,
600 'textvariable': self.projectName,
601 },
602 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
603 ifd.append( {'name': 'pjMenu',
604 'widgetType':Tkinter.Menubutton,
605 'text': 'projects',
606 'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':2}})
607 ifd.append({'name':'nodesEntLab',
608 'widgetType':Tkinter.Label,
609 'text': 'number of nodes',
610 'gridcfg':{'sticky':Tkinter.E}})
611 ifd.append( {'name': 'nodesEnt',
612 'widgetType':Tkinter.Entry,
613 'wcfg':{
614 'width':25,
615 'textvariable': self.nodes,
616 },
617 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
618 ifd.append({'name':'gpfEntLab',
619 'widgetType':Tkinter.Label,
620 'text': 'gpf file',
621 'gridcfg':{'sticky':Tkinter.E}})
622 ifd.append( {'name': 'gpfEnt',
623 'widgetType':Tkinter.Entry,
624 'wcfg':{
625 'width':25,
626 'textvariable': self.gpf,
627 },
628 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
629 ifd.append({'name':'pdbqsEntLab',
630 'widgetType':Tkinter.Label,
631 'text': 'pdbqs file',
632 'gridcfg':{'sticky':Tkinter.E}})
633 ifd.append( {'name': 'pdbqsEnt',
634 'widgetType':Tkinter.Entry,
635 'wcfg':{
636 'width':25,
637 'textvariable': self.pdbqs,
638 },
639 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
640 ifd.append({'name':'dpfEntLab',
641 'widgetType':Tkinter.Label,
642 'text': 'dpf file',
643 'gridcfg':{'sticky':Tkinter.E}})
644 ifd.append( {'name': 'dpfEnt',
645 'widgetType':Tkinter.Entry,
646 'wcfg':{
647 'width':25,
648 'textvariable': self.dpf,
649 },
650 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
651 ifd.append({'name':'pdbqEntLab',
652 'widgetType':Tkinter.Label,
653 'text': 'pdbq file',
654 'gridcfg':{'sticky':Tkinter.E}})
655 ifd.append( {'name': 'pdbqEnt',
656 'widgetType':Tkinter.Entry,
657 'wcfg':{
658 'width':25,
659 'textvariable': self.pdbq,
660 },
661 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
662 ifd.append( {'name': 'monitorCB',
663 'widgetType':Tkinter.Checkbutton,
664 'text': 'Monitor job',
665 'variable': self.monitorVar,
666 'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':2}})
667 ifd.append({'name':'jobDirEntLab',
668 'widgetType':Tkinter.Label,
669 'text': 'job directory',
670 'gridcfg':{'sticky':Tkinter.E}})
671 ifd.append( {'name': 'jobDirEnt',
672 'widgetType':Tkinter.Entry,
673 'wcfg':{
674 'width':25,
675 'textvariable': self.jobDir,
676 },
677 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
678 ifd.append( {'name': 'ftpBackCB',
679 'widgetType':Tkinter.Checkbutton,
680 'text': 'FTP back',
681 'variable': self.ftpBackVar,
682 'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':2}})
683 ifd.append( {'name': 'cmdentry',
684 'widgetType':Tkinter.Entry,
685 'wcfg':{
686 'width':90,
687 'label': 'Cmd :',
688 'textvariable': self.cmd,
689 },
690 'gridcfg':{'sticky':Tkinter.W+Tkinter.E ,'columnspan':15}})
691 ifd.append({'widgetType': Tkinter.Button,
692 'text':'Launch',
693 'wcfg':{'bd':6},
694 'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'columnspan':3},
695 'command':self.callDoit_cb})
696 ifd.append({'widgetType': Tkinter.Button,
697 'text':'Cancel',
698 'wcfg':{'bd':6},
699 'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'row':-1,'column':3,'columnspan':2},
700 'command':self.Close_cb})
701
702
703
704
705
706 ifd.append({'name': 'gpfFilterEnt',
707 'widgetType':Tkinter.Entry,
708 'wcfg':{
709 'width':25,
710 'textvariable': self.gpfFilter,
711 },
712 'gridcfg':{'sticky':Tkinter.E}})
713
714
715
716
717 ifd.append( {'name': 'pdbqsFilterEnt',
718 'widgetType':Tkinter.Entry,
719 'wcfg':{
720 'width':25,
721 'textvariable': self.pdbqsFilter,
722 },
723 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
724
725
726
727
728 ifd.append( {'name': 'dpfFilterEnt',
729 'widgetType':Tkinter.Entry,
730 'wcfg':{
731 'width':25,
732 'textvariable': self.dpfFilter,
733 },
734 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':2}})
735
736
737
738
739 ifd.append( {'name': 'pdbqFilterEnt',
740 'widgetType':Tkinter.Entry,
741 'wcfg':{
742 'width':25,
743 'textvariable': self.pdbqFilter,
744 },
745 'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':3}})
746 ifd.append({'widgetType':'ListChooser',
747 'name':'gpfFiles',
748 'entries':self.gpf_list,
749 'mode':'single',
750 'title':'Select gpf file',
751 'lbwcfg':{'height':5,'selectforeground':'red','exportselection':0},
752 'command':CallBackFunction(self.setFile,'gpfFiles'),
753 'gridcfg':{'sticky':'w','rowspan':5}})
754 ifd.append({'widgetType':'ListChooser',
755 'name':'pdbqsFiles',
756 'entries':self.pdbqs_list,
757 'mode':'single',
758 'lbwcfg':{'height':5, 'selectforeground':'red','exportselection':0},
759 'command':CallBackFunction(self.setFile,'pdbqsFiles'),
760 'title':'Select pdbqs file',
761 'gridcfg':{'sticky':'w','column':1,'row':-5,
762 'rowspan':5}})
763 ifd.append({'widgetType':'ListChooser',
764 'name':'dpfFiles',
765 'entries':self.dpf_list,
766 'title':'Select dpf file',
767 'mode':'single',
768 'lbwcfg':{'height':5, 'selectforeground':'red','exportselection':0},
769 'command':CallBackFunction(self.setFile,'dpfFiles'),
770 'gridcfg':{'sticky':'w','column':2,'row':-9,
771 'rowspan':5}})
772 ifd.append({'widgetType':'ListChooser',
773 'name':'pdbqFiles',
774 'entries':self.pdbq_list,
775 'title':'Select pdbq file',
776 'mode':'single',
777 'command':CallBackFunction(self.setFile,'pdbqFiles'),
778 'lbwcfg':{'height':5, 'selectforeground':'red','exportselection':0},
779 'gridcfg':{'sticky':'w','column':3,'row':-13,
780 'rowspan':5}})
781 ifd.append({'name':'uploadGpfFileBut',
782 'widgetType':Tkinter.Button,
783 'text': 'Upload gpf File',
784 'command': CallBackFunction(self.uploadFiles,'.gpf'),
785 'gridcfg':{'sticky':Tkinter.E+Tkinter.W}})
786 ifd.append({'name':'uploadPdbqsFileBut',
787 'widgetType':Tkinter.Button,
788 'text': 'Upload pdbqs File',
789 'command': CallBackFunction(self.uploadFiles,'.pdbqs'),
790 'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'column':1, 'row':-1}})
791 ifd.append({'name':'uploadDpfFileBut',
792 'widgetType':Tkinter.Button,
793 'text': 'Upload dpf File',
794 'command': CallBackFunction(self.uploadFiles,'.dpf'),
795 'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'column':2, 'row':-1}})
796 ifd.append({'name':'uploadPdbqFileBut',
797 'widgetType':Tkinter.Button,
798 'text': 'Upload pdbq File',
799 'command': CallBackFunction(self.uploadFiles,'.pdbq'),
800 'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'column':3, 'row':-1}})
801 else:
802 if hasattr(self, 'form') and self.form!=None:
803 self.form.deiconify()
804 self.form.autoSize()
805
806
809
811 self.doitWrapper(self.cmd.get(),log=1,redraw=0)
812
814 self.flagVar = Tkinter.IntVar()
815 self.flagVar.set(0)
816
818 pass
819
821 kw['ask']=ask
822 apply(self.doitWrapper, (cmd,), kw)
823
824
825 - def doit(self, cmd, ask=1):
826 "AutoStarter:"
827 curdir=os.getcwd()
828 if string.find(curdir, 'tmp_mnt')>=0:
829 curdir=curdir[8:]
830 if self.vf.hasGui:
831 self.qT=self.queueType.get()
832 self.Host=self.hostName.get()
833 self.nqeJobFile=self.jobFile.get()
834 self.pF=self.paramFile.get()
835 if self.qT=='int':
836 if sys.platform=='win32':
837
838
839
840
841
842 if cmd[-1]=='&':
843 cmd=cmd[:-1]
844 cmd = cmd.split('-p')
845 if len(cmd) > 1:
846 cmd[1] = cmd[1].split('-l')
847 if len(cmd[1]) > 1:
848 cmd[1][0] = "\""+cmd[1][0].strip()+"\""
849 cmd[1][1] = cmd[1][1].strip()
850 self.vf.GUI.ROOT.after(500, self.saveLog, cmd[1][1])
851 cmd[1] = cmd[1][0]
852
853 cmd[0] = cmd[0].strip()
854 cmd = cmd[0] + ' -p ' + cmd[1]
855
856 cmd = os.path.normcase(cmd)
857 self.WinCmd = SysCmdInThread(cmd, shell=True)
858 self.WinCmd.start()
859 else:
860 bin = cmd.split()[0]
861 if os.system("which "+bin) != 0 and self.vf.hasGui:
862 tkMessageBox.showerror("Error!",bin + " not found. Please include "+bin+" in your path.",
863 parent=self.topLevel)
864 return
865 if os.environ.has_key("SHELL"):
866 cmd = "ulimit -s unlimited\n"+cmd
867 os.system(cmd)
868 if ask:
869 self.vf.ADstart_manage.addHost(self.Host)
870 self.vf.ADstart_manage.addProcess(self.programType)
871 self.vf.ADstart_manage.guiCallback()
872 elif self.qT=='nqe':
873 if self.nqeJobFile == None:
874 jobFile = self.makeJobFile(self.pF)
875 if self.vf.hasGui:self.jobFile.set(jobFile)
876 self.feedback = commands.getoutput(cmd)
877 if ask and self.vf.hasGui:self.vf.warningMsg(self.feedback)
878 elif self.qT=='pbs':
879 t='PBS not yet implemented'
880 self.vf.warningMsg(t)
881 return 'ERROR'
882 if self.nqeJobFile == None:
883 jobFile = self.makeJobFile(self.pF)
884 if self.vf.hasGui:self.jobFile.set(jobFile)
885 print 'cmd'
886
887
888 elif self.qT=='ent' and entropiaPresent:
889 print 'calling Entropia launch with ', cmd, self.projectName.get(), \
890 'monitor_job=',self.monitorVar.get(),'ftp_back=',self.ftpBackVar.get()
891 try:
892 jobid=self.EntropiaUI.launch(cmd,self.projectName.get(),\
893 monitor_job=self.monitorVar.get(),ftp_back=self.ftpBackVar.get())
894 except EntropiaError, msg:
895 self.vf.warningMsg(msg)
896 return 'ERROR'
897 if jobid:
898 self.jobDir.set(entropia_job_dir+str(jobid))
899 msg='Entropia job started as:\n'+str(jobid)
900 self.vf.warningMsg(msg)
901 else:
902 msg ='unknown queuetype', self.qT
903 if ask and self.vf.hasGui:
904 self.vf.warningMsg(msg)
905 return
906 if hasattr(self, 'form') and self.qT!='ent':self.form.root.withdraw()
907
909 """Checks the queue for results until we get one"""
910 if self.WinCmd.ok.configure()['state'][-1] == 'normal':
911 if not hasattr(self.WinCmd,'com'):
912 return
913 txt =self.WinCmd.stdoutTk.component('text').get(1.0,'end')
914
915 ind = txt.find("\n")
916 txt = txt[ind+1:]
917 ind = txt.find("Successful Completion")
918 if not ind == -1:
919 ind1 = txt[:ind].rfind("\n")
920 ind2 = ind + txt[ind:].find("\n") + 1
921 if txt[ind1-5:ind1] == "____\n":
922 ind1 = txt[:ind1-5].rfind("\n")
923 ind2 = ind2+3 + txt[ind2+2:].find("\n")
924 tmp_txt = txt[:ind1]
925 tmp_txt += txt[ind2:]
926 txt = tmp_txt
927 f = open(logPath,'w')
928 f.write(txt)
929 f.close()
930 import winsound
931 winsound.MessageBeep()
932 return
933 self.vf.GUI.ROOT.after(300,self.saveLog, logPath)
934
936 """AutoStarter:"""
937
938
939 if not pFName: return ''
940 if self.qT=='int':
941 return ''
942 elif self.qT=='nqe':
943 curdir=os.getcwd()
944 if string.find(curdir, 'tmp_mnt')>=0:
945 curdir=curdir[8:]
946 dName = curdir
947 elif self.qT == 'pbs':
948 t='PBS not yet implemented'
949 self.vf.warningMsg(t)
950 return
951 curdir=os.getcwd()
952 dName = self.remoteDir.get()
953 else:
954 msg = 'unknown queuetype->' + self.qT
955 self.vf.warningMsg(msg)
956 return
957 msg='self.'+self.name+'.makeJobFile(' + pFName+')'
958 self.vf.log(msg)
959 pName = os.path.split(pFName)[-1]
960 pnum=string.rfind(pName, '.')
961 pStem =pName[:pnum]
962 jobFile = pStem + '.j'
963 fptr= open(jobFile, 'w')
964 if self.qT=='nqe':
965 jobStr='cd '+dName+";"+self.Exe+" -p "+pName+" -l "+self.LogFile+"\n"
966 fptr.write(jobStr)
967 else:
968 outstring = '#PBS -l nodes=' + self.pbsCpu.get()
969 fptr.write(outstring)
970 outstring = '#PBS -l walltime=' +self.pbsWallTime.get()
971 fptr.write(outstring)
972
973 outstring = '#PBS -l cput=' +self.pbsTime.get()
974 fptr.write(outstring)
975 outstring = '#PBS -j oe'
976 fptr.write(outstring)
977 outstring = 'cd '+dName
978
979 fptr.write(outstring)
980
981
982 outstring = "./autogrid -p "+pName+" -l "+self.LogFile+"\n"
983 fptr.write(outstring)
984
985 outstring = "cp "+self.LogFile + ' ' +dName
986 fptr.write(outstring)
987 outstring = "exit"
988 fptr.write(outstring)
989 fptr.close()
990 os.chmod(jobFile, 0755)
991 return jobFile
992
994 return self.macroName.get()
995
997 return self.hostName.get()
998
1000
1001 self.hostName.set(host)
1002 msg= 'self.setHostVal(' + host + ')'
1003 self.vf.log(msg)
1004 self.Exe=self.hostDict[host][self.programType]
1005 self.execPath.set(self.Exe)
1006 self.queueType.set(self.hostDict[host]['queuetype'])
1007 self.getCmd()
1008
1010
1011 d=self.hostDict[macro]
1012 self.hostName.set(d['host'])
1013 msg= 'self.setMacroVal(' + macro + ')'
1014 self.vf.log(msg)
1015 self.Exe=d[self.programType]
1016 self.execPath.set(self.Exe)
1017 self.queueType.set(d['queuetype'])
1018 self.getCmd()
1019
1021 if not entropiaPresent: return
1022 idf = InputFormDescr("Entropia Password")
1023 idf.append({'widgetType':Tkinter.Entry,
1024 'name': 'password',
1025 'label': 'Password',
1026 'wcfg':{
1027
1028 'show': '*'
1029 },
1030 'defaultValue': '',
1031 'gridcfg':{'sticky':Tkinter.E}
1032 })
1033 idf_dict = self.vf.getUserInput(idf)
1034 if idf_dict:
1035 password = idf_dict['password']
1036
1037 try:
1038 self.EntropiaUI=EntropiaUI(password)
1039 return 1
1040 except ftplib.error_perm,msg:
1041 self.vf.warningMsg(msg)
1042 return None
1043 else: return None
1044
1046 if not entropiaPresent: return
1047 files = {}
1048 newAdtFile = 0
1049 ifd=InputFormDescr(title='Process current adt files?')
1050 ifd.append( {'name': 'thisLab',
1051 'widgetType': Tkinter.Label,
1052 'text': 'Upload newly created adt files:',
1053 'gridcfg':{'sticky':Tkinter.E}})
1054 if hasattr(self.vf, 'gpo') and len(self.vf.gpo.gpf_filename):
1055 newAdtFile = 1
1056 files['gpf']= self.vf.gpo.gpf_filename
1057 ifd.append( {'name': 'gpfCBut',
1058 'widgetType':Tkinter.Checkbutton,
1059 'text':files['gpf'],
1060 'gridcfg':{'sticky':Tkinter.W}})
1061 if self.vf.atorsDict.has_key('outfile'):
1062 newAdtFile = 1
1063 files['pdbq']=os.path.split(self.vf.atorsDict['outfile'])[-1]
1064 ifd.append( {'name': 'pdbqCBut',
1065 'widgetType':Tkinter.Checkbutton,
1066 'text':files['pdbq'],
1067 'gridcfg':{'sticky':Tkinter.W}})
1068 if hasattr(self.vf,'dpo') and len(self.vf.dpo.dpf_filename):
1069 newAdtFile = 1
1070 files['dpf'] = self.vf.dpo.dpf_filename
1071 ifd.append( {'name': 'dpfCBut',
1072 'widgetType':Tkinter.Checkbutton,
1073 'text':files['dpf'],
1074 'gridcfg':{'sticky':Tkinter.W}})
1075 if hasattr(self.vf, 'gpo') and len(self.vf.gpo.receptor_filename):
1076 newAdtFile = 1
1077 files['pdbqs'] = self.vf.gpo.receptor_filename
1078 ifd.append( {'name': 'pdbqsCBut',
1079 'widgetType':Tkinter.Checkbutton,
1080 'text':files['pdbqs'],
1081 'gridcfg':{'sticky':Tkinter.W}})
1082 elif hasattr(self.vf,'dpo') and len(self.vf.dpo.receptor_filename):
1083 newAdtFile = 1
1084 files['pdbqs'] = self.vf.dpo.receptor_filename
1085 ifd.append( {'name': 'pdbqsCBut',
1086 'widgetType':Tkinter.Checkbutton,
1087 'text':files['pdbqs'],
1088 'gridcfg':{'sticky':Tkinter.W}})
1089 if not newAdtFile: return
1090 val_dict = self.vf.getUserInput(ifd)
1091 if val_dict:
1092 for item in val_dict.keys():
1093 if val_dict[item]:
1094
1095 itemName=item[:-4]
1096 try:
1097 print 'uploading ', files[itemName]
1098 self.EntropiaUI.upload(files[itemName])
1099 except EntropiaError, msg:
1100 self.vf.warningMsg(msg)
1101 return
1102
1103 print 'uploaded ', files[itemName]
1104
1105 self.updateLCS(itemName)
1106
1107
1108
1109
1110
1111 exec('self.'+itemName+'.set(files[itemName])')
1112
1113 itemWidget=itemName+'Files'
1114 lb = self.ifd.entryByName[itemWidget]['widget'].lb
1115 for i in range(lb.index('end')):
1116 if lb.get(i)==files[itemName]:
1117 lb.select_clear('end')
1118 lb.select_set(i)
1119 lb.see(i)
1120
1121 self.getCmd()
1122
1123
1125
1126 macroList=self.hostDict.keys()
1127 macro=macroList[val]
1128 self.macroName.set(macro)
1129 self.Host = self.hostDict[macro]['host']
1130
1131 self.hostName.set(self.Host)
1132 self.Exe=self.hostDict[macro][self.programType]
1133 self.execPath.set(self.Exe)
1134 self.qT=self.hostDict[macro]['queuetype']
1135 self.queueType.set(self.qT)
1136 if self.qT=='int':
1137 for item in self.intWids:
1138 self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1139 for item in self.commonWids:
1140 self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1141 for item in self.nqeWids:
1142 self.ifd.entryByName[item]['widget'].grid_forget()
1143 for item in self.pbsWids:
1144 self.ifd.entryByName[item]['widget'].grid_forget()
1145 for item in self.entWids:
1146 self.ifd.entryByName[item]['widget'].grid_forget()
1147 for item in self.entWidLCS:
1148 self.ifd.entryByName[item]['widget'].top.grid_forget()
1149 for item in self.entButs:
1150 self.ifd.entryByName[item]['widget'].grid_forget()
1151 elif self.qT=='nqe':
1152 for item in self.commonWids:
1153 self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1154 for item in self.nqeWids:
1155 self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1156 for item in self.intWids:
1157 self.ifd.entryByName[item]['widget'].grid_forget()
1158 for item in self.pbsWids:
1159 self.ifd.entryByName[item]['widget'].grid_forget()
1160 for item in self.entWids:
1161 self.ifd.entryByName[item]['widget'].grid_forget()
1162 for item in self.entWidLCS:
1163 self.ifd.entryByName[item]['widget'].top.grid_forget()
1164 for item in self.entButs:
1165 self.ifd.entryByName[item]['widget'].grid_forget()
1166 if sys.platform=='win32': self.niceLevel.set('0')
1167 elif self.qT=='pbs':
1168 for item in self.commonWids:
1169 self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1170 for item in self.pbsWids:
1171 self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1172 for item in self.intWids:
1173 self.ifd.entryByName[item]['widget'].grid_forget()
1174 for item in self.nqeWids:
1175 self.ifd.entryByName[item]['widget'].grid_forget()
1176 for item in self.entWids:
1177 self.ifd.entryByName[item]['widget'].grid_forget()
1178 for item in self.entWidLCS:
1179 self.ifd.entryByName[item]['widget'].top.grid_forget()
1180 for item in self.entButs:
1181 self.ifd.entryByName[item]['widget'].grid_forget()
1182 if sys.platform=='win32':
1183 self.niceLevel.set('0')
1184 elif self.qT=='ent' and entropiaPresent:
1185 if not hasattr(self, 'EntropiaUI'):
1186 if not self.getEntropiaUIObject(): return
1187
1188 if self==self.vf.ADstart_autogrid:
1189 msg='AutoGrid Jobs not defined separately for Entropia system'
1190 self.vf.warningMsg(msg)
1191 self.getMacroVal(0)
1192 return
1193 for item in self.entWids:
1194 self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1195 for item in self.entWidLCS:
1196 self.ifd.entryByName[item]['widget'].top.grid(self.ifd.entryByName[item]['gridcfg'])
1197 for item in self.entButs:
1198 self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1199 for item in self.commonWids:
1200 self.ifd.entryByName[item]['widget'].grid_forget()
1201 for item in self.intWids:
1202 self.ifd.entryByName[item]['widget'].grid_forget()
1203 for item in self.flagWids:
1204 self.ifd.entryByName[item]['widget'].grid_forget()
1205 for item in self.nqeWids:
1206 self.ifd.entryByName[item]['widget'].grid_forget()
1207 for item in self.pbsWids:
1208 self.ifd.entryByName[item]['widget'].grid_forget()
1209 if sys.platform=='win32':
1210 self.niceLevel.set('0')
1211
1212 for item in ['gpf_list','dpf_list','pdbq_list','pdbqs_list']:
1213
1214
1215 setattr(self, item, getattr(self.EntropiaUI, item))
1216 for item in ['gpf','pdbqs','dpf','pdbq']:
1217 self.updateLCS(item)
1218
1219 self.checkPrevious()
1220 else:
1221 t='Unknown queueType: '+self.qT
1222 self.vf.warningMsg(t)
1223 return
1224 self.getCmd()
1225
1227 if not entropiaPresent: return
1228 try:
1229 projectList=self.EntropiaUI.project_list
1230 except AttributeError:
1231 return
1232 project=projectList[val]
1233 self.projectName.set(project)
1234
1236
1237 hostList=self.hostDict.keys()
1238 host=hostList[val]
1239 self.Host=host
1240 self.hostName.set(host)
1241 self.Exe=self.hostDict[host][self.programType]
1242 self.execPath.set(self.Exe)
1243 self.qT=self.hostDict[host]['queuetype']
1244 self.queueType.set(self.qT)
1245 if self.queueType.get()=='int':
1246 self.ifd.entryByName['niceLab']['widget'].grid(self.ifd.entryByName['niceLab']['gridcfg'])
1247 self.ifd.entryByName['niceEntry']['widget'].grid(self.ifd.entryByName['niceEntry']['gridcfg'])
1248 self.ifd.entryByName['nqeTimeLab']['widget'].grid_forget()
1249 self.ifd.entryByName['nqeTimeEntry']['widget'].grid_forget()
1250 self.ifd.entryByName['pbsDirLab']['widget'].grid_forget()
1251 self.ifd.entryByName['pbsDirEntry']['widget'].grid_forget()
1252 self.ifd.entryByName['nqeCpuLab']['widget'].grid_forget()
1253 self.ifd.entryByName['nqeCpuEntry']['widget'].grid_forget()
1254 self.ifd.entryByName['niceLab']['widget'].grid(self.ifd.entryByName['niceLab']['gridcfg'])
1255 self.ifd.entryByName['niceEntry']['widget'].grid(self.ifd.entryByName['niceEntry']['gridcfg'])
1256 else:
1257 self.ifd.entryByName['nqeTimeLab']['widget'].grid(self.ifd.entryByName['nqeTimeLab']['gridcfg'])
1258 self.ifd.entryByName['nqeTimeEntry']['widget'].grid(self.ifd.entryByName['nqeTimeEntry']['gridcfg'])
1259 self.ifd.entryByName['pbsDirLab']['widget'].grid(self.ifd.entryByName['pbsDirLab']['gridcfg'])
1260 self.ifd.entryByName['pbsDirEntry']['widget'].grid(self.ifd.entryByName['pbsDirEntry']['gridcfg'])
1261 self.ifd.entryByName['nqeCpuLab']['widget'].grid(self.ifd.entryByName['nqeCpuLab']['gridcfg'])
1262 self.ifd.entryByName['nqeCpuEntry']['widget'].grid(self.ifd.entryByName['nqeCpuEntry']['gridcfg'])
1263 self.ifd.entryByName['niceLab']['widget'].grid_forget()
1264 self.ifd.entryByName['niceEntry']['widget'].grid_forget()
1265 if sys.platform=='win32':
1266 self.ifd.entryByName['niceLab']['widget'].grid_forget()
1267 self.ifd.entryByName['niceEntry']['widget'].grid_forget()
1268 self.niceLevel.set('0')
1269 self.getCmd()
1270
1272 self.ParmFile=pF
1273 self.paramFile.set(pF)
1274
1275 lnum=string.rfind(pF, '.')
1276 llist=pF[:lnum]
1277 self.logFile.set(llist+'.'+self.logType)
1278 self.LogFile=llist+'.'+self.logType
1279 msg= 'self.setParmFileVal(' + pF + ')'
1280 self.vf.log(msg)
1281 host = self.hostName.get()
1282 self.Exe=self.hostDict[host][self.programType]
1283 self.execPath.set(self.Exe)
1284 self.queueType.set(self.hostDict[host]['queuetype'])
1285 self.getCmd()
1286
1288 macroMb=self.ifd.entryByName['mNMenu']['widget']
1289 macroMb.config(text='macros')
1290 if not self.showMacroMenu.get():
1291
1292 macroList = self.hostDict.keys()
1293 self.buildMenu(macroList,macroMb,self.macroVal, self.getMacroVal)
1294 self.showHostMenu.set(1)
1295 else:
1296 hostMenubutton.menu.unpost()
1297 self.showHostMenu.set(0)
1298
1299
1301 hostMb=self.ifd.entryByName['hNMenu']['widget']
1302 hostMb.config(text='hosts')
1303 if not self.showHostMenu.get():
1304
1305 hostList = self.hostDict.keys()
1306 self.buildMenu(hostList,hostMb,self.hostVal, self.getHostVal)
1307 self.showHostMenu.set(1)
1308 else:
1309 hostMenubutton.menu.unpost()
1310 self.showHostMenu.set(0)
1311
1313 if not entropiaPresent: return
1314 projectMb=self.ifd.entryByName['pjMenu']['widget']
1315 projectMb.config(text='projects')
1316 try:
1317 projectList = self.EntropiaUI.project_list
1318 except AttributeError:
1319 projectList=[]
1320 self.buildMenu(projectList,projectMb,self.projectVal, self.getProjectVal)
1321
1323 if not entropiaPresent: return
1324 projectMb=self.ifd.entryByName['pjMenu']['widget']
1325 projectMb.config(text='projects')
1326 if not self.showProjectMenu.get():
1327 try:
1328 projectList = self.EntropiaUI.project_list
1329 print "projectList=", projectList
1330 except AttributeError:
1331 projectList=[]
1332 self.buildMenu(projectList,projectMb,self.projectVal, self.getProjectVal)
1333 self.showProjectMenu.set(1)
1334 else:
1335 projectMb.menu.unpost()
1336 self.showProjectMenu.set(0)
1337
1339
1340 mB.config(bg='white')
1341 if not hasattr(mB, 'menu'):
1342 mB.menu=Tkinter.Menu(mB)
1343 mB['menu']=mB.menu
1344 else:
1345 mB.menu.delete(1, 'end')
1346
1347
1348 for i in range(len(keyList)):
1349 mB.menu.add_radiobutton(label=keyList[i],
1350 var=var,value=i,command=CallBackFunction(cmd,i))
1351
1352 - def getCmd(self, event=None):
1353 "AutoStart:"
1354 host = self.hostName.get()
1355 exe = self.execPath.get()
1356 cmd = self.cmd
1357 pFile = self.paramFile.get()
1358 logName = self.logFile.get()
1359 curdir=os.getcwd()
1360 remotedir = self.remoteDir.get()
1361 niceStr=' '
1362 if self.niceLevel.get()=='':
1363 self.niceLevel.set('0')
1364 if self.niceLevel.get()!='0':
1365 niceStr = 'nice +'+self.niceLevel.get()+ ' '
1366 if string.find(curdir, 'tmp_mnt')>=0:
1367 curdir=curdir[8:]
1368 jobFile = self.jobFile.get()
1369 qT=self.queueType.get()
1370 if jobFile=='' and pFile and (qT=='nqe' or qT=='pbs'):
1371 self.jobFile.set(self.makeJobFile(pFile))
1372 jobFile = self.jobFile.get()
1373 if qT=='int':
1374 if host==self.localHost:
1375 cmd.set(exe + ' -p ' + pFile + ' -l ' + logName + '&')
1376 else:
1377 cmdStr="rsh "+host+" -n "+"\'cd "+curdir+";"+ niceStr + exe+" -p "+pFile+" -l "+logName+"&\'&"
1378 cmd.set(cmdStr)
1379 elif qT=='nqe':
1380 cmdStr = "rsh "+host+" -n \'cd "+curdir+";/nqe/bin/cqsub -lT "+self.nqeTime.get()+ " -la ncpu="+ self.nqeCpu.get()+" "+jobFile+"\'"
1381 cmd.set(cmdStr)
1382 elif qT=='win':
1383 print 'in case queueType==win'
1384 cmdStr = "rsh "+host+" -n \'cd "+curdir+";/nqe/bin/cqsub -lT "+self.nqeTime.get()+ " -la ncpu="+ self.nqeCpu.get()+" "+jobFile+"\'"
1385 cmd.set(cmdStr)
1386 elif qT=='pbs':
1387 if remotedir=='':
1388 msg = 'No REMOTE DIRECTORY specified!'
1389 self.vf.warningMsg(msg)
1390 return
1391 cmdStr = "ssh "+host+"-n \'cd "+remotedir+";qsub -l cput="+self.pbsCpuTime.get()+"-l nodes="+self.pbsCpu.get()+ " -l walltime="+ self.pbsWallTime.get()+"-r "+self.pbsRerun.get()+' ' + jobFile+"\'"
1392 cmd.set(cmdStr)
1393 elif qT=='ent':
1394 msg='AutoGrid Jobs not defined separately for Entropia system'
1395 self.vf.warningMsg(msg)
1396 self.getMacroVal(0)
1397 return
1398 else:
1399 msg = 'Unknown queueType->'+ qT
1400 self.vf.warningMsg(msg)
1401 return
1402
1403
1405
1406
1407
1408 pF=self.paramFile.get()
1409 lnum=string.rfind(pF, '.')
1410 llist=pF[:lnum]
1411 self.logFile.set(llist+'.'+self.logType)
1412 self.LogFile=llist+'.'+self.logType
1413
1414 self.jobFile.set(self.makeJobFile(self.paramFile.get()))
1415
1416
1418 pf = self.vf.askFileOpen(parent = self.topLevel,
1419 types=[('select '+self.browserPFTitle,'*.'+self.pfType)], title= self.program +' Parameter File:')
1420 if pf:
1421
1422 pfList=os.path.split(pf)
1423 if pfList[0]==os.getcwd():
1424 pfname = os.path.split(pf)[-1]
1425 else:
1426 pfname=pf
1427 self.paramFile.set(pfname)
1428 self.ParmFile=pfname
1429 self.updateLF()
1430 self.getCmd()
1431 if hasattr(self, 'topLevel'):self.topLevel.lift()
1432
1434 ef = self.vf.askFileOpen(parent = self.topLevel,
1435 types=[('select program:','*')], title= self.program)
1436 if ef:
1437
1438 efList=os.path.split(ef)
1439 if efList[0]==os.getcwd():
1440 efname = os.path.split(ef)[-1]
1441 else:
1442 efname=ef
1443 self.execPath.set(efname)
1444 self.Exe=efname
1445 self.getCmd()
1446 if hasattr(self, 'topLevel'):self.topLevel.lift()
1447
1449 lf = self.vf.askFileOpen(parent = self.topLevel,
1450 types=[('select :','*.'+self.logType)], title= self.program+ ' log File:')
1451 if lf:
1452
1453 lfList=os.path.split(lf)
1454 if lfList[0]==os.getcwd():
1455 lfname = os.path.split(lf)[-1]
1456 else:
1457 lfname=lf
1458 self.logFile.set(lfname)
1459 self.getCmd()
1460 if hasattr(self, 'topLevel'):self.topLevel.lift()
1461
1463 self.niceLevel.set(str(val))
1464 self.getCmd()
1465
1467 self.nqeTime.set(str(val))
1468 self.getCmd()
1469
1471 self.nqeCpu.set(str(val))
1472 self.getCmd()
1473
1475 self.Host=hostStr
1476
1478 self.Exe=exeStr
1479
1481 self.FlagStr=flagStr
1482
1484 self.ParmFile=parmStr
1485
1487 self.LogFile=logStr
1488
1490 self.command=self.Exe + " " + self.FlagStr+ " " + self.ParmFile+ " " + self.LogFile
1491
1493 if not host: host=self.localHost
1494 self.qT= self.hostDict[host]['queuetype']
1495 if self.qT!='int':
1496 t=host + ' is nqe queueType; use doNqeRemoteCommand instead'
1497 self.vf.warningMsg(t)
1498 return
1499 exe= self.hostDict[host][self.programType]
1500 curdir=os.getcwd()
1501 if string.find(curdir, 'tmp_mnt')>=0:
1502 curdir=curdir[8:]
1503 if not log:
1504
1505 lnum=string.rfind(pFile, '.')
1506 pFileStem=pFile[:lnum]
1507 log = pFileStem +"."+self.logType
1508 self.RemoteCommand= "rsh "+host+" -n "+"\'cd "+curdir+";nice +" + str(nice)+" "+exe+' '+flagStr+" -p "+pFile+" -l "+log+"&\'&"
1509 self.doitWrapper(self.RemoteCommand,0,log=1,redraw=0)
1510
1511 - def doNqeRemoteCommand(self,pFile,host=None,nqeTime=144000,ncpu=1,flagStr=' ',log=None):
1512 if not host: host=self.localHost
1513 self.qT= self.hostDict[host]['queuetype']
1514 if self.qT!='nqe':
1515 t=host + ' is int queueType; use doIntRemoteCommand instead'
1516 self.vf.warningMsg(t)
1517 return
1518 exe= self.hostDict[host][self.programType]
1519 curdir=os.getcwd()
1520 if string.find(curdir, 'tmp_mnt')>=0:
1521 curdir=curdir[8:]
1522 lnum=string.rfind(pFile, '.')
1523 pFileStem=pFile[:lnum]
1524 if not log:
1525 log = pFileStem +"."+self.logType
1526 cmdStr= "cd "+curdir+";"+exe+' ' +flagStr+" -p "+pFile+" -l "+log
1527 jobFileName=pFileStem+'.j'
1528 self.makeJF(jobFileName,cmdStr)
1529 self.RemoteCommand= "rsh " +host+ " -n " + "\'cd " +curdir+";/nqe/bin/cqsub -lT "+str(nqeTime)+ " -la ncpu="+str(ncpu)+" "+jobFileName + "\'"
1530 self.doitWrapper(self.RemoteCommand,0,log=1,redraw=0)
1531
1532 - def makeJF(self,jobFile,jobStr):
1533 fptr= open(jobFile, 'w')
1534 fptr.write(jobStr)
1535 fptr.close()
1536 os.chmod(jobFile, 0755)
1537 self.nqeJobFile=jobFile
1538
1540 curdir=os.getcwd()
1541 if string.find(curdir, 'tmp_mnt')>=0:
1542 curdir=curdir[8:]
1543 if self.Host==None:self.Host=host
1544 lnum=string.rfind(pFile, '.')
1545 pFileStem=pFile[:lnum]
1546
1547 jName=pFileStem+'.j'
1548 self.nqeJobFile=jName
1549 self.makeJF(jName,self.setIntRemoteCommand(self,host,curdir,nice,exe,flagStr,pFile,log))
1550 return "rsh " +host+ " -n " + "\'cd " +curdir+";/nqe/bin/cqsub -lT "+nqeTime+ " -la ncpu="+ncpu+" "+job + "\'"
1551
1552
1553
1555 """Interactive usage:
1556 The user chooses host and parameter file and starts the Autogrid job.
1557 If the host has an interactive queue, launching the job opens
1558 a 'ADstart_manage' widget which allows the user to follow the job
1559 and to kill it, if necesary. A 'job file' is written when a parameter
1560 file is selected in combination with the selection of a 'nqe'-type host.
1561 Scripting usage:
1562 'doIntRemoteCommand' and 'doNqeRemoteCommand' methods allow starting
1563 AutoGrid with the specified parameter file on a host with
1564 a appropriate queue type. (if not specified, host is assumed
1565 to be the local host and must be of appropriate queue type).
1566 All other parameters are optional"""
1567
1569 AutoStarter.__init__(self,program='autogrid3',
1570 dictObj='gpo',
1571 ifdTitle="Run AutoGrid",
1572 browserPFTitle="Grid Parameter File",
1573 browserEXETitle='autogrid3',
1574 browserLOGTitle="Grid Log",
1575 logType='glg',
1576 pfType='gpf',
1577 programType='autogrid')
1578
1579
1580 AutoGridStarterGUI=CommandGUI()
1581 AutoGridStarterGUI.addMenuCommand('AutoToolsBar', menuText['StartMB'], menuText['startGridMB'])
1582
1583
1584
1586 """Interactive usage:
1587 The user chooses host and parameter file and starts the Autodock job.
1588 If the host has an interactive queue, launching the job opens
1589 a 'ADstart_manage' widget which allows the user to follow the job
1590 and to kill it, if necesary. A 'job file' is written when a parameter
1591 file is selected in combination with the selection of a 'nqe'-type host.
1592 Scripting usage:
1593 'doIntRemoteCommand' and 'doNqeRemoteCommand' methods allow starting
1594 Autodock with the specified parameter file on a host with
1595 a appropriate queue type. (if not specified, host is assumed
1596 to be the local host and must be of appropriate queue type).
1597 All other parameters are optional"""
1598
1600 AutoStarter.__init__(self,program='autodock3',
1601 dictObj='dpo',
1602 ifdTitle="Run AutoDock",
1603 browserPFTitle="Dock Parameter File",
1604 browserEXETitle='autodock3',
1605 browserLOGTitle="Dock Log",
1606 logType='dlg',
1607 pfType='dpf',
1608 programType='autodock')
1609
1611
1612 self.customizeGUI()
1613 if not hasattr(self, 'form'):
1614 if self.vf.hasGui:
1615
1616 self.form = self.vf.getUserInput(self.ifd,modal=0, blocking=0)
1617 self.form.root.protocol('WM_DELETE_WINDOW',self.Close_cb)
1618 self.topLevel = self.form.root
1619 else:
1620
1621 from mglutil.gui.InputForm.Tk.gui import InputForm
1622 self.form = InputForm(self.vf.master,self.ifd,modal=0, blocking=0)
1623 self.topLevel = self.form.root
1624 if hasattr(self.vf, 'dpo') and len(self.vf.dpo.dpf_filename):
1625 if self.paramFile.get()=='':
1626 self.paramFile.set(self.vf.dpo.dpf_filename)
1627 self.updateLF()
1628
1629 self.flagVar.set(0)
1630 self.kflag.set(0)
1631 self.iflag.set(0)
1632 self.uflag.set(0)
1633 self.tflag.set(0)
1634 self.cflag.set(0)
1635 self.inputFile.set("")
1636 self.outputFile.set("")
1637 self.intWids=['niceLab','niceEntry']
1638 if sys.platform=='win32':
1639 self.ifd.entryByName['niceLab']['widget'].grid_forget()
1640 self.ifd.entryByName['niceEntry']['widget'].grid_forget()
1641 self.commonWids=['hNLab','hNentry','eXLab','eXentry','eXbutton',
1642 'pFLab','pFentry','pFbutton',
1643 'lFLab','lFentry','lFbutton']
1644 self.nqeWids=['nqeCpuLab','nqeCpuEntry','nqeTimeLab','nqeTimeEntry']
1645 self.pbsWids=['pbsCpuLab','pbsCpuEntry','pbsDirLab','pbsDirEntry','pbsTimeLab','pbsTimeEntry','pbsWallTimeLab','pbsWallTimeEntry','pbsRerunCB']
1646
1647 self.entWids=['pjLab','pjentry','pjMenu','nodesEntLab','nodesEnt',
1648 'gpfEntLab', 'gpfEnt','pdbqEntLab','pdbqEnt',
1649 'dpfEntLab','dpfEnt', 'pdbqsEntLab','pdbqsEnt',
1650 'jobDirEntLab','jobDirEnt', 'gpfFilterEnt', 'pdbqFilterEnt',
1651 'dpfFilterEnt','pdbqsFilterEnt']
1652 self.entWidLCS=['gpfFiles','pdbqFiles','dpfFiles','pdbqsFiles']
1653 self.entButs=[ 'uploadGpfFileBut','uploadPdbqFileBut',
1654 'uploadDpfFileBut','uploadPdbqsFileBut', 'monitorCB',
1655 'ftpBackCB']
1656 self.bindEntries()
1657 self.getMacroVal(0)
1658 self.updateFlags()
1659 self.getInputs()
1660 self.form.autoSize()
1661
1662 - def setFile(self, item, event=None):
1663 lb=self.ifd.entryByName[item]['widget'].lb
1664 if lb.curselection()==(): return
1665 newsel=lb.get(lb.curselection())
1666
1667
1668 setattr(self, item[:-5], newsel)
1669 self.getCmd()
1670
1671
1673 if hasattr(self,'form'):
1674 self.ifd.entryByName['cmdentry']['widget'].bind('<Return>', self.