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