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
5 from .models import Task
10 from lazysignup.decorators import allow_lazy_user
11 from lazysignup.utils import is_lazy_user
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'),
25 three_to_one = dict(res_codes)
27 def seq_add_x(sequence):
28 if sequence[0] != 'G':
30 if sequence[-1] != 'G':
32 set ='CDSQKIPTFNGHLRWAVEYMX'
33 sequence = ''.join([c for c in sequence if c in set])
50 if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
52 chain_=tmp.split(', ')
53 chain_[-1]=chain_[-1][0]
56 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
57 aa = three_to_one.get(line[17:20])
59 if newchain or i!=ires[-1]:
64 chain_start[chain[ichain]]=i
66 if line[0:3] == 'TER':
69 chain_end[chain[ichain]]=i
72 if line[0:6] == 'SSBOND':
74 b.append(int(line[17:21]))
75 b.append(int(line[31:35]))
78 c.append((line[15:16]))
79 c.append((line[29:30]))
81 if line[0:3] == 'END':
83 while sequence[-1] == 'XX':
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':
92 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
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)]
99 return seq,json.dumps(ssbond)
105 tasks = Task.objects.filter(owner=user).order_by('-created_date')
107 return render(request, "index.html", {
113 if request.method == 'POST':
114 form = TaskForm(request.POST)
116 name = form.cleaned_data["name"]
118 task = Task(name=name,owner=user,ready=False)
120 return redirect('add_min',task_id=task.id)
124 def add_min(request,task_id):
125 task = get_object_or_404(Task, id=task_id)
126 if request.method == 'POST':
127 if '_example' in request.POST:
128 data= {'name':task.name,'pdbid':'1BDD'}
129 form = TaskForm_min(initial=data)
131 form = TaskForm_min(request.POST,request.FILES)
133 task.name=form.cleaned_data["name"]
135 pdbid=form.cleaned_data["pdbid"]
137 basename = str(task.owner)
138 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
139 task.jobdirname = "_".join([basename, suffix])
142 os.mkdir(task.jobdirname)
143 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
144 task.jobdirname+'/plik.pdb')
147 task.myfile1=form.cleaned_data["file1"]
149 seq,task.ssbond=from_pdb(task.myfile1)
151 for i in range(0,len(seq),40):
152 task.md_seq=task.md_seq+seq[i:i+40]+" "
157 if is_lazy_user(request.user):
158 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
162 data= {'name':task.name}
163 form = TaskForm_min(initial=data)
164 p_type='minimization'
166 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
169 def add_min_a(request,task_id):
170 task = get_object_or_404(Task, id=task_id)
171 if request.method == 'POST':
172 if '_example' in request.POST:
173 data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
174 form = TaskForm_min_a(initial=data)
176 form = TaskForm_min_a(request.POST,request.FILES)
178 task.name=form.cleaned_data["name"]
180 task.min_choice=form.cleaned_data["min_choice"]
181 task.min_overlap=form.cleaned_data["min_overlap"]
182 task.min_searchsc=form.cleaned_data["min_searchsc"]
183 task.min_maxmin=form.cleaned_data["min_maxmin"]
184 task.min_maxfun=form.cleaned_data["min_maxfun"]
185 task.min_pdbout=form.cleaned_data["min_pdbout"]
187 basename = str(task.owner)
188 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
189 task.jobdirname = "_".join([basename, suffix])
191 pdbid=form.cleaned_data["pdbid"]
193 os.mkdir(task.jobdirname)
194 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
195 task.jobdirname+'/plik.pdb')
198 task.myfile1=form.cleaned_data["file1"]
200 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
201 task.unres_ff=form.cleaned_data["unres_ff"]
202 task.boxx=form.cleaned_data["boxx"]
203 task.boxy=form.cleaned_data["boxy"]
204 task.boxz=form.cleaned_data["boxz"]
206 seq,task.ssbond=from_pdb(task.myfile1)
208 for i in range(0,len(seq),40):
209 task.md_seq=task.md_seq+seq[i:i+40]+" "
214 if is_lazy_user(request.user):
215 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
219 data= {'name':task.name}
220 form = TaskForm_min_a(initial=data)
222 p_type='minimization - advanced options'
223 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
226 def add_md(request,task_id):
227 task = get_object_or_404(Task, id=task_id)
228 if request.method == 'POST':
229 if '_example' in request.POST:
230 data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
231 'md_pdbref':True,'md_temp':200}
232 form = TaskForm_md(initial=data)
234 form = TaskForm_md(request.POST,request.FILES)
236 task.name=form.cleaned_data["name"]
238 task.md_seed=form.cleaned_data["md_seed"]
239 task.md_start=form.cleaned_data["md_start"]
240 task.md_temp=form.cleaned_data["md_temp"]
241 task.md_nstep=form.cleaned_data["md_nstep"]
243 basename = str(task.owner)
244 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
245 task.jobdirname = "_".join([basename, suffix])
247 pdbid=form.cleaned_data["pdbid"]
249 os.mkdir(task.jobdirname)
250 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
251 task.jobdirname+'/plik.pdb')
254 task.myfile1=form.cleaned_data["file1"]
255 task.md_pdbref=form.cleaned_data["md_pdbref"]
258 if task.md_start == "pdbstart" or task.md_pdbref:
259 seq,task.ssbond=from_pdb(task.myfile1)
261 seq=seq_add_x(form.cleaned_data["md_seq"])
263 for i in range(0,len(seq),40):
264 task.md_seq=task.md_seq+seq[i:i+40]+" "
266 if task.md_start != "pdbstart":
272 if is_lazy_user(request.user):
273 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
277 data= {'name':task.name}
278 form = TaskForm_md(initial=data)
280 p_type='molecular dynamics'
281 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
284 def add_md_a(request,task_id):
285 task = get_object_or_404(Task, id=task_id)
286 if request.method == 'POST':
287 if '_example' in request.POST:
288 data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
289 'md_pdbref':True,'md_mdpdb':True}
290 form = TaskForm_md_a(initial=data)
292 form = TaskForm_md_a(request.POST,request.FILES)
294 task.name=form.cleaned_data["name"]
297 basename = str(task.owner)
298 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
299 task.jobdirname = "_".join([basename, suffix])
301 pdbid=form.cleaned_data["pdbid"]
303 os.mkdir(task.jobdirname)
304 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
305 task.jobdirname+'/plik.pdb')
308 task.myfile1=form.cleaned_data["file1"]
309 task.md_start=form.cleaned_data["md_start"]
310 task.md_pdbref=form.cleaned_data["md_pdbref"]
313 if task.md_start == "pdbstart" or task.md_pdbref:
314 seq,task.ssbond=from_pdb(task.myfile1)
316 seq=seq_add_x(form.cleaned_data["md_seq"])
317 for i in range(0,len(seq),40):
318 task.md_seq=task.md_seq+seq[i:i+40]+" "
320 if task.md_start != "pdbstart":
323 task.md_seed=form.cleaned_data["md_seed"]
325 task.md_temp=form.cleaned_data["md_temp"]
326 task.md_nstep=form.cleaned_data["md_nstep"]
327 task.md_ntwe=form.cleaned_data["md_ntwe"]
328 task.md_ntwx=form.cleaned_data["md_ntwx"]
329 task.md_dt=form.cleaned_data["md_dt"]
330 task.md_lang=form.cleaned_data["md_lang"]
331 task.md_tau=form.cleaned_data["md_tau"]
332 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
333 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
334 task.unres_ff=form.cleaned_data["unres_ff"]
335 task.boxx=form.cleaned_data["boxx"]
336 task.boxy=form.cleaned_data["boxy"]
337 task.boxz=form.cleaned_data["boxz"]
343 if is_lazy_user(request.user):
344 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
348 data= {'name':task.name}
349 form = TaskForm_md_a(initial=data)
351 p_type='molecular dynamics - advanced options'
352 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
355 def add_remd(request,task_id):
356 task = get_object_or_404(Task, id=task_id)
357 if request.method == 'POST':
358 if '_example' in request.POST:
359 data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True}
360 form = TaskForm_remd(initial=data)
362 form = TaskForm_remd(request.POST,request.FILES)
364 task.name=form.cleaned_data["name"]
366 task.md_start=form.cleaned_data["md_start"]
368 basename = str(task.owner)
369 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
370 task.jobdirname = "_".join([basename, suffix])
372 pdbid=form.cleaned_data["pdbid"]
374 os.mkdir(task.jobdirname)
375 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
376 task.jobdirname+'/plik.pdb')
379 task.myfile1=form.cleaned_data["file1"]
380 task.md_pdbref=form.cleaned_data["md_pdbref"]
381 task.md_ntwx=task.remd_nstex
384 if task.md_start == "pdbstart" or task.md_pdbref:
385 seq,task.ssbond=from_pdb(task.myfile1)
387 seq=seq_add_x(form.cleaned_data["md_seq"])
388 for i in range(0,len(seq),40):
389 task.md_seq=task.md_seq+seq[i:i+40]+" "
391 if task.md_start != "pdbstart":
394 task.md_seed=form.cleaned_data["md_seed"]
396 task.md_nstep=form.cleaned_data["md_nstep"]
403 if is_lazy_user(request.user):
404 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
408 data= {'name':task.name}
409 form = TaskForm_remd(initial=data)
411 p_type='replica exchange molecular dynamics'
412 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
415 def add_remd_a(request,task_id):
416 from django.core.files.uploadedfile import UploadedFile
417 task = get_object_or_404(Task, id=task_id)
418 if request.method == 'POST':
419 if '_example' in request.POST:
420 data= {'name':task.name,'pdbid':'1E0G','md_pdbref':True,
421 'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2',
422 'remd_cluter_temp':280}
423 form = TaskForm_remd_a(initial=data)
424 elif '_example_saxs' in request.POST:
425 data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
426 'md_nstep':200000,'md_lang':'langevin','unres_ff':'E0LL2Y',
427 'remd_cluter_temp':270,
428 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
466 form = TaskForm_remd_a(initial=data)
468 form = TaskForm_remd_a(request.POST,request.FILES)
470 task.name=form.cleaned_data["name"]
473 basename = str(task.owner)
474 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
475 task.jobdirname = "_".join([basename, suffix])
477 pdbid=form.cleaned_data["pdbid"]
479 os.mkdir(task.jobdirname)
480 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
481 task.jobdirname+'/plik.pdb')
484 task.myfile1=form.cleaned_data["file1"]
485 task.md_start=form.cleaned_data["md_start"]
486 task.md_pdbref=form.cleaned_data["md_pdbref"]
489 if task.md_start == "pdbstart" or task.md_pdbref:
490 seq,task.ssbond=from_pdb(task.myfile1)
492 seq=seq_add_x(form.cleaned_data["md_seq"])
493 for i in range(0,len(seq),40):
494 task.md_seq=task.md_seq+seq[i:i+40]+" "
496 if task.md_start != "pdbstart":
499 task.md_seed=form.cleaned_data["md_seed"]
500 task.md_nstep=form.cleaned_data["md_nstep"]
501 task.md_dt=form.cleaned_data["md_dt"]
502 task.md_lang=form.cleaned_data["md_lang"]
503 task.md_tau=form.cleaned_data["md_tau"]
504 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
505 task.remd_nrep=form.cleaned_data["remd_nrep"]
506 task.remd_nstex=form.cleaned_data["remd_nstex"]
507 task.md_ntwx=form.cleaned_data["md_ntwx"]
508 task.md_ntwe=form.cleaned_data["md_ntwe"]
509 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
510 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
512 task.boxx=form.cleaned_data["boxx"]
513 task.boxy=form.cleaned_data["boxy"]
514 task.boxz=form.cleaned_data["boxz"]
516 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
517 task.unres_ff=form.cleaned_data["unres_ff"]
519 task.scal_rad = form.cleaned_data["scal_rad"]
520 task.saxs_data = form.cleaned_data["saxs_data"]
521 task.wsaxs = form.cleaned_data["wsaxs"]
524 return redirect('addmlist',task_id=task.id)
526 data= {'name':task.name}
527 form = TaskForm_remd_a(initial=data)
529 p_type='replica exchange molecular dynamics - advanced options'
530 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
533 def addmlist(request,task_id):
534 task = get_object_or_404(Task, id=task_id)
535 if request.method == 'POST':
536 form = TaskForm_list(task.remd_nrep,request.POST)
538 task.remd_multi_t=form.cleaned_data["temperatures"]
539 task.remd_multi_m=form.cleaned_data["multiplexing"]
543 if is_lazy_user(request.user):
544 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
548 if task.unres_ff == 'E0LL2Y':
549 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
550 '["1", "1", "1", "1", "1", "1", "1", "1"]',
552 '["270", "280", "290", "300", "310", "320", "330", "345"]'
555 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
556 '["1", "1", "1", "1", "1", "1", "1", "1"]',
558 '["250", "260", "270", "280", "290", "300", "315", "330"]'
561 form = TaskForm_list(task.remd_nrep,initial=data)
562 p_type='replica exchange molecular dynamics - advanced options'
563 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
566 def details(request,task_id):
567 task = get_object_or_404(Task, id=task_id)
568 return render(request, "details.html",{'task':task})
571 def details1(request,user_id,task_id):
572 task = get_object_or_404(Task, id=task_id)
573 return render(request, "details1.html",{'task':task})
577 def delete(request, task_id):
578 Task.objects.get(id=task_id).delete()
581 def refresh_done1(request, task_id):
582 task = get_object_or_404(Task, id=task_id)
586 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
589 for line in proc.stdout:
590 if 'piasek4' in line:
591 if line.split()[1]=='test_server':
593 if line.split()[-2]=='Q':
595 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
597 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
601 def refresh_done(request):
603 tasks = Task.objects.filter(owner=user).order_by('-created_date')
607 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
610 for line in proc.stdout:
611 if 'piasek4' in line:
612 if line.split()[1]=='test_server':
614 if line.split()[-2]=='Q':
616 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
618 if is_lazy_user(request.user):
619 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
621 return render(request, "index.html", {
623 'variable' : variable
627 def refresh_done0(task):
628 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
631 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
633 if task.type=='min' or task.type=='md':
637 task.etot=line.split()[1]
639 if 'RMS deviation' in line:
647 if 'Total wall' in line:
650 elif task.type=='remd':
652 text="Acceptance for replica exchanges and number of exchange attempts\n"
657 text=text+' '.join(line.split()[2:])+"\n"
658 if j==task.remd_nrep:
660 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
662 if 'Total wall' in line:
665 task.results_text=text
668 if task.md_pdbref and task.type=='remd':
672 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
675 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
677 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
679 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
681 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
683 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
684 except EnvironmentError:
685 print 'file_wham_T*pdb open error'
687 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
690 if 'RMSD of the common residues=' in line:
691 text=' RMSD='+line.split()[5]
692 if 'TM-score =' in line:
693 text=text+' TMscore='+line.split()[2]
694 if 'GDT-TS-score=' in line:
695 text=text+' GDT_TS='+line.split()[1]
698 task.remd_model1=task.remd_model1+text
700 task.remd_model2=task.remd_model2+text
702 task.remd_model3=task.remd_model3+text
704 task.remd_model4=task.remd_model4+text
706 task.remd_model5=task.remd_model5+text
710 if task.type=='remd':
711 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
714 if 'sumprob' in line:
721 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
723 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
725 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
727 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
729 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
734 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
735 if (task.type=='min'):
738 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
743 last = line.split()[0]
746 task.running=int(1+int(last)*100.0/task.md_nstep)