~ubuntu-branches/ubuntu/trusty/autodocktools/trusty

1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1
#############################################################################
2
#
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
3
# Author: Ruth HUEY, Michel F. SANNER, Stefano FORLI
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
4
#
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
5
# Copyright: M. Sanner TSRI 2011
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
6
#
7
#############################################################################
8
9
1.1.9 by Thorsten Alteholz
Import upstream version 1.5.6~rc3~cvs.20120206
10
# $Header: /opt/cvs/python/packages/share1.5/AutoDockTools/autostartCommands.py,v 1.37.2.1 2011/11/15 22:24:00 forli Exp $
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
11
#
1.1.9 by Thorsten Alteholz
Import upstream version 1.5.6~rc3~cvs.20120206
12
# $Id: autostartCommands.py,v 1.37.2.1 2011/11/15 22:24:00 forli Exp $
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
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
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
30
import tkMessageBox, tkFileDialog
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
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:
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
102
            #if host != self.vf.ADstart_manage.localHost: ??? N3P
103
            if host == self.vf.ADstart_manage.localHost:
104
                cmdStr="kill -9 %s"%pid
105
                #print "EXECUTING 1", cmdStr
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
106
            else:
107
                cmdStr="ssh " + host+ " -n \'kill -9 %s\'"%pid
108
            commands.getoutput(cmdStr)
109
        hosts = self.hosts
110
        self.do_update(self.psList, hosts)
111
112
113
    def updateHosts(self, hostList):
114
        self.hosts=hostList
115
116
117
    def do_update(self, psList=['autodock'], hosts=None):
118
        if not hosts: return
119
        self.hosts=hosts
120
        self.psList = psList
121
        format = self.format_list[self.format.get()][1]
122
        view = self.view_list[self.view.get()][1]
123
        self.frame.list.delete(0,Tkinter.AtEnd())
124
        self.done=1
125
        for item in self.hosts:
126
            if item == self.vf.ADstart_manage.localHost:
127
                cmdStr="ps %s %s"%(view,format)
128
            else:
129
                cmdStr="ssh " + item+ " -n \'ps %s %s\'"%(view,format)
130
            p=commands.getoutput(cmdStr)
131
            if p:
132
                list = string.splitfields(p,'\n')
133
                del list[0]
134
                for line in list:
135
                    for ps in psList:
136
                        if string.find(line, ps)>-1:
137
                            #check here that the line has ps: autodock/autogrid 
138
                            line = line + ' ' + item
139
                            self.frame.list.insert(0,line)
140
                            self.done=0
141
            else:
142
                self.hosts.remove(item)
143
        return(self.hosts)
144
145
146
    def quit(self, event=None):
147
        self.master.withdraw()
148
149
150
151
class ADProcessManager(MVCommand):
152
153
    def onAddCmdToViewer(self):
154
        if not self.vf.hasGui:
155
            self.root = Tkinter.Tk()
156
            self.root.withdraw()
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
157
            root = self.root
158
        else:
159
            root = self.vf.GUI.ROOT
160
        self.hostVal=Tkinter.IntVar(master=root)
161
        self.macroVal=Tkinter.IntVar(master=root)
162
        self.top = Tkinter.Toplevel(master=root)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
163
        self.top.withdraw()
164
        self.kill = ADKill(self.top)
165
        self.kill.vf = self.vf
166
167
    def __init__(self):
168
        MVCommand.__init__(self)
169
        self.localHost = socket.gethostname()
170
        self.invalid = 0
171
        import AutoDockTools
172
        self.hostDict = AutoDockTools.hostDict
173
        self.currentHosts=None
174
        self.psList=None
175
176
177
    def addHost(self, host):
178
        if not self.currentHosts: self.currentHosts=[]
179
        if not host in self.currentHosts:
180
            self.currentHosts.append(host)
181
182
    def addProcess(self, ps):
183
        if not self.psList: self.psList=[]
184
        if not ps in self.psList:
185
            self.psList.append(ps)
186
187
    def adUpdate(self):
188
        #currentHosts should be all hosts of all active jobs
189
        if not self.currentHosts: self.currentHosts=[]
190
        self.currentHosts = self.kill.do_update(self.psList,self.currentHosts)
191
        if self.kill.done:
192
            self.kill.master.withdraw()
193
        else:
194
            self.kill.after(100,self.adUpdate)
195
196
    def guiCallback(self, event=None):
197
        if not self.top.winfo_ismapped():
198
            self.top.deiconify()
199
        self.kill.after(100, self.adUpdate)
200
201
    def __call__(self, **kw):
202
        apply(self.doitWrapper, (), kw)
203
204
    def doit(self):
205
        #kill
206
        print 'killed'
207
208
ADProcessManagerGUI=CommandGUI()
209
ADProcessManagerGUI.addMenuCommand('AutoToolsBar', menuText['StartMB'], menuText['processManagerMB'])
210
211
212
213
class AutoStarter(MVCommand):
214
    """Base class for AutoGridStarter and AutoDockStarter, whose command structure is
215
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 """
216
217
218
    def onAddCmdToViewer(self):
219
        if self.vf.hasGui:
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
220
            self.hostVal=Tkinter.IntVar(master=self.vf.GUI.ROOT)
221
            self.macroVal=Tkinter.IntVar(master=self.vf.GUI.ROOT)
222
            self.projectVal=Tkinter.IntVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
223
224
225
    def __init__(self, program=None, dictObj=None,
226
            ifdTitle="Run BaseClass", 
227
            browserPFTitle="baseclassPF", browserEXETitle='baseClass',
228
            browserLOGTitle="baseLog", logType='.base',
229
            pfType='.bpf', programType=None):
230
231
        MVCommand.__init__(self)
232
        self.program=program
233
        self.programType=programType
234
        self.dictObj = dictObj
235
        self.ifdTitle=ifdTitle
236
        self.browserPFTitle=browserPFTitle
237
        self.browserEXETitle=browserEXETitle
238
        self.browserLOGTitle=browserLOGTitle
239
        self.logType=logType
240
        self.pfType=pfType
241
        self.qT='int'
242
        self.command=None
243
        self.RemoteCommand=None
244
        self.nqeJobFile=None
245
        self.Host=None
246
        self.Exe=None
247
        self.FlagStr=""
248
        self.ParmFile=None
249
        self.LogFile=None
250
        self.Nice=20
251
        #
252
        self.localHost = socket.gethostname()
253
        self.invalid=0
254
        import AutoDockTools
255
        self.hostDict=AutoDockTools.hostDict
256
257
258
        
259
    def guiCallback(self, event=None):
260
        #AutoStarter: dict is only self.vf.gpo since autodock is handled separately
261
        self.customizeGUI()
262
        if not hasattr(self, 'form'):
263
            if self.vf.hasGui:    
264
                #self.form = self.vf.getUserInput(self.ifd, scrolledFrame = 1, width = 1000, height = 300,modal=0, blocking=0)
265
                self.form = self.vf.getUserInput(self.ifd, modal=0,blocking=0)
266
                self.form.root.protocol('WM_DELETE_WINDOW',self.Close_cb)
267
                self.topLevel = self.form.root
268
            else:
269
                ##  from ViewerFramework.gui import InputForm
270
                from mglutil.gui.InputForm.Tk.gui import InputForm
271
                self.form = InputForm(self.vf.master,self.ifd,modal=0, blocking=0)
272
                self.form.root.protocol('WM_DELETE_WINDOW',self.Close_cb)
273
                self.topLevel = self.form.root
274
            if self.dictObj:
275
                self.dict=eval('self.vf.%s'%self.dictObj)
276
            if hasattr(self.vf, 'hasGui') and hasattr(self.vf, self.dictObj) and  len(self.dict.gpf_filename):    
277
                if self.paramFile.get()=='':
278
                    self.paramFile.set(self.dict.gpf_filename)
279
                    self.updateLF()
280
            #4/5 return seems better than leave
281
            entryItems= ['lFentry','eXentry','pFentry','nqeTimeEntry','nqeCpuEntry',\
282
                'pbsCpuEntry','pbsTimeEntry','pbsDirEntry','pbsWallTimeEntry',\
283
                'pbsCpuEntry', 'niceEntry']
284
            for item in entryItems:
285
                self.ifd.entryByName[item]['widget'].bind('<Return>', self.getCmd)
286
            self.ifd.entryByName['pFentry']['widget'].bind('<Return>', self.updateLF)
287
            self.ifd.entryByName['mNentry']['widget'].bind('<Return>', self.getMacro)
288
            self.ifd.entryByName['mNMenu']['widget'].bind('<ButtonPress>', self.buildMacroMenu, add='+')
289
            self.ifd.entryByName['hNentry']['widget'].bind('<Return>', self.getHost)
290
            self.intWids=['niceLab','niceEntry']
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
291
            if os.name == 'nt': #sys.platform=='win32':
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
292
                for item in self.intWids:
293
                    self.ifd.entryByName[item]['widget'].grid_forget()
294
                self.niceLevel.set('0')
295
            self.commonWids=['hNLab','hNentry','eXLab','eXentry','eXbutton',
296
                'pFLab','pFentry','pFbutton',
297
                'lFLab','lFentry','lFbutton']
298
            self.nqeWids=['nqeCpuLab','nqeCpuEntry','nqeTimeLab','nqeTimeEntry']
299
            self.pbsWids=['pbsCpuLab','pbsCpuEntry','pbsDirLab','pbsDirEntry','pbsTimeLab','pbsTimeEntry','pbsWallTimeLab','pbsWallTimeEntry','pbsRerunCB']
300
            self.entWids=['pjLab','pjentry','pjMenu','nodesEntLab',
301
            'nodesEnt', 'gpfEntLab', 'gpfEnt','pdbqsEntLab','pdbqsEnt',
302
            'dpfEntLab','dpfEnt', 'pdbqEntLab','pdbqEnt',
303
            'jobDirEntLab','jobDirEnt', 'gpfFilterEnt', 'pdbqsFilterEnt',
304
            'dpfFilterEnt','pdbqFilterEnt']
305
            self.entWidLCS=['gpfFiles','pdbqsFiles','dpfFiles','pdbqFiles']
306
            self.entButs=[ 'uploadGpfFileBut','uploadPdbqFileBut',
307
                'uploadDpfFileBut','uploadPdbqsFileBut', 'monitorCB',
308
                'ftpBackCB']
309
            self.getMacroVal(0)
310
            self.flagWids=[]
311
            self.form.autoSize()
312
313
314
    def updateLCS(self, key, event=None):
315
        if not entropiaPresent: return
316
        keyList= ['gpf','pdbqs','dpf','pdbq']
317
        itemList= ['gpfFiles','pdbqsFiles','dpfFiles','pdbqFiles']
318
        fileList=[self.EntropiaUI.gpf_list,self.EntropiaUI.pdbqs_list,self.EntropiaUI.dpf_list,self.EntropiaUI.pdbq_list]
319
        #compile the re items if any
320
        reList=[]
321
        for filterStr in [self.gpfFilter.get(),self.pdbqsFilter.get(),self.dpfFilter.get(), self.pdbqFilter.get()]:
322
            reList.append(re.compile(filterStr))
323
        if key:
324
            ind=keyList.index(key)
325
            item=itemList[ind]
326
            files=fileList[ind]
327
            reitem=reList[ind]
328
            lb=self.ifd.entryByName[item]['widget'].lb
329
            lb.delete(0,'end')
330
            for f in files:
331
                match=reitem.match(f)
332
                if match!=None:
333
                    lb.insert(lb.index('end'),match.string)
334
                #lb.insert(lb.index('end'),f)
335
        else:
336
            for i in range(4):
337
                #'gpfFiles','pdbqsFiles','dpfFiles','pdbqFiles'
338
                item=itemList[i]
339
                files=fileList[i]
340
                reitem=reList[i]
341
                lb=self.ifd.entryByName[item]['widget'].lb
342
                lb.delete(0,'end')
343
                for f in files:
344
                    match=reitem.match(f)
345
                    if match!=None:
346
                        lb.insert(lb.index('end'), match.string)
347
 
348
349
    def uploadFiles(self,key, event=None):
350
        if not entropiaPresent: return
351
        titleStr='Upload '+key+' file:'
352
        newfile=self.vf.askFileOpen(types=[(key,'*'+key)], title=titleStr)
353
        if newfile:
354
            try:
355
                self.EntropiaUI.upload(newfile)
356
            except EntropiaError, msg:
357
                self.vf.warningMsg(msg)
358
                return
359
            self.updateLCS(key[1:])
360
361
    def setFile(self,item,event=None):
362
        pass
363
        
364
    def customizeGUI(self):
365
        #AutoStarter
366
        if not hasattr(self, 'ifd'):
367
            #for the moment:
368
            self.gpf_list=[]
369
            self.dpf_list=[]
370
            self.pdbq_list=[]
371
            self.pdbqs_list=[]
372
373
            #self.gpfFileList=['h2.gpf','hpi1s.gpf']
374
            #self.dpfFileList=['h2.dpf','hpi1s.dpf']
375
            #self.pdbqFileList=['h2.out.pdbq','hpi1s.out.pdbq']
376
            #self.pdbqsFileList=['1crn.pdbqs','1hvr.pdbqs']
377
            ifd=self.ifd=InputFormDescr(title=self.ifdTitle)
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
378
            self.execPath = Tkinter.StringVar(master=self.vf.GUI.ROOT)
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
379
            self.workingDirPath = Tkinter.StringVar(master=self.vf.GUI.ROOT, value = os.getcwd() ) # N3P
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
380
            self.queueType = Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
381
            self.queueType.set('int')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
382
            self.jobFile = Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
383
            self.jobFile.set('')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
384
            self.paramFile = Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
385
            self.paramFile.set('')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
386
            self.niceLevel=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
387
            self.niceLevel.set('20')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
388
            self.nqeTime=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
389
            self.nqeTime.set('144000')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
390
            self.nqeCpu=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
391
            self.nqeCpu.set('1')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
392
            self.pbsCpu=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
393
            self.pbsCpu.set('1')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
394
            self.pbsCpuTime=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
395
            self.pbsCpuTime.set('24:00:00')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
396
            self.pbsWallTime=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
397
            self.pbsWallTime.set('24:30:00')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
