secondary structure restraints for md and remd
[django_unres.git] / django_simple / todo / views.py
index a29ae69..0387f29 100644 (file)
@@ -29,12 +29,45 @@ res_codes = [
 
 three_to_one = dict(res_codes)
 
+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)    
@@ -47,32 +80,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=[]
@@ -85,6 +110,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':
@@ -96,7 +123,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)]     
@@ -317,8 +344,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]+" "
 
@@ -494,8 +524,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]+" "