remd prob. correction format
[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          if task.type=='remd':  
427           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
428
429            for line in f:
430              if 'sumprob' in line:
431                 i=0
432                 for line1 in f:
433                   i+=1
434                   if i>6:
435                        break
436                   if i==1:
437                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
438                   elif i==2:
439                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
440                   elif i==3:
441                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
442                   elif i==4:
443                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
444                   elif i==5:
445                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
446                      
447          
448
449          task.save()
450       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
451          if (task.type=='min'):
452            task.running =1
453          else:
454            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
455               line=''
456               for line in f:
457                 pass
458               if line != '':
459                 last = line.split()[0]
460               else:
461                 last = 0
462            task.running=int(1+int(last)*100.0/task.md_nstep)
463            if task.running>100:
464              task.running=100
465          task.save()
466
467     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
468     njob=0
469     nq=0
470     for line in proc.stdout:
471       if 'piasek4' in line:
472         if line.split()[1]=='test_server':
473           njob+=1
474           if line.split()[-2]=='Q':
475             nq+=1
476     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
477
478     return render(request, "index.html", {
479                 'tasks': tasks ,
480                 'variable' : variable
481                         })
482     
483 #   return redirect('/')