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