90d05e2235f612043916bb052a67d819affb7488
[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              task.md_ntwx=task.remd_nstex 
254
255              task.md_seq=""
256              if task.md_start == "pdbstart" or task.md_pdbref:
257                seq,task.ssbond=from_pdb(task.myfile1)
258              else:
259                seq=seq_add_x(form.cleaned_data["md_seq"])
260              for i in range(0,len(seq),40):
261                 task.md_seq=task.md_seq+seq[i:i+40]+" "
262
263              if task.md_start != "pdbstart":
264                 task.ssbond=''
265
266              task.md_seed=form.cleaned_data["md_seed"]
267
268              task.md_nstep=form.cleaned_data["md_nstep"]
269
270
271              task.ready=True
272              
273              basename = str(task.owner)
274              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
275              task.jobdirname = "_".join([basename, suffix])
276              
277              task.save()
278              return redirect('/')
279     else:
280         data= {'name':task.name}
281         form = TaskForm_remd(initial=data)
282     basic_adv=True
283     p_type='replica exchange molecular dynamics'
284     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
285
286 def add_remd_a(request,task_id):
287     task = get_object_or_404(Task, id=task_id)
288     if request.method == 'POST':
289         form = TaskForm_remd_a(request.POST,request.FILES)
290         if form.is_valid():
291              task.name=form.cleaned_data["name"]
292              task.type="remd"
293
294              task.myfile1=form.cleaned_data["file1"]
295              task.md_start=form.cleaned_data["md_start"]  
296              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
297
298              task.md_seq=""
299              if task.md_start == "pdbstart" or task.md_pdbref:
300                seq,task.ssbond=from_pdb(task.myfile1)
301              else:
302                seq=seq_add_x(form.cleaned_data["md_seq"])
303              for i in range(0,len(seq),40):
304                 task.md_seq=task.md_seq+seq[i:i+40]+" "
305
306              if task.md_start != "pdbstart":
307                 task.ssbond=''
308
309              task.md_seed=form.cleaned_data["md_seed"]
310              task.md_nstep=form.cleaned_data["md_nstep"]
311              task.md_dt=form.cleaned_data["md_dt"]
312              task.md_lang=form.cleaned_data["md_lang"]
313              task.md_tau=form.cleaned_data["md_tau"]
314              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
315              task.remd_nrep=form.cleaned_data["remd_nrep"]
316              task.remd_nstex=form.cleaned_data["remd_nstex"]
317              task.md_ntwx=form.cleaned_data["md_ntwx"]             
318              task.md_ntwe=form.cleaned_data["md_ntwe"]
319 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
320 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
321
322              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
323              task.unres_ff=form.cleaned_data["unres_ff"]
324              
325              basename = str(task.owner)
326              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
327              task.jobdirname = "_".join([basename, suffix])
328              
329              task.save()
330              return redirect('addmlist',task_id=task.id)
331     else:
332         data= {'name':task.name}
333         form = TaskForm_remd_a(initial=data)
334     basic_adv=False
335     p_type='replica exchange molecular dynamics - advanced options'
336     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
337
338
339 def addmlist(request,task_id):
340     task = get_object_or_404(Task, id=task_id)
341     if request.method == 'POST':
342         form = TaskForm_list(task.remd_nrep,request.POST)
343         if form.is_valid():
344              task.remd_multi_t=form.cleaned_data["temperatures"]
345              task.remd_multi_m=form.cleaned_data["multiplexing"]             
346              task.ready=True
347              
348              task.save()
349              return redirect('/')
350     else:
351         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
352         '["1", "1", "1", "1", "1", "1", "1", "1"]',
353         'temperatures':
354         '["270", "280", "290", "300", "310", "320", "330", "345"]'
355         }
356         form = TaskForm_list(task.remd_nrep,initial=data)
357     p_type='replica exchange molecular dynamics - advanced options'
358     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
359
360 @login_required
361 def details(request,task_id):
362     task = get_object_or_404(Task, id=task_id)
363     return render(request, "details.html",{'task':task})
364
365 @login_required
366 def delete(request, task_id):
367     Task.objects.get(id=task_id).delete()
368     return redirect('/')
369
370 @login_required
371 def refresh_done(request):
372     user = request.user
373     tasks = Task.objects.filter(owner=user)
374     for task in tasks:
375       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
376          task.done=True
377
378          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
379
380            if task.type=='min' or task.type=='md':
381              text=""
382              for line in f:
383                if 'ETOT' in line:
384                   task.etot=line.split()[1]
385
386                if 'RMS deviation' in line:
387                   text=text+line
388                   i=1
389                   for line1 in f:
390                      text=text+line1
391                      i+=1
392                      if i>6:
393                        break
394                if 'Total wall' in line:
395                   text=text+line
396                   
397            elif task.type=='remd':
398              j=0
399              text="Acceptance for replica exchanges\n"
400              for line in f:
401                         
402                if 'ACC' in line:
403                     j+=1
404                     text=text+line
405                     if j==task.remd_nrep:
406                        j=1
407                        text="Acceptance for replica exchanges\n"+line
408
409                if 'Total wall' in line:
410                   text=text+line
411                        
412          task.results_text=text
413
414
415          if task.md_pdbref and task.type=='remd':
416          
417           for i in range(1,6):
418             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
419                  line=f.readline()
420                  if i==1:
421                      task.remd_model1=' '.join(line.split()[-6:])
422                  elif i==2:
423                      task.remd_model2=' '.join(line.split()[-6:])
424                  elif i==3:
425                      task.remd_model3=' '.join(line.split()[-6:])
426                  elif i==4:
427                      task.remd_model4=' '.join(line.split()[-6:])
428                  elif i==5:
429                      task.remd_model5=' '.join(line.split()[-6:])
430
431           for i in range(1,6):
432             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
433                text=''
434                for line in f:
435                  if 'RMSD of  the common residues=' in line:
436                    text=' RMSD='+line.split()[5]
437                  if 'TM-score    =' in line:
438                    text=text+' TMscore='+line.split()[2]
439                  if 'GDT-TS-score=' in line:
440                    text=text+' GDT_TS='+line.split()[1]
441                     
442                if i==1:
443                      task.remd_model1=task.remd_model1+text
444                elif i==2:
445                      task.remd_model2=task.remd_model2+text
446                elif i==3:
447                      task.remd_model3=task.remd_model3+text
448                elif i==4:
449                      task.remd_model4=task.remd_model4+text
450                elif i==5:
451                      task.remd_model5=task.remd_model5+text
452
453
454
455          if task.type=='remd':  
456           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
457
458            for line in f:
459              if 'sumprob' in line:
460                 i=0
461                 for line1 in f:
462                   i+=1
463                   if i>6:
464                        break
465                   if i==1:
466                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
467                   elif i==2:
468                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
469                   elif i==3:
470                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
471                   elif i==4:
472                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
473                   elif i==5:
474                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
475                      
476          
477
478          task.save()
479       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
480          if (task.type=='min'):
481            task.running =1
482          else:
483            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
484               line=''
485               for line in f:
486                 pass
487               if line != '':
488                 last = line.split()[0]
489               else:
490                 last = 0
491            task.running=int(1+int(last)*100.0/task.md_nstep)
492            if task.running>100:
493              task.running=100
494          task.save()
495
496     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
497     njob=0
498     nq=0
499     for line in proc.stdout:
500       if 'piasek4' in line:
501         if line.split()[1]=='test_server':
502           njob+=1
503           if line.split()[-2]=='Q':
504             nq+=1
505     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
506
507     return render(request, "index.html", {
508                 'tasks': tasks ,
509                 'variable' : variable
510                         })
511     
512 #   return redirect('/')