pdbid:chain added
[django_unres.git] / django_simple / todo / views.py
index 2f358cc..7045a7c 100644 (file)
@@ -20,16 +20,75 @@ res_codes = [
                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
                 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
                 ('CYX', 'C'),
+                ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
+                ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
+                ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
+                ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
+                ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),                
                ]
 
 three_to_one = dict(res_codes)
 
+def load_pdbid(pdbid,dirname):
+    os.mkdir(dirname)
+    if len(pdbid)==4:
+       file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
+                     dirname+'/plik.pdb')     
+    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:
+        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)
+       pdb_tmp.close()
+       file=dirname+'/plik.pdb'
+       
+    return(file)
+
+
+def seq_2d_from_pdb(seq_2d,seq):
+    if seq_2d =='':
+      return(seq_2d)
+    seq_2d=seq_2d.replace('C', '-')
+    seq_2d_tmp=''
+    ii=0
+    for i in range(0,len(seq)):
+      if seq[i]=='X':
+         seq_2d_tmp=seq_2d_tmp+'-'
+      else:
+         if len(seq_2d)>ii:
+            seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
+            ii+=1
+    tmp=''
+    for i in range(0,len(seq_2d_tmp),40):
+      tmp=tmp+seq_2d_tmp[i:i+40]+" "
+    return(tmp)
+
+def seq_2d_add_x(seq_2d,seq,seq_form):
+    if seq_2d =='':
+      return(seq_2d)
+    seq_2d=seq_2d[:len(seq_form)]
+    seq_2d=seq_2d.replace('C', '-')
+    if seq_form[0] !='X' and seq[0] == 'X':
+      seq_2d='-'+seq_2d
+    if seq_form[-1] !='X' and seq[-1] == 'X':
+      seq_2d=seq_2d+'-'
+    seq_2d=seq_2d[:len(seq)]
+    tmp=''
+    for i in range(0,len(seq_2d),40):
+      tmp=tmp+seq_2d[i:i+40]+" "
+    return(tmp)
+
 def seq_add_x(sequence):
-    if sequence[0] != 'G' and sequence[0] != 'g':
+    if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
         sequence='X'+sequence
-    if sequence[-1] != 'G' and sequence[-1] != 'g':
+    if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
         sequence=sequence+'X'
-    set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnghlrwaveym'
+    set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
     sequence = ''.join([c for c in sequence if c in set])
 
     return(sequence)    
@@ -42,32 +101,24 @@ def from_pdb(file):
     chain_start = {}
     chain_end = {}
     unres_shift = {}
-    chain=[]
-    ichain=0
+    chain_sorted=[]
     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])
               i = int(line[22:26])
+              ch = line[21:22]
               if newchain or i!=ires[-1]:
                 sequence.append(aa)
                 ires.append(i)
                 if newchain:
-                 if len(chain)>0:
-                  chain_start[chain[ichain]]=i
+                 chain_start[ch]=i
+                 chain_sorted.extend(ch)
                  newchain = False
             if line[0:3] == 'TER':
               sequence.append('XX')
-              if len(chain)>0:
-               chain_end[chain[ichain]]=i
-              ichain=ichain+1
+              chain_end[ch]=i
               newchain = True
             if line[0:6] == 'SSBOND':
               b=[]
@@ -80,6 +131,8 @@ def from_pdb(file):
               ssbond_ch.append(c)                                                                      
             if line[0:3] == 'END':
               break
+    if not sequence[-1] == 'XX':
+            chain_end[ch]=i
     while sequence[-1] == 'XX':
             del sequence[-1]
     if sequence[0] != 'G':
@@ -91,7 +144,7 @@ def from_pdb(file):
 #    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:
+    for c in chain_sorted:
       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)]     
@@ -105,7 +158,7 @@ def index(request):
     tasks = Task.objects.filter(owner=user).order_by('-created_date')
     variable = ''
     return render(request, "index.html", {
-            'tasks': tasks
+            'tasks': tasks, 'alldone': 0
         })
 
 @login_required
@@ -139,9 +192,7 @@ def add_min(request,task_id):
              task.jobdirname = "_".join([basename, suffix])
 
              if pdbid:
-              os.mkdir(task.jobdirname)
-              task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
-                     task.jobdirname+'/plik.pdb')     
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
               task.pdbcode=pdbid
              else:
               task.myfile1=form.cleaned_data["file1"]
@@ -177,7 +228,7 @@ def add_min_a(request,task_id):
         if form.is_valid():
              task.name=form.cleaned_data["name"]
              task.type="min"
