MREMD different default temperatures for new ff
[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       if task.unres_ff == 'E0LL2Y':
390         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
391         '["1", "1", "1", "1", "1", "1", "1", "1"]',
392         'temperatures':
393         '["270", "280", "290", "300", "310", "320", "330", "345"]'
394         }
395       else: 
396         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
397         '["1", "1", "1", "1", "1", "1", "1", "1"]',
398         'temperatures':
399         '["250", "260", "270", "280", "290", "300", "315", "330"]'
400         }
401       
402       form = TaskForm_list(task.remd_nrep,initial=data)
403     p_type='replica exchange molecular dynamics - advanced options'
404     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
405
406 @login_required
407 def details(request,task_id):
408     task = get_object_or_404(Task, id=task_id)
409     return render(request, "details.html",{'task':task})
410
411 @login_required
412 def delete(request, task_id):
413     Task.objects.get(id=task_id).delete()
414     return redirect('/')
415
416 @login_required
417 def refresh_done(request):
418     user = request.user
419     tasks = Task.objects.filter(owner=user).order_by('-created_date')
420     for task in tasks:
421       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
422          task.done=True
423
424          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
425
426            if task.type=='min' or task.type=='md':
427              text=""
428              for line in f:
429                if 'ETOT' in line:
430                   task.etot=line.split()[1]
431
432                if 'RMS deviation' in line:
433                   text=text+line
434                   i=1
435                   for line1 in f:
436                      text=text+line1
437                      i+=1
438                      if i>6:
439                        break
440                if 'Total wall' in line:
441                   text=text+line
442                   
443            elif task.type=='remd':
444              j=0
445              text="Acceptance for replica exchanges\n"
446              for line in f:
447                         
448                if 'ACC' in line:
449                     j+=1
450                     text=text+line
451                     if j==task.remd_nrep:
452                        j=1
453                        text="Acceptance for replica exchanges\n"+line
454
455                if 'Total wall' in line:
456                   text=text+line
457                        
458          task.results_text=text
459
460
461          if task.md_pdbref and task.type=='remd':
462          
463           for i in range(1,6):
464            try:
465             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
466                  line=f.readline()
467                  if i==1:
468                      task.remd_model1=' '.join(line.split()[-6:])
469                  elif i==2:
470                      task.remd_model2=' '.join(line.split()[-6:])
471                  elif i==3:
472                      task.remd_model3=' '.join(line.split()[-6:])
473                  elif i==4:
474                      task.remd_model4=' '.join(line.split()[-6:])
475                  elif i==5:
476                      task.remd_model5=' '.join(line.split()[-6:])
477            except EnvironmentError:
478             print 'file_wham_T*pdb open error'
479           for i in range(1,6):
480             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
481                text=''
482                for line in f:
483                  if 'RMSD of  the common residues=' in line:
484                    text=' RMSD='+line.split()[5]
485                  if 'TM-score    =' in line:
486                    text=text+' TMscore='+line.split()[2]
487                  if 'GDT-TS-score=' in line:
488                    text=text+' GDT_TS='+line.split()[1]
489                     
490                if i==1:
491                      task.remd_model1=task.remd_model1+text
492                elif i==2:
493                      task.remd_model2=task.remd_model2+text
494                elif i==3:
495                      task.remd_model3=task.remd_model3+text
496                elif i==4:
497                      task.remd_model4=task.remd_model4+text
498                elif i==5:
499                      task.remd_model5=task.remd_model5+text
500
501
502
503          if task.type=='remd':  
504           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
505
506            for line in f:
507              if 'sumprob' in line:
508                 i=0
509                 for line1 in f:
510                   i+=1
511                   if i>6:
512                        break
513                   if i==1:
514                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
515                   elif i==2:
516                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
517                   elif i==3:
518                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
519                   elif i==4:
520                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
521                   elif i==5:
522                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
523                      
524          
525
526          task.save()
527       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
528          if (task.type=='min'):
529            task.running =1
530          else:
531            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
532               line=''
533               for line in f:
534                 pass
535               if line != '':
536                 last = line.split()[0]
537               else:
538                 last = 0
539            task.running=int(1+int(last)*100.0/task.md_nstep)
540            if task.running>100:
541              task.running=100
542          task.save()
543
544     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
545     njob=0
546     nq=0
547     for line in proc.stdout:
548       if 'piasek4' in line:
549         if line.split()[1]=='test_server':
550           njob+=1
551           if line.split()[-2]=='Q':
552             nq+=1
553     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
554
555     return render(request, "index.html", {
556                 'tasks': tasks ,
557                 'variable' : variable
558                         })
559     
560 #   return redirect('/')