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