398
            self.pbsRerun=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
399
            self.pbsRerun.set('y')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
400
            self.logFile = Tkinter.StringVar(master=self.vf.GUI.ROOT)
401
            self.cmd = Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
402
            self.setUpFlagVars()
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
403
            self.pidStr = Tkinter.StringVar(master=self.vf.GUI.ROOT)
404
            self.macroName = Tkinter.StringVar(master=self.vf.GUI.ROOT)
405
            self.hostName = Tkinter.StringVar(master=self.vf.GUI.ROOT)
406
            self.remoteDir = Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
407
            try:
408
                usr = os.environ['USER']
409
                self.remoteDir.set('/usr/people/'+usr)
410
            except:
411
                self.remoteDir.set('./')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
412
            self.showMacroMenu = Tkinter.IntVar(master=self.vf.GUI.ROOT)
413
            self.showHostMenu = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
414
            #the tkinter variables for the entropia stuff
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
415
            self.projectName=Tkinter.StringVar(master=self.vf.GUI.ROOT)
416
            self.gpf=Tkinter.StringVar(master=self.vf.GUI.ROOT)
417
            self.dpf=Tkinter.StringVar(master=self.vf.GUI.ROOT)
418
            self.pdbq=Tkinter.StringVar(master=self.vf.GUI.ROOT)
419
            self.pdbqs=Tkinter.StringVar(master=self.vf.GUI.ROOT)
420
            self.jobDir=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
421
            if entropiaPresent:
422
                self.jobDir.set(entropia_job_dir + 'job_id')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
423
            self.nodes=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
424
            self.nodes.set('1')
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
425
            self.gpfFilter=Tkinter.StringVar(master=self.vf.GUI.ROOT)
426
            self.pdbqsFilter=Tkinter.StringVar(master=self.vf.GUI.ROOT)
427
            self.dpfFilter=Tkinter.StringVar(master=self.vf.GUI.ROOT)
428
            self.pdbqFilter=Tkinter.StringVar(master=self.vf.GUI.ROOT)
429
            self.monitorVar=Tkinter.IntVar(master=self.vf.GUI.ROOT)
430
            self.ftpBackVar=Tkinter.IntVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
431
            ifd.append( {'name': 'mNLab',
432
                'widgetType': Tkinter.Label,
433
                'text': 'Macro Name:',
434
                'gridcfg':{'sticky':Tkinter.E}})
