number of clusters <> 5
[django_unres.git] / django_simple / todo / views.py
index 1157bfa..4db3747 100644 (file)
@@ -10,6 +10,10 @@ import json
 from lazysignup.decorators import allow_lazy_user
 from lazysignup.utils import is_lazy_user
 import random
+import logging
+
+logging.basicConfig()
+logger = logging.getLogger(__name__)
 
 res_codes = [
                 # 20 canonical amino acids
@@ -30,6 +34,29 @@ res_codes = [
 
 three_to_one = dict(res_codes)
 
+def dock_box(file):
+   import math
+   coord = list()
+   for line in file:
+            if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
+              x=float(line[30:38])
+              y=float(line[38:46])
+              z=float(line[46:54])
+              coord.append([x, y, z])
+            if line[0:3] == 'END':
+              break
+   maxd=0
+   l=len(coord)
+   for i in xrange(l):
+      for j in xrange(i+1,l):
+        p1=coord[i]
+        p2=coord[j]
+        d=(p1[0]-p2[0])**2 + (p1[1]-p2[1])**2 + (p1[2]-p2[2])**2
+        if d > maxd:
+          maxd=d
+   return math.sqrt(maxd)
+
+
 def load_pdbid(pdbid,dirname,filename='plik.pdb'):
     if (not os.path.isdir(dirname)):
        os.mkdir(dirname)
@@ -718,7 +745,7 @@ 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}
+        data= {'name':task.name,'pdbid':'1BON:A','pdbid2':'1BON:B','md_seed':-12396738,'md_nstep':500000}
         form = TaskForm_dock(initial=data)     
      else:
         form = TaskForm_dock(request.POST,request.FILES)
@@ -741,19 +768,28 @@ def add_dock(request,task_id):
              if pdbid2:
               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
               task.pdbcode2=pdbid2
+              seq2,ssbond2=from_pdb(task.myfile2)
              else:
               task.myfile2=form.cleaned_data["file2"]
+              if not task.myfile2:
+                seq2=seq_add_x(form.cleaned_data["md_seq"])
+                task.md_seq2=seq2
+              else:
+                seq2,ssbond2=from_pdb(task.myfile2)
 
              task.md_ntwx=task.remd_nstex 
              task.md_start="pdbstart"
-             task.md_pdbref=True
+             task.remd_multi_m='["3", "3", "3", "3", "3", "3", "3", "3"]'
+             if task.md_seq2 =='':  
+               task.md_pdbref=True
              task.md_respa=False
              task.ssbond=""
+             task.dock_peptide=form.cleaned_data["dock_peptide"]
 
              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
@@ -768,13 +804,23 @@ def add_dock(request,task_id):
              task.md_seed=form.cleaned_data["md_seed"]
 
              task.md_nstep=form.cleaned_data["md_nstep"]
+             task.md_total_steps=task.md_nstep
 
              if any(c.islower() for c in seq):
               task.md_respa=False
               task.damino=True
 
-
+             box1=dock_box(task.myfile1)
+             if task.myfile2:
+              box2=dock_box(task.myfile2)
+             else:
+              box2=len(task.md_seq2)*2.0
+             task.boxx=(box1+box2)*1.2+20
+             task.boxy=(box1+box2)*1.2+20
+             task.boxz=(box1+box2)*1.2+20
+             
              task.ready=True
+
              
              
              task.save()
@@ -794,14 +840,15 @@ 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)     
+        data= {'name':task.name,'pdbid':'2HPL:A','md_seq':'DDLYG','dock_peptide':True,'md_seed':-39912345,'md_nstep':600000}
+        form = TaskForm_dock_a(initial=data)     
+        task.example='dock_peptide'
+        task.save()
      else:
