added REMD/MREMD input generation in UNRESInpGen.py
authorDawid Jagiela <lightnir@chem.univ.gda.pl>
Thu, 11 Apr 2013 11:17:48 +0000 (13:17 +0200)
committerDawid Jagiela <lightnir@chem.univ.gda.pl>
Thu, 11 Apr 2013 11:17:48 +0000 (13:17 +0200)
source/pymol/UNRESInpGen.py

index 5e355a7..e1252b5 100755 (executable)
@@ -121,7 +121,7 @@ class UNRESInpGenerator(Toplevel):
                        labelpos = 'w',
                        label_text = 'Choose method:',
                        menubutton_textvariable = self.OM1Val,
-                       items = ['MD', 'MREMD', 'MINIMIZE' ],
+                       items = ['MD', 'REMD/MREMD', 'MINIMIZE' ],
                        command = self.switch_options,
                        menubutton_width = 10
                )
@@ -216,7 +216,15 @@ class UNRESInpGenerator(Toplevel):
                self.balloon.bind(self.gr1.md.e7, "Frequency of resetting velocities to values from Gaussian distribution")
                self.gr1.md.e7.component('entry').config(width=8)
                self.gr1.md.e7.grid(row=1,column=2, sticky=E)
-
+               
+               # -- initial structure
+               self.gr1.md.om1 = Pmw.OptionMenu(self.gr1.md,
+                       labelpos = 'w',
+                       label_text = 'Start from',
+                       items = ['PDB', 'extended', 'random' ],
+                       menubutton_width = 8,
+               )
+               self.gr1.md.om1.grid(row=1,column=3, sticky=E)
 
                #=================================
                #  - thermostat frame
@@ -307,6 +315,91 @@ class UNRESInpGenerator(Toplevel):
                self.gr1.mi.c3.pack(side=LEFT)
 
 
