docking - beta version, only basic
authorCezary Czaplewski <czarek@chem.univ.gda.pl>
Mon, 9 Apr 2018 12:49:33 +0000 (14:49 +0200)
committerCezary Czaplewski <czarek@chem.univ.gda.pl>
Mon, 9 Apr 2018 12:49:33 +0000 (14:49 +0200)
django_simple/todo/forms.py
django_simple/todo/jobfiles.py
django_simple/todo/models.py
django_simple/todo/templates/details.html
django_simple/todo/templates/edit.html
django_simple/todo/urls.py
django_simple/todo/views.py
files/generator_v7 [new file with mode: 0755]

index c279f08..45e78bf 100644 (file)
@@ -495,6 +495,65 @@ 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=40,disabled=True,required=False)
index 44cf4a4..6328f4e 100644 (file)
@@ -164,12 +164,15 @@ CUTOFF=7.00000 WCORR4=0.00000"""
           if instance.md_mdpdb:
             type_line = type_line + ' mdpdb '
 
-       if instance.type == 'remd' :
+       if instance.type == 'remd' or instance.type == 'dock':
           control_line = 'SEED='+str(instance.md_seed)+' '\
            +instance.md_start +' re one_letter'\
            + ' BOXX='+str(instance.boxx) \
            + ' BOXY='+str(instance.boxy) \
            + ' BOXZ='+str(instance.boxz) +' '
+          
+          if instance.type == 'dock':
+             control_line = control_line+'CONSTR_HOMOL=20 '             
            
           if instance.md_pdbref:
              control_line = control_line+'pdbref '
@@ -221,14 +224,14 @@ CUTOFF=7.00000 WCORR4=0.00000"""
        f.write(word_list[-1]+'\n')
           
        if instance.md_start == 'pdbstart':
-        if instance.type == 'remd' :
+        if instance.type == 'remd' or instance.type == 'dock':
          f.write('print_min_ini print_min_res print_min_stat maxfun='+
            str(instance.min_maxfun)+'\n')
         else:
          f.write('print_min_ini print_min_res print_min_stat\n')
 
        
-       if instance.type == 'remd' :
+       if instance.type == 'remd' or instance.type == 'dock':
           word_list = wrapper.wrap(text=type_line2)
           for element in word_list[:-1]:
               f.write('{:79}'.format(element)+'&\n')
@@ -254,12 +257,23 @@ CUTOFF=7.00000 WCORR4=0.00000"""
 
 
        if instance.type == 'min' or instance.md_start == 'pdbstart':
-          f.write('plik.pdb\n')
+          if instance.type == 'dock':
+            f.write('model01.pdb\n')
+          else:  
+            f.write('plik.pdb\n')
           f.write(write_ssbond(instance.ssbond))
           if instance.md_2d == '':
             f.write('0\n')
           else:
             f.write(seq_2d_write(seq_2d_xx(instance.md_2d,seq)))
+        
+       if instance.type == 'dock':
+          f.write('HOMOL_DIST=0.1    HOMOL_ANGLE=1.0 HOMOL_THETA=1.0 HOMOL_SCD=1.0 DIST_CUT=15.0  &\n')
+          f.write('READ2SIGMA START_FROM_MODELS\n')
+          for i in range(1,10):
+           f.write('model0'+str(i)+'.pdb\n')
+          for i in range(10,21):
+           f.write('model'+str(i)+'.pdb\n')
 
        if instance.type == 'md' and instance.md_start != 'pdbstart':
 
@@ -363,6 +377,9 @@ CUTOFF=7.00000 WCORR4=0.00000"""
            f2.write(line.replace('#PBS -l nodes=4:ppn=4', pbs))
           elif '$ssbond' in line:
            f2.write(line.replace('$ssbond',tmp_ss))
+          elif 'cd $PBS_O_WORKDIR' in line and instance.type == 'dock':
+            f2.write(line)
+            f2.write('../files/generator_v7 plik.pdb plik2.pdb\n')
           else:
            tmp1=json.loads(instance.remd_multi_t)
            f2.write(line.replace('$temperatures','"'+" ".join(tmp1)+'" '+str(nreplicas)))
@@ -392,6 +409,8 @@ CUTOFF=7.00000 WCORR4=0.00000"""
               ' einicheck=1 rescale=2 delta=0.02 cxfile')+'&\n')
           if instance.md_2d != '':
                f.write('{:79}'.format(' WITH_DIHED_CONSTR')+'&\n')
+          if instance.type == 'dock':
+               f.write('{:79}'.format(' n_ene=19 CONSTR_HOMOL=20')+'&\n')
           f.write('BOXX='+str(instance.boxx)+' BOXY='+str(instance.boxy)+
                     ' BOXZ='+str(instance.boxz)+cntrl_saxs +'\n')
                  
@@ -401,6 +420,14 @@ CUTOFF=7.00000 WCORR4=0.00000"""
 
           f.write(write_ssbond(instance.ssbond))
 
+          if instance.type == 'dock':
+            f.write('HOMOL_DIST=0.1    HOMOL_ANGLE=1.0 HOMOL_THETA=1.0 HOMOL_SCD=1.0 DIST_CUT=15.0  &\n')
+            f.write('READ2SIGMA \n')
+            for i in range(1,10):
+              f.write('model0'+str(i)+'.pdb\n')
+            for i in range(10,21):
+              f.write('model'+str(i)+'.pdb\n')
+
           if instance.md_2d != '':
              f.write(seq_2d_write_50(seq_2d_xx(instance.md_2d,seq)))
 
@@ -449,12 +476,21 @@ CUTOFF=7.00000 WCORR4=0.00000"""
              +' temper='+str(instance.remd_cluter_temp))+'&\n')
           if instance.md_2d != '':
                f.write('{:79}'.format(' WITH_DIHED_CONSTR')+'&\n')
+          if instance.type == 'dock':
+               f.write('{:79}'.format(' CONSTR_HOMOL=20')+'&\n')
           f.write('BOXX='+str(instance.boxx)+' BOXY='+str(instance.boxy)+
                   ' BOXZ='+str(instance.boxz)+cntrl_saxs +'\n')
           f.write(w+'\n')
           for i in range(0,len(seq),80):
              f.write(seq[i:i+80]+'\n')
           f.write(write_ssbond(instance.ssbond))
+          if instance.type == 'dock':
+            f.write('HOMOL_DIST=0.1    HOMOL_ANGLE=1.0 HOMOL_THETA=1.0 HOMOL_SCD=1.0 DIST_CUT=15.0  &\n')
+            f.write('READ2SIGMA \n')
+            for i in range(1,10):
+              f.write('model0'+str(i)+'.pdb\n')
+            for i in range(10,21):
+              f.write('model'+str(i)+'.pdb\n')
           if instance.md_2d != '':
              f.write(seq_2d_write_50(seq_2d_xx(instance.md_2d,seq)))
           if instance.saxs_data != '':
index 3c93f63..fc0f358 100644 (file)
@@ -17,6 +17,10 @@ def user_directory_path(instance, filename):
     # file will be uploaded to MEDIA_ROOT/<jobdirname>/plik.pdb
     return '{0}/{1}'.format(instance.jobdirname, 'plik.pdb')
 
+def user_directory_path2(instance, filename):
+    # file will be uploaded to MEDIA_ROOT/<jobdirname>/plik2.pdb
+    return '{0}/{1}'.format(instance.jobdirname, 'plik2.pdb')
+
 
 # Create your models here.
 class Task(models.Model):
@@ -85,7 +89,10 @@ class Task(models.Model):
     scal_rad = models.FloatField(default=1.0)
     wsaxs = models.FloatField(default=1000.0)
     saxs_data = models.TextField(max_length=10000,default='')
-        
+
+#dock
+    myfile2 = models.FileField(default='',upload_to=user_directory_path2)        
+    pdbcode2 = models.CharField(max_length=6,default='')
     
 # system    
     ready = models.BooleanField(default=False)
index af52ac5..783ed7e 100644 (file)
@@ -209,7 +209,7 @@ Created {{ task.created_date  }}
                        
         {% endif %}
 
-        {% if task.type == "remd" %}
+        {% if task.type == "remd" or task.type == "dock" %}
 
                        <li class="list-group-item task-item">
                            <div class="col-md-6"> nrep </div>
@@ -228,6 +228,17 @@ Created {{ task.created_date  }}
                            <div class="col-md-6"> pdb code</div>
                            <div class="col-md-6">{{ task.pdbcode }}</div>
                        </li>           
+                       {% if task.type == "dock" %}
+                       <li class="list-group-item task-item">
+                           <div class="col-md-6"> input pdb2 </div>
+                           <div class="col-md-6">{{ task.myfile2 }}</div>
+                       </li>           
+                       <li class="list-group-item task-item">
+                           <div class="col-md-6"> pdb code2</div>
+                           <div class="col-md-6">{{ task.pdbcode2 }}</div>
+                       </li>           
+                       
+                       {% endif %}
                        <li class="list-group-item task-item">
                            <div class="col-md-6"> seed </div>
                            <div class="col-md-6">{{ task.md_seed}}</div>
@@ -506,7 +517,7 @@ Created {{ task.created_date  }}
 
                        {% endif %}
                        
-                       {% if task.type == "remd" %}
+                       {% if task.type == "remd" or task.type == "dock" %}
                        
                        <li class="list-group-item task-item">
                          <div class="col-md-2"> Energy histogram </div>
@@ -786,7 +797,7 @@ $('.majorpointslegend').click(function(){
 });
 </script>
 
-{% if task.type == "remd" %}
+{% if task.type == "remd" or task.type == "dock" %}
 <script>
 function display_model(numstr){
 
index 3423543..626cccb 100644 (file)
  <input type="submit" class="btn btn-default" value="MREMD" name="p4btn"></button>
  </form>
 
+ <form action="../../add_dock/{{task.id}}/" method="get"
+ style="text-align;float:left;">
+ {% csrf_token %}
+ <input type="submit" class="btn btn-default" value="DOCK" name="p5btn"></button>
+ </form>
+
 
 {% else %}
  <form action=".." method="get" style="text-align;float:right;">
  <input type="submit" class="btn btn-default" value="MREMD" name="p4btn"></button>
  </form>
 
+ <form action="../../../add_dock/{{task.id}}/adv/" method="get"
+ style="text-align;float:left;">
+ {% csrf_token %}
+ <input type="submit" class="btn btn-default" value="DOCK" name="p5btn"></button>
+ </form>
+
 
 
 {% endif %}
index fa25f34..e6d65b7 100644 (file)
@@ -15,6 +15,8 @@ urlpatterns = [
        url(r'^add_md/(?P<task_id>\d+)/adv/$', views.add_md_a,name='add_md_a'),         
        url(r'^add_remd/(?P<task_id>\d+)/$', views.add_remd,name='add_remd'),   
        url(r'^add_remd/(?P<task_id>\d+)/adv/$', views.add_remd_a,name='add_remd_a'),           
+       url(r'^add_dock/(?P<task_id>\d+)/$', views.add_dock,name='add_dock'),   
+       url(r'^add_dock/(?P<task_id>\d+)/adv/$', views.add_dock_a,name='add_dock_a'),                   
        url(r'^add_mlist/(?P<task_id>\d+)/$', views.addmlist,name='addmlist'),          
         url(r'^details/(?P<task_id>\d+)/$', views.details,name='details'),
         url(r'^details1/(?P<user_id>\w+)/(?P<task_id>\d+)/$', views.details1,name='details1'),        
index 0e61389..8ad5060 100644 (file)
@@ -30,23 +30,26 @@ res_codes = [
 
 three_to_one = dict(res_codes)
 
-def load_pdbid(pdbid,dirname):
-    os.mkdir(dirname)
+def load_pdbid(pdbid,dirname,filename='plik.pdb'):
+    if (not os.path.isdir(dirname)):
+       os.mkdir(dirname)
     if len(pdbid)==4:
        file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
-                     dirname+'/plik.pdb')     
+                     dirname+'/'+filename)     
     else:
        chain=pdbid[5]
        pdbid=pdbid[:4]
        pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
-       with open(dirname+'/plik.pdb', 'w') as outfile:
+       with open(dirname+'/'+filename, 'w') as outfile:
         for line in pdb_tmp:
           if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
             outfile.write(line)
           if line[0:6] == 'ATOM  ' and line[21] == chain:
             outfile.write(line)
+          if line[0:6] == 'ENDMDL':
+            break
        pdb_tmp.close()
-       file=dirname+'/plik.pdb'
+       file=dirname+'/'+filename
        
     return(file)
 
@@ -704,6 +707,146 @@ def add_remd_a(request,task_id):
     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
 
 @login_required
+def add_dock(request,task_id):
+    task = get_object_or_404(Task, id=task_id)
+    if request.method == 'POST':
+     if '_example' in request.POST:
+        data= {'name':task.name,'pdbid':'1L2Y','md_seed':-39912345}
+        form = TaskForm_dock(initial=data)     
+     else:
+        form = TaskForm_dock(request.POST,request.FILES)
+        if form.is_valid():
+             task.name=form.cleaned_data["name"]
+             task.type="dock"
+
+             basename = str(task.owner)
+             suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+             task.jobdirname = "_".join([basename, suffix])
+
+             pdbid=form.cleaned_data["pdbid"]
+             if pdbid:
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
+              task.pdbcode=pdbid
+             else:
+              task.myfile1=form.cleaned_data["file1"]
+
+             pdbid2=form.cleaned_data["pdbid2"]
+             if pdbid2:
+              task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
+              task.pdbcode2=pdbid2
+             else:
+              task.myfile2=form.cleaned_data["file2"]
+
+             task.md_ntwx=task.remd_nstex 
+             task.md_start="pdbstart"
+             task.md_pdbref=True
+             task.md_respa=False
+             task.ssbond=""
+
+             task.md_seq=""
+
+             seq1,ssbond1=from_pdb(task.myfile1)
+             seq2,ssbond2=from_pdb(task.myfile2)
+             
+             if seq1[-1]=='X' and seq2[0]=='X':
+              seq=seq1+seq2
+             elif seq1[-1]!='X' and seq2[0]!='X':
+              seq=seq1+'XX'+seq2
+             else:
+              seq=seq1+'X'+seq2
+             
+             for i in range(0,len(seq),40):
+                task.md_seq=task.md_seq+seq[i:i+40]+" "
+
+             task.md_seed=form.cleaned_data["md_seed"]
+
+             task.md_nstep=form.cleaned_data["md_nstep"]
+
+             if any(c.islower() for c in seq):
+              task.md_respa=False
+              task.damino=True
+
+
+             task.ready=True
+             
+             
+             task.save()
+             if is_lazy_user(request.user):
+              return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
+             else:
+              return redirect('/')
+    else:
+        data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
+        form = TaskForm_dock(initial=data)
+    basic_adv=True
+    p_type='docking'
+    return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+
+@login_required
+def add_dock_a(request,task_id):
+    task = get_object_or_404(Task, id=task_id)
+    if request.method == 'POST':
+     if '_example' in request.POST:
+        data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
+        form = TaskForm_remd(initial=data)     
+     else:
+        form = TaskForm_remd(request.POST,request.FILES)
+        if form.is_valid():
+             task.name=form.cleaned_data["name"]
+             task.type="remd"
+             task.md_start=form.cleaned_data["md_start"]
+
+             basename = str(task.owner)
+             suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+             task.jobdirname = "_".join([basename, suffix])
+
+             pdbid=form.cleaned_data["pdbid"]
+             if pdbid:
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
+              task.pdbcode=pdbid
+             else:
+              task.myfile1=form.cleaned_data["file1"]
+             task.md_pdbref=form.cleaned_data["md_pdbref"]
+             task.md_ntwx=task.remd_nstex 
+
+             task.md_seq=""
+             if task.md_start == "pdbstart" or task.md_pdbref:
+               seq,task.ssbond=from_pdb(task.myfile1)
+             else:
+               seq=seq_add_x(form.cleaned_data["md_seq"])
+             for i in range(0,len(seq),40):
+                task.md_seq=task.md_seq+seq[i:i+40]+" "
+
+             if task.md_start != "pdbstart":
+                task.ssbond=''
+
+             task.md_seed=form.cleaned_data["md_seed"]
+
+             task.md_nstep=form.cleaned_data["md_nstep"]
+
+             if any(c.islower() for c in seq):
+              task.md_respa=False
+              task.damino=True
+
+
+             task.ready=True
+             
+             
+             task.save()
+             if is_lazy_user(request.user):
+              return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
+             else:
+              return redirect('/')
+    else:
+        data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
+        form = TaskForm_remd(initial=data)
+    basic_adv=False
+    p_type='docking - advanced options'
+    return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+
+
+
+@login_required
 def addmlist(request,task_id):
     task = get_object_or_404(Task, id=task_id)
     if request.method == 'POST':
@@ -831,7 +974,7 @@ def refresh_done0(task):
                if 'Total wall' in line:
                   text=text+line
                   
-           elif task.type=='remd':
+           elif task.type=='remd' or task.type=='dock':
              j=0
              text="Acceptance for replica exchanges and number of exchange attempts\n"
              for line in f:
diff --git a/files/generator_v7 b/files/generator_v7
new file mode 100755 (executable)
index 0000000..f12d7c9
Binary files /dev/null and b/files/generator_v7 differ