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