problems with json ssbond
[django_unres.git] / django_simple / todo / views.py
index 521517a..4ffb0e7 100644 (file)
@@ -5,6 +5,8 @@ from .forms import *
 from .models import Task
 import datetime
 import os
+import subprocess
+import json
 
 res_codes = [
                 # 20 canonical amino acids
@@ -14,6 +16,8 @@ res_codes = [
                 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
                 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
+                ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
+                ('CYX', 'C'),
                ]
 
 three_to_one = dict(res_codes)
@@ -31,21 +35,48 @@ def seq_add_x(sequence):
 def from_pdb(file):
     sequence = []
     ssbond = []
+    ssbond_ch = []
+    ires = []
+    chain_start = {}
+    chain_end = {}
+    unres_shift = {}
+    chain=[]
+    ichain=0
+    newchain = True
+    
     for line in file:
+            if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
+              tmp=line[18:]
+              chain_=tmp.split(', ')
+              chain_[-1]=chain_[-1][0]
+              chain.extend(chain_)
+    
             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
               aa = three_to_one.get(line[17:20])
-              sequence.append(aa)
+              i = int(line[22:26])
+              if newchain or i!=ires[-1]:
+                sequence.append(aa)
+                ires.append(i)
+                if newchain:
+                 chain_start[chain[ichain]]=i
+                 newchain = False
             if line[0:3] == 'TER':
               sequence.append('XX')
+              chain_end[chain[ichain]]=i
+              ichain=ichain+1
+              newchain = True
             if line[0:6] == 'SSBOND':
               b=[]
               b.append(int(line[17:21]))
               b.append(int(line[31:35]))
               ssbond.append(b)
-                                                                                    
+              c = []
+              c.append((line[15:16]))
+              c.append((line[29:30]))
+              ssbond_ch.append(c)                                                                      
             if line[0:3] == 'END':
               break
-    if sequence[-1] == 'XX':
+    while sequence[-1] == 'XX':
             del sequence[-1]
     if sequence[0] != 'G':
             sequence.insert(0,'X')
@@ -53,13 +84,22 @@ def from_pdb(file):
     if sequence[-1] != 'G':
             sequence.append('X')
     seq=''.join(sequence)
-    return seq,ssbond
+#    if ires[0] != 1:
+#            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
+    i=0
+    for c in chain:
+      unres_shift[c]=i+chain_start[c]
+      i=i-(chain_end[c]-chain_start[c])-3
+    ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]     
+
+    return seq,json.dumps(ssbond)
 
 
 @login_required
 def index(request):
     user = request.user
     tasks = Task.objects.filter(owner=user)
+    variable = ''
     return render(request, "index.html", {
             'tasks': tasks
         })
@@ -121,6 +161,7 @@ def add_min_a(request,task_id):
              task.min_pdbout=form.cleaned_data["min_pdbout"]
              task.myfile1=form.cleaned_data["file1"]
              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
+             task.unres_ff=form.cleaned_data["unres_ff"]
 
              seq,task.ssbond=from_pdb(task.myfile1)
              task.md_seq=""
@@ -218,7 +259,7 @@ def add_md_a(request,task_id):
              task.md_tau=form.cleaned_data["md_tau"]
              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
-
+             task.unres_ff=form.cleaned_data["unres_ff"]
              
              task.ready=True
              basename = str(task.owner)
@@ -245,6 +286,7 @@ def add_remd(request,task_id):
              task.md_start=form.cleaned_data["md_start"]
              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:
@@ -308,10 +350,13 @@ def add_remd_a(request,task_id):
              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
              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_traj1file=form.cleaned_data["remd_traj1file"]
 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
 
              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
+             task.unres_ff=form.cleaned_data["unres_ff"]
              
              basename = str(task.owner)
              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
@@ -400,24 +445,104 @@ def refresh_done(request):
                if 'Total wall' in line:
                   text=text+line
                        
-
          task.results_text=text
 
 
+         if task.md_pdbref and task.type=='remd':
+         
+          for i in range(1,6):
+            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=' '.join(line.split()[-6:])
+                 elif i==2:
+                     task.remd_model2=' '.join(line.split()[-6:])
+                 elif i==3:
+                     task.remd_model3=' '.join(line.split()[-6:])
+                 elif i==4:
+                     task.remd_model4=' '.join(line.split()[-6:])
+                 elif i==5:
+                     task.remd_model5=' '.join(line.split()[-6:])
+
+          for i in range(1,6):
+            with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
+               text=''
+               for line in f:
+                 if 'RMSD of  the common residues=' in line:
+                   text=' RMSD='+line.split()[5]
+                 if 'TM-score    =' in line:
+                   text=text+' TMscore='+line.split()[2]
+                 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':  
+          with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
+
+           for line in f:
+             if 'sumprob' in line:
+                i=0
+                for line1 in f:
+                  i+=1
+                  if i>6:
+                       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]
+                     
+         
+
          task.save()
       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
          if (task.type=='min'):
            task.running =1
          else:
            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
+              line=''
               for line in f:
                 pass
-              if line:
+              if line != '':
                 last = line.split()[0]
               else:
                 last = 0
-           task.running=1+int(last)*100.0/task.md_nstep
+           task.running=int(1+int(last)*100.0/task.md_nstep)
            if task.running>100:
              task.running=100
          task.save()
-    return redirect('/')        
+
+    proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
+    njob=0
+    nq=0
+    for line in proc.stdout:
+      if 'piasek4' in line:
+        if line.split()[1]=='test_server':
+          njob+=1
+          if line.split()[-2]=='Q':
+            nq+=1
+    variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
+
+    return render(request, "index.html", {
+                'tasks': tasks ,
+                'variable' : variable
+                        })
+    
+#   return redirect('/')