problems with json ssbond
[django_unres.git] / django_simple / todo / views.py
1 from django.contrib.auth.decorators import login_required
2 from django.shortcuts import redirect, render, get_object_or_404
3 from django.contrib.auth.models import User
4 from .forms import *
5 from .models import Task
6 import datetime
7 import os
8 import subprocess
9 import json
10
11 res_codes = [
12                 # 20 canonical amino acids
13                 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
14                 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
15                 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
16                 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
17                 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
18                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
19                 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
20                 ('CYX', 'C'),
21                ]
22
23 three_to_one = dict(res_codes)
24
25 def seq_add_x(sequence):
26     if sequence[0] != 'G':
27         sequence='X'+sequence
28     if sequence[-1] != 'G':
29         sequence=sequence+'X'
30     set ='CDSQKIPTFNGHLRWAVEYMX'
31     sequence = ''.join([c for c in sequence if c in set])
32
33     return(sequence)    
34
35 def from_pdb(file):
36     sequence = []
37     ssbond = []
38     ssbond_ch = []
39     ires = []
40     chain_start = {}
41     chain_end = {}
42     unres_shift = {}
43     chain=[]
44     ichain=0
45     newchain = True
46     
47     for line in file:
48             if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
49               tmp=line[18:]
50               chain_=tmp.split(', ')
51               chain_[-1]=chain_[-1][0]
52               chain.extend(chain_)
53     
54             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
55               aa = three_to_one.get(line[17:20])
56               i = int(line[22:26])
57               if newchain or i!=ires[-1]:
58                 sequence.append(aa)
59                 ires.append(i)
60                 if newchain:
61                  chain_start[chain[ichain]]=i
62                  newchain = False
63             if line[0:3] == 'TER':
64               sequence.append('XX')
65               chain_end[chain[ichain]]=i
66               ichain=ichain+1
67               newchain = True
68             if line[0:6] == 'SSBOND':
69               b=[]
70               b.append(int(line[17:21]))
71               b.append(int(line[31:35]))
72               ssbond.append(b)
73               c = []
74               c.append((line[15:16]))
75               c.append((line[29:30]))
76               ssbond_ch.append(c)                                                                      
77             if line[0:3] == 'END':
78               break
79     while sequence[-1] == 'XX':
80             del sequence[-1]
81     if sequence[0] != 'G':
82             sequence.insert(0,'X')
83             ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
84     if sequence[-1] != 'G':
85             sequence.append('X')
86     seq=''.join(sequence)
87 #    if ires[0] != 1:
88 #            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
89     i=0
90     for c in chain:
91       unres_shift[c]=i+chain_start[c]
92       i=i-(chain_end[c]-chain_start[c])-3
93     ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]     
94
95     return seq,json.dumps(ssbond)
96
97
98 @login_required
99 def index(request):
100     user = request.user
101     tasks = Task.objects.filter(owner=user)
102     variable = ''
103     return render(request, "index.html", {
104             'tasks': tasks
105         })
106
107 @login_required
108 def add(request):
109     if request.method == 'POST':
110         form = TaskForm(request.POST)
111         if form.is_valid():
112             name = form.cleaned_data["name"]
113             user = request.user
114             task = Task(name=name,owner=user,ready=False)
115             task.save()
116             return redirect('add_min',task_id=task.id)
117     return redirect('/')
118
119
120 @login_required
121 def add_min(request,task_id):
122     task = get_object_or_404(Task, id=task_id)
123     if request.method == 'POST':
124         form = TaskForm_min(request.POST,request.FILES)
125         if form.is_valid():
126              task.name=form.cleaned_data["name"]
127              task.type="min"
128              task.myfile1=form.cleaned_data["file1"]
129
130              seq,task.ssbond=from_pdb(task.myfile1)
131              task.md_seq=""
132              for i in range(0,len(seq),40):
133                     task.md_seq=task.md_seq+seq[i:i+40]+" "
134
135              task.ready=True
136              basename = str(task.owner)
137              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
138              task.jobdirname = "_".join([basename, suffix])
139              
140              task.save()
141              return redirect('/')
142     else:
143         data= {'name':task.name}
144         form = TaskForm_min(initial=data)
145     p_type='minimization'
146     basic_adv=True    
147     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
148
149 def add_min_a(request,task_id):
150     task = get_object_or_404(Task, id=task_id)
151     if request.method == 'POST':
152         form = TaskForm_min_a(request.POST,request.FILES)
153         if form.is_valid():
154              task.name=form.cleaned_data["name"]
155              task.type="min"
156              task.min_choice=form.cleaned_data["min_choice"]
157              task.min_overlap=form.cleaned_data["min_overlap"]
158              task.min_searchsc=form.cleaned_data["min_searchsc"]
159              task.min_maxmin=form.cleaned_data["min_maxmin"]
160              task.min_maxfun=form.cleaned_data["min_maxfun"]
161              task.min_pdbout=form.cleaned_data["min_pdbout"]
162              task.myfile1=form.cleaned_data["file1"]
163              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
164              task.unres_ff=form.cleaned_data["unres_ff"]
165
166              seq,task.ssbond=from_pdb(task.myfile1)
167              task.md_seq=""
168              for i in range(0,len(seq),40):
169                 task.md_seq=task.md_seq+seq[i:i+40]+" "
170                                                            
171
172              task.ready=True
173              basename = str(task.owner)
174              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
175              task.jobdirname = "_".join([basename, suffix])
176              
177              task.save()
178              return redirect('/')
179     else:
180         data= {'name':task.name}
181         form = TaskForm_min_a(initial=data)
182     basic_adv=False
183     p_type='minimization - advanced options'
184     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
185
186 @login_required
187 def add_md(request,task_id):
188     task = get_object_or_404(Task, id=task_id)
189     if request.method == 'POST':
190         form = TaskForm_md(request.POST,request.FILES)
191         if form.is_valid():
192              task.name=form.cleaned_data["name"]
193              task.type="md"
194              task.md_seed=form.cleaned_data["md_seed"]
195              task.md_start=form.cleaned_data["md_start"]
196              task.md_temp=form.cleaned_data["md_temp"]
197              task.md_nstep=form.cleaned_data["md_nstep"]
198              
199              task.myfile1=form.cleaned_data["file1"]
200              task.md_pdbref=form.cleaned_data["md_pdbref"]             
201
202              task.md_seq=""
203              if task.md_start == "pdbstart" or task.md_pdbref:
204                seq,task.ssbond=from_pdb(task.myfile1)
205              else:
206                seq=seq_add_x(form.cleaned_data["md_seq"])
207                        
208              for i in range(0,len(seq),40):
209                 task.md_seq=task.md_seq+seq[i:i+40]+" "
210              
211              if task.md_start != "pdbstart":
212                 task.ssbond=''
213
214              task.ready=True
215              basename = str(task.owner)
216              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
217              task.jobdirname = "_".join([basename, suffix])
218              
219              task.save()
220              return redirect('/')
221     else:
222         data= {'name':task.name}
223         form = TaskForm_md(initial=data)
224     basic_adv=True
225     p_type='molecular dynamics'
226     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
227
228 def add_md_a(request,task_id):
229     task = get_object_or_404(Task, id=task_id)
230     if request.method == 'POST':
231         form = TaskForm_md_a(request.POST,request.FILES)
232         if form.is_valid():
233              task.name=form.cleaned_data["name"]
234              task.type="md"
235
236              task.myfile1=form.cleaned_data["file1"]
237              task.md_start=form.cleaned_data["md_start"]
238              task.md_pdbref=form.cleaned_data["md_pdbref"]             
239
240              task.md_seq=""
241              if task.md_start == "pdbstart" or task.md_pdbref:
242                seq,task.ssbond=from_pdb(task.myfile1)
243              else:
244                seq=seq_add_x(form.cleaned_data["md_seq"])
245              for i in range(0,len(seq),40):
246                 task.md_seq=task.md_seq+seq[i:i+40]+" "
247
248              if task.md_start != "pdbstart":
249                 task.ssbond=''
250
251              task.md_seed=form.cleaned_data["md_seed"]
252
253              task.md_temp=form.cleaned_data["md_temp"]
254              task.md_nstep=form.cleaned_data["md_nstep"]
255              task.md_ntwe=form.cleaned_data["md_ntwe"]
256              task.md_ntwx=form.cleaned_data["md_ntwx"]
257              task.md_dt=form.cleaned_data["md_dt"]
258              task.md_lang=form.cleaned_data["md_lang"]
259              task.md_tau=form.cleaned_data["md_tau"]
260              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
261              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
262              task.unres_ff=form.cleaned_data["unres_ff"]
263              
264              task.ready=True
265              basename = str(task.owner)
266              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
267              task.jobdirname = "_".join([basename, suffix])
268              
269              task.save()
270              return redirect('/')
271     else:
272         data= {'name':task.name}
273         form = TaskForm_md_a(initial=data)
274     basic_adv=False
275     p_type='molecular dynamics - advanced options'
276     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
277
278 @login_required
279 def add_remd(request,task_id):
280     task = get_object_or_404(Task, id=task_id)
281     if request.method == 'POST':
282         form = TaskForm_remd(request.POST,request.FILES)
283         if form.is_valid():
284              task.name=form.cleaned_data["name"]
285              task.type="remd"
286              task.md_start=form.cleaned_data["md_start"]
287              task.myfile1=form.cleaned_data["file1"]
288              task.md_pdbref=form.cleaned_data["md_pdbref"]
289              task.md_ntwx=task.remd_nstex 
290
291              task.md_seq=""
292              if task.md_start == "pdbstart" or task.md_pdbref:
293                seq,task.ssbond=from_pdb(task.myfile1)
294              else:
295                seq=seq_add_x(form.cleaned_data["md_seq"])
296              for i in range(0,len(seq),40):
297                 task.md_seq=task.md_seq+seq[i:i+40]+" "
298
299              if task.md_start != "pdbstart":
300                 task.ssbond=''
301
302              task.md_seed=form.cleaned_data["md_seed"]
303
304              task.md_nstep=form.cleaned_data["md_nstep"]
305
306
307              task.ready=True
308              
309              basename = str(task.owner)
310              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
311              task.jobdirname = "_".join([basename, suffix])
312              
313              task.save()
314              return redirect('/')
315     else:
316         data= {'name':task.name}
317         form = TaskForm_remd(initial=data)
318     basic_adv=True
319     p_type='replica exchange molecular dynamics'
320     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
321
322 def add_remd_a(request,task_id):
323     task = get_object_or_404(Task, id=task_id)
324     if request.method == 'POST':
325         form = TaskForm_remd_a(request.POST,request.FILES)
326         if form.is_valid():
327              task.name=form.cleaned_data["name"]
328              task.type="remd"
329
330              task.myfile1=form.cleaned_data["file1"]
331              task.md_start=form.cleaned_data["md_start"]  
332              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
333
334              task.md_seq=""
335              if task.md_start == "pdbstart" or task.md_pdbref:
336                seq,task.ssbond=from_pdb(task.myfile1)
337              else:
338                seq=seq_add_x(form.cleaned_data["md_seq"])
339              for i in range(0,len(seq),40):
340                 task.md_seq=task.md_seq+seq[i:i+40]+" "
341
342              if task.md_start != "pdbstart":
343                 task.ssbond=''
344
345              task.md_seed=form.cleaned_data["md_seed"]
346              task.md_nstep=form.cleaned_data["md_nstep"]
347              task.md_dt=form.cleaned_data["md_dt"]
348              task.md_lang=form.cleaned_data["md_lang"]
349              task.md_tau=form.cleaned_data["md_tau"]
350              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
351              task.remd_nrep=form.cleaned_data["remd_nrep"]
352              task.remd_nstex=form.cleaned_data["remd_nstex"]
353              task.md_ntwx=form.cleaned_data["md_ntwx"]             
354              task.md_ntwe=form.cleaned_data["md_ntwe"]
355 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
356 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
357
358              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
359              task.unres_ff=form.cleaned_data["unres_ff"]
360              
361              basename = str(task.owner)
362              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
363              task.jobdirname = "_".join([basename, suffix])
364              
365              task.save()
366              return redirect('addmlist',task_id=task.id)
367     else:
368         data= {'name':task.name}
369         form = TaskForm_remd_a(initial=data)
370     basic_adv=False
371     p_type='replica exchange molecular dynamics - advanced options'
372     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
373
374
375 def addmlist(request,task_id):
376     task = get_object_or_404(Task, id=task_id)
377     if request.method == 'POST':
378         form = TaskForm_list(task.remd_nrep,request.POST)
379         if form.is_valid():
380              task.remd_multi_t=form.cleaned_data["temperatures"]
381              task.remd_multi_m=form.cleaned_data["multiplexing"]             
382              task.ready=True
383              
384              task.save()
385              return redirect('/')
386     else:
387         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
388         '["1", "1", "1", "1", "1", "1", "1", "1"]',
389         'temperatures':
390         '["270", "280", "290", "300", "310", "320", "330", "345"]'
391         }
392         form = TaskForm_list(task.remd_nrep,initial=data)
393     p_type='replica exchange molecular dynamics - advanced options'
394     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
395
396 @login_required
397 def details(request,task_id):
398     task = get_object_or_404(Task, id=task_id)
399     return render(request, "details.html",{'task':task})
400
401 @login_required
402 def delete(request, task_id):
403     Task.objects.get(id=task_id).delete()
404     return redirect('/')
405
406 @login_required
407 def refresh_done(request):
408     user = request.user
409     tasks = Task.objects.filter(owner=user)
410     for task in tasks:
411       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
412          task.done=True
413
414          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
415
416            if task.type=='min' or task.type=='md':
417              text=""
418              for line in f:
419                if 'ETOT' in line:
420                   task.etot=line.split()[1]
421
422                if 'RMS deviation' in line:
423                   text=text+line
424                   i=1
425                   for line1 in f:
426                      text=text+line1
427                      i+=1
428                      if i>6:
429                        break
430                if 'Total wall' in line:
431                   text=text+line
432                   
433            elif task.type=='remd':
434              j=0
435              text="Acceptance for replica exchanges\n"
436              for line in f:
437                         
438                if 'ACC' in line:
439                     j+=1
440                     text=text+line
441                     if j==task.remd_nrep:
442                        j=1
443                        text="Acceptance for replica exchanges\n"+line
444
445                if 'Total wall' in line:
446                   text=text+line
447                        
448          task.results_text=text
449
450
451          if task.md_pdbref and task.type=='remd':
452          
453           for i in range(1,6):
454             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
455                  line=f.readline()
456                  if i==1:
457                      task.remd_model1=' '.join(line.split()[-6:])
458                  elif i==2:
459                      task.remd_model2=' '.join(line.split()[-6:])
460                  elif i==3:
461                      task.remd_model3=' '.join(line.split()[-6:])
462                  elif i==4:
463                      task.remd_model4=' '.join(line.split()[-6:])
464                  elif i==5:
465                      task.remd_model5=' '.join(line.split()[-6:])
466
467           for i in range(1,6):
468             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
469                text=''
470                for line in f:
471                  if 'RMSD of  the common residues=' in line:
472                    text=' RMSD='+line.split()[5]
473                  if 'TM-score    =' in line:
474                    text=text+' TMscore='+line.split()[2]
475                  if 'GDT-TS-score=' in line:
476                    text=text+' GDT_TS='+line.split()[1]
477                     
478                if i==1:
479                      task.remd_model1=task.remd_model1+text
480                elif i==2:
481                      task.remd_model2=task.remd_model2+text
482                elif i==3:
483                      task.remd_model3=task.remd_model3+text
484                elif i==4:
485                      task.remd_model4=task.remd_model4+text
486                elif i==5:
487                      task.remd_model5=task.remd_model5+text
488
489
490
491          if task.type=='remd':  
492           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
493
494            for line in f:
495              if 'sumprob' in line:
496                 i=0
497                 for line1 in f:
498                   i+=1
499                   if i>6:
500                        break
501                   if i==1:
502                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
503                   elif i==2:
504                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
505                   elif i==3:
506                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
507                   elif i==4:
508                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
509                   elif i==5:
510                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
511                      
512          
513
514          task.save()
515       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
516          if (task.type=='min'):
517            task.running =1
518          else:
519            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
520               line=''
521               for line in f:
522                 pass
523               if line != '':
524                 last = line.split()[0]
525               else:
526                 last = 0
527            task.running=int(1+int(last)*100.0/task.md_nstep)
528            if task.running>100:
529              task.running=100
530          task.save()
531
532     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
533     njob=0
534     nq=0
535     for line in proc.stdout:
536       if 'piasek4' in line:
537         if line.split()[1]=='test_server':
538           njob+=1
539           if line.split()[-2]=='Q':
540             nq+=1
541     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
542
543     return render(request, "index.html", {
544                 'tasks': tasks ,
545                 'variable' : variable
546                         })
547     
548 #   return redirect('/')