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