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