docking - beta version, only basic
[django_unres.git] / django_simple / todo / forms.py
index 6d47368..45e78bf 100644 (file)
@@ -7,6 +7,14 @@ from .models import FF_CHOICE
 import json
 import urllib
 
+aa_3letter = [
+     'DPR','DLY','DAR','DHI','DAS','DGL','DSG','DGN','DSN','DTH',
+     'DAL','DTY','DTR','DVA','DLE','DIL','DPN','MED','DCY',
+     'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR',
+     'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO',
+     'SME','AIB','ABU','DBZ']
+
+
 def pdb_code_chain(pdbid):
 
     msg=''
@@ -33,6 +41,9 @@ def pdb_missing_res_chain(file,chain):
       if line[0:6] == 'ATOM  ' and line[13:15] == 'CA' and (line[21] == chain or chain==''):
                i = int(line[22:26])
                ch = line[21]
+               if line[17:20] not in aa_3letter:
+                 msg='residue '+line[17:20]+' '+str(i)+' not recognized'
+                 return(msg)
                if ires and i==ires[-1]:
                  continue
                if newchain or i==ires[-1]+1:
@@ -49,6 +60,9 @@ def pdb_missing_res_chain(file,chain):
                break
    
    if len(ires) == 0:
+        if chain == '':
+               msg='no CA atoms in this pdb'
+        else:
                msg='wrong chain id'
    return(msg)
 
@@ -61,29 +75,6 @@ def code_2d(line):
     msg='use only H,E,C or - letters'
    return(msg)
 
-def pdb_missing_res(file):
-   msg=''
-   newchain = True
-   ires=[]
-   for line in file:
-      if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
-               i = int(line[22:26])
-               if ires and i==ires[-1]:
-                 continue
-               if newchain or i==ires[-1]+1:
-                 ires.append(i)
-                 newchain = False
-               else:
-                 msg = 'chain breaks between residues '+\
-                   str(ires[-1])+' and '+str(i)+\
-                   ', server cannot add missing residues to PDB file - please repair the structure using e.g. Modeller'
-                 break
-      if line[0:3] == 'TER':
-               newchain = True
-      if line[0:3] == 'END':
-               break
-   
-   return(msg)
 
 class MultiWidgetBasic(forms.MultiWidget):
     def __init__(self, count, attrs=None):
@@ -117,11 +108,11 @@ class MultiExampleField(forms.fields.MultiValueField):
 
 
 class TaskForm(forms.Form):
-    name = forms.CharField(max_length=20)
+    name = forms.CharField(max_length=40,widget=forms.TextInput(attrs={'size':40, 'maxlength':40}))
 
 
 class TaskForm_min(forms.Form):
-     name = forms.CharField(max_length=20)
+     name = forms.CharField(max_length=40,widget=forms.TextInput(attrs={'size':40, 'maxlength':40}))
      file1 = forms.FileField(label='Upload a PDB file',required=False,
       help_text='continuous (without breaks) protein chains,use TER to divide chains')
      pdbid = forms.CharField(min_length=4,max_length=6,required=False,
@@ -144,13 +135,13 @@ class TaskForm_min(forms.Form):
                    self.add_error('pdbid',msg)
                
              if file1:
-                 msg=pdb_missing_res(file1)
+                 msg=pdb_missing_res_chain(file1,'')
                  if msg != '':
                    self.add_error('file1',msg)
 
             
 class TaskForm_min_a(forms.Form):
-     name = forms.CharField(max_length=20)
+     name = forms.CharField(max_length=40,widget=forms.TextInput(attrs={'size':40, 'maxlength':40}))
 
      unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
                            label='Force Field',initial='FF2')
@@ -193,13 +184,13 @@ class TaskForm_min_a(forms.Form):
                    self.add_error('pdbid',msg)
                
              if file1:
-                 msg=pdb_missing_res(file1)
+                 msg=pdb_missing_res_chain(file1,'')
                  if msg != '':
                    self.add_error('file1',msg)
 
 
 class TaskForm_md(forms.Form):
-     name = forms.CharField(max_length=20)
+     name = forms.CharField(max_length=40,widget=forms.TextInput(attrs={'size':40, 'maxlength':40}))
 
      md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
                       label='starting structure',initial='extconf')
@@ -249,13 +240,13 @@ class TaskForm_md(forms.Form):
                    self.add_error('pdbid',msg)
                
              if file1:
-                 msg=pdb_missing_res(file1)
+                 msg=pdb_missing_res_chain(file1,'')
                  if msg != '':
                    self.add_error('file1',msg)
 
                         
 class TaskForm_md_a(forms.Form):
-     name = forms.CharField(max_length=20)
+     name = forms.CharField(max_length=40,widget=forms.TextInput(attrs={'size':40, 'maxlength':40}))
 
      unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
                            label='Force Field',initial='FF2')
