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