df3fb4d57a21dca6ea9fbfd9f2355e19fe9c9dbe
[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      if '_example' in request.POST:
128         data= {'name':task.name,'pdbid':'1BDD'}
129         form = TaskForm_min(initial=data)     
130      else:
131         form = TaskForm_min(request.POST,request.FILES)
132         if form.is_valid():
133              task.name=form.cleaned_data["name"]
134              task.type="min"
135              pdbid=form.cleaned_data["pdbid"]
136
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              if pdbid:
142               os.mkdir(task.jobdirname)
143               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
144                      task.jobdirname+'/plik.pdb')     
145               task.pdbcode=pdbid
146              else:
147               task.myfile1=form.cleaned_data["file1"]
148
149              seq,task.ssbond=from_pdb(task.myfile1)
150              task.md_seq=""
151              for i in range(0,len(seq),40):
152                     task.md_seq=task.md_seq+seq[i:i+40]+" "
153
154              task.ready=True
155              
156              task.save()
157              if is_lazy_user(request.user):
158               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
159              else:
160               return redirect('/')
161     else:
162         data= {'name':task.name}
163         form = TaskForm_min(initial=data)
164     p_type='minimization'
165     basic_adv=True    
166     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
167
168 @login_required
169 def add_min_a(request,task_id):
170     task = get_object_or_404(Task, id=task_id)
171     if request.method == 'POST':
172         form = TaskForm_min_a(request.POST,request.FILES)
173         if form.is_valid():
174              task.name=form.cleaned_data["name"]
175              task.type="min"
176              task.min_choice=form.cleaned_data["min_choice"]
177              task.min_overlap=form.cleaned_data["min_overlap"]
178              task.min_searchsc=form.cleaned_data["min_searchsc"]
179              task.min_maxmin=form.cleaned_data["min_maxmin"]
180              task.min_maxfun=form.cleaned_data["min_maxfun"]
181              task.min_pdbout=form.cleaned_data["min_pdbout"]
182              task.myfile1=form.cleaned_data["file1"]
183              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
184              task.unres_ff=form.cleaned_data["unres_ff"]
185              task.boxx=form.cleaned_data["boxx"]
186              task.boxy=form.cleaned_data["boxy"]             
187              task.boxz=form.cleaned_data["boxz"]             
188
189              seq,task.ssbond=from_pdb(task.myfile1)
190              task.md_seq=""
191              for i in range(0,len(seq),40):
192                 task.md_seq=task.md_seq+seq[i:i+40]+" "
193                                                            
194
195              task.ready=True
196              basename = str(task.owner)
197              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
198              task.jobdirname = "_".join([basename, suffix])
199              
200              task.save()
201              if is_lazy_user(request.user):
202               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
203              else:
204               return redirect('/')
205     else:
206         data= {'name':task.name}
207         form = TaskForm_min_a(initial=data)
208     basic_adv=False
209     p_type='minimization - advanced options'
210     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
211
212 @login_required
213 def add_md(request,task_id):
214     task = get_object_or_404(Task, id=task_id)
215     if request.method == 'POST':
216         form = TaskForm_md(request.POST,request.FILES)
217         if form.is_valid():
218              task.name=form.cleaned_data["name"]
219              task.type="md"
220              task.md_seed=form.cleaned_data["md_seed"]
221              task.md_start=form.cleaned_data["md_start"]
222              task.md_temp=form.cleaned_data["md_temp"]
223              task.md_nstep=form.cleaned_data["md_nstep"]
224              
225              task.myfile1=form.cleaned_data["file1"]
226              task.md_pdbref=form.cleaned_data["md_pdbref"]             
227
228              task.md_seq=""
229              if task.md_start == "pdbstart" or task.md_pdbref:
230                seq,task.ssbond=from_pdb(task.myfile1)
231              else:
232                seq=seq_add_x(form.cleaned_data["md_seq"])
233                        
234              for i in range(0,len(seq),40):
235                 task.md_seq=task.md_seq+seq[i:i+40]+" "
236              
237              if task.md_start != "pdbstart":
238                 task.ssbond=''
239
240              task.ready=True
241              basename = str(task.owner)
242              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
243              task.jobdirname = "_".join([basename, suffix])
244              
245              task.save()
246              if is_lazy_user(request.user):
247               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
248              else:
249               return redirect('/')
250     else:
251         data= {'name':task.name}
252         form = TaskForm_md(initial=data)
253     basic_adv=True
254     p_type='molecular dynamics'
255     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
256
257 @login_required
258 def add_md_a(request,task_id):
259     task = get_object_or_404(Task, id=task_id)
260     if request.method == 'POST':
261         form = TaskForm_md_a(request.POST,request.FILES)
262         if form.is_valid():
263              task.name=form.cleaned_data["name"]
264              task.type="md"
265
266              task.myfile1=form.cleaned_data["file1"]
267              task.md_start=form.cleaned_data["md_start"]
268              task.md_pdbref=form.cleaned_data["md_pdbref"]             
269
270              task.md_seq=""
271              if task.md_start == "pdbstart" or task.md_pdbref:
272                seq,task.ssbond=from_pdb(task.myfile1)
273              else:
274                seq=seq_add_x(form.cleaned_data["md_seq"])
275              for i in range(0,len(seq),40):
276                 task.md_seq=task.md_seq+seq[i:i+40]+" "
277
278              if task.md_start != "pdbstart":
279                 task.ssbond=''
280
281              task.md_seed=form.cleaned_data["md_seed"]
282
283              task.md_temp=form.cleaned_data["md_temp"]
284              task.md_nstep=form.cleaned_data["md_nstep"]
285              task.md_ntwe=form.cleaned_data["md_ntwe"]
286              task.md_ntwx=form.cleaned_data["md_ntwx"]
287              task.md_dt=form.cleaned_data["md_dt"]
288              task.md_lang=form.cleaned_data["md_lang"]
289              task.md_tau=form.cleaned_data["md_tau"]
290              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
291              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
292              task.unres_ff=form.cleaned_data["unres_ff"]
293              task.boxx=form.cleaned_data["boxx"]
294              task.boxy=form.cleaned_data["boxy"]             
295              task.boxz=form.cleaned_data["boxz"]             
296
297              
298              task.ready=True
299              basename = str(task.owner)
300              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
301              task.jobdirname = "_".join([basename, suffix])
302              
303              task.save()
304              if is_lazy_user(request.user):
305               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
306              else:
307               return redirect('/')
308     else:
309         data= {'name':task.name}
310         form = TaskForm_md_a(initial=data)
311     basic_adv=False
312     p_type='molecular dynamics - advanced options'
313     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
314
315 @login_required
316 def add_remd(request,task_id):
317     task = get_object_or_404(Task, id=task_id)
318     if request.method == 'POST':
319         form = TaskForm_remd(request.POST,request.FILES)
320         if form.is_valid():
321              task.name=form.cleaned_data["name"]
322              task.type="remd"
323              task.md_start=form.cleaned_data["md_start"]
324              task.myfile1=form.cleaned_data["file1"]
325              task.md_pdbref=form.cleaned_data["md_pdbref"]
326              task.md_ntwx=task.remd_nstex 
327
328              task.md_seq=""
329              if task.md_start == "pdbstart" or task.md_pdbref:
330                seq,task.ssbond=from_pdb(task.myfile1)
331              else:
332                seq=seq_add_x(form.cleaned_data["md_seq"])
333              for i in range(0,len(seq),40):
334                 task.md_seq=task.md_seq+seq[i:i+40]+" "
335
336              if task.md_start != "pdbstart":
337                 task.ssbond=''
338
339              task.md_seed=form.cleaned_data["md_seed"]
340
341              task.md_nstep=form.cleaned_data["md_nstep"]
342
343
344              task.ready=True
345              
346              basename = str(task.owner)
347              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
348              task.jobdirname = "_".join([basename, suffix])
349              
350              task.save()
351              if is_lazy_user(request.user):
352               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
353              else:
354               return redirect('/')
355     else:
356         data= {'name':task.name}
357         form = TaskForm_remd(initial=data)
358     basic_adv=True
359     p_type='replica exchange molecular dynamics'
360     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
361
362 @login_required
363 def add_remd_a(request,task_id):
364     task = get_object_or_404(Task, id=task_id)
365     if request.method == 'POST':
366         form = TaskForm_remd_a(request.POST,request.FILES)
367         if form.is_valid():
368              task.name=form.cleaned_data["name"]
369              task.type="remd"
370
371              task.myfile1=form.cleaned_data["file1"]
372              task.md_start=form.cleaned_data["md_start"]  
373              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
374
375              task.md_seq=""
376              if task.md_start == "pdbstart" or task.md_pdbref:
377                seq,task.ssbond=from_pdb(task.myfile1)
378              else:
379                seq=seq_add_x(form.cleaned_data["md_seq"])
380              for i in range(0,len(seq),40):
381                 task.md_seq=task.md_seq+seq[i:i+40]+" "
382
383              if task.md_start != "pdbstart":
384                 task.ssbond=''
385
386              task.md_seed=form.cleaned_data["md_seed"]
387              task.md_nstep=form.cleaned_data["md_nstep"]
388              task.md_dt=form.cleaned_data["md_dt"]
389              task.md_lang=form.cleaned_data["md_lang"]
390              task.md_tau=form.cleaned_data["md_tau"]
391              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
392              task.remd_nrep=form.cleaned_data["remd_nrep"]
393              task.remd_nstex=form.cleaned_data["remd_nstex"]
394              task.md_ntwx=form.cleaned_data["md_ntwx"]             
395              task.md_ntwe=form.cleaned_data["md_ntwe"]
396 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
397 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
398
399              task.boxx=form.cleaned_data["boxx"]
400              task.boxy=form.cleaned_data["boxy"]             
401              task.boxz=form.cleaned_data["boxz"]             
402
403
404              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
405              task.unres_ff=form.cleaned_data["unres_ff"]
406              
407              basename = str(task.owner)
408              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
409              task.jobdirname = "_".join([basename, suffix])
410              
411              task.save()
412              return redirect('addmlist',task_id=task.id)
413     else:
414         data= {'name':task.name}
415         form = TaskForm_remd_a(initial=data)
416     basic_adv=False
417     p_type='replica exchange molecular dynamics - advanced options'
418     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
419
420 @login_required
421 def addmlist(request,task_id):
422     task = get_object_or_404(Task, id=task_id)
423     if request.method == 'POST':
424         form = TaskForm_list(task.remd_nrep,request.POST)
425         if form.is_valid():
426              task.remd_multi_t=form.cleaned_data["temperatures"]
427              task.remd_multi_m=form.cleaned_data["multiplexing"]             
428              task.ready=True
429              
430              task.save()
431              if is_lazy_user(request.user):
432               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
433              else:
434               return redirect('/')
435     else:
436       if task.unres_ff == 'E0LL2Y':
437         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
438         '["1", "1", "1", "1", "1", "1", "1", "1"]',
439         'temperatures':
440         '["270", "280", "290", "300", "310", "320", "330", "345"]'
441         }
442       else: 
443         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
444         '["1", "1", "1", "1", "1", "1", "1", "1"]',
445         'temperatures':
446         '["250", "260", "270", "280", "290", "300", "315", "330"]'
447         }
448       
449       form = TaskForm_list(task.remd_nrep,initial=data)
450     p_type='replica exchange molecular dynamics - advanced options'
451     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
452
453 @login_required
454 def details(request,task_id):
455     task = get_object_or_404(Task, id=task_id)
456     return render(request, "details.html",{'task':task})
457
458
459 def details1(request,user_id,task_id):
460     task = get_object_or_404(Task, id=task_id)
461     return render(request, "details1.html",{'task':task})
462
463
464 @login_required
465 def delete(request, task_id):
466     Task.objects.get(id=task_id).delete()
467     return redirect('/')
468
469 def refresh_done1(request, task_id):
470     task = get_object_or_404(Task, id=task_id)
471     user = task.owner
472     refresh_done0(task)
473
474     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
475     njob=0
476     nq=0
477     for line in proc.stdout:
478       if 'piasek4' in line:
479         if line.split()[1]=='test_server':
480           njob+=1
481           if line.split()[-2]=='Q':
482             nq+=1
483     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
484
485     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
486
487
488 @login_required
489 def refresh_done(request):
490     user = request.user
491     tasks = Task.objects.filter(owner=user).order_by('-created_date')
492     for task in tasks:
493       refresh_done0(task)
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     if is_lazy_user(request.user):
507      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
508     else:
509      return render(request, "index.html", {
510                 'tasks': tasks ,
511                 'variable' : variable
512                         })
513
514       
515 def refresh_done0(task):
516       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
517          task.done=True
518
519          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
520
521            if task.type=='min' or task.type=='md':
522              text=""
523              for line in f:
524                if 'ETOT' in line:
525                   task.etot=line.split()[1]
526
527                if 'RMS deviation' in line:
528                   text=text+line
529                   i=1
530                   for line1 in f:
531                      text=text+line1
532                      i+=1
533                      if i>6:
534                        break
535                if 'Total wall' in line:
536                   text=text+line
537                   
538            elif task.type=='remd':
539              j=0
540              text="Acceptance for replica exchanges\n"
541              for line in f:
542                         
543                if 'ACC' in line:
544                     j+=1
545                     text=text+line
546                     if j==task.remd_nrep:
547                        j=1
548                        text="Acceptance for replica exchanges\n"+line
549
550                if 'Total wall' in line:
551                   text=text+line
552                        
553          task.results_text=text
554
555
556          if task.md_pdbref and task.type=='remd':
557          
558           for i in range(1,6):
559            try:
560             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
561                  line=f.readline()
562                  if i==1:
563                      task.remd_model1=' '.join(line.split()[-6:])
564                  elif i==2:
565                      task.remd_model2=' '.join(line.split()[-6:])
566                  elif i==3:
567                      task.remd_model3=' '.join(line.split()[-6:])
568                  elif i==4:
569                      task.remd_model4=' '.join(line.split()[-6:])
570                  elif i==5:
571                      task.remd_model5=' '.join(line.split()[-6:])
572            except EnvironmentError:
573             print 'file_wham_T*pdb open error'
574           for i in range(1,6):
575             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
576                text=''
577                for line in f:
578                  if 'RMSD of  the common residues=' in line:
579                    text=' RMSD='+line.split()[5]
580                  if 'TM-score    =' in line:
581                    text=text+' TMscore='+line.split()[2]
582                  if 'GDT-TS-score=' in line:
583                    text=text+' GDT_TS='+line.split()[1]
584                     
585                if i==1:
586                      task.remd_model1=task.remd_model1+text
587                elif i==2:
588                      task.remd_model2=task.remd_model2+text
589                elif i==3:
590                      task.remd_model3=task.remd_model3+text
591                elif i==4:
592                      task.remd_model4=task.remd_model4+text
593                elif i==5:
594                      task.remd_model5=task.remd_model5+text
595
596
597
598          if task.type=='remd':  
599           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
600
601            for line in f:
602              if 'sumprob' in line:
603                 i=0
604                 for line1 in f:
605                   i+=1
606                   if i>6:
607                        break
608                   if i==1:
609                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
610                   elif i==2:
611                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
612                   elif i==3:
613                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
614                   elif i==4:
615                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
616                   elif i==5:
617                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
618                      
619          
620
621          task.save()
622       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
623          if (task.type=='min'):
624            task.running =1
625          else:
626            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
627               line=''
628               for line in f:
629                 pass
630               if line != '':
631                 last = line.split()[0]
632               else:
633                 last = 0
634            task.running=int(1+int(last)*100.0/task.md_nstep)
635            if task.running>100:
636              task.running=100
637          task.save()
638
639     
640       return