@@ -267,7 +258,7 @@ class TaskForm_md_a(forms.Form):
                      required=False,
                      widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
      md_2d = forms.CharField(label='Secondary structure restraints',
-                     help_text='single letter code: H - helix, E - extended/beta, C or - no restraints',
+                     help_text='single letter code: H helix, E extended/beta, C or - no restraints',
                      required=False,
                      widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
 
@@ -334,7 +325,7 @@ class TaskForm_md_a(forms.Form):
                    self.add_error('pdbid',msg)
                
              if file1:
-                 msg=pdb_missing_res(file1)
+                 msg=pdb_missing_res_chain(file1,'')
                  if msg != '':
                    self.add_error('file1',msg)
              
@@ -344,7 +335,7 @@ class TaskForm_md_a(forms.Form):
                    self.add_error('md_2d',msg)
 
 class TaskForm_remd(forms.Form):
-     name = forms.CharField(max_length=20)
+     name = forms.CharField(max_length=40,widget=forms.TextInput(attrs={'size':40, 'maxlength':40}))
 
      md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
                       label='starting structure',initial='extconf')
@@ -391,13 +382,13 @@ class TaskForm_remd(forms.Form):
                    self.add_error('pdbid',msg)
                
              if file1:
-                 msg=pdb_missing_res(file1)
+                 msg=pdb_missing_res_chain(file1,'')
                  if msg != '':
                    self.add_error('file1',msg)
 
                              
 class TaskForm_remd_a(forms.Form):
-     name = forms.CharField(max_length=20)
+     name = forms.CharField(max_length=40,widget=forms.TextInput(attrs={'size':40, 'maxlength':40}))
 
      unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
                            label='Force Field',initial='FF2')
@@ -409,7 +400,7 @@ class TaskForm_remd_a(forms.Form):
                      required=False,
                      widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
      md_2d = forms.CharField(label='Secondary structure restraints',
-                     help_text='single letter code: H - helix, E - extended/beta, C or - no restraints',
+                     help_text='single letter code: H helix, E extended/beta, C or - no restraints',
                      required=False,
                      widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
      file1 = forms.FileField(label='Upload a PDB file',required=False,
@@ -431,6 +422,9 @@ class TaskForm_remd_a(forms.Form):
                   help_text='coupling to the thermal bath (Berendsen)')
      md_scal_fric = forms.FloatField(label='scal_froc',initial=0.02,
                   help_text='scaling of the friction coefficients (Langevin)')
+     min_maxfun = forms.IntegerField(label='MAXFUN',initial=5000,
+                  help_text='preminim maximum number of function evaluations<br>'+
+                  'used for start from pdb or random start')
      remd_nrep = forms.IntegerField(label='NREP',initial=8,
                   help_text='number of replicas')
      remd_nstex = forms.IntegerField(label='NSTEX',initial=1000,
@@ -491,7 +485,7 @@ class TaskForm_remd_a(forms.Form):
                    self.add_error('pdbid',msg)
                
              if file1:
-                 msg=pdb_missing_res(file1)
+                 msg=pdb_missing_res_chain(file1,'')
                  if msg != '':
                    self.add_error('file1',msg)
 
@@ -501,9 +495,68 @@ class TaskForm_remd_a(forms.Form):
                    self.add_error('md_2d',msg)
 
 
+class TaskForm_dock(forms.Form):
+     name = forms.CharField(max_length=40,widget=forms.TextInput(attrs={'size':40, 'maxlength':40}))
+
+     file1 = forms.FileField(label='Upload a PDB file1',required=False,
+                  help_text='starting structure for chain1')
+     pdbid = forms.CharField(min_length=4,max_length=6,required=False,
+      widget=forms.TextInput(attrs={'size':6, 'maxlength':6, 'title':'PDB code or PDB code:chain id'}),
+      label='or PDB code (:chain)')                   
+
+
+     file2 = forms.FileField(label='Upload a PDB file2',required=False,
+                  help_text='starting structure for chain2')
+     pdbid2 = forms.CharField(min_length=4,max_length=6,required=False,
+      widget=forms.TextInput(attrs={'size':6, 'maxlength':6, 'title':'PDB code or PDB code:chain id'}),
+      label='or PDB code (:chain)')                   
+
+
+     md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
+                  help_text='total number of steps')
+     md_seed = forms.IntegerField(label='SEED',initial=-39912345,
+                  help_text='seed for random number generator')
+                  
+     def clean(self):
+             cleaned_data = super(TaskForm_dock, self).clean()
+
+             file1 = cleaned_data.get("file1")
+             pdbid = cleaned_data.get("pdbid")
+             file2 = cleaned_data.get("file2")
+             pdbid2 = cleaned_data.get("pdbid2")
+
+              
+             if not (file1 or pdbid):
+                msg = 'no PDB file or code for chain1'
+                self.add_error('file1', msg)
+
+             if not (file2 or pdbid2):
+                msg = 'no PDB file or code for chain2'
+                self.add_error('file2', msg)
+
+             if pdbid:
+                 msg=pdb_code_chain(pdbid)
+                 if msg != '':
+                   self.add_error('pdbid',msg)
+               
+             if file1:
+                 msg=pdb_missing_res_chain(file1,'')
+                 if msg != '':
+                   self.add_error('file1',msg)
+
+             if pdbid2:
+                 msg=pdb_code_chain(pdbid2)
+                 if msg != '':
+                   self.add_error('pdbid2',msg)
+               
+             if file2:
+                 msg=pdb_missing_res_chain(file2,'')
+                 if msg != '':
+                   self.add_error('file2',msg)
+
 
 class TaskForm_list(forms.Form):
-    name = forms.CharField(max_length=20,disabled=True,required=False)
+    name = forms.CharField(max_length=40,disabled=True,required=False)
     nrep = forms.IntegerField(disabled=True,required=False,label='NREP')
 
     def __init__(self, count, *args, **kwargs):