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