-             task.min_choice=form.cleaned_data["min_choice"]
+#             task.min_choice=form.cleaned_data["min_choice"]
              task.min_overlap=form.cleaned_data["min_overlap"]
              task.min_searchsc=form.cleaned_data["min_searchsc"]
              task.min_maxmin=form.cleaned_data["min_maxmin"]
@@ -190,9 +241,7 @@ def add_min_a(request,task_id):
              
              pdbid=form.cleaned_data["pdbid"]
              if pdbid:
-              os.mkdir(task.jobdirname)
-              task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
-                     task.jobdirname+'/plik.pdb')     
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
               task.pdbcode=pdbid
              else:
               task.myfile1=form.cleaned_data["file1"]
@@ -246,9 +295,7 @@ def add_md(request,task_id):
 
              pdbid=form.cleaned_data["pdbid"]
              if pdbid:
-              os.mkdir(task.jobdirname)
-              task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
-                     task.jobdirname+'/plik.pdb')     
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
               task.pdbcode=pdbid
              else:
               task.myfile1=form.cleaned_data["file1"]
@@ -300,9 +347,7 @@ def add_md_a(request,task_id):
 
              pdbid=form.cleaned_data["pdbid"]
              if pdbid:
-              os.mkdir(task.jobdirname)
-              task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
-                     task.jobdirname+'/plik.pdb')     
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
               task.pdbcode=pdbid
              else:
               task.myfile1=form.cleaned_data["file1"]
@@ -312,8 +357,11 @@ def add_md_a(request,task_id):
              task.md_seq=""
              if task.md_start == "pdbstart" or task.md_pdbref:
                seq,task.ssbond=from_pdb(task.myfile1)
+               task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
              else:
                seq=seq_add_x(form.cleaned_data["md_seq"])
+               task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
+
              for i in range(0,len(seq),40):
                 task.md_seq=task.md_seq+seq[i:i+40]+" "
 
@@ -372,9 +420,7 @@ def add_remd(request,task_id):
 
              pdbid=form.cleaned_data["pdbid"]
              if pdbid:
-              os.mkdir(task.jobdirname)
-              task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
-                     task.jobdirname+'/plik.pdb')     
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
               task.pdbcode=pdbid
              else:
               task.myfile1=form.cleaned_data["file1"]
@@ -424,7 +470,7 @@ def add_remd_a(request,task_id):
         form = TaskForm_remd_a(initial=data)     
      elif '_example_saxs' in request.POST:
         data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
-         'md_nstep':200000,'md_lang':'langevin','unres_ff':'E0LL2Y',
+         'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2',
          'remd_cluter_temp':270, 
          'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
 """ 0.5     1.33868e-02
@@ -477,9 +523,7 @@ def add_remd_a(request,task_id):
 
              pdbid=form.cleaned_data["pdbid"]
              if pdbid:
-              os.mkdir(task.jobdirname)
-              task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
-                     task.jobdirname+'/plik.pdb')     
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
               task.pdbcode=pdbid
              else:
               task.myfile1=form.cleaned_data["file1"]
@@ -489,8 +533,11 @@ def add_remd_a(request,task_id):
              task.md_seq=""
              if task.md_start == "pdbstart" or task.md_pdbref:
                seq,task.ssbond=from_pdb(task.myfile1)
+               task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
              else:
                seq=seq_add_x(form.cleaned_data["md_seq"])
+               task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
+
              for i in range(0,len(seq),40):
                 task.md_seq=task.md_seq+seq[i:i+40]+" "
 
@@ -547,7 +594,7 @@ def addmlist(request,task_id):
              else:
               return redirect('/')
     else:
-      if task.unres_ff == 'E0LL2Y':
+      if task.unres_ff == 'FF2':
         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
         '["1", "1", "1", "1", "1", "1", "1", "1"]',
         'temperatures':
@@ -603,8 +650,11 @@ def refresh_done1(request, task_id):
 def refresh_done(request):
     user = request.user
     tasks = Task.objects.filter(owner=user).order_by('-created_date')
+    alldone = 1
     for task in tasks:
       refresh_done0(task)
+      if not task.done:
+         alldone=0
 
     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
     njob=0
@@ -622,7 +672,8 @@ def refresh_done(request):
     else:
      return render(request, "index.html", {
                 'tasks': tasks ,
-                'variable' : variable
+                'variable' : variable,
+                'alldone': alldone
                         })