Package AutoDockTools :: Module autostartCommands
[hide private]
[frames] | no frames]

Source Code for Module AutoDockTools.autostartCommands

   1  ############################################################################# 
   2  # 
   3  # Author: Ruth HUEY, Michel F. SANNER 
   4  # 
   5  # Copyright: M. Sanner TSRI 2000 
   6  # 
   7  ############################################################################# 
   8   
   9   
  10  # $Header: /opt/cvs/python/packages/share1.5/AutoDockTools/autostartCommands.py,v 1.24.2.3 2007/09/27 23:25:55 sargis Exp $ 
  11  # 
  12  # $Id: autostartCommands.py,v 1.24.2.3 2007/09/27 23:25:55 sargis Exp $ 
  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  ##  from ViewerFramework.gui import InputFormDescr 
  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   
51 -def removePCs():
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 #these are the texts on menubuttons, menu entries etc: 63 menuText = {} 64 menuText['StartMB'] = 'Run' 65 #menuText['StartMB'] = ' Run ' 66 menuText['startGridMB'] = 'Run AutoGrid...' 67 menuText['startDockMB'] = 'Run AutoDock...' 68 menuText['processManagerMB'] = 'Job Status...' 69 menuText['editHostsMB'] = 'Host Preferences...' 70 71 72
73 -class ADKill(Kill):
74
75 - def __init__(self, master):
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 #put in are you sure dialog here 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
111 - def updateHosts(self, hostList):
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 #check here that the line has ps: autodock/autogrid 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
152 -class ADProcessManager(MVCommand):
153
154 - def onAddCmdToViewer(self):
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
165 - def __init__(self):
166 MVCommand.__init__(self) 167 self.localHost = socket.gethostname() 168 self.invalid = 0 169 import AutoDockTools 170 self.hostDict = AutoDockTools.hostDict 171 self.currentHosts=None 172 self.psList=None
173 174
175 - def addHost(self, host):
176 if not self.currentHosts: self.currentHosts=[] 177 if not host in self.currentHosts: 178 self.currentHosts.append(host)
179
180 - def addProcess(self, ps):
181 if not self.psList: self.psList=[] 182 if not ps in self.psList: 183 self.psList.append(ps)
184
185 - def adUpdate(self):
186 #currentHosts should be all hosts of all active jobs 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
194 - def guiCallback(self, event=None):
195 if not self.top.winfo_ismapped(): 196 self.top.deiconify() 197 self.kill.after(100, self.adUpdate)
198
199 - def __call__(self, **kw):
200 apply(self.doitWrapper, (), kw)
201
202 - def doit(self):
203 #kill 204 print 'killed'
205 206 ADProcessManagerGUI=CommandGUI() 207 ADProcessManagerGUI.addMenuCommand('AutoToolsBar', menuText['StartMB'], menuText['processManagerMB']) 208 209 210
211 -class AutoStarter(MVCommand):
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
216 - def onAddCmdToViewer(self):
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
257 - def guiCallback(self, event=None):
258 #AutoStarter: dict is only self.vf.gpo since autodock is handled separately 259 self.customizeGUI() 260 if not hasattr(self, 'form'): 261 if self.vf.hasGui: 262 #self.form = self.vf.getUserInput(self.ifd, scrolledFrame = 1, width = 1000, height = 300,modal=0, blocking=0) 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 ## from ViewerFramework.gui import InputForm 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 #4/5 return seems better than leave 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
312 - def updateLCS(self, key, event=None):
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 #compile the re items if any 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 #lb.insert(lb.index('end'),f) 333 else: 334 for i in range(4): 335 #'gpfFiles','pdbqsFiles','dpfFiles','pdbqFiles' 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
347 - def uploadFiles(self,key, event=None):
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
362 - def customizeGUI(self):
363 #AutoStarter 364 if not hasattr(self, 'ifd'): 365 #for the moment: 366 self.gpf_list=[] 367 self.dpf_list=[] 368 self.pdbq_list=[] 369 self.pdbqs_list=[] 370 371 #self.gpfFileList=['h2.gpf','hpi1s.gpf'] 372 #self.dpfFileList=['h2.dpf','hpi1s.dpf'] 373 #self.pdbqFileList=['h2.out.pdbq','hpi1s.out.pdbq'] 374 #self.pdbqsFileList=['1crn.pdbqs','1hvr.pdbqs'] 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 #the tkinter variables for the entropia stuff 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 #next the widgets for entropia widgets: 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 #last the widgets for the Entropia lists: 702 #ifd.append({'name':'gpfFilterLab', 703 #'widgetType':Tkinter.Label, 704 #'text': 'gpf file filter', 705 #'gridcfg':{'sticky':Tkinter.E}}) 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 #ifd.append({'name':'pdbqsFilterLab', 714 #'widgetType':Tkinter.Label, 715 #'text': 'pdbqs file filter', 716 #'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':4}}) 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 #ifd.append({'name':'dpfFilterLab', 725 #'widgetType':Tkinter.Label, 726 #'text': 'dpf file filter', 727 #'gridcfg':{'sticky':Tkinter.E}}) 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 #ifd.append({'name':'pdbqFilterLab', 736 #'widgetType':Tkinter.Label, 737 #'text': 'pdbq file filter', 738 #'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':6}}) 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
807 - def Close_cb(self, event=None):
808 self.form.root.withdraw()
809
810 - def callDoit_cb(self, event = None):
811 self.doitWrapper(self.cmd.get(),log=1,redraw=0)
812
813 - def setUpFlagVars(self):
814 self.flagVar = Tkinter.IntVar() 815 self.flagVar.set(0)
816
817 - def getFlags(self):
818 pass
819
820 - def __call__(self, cmd, ask=1, **kw):
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 #need to remove the & and flip the backslashes... 838 #cmd=string.replace(cmd,'/','\\') 839 #2/26: normcase is suppose to flip backslashes for windows 840 #cmd = 'C:/..../'+cmd 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]# + ' -l ' + cmd[1][1] 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 #self.feedback = commands.getoutput(cmd) 887 #if ask and self.vf.hasGui:self.vf.warningMsg(self.feedback) 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
908 - def saveLog(self, logPath):
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 #txt = txt.split('\n') 915 ind = txt.find("\n") 916 txt = txt[ind+1:] #this should get rid of the first line 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
935 - def makeJobFile(self, pFName):
936 """AutoStarter:""" 937 #NOT FINISHED: 938 #MUST PUT COPY OF JOB FILE ON REMOTE MACHINE!?! 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 #what is cput??? 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 #outstring = 'cd $PBSTMPDIR' 979 fptr.write(outstring) 980 #outstring = 'dmf get exec/autogrid.' 981 #fptr.write(outstring) 982 outstring = "./autogrid -p "+pName+" -l "+self.LogFile+"\n" 983 fptr.write(outstring) 984 #copy the logfile and MAPS?? back to curdir?? 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
993 - def getMacro(self, event=None):
994 return self.macroName.get()
995
996 - def getHost(self, event=None):
997 return self.hostName.get()
998
999 - def setHostVal(self, host):
1000 #this triggers getting the rest of the cmd 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
1009 - def setMacroVal(self, macro):
1010 #this triggers getting the rest of the cmd 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
1020 - def getEntropiaUIObject(self):
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 #'label': 'Password', 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 ##initialize EntropiaUI object 1037 try: 1038 self.EntropiaUI=EntropiaUI(password) 1039 return 1 # true 1040 except ftplib.error_perm,msg: 1041 self.vf.warningMsg(msg) 1042 return None 1043 else: return None
1044
1045 - def checkPrevious(self):
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 #upload this file 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 #this gets called with 'gpf' or 'pdbqs' etc 1103 print 'uploaded ', files[itemName] 1104 #select it in the listchooser 1105 self.updateLCS(itemName) 1106 #put it in the entry 1107 #FIX ME: I don't know if this is ok or not 1108 #because i don't know if self.itemName is a Tkinter var 1109 # or not ????? 1110 #setattr(self, itemName, files[itemName]) 1111 exec('self.'+itemName+'.set(files[itemName])') 1112 #also highlightit in the listchooser 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 #update cmd 1121 self.getCmd()
1122 1123
1124 - def getMacroVal(self, val, event=None):
1125 #autostarter 1126 macroList=self.hostDict.keys() 1127 macro=macroList[val] 1128 self.macroName.set(macro) 1129 self.Host = self.hostDict[macro]['host'] 1130 #self.Host=host 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 # call local updateListChooser with new file_lists 1212 for item in ['gpf_list','dpf_list','pdbq_list','pdbqs_list']: 1213 #exec('self.'+item+'=self.EntropiaUI.'+item) 1214 #these items are not Tkinter vars, so this is ok 1215 setattr(self, item, getattr(self.EntropiaUI, item)) 1216 for item in ['gpf','pdbqs','dpf','pdbq']: 1217 self.updateLCS(item) 1218 #CHECK here for previous work done in adt: 1219 self.checkPrevious() 1220 else: 1221 t='Unknown queueType: '+self.qT 1222 self.vf.warningMsg(t) 1223 return 1224 self.getCmd()
1225
1226 - def getProjectVal(self, val, event=None):
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
1235 - def getHostVal(self, val, event=None):
1236 #autostarter 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
1271 - def setParmFileVal(self, pF):
1272 self.ParmFile=pF 1273 self.paramFile.set(pF) 1274 ##llist = string.split(pF,'.') 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
1287 - def buildMacroMenu(self, event=None):
1288 macroMb=self.ifd.entryByName['mNMenu']['widget'] 1289 macroMb.config(text='macros') 1290 if not self.showMacroMenu.get(): 1291 #hostList is ['noah','saul','job'] 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
1300 - def buildHostMenu(self, event=None):
1301 hostMb=self.ifd.entryByName['hNMenu']['widget'] 1302 hostMb.config(text='hosts') 1303 if not self.showHostMenu.get(): 1304 #hostList is ['noah','saul','job'] 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
1312 - def updateProjectMenu(self, event=None):
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
1322 - def buildProjectMenu(self, event=None):
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
1338 - def buildMenu(self,keyList,mB, var, cmd):
1339 #start from scratch and build menu 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 #raise runTimeError('check this') 1347 #Pack all the entries: 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
1404 - def updateLF(self, event=None):
1405 #llist = string.split(self.paramFile.get(),'.') 1406 #self.logFile.set(llist[0]+'.'+self.logType) 1407 #self.LogFile=llist[0]+'.'+self.logType 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 #at this moment, make a jobFile if you can 1414 self.jobFile.set(self.makeJobFile(self.paramFile.get()))
1415 #self.getCmd() 1416
1417 - def browsePF(self, event=None):
1418 pf = self.vf.askFileOpen(parent = self.topLevel, 1419 types=[('select '+self.browserPFTitle,'*.'+self.pfType)], title= self.program +' Parameter File:') 1420 if pf: 1421 #don't strip off the pathname?? 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
1433 - def browseEX(self, event=None):
1434 ef = self.vf.askFileOpen(parent = self.topLevel, 1435 types=[('select program:','*')], title= self.program) 1436 if ef: 1437 #don't strip off the pathname?? 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
1448 - def browseLF(self, event=None):
1449 lf = self.vf.askFileOpen(parent = self.topLevel, 1450 types=[('select :','*.'+self.logType)], title= self.program+ ' log File:') 1451 if lf: 1452 #strip off the pathname?? 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
1462 - def setNiceLevel(self,val,event=None):
1463 self.niceLevel.set(str(val)) 1464 self.getCmd()
1465
1466 - def setNqeTime(self,val,event=None):
1467 self.nqeTime.set(str(val)) 1468 self.getCmd()
1469
1470 - def setNqeCpu(self,val,event=None):
1471 self.nqeCpu.set(str(val)) 1472 self.getCmd()
1473
1474 - def setHost(self, hostStr):
1475 self.Host=hostStr
1476
1477 - def setExe(self, exeStr):
1478 self.Exe=exeStr
1479
1480 - def setFlagStr(self, flagStr):
1481 self.FlagStr=flagStr
1482
1483 - def setParmFile(self, parmStr):
1484 self.ParmFile=parmStr
1485
1486 - def setLogFile(self, logStr):
1487 self.LogFile=logStr
1488
1489 - def setCommand(self):
1490 self.command=self.Exe + " " + self.FlagStr+ " " + self.ParmFile+ " " + self.LogFile
1491
1492 - def doIntRemoteCommand(self,pFile,host=None,nice=20,flagStr=' ',log=None):
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 #pFileStem=string.split(pFile,'.')[0] 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
1539 - def setNqeRemoteCommand(self,host,nice,exe,flagStr,pFile,log,nqeTime,ncpu):
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 #pFileStem=string.split(pFile,'.')[0] 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
1554 -class AutoGridStarter(AutoStarter):
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
1568 - def __init__(self):
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
1585 -class AutoDockStarter(AutoStarter):
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
1599 - def __init__(self):
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
1610 - def guiCallback(self, event=None):
1611 #AutoDock 1612 self.customizeGUI() 1613 if not hasattr(self, 'form'): 1614 if self.vf.hasGui: 1615 #self.form = self.vf.getUserInput(self.ifd,scrolledFrame=1,width=1000,height=350, modal=0, blocking=0) 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 ## from ViewerFramework.gui import InputForm 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 #self.bindEntries() 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 #FIX ME, i think this is ok, but i'm not sure 1667 #exec('self.'+item[:-5]+'.set(newsel)') 1668 setattr(self, item[:-5], newsel) 1669 self.getCmd()
1670 1671
1672 - def bindEntries(self):
1673 if hasattr(self,'form'): 1674 self.ifd.entryByName['cmdentry']['widget'].bind('<Return>', self.