-        form = TaskForm_remd(request.POST,request.FILES)
+        form = TaskForm_dock_a(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"]
+             task.type="dock"
 
              basename = str(task.owner)
              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
@@ -813,40 +860,81 @@ def add_dock_a(request,task_id):
               task.pdbcode=pdbid
              else:
               task.myfile1=form.cleaned_data["file1"]
-             task.md_pdbref=form.cleaned_data["md_pdbref"]
-             task.md_ntwx=task.remd_nstex 
+              
+             pdbid2=form.cleaned_data["pdbid2"]
+             if pdbid2:
+              task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
+              task.pdbcode2=pdbid2
+              seq2,ssbond2=from_pdb(task.myfile2)
+             else:
+              task.myfile2=form.cleaned_data["file2"]
+              if not task.myfile2:
+                seq2=seq_add_x(form.cleaned_data["md_seq"])
+                task.md_seq2=seq2
+              else:
+                seq2,ssbond2=from_pdb(task.myfile2)
+              
 
+             task.md_ntwx=task.remd_nstex 
+             task.md_start="pdbstart"
+             if task.md_seq2 =='':
+               task.md_pdbref=True
+             task.md_respa=False
+             task.ssbond=""
+             task.dock_peptide=form.cleaned_data["dock_peptide"]
+              
              task.md_seq=""
-             if task.md_start == "pdbstart" or task.md_pdbref:
-               seq,task.ssbond=from_pdb(task.myfile1)
+
+             seq1,ssbond1=from_pdb(task.myfile1)
+             
+             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=seq_add_x(form.cleaned_data["md_seq"])
+              seq=seq1+'X'+seq2
+             
              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"]
+             task.md_total_steps=task.md_nstep
+             
+             task.md_dt=form.cleaned_data["md_dt"]
+             task.md_lang=form.cleaned_data["md_lang"]
+             task.md_tau=form.cleaned_data["md_tau"]
+             task.md_scal_fric=form.cleaned_data["md_scal_fric"]
+             task.min_maxfun=form.cleaned_data["min_maxfun"]
+             task.remd_nrep=form.cleaned_data["remd_nrep"]
+             task.remd_nstex=form.cleaned_data["remd_nstex"]
+             task.md_ntwx=form.cleaned_data["md_ntwx"]             
+             task.md_ntwe=form.cleaned_data["md_ntwe"]
+
+             task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
+             task.remd_cluster_n=form.cleaned_data["remd_cluster_n"]
+             task.unres_ff=form.cleaned_data["unres_ff"]
 
              if any(c.islower() for c in seq):
               task.md_respa=False
               task.damino=True
 
+             box1=dock_box(task.myfile1)
+             if task.myfile2:
+              box2=dock_box(task.myfile2)
+             else:
+              box2=len(task.md_seq2)*2.0
+             task.boxx=(box1+box2)*1.2+20
+             task.boxy=(box1+box2)*1.2+20
+             task.boxz=(box1+box2)*1.2+20
 
-             task.ready=True
-             
-             
              task.save()
-             if is_lazy_user(request.user):
-              return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
-             else:
-              return redirect('/')
+             return redirect('addmlist',task_id=task.id)
+
     else:
         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
-        form = TaskForm_remd(initial=data)
+        form = TaskForm_dock_a(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})
@@ -875,6 +963,12 @@ def addmlist(request,task_id):
         'temperatures':
         '["270", "280", "290", "300", "310", "320", "330", "340"]'
         }
+      elif  task.example == 'dock_peptide':
+        data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
+        '["4", "8", "4", "4", "4", "4", "4", "4"]',
+        'temperatures':
+        '["270", "280", "290", "300", "310", "320", "330", "345"]'
+        }
       elif task.unres_ff == 'FF2':
         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
         '["1", "1", "1", "1", "1", "1", "1", "1"]',
@@ -895,12 +989,30 @@ def addmlist(request,task_id):
 @login_required
 def details(request,task_id):
     task = get_object_or_404(Task, id=task_id)
-    return render(request, "details.html",{'task':task})
+    try:
+     remd_models=json.loads(task.remd_models)
+    except:
+     remd_models=[]
+     remd_models.append(task.remd_model1)
+     remd_models.append(task.remd_model2)
+     remd_models.append(task.remd_model3)
+     remd_models.append(task.remd_model4)
+     remd_models.append(task.remd_model5)
+    return render(request, "details.html",{'task':task,'remd_models':remd_models,'range':range(1,task.remd_cluster_n+1)})
 
 
 def details1(request,user_id,task_id):
     task = get_object_or_404(Task, id=task_id)
-    return render(request, "details1.html",{'task':task})
+    try:
+     remd_models=json.loads(task.remd_models)
+    except:
+     remd_models=[]
+     remd_models.append(task.remd_model1)
+     remd_models.append(task.remd_model2)
+     remd_models.append(task.remd_model3)
+     remd_models.append(task.remd_model4)
+     remd_models.append(task.remd_model5)
+    return render(request, "details1.html",{'task':task,'remd_models':remd_models,'range':range(1,task.remd_cluster_n+1)})
 
 
 @login_required
@@ -937,7 +1049,7 @@ def restart0(task):
       add_restart_inp()
       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
       os.chdir('..')
-    elif task.type == 'remd':
+    elif task.type == 'remd' or task.type == 'dock':
       os.chdir(task.jobdirname)
       add_restart_inp()
       tmp1=json.loads(task.remd_multi_m)
@@ -958,6 +1070,15 @@ def restart0(task):
             f2.write(line)
       os.remove('file_wham.inp')
       os.rename('file_wham.tmp','file_wham.inp')
+      if task.type == 'dock':
+        with open('pbs8.csh','r') as f1, open ('pbs8.tmp','w') as f2:
+          for line in f1:
+            if 'generator_v13' in line:
+              f2.write('#'+line)
+            else:
+              f2.write(line)
+        os.remove('pbs8.csh')
+        os.rename('pbs8.tmp','pbs8.csh')
       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
       os.chdir('..')
     return
@@ -1062,25 +1183,17 @@ def refresh_done0(task):
          task.results_text=text
 
 
-         if task.md_pdbref and task.type=='remd':
+         remd_models=[]
+         if task.md_pdbref and task.type=='remd' or task.type=='dock' and task.md_seq2 == '':
          
-          for i in range(1,6):
+          for i in range(1,task.remd_cluster_n+1):
            try:
             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
                  line=f.readline()
-                 if i==1:
-                     task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
-                 elif i==2:
-                     task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
-                 elif i==3:
-                     task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
-                 elif i==4:
-                     task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
-                 elif i==5:
-                     task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
+                 remd_models.append('Cluster'+str(i)+' '+' '.join(line.split()[-3:]))
            except EnvironmentError:
             print 'file_wham_T*pdb open error'
-          for i in range(1,6):
+          for i in range(1,task.remd_cluster_n+1):
             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
                text=''
                for line in f:
@@ -1091,20 +1204,30 @@ def refresh_done0(task):
                  if 'GDT-TS-score=' in line:
                    text=text+' GDT_TS='+line.split()[1]
                     
-               if i==1:
-                     task.remd_model1=task.remd_model1+text
-               elif i==2:
-                     task.remd_model2=task.remd_model2+text
-               elif i==3:
-                     task.remd_model3=task.remd_model3+text
-               elif i==4:
-                     task.remd_model4=task.remd_model4+text
-               elif i==5:
-                     task.remd_model5=task.remd_model5+text
-
-
-
-         if task.type=='remd':  
+               remd_models[i-1]=remd_models[i-1]+text
+          
+          if task.type=='dock':
+           for i in range(1,task.remd_cluster_n+1):
+            with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
+               text=''
+               for line in f:
+                 if 'Fnat' in line:
+                   text=' Fnat='+line.split()[1]
+                 if 'iRMS' in line:
+                   text=text+' iRMS='+line.split()[1]
+                 if 'LRMS' in line:
+                   text=text+' LRMS='+line.split()[1]
+                 if 'CAPRI' in line and not 'DockQ_CAPRI' in line:
+                   text=text+' CAPRI='+line.split()[1]
+                 if 'DockQ_CAPRI' in line:
+                   text=text+' DockQ_CAPRI= '+line.split()[1]
+                 if 'DockQ ' in line:
+                   text=text+' DockQ='+line.split()[1]
+
+               remd_models[i-1]=remd_models[i-1]+text
+#               logger.warning("models %d %s" % (i,remd_models))
+
+         if task.type=='remd' or task.type=='dock':  
           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
 
            for line in f:
@@ -1112,21 +1235,16 @@ def refresh_done0(task):
                 i=0
                 for line1 in f:
                   i+=1
-                  if i>6:
+                  if i>task.remd_cluster_n:
                        break
-                  if i==1:
-                     task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
-                  elif i==2:
-                     task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
-                  elif i==3:
-                     task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
-                  elif i==4:
-                     task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
-                  elif i==5:
-                     task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
+                  try:
+                    remd_models[i-1]=remd_models[i-1]+' Cluster'+str(i)+' probability= '+line1.split()[-2]
+                  except:
+                    if len(line1.split())==4:
+                     remd_models.append(' Cluster'+str(i)+' probability= '+line1.split()[-2])
                      
-         
-
+         task.remd_models=json.dumps(remd_models)
+#         logger.warning("models%s" % task.remd_models)
          task.save()
       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
          if (task.type=='min'):
@@ -1161,3 +1279,24 @@ def refresh_done0(task):
 
     
       return  
+
+@login_required
+def zip_all_files(request, task_id):
+    import os, zipfile
+    from django.http import HttpResponse
+    from wsgiref.util import FileWrapper
+    from django.core.files.temp import NamedTemporaryFile
+
+    task = get_object_or_404(Task, id=task_id)
+
+    temp=NamedTemporaryFile()
+    archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
+    for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
+       for file1 in filenames:
+         archive.write(dirpath+"/"+file1,file1)
+    archive.close()
+    temp.seek(0)
+    wrapper = FileWrapper(temp)
+    response = HttpResponse(wrapper, content_type='application/zip')
+    response['Content-Disposition'] = 'attachment; filename=all.zip'
+    return response