435
            ifd.append( {'name': 'mNentry',
436
                'widgetType':Tkinter.Entry,
437
                'wcfg':{
438
                    'width':25,
439
                    'textvariable': self.macroName,},
440
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
441
            ifd.append( {'name': 'mNMenu',
442
                'widgetType':Tkinter.Menubutton,
443
                'text': 'macros',
444
                'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':2}})
445
            ifd.append( {'name': 'hNLab',
446
                'widgetType': Tkinter.Label,
447
                'text': 'Host Name:',
448
                'gridcfg':{'sticky':Tkinter.E}})
449
            ifd.append( {'name': 'hNentry',
450
                'widgetType':Tkinter.Entry,
451
                'wcfg':{
452
                    'width':25,
453
                    'textvariable': self.hostName,
454
                },
455
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
456
457
458
            # here you define the working directory
459
            # N3P trace
460
            ifd.append( {'name': 'wDLab',
461
                'widgetType': Tkinter.Label,
462
                'text': 'Working Directory:',
463
                'gridcfg':{'sticky':Tkinter.E}})
464
            ifd.append( {'name': 'wDentry',
465
                'widgetType':Tkinter.Label,
466
                'wcfg':{
467
                    'width':65,
468
                    'justify':Tkinter.LEFT,
469
                    'textvariable': self.workingDirPath,
470
                },
471
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
472
            ifd.append({'name': 'wDbutton',
473
                'widgetType': Tkinter.Button,
474
                'text':'Browse',
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
475
                'wcfg':{'bd':2},
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
476
                'command':self.browseWD,
477
                'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':13}})
478
479
            # # # # #  N3P trace
480
481
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
482
            ifd.append( {'name': 'eXLab',
483
                'widgetType': Tkinter.Label,
484
                'text': 'Program Pathname:',
485
                'gridcfg':{'sticky':Tkinter.E}})
486
            ifd.append( {'name': 'eXentry',
487
                'widgetType':Tkinter.Entry,
488
                'wcfg':{
489
                    'width':65,
490
                    'textvariable': self.execPath,
491
                },
492
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
493
            ifd.append({'name': 'eXbutton',
494
                'widgetType': Tkinter.Button,
495
                'text':'Browse',
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
496
                'wcfg':{'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
497
                'command':self.browseEX,
498
                'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':13}})
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
499
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
500
            ifd.append( {'name': 'pFLab',
501
                'widgetType': Tkinter.Label,
502
                'text': 'Parameter Filename:',
503
                'gridcfg':{'sticky':Tkinter.E}})
504
            ifd.append( {'name': 'pFentry',
505
                'widgetType':Tkinter.Entry,
506
                'wcfg':{
507
                    'width':65,
508
                    'textvariable': self.paramFile,
509
                },
510
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
511
            ifd.append({'name': 'pFbutton',
512
                'widgetType': Tkinter.Button,
513
                'text':'Browse',
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
514
                'wcfg':{'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
515
                'command':self.browsePF,
516
                'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':13}})
517
            ifd.append( {'name': 'lFLab',
518
                'widgetType': Tkinter.Label,
519
                'text': 'Log Filename:',
520
                'gridcfg':{'sticky':Tkinter.E}})
521
            ifd.append( {'name': 'lFentry',
522
                'widgetType':Tkinter.Entry,
523
                'wcfg':{
524
                    'width':65,
525
                    'textvariable': self.logFile,
526
                },
527
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
528
            ifd.append({'name': 'lFbutton',
529
                'widgetType': Tkinter.Button,
530
                'text':'Browse',
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
531
                'wcfg':{'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
532
                'command':self.browseLF,
533
                'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':13}})
534
            self.getFlags()
535
            ifd.append({'name':'niceLab',
536
                'widgetType':Tkinter.Label,
537
                'text': 'Nice Level:',
538
                'gridcfg':{'sticky':Tkinter.E}})
539
            ifd.append( {'name': 'niceEntry',
540
                'widgetType':Tkinter.Entry,
541
                'wcfg':{
542
                    'width':25,
543
                    'textvariable': self.niceLevel,
544
                },
545
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
546
            ifd.append({'name':'pbsDirLab',
547
                'widgetType':Tkinter.Label,
548
                'text': 'PBS: Remote Directory:',
549
                'gridcfg':{'sticky':Tkinter.E}})
550
            ifd.append( {'name': 'pbsDirEntry',
551
                'widgetType':Tkinter.Entry,
552
                'wcfg':{
553
                    'width':65,
554
                    'textvariable': self.remoteDir,
555
                },
556
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1, 'columnspan':12}})
557
            ifd.append({'name':'nqeTimeLab',
558
                'widgetType':Tkinter.Label,
559
                'text': 'NQE: Time Limit:',
560
                'gridcfg':{'sticky':Tkinter.E}})
561
            ifd.append( {'name': 'nqeTimeEntry',
562
                'widgetType':Tkinter.Entry,
563
                'wcfg':{
564
                    'width':25,
565
                    'textvariable': self.nqeTime,
566
                },
567
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
568
            ifd.append({'name':'pbsTimeLab',
569
                'widgetType':Tkinter.Label,
570
                'text': 'PBS: CpuTime Limit:',
571
                'gridcfg':{'sticky':Tkinter.E}})
572
            ifd.append( {'name': 'pbsTimeEntry',
573
                'widgetType':Tkinter.Entry,
574
                'wcfg':{
575
                    'width':25,
576
                    'textvariable': self.pbsCpuTime,
577
                },
578
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
579
            ifd.append({'name':'pbsWallTimeLab',
580
                'widgetType':Tkinter.Label,
581
                'text': 'PBS: WallTime Limit:',
582
                'gridcfg':{'sticky':Tkinter.E}})
583
            ifd.append( {'name': 'pbsWallTimeEntry',
584
                'widgetType':Tkinter.Entry,
585
                'wcfg':{
586
                    'width':25,
587
                    'textvariable': self.pbsWallTime,
588
                },
589
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
590
            ifd.append({'name':'pbsRerunCB',
591
                'widgetType':Tkinter.Checkbutton,
592
                'text': 'PBS: Rerun on System Crash',
593
                'onvalue':'y',
594
                'offvalue':'n',
595
                'variable':self.pbsRerun,
596
                'command': self.getCmd,
597
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'columnspan':2}})
598
            ifd.append({'name':'pbsCpuLab',
599
                'widgetType':Tkinter.Label,
600
                'text': 'PBS: Number of Processors:',
601
                'gridcfg':{'sticky':Tkinter.E}})
602
            ifd.append( {'name': 'pbsCpuEntry',
603
                'widgetType':Tkinter.Entry,
604
                'wcfg':{
605
                    'width':25,
606
                    'textvariable': self.pbsCpu,
607
                },
608
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
609
            ifd.append({'name':'nqeCpuLab',
610
                'widgetType':Tkinter.Label,
611
                'text': 'NQE: Number of Processors:',
612
                'gridcfg':{'sticky':Tkinter.E}})
613
            ifd.append( {'name': 'nqeCpuEntry',
614
                'widgetType':Tkinter.Entry,
615
                'wcfg':{
616
                    'width':25,
617
                    'textvariable': self.nqeCpu,
618
                },
619
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
620
            #next the widgets for entropia widgets:
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
621
            self.showProjectMenu = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
622
            ifd.append( {'name': 'pjLab',
623
                'widgetType': Tkinter.Label,
624
                'text': 'project:',
625
                'gridcfg':{'sticky':Tkinter.E}})
626
            ifd.append( {'name': 'pjentry',
627
                'widgetType':Tkinter.Entry,
628
                'wcfg':{
629
                    'width':25,
630
                    'textvariable': self.projectName,
631
                },
632
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
633
            ifd.append( {'name': 'pjMenu',
634
                'widgetType':Tkinter.Menubutton,
635
                'text': 'projects',
636
                'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':2}})
637
            ifd.append({'name':'nodesEntLab',
638
                'widgetType':Tkinter.Label,
639
                'text': 'number of nodes',
640
                'gridcfg':{'sticky':Tkinter.E}})
641
            ifd.append( {'name': 'nodesEnt',
642
                'widgetType':Tkinter.Entry,
643
                'wcfg':{
644
                    'width':25,
645
                    'textvariable': self.nodes,
646
                },
647
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
648
            ifd.append({'name':'gpfEntLab',
649
                'widgetType':Tkinter.Label,
650
                'text': 'gpf file',
651
                'gridcfg':{'sticky':Tkinter.E}})
652
            ifd.append( {'name': 'gpfEnt',
653
                'widgetType':Tkinter.Entry,
654
                'wcfg':{
655
                    'width':25,
656
                    'textvariable': self.gpf,
657
                },
658
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
659
            ifd.append({'name':'pdbqsEntLab',
660
                'widgetType':Tkinter.Label,
661
                'text': 'pdbqs file',
662
                'gridcfg':{'sticky':Tkinter.E}})
663
            ifd.append( {'name': 'pdbqsEnt',
664
                'widgetType':Tkinter.Entry,
665
                'wcfg':{
666
                    'width':25,
667
                    'textvariable': self.pdbqs,
668
                },
669
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
670
            ifd.append({'name':'dpfEntLab',
671
                'widgetType':Tkinter.Label,
672
                'text': 'dpf file',
673
                'gridcfg':{'sticky':Tkinter.E}})
674
            ifd.append( {'name': 'dpfEnt',
675
                'widgetType':Tkinter.Entry,
676
                'wcfg':{
677
                    'width':25,
678
                    'textvariable': self.dpf,
679
                },
680
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
681
            ifd.append({'name':'pdbqEntLab',
682
                'widgetType':Tkinter.Label,
683
                'text': 'pdbq file',
684
                'gridcfg':{'sticky':Tkinter.E}})
685
            ifd.append( {'name': 'pdbqEnt',
686
                'widgetType':Tkinter.Entry,
687
                'wcfg':{
688
                    'width':25,
689
                    'textvariable': self.pdbq,
690
                },
691
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
692
            ifd.append( {'name': 'monitorCB',
693
                'widgetType':Tkinter.Checkbutton,
694
                'text': 'Monitor job',
695
                'variable': self.monitorVar,
696
                'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':2}})
697
            ifd.append({'name':'jobDirEntLab',
698
                'widgetType':Tkinter.Label,
699
                'text': 'job directory',
700
                'gridcfg':{'sticky':Tkinter.E}})
701
            ifd.append( {'name': 'jobDirEnt',
702
                'widgetType':Tkinter.Entry,
703
                'wcfg':{
704
                    'width':25,
705
                    'textvariable': self.jobDir,
706
                },
707
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
708
            ifd.append( {'name': 'ftpBackCB',
709
                'widgetType':Tkinter.Checkbutton,
710
                'text': 'FTP back',
711
                'variable': self.ftpBackVar,
712
                'gridcfg':{'sticky':Tkinter.W,'row':-1, 'column':2}})
713
            ifd.append( {'name': 'cmdentry',
714
                'widgetType':Tkinter.Entry,
715
                'wcfg':{
716
                    'width':90,
717
                    'label': 'Cmd :',
718
                    'textvariable': self.cmd,
719
                },
720
                'gridcfg':{'sticky':Tkinter.W+Tkinter.E ,'columnspan':15}})
721
            ifd.append({'widgetType': Tkinter.Button,
722
                'text':'Launch',
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
723
                'wcfg':{'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
724
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'columnspan':3},
725
                'command':self.callDoit_cb})
726
            ifd.append({'widgetType': Tkinter.Button,
727
                'text':'Cancel',
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
728
                'wcfg':{'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
729
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'row':-1,'column':3,'columnspan':2},
730
                'command':self.Close_cb})
731
            #last the widgets for the Entropia lists:
732
            #ifd.append({'name':'gpfFilterLab',
733
                #'widgetType':Tkinter.Label,
734
                #'text': 'gpf file filter',
735
                #'gridcfg':{'sticky':Tkinter.E}})
736
            ifd.append({'name': 'gpfFilterEnt',
737
                'widgetType':Tkinter.Entry,
738
                'wcfg':{
739
                    'width':25,
740
                    'textvariable': self.gpfFilter,
741
                },
742
                'gridcfg':{'sticky':Tkinter.E}})
743
            #ifd.append({'name':'pdbqsFilterLab',
744
                #'widgetType':Tkinter.Label,
745
                #'text': 'pdbqs file filter',
746
                #'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':4}})
747
            ifd.append( {'name': 'pdbqsFilterEnt',
748
                'widgetType':Tkinter.Entry,
749
                'wcfg':{
750
                    'width':25,
751
                    'textvariable': self.pdbqsFilter,
752
                },
753
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
754
            #ifd.append({'name':'dpfFilterLab',
755
                #'widgetType':Tkinter.Label,
756
                #'text': 'dpf file filter',
757
                #'gridcfg':{'sticky':Tkinter.E}})
758
            ifd.append( {'name': 'dpfFilterEnt',
759
                'widgetType':Tkinter.Entry,
760
                'wcfg':{
761
                    'width':25,
762
                    'textvariable': self.dpfFilter,
763
                },
764
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':2}})
765
            #ifd.append({'name':'pdbqFilterLab',
766
                #'widgetType':Tkinter.Label,
767
                #'text': 'pdbq file filter',
768
                #'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':6}})
769
            ifd.append( {'name': 'pdbqFilterEnt',
770
                'widgetType':Tkinter.Entry,
771
                'wcfg':{
772
                    'width':25,
773
                    'textvariable': self.pdbqFilter,
774
                },
775
                'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':3}})
776
            ifd.append({'widgetType':'ListChooser',
777
                'name':'gpfFiles',
778
                'entries':self.gpf_list,
779
                'mode':'single',
780
                'title':'Select gpf file',
781
                'lbwcfg':{'height':5,'selectforeground':'red','exportselection':0},
782
                'command':CallBackFunction(self.setFile,'gpfFiles'),
783
                'gridcfg':{'sticky':'w','rowspan':5}})
784
            ifd.append({'widgetType':'ListChooser',
785
                'name':'pdbqsFiles',
786
                'entries':self.pdbqs_list,
787
                'mode':'single',
788
                'lbwcfg':{'height':5, 'selectforeground':'red','exportselection':0},
789
                'command':CallBackFunction(self.setFile,'pdbqsFiles'),
790
                'title':'Select pdbqs file',
791
                'gridcfg':{'sticky':'w','column':1,'row':-5,
792
                'rowspan':5}})
793
            ifd.append({'widgetType':'ListChooser',
794
                'name':'dpfFiles',
795
                'entries':self.dpf_list,
796
                'title':'Select dpf file',
797
                'mode':'single',
798
                'lbwcfg':{'height':5, 'selectforeground':'red','exportselection':0},
799
                'command':CallBackFunction(self.setFile,'dpfFiles'),
800
                'gridcfg':{'sticky':'w','column':2,'row':-9,
801
                'rowspan':5}})
802
            ifd.append({'widgetType':'ListChooser',
803
                'name':'pdbqFiles',
804
                'entries':self.pdbq_list,
805
                'title':'Select pdbq file',
806
                'mode':'single',
807
                'command':CallBackFunction(self.setFile,'pdbqFiles'),
808
                'lbwcfg':{'height':5, 'selectforeground':'red','exportselection':0},
809
                'gridcfg':{'sticky':'w','column':3,'row':-13,
810
                'rowspan':5}})
811
            ifd.append({'name':'uploadGpfFileBut',
812
                'widgetType':Tkinter.Button,
813
                'text': 'Upload gpf File',
814
                'command': CallBackFunction(self.uploadFiles,'.gpf'),
815
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W}})
816
            ifd.append({'name':'uploadPdbqsFileBut',
817
                'widgetType':Tkinter.Button,
818
                'text': 'Upload pdbqs File',
819
                'command': CallBackFunction(self.uploadFiles,'.pdbqs'),
820
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'column':1, 'row':-1}})
821
            ifd.append({'name':'uploadDpfFileBut',
822
                'widgetType':Tkinter.Button,
823
                'text': 'Upload dpf File',
824
                'command': CallBackFunction(self.uploadFiles,'.dpf'),
825
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'column':2, 'row':-1}})
826
            ifd.append({'name':'uploadPdbqFileBut',
827
                'widgetType':Tkinter.Button,
828
                'text': 'Upload pdbq File',
829
                'command': CallBackFunction(self.uploadFiles,'.pdbq'),
830
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'column':3, 'row':-1}})
831
        else:
832
            if hasattr(self, 'form') and self.form!=None:
833
                self.form.deiconify()
834
                self.form.autoSize()
835
        
836
    
837
    def Close_cb(self, event=None):
838
        self.form.root.withdraw()
839
840
    def callDoit_cb(self, event = None):
841
        self.doitWrapper(self.cmd.get(),log=1,redraw=0)
842
843
    def setUpFlagVars(self):
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
844
        self.flagVar = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
845
        self.flagVar.set(0)
846
847
    def getFlags(self):
848
        pass
849
850
    def __call__(self, cmd, ask=1, **kw):
851
        kw['ask']=ask
852
        apply(self.doitWrapper, (cmd,), kw)
853
854
855
    def doit(self, cmd, ask=1):
856
        "AutoStarter:"
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
857
858
        curdir=self.workingDirPath.get() # N3P
859
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
860
        if string.find(curdir, 'tmp_mnt')>=0:
861
            curdir=curdir[8:]
862
        if self.vf.hasGui:
863
            self.qT=self.queueType.get()
864
            self.Host=self.hostName.get()
865
            self.nqeJobFile=self.jobFile.get()
866
            self.pF=self.paramFile.get()
867
        if self.qT=='int':
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
868
            if os.name == 'nt': #sys.platform=='win32':
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
869
                #need to remove the & and flip the backslashes...
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
870
                # #cmd=string.replace(cmd,'/','\\')  # N3P use os.path.normpath!
871
                cmd = os.path.normpath(cmd)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
872
                afterID = None
873
                if cmd[-1]=='&':
874
                    cmd=cmd[:-1]
875
                cmd = cmd.split(' -p ')
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
876
                logfile_user = None
877
                parfile_user = None
878
                bin_name = None
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
879
                if len(cmd) > 1:
880
                    cmd[1] = cmd[1].split('-l')
881
                    if len(cmd[1]) > 1:
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
882
                        #print "[DPF] cmd[1][0]", cmd[1][0]
883
884
                        # dpf name parsed and quote-protected here
885
                        cmd[1][0] = "\"%s\"" % cmd[1][0].strip()
886
                        parfile_user = cmd[1][0]
887
888
                        # dlg name parsed and quote-protected here
889
                        cmd[1][1] = "\"%s\"" % cmd[1][1].strip()
890
                        logfile_user = cmd[1][1]
891
892
                        # Removed 2011/11 because it was harmful for the cmd[1][1]/output file
893
                        #if cmd[1][1] and self.vf.hasGui: 
894
                        #    afterID = self.vf.GUI.ROOT.after(500, self.saveLog, cmd[1][1])
895
896
                        cmd[1] = cmd[1][0]
897
898
                    # binary command
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
899
                    cmd[0] = cmd[0].strip()
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
900
                    if "autodock" in cmd[0]:
901
                        bin_name = "AutoDock"
902
                    elif "autogrid" in cmd[0]:
903
                        bin_name = "AutoGrid"
904
905
                    # parameter file check
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
906
                    if not cmd[1]:
907
                        if self.vf.hasGui:
908
                            tkMessageBox.showerror("Error!","Please specify parameter file.",
909
                                           parent=self.topLevel)
910
                        return
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
911
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
912
                    cmd = [cmd[0], '-p', cmd[1]]
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
913
                    #print "DPF>", parfile_user
914
                    if logfile_user:
915
                        cmd.append("-l")
916
                        cmd.append(("%s" % logfile_user ))
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
917
918
                # execute the command on Windows
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
919
                # by creating and executing a Windows batch file (.bat) # N3P
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
920
                
921
                # add the cd command to move into the working directory # N3P
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
922
                wd = os.path.normpath( self.workingDirPath.get() ) # normalize the path
923
                wd = os.path.expanduser(wd)                       # try to resolve "~" if present in the path
924
                filename = '%s\\adt_job.bat' % wd # batch filename
925
                drive = ""
926
927
                # important to manage jobs running on drives other than the current one (C:, D:, ....)
928
                if ":" in wd: drive = "%s:\n" % (wd.split(":")[0])
929
930
                # batch filename and its commands
931
                fp_job = open(filename, 'w')
932
                fp_job.write("@echo off\n")
933
                fp_job.write("echo.\n")
934
                if bin_name: fp_job.write("echo CALCULATION TYPE: %s\n" % bin_name)
935
                fp_job.write("echo WORKING PATH    : \"%s\"\n" % wd )
936
                fp_job.write("echo PARAMETER FILE  : %s\n" % parfile_user )
937
                fp_job.write("echo LOG FILE        : %s\n" % logfile_user )
938
                fp_job.write("echo.\n")
939
                fp_job.write("echo             [ ... running ...] \n" )
940
                
941
                wd_change = drive
942
                wd_change += "cd \"%s\"\n" % wd
943
                fp_job.write(wd_change)
944
                text_cmd = " ".join(cmd)
945
                fp_job.write(text_cmd+"\n")
946
                fp_job.close()
947
                #self.WinCmd = SysCmdInThread(cmd, shell=False)
948
                self.WinCmd = SysCmdInThread(filename, input=None, shell=False)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
949
                self.WinCmd.start()             
950
            else:
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
951
952
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
953
                bin = cmd.split()[0]
954
                if os.system("which "+bin) != 0:
955
                    if self.vf.hasGui:
956
                        tkMessageBox.showerror("Error!", bin + " not found. Please include "+bin+" in your path.",
957
                                           parent=self.topLevel)
958
                    return
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
959
                # execute the command on posix
960
                # add the cd command to move into the working directory # N3P
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
961
                wd = os.path.normpath( self.workingDirPath.get() ) # normalize the path
962
                wd = os.path.expanduser(wd)                        # try to resolve "~" if present in the path
963
                cmd = ("cd \"%s\" ; "+cmd ) % wd
1.1.9 by Thorsten Alteholz
Import upstream version 1.5.6~rc3~cvs.20120206
964
                print "WD>", wd
965
                print "cmd>", cmd
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
966
                #fp = open(wd+os.sep+"testing.sh", 'w')
967
                #fp.write(cmd)
968
                #fp.close()
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
969
                os.system(cmd)
970
                if ask:
971
                    self.vf.ADstart_manage.addHost(self.Host)
972
                    self.vf.ADstart_manage.addProcess(self.programType)
973
                    self.vf.ADstart_manage.guiCallback()
974
        elif self.qT=='nqe':
975
            if self.nqeJobFile == None:
976
                jobFile = self.makeJobFile(self.pF)
977
                if self.vf.hasGui:self.jobFile.set(jobFile)
978
            self.feedback = commands.getoutput(cmd)
979
            if ask and self.vf.hasGui:self.vf.warningMsg(self.feedback)
980
        elif self.qT=='pbs':
981
            t='PBS not yet implemented'
982
            self.vf.warningMsg(t)
983
            return 'ERROR'
984
            if self.nqeJobFile == None:
985
                jobFile = self.makeJobFile(self.pF)
986
                if self.vf.hasGui:self.jobFile.set(jobFile)
987
            print 'cmd'
988
            #self.feedback = commands.getoutput(cmd)
989
            #if ask and self.vf.hasGui:self.vf.warningMsg(self.feedback)
990
        elif self.qT=='ent' and entropiaPresent:
991
            print 'calling Entropia launch with ', cmd, self.projectName.get(), \
992
                'monitor_job=',self.monitorVar.get(),'ftp_back=',self.ftpBackVar.get()
993
            try:
994
                jobid=self.EntropiaUI.launch(cmd,self.projectName.get(),\
995
                    monitor_job=self.monitorVar.get(),ftp_back=self.ftpBackVar.get())
996
            except EntropiaError, msg:
997
                self.vf.warningMsg(msg)
998
                return 'ERROR'
999
            if jobid:
1000
                self.jobDir.set(entropia_job_dir+str(jobid))
1001
                msg='Entropia job started as:\n'+str(jobid)
1002
                self.vf.warningMsg(msg)
1003
        else:
1004
            msg ='unknown queuetype', self.qT
1005
            if ask and self.vf.hasGui: 
1006
                self.vf.warningMsg(msg)
1007
            return
1008
        if hasattr(self, 'form') and self.qT!='ent':self.form.root.withdraw()
1009
1010
    def saveLog(self, logPath):
1011
        """Checks the queue for results until we get one"""
1012
        if self.WinCmd.ok.configure()['state'][-1] == 'normal':
1013
            if not hasattr(self.WinCmd,'com'):
1014
                return
1015
            txt =self.WinCmd.stdoutTk.component('text').get(1.0,'end')
1016
            #txt = txt.split('\n')
1017
            ind = txt.find("\n")
1018
            txt = txt[ind+1:] #this should get rid of the first line
1019
            ind = txt.find("Successful Completion")
1020
            if not ind == -1:
1021
                ind1 = txt[:ind].rfind("\n")
1022
                ind2 = ind + txt[ind:].find("\n") + 1
1023
                if txt[ind1-5:ind1] == "____\n":
1024
                    ind1 = txt[:ind1-5].rfind("\n")
1025
                    ind2 = ind2+3 + txt[ind2+2:].find("\n")
1026
                tmp_txt = txt[:ind1]
1027
                tmp_txt += txt[ind2:]
1028
                txt = tmp_txt
1029
            f = open(logPath,'w')
1030
            f.write(txt)
1031
            f.close()
1032
            import winsound
1033
            winsound.MessageBeep()
1034
            return
1035
        self.vf.GUI.ROOT.after(300,self.saveLog, logPath)
1036
1037
    def makeJobFile(self, pFName):
1038
        """AutoStarter:"""
1039
        #NOT FINISHED:
1040
        #MUST PUT COPY OF JOB FILE ON REMOTE MACHINE!?!
1041
        if not pFName: return ''
1042
        if self.qT=='int': 
1043
            return ''
1044
        elif self.qT=='nqe':
1045
            curdir=os.getcwd()
1046
            if string.find(curdir, 'tmp_mnt')>=0:
1047
                curdir=curdir[8:]
1048
            dName = curdir
1049
        elif self.qT == 'pbs':
1050
            t='PBS not yet implemented'
1051
            self.vf.warningMsg(t)
1052
            return
1053
            curdir=os.getcwd()
1054
            dName = self.remoteDir.get()
1055
        else:
1056
            msg = 'unknown queuetype->' + self.qT
1057
            self.vf.warningMsg(msg)
1058
            return
1059
        msg='self.'+self.name+'.makeJobFile(' + pFName+')'
1060
        self.vf.log(msg)
1061
        pName = os.path.split(pFName)[-1]
1062
        pnum=string.rfind(pName, '.')
1063
        pStem =pName[:pnum]
1064
        jobFile = pStem + '.j'
1065
        fptr= open(jobFile, 'w')
1066
        if self.qT=='nqe':
1067
            jobStr='cd '+dName+";"+self.Exe+" -p "+pName+" -l "+self.LogFile+"\n"
1068
            fptr.write(jobStr)
1069
        else:
1070
            outstring = '#PBS -l nodes=' + self.pbsCpu.get()
1071
            fptr.write(outstring)
1072
            outstring = '#PBS -l walltime=' +self.pbsWallTime.get()
1073
            fptr.write(outstring)
1074
            #what is cput???
1075
            outstring = '#PBS -l cput=' +self.pbsTime.get()
1076
            fptr.write(outstring)
1077
            outstring = '#PBS -j oe'
1078
            fptr.write(outstring)
1079
            outstring = 'cd '+dName
1080
            #outstring = 'cd $PBSTMPDIR'
1081
            fptr.write(outstring)
1082
            #outstring = 'dmf get exec/autogrid.'
1083
            #fptr.write(outstring)
1084
            outstring = "./autogrid -p  "+pName+" -l "+self.LogFile+"\n"
1085
            fptr.write(outstring)
1086
            #copy the logfile and MAPS?? back to curdir??
1087
            outstring = "cp "+self.LogFile + ' ' +dName
1088
            fptr.write(outstring)
1089
            outstring = "exit"
1090
            fptr.write(outstring)
1091
        fptr.close()
1092
        os.chmod(jobFile, 0755)
1093
        return jobFile
1094
        
1095
    def getMacro(self, event=None):
1096
        return self.macroName.get()
1097
1098
    def getHost(self, event=None):
1099
        return self.hostName.get()
1100
1101
    def setHostVal(self, host):
1102
        #this triggers getting the rest of the cmd
1103
        self.hostName.set(host)
1104
        msg= 'self.setHostVal(' + host + ')'
1105
        self.vf.log(msg)
1106
        self.Exe=self.hostDict[host][self.programType]
1107
        self.execPath.set(self.Exe)
1108
        self.queueType.set(self.hostDict[host]['queuetype'])
1109
        self.getCmd()
1110
1111
    def setMacroVal(self, macro):
1112
        #this triggers getting the rest of the cmd
1113
        d=self.hostDict[macro]
1114
        self.hostName.set(d['host'])
1115
        msg= 'self.setMacroVal(' + macro + ')'
1116
        self.vf.log(msg)
1117
        self.Exe=d[self.programType]
1118
        self.execPath.set(self.Exe)
1119
        self.queueType.set(d['queuetype'])
1120
        self.getCmd()
1121
1122
    def getEntropiaUIObject(self):
1123
        if not entropiaPresent: return
1124
        idf = InputFormDescr("Entropia Password")
1125
        idf.append({'widgetType':Tkinter.Entry,
1126
                'name': 'password',
1127
                'label': 'Password',
1128
                'wcfg':{ 
1129
                    #'label': 'Password',
1130
                    'show': '*'
1131
                },
1132
                'defaultValue': '',
1133
                'gridcfg':{'sticky':Tkinter.E}
1134
              })
1135
        idf_dict = self.vf.getUserInput(idf)
1136
        if idf_dict:
1137
            password = idf_dict['password']
1138
            ##initialize EntropiaUI object
1139
            try:
1140
                self.EntropiaUI=EntropiaUI(password)
1141
                return 1 # true
1142
            except ftplib.error_perm,msg:
1143
                self.vf.warningMsg(msg)
1144
                return None
1145
        else: return None
1146
1147
    def checkPrevious(self):
1148
        if not entropiaPresent: return
1149
        files = {}
1150
        newAdtFile = 0
1151
        ifd=InputFormDescr(title='Process current adt files?')
1152
        ifd.append( {'name': 'thisLab',
1153
            'widgetType': Tkinter.Label,
1154
            'text': 'Upload newly created adt files:',
1155
            'gridcfg':{'sticky':Tkinter.E}})
1156
        if hasattr(self.vf, 'gpo') and len(self.vf.gpo.gpf_filename):
1157
            newAdtFile = 1
1158
            files['gpf']= self.vf.gpo.gpf_filename
1159
            ifd.append( {'name': 'gpfCBut',
1160
                'widgetType':Tkinter.Checkbutton,
1161
                'text':files['gpf'],
1162
                'gridcfg':{'sticky':Tkinter.W}})
1163
        if self.vf.atorsDict.has_key('outfile'):
1164
            newAdtFile = 1
1165
            files['pdbq']=os.path.split(self.vf.atorsDict['outfile'])[-1]
1166
            ifd.append( {'name': 'pdbqCBut',
1167
                'widgetType':Tkinter.Checkbutton,
1168
                'text':files['pdbq'],
1169
                'gridcfg':{'sticky':Tkinter.W}})
1170
        if hasattr(self.vf,'dpo') and len(self.vf.dpo.dpf_filename):
1171
            newAdtFile = 1
1172
            files['dpf'] = self.vf.dpo.dpf_filename
1173
            ifd.append( {'name': 'dpfCBut',
1174
                'widgetType':Tkinter.Checkbutton,
1175
                'text':files['dpf'],
1176
                'gridcfg':{'sticky':Tkinter.W}})
1177
        if hasattr(self.vf, 'gpo') and len(self.vf.gpo.receptor_filename):
1178
            newAdtFile = 1
1179
            files['pdbqs'] = self.vf.gpo.receptor_filename
1180
            ifd.append( {'name': 'pdbqsCBut',
1181
                'widgetType':Tkinter.Checkbutton,
1182
                'text':files['pdbqs'],
1183
                'gridcfg':{'sticky':Tkinter.W}})
1184
        elif hasattr(self.vf,'dpo') and len(self.vf.dpo.receptor_filename):
1185
            newAdtFile = 1
1186
            files['pdbqs'] = self.vf.dpo.receptor_filename
1187
            ifd.append( {'name': 'pdbqsCBut',
1188
                'widgetType':Tkinter.Checkbutton,
1189
                'text':files['pdbqs'],
1190
                'gridcfg':{'sticky':Tkinter.W}})
1191
        if not newAdtFile: return
1192
        val_dict = self.vf.getUserInput(ifd)
1193
        if val_dict:
1194
            for item in val_dict.keys():
1195
                if val_dict[item]:
1196
                    #upload this file
1197
                    itemName=item[:-4]
1198
                    try:
1199
                        print 'uploading ', files[itemName]
1200
                        self.EntropiaUI.upload(files[itemName])
1201
                    except EntropiaError, msg:
1202
                        self.vf.warningMsg(msg)
1203
                        return
1204
                    #this gets called with 'gpf' or 'pdbqs' etc
1205
                    print 'uploaded ', files[itemName]
1206
                    #select it in the listchooser
1207
                    self.updateLCS(itemName)
1208
                    #put it in the entry
1209
                    #FIX ME: I don't know if this is ok or not
1210
                    #because i don't know if self.itemName is a Tkinter var
1211
                    # or not ?????
1212
                    #setattr(self, itemName, files[itemName])
1213
                    exec('self.'+itemName+'.set(files[itemName])')
1214
                    #also highlightit in the listchooser
1215
                    itemWidget=itemName+'Files'
1216
                    lb = self.ifd.entryByName[itemWidget]['widget'].lb
1217
                    for i in range(lb.index('end')):
1218
                        if lb.get(i)==files[itemName]:
1219
                            lb.select_clear('end')
1220
                            lb.select_set(i)
1221
                            lb.see(i)
1222
            #update cmd
1223
            self.getCmd()
1224
1225
1226
    def getMacroVal(self, val, event=None):
1227
        #autostarter
1228
        macroList=self.hostDict.keys()
1229
        macro=macroList[val]
1230
        self.macroName.set(macro)
1231
        self.Host = self.hostDict[macro]['host']
1232
        #self.Host=host
1233
        self.hostName.set(self.Host)
1234
        self.Exe=self.hostDict[macro][self.programType]
1235
        self.execPath.set(self.Exe)
1236
        self.qT=self.hostDict[macro]['queuetype']
1237
        self.queueType.set(self.qT)
1238
        if self.qT=='int':
1239
            for item in self.intWids:
1240
                self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1241
            for item in self.commonWids:
1242
                self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1243
            for item in self.nqeWids:
1244
                self.ifd.entryByName[item]['widget'].grid_forget()
1245
            for item in self.pbsWids:
1246
                self.ifd.entryByName[item]['widget'].grid_forget()
1247
            for item in self.entWids:
1248
                self.ifd.entryByName[item]['widget'].grid_forget()
1249
            for item in self.entWidLCS:
1250
                self.ifd.entryByName[item]['widget'].top.grid_forget()
1251
            for item in self.entButs:
1252
                self.ifd.entryByName[item]['widget'].grid_forget()
1253
        elif self.qT=='nqe':
1254
            for item in self.commonWids:
1255
                self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1256
            for item in self.nqeWids:
1257
                self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1258
            for item in self.intWids:
1259
                self.ifd.entryByName[item]['widget'].grid_forget()
1260
            for item in self.pbsWids:
1261
                self.ifd.entryByName[item]['widget'].grid_forget()
1262
            for item in self.entWids:
1263
                self.ifd.entryByName[item]['widget'].grid_forget()
1264
            for item in self.entWidLCS:
1265
                self.ifd.entryByName[item]['widget'].top.grid_forget()
1266
            for item in self.entButs:
1267
                self.ifd.entryByName[item]['widget'].grid_forget()
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1268
            if os.name == 'nt': #sys.platform=='win32':
1269
                self.niceLevel.set('0')
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1270
        elif self.qT=='pbs':
1271
            for item in self.commonWids:
1272
                self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1273
            for item in self.pbsWids:
1274
                self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1275
            for item in self.intWids:
1276
                self.ifd.entryByName[item]['widget'].grid_forget()
1277
            for item in self.nqeWids:
1278
                self.ifd.entryByName[item]['widget'].grid_forget()
1279
            for item in self.entWids:
1280
                self.ifd.entryByName[item]['widget'].grid_forget()
1281
            for item in self.entWidLCS:
1282
                self.ifd.entryByName[item]['widget'].top.grid_forget()
1283
            for item in self.entButs:
1284
                self.ifd.entryByName[item]['widget'].grid_forget()
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1285
            if os.name == 'nt': #sys.platform=='win32':
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1286
                self.niceLevel.set('0')
1287
        elif self.qT=='ent' and entropiaPresent:
1288
            if not hasattr(self, 'EntropiaUI'):
1289
                if not self.getEntropiaUIObject(): return
1290
1291
            if self==self.vf.ADstart_autogrid:
1292
                msg='AutoGrid Jobs not defined separately for Entropia system'
1293
                self.vf.warningMsg(msg)
1294
                self.getMacroVal(0)
1295
                return
1296
            for item in self.entWids:
1297
                self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1298
            for item in self.entWidLCS:
1299
                self.ifd.entryByName[item]['widget'].top.grid(self.ifd.entryByName[item]['gridcfg'])
1300
            for item in self.entButs:
1301
                self.ifd.entryByName[item]['widget'].grid(self.ifd.entryByName[item]['gridcfg'])
1302
            for item in self.commonWids:
1303
                self.ifd.entryByName[item]['widget'].grid_forget()
1304
            for item in self.intWids:
1305
                self.ifd.entryByName[item]['widget'].grid_forget()
1306
            for item in self.flagWids:
1307
                self.ifd.entryByName[item]['widget'].grid_forget()
1308
            for item in self.nqeWids:
1309
                self.ifd.entryByName[item]['widget'].grid_forget()
1310
            for item in self.pbsWids:
1311
                self.ifd.entryByName[item]['widget'].grid_forget()
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1312
            if os.name == 'nt': #sys.platform=='win32':
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1313
                self.niceLevel.set('0')
1314
            # call local updateListChooser with new file_lists
1315
            for item in ['gpf_list','dpf_list','pdbq_list','pdbqs_list']:
1316
                #exec('self.'+item+'=self.EntropiaUI.'+item)
1317
                #these items are not Tkinter vars, so this is ok
1318
                setattr(self, item, getattr(self.EntropiaUI, item))
1319
            for item in ['gpf','pdbqs','dpf','pdbq']:
1320
                self.updateLCS(item)
1321
            #CHECK here for previous work done in adt:
1322
            self.checkPrevious()
1323
        else:
1324
            t='Unknown queueType: '+self.qT
1325
            self.vf.warningMsg(t)
1326
            return
1327
        self.getCmd()
1328
1329
    def getProjectVal(self, val, event=None):
1330
        if not entropiaPresent: return
1331
        try:
1332
            projectList=self.EntropiaUI.project_list
1333
        except AttributeError:
1334
            return
1335
        project=projectList[val]
1336
        self.projectName.set(project)
1337
1338
    def getHostVal(self, val, event=None):
1339
        #autostarter
1340
        hostList=self.hostDict.keys()
1341
        host=hostList[val]
1342
        self.Host=host
1343
        self.hostName.set(host)
1344
        self.Exe=self.hostDict[host][self.programType]
1345
        self.execPath.set(self.Exe)
1346
        self.qT=self.hostDict[host]['queuetype']
1347
        self.queueType.set(self.qT)
1348
        if self.queueType.get()=='int':
1349
            self.ifd.entryByName['niceLab']['widget'].grid(self.ifd.entryByName['niceLab']['gridcfg'])
1350
            self.ifd.entryByName['niceEntry']['widget'].grid(self.ifd.entryByName['niceEntry']['gridcfg'])
1351
            self.ifd.entryByName['nqeTimeLab']['widget'].grid_forget()
1352
            self.ifd.entryByName['nqeTimeEntry']['widget'].grid_forget()
1353
            self.ifd.entryByName['pbsDirLab']['widget'].grid_forget()
1354
            self.ifd.entryByName['pbsDirEntry']['widget'].grid_forget()
1355
            self.ifd.entryByName['nqeCpuLab']['widget'].grid_forget()
1356
            self.ifd.entryByName['nqeCpuEntry']['widget'].grid_forget()
1357
            self.ifd.entryByName['niceLab']['widget'].grid(self.ifd.entryByName['niceLab']['gridcfg'])
1358
            self.ifd.entryByName['niceEntry']['widget'].grid(self.ifd.entryByName['niceEntry']['gridcfg'])
1359
        else:
1360
            self.ifd.entryByName['nqeTimeLab']['widget'].grid(self.ifd.entryByName['nqeTimeLab']['gridcfg'])
1361
            self.ifd.entryByName['nqeTimeEntry']['widget'].grid(self.ifd.entryByName['nqeTimeEntry']['gridcfg'])
1362
            self.ifd.entryByName['pbsDirLab']['widget'].grid(self.ifd.entryByName['pbsDirLab']['gridcfg'])
1363
            self.ifd.entryByName['pbsDirEntry']['widget'].grid(self.ifd.entryByName['pbsDirEntry']['gridcfg'])
1364
            self.ifd.entryByName['nqeCpuLab']['widget'].grid(self.ifd.entryByName['nqeCpuLab']['gridcfg'])
1365
            self.ifd.entryByName['nqeCpuEntry']['widget'].grid(self.ifd.entryByName['nqeCpuEntry']['gridcfg'])
1366
            self.ifd.entryByName['niceLab']['widget'].grid_forget()
1367
            self.ifd.entryByName['niceEntry']['widget'].grid_forget()
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1368
            if os.name == 'nt': #sys.platform=='win32':
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1369
                self.ifd.entryByName['niceLab']['widget'].grid_forget()
1370
                self.ifd.entryByName['niceEntry']['widget'].grid_forget()
1371
                self.niceLevel.set('0')
1372
        self.getCmd()
1373
1374
    def setParmFileVal(self,  pF):
1375
        self.ParmFile=pF
1376
        self.paramFile.set(pF)
1377
        ##llist = string.split(pF,'.')    
1378
        lnum=string.rfind(pF, '.')
1379
        llist=pF[:lnum]
1380
        self.logFile.set(llist+'.'+self.logType)
1381
        self.LogFile=llist+'.'+self.logType
1382
        msg= 'self.setParmFileVal(' + pF + ')'
1383
        self.vf.log(msg)
1384
        host = self.hostName.get()
1385
        self.Exe=self.hostDict[host][self.programType]
1386
        self.execPath.set(self.Exe)
1387
        self.queueType.set(self.hostDict[host]['queuetype'])
1388
        self.getCmd()
1389
1390
    def buildMacroMenu(self, event=None):
1391
        macroMb=self.ifd.entryByName['mNMenu']['widget']
1392
        macroMb.config(text='macros')
1393
        if not self.showMacroMenu.get():
1394
            #hostList is ['noah','saul','job']
1395
            macroList = self.hostDict.keys()
1396
            self.buildMenu(macroList,macroMb,self.macroVal, self.getMacroVal)
1397
            self.showHostMenu.set(1)
1398
        else:
1399
            hostMenubutton.menu.unpost()
1400
            self.showHostMenu.set(0)
1401
        
1402
1403
    def buildHostMenu(self, event=None):
1404
        hostMb=self.ifd.entryByName['hNMenu']['widget']
1405
        hostMb.config(text='hosts')
1406
        if not self.showHostMenu.get():
1407
            #hostList is ['noah','saul','job']
1408
            hostList = self.hostDict.keys()
1409
            self.buildMenu(hostList,hostMb,self.hostVal, self.getHostVal)
1410
            self.showHostMenu.set(1)
1411
        else:
1412
            hostMenubutton.menu.unpost()
1413
            self.showHostMenu.set(0)
1414
        
1415
    def updateProjectMenu(self, event=None):
1416
        if not entropiaPresent: return
1417
        projectMb=self.ifd.entryByName['pjMenu']['widget']
1418
        projectMb.config(text='projects')
1419
        try:
1420
            projectList = self.EntropiaUI.project_list
1421
        except AttributeError: 
1422
            projectList=[]
1423
        self.buildMenu(projectList,projectMb,self.projectVal, self.getProjectVal)
1424
1425
    def buildProjectMenu(self, event=None):
1426
        if not entropiaPresent: return
1427
        projectMb=self.ifd.entryByName['pjMenu']['widget']
1428
        projectMb.config(text='projects')
1429
        if not self.showProjectMenu.get():
1430
            try:
1431
                projectList = self.EntropiaUI.project_list
1432
                print "projectList=", projectList
1433
            except AttributeError: 
1434
                projectList=[]
1435
            self.buildMenu(projectList,projectMb,self.projectVal, self.getProjectVal)
1436
            self.showProjectMenu.set(1)
1437
        else:
1438
            projectMb.menu.unpost()
1439
            self.showProjectMenu.set(0)
1440
        
1441
    def buildMenu(self,keyList,mB, var, cmd):
1442
        #start from scratch and build menu
1443
        mB.config(bg='white')
1444
        if not hasattr(mB, 'menu'):
1445
            mB.menu=Tkinter.Menu(mB)
1446
            mB['menu']=mB.menu
1447
        else:
1448
            mB.menu.delete(1, 'end')
1449
        #raise runTimeError('check this')
1450
        #Pack all the entries:
1451
        for i in range(len(keyList)):
1452
            mB.menu.add_radiobutton(label=keyList[i],
1453
            var=var,value=i,command=CallBackFunction(cmd,i))
1454
1455
    def getCmd(self, event=None):
1456
        "AutoStart:"
1457
        host = self.hostName.get()
1458
        exe = self.execPath.get()
1459
        cmd = self.cmd
1460
        pFile = self.paramFile.get()
1461
        logName = self.logFile.get()
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1462
        curdir = self.workingDirPath.get()
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1463
        remotedir = self.remoteDir.get()
1464
        niceStr=' '
1465
        if self.niceLevel.get()=='':
1466
            self.niceLevel.set('0')
1467
        if self.niceLevel.get()!='0':
1468
            niceStr = 'nice +'+self.niceLevel.get()+ ' '
1469
        if string.find(curdir, 'tmp_mnt')>=0:
1470
            curdir=curdir[8:]
1471
        jobFile = self.jobFile.get()
1472
        qT=self.queueType.get()
1473
        if jobFile=='' and pFile and (qT=='nqe' or qT=='pbs'):
1474
            self.jobFile.set(self.makeJobFile(pFile))
1475
            jobFile = self.jobFile.get()
1476
        if qT=='int':
1477
            if host==self.localHost:
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1478
                cmd_string = (exe + ' -p ' + pFile + ' -l ' + logName + '&') 
1479
                #cmd.set(("%s" + exe + ' -p ' + pFile + ' -l ' + logName + '&' % change_to_dir)) # 
1480
                cmd.set(cmd_string)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1481
            else:
1482
                cmdStr="rsh "+host+" -n "+"\'cd "+curdir+";"+ niceStr + exe+" -p "+pFile+" -l "+logName+"&\'&"
1483
                cmd.set(cmdStr)
1484
        elif qT=='nqe':
1485
            cmdStr = "rsh "+host+" -n \'cd "+curdir+";/nqe/bin/cqsub -lT "+self.nqeTime.get()+ " -la ncpu="+ self.nqeCpu.get()+" "+jobFile+"\'"
1486
            cmd.set(cmdStr)
1487
        elif qT=='win':
1488
            print 'in case queueType==win'
1489
            cmdStr = "rsh "+host+" -n \'cd "+curdir+";/nqe/bin/cqsub -lT "+self.nqeTime.get()+ " -la ncpu="+ self.nqeCpu.get()+" "+jobFile+"\'"
1490
            cmd.set(cmdStr)
1491
        elif qT=='pbs':
1492
            if remotedir=='':
1493
                msg = 'No REMOTE DIRECTORY specified!'
1494
                self.vf.warningMsg(msg)
1495
                return
1496
            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+"\'"
1497
            cmd.set(cmdStr)
1498
        elif qT=='ent':
1499
            msg='AutoGrid Jobs not defined separately for Entropia system'
1500
            self.vf.warningMsg(msg)
1501
            self.getMacroVal(0)
1502
            return
1503
        else:
1504
            msg = 'Unknown queueType->'+ qT
1505
            self.vf.warningMsg(msg)
1506
            return
1507
        
1508
1509
    def updateLF(self, event=None):
1510
        #llist = string.split(self.paramFile.get(),'.')    
1511
        #self.logFile.set(llist[0]+'.'+self.logType)
1512
        #self.LogFile=llist[0]+'.'+self.logType
1513
        pF=self.paramFile.get()
1514
        lnum=string.rfind(pF, '.')
1515
        llist=pF[:lnum]
1516
        self.logFile.set(llist+'.'+self.logType)
1517
        self.LogFile=llist+'.'+self.logType
1518
        #at this moment, make a jobFile if you can
1519
        self.jobFile.set(self.makeJobFile(self.paramFile.get()))
1520
        #self.getCmd()
1521
1522
    def browsePF(self, event=None):
1523
        pf = self.vf.askFileOpen(parent = self.topLevel,
1524
                                 types=[('select '+self.browserPFTitle,'*.'+self.pfType)], title= self.program +' Parameter File:')
1525
        if pf: 
1526
            #don't strip off the pathname??
1527
            pfList=os.path.split(pf)
1528
            if pfList[0]==os.getcwd():
1529
                pfname = os.path.split(pf)[-1]
1530
            else:
1531
                pfname=pf
1532
            self.paramFile.set(pfname)
1533
            self.ParmFile=pfname
1534
            self.updateLF()
1535
            self.getCmd()
1536
        if hasattr(self, 'topLevel'):self.topLevel.lift()
1537
1538
    def browseEX(self, event=None):
1539
        ef = self.vf.askFileOpen(parent = self.topLevel,
1540
                                 types=[('select program:','*')], title= self.program)
1541
        if ef: 
1542
            #don't strip off the pathname??
1543
            efList=os.path.split(ef)
1544
            if efList[0]==os.getcwd():
1545
                efname = os.path.split(ef)[-1]
1546
            else:
1547
                efname=ef
1548
            self.execPath.set(efname)
1549
            self.Exe=efname
1550
            self.getCmd()
1551
        if hasattr(self, 'topLevel'):self.topLevel.lift()
1552
1553
    def browseLF(self, event=None):
1554
        lf = self.vf.askFileOpen(parent = self.topLevel,
1555
                                 types=[('select :','*.'+self.logType)], title= self.program+ ' log File:')
1556
        if lf: 
1557
            #strip off the pathname??
1558
            lfList=os.path.split(lf)
1559
            if lfList[0]==os.getcwd():
1560
                lfname = os.path.split(lf)[-1]
1561
            else:
1562
                lfname=lf
1563
            self.logFile.set(lfname)
1564
            self.getCmd()
1565
        if hasattr(self, 'topLevel'):self.topLevel.lift()
1566
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1567
    def browseWD(self, event=None):
1568
        wd = tkFileDialog.askdirectory(parent = self.topLevel, title= self.program) # N3P
1569
        if wd: 
1570
            self.workingDirPath.set(wd)
1571
            """
1572
            efList=os.path.split(ef)
1573
            if efList[0]==os.getcwd():
1574
                efname = os.path.split(ef)[-1]
1575
            else:
1576
                efname=ef
1577
            self.execPath.set(efname)
1578
            self.Exe=efname
1579
            """
1580
            self.getCmd()
1581
        if hasattr(self, 'topLevel'):self.topLevel.lift()
1582
1583
1584
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1585
    def setNiceLevel(self,val,event=None):
1586
        self.niceLevel.set(str(val))
1587
        self.getCmd()
1588
1589
    def setNqeTime(self,val,event=None):
1590
        self.nqeTime.set(str(val))
1591
        self.getCmd()
1592
1593
    def setNqeCpu(self,val,event=None):
1594
        self.nqeCpu.set(str(val))
1595
        self.getCmd()
1596
1597
    def setHost(self, hostStr):
1598
        self.Host=hostStr
1599
    
1600
    def setExe(self, exeStr):
1601
        self.Exe=exeStr
1602
    
1603
    def setFlagStr(self, flagStr):
1604
        self.FlagStr=flagStr
1605
    
1606
    def setParmFile(self, parmStr):
1607
        self.ParmFile=parmStr
1608
    
1609
    def setLogFile(self, logStr):
1610
        self.LogFile=logStr
1611
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1612
#    
1613
#    def setWorkingDir(self, workDir): N3P remove
1614
#        self.workingDir = workDir
1615
#
1616
1617
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1618
    def setCommand(self):
1619
        self.command=self.Exe + " " + self.FlagStr+ " " + self.ParmFile+ " " + self.LogFile
1620
1621
    def doIntRemoteCommand(self,pFile,host=None,nice=20,flagStr=' ',log=None):
1622
        if not host: host=self.localHost
1623
        self.qT= self.hostDict[host]['queuetype']
1624
        if self.qT!='int':
1625
            t=host + ' is nqe queueType; use doNqeRemoteCommand instead'
1626
            self.vf.warningMsg(t)
1627
            return
1628
        exe= self.hostDict[host][self.programType]
1629
        curdir=os.getcwd()
1630
        if string.find(curdir, 'tmp_mnt')>=0:
1631
            curdir=curdir[8:]
1632
        if not log: 
1633
            #pFileStem=string.split(pFile,'.')[0]
1634
            lnum=string.rfind(pFile, '.')
1635
            pFileStem=pFile[:lnum]
1636
            log = pFileStem  +"."+self.logType
1637
        self.RemoteCommand= "rsh "+host+" -n "+"\'cd "+curdir+";nice +" + str(nice)+" "+exe+' '+flagStr+" -p "+pFile+" -l "+log+"&\'&"
1638
        self.doitWrapper(self.RemoteCommand,0,log=1,redraw=0)
1639
1640
    def doNqeRemoteCommand(self,pFile,host=None,nqeTime=144000,ncpu=1,flagStr=' ',log=None):
1641
        if not host: host=self.localHost
1642
        self.qT= self.hostDict[host]['queuetype']
1643
        if self.qT!='nqe':
1644
            t=host + ' is int queueType; use doIntRemoteCommand instead'
1645
            self.vf.warningMsg(t)
1646
            return
1647
        exe= self.hostDict[host][self.programType]
1648
        curdir=os.getcwd()
1649
        if string.find(curdir, 'tmp_mnt')>=0:
1650
            curdir=curdir[8:]
1651
        lnum=string.rfind(pFile, '.')
1652
        pFileStem=pFile[:lnum]
1653
        if not log: 
1654
            log = pFileStem  +"."+self.logType
1655
        cmdStr= "cd "+curdir+";"+exe+' ' +flagStr+" -p "+pFile+" -l "+log
1656
        jobFileName=pFileStem+'.j'
1657
        self.makeJF(jobFileName,cmdStr)
1658
        self.RemoteCommand= "rsh " +host+ " -n " +  "\'cd " +curdir+";/nqe/bin/cqsub -lT "+str(nqeTime)+ " -la ncpu="+str(ncpu)+" "+jobFileName + "\'"
1659
        self.doitWrapper(self.RemoteCommand,0,log=1,redraw=0)
1660
1661
    def makeJF(self,jobFile,jobStr):
1662
        fptr= open(jobFile, 'w')
1663
        fptr.write(jobStr)
1664
        fptr.close()
1665
        os.chmod(jobFile, 0755)
1666
        self.nqeJobFile=jobFile
1667
        
1668
    def setNqeRemoteCommand(self,host,nice,exe,flagStr,pFile,log,nqeTime,ncpu):
1669
        curdir=os.getcwd()
1670
        if string.find(curdir, 'tmp_mnt')>=0:
1671
            curdir=curdir[8:]
1672
        if self.Host==None:self.Host=host
1673
        lnum=string.rfind(pFile, '.')
1674
        pFileStem=pFile[:lnum]
1675
        #pFileStem=string.split(pFile,'.')[0]
1676
        jName=pFileStem+'.j'
1677
        self.nqeJobFile=jName
1678
        self.makeJF(jName,self.setIntRemoteCommand(self,host,curdir,nice,exe,flagStr,pFile,log))
1679
        return "rsh " +host+ " -n " +  "\'cd " +curdir+";/nqe/bin/cqsub -lT "+nqeTime+ " -la ncpu="+ncpu+" "+job + "\'"
1680
1681
1682
1683
class AutoGridStarter(AutoStarter):
1684
    """Interactive usage: 
1685
            The user chooses host and parameter file and starts the Autogrid job. 
1686
            If the host has an interactive queue, launching the job opens 
1687
            a 'ADstart_manage' widget which allows the user to follow the job 
1688
            and to kill it, if necesary. A 'job file' is written when a parameter 
1689
            file is selected in combination with the selection of a 'nqe'-type host.
1690
        Scripting usage:
1691
            'doIntRemoteCommand' and 'doNqeRemoteCommand' methods allow starting 
1692
            AutoGrid with the specified parameter file on a host with
1693
            a appropriate queue type. (if not specified, host is assumed
1694
            to be the local host and must be of appropriate queue type).
1695
            All other parameters are optional"""
1696
1697
    def __init__(self): 
1698
        AutoStarter.__init__(self,program='autogrid4',
1699
            dictObj='gpo',
1700
            ifdTitle="Run AutoGrid",
1701
            browserPFTitle="Grid Parameter File",
1702
            browserEXETitle='autogrid4',
1703
            browserLOGTitle="Grid Log",
1704
            logType='glg',
1705
            pfType='gpf',
1706
            programType='autogrid')
1707
1708
1709
AutoGridStarterGUI=CommandGUI()
1710
AutoGridStarterGUI.addMenuCommand('AutoToolsBar', menuText['StartMB'], menuText['startGridMB'])
1711
1712
1713
1714
class AutoDockStarter(AutoStarter):
1715
    """Interactive usage: 
1716
            The user chooses host and parameter file and starts the Autodock job. 
1717
            If the host has an interactive queue, launching the job opens 
1718
            a 'ADstart_manage' widget which allows the user to follow the job 
1719
            and to kill it, if necesary. A 'job file' is written when a parameter 
1720
            file is selected in combination with the selection of a 'nqe'-type host.
1721
        Scripting usage:
1722
            'doIntRemoteCommand' and 'doNqeRemoteCommand' methods allow starting 
1723
            Autodock with the specified parameter file on a host with
1724
            a appropriate queue type. (if not specified, host is assumed
1725
            to be the local host and must be of appropriate queue type).
1726
            All other parameters are optional"""
1727
1728
    def __init__(self): 
1729
        AutoStarter.__init__(self,program='autodock4',
1730
            dictObj='dpo',
1731
            ifdTitle="Run AutoDock",
1732
            browserPFTitle="Dock Parameter File",
1733
            browserEXETitle='autodock4',
1734
            browserLOGTitle="Dock Log",
1735
            logType='dlg',
1736
            pfType='dpf',
1737
            programType='autodock')
1738
1739
    def guiCallback(self, event=None):
1740
        #AutoDock
1741
        self.customizeGUI()
1742
        if not hasattr(self, 'form'):
1743
            if self.vf.hasGui:    
1744
                #self.form = self.vf.getUserInput(self.ifd,scrolledFrame=1,width=1000,height=350, modal=0, blocking=0)
1745
                self.form = self.vf.getUserInput(self.ifd,modal=0, blocking=0)
1746
                self.form.root.protocol('WM_DELETE_WINDOW',self.Close_cb)
1747
                self.topLevel = self.form.root
1748
            else:
1749
                ##  from ViewerFramework.gui import InputForm
1750
                from mglutil.gui.InputForm.Tk.gui import InputForm
1751
                self.form = InputForm(self.vf.master,self.ifd,modal=0, blocking=0)
1752
                self.topLevel = self.form.root
1753
            if hasattr(self.vf, 'dpo') and len(self.vf.dpo.dpf_filename):
1754
                if self.paramFile.get()=='':
1755
                    self.paramFile.set(self.vf.dpo.dpf_filename)
1756
                    self.updateLF()
1757
            #self.bindEntries()
1758
            self.flagVar.set(0)
1759
            self.kflag.set(0)
1760
            self.iflag.set(0)
1761
            self.uflag.set(0)
1762
            self.tflag.set(0)
1763
            self.cflag.set(0)
1764
            self.inputFile.set("")
1765
            self.outputFile.set("")
1766
            self.intWids=['niceLab','niceEntry']
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1767
            if os.name == 'nt': #sys.platform=='win32':
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1768
                self.ifd.entryByName['niceLab']['widget'].grid_forget()
1769
                self.ifd.entryByName['niceEntry']['widget'].grid_forget()
1770
            self.commonWids=['hNLab','hNentry','eXLab','eXentry','eXbutton',
1771
                'pFLab','pFentry','pFbutton',
1772
                'lFLab','lFentry','lFbutton']
1773
            self.nqeWids=['nqeCpuLab','nqeCpuEntry','nqeTimeLab','nqeTimeEntry']
1774
            self.pbsWids=['pbsCpuLab','pbsCpuEntry','pbsDirLab','pbsDirEntry','pbsTimeLab','pbsTimeEntry','pbsWallTimeLab','pbsWallTimeEntry','pbsRerunCB']
1775
                
1776
            self.entWids=['pjLab','pjentry','pjMenu','nodesEntLab','nodesEnt',
1777
                'gpfEntLab', 'gpfEnt','pdbqEntLab','pdbqEnt',
1778
                'dpfEntLab','dpfEnt', 'pdbqsEntLab','pdbqsEnt',
1779
                'jobDirEntLab','jobDirEnt', 'gpfFilterEnt', 'pdbqFilterEnt',
1780
                'dpfFilterEnt','pdbqsFilterEnt']
1781
            self.entWidLCS=['gpfFiles','pdbqFiles','dpfFiles','pdbqsFiles']
1782
            self.entButs=[ 'uploadGpfFileBut','uploadPdbqFileBut',
1783
                'uploadDpfFileBut','uploadPdbqsFileBut', 'monitorCB',
1784
                'ftpBackCB']
1785
            self.bindEntries()
1786
            self.getMacroVal(0)
1787
        self.updateFlags()
1788
        self.getInputs()
1789
        self.form.autoSize()
1790
1791
    def setFile(self, item, event=None):
1792
        lb=self.ifd.entryByName[item]['widget'].lb
1793
        if lb.curselection()==(): return
1794
        newsel=lb.get(lb.curselection())
1795
        #FIX ME, i think this is ok, but i'm not sure
1796
        #exec('self.'+item[:-5]+'.set(newsel)')
1797
        setattr(self, item[:-5], newsel)
1798
        self.getCmd()
1799
        
1800
        
1801
    def bindEntries(self):
1802
        if hasattr(self,'form'):
1803
            self.ifd.entryByName['cmdentry']['widget'].bind('<Return>', self.getCmdParams)
1804
            self.ifd.entryByName['mNentry']['widget'].bind('<Key>', self.getMacro)
1805
            self.ifd.entryByName['mNMenu']['widget'].bind('<ButtonPress>', self.buildMacroMenu, add='+')
1806
            self.ifd.entryByName['pjMenu']['widget'].bind('<ButtonPress>', self.buildProjectMenu, add='+')
1807
            self.ifd.entryByName['pFentry']['widget'].bind('<Return>', self.updateLF)
1808
            if entropiaPresent:
1809
                entList=['lFentry','eXentry','inentry','outentry','niceEntry','nqeTimeEntry','nqeCpuEntry','nodesEnt','gpfEnt','dpfEnt','pdbqEnt','pdbqsEnt']
1810
            else:
1811
                entList=['lFentry','eXentry','inentry','outentry','niceEntry','nqeTimeEntry','nqeCpuEntry']
1812
            for item in entList:
1813
                self.ifd.entryByName[item]['widget'].bind('<Return>', self.getCmd)
1814
            if entropiaPresent:
1815
                filList=['gpf','pdbqs','dpf','pdbq']
1816
                for item in filList:
1817
                    n=item+'FilterEnt'
1818
                    self.ifd.entryByName[n]['widget'].bind('<Return>', CallBackFunction(self.updateLCS,item), '+')
1819
1820
    def getCmdParams(self, event=None):
1821
        print "in getCmdParms"
1822
        if not entropiaPresent: return
1823
        if self.queueType.get()=='ent':
1824
            cmdList=string.split(self.cmd.get(), ';')
1825
            self.nodes.set(cmdList[1])
1826
            gpfFile=cmdList[2]
1827
            if gpfFile in self.EntropiaUI.gpf_list:
1828
                self.gpf.set(gpfFile)
1829
            pdbqFile=cmdList[3]
1830
            if pdbqFile in self.EntropiaUI.pdbq_list:
1831
                self.pdbq.set(pdbqFile)
1832
            dpfFile=cmdList[4]
1833
            if dpfFile in self.EntropiaUI.pdbq_list:
1834
                self.dpf.set(dpfFile)
1835
            pdbqsFile=cmdList[5]
1836
            if pdbqsFile in self.EntropiaUI.pdbqs_list:
1837
                self.pdbqs.set(pdbqsFile)
1838
        elif self.queueType.get()=='int' and self.hostName.get()==self.localHost:
1839
            #in this case can set execPath,
1840
            cmdList=string.split(self.cmd.get())
1841
            self.execPath.set(cmdList[0])
1842
            self.Exe=cmdList[0]
1843
            self.paramFile.set(cmdList[2])
1844
            self.ParmFile=cmdList[2]
1845
            self.logFile.set(cmdList[4])
1846
            self.LogFile=cmdList[4]
1847
1848
    def setUpFlagVars(self):
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
1849
        self.flagVar = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1850
        self.flagVar.set(0)
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
1851
        self.kflag = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1852
        self.iflag = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1853
        self.uflag = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1854
        self.tflag = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1855
        self.cflag = Tkinter.IntVar(master=self.vf.GUI.ROOT)
1856
        self.inputFile = Tkinter.StringVar(master=self.vf.GUI.ROOT)
1857
        self.outputFile = Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1858
1859
    def getFlags(self):
1860
        self.ifd.append({'name': 'flagChoiceLab',
1861
            'widgetType': Tkinter.Label,
1862
            'text':'Add Optional Flags?',
1863
            'gridcfg':{'sticky':Tkinter.E }})
1864
        self.ifd.append({'name': 'flagYes',
1865
            'widgetType':Tkinter.Radiobutton,
1866
            'wcfg': {'value':'1'},
1867
            'variable': self.flagVar,
1868
            'command': self.getCmd,
1869
            'text':'Yes',
1870
            'gridcfg':{'sticky':Tkinter.E, 'row':-1,'column':1},
1871
            'command': self.updateFlags })
1872
        self.ifd.append({'name': 'flagNo',
1873
            'widgetType':Tkinter.Radiobutton,
1874
            'wcfg': {'value':'0'},
1875
            'variable': self.flagVar,
1876
            'command': self.getCmd,
1877
            'text':'No',
1878
            'gridcfg':{'sticky':Tkinter.W, 'row':-1,'column':2},
1879
            'command': self.updateFlags })
1880
        self.ifd.append({'name': 'kflag',
1881
            'widgetType':Tkinter.Checkbutton,
1882
            'text':'Don\'t keep original residue numbers (-k)',
1883
            'command': self.getCmd,
1884
            'variable':self.kflag,
1885
            'gridcfg':{'sticky':Tkinter.W, 'column':1, 'columnspan':2}})
1886
        self.ifd.append({'name': 'iflag',
1887
            'widgetType':Tkinter.Checkbutton,
1888
            'text':'Ignore grid map header errors (-i)',
1889
            'variable':self.iflag,
1890
            'command': self.getCmd,
1891
            'gridcfg':{'sticky':Tkinter.W, 'column':1, 'columnspan':2}})
1892
        self.ifd.append({'name': 'uflag',
1893
            'widgetType':Tkinter.Checkbutton,
1894
            'text':'Return message describing cmd line usage (-u)',
1895
            'variable':self.uflag,
1896
            'command': self.getCmd,
1897
            'gridcfg':{'sticky':Tkinter.W, 'column':1, 'columnspan':2}})
1898
        self.ifd.append({'name': 'tflag',
1899
            'widgetType':Tkinter.Checkbutton,
1900
            'text':'Parse PDBQ to check torsion dfns + stop (-t)',
1901
            'variable':self.tflag,
1902
            'command': self.getCmd,
1903
            'gridcfg':{'sticky':Tkinter.W, 'column':1, 'columnspan':2}})
1904
        self.ifd.append({'name': 'cflag',
1905
            'widgetType':Tkinter.Checkbutton,
1906
            'text':'Run autodock in command mode (-c)',
1907
            'variable':self.cflag,
1908
            'command': self.getInputs,
1909
            'gridcfg':{'sticky':Tkinter.W, 'column':1, 'columnspan':2}})
1910
        self.ifd.append( {'name': 'inentLab',
1911
            'widgetType': Tkinter.Label,
1912
            'text':'Take input from:',
1913
            'gridcfg':{'sticky':Tkinter.E}})
1914
        self.ifd.append( {'name': 'inentry',
1915
            'widgetType':Tkinter.Entry,
1916
            'wcfg':{
1917
                'textvariable': self.inputFile,
1918
            },
1919
            'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
1920
        self.ifd.append( {'name': 'outentLab',
1921
            'widgetType': Tkinter.Label,
1922
            'text':'Redirect output to:',
1923
            'gridcfg':{'sticky':Tkinter.E}})
1924
        self.ifd.append( {'name': 'outentry',
1925
            'widgetType':Tkinter.Entry,
1926
            'wcfg':{
1927
                'textvariable': self.outputFile,
1928
            },
1929
            'gridcfg':{'sticky':Tkinter.E,'row':-1,'column':1}})
1930
        self.flagWids=['flagChoiceLab','flagYes','flagNo',
1931
                        'kflag','iflag','uflag',
1932
                        'tflag','cflag','inentLab',
1933
                        'inentry','outentLab','outentry']
1934
1935
1936
    def callDoit_cb(self, event = None):
1937
        cmdStr=self.cmd.get()
1938
        if self.queueType.get()=='int':
1939
            if string.find(cmdStr,'dpf')<0:
1940
                msgStr="Must Specify a docking parameter file (.dpf)!"
1941
                self.vf.warningMsg(msgStr)    
1942
                return
1943
            if string.find(cmdStr,'dlg')<0:
1944
                msgStr="Must Specify a docking log file (.dlg)!"
1945
                self.vf.warningMsg(msgStr)    
1946
                return
1947
        self.doitWrapper(self.cmd.get(),log=1,redraw=0)
1948
1949
1950
    def updateFlags(self, event=None):
1951
        wlist = []
1952
        wlist2 = []
1953
        for item in ['kflag','iflag','uflag','tflag','cflag']:
1954
            wlist.append(self.ifd.entryByName[item])
1955
        for item in ['inentLab','inentry','outentLab','outentry']:
1956
            wlist2.append(self.ifd.entryByName[item])
1957
        if not self.flagVar.get():
1958
            for item in wlist:
1959
                item['widget'].grid_forget()
1960
            for item in wlist2:
1961
                item['widget'].grid_forget()
1962
        else:
1963
            for item in wlist:
1964
                item['widget'].grid(item['gridcfg'])
1965
            #call getInputs to pack or not pack wlist2 items according to cflag
1966
            self.getInputs()
1967
        self.getCmd()
1968
1969
    def getInputs(self, event=None):
1970
        wlist=[]
1971
        for item in ['inentLab','inentry','outentLab','outentry']:
1972
            wlist.append(self.ifd.entryByName[item])
1973
        if not self.cflag.get():
1974
            for item in wlist:
1975
                item['widget'].grid_forget()
1976
        else:
1977
            for item in wlist:
1978
                item['widget'].grid(item['gridcfg'])
1979
        self.getCmd()
1980
1981
    def getCmd(self, event=None):
1982
        #AutoDock:
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
1983
        if self.workingDirPath.get() == None:
1984
            curdir = os.getcwd()
1985
        else:
1986
            curdir = self.workingDirPath.get()
1987
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
1988
        if string.find(curdir, 'tmp_mnt')>=0:
1989
            curdir=curdir[8:]
1990
        remotedir= self.remoteDir.get()
1991
        host = self.hostName.get()
1992
        pFile = self.paramFile.get()
1993
        logName = self.logFile.get()
1994
        exe = self.execPath.get()
1995
        job = self.jobFile.get()
1996
        cmd = self.cmd
1997
        niceStr=''
1998
        if self.niceLevel.get()=='':
1999
            self.niceLevel.set('0')
2000
        if self.niceLevel.get()!='0':
2001
            niceStr = 'nice +'+self.niceLevel.get() + " "
2002
        qT = self.queueType.get()
2003
        if job=='' and pFile and (qT=='nqe' or qT=='pbs'):
2004
            self.jobFile.set(self.makeJobFile(pFile))
2005
            job= self.jobFile.get()
2006
        flagStr=' '
2007
        if self.flagVar.get(): 
2008
            if self.kflag.get():
2009
                flagStr= flagStr + ' -k'
2010
            if self.iflag.get():
2011
                flagStr= flagStr + ' -i'
2012
            if self.uflag.get():
2013
                flagStr= flagStr + ' -u'
2014
            if self.tflag.get():
2015
                flagStr= flagStr + ' -t'
2016
        cStr=' '
2017
        if self.cflag.get():
2018
            cStr= cStr + ' -c'
2019
            if self.inputFile.get()!='':
2020
                cStr= cStr + ' < '+ self.inputFile.get()
2021
            if self.outputFile.get()!='':
2022
                cStr= cStr + ' > '+ self.outputFile.get()
2023
        else:
2024
            cStr = '&'
2025
2026
        qT=self.queueType.get()
2027
        if qT =='int':
2028
            if host==self.localHost:
2029
                cmdStr=exe+flagStr+' -p '+pFile+' -l '+logName+'&'
2030
            else:
2031
                cmdStr="rsh "+host+" -n "+"\'cd "+curdir+";"+niceStr + exe + flagStr+" -p "+pFile+" -l "+logName+"&\'&"
2032
        elif qT=='nqe':
2033
            cmdStr="rsh " +host+ " -n " +  "\'cd " +curdir+";/nqe/bin/cqsub -lT "+self.nqeTime.get()+ " -la ncpu="+self.nqeCpu.get()+" "+job + "\'"
2034
        elif qT=='pbs':
2035
            msg = 'PBS queuetype not yet implemented'
2036
            self.vf.warningMsg(msg)
2037
            return
2038
            if remotedir=='':
2039
                msg = 'No REMOTE DIRECTORY specified!'
2040
                self.vf.warningMsg(msg)
2041
                return
2042
            cmdStr="rsh " +host+ " -n " +  "\'cd " +remotedir+";/pbs/bin/qsub -l walltime= "+self.nqeTime.get()+ " -l nodes="+self.nqeCpu.get()+" "+job + "\'"
2043
        elif qT=='ent':
2044
            cmdStr='params=startjob;'+self.nodes.get()+';'+self.gpf.get()+';'+self.pdbqs.get()+';'+self.dpf.get()+';'+self.pdbq.get()
2045
        else:
2046
            msg='unknown queuetype-> ' + qT
2047
            self.vf.warningMsg(msg)
2048
            return
2049
        self.cmd.set(cmdStr)
2050
        self.command=cmdStr
2051
        ###self.makeJobFile(pFile)
2052
        if hasattr(self, 'topLevel'):self.topLevel.lift()
2053
2054
    def makeJobFile(self, pFName):
2055
        """AutoDock:"""
2056
        if not pFName: return ''
2057
        #NOT FINISHED:
2058
        #MUST PUT COPY OF JOB FILE ON REMOTE MACHINE!!
2059
        if self.qT=='int': 
2060
            return ''
2061
        elif self.qT=='nqe':
2062
            curdir= os.getcwd()
2063
            if string.find(curdir, 'tmp_mnt')>=0:
2064
                curdir=curdir[8:]
2065
            dName = curdir
2066
        elif self.qT=='pbs':
2067
            dName = self.remoteDir.get()
2068
        msg='self.ADstart_autodock.makeJobFile(' + pFName+')'
2069
        self.vf.log(msg)
2070
        pName = os.path.split(pFName)[-1]
2071
        #pStem = string.split(pFName, '.')[0]
2072
        pnum=string.rfind(pName, '.')
2073
        pStem =pName[:pnum]
2074
        host = self.Host
2075
        exe = self.execPath.get()
2076
        flagStr=' '
2077
        if self.flagVar.get(): 
2078
            if self.kflag.get():
2079
                flagStr= flagStr + ' -k '
2080
            if self.iflag.get():
2081
                flagStr= flagStr + ' -i '
2082
            if self.uflag.get():
2083
                flagStr= flagStr + ' -u '
2084
            if self.tflag.get():
2085
                flagStr= flagStr + ' -t '
2086
        cmd = self.cmd
2087
        logName = self.logFile.get()
2088
        jobFile = pStem + '.j'
2089
        fptr= open(jobFile, 'w')
2090
        jobStr='cd '+dName+";"+exe+" "+ flagStr +" -p "+pName+" -l "+logName+"\n"
2091
        fptr.write(jobStr)
2092
        fptr.close()
2093
        os.chmod(jobFile, 0755)
2094
        return jobFile
2095
2096
AutoDockStarterGUI=CommandGUI()
2097
AutoDockStarterGUI.addMenuCommand('AutoToolsBar', menuText['StartMB'], menuText['startDockMB'])
2098
2099
2100
2101
class AddAutoDockHost(MVCommand):
2102
    """ this class allows user to add entries to hosts dictionary 
2103
        and write them to a file"""
2104
        
2105
    def guiCallback(self, event=None):
2106
        #Edit AutoDockHosts
2107
        self.customizeGUI()
2108
        if not hasattr(self, 'form'):
2109
            if self.vf.hasGui:    
2110
                self.form = self.vf.getUserInput(self.ifd, modal=0, blocking=0)
2111
                self.form.root.protocol('WM_DELETE_WINDOW',self.Close_cb)
2112
                self.fillForm()
2113
                self.qType.set('int')
2114
                self.userSpecific.set(0)
2115
                self.topLevel = self.form.root
2116
            else:
2117
##                  from ViewerFramework.gui import InputForm
2118
                from mglutil.gui.InputForm.Tk.gui import InputForm
2119
                self.form = InputForm(self.vf.master,self.ifd,modal=0, blocking=0)
2120
                self.topLevel = self.form.root
2121
            self.form.autoSize()
2122
2123
2124
    def customizeGUI(self):
2125
        if not hasattr(self, 'ifd'):
2126
            import AutoDockTools
2127
            self.hostDict = AutoDockTools.hostDict
2128
            #print "AADH:hostDict.keys()=", self.hostDict.keys()
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
2129
            self.macroName=Tkinter.StringVar(master=self.vf.GUI.ROOT)
2130
            self.hostName=Tkinter.StringVar(master=self.vf.GUI.ROOT)
2131
            self.agPath=Tkinter.StringVar(master=self.vf.GUI.ROOT)
2132
            self.adPath=Tkinter.StringVar(master=self.vf.GUI.ROOT)
2133
            self.qType=Tkinter.StringVar(master=self.vf.GUI.ROOT)
2134
            self.userSpecific=Tkinter.IntVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2135
            ifd=self.ifd=InputFormDescr(title='Add Host')
2136
            ifd.append( {'name': 'hList',
2137
                'widgetType': Tkinter.Listbox,
2138
                'gridcfg':{'sticky':Tkinter.E,'column':0, 'row': 0,'rowspan':6}})
2139
            ifd.append( {'name': 'mNLab',
2140
                'widgetType': Tkinter.Label,
2141
                'wcfg':{ 'text': 'Macro Name:'},
2142
                'gridcfg':{'sticky':Tkinter.E, 'row':0, 'column':1}})
2143
            ifd.append( {'name': 'mNentry',
2144
                'widgetType':Tkinter.Entry,
2145
                'wcfg':{
2146
                    'width':25,
2147
                    'textvariable':self.macroName},
2148
                'gridcfg':{'sticky':Tkinter.E,'row':0,'column':2}})
2149
            ifd.append( {'name': 'hNLab',
2150
                'widgetType': Tkinter.Label,
2151
                'wcfg':{ 'text': 'Host Name:'},
2152
                'gridcfg':{'sticky':Tkinter.E, 'row':1, 'column':1}})
2153
            ifd.append( {'name': 'hNentry',
2154
                'widgetType':Tkinter.Entry,
2155
                'wcfg':{
2156
                    'width':25,
2157
                    'textvariable':self.hostName},
2158
                'gridcfg':{'sticky':Tkinter.E,'row':1,'column':2}})
2159
            ifd.append( {'name': 'agPath',
2160
                'widgetType': Tkinter.Label,
2161
                'wcfg':{ 
2162
                    'text': 'Autogrid Program\nPathname:'},
2163
                'gridcfg':{'sticky':Tkinter.E,'row':2,'column':1}})
2164
            ifd.append( {'name': 'agEntry',
2165
                'widgetType':Tkinter.Entry,
2166
                'wcfg':{
2167
                    'width':25,
2168
                    'textvariable':self.agPath},
2169
                'gridcfg':{'sticky':Tkinter.E,'row':2,'column':2}})
2170
            ifd.append({'name': 'agButton',
2171
                'widgetType': Tkinter.Button,
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
2172
                'wcfg':{'text':'Browse','command':self.browseAG,'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2173
                'gridcfg':{'sticky':Tkinter.W,'row':2, 'column':3}})
2174
            ifd.append( {'name': 'adPath',
2175
                'widgetType': Tkinter.Label,
2176
                'wcfg':{ 'text': 'Autodock Program\nPathname:'},
2177
                'gridcfg':{'sticky':Tkinter.E, 'row':3, 'column':1}})
2178
            ifd.append( {'name': 'adEntry',
2179
                'widgetType':Tkinter.Entry,
2180
                'wcfg':{
2181
                    'width':25,
2182
                    'textvariable':self.adPath},
2183
                'gridcfg':{'sticky':Tkinter.E,'row':3,'column':2}})
2184
            ifd.append({'name': 'adButton',
2185
                'widgetType': Tkinter.Button,
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
2186
                'wcfg':{'text':'Browse','command':self.browseAD,'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2187
                'gridcfg':{'sticky':Tkinter.W,'row':3, 'column':3}})
2188
            ifd.append( {'name': 'qChoice',
2189
                'widgetType': Tkinter.Label,
2190
                'wcfg':{'text':'Queue Type'},
2191
                'gridcfg':{'sticky':Tkinter.E, 'row':4, 'column':1}})
2192
            ifd.append({'name': 'intButton',
2193
                'widgetType': Tkinter.Radiobutton,
2194
                'wcfg':{'value':'int', 'text':'int', 'variable':self.qType},
2195
                'gridcfg':{'sticky':Tkinter.E +Tkinter.W, 'row':4,'column':2}})
2196
            ifd.append({'name': 'winButton',
2197
                'widgetType': Tkinter.Radiobutton,
2198
                'wcfg':{'text':'nqe','value':'nqe', 'variable':self.qType},
2199
                'gridcfg':{'sticky':Tkinter.W,'row':4, 'column':3}})
2200
            ifd.append({'name': 'pdsButton',
2201
                'widgetType': Tkinter.Radiobutton,
2202
                'wcfg':{'text':'pbs','value':'pbs', 'state':'disabled','variable':self.qType},
2203
                'gridcfg':{'sticky':Tkinter.W,'row':4, 'column':4}})
2204
            ifd.append( {'name': 'userOnlyChoice',
2205
                'widgetType': Tkinter.Label,
2206
                'wcfg':{'text':'From User Dict:'},
2207
                'gridcfg':{'sticky':Tkinter.E, 'row':5, 'column':1}})
2208
            ifd.append({'name': 'userButton',
2209
                'widgetType': Tkinter.Radiobutton,
2210
                'wcfg':{'text':'yes','value':1, 'variable':self.userSpecific},
2211
                'gridcfg':{'sticky':Tkinter.E +Tkinter.W,'row':5,'column':2}})
2212
            ifd.append({'name': 'notuserButton',
2213
                'widgetType': Tkinter.Radiobutton,
2214
                'wcfg':{'text':'no','value':0, 'variable':self.userSpecific},
2215
                'gridcfg':{'sticky':Tkinter.W,'row':5, 'column':3}})
2216
            ifd.append({'widgetType': Tkinter.Button,
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
2217
                'wcfg':{'text':'Add','bd':2,'command':self.addItem_cb},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2218
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'row':7,'column':0}})
2219
            ifd.append({'widgetType': Tkinter.Button,
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
2220
                'wcfg':{'text':'Delete','command':self.delItem_cb,'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2221
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'row':-1,'column':1}}),
2222
            ifd.append({'widgetType': Tkinter.Button,
2223
                'text':'Write',
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
2224
                'wcfg':{'text':'Write','command':self.write_cb,'bd':2},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2225
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'row':-1,'column':2}})
2226
            ifd.append({'widgetType': Tkinter.Button,
1.1.8 by Steffen Moeller
Import upstream version 1.5.6~rc2+cvs.20111222
2227
                'wcfg':{'text':'Cancel','bd':2,'command':self.Close_cb},
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2228
                'gridcfg':{'sticky':Tkinter.E+Tkinter.W,'row':-1,'column':3,'columnspan':5}})
2229
        else:
2230
            if hasattr(self, 'form') and self.form!=None:
2231
                self.form.deiconify()
2232
2233
    def fillForm(self):
2234
        lb = self.ifd.entryByName['hList']['widget']
2235
        dict= self.hostDict
2236
        for h in dict.keys():
2237
            lb.insert('end',h)
2238
        lb.select_set(0)
2239
        lb.bind('<Double-Button-1>', self.getItem)
2240
2241
    def getItem(self, event=None):
2242
        lb = self.ifd.entryByName['hList']['widget']
2243
        p=lb.curselection()
2244
        picked = lb.get(p)
2245
        dict= self.hostDict
2246
        #self.hostName.set(picked)
2247
        self.macroName.set(picked)
2248
        self.hostName.set(dict[picked]['host'])
2249
        self.agPath.set(dict[picked]['autogrid'])
2250
        self.adPath.set(dict[picked]['autodock'])
2251
        self.qType.set(dict[picked]['queuetype'])
2252
        #FIX THIS: need to do something different for this case!
2253
        self.userSpecific.set(dict[picked]['userSpecific'])
2254
        
2255
    def delItem_cb(self, event=None):
2256
        lb = self.ifd.entryByName['hList']['widget']
2257
        p=lb.curselection()
2258
        picked = lb.get(p)
2259
        dict= self.hostDict
2260
        del dict[picked]
2261
        lb.delete(p)
2262
        self.macroName.set('')
2263
        self.hostName.set('')
2264
        self.agPath.set('')
2265
        self.adPath.set('')
2266
        self.qType.set('')
2267
        
2268
    def buildLogStr(self):
2269
        logstr="self.ADstart_editHostMacros.addItem_cb(macro='"+self.macroName.get()+\
2270
"', host='"+self.hostName.get()+"',autogrid='"+self.agPath.get()+\
2271
"',autodock='"+self.adPath.get()+"',queuetype='"+self.qType.get()+\
2272
"',userSpecific="+str(self.userSpecific.get())+")\n"
2273
        print logstr
2274
        return logstr
2275
2276
    def write_cb(self, newfile = None, whichOnes='all', event=None):
2277
        # write only current content of widget....
2278
        adtrcDict = findResourceFile(self.vf, '_adtrc')
2279
        idir = './'
2280
        if 'HOME' in os.environ.keys():
2281
            home=os.environ['HOME']
2282
            idir=home
2283
2284
        #if there are NO _adtrc files any where, write to HOME if it exists
2285
        #else write to current directory
2286
        #check for >1 choice and ask user where to write it
2287
        hasValues=filter(lambda x: not x is None, adtrcDict.values())
2288
        #if filter(lambda x: not x is None, adtrcDict.values())==[]:
2289
        if hasValues==[]:
2290
            filename=self.vf.askFileSave(idir=idir,
2291
                ifile='_adtrc',
2292
                types = [('adt Resource File', '_adtrc')], 
2293
                title = 'Save new host macros in _adtrc:')
2294
        elif len(hasValues)>1:
2295
            #have to give a choice here:    
1.1.1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20081109
2296
            location=Tkinter.StringVar(master=self.vf.GUI.ROOT)
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2297
            levels=adtrcDict.keys()
2298
            ifd = InputFormDescr(title='which adtrc file to write?')
2299
            for level in levels:
2300
                if adtrcDict[level]:
2301
                    ifd.append({'name':    level,
2302
                        'widgetType':Tkinter.Radiobutton,
2303
                        'wcfg': {'value': adtrcDict[level],
2304
                        'variable':location,
2305
                        'text':level},
2306
                        'gridcfg':{'sticky':Tkinter.W}})
2307
            vals = self.vf.getUserInput(ifd)
2308
            if vals:
2309
                filename=location.get()
2310
                #on UNIX machines, can test writeability:
2311
                if sys.platform!=32:
2312
                    if not os.access(filename, os.W_OK):
2313
                        t=filename + " not writeable by you"
2314
                        self.vf.warningMsg(t)
2315
                        return
2316
                
2317
        elif adtrcDict['currentdir']:
2318
            filename = adtrcDict['currentdir']
2319
2320
        elif adtrcDict['home']:
2321
            filename = adtrcDict['home']
2322
2323
        elif adtrcDict['package']:
2324
            filename = adtrcDict['package']
2325
            import shutil
2326
            if not filename is None:
2327
                shutil.copy(adtrcDict['package'],filename)
2328
2329
        if filename:
2330
            fptr= open(filename, 'r')
2331
            logLine=self.buildLogStr()
2332
            allLines=fptr.readlines()
2333
            for l in allLines:
2334
                if string.find(l,logLine)>-1:
2335
                    fptr.close()
2336
                    t= l+ ' already in ' + filename
2337
                    self.vf.warningMsg(t)
2338
                    return
2339
            fptr.close()
2340
            f= open(filename, 'a')
2341
            f.write('\n')
2342
            f.write(logLine)
2343
            f.close()
2344
2345
        else:
2346
            print "Careful: nothing has been written because no filename was give"
2347
            return
2348
2349
    def checkit(self, host):
2350
        ans=0
2351
        if host!='' and  len(self.agPath.get()) and len(self.adPath.get()) and len(self.qType.get()):
2352
            return 1
2353
        return ans
2354
        
2355
    def checklb(self,host):
2356
        if not self.ifd.entryByName.has_key('hList'): return
2357
        lb = self.ifd.entryByName['hList']['widget']
2358
        end =lb.index('end')
2359
        for i in range(end):
2360
            if lb.get(i)==host:
2361
                return  1
2362
        else:
2363
            return 0
2364
        
2365
    def addItem_cb(self, macro=None, host= None, autogrid=None, autodock=None, queuetype=None, userSpecific=None):
2366
        #need to update the lb
2367
        if macro: 
2368
            self.macroName.set(macro)
2369
        else:
2370
            macro = self.macroName.get()
2371
        if autogrid:
2372
            self.agPath.set(autogrid)
2373
        else:
2374
            autogrid = self.agPath.get()
2375
        if autodock:
2376
            self.adPath.set(autodock)
2377
        else:
2378
            autodock=self.adPath.get()
2379
        if queuetype:
2380
            self.qType.set(queuetype)
2381
        else:
2382
            queuetype= self.qType.get()
2383
        ans = self.checkit(macro)
2384
        if host: 
2385
            self.hostName.set(host)
2386
        else:
2387
            host = self.hostName.get()
2388
        if userSpecific:
2389
            self.userSpecific.set(userSpecific)
2390
        else:
2391
            userSpecific= self.userSpecific.get()
2392
        if ans:
2393
            self.hostDict.addHost(macro, host=host,autogrid=autogrid,autodock=autodock,queuetype=queuetype,userSpecific=userSpecific)
2394
            msg = "self.ADstart_editHostMacros.addItem_cb(macro='" + macro + "',host='"+host+ "', autogrid='"+ autogrid + "', autodock = '" + autodock + "', queuetype='" + queuetype+"', userSpecific="+ str(userSpecific) + ")"
2395
            self.vf.log(msg)
2396
        ans = self.checklb(macro)
2397
        if not ans and self.ifd.entryByName.has_key('hList'):
2398
            lb = self.ifd.entryByName['hList']['widget']
2399
            lb.insert('end', macro)
2400
2401
    def Close_cb(self):
2402
        self.form.root.withdraw()
2403
2404
    def browseAG(self):
2405
        ag = self.vf.askFileOpen(parent = self.topLevel,
2406
                                 types=[('autogrid..','*')], title=  'Autogrid Executable File:')
2407
        if ag: 
2408
            #don't strip off the pathname??
2409
            agPathList=os.path.split(ag)
2410
            if agPathList[0]==os.getcwd():
2411
                ag = agPathList[-1]
2412
            self.agPath.set(ag)
2413
        if hasattr(self, 'topLevel'):self.topLevel.lift()
2414
2415
    def browseAD(self):
2416
        ad = self.vf.askFileOpen(parent = self.topLevel,
2417
                                 types=[('autodock..','*')], title=  'Autodock Executable File:')
2418
        if ad: 
2419
            #don't strip off the pathname??
2420
            adPathList=os.path.split(ad)
2421
            if adPathList[0]==os.getcwd():
2422
                ad = adPathList[-1]
2423
            self.adPath.set(ad)
2424
        if hasattr(self, 'topLevel'):self.topLevel.lift()
2425
        
2426
AddAutoDockHostGUI=CommandGUI()
2427
AddAutoDockHostGUI.addMenuCommand('AutoToolsBar', menuText['StartMB'], menuText['editHostsMB'])
2428
2429
commandList = [
2430
    {'name':'ADstart_autogrid','cmd':AutoGridStarter(),'gui':AutoGridStarterGUI},
2431
    {'name':'ADstart_autodock','cmd':AutoDockStarter(),'gui':AutoDockStarterGUI},
2432
    {'name':'ADstart_editHostMacros','cmd':AddAutoDockHost(),'gui':AddAutoDockHostGUI},
2433
    ]
2434
2435
import sys
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
2436
if os.name != 'nt': #not sys.platform == 'win32':
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2437
    commandList.insert(2,
2438
    {'name':'ADstart_manage','cmd':ADProcessManager(),'gui':ADProcessManagerGUI})
2439
else:
2440
    import binaries
1.1.6 by Steffen Moeller
Import upstream version 1.5.6~rc1+cvs.20110617
2441
    if os.environ.has_key('PATH'):
2442
        os.environ['PATH'] = binaries.__path__[0]+";"+os.environ['PATH']
2443
    else:
2444
        os.environ['PATH'] = binaries.__path__[0]
1 by Steffen Moeller
Import upstream version 1.5.2.cvs.20080731
2445
        
2446
def initModule(vf):
2447
2448
2449
    for dict in commandList:
2450
        vf.addCommand(dict['cmd'],dict['name'],dict['gui'])
2451
2452
    if hasattr(vf,'GUI'):
2453
        for item in vf.GUI.menuBars['AutoToolsBar'].menubuttons.values():
2454
            item.configure(background = 'tan')
2455
            item.configure(underline = '-1')
2456
 
2457
2458
    else:
2459
        vf.addCommand(ADProcessManager(),'ADstart_manage')
2460
        vf.addCommand(AutoGridStarter(), 'ADstart_autogrid')
2461
        vf.addCommand(AutoDockStarter(), 'ADstart_autodock')