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