941d637bf18c3a7bfa3104d778e49920ac9d7c3c
[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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 def details(request,task_id):
441     task = get_object_or_404(Task, id=task_id)
442     return render(request, "details.html",{'task':task})
443
444 @login_required
445 def delete(request, task_id):
446     Task.objects.get(id=task_id).delete()
447     return redirect('/')
448
449 @login_required
450 def refresh_done(request):
451     user = request.user
452     tasks = Task.objects.filter(owner=user).order_by('-created_date')
453     for task in tasks:
454       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
455          task.done=True
456
457          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
458
459            if task.type=='min' or task.type=='md':
460              text=""
461              for line in f:
462                if 'ETOT' in line:
463                   task.etot=line.split()[1]
464
465                if 'RMS deviation' in line:
466                   text=text+line
467                   i=1
468                   for line1 in f:
469                      text=text+line1
470                      i+=1
471                      if i>6:
472                        break
473                if 'Total wall' in line:
474                   text=text+line
475                   
476            elif task.type=='remd':
477              j=0
478              text="Acceptance for replica exchanges\n"
479              for line in f:
480                         
481                if 'ACC' in line:
482                     j+=1
483                     text=text+line
484                     if j==task.remd_nrep:
485                        j=1
486                        text="Acceptance for replica exchanges\n"+line
487
488                if 'Total wall' in line:
489                   text=text+line
490                        
491          task.results_text=text
492
493
494          if task.md_pdbref and task.type=='remd':
495          
496           for i in range(1,6):
497            try:
498             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
499                  line=f.readline()
500                  if i==1:
501                      task.remd_model1=' '.join(line.split()[-6:])
502                  elif i==2:
503                      task.remd_model2=' '.join(line.split()[-6:])
504                  elif i==3:
505                      task.remd_model3=' '.join(line.split()[-6:])
506                  elif i==4:
507                      task.remd_model4=' '.join(line.split()[-6:])
508                  elif i==5:
509                      task.remd_model5=' '.join(line.split()[-6:])
510            except EnvironmentError:
511             print 'file_wham_T*pdb open error'
512           for i in range(1,6):
513             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
514                text=''
515                for line in f:
516                  if 'RMSD of  the common residues=' in line:
517                    text=' RMSD='+line.split()[5]
518                  if 'TM-score    =' in line:
519                    text=text+' TMscore='+line.split()[2]
520                  if 'GDT-TS-score=' in line:
521                    text=text+' GDT_TS='+line.split()[1]
522                     
523                if i==1:
524                      task.remd_model1=task.remd_model1+text
525                elif i==2:
526                      task.remd_model2=task.remd_model2+text
527                elif i==3:
528                      task.remd_model3=task.remd_model3+text
529                elif i==4:
530                      task.remd_model4=task.remd_model4+text
531                elif i==5:
532                      task.remd_model5=task.remd_model5+text
533
534
535
536          if task.type=='remd':  
537           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
538
539            for line in f:
540              if 'sumprob' in line:
541                 i=0
542                 for line1 in f:
543                   i+=1
544                   if i>6:
545                        break
546                   if i==1:
547                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
548                   elif i==2:
549                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
550                   elif i==3:
551                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
552                   elif i==4:
553                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
554                   elif i==5:
555                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
556                      
557          
558
559          task.save()
560       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
561          if (task.type=='min'):
562            task.running =1
563          else:
564            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
565               line=''
566               for line in f:
567                 pass
568               if line != '':
569                 last = line.split()[0]
570               else:
571                 last = 0
572            task.running=int(1+int(last)*100.0/task.md_nstep)
573            if task.running>100:
574              task.running=100
575          task.save()
576
577     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
578     njob=0
579     nq=0
580     for line in proc.stdout:
581       if 'piasek4' in line:
582         if line.split()[1]=='test_server':
583           njob+=1
584           if line.split()[-2]=='Q':
585             nq+=1
586     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
587
588     if is_lazy_user(request.user):
589      return redirect('/details/'+str(task.id)+'/')
590     else:
591      return render(request, "index.html", {
592                 'tasks': tasks ,
593                 'variable' : variable
594                         })
595     
596 #   return redirect('/')