+               #=================================
+               # - REMD frame
+               self.gr1.re = Frame(self.gr1.interior())
+               #self.gr1.re.grid(row=5, column=0, columnspan=5,sticky=W+E)
+
+               self.gr1.re.e1 = Pmw.EntryField(self.gr1.re,
+                       labelpos = 'w',
+                       label_text = "NREP",
+                       validate = {'validator' : 'integer', 'min': 1 , 'max' : 32 },
+                       command = self.set_replica_widgets,
+                       value = "16" )
+               self.balloon.bind(self.gr1.re.e1,'Number of replicas in a REMD/MREMD run.')
+               self.gr1.re.e1.component('entry').config(width=8)
+               self.gr1.re.e1.grid(row=0, column=0, sticky=W)
+               
+               self.gr1.re.e2 = Pmw.EntryField(self.gr1.re,
+                       labelpos = 'w',
+                       label_text = "NSTEX",
+                       validate = {'validator' : 'integer', 'min': 0 , 'max' : 1000000 },
+                       value = "1000" )
+               self.balloon.bind(self.gr1.re.e2,'Number of steps after which exchange is performed in REMD/MREMD runs.')
+               self.gr1.re.e2.component('entry').config(width=8)
+               self.gr1.re.e2.grid(row=0, column=1, sticky=W)
+
+               # -- radio select
+               self.gr1.re.rs = Pmw.RadioSelect(self.gr1.re,
+                       labelpos = 'w',
+                       label_text = 'Replica temperatures',
+                       command = self.sel_replica_mode,
+                       buttontype = 'radiobutton'
+                       #frame_borderwidth = 2,
+                       #frame_relief = 'ridge' 
+                       )
+               self.gr1.re.rs.grid(row=1, column=0, columnspan=4,sticky=W)
+
+               for text in ('Manual', 'Range'):
+                       self.gr1.re.rs.add(text)
+               
+               # --- range
+               self.gr1.re.tf1 = Frame(self.gr1.re, bg="blue")
+               self.gr1.re.tf1.grid(row=2,column=0, columnspan=4, sticky=W)
+
+               self.gr1.re.tf1.e1 = Pmw.EntryField(self.gr1.re.tf1,
+                       labelpos = 'w',
+                       label_text = "RETMIN",
+                       validate = {'validator' : 'real', 'min': 0 , 'max' : 1000000 },
+                       value = "10" )
+               self.balloon.bind(self.gr1.re.tf1.e1,'Minimum temperature in a REMD/MREMD run.')
+               self.gr1.re.tf1.e1.component('entry').config(width=8)
+               self.gr1.re.tf1.e1.grid(row=0, column=0, sticky=W)
+
+               self.gr1.re.tf1.e2 = Pmw.EntryField(self.gr1.re.tf1,
+                       labelpos = 'w',
+                       label_text = "RETMAX",
+                       validate = {'validator' : 'real', 'min': 0 , 'max' : 1000000 },
+                       value = "1000" )
+               self.balloon.bind(self.gr1.re.tf1.e2,'Maxmum temperature in a REMD/MREMD run.')
+               self.gr1.re.tf1.e2.component('entry').config(width=8)
+               self.gr1.re.tf1.e2.grid(row=0, column=1, sticky=W)
+               
+               # --- manual
+               self.gr1.re.tf2 = Frame(self.gr1.re) 
+               self.gr1.re.tf2.grid(row=3,column=0, columnspan=4, sticky=W)
+
+               self.gr1.re.tf2.te = []
+               for i in range(0,32): #int(self.gr1.re.e1.get())):
+                       self.gr1.re.tf2.te.append(Pmw.EntryField(self.gr1.re.tf2,
+                               labelpos='n',
+                               label_text='T%02d' % (i+1),
+                               validate = {'validator' : 'real','min' : 0, 'max' : 1000, 'minstrict' : 0},
+                               value = '%d' % (200+i*10)))
+                       self.gr1.re.tf2.te[i].component('entry').config(width=3)
+                       self.gr1.re.tf2.te[i].grid(row=1+(i//16), column=0+(i % 16))
+
+               self.gr1.re.tf2.nre = Pmw.EntryField(self.gr1.re.tf2, 
+                       labelpos ='n',
+                       label_text='Rep. in Temp.',
+                       validate = {'validator' : 'integer','min' : 1, 'max' : 100 },
+                       value = '2')
+               self.gr1.re.tf2.nre.component('entry').config(width=3)
+               self.gr1.re.tf2.nre.grid(row=1, column=17)
+
+               # display manual replica options 
+               self.gr1.re.e1.invoke()
+               self.gr1.re.rs.invoke('Manual')
 
                #================================= 
                # "Force field options" group
@@ -337,7 +430,10 @@ class UNRESInpGenerator(Toplevel):
                        value = '1.00000'))
                        self.ef[i].component('entry').config(width=8)
                        self.ef[i].grid(row=1+(i//9), column=0+(i % 9))
+               
+               #===================================
                # "Sequence" group 
+               #
                self.gr3 = Pmw.Group(self,tag_text = 'Sequence')
                self.gr3.grid(row=3, column=0,columnspan=4,sticky=W+E,padx=10, pady=5)
                                
@@ -573,13 +669,47 @@ class UNRESInpGenerator(Toplevel):
                self.gr1.th.grid_remove()
                self.gr1.md.grid_remove()
                self.gr1.mi.grid_remove()
+               self.gr1.re.grid_remove()
                # Show MD stuff
                if  self.OM1Val.get()=="MD":
                        self.gr1.md.grid(row=2, column=0, columnspan=5, sticky=W+E)
                        self.gr1.th.grid(row=3, column=0, columnspan=5, sticky=W+E)
+               elif self.OM1Val.get()=="REMD/MREMD":
+                       self.gr1.md.grid(row=2, column=0, columnspan=5, sticky=W+E)
+                       self.gr1.th.grid(row=3, column=0, columnspan=5, sticky=W+E)
+                       self.gr1.re.grid(row=5, column=0, columnspan=5, sticky=W+E)
                elif self.OM1Val.get()=="MINIMIZE":
                        self.gr1.mi.grid(row=4,column=0,columnspan=5, sticky=W+E)
 
+       def sel_replica_mode(self,mode):
+               '''
+                       Display replica temperatures settings
+               '''
+               try:
+                       self.gr1.re.tf1.grid_remove()
+                       self.gr1.re.tf2.grid_remove()
+                       if mode=="Range":
+                               self.gr1.re.tf1.grid(row=2,column=0, columnspan=4, sticky=W)    
+                       elif mode=="Manual":
+                               self.gr1.re.tf2.grid(row=3,column=0, columnspan=4, sticky=W)
+               except:
+                       pass
+
+       def set_replica_widgets(self):
+               '''
+                       Refresh list of available temperature widgets in manual mode
+               '''
+               #print self.gr1.re.e1.get()
+               for i in range(0,32): #int(self.gr1.re.e1.get())):
+                       try:
+                               if i<int(self.gr1.re.e1.get()):
+                                       self.gr1.re.tf2.te[i].component('entry').config(state=NORMAL)
+                               else:
+                                       self.gr1.re.tf2.te[i].component('entry').config(state=DISABLED)
+                       except:
+                               pass
+
+
 
        def set_force_field(self, pole):
                '''
@@ -614,7 +744,8 @@ class UNRESInpGenerator(Toplevel):
 
        def fortran_format(self,s):
                '''
-                   Formats string containing keywords to wrap over 80 columns 
+                   Formats string containing keywords to wrap over 80 columns.
+                       Input string should be one line.
                '''
                tmpstr=''
                column=1
@@ -639,6 +770,9 @@ class UNRESInpGenerator(Toplevel):
                return s
 
        def get_md_opt(self):
+               '''
+                       Get MD options for main input
+               '''
                s = "NSTEP="+self.gr1.md.e1.getvalue()+" NTWE="+self.gr1.md.e2.getvalue()+" "
                s+= "NTWX="+self.gr1.md.e3.getvalue()+" DT="+self.gr1.md.e4.getvalue()+" "
                s+= "DAMAX="+self.gr1.md.e5.getvalue()+" DVMAX="+self.gr1.md.e6.getvalue()+" " 
@@ -662,27 +796,56 @@ class UNRESInpGenerator(Toplevel):
                return s
 
        def get_minim_opt(self):
+               '''
+                       Get minimization options
+               '''
                s = "MAXMIN="+self.gr1.mi.e1.getvalue()+" MAXFUN="+self.gr1.mi.e2.getvalue()
                return s
 
 
+       def get_mremd_opt(self):
+               '''
+                       Generates a sting containing REMD?MREMD main options for input
+               '''
+               s = "NREP="+self.gr1.re.e1.get()+" NSTEX="+self.gr1.re.e2.get()+" "
+               if self.gr1.re.rs.getvalue()=="Range":
+                       s+="RETMIN="+self.gr1.re.tf1.e1.get()+"RETMAX="+self.gr1.re.tf1.e2.get()
+               else:
+                       s+="TLIST MLIST" 
+               s+=" TRAJ1FILE REST1FILE SYNC"
+
+               return s
+
+       def get_mremd_temp_opt(self):
+               '''
+                       Generate a strong containing temperatures for REMD/MREMD "manual mode"
+               '''
+               s=""
+               for i in range(0,int(self.gr1.re.e1.get())):
+                       s+=self.gr1.re.tf2.te[i].get()+" "      
+
+               return s
+
+       def get_mremd_replicas(self):
+               '''
+                       Generates a string containing number of replicas in every temperature for REMD/MREMD calculations.
+                       For REMD calculations contains only sequence of ones.
+               '''
+               s=""
+               for i in range(0,int(self.gr1.re.e1.get())):
+                       s+=self.gr1.re.tf2.nre.get()+" "
+               return s
+
+
        def get_seq_data(self):
                '''
                        Dumps the sequence and disulfide bridge information
                '''
                # write sequence length 
                s = str(self.seq_length)+"\n"
-               # 
-               #try: 
-               #       nchains=int(len(cmd.get_chains(self.cb2.getvalue()[0])))
-               #except:
-               #       nchains=0
-               #pass
 
                chains=cmd.get_chains(self.cb2.getvalue()[0])
                nchains=len(chains)
-               #print "chains  : ",chains
-               #print "nchains : ",nchains
 
                # apply one space before each sequence line 
                seq=self.gr3.t1.get()
@@ -753,7 +916,6 @@ class UNRESInpGenerator(Toplevel):
                # Don't writeSSbrige    
                else:
                        s+="0\n 0\n"
-                               
 
                return s
 
@@ -863,11 +1025,24 @@ class UNRESInpGenerator(Toplevel):
                                # Get main options
                                mainopt="SEED="+self.gr1.e1.get()+" "
                                if self.OM1Val.get()=="MD":
-                                       mainopt+="MD PDBREF EXTCONF"
-                               elif self.OM1Val.get()=="MREMD":
-                                       mainopt+="RE "
+                                       mainopt+="MD PDBREF"
+                                       if self.gr1.md.om1.getvalue()=="PDB":
+                                               mainopt+=" PDBSTART"
+                                       elif self.gr1.md.om1.getvalue()=="extended":
+                                               mainopt+=" EXTCONF"
+                                       else:
+                                               mainopt+=" RAND_CONF"
+                               elif self.OM1Val.get()=="REMD/MREMD":
+                                       mainopt+="RE PDBREF"
+                                       if self.gr1.md.om1.getvalue()=="PDB":
+                                               mainopt+=" PDBSTART"
+                                       elif self.gr1.md.om1.getvalue()=="extended":
+                                               mainopt+=" EXTCONF"
+                                       else:
+                                               mainopt+=" RAND_CONF"
+                               
                                elif self.OM1Val.get()=="MINIMIZE":
-                                       mainopt+="PDBREF MINIMIZE RESCALE_MODE=0"
+                                       mainopt+="PDBREF PDBSTART MINIMIZE RESCALE_MODE=0"
                                        if self.CART.get():
                                                mainopt+=" CART"
                                        if self.OVERLAP.get():
@@ -879,6 +1054,11 @@ class UNRESInpGenerator(Toplevel):
 
                                if self.OM1Val.get()=="MD":
                                        text2save+=self.fortran_format(self.get_md_opt())
+                               elif self.OM1Val.get()=="REMD/MREMD":
+                                       text2save+=self.fortran_format(self.get_md_opt())
+                                       text2save+=self.fortran_format(self.get_mremd_opt())
+                                       text2save+=self.fortran_format(self.get_mremd_temp_opt())
+                                       text2save+=self.fortran_format(self.get_mremd_replicas())
                                elif self.OM1Val.get()=="MINIMIZE":
                                        text2save+=self.fortran_format(self.get_minim_opt())