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