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'),
23 ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
24 ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
25 ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
26 ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
27 ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),
30 three_to_one = dict(res_codes)
32 def load_pdbid(pdbid,dirname):
35 file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
40 pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
41 with open(dirname+'/plik.pdb', 'w') as outfile:
43 if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
45 if line[0:6] == 'ATOM ' and line[21] == chain:
48 file=dirname+'/plik.pdb'
53 def seq_2d_from_pdb(seq_2d,seq):
56 seq_2d=seq_2d.replace('C', '-')
59 for i in range(0,len(seq)):
61 seq_2d_tmp=seq_2d_tmp+'-'
64 seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
67 for i in range(0,len(seq_2d_tmp),40):
68 tmp=tmp+seq_2d_tmp[i:i+40]+" "
71 def seq_2d_add_x(seq_2d,seq,seq_form):
74 seq_2d=seq_2d[:len(seq_form)]
75 seq_2d=seq_2d.replace('C', '-')
76 if seq_form[0] !='X' and seq[0] == 'X':
78 if seq_form[-1] !='X' and seq[-1] == 'X':
80 seq_2d=seq_2d[:len(seq)]
82 for i in range(0,len(seq_2d),40):
83 tmp=tmp+seq_2d[i:i+40]+" "
86 def seq_add_x(sequence):
87 if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
89 if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
91 set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
92 sequence = ''.join([c for c in sequence if c in set])
108 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
109 aa = three_to_one.get(line[17:20])
112 if newchain or i!=ires[-1]:
117 chain_sorted.extend(ch)
119 if line[0:3] == 'TER':
120 sequence.append('XX')
123 if line[0:6] == 'SSBOND':
125 b.append(int(line[17:21]))
126 b.append(int(line[31:35]))
129 c.append((line[15:16]))
130 c.append((line[29:30]))
132 if line[0:3] == 'END':
134 if not sequence[-1] == 'XX':
136 while sequence[-1] == 'XX':
138 if sequence[0] != 'G':
139 sequence.insert(0,'X')
140 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
141 if sequence[-1] != 'G':
143 seq=''.join(sequence)
145 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
147 for c in chain_sorted:
148 unres_shift[c]=i+chain_start[c]
149 i=i-(chain_end[c]-chain_start[c])-3
150 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
152 return seq,json.dumps(ssbond)
158 tasks = Task.objects.filter(owner=user).order_by('-created_date')
160 return render(request, "index.html", {
161 'tasks': tasks, 'alldone': 0
166 if request.method == 'POST':
167 form = TaskForm(request.POST)
169 name = form.cleaned_data["name"]
171 task = Task(name=name,owner=user,ready=False)
173 return redirect('add_min',task_id=task.id)
177 def add_min(request,task_id):
178 task = get_object_or_404(Task, id=task_id)
179 if request.method == 'POST':
180 if '_example' in request.POST:
181 data= {'name':task.name,'pdbid':'1BDD'}
182 form = TaskForm_min(initial=data)
184 form = TaskForm_min(request.POST,request.FILES)
186 task.name=form.cleaned_data["name"]
188 pdbid=form.cleaned_data["pdbid"]
190 basename = str(task.owner)
191 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
192 task.jobdirname = "_".join([basename, suffix])
195 task.myfile1=load_pdbid(pdbid,task.jobdirname)
198 task.myfile1=form.cleaned_data["file1"]
200 seq,task.ssbond=from_pdb(task.myfile1)
202 for i in range(0,len(seq),40):
203 task.md_seq=task.md_seq+seq[i:i+40]+" "
208 if is_lazy_user(request.user):
209 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
213 data= {'name':task.name}
214 form = TaskForm_min(initial=data)
215 p_type='minimization'
217 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
220 def add_min_a(request,task_id):
221 task = get_object_or_404(Task, id=task_id)
222 if request.method == 'POST':
223 if '_example' in request.POST:
224 data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
225 form = TaskForm_min_a(initial=data)
227 form = TaskForm_min_a(request.POST,request.FILES)
229 task.name=form.cleaned_data["name"]
231 # task.min_choice=form.cleaned_data["min_choice"]
232 task.min_overlap=form.cleaned_data["min_overlap"]
233 task.min_searchsc=form.cleaned_data["min_searchsc"]
234 task.min_maxmin=form.cleaned_data["min_maxmin"]
235 task.min_maxfun=form.cleaned_data["min_maxfun"]
236 task.min_pdbout=form.cleaned_data["min_pdbout"]
238 basename = str(task.owner)
239 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
240 task.jobdirname = "_".join([basename, suffix])
242 pdbid=form.cleaned_data["pdbid"]
244 task.myfile1=load_pdbid(pdbid,task.jobdirname)
247 task.myfile1=form.cleaned_data["file1"]
249 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
250 task.unres_ff=form.cleaned_data["unres_ff"]
251 task.boxx=form.cleaned_data["boxx"]
252 task.boxy=form.cleaned_data["boxy"]
253 task.boxz=form.cleaned_data["boxz"]
255 seq,task.ssbond=from_pdb(task.myfile1)
257 for i in range(0,len(seq),40):
258 task.md_seq=task.md_seq+seq[i:i+40]+" "
263 if is_lazy_user(request.user):
264 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
268 data= {'name':task.name}
269 form = TaskForm_min_a(initial=data)
271 p_type='minimization - advanced options'
272 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
275 def add_md(request,task_id):
276 task = get_object_or_404(Task, id=task_id)
277 if request.method == 'POST':
278 if '_example' in request.POST:
279 data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
280 'md_pdbref':True,'md_temp':200}
281 form = TaskForm_md(initial=data)
283 form = TaskForm_md(request.POST,request.FILES)
285 task.name=form.cleaned_data["name"]
287 task.md_seed=form.cleaned_data["md_seed"]
288 task.md_start=form.cleaned_data["md_start"]
289 task.md_temp=form.cleaned_data["md_temp"]
290 task.md_nstep=form.cleaned_data["md_nstep"]
292 basename = str(task.owner)
293 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
294 task.jobdirname = "_".join([basename, suffix])
296 pdbid=form.cleaned_data["pdbid"]
298 task.myfile1=load_pdbid(pdbid,task.jobdirname)
301 task.myfile1=form.cleaned_data["file1"]
302 task.md_pdbref=form.cleaned_data["md_pdbref"]
305 if task.md_start == "pdbstart" or task.md_pdbref:
306 seq,task.ssbond=from_pdb(task.myfile1)
308 seq=seq_add_x(form.cleaned_data["md_seq"])
310 for i in range(0,len(seq),40):
311 task.md_seq=task.md_seq+seq[i:i+40]+" "
313 if task.md_start != "pdbstart":
319 if is_lazy_user(request.user):
320 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
324 data= {'name':task.name}
325 form = TaskForm_md(initial=data)
327 p_type='molecular dynamics'
328 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
331 def add_md_a(request,task_id):
332 task = get_object_or_404(Task, id=task_id)
333 if request.method == 'POST':
334 if '_example' in request.POST:
335 data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
336 'md_pdbref':True,'md_mdpdb':True}
337 form = TaskForm_md_a(initial=data)
339 form = TaskForm_md_a(request.POST,request.FILES)
341 task.name=form.cleaned_data["name"]
344 basename = str(task.owner)
345 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
346 task.jobdirname = "_".join([basename, suffix])
348 pdbid=form.cleaned_data["pdbid"]
350 task.myfile1=load_pdbid(pdbid,task.jobdirname)
353 task.myfile1=form.cleaned_data["file1"]
354 task.md_start=form.cleaned_data["md_start"]
355 task.md_pdbref=form.cleaned_data["md_pdbref"]
358 if task.md_start == "pdbstart" or task.md_pdbref:
359 seq,task.ssbond=from_pdb(task.myfile1)
360 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
362 seq=seq_add_x(form.cleaned_data["md_seq"])
363 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
365 for i in range(0,len(seq),40):
366 task.md_seq=task.md_seq+seq[i:i+40]+" "
368 if task.md_start != "pdbstart":
371 task.md_seed=form.cleaned_data["md_seed"]
373 task.md_temp=form.cleaned_data["md_temp"]
374 task.md_nstep=form.cleaned_data["md_nstep"]
375 task.md_ntwe=form.cleaned_data["md_ntwe"]
376 task.md_ntwx=form.cleaned_data["md_ntwx"]
377 task.md_dt=form.cleaned_data["md_dt"]
378 task.md_lang=form.cleaned_data["md_lang"]
379 task.md_tau=form.cleaned_data["md_tau"]
380 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
381 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
382 task.unres_ff=form.cleaned_data["unres_ff"]
383 task.md_respa=form.cleaned_data["md_respa"]
384 task.boxx=form.cleaned_data["boxx"]
385 task.boxy=form.cleaned_data["boxy"]
386 task.boxz=form.cleaned_data["boxz"]
392 if is_lazy_user(request.user):
393 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
397 data= {'name':task.name}
398 form = TaskForm_md_a(initial=data)
400 p_type='molecular dynamics - advanced options'
401 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
404 def add_remd(request,task_id):
405 task = get_object_or_404(Task, id=task_id)
406 if request.method == 'POST':
407 if '_example' in request.POST:
408 data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True}
409 form = TaskForm_remd(initial=data)
411 form = TaskForm_remd(request.POST,request.FILES)
413 task.name=form.cleaned_data["name"]
415 task.md_start=form.cleaned_data["md_start"]
417 basename = str(task.owner)
418 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
419 task.jobdirname = "_".join([basename, suffix])
421 pdbid=form.cleaned_data["pdbid"]
423 task.myfile1=load_pdbid(pdbid,task.jobdirname)
426 task.myfile1=form.cleaned_data["file1"]
427 task.md_pdbref=form.cleaned_data["md_pdbref"]
428 task.md_ntwx=task.remd_nstex
431 if task.md_start == "pdbstart" or task.md_pdbref:
432 seq,task.ssbond=from_pdb(task.myfile1)
434 seq=seq_add_x(form.cleaned_data["md_seq"])
435 for i in range(0,len(seq),40):
436 task.md_seq=task.md_seq+seq[i:i+40]+" "
438 if task.md_start != "pdbstart":
441 task.md_seed=form.cleaned_data["md_seed"]
443 task.md_nstep=form.cleaned_data["md_nstep"]
450 if is_lazy_user(request.user):
451 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
455 data= {'name':task.name}
456 form = TaskForm_remd(initial=data)
458 p_type='replica exchange molecular dynamics'
459 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
462 def add_remd_a(request,task_id):
463 from django.core.files.uploadedfile import UploadedFile
464 task = get_object_or_404(Task, id=task_id)
465 if request.method == 'POST':
466 if '_example' in request.POST:
467 data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
468 'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2',
469 'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
470 form = TaskForm_remd_a(initial=data)
471 task.example='casp12'
473 elif '_example_saxs' in request.POST:
474 data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
475 'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2',
476 'remd_cluter_temp':270,
477 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
515 form = TaskForm_remd_a(initial=data)
517 form = TaskForm_remd_a(request.POST,request.FILES)
519 task.name=form.cleaned_data["name"]
522 basename = str(task.owner)
523 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
524 task.jobdirname = "_".join([basename, suffix])
526 pdbid=form.cleaned_data["pdbid"]
528 task.myfile1=load_pdbid(pdbid,task.jobdirname)
531 task.myfile1=form.cleaned_data["file1"]
532 task.md_start=form.cleaned_data["md_start"]
533 task.md_pdbref=form.cleaned_data["md_pdbref"]
536 if task.md_start == "pdbstart" or task.md_pdbref:
537 seq,task.ssbond=from_pdb(task.myfile1)
538 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
540 seq=seq_add_x(form.cleaned_data["md_seq"])
541 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
543 for i in range(0,len(seq),40):
544 task.md_seq=task.md_seq+seq[i:i+40]+" "
546 if task.md_start != "pdbstart":
549 task.md_seed=form.cleaned_data["md_seed"]
550 task.md_nstep=form.cleaned_data["md_nstep"]
551 task.md_dt=form.cleaned_data["md_dt"]
552 task.md_lang=form.cleaned_data["md_lang"]
553 task.md_tau=form.cleaned_data["md_tau"]
554 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
555 task.remd_nrep=form.cleaned_data["remd_nrep"]
556 task.remd_nstex=form.cleaned_data["remd_nstex"]
557 task.md_ntwx=form.cleaned_data["md_ntwx"]
558 task.md_ntwe=form.cleaned_data["md_ntwe"]
559 task.md_respa=form.cleaned_data["md_respa"]
560 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
561 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
563 task.boxx=form.cleaned_data["boxx"]
564 task.boxy=form.cleaned_data["boxy"]
565 task.boxz=form.cleaned_data["boxz"]
567 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
568 task.unres_ff=form.cleaned_data["unres_ff"]
570 task.scal_rad = form.cleaned_data["scal_rad"]
571 task.saxs_data = form.cleaned_data["saxs_data"]
572 task.wsaxs = form.cleaned_data["wsaxs"]
575 return redirect('addmlist',task_id=task.id)
577 data= {'name':task.name}
578 form = TaskForm_remd_a(initial=data)
580 p_type='replica exchange molecular dynamics - advanced options'
581 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
584 def addmlist(request,task_id):
585 task = get_object_or_404(Task, id=task_id)
586 if request.method == 'POST':
587 form = TaskForm_list(task.remd_nrep,request.POST)
589 task.remd_multi_t=form.cleaned_data["temperatures"]
590 task.remd_multi_m=form.cleaned_data["multiplexing"]
594 if is_lazy_user(request.user):
595 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
599 if task.example == 'casp12':
600 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
601 '["2", "2", "2", "2", "2", "2", "2", "2"]',
603 '["270", "280", "290", "300", "310", "320", "330", "340"]'
605 elif task.unres_ff == 'FF2':
606 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
607 '["1", "1", "1", "1", "1", "1", "1", "1"]',
609 '["270", "280", "290", "300", "310", "320", "330", "345"]'
612 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
613 '["1", "1", "1", "1", "1", "1", "1", "1"]',
615 '["250", "260", "270", "280", "290", "300", "315", "330"]'
618 form = TaskForm_list(task.remd_nrep,initial=data)
619 p_type='replica exchange molecular dynamics - advanced options'
620 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
623 def details(request,task_id):
624 task = get_object_or_404(Task, id=task_id)
625 return render(request, "details.html",{'task':task})
628 def details1(request,user_id,task_id):
629 task = get_object_or_404(Task, id=task_id)
630 return render(request, "details1.html",{'task':task})
634 def delete(request, task_id):
635 Task.objects.get(id=task_id).delete()
638 def refresh_done1(request, task_id):
639 task = get_object_or_404(Task, id=task_id)
643 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
646 for line in proc.stdout:
647 if 'piasek4' in line:
648 if line.split()[1]=='test_server':
650 if line.split()[-2]=='Q':
652 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
654 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
658 def refresh_done(request):
660 tasks = Task.objects.filter(owner=user).order_by('-created_date')
667 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
670 for line in proc.stdout:
671 if 'piasek4' in line:
672 if line.split()[1]=='test_server':
674 if line.split()[-2]=='Q':
676 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
678 if is_lazy_user(request.user):
679 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
681 return render(request, "index.html", {
683 'variable' : variable,
688 def refresh_done0(task):
689 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
692 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
694 if task.type=='min' or task.type=='md':
698 task.etot=line.split()[1]
700 if 'RMS deviation' in line:
708 if 'Total wall' in line:
711 elif task.type=='remd':
713 text="Acceptance for replica exchanges and number of exchange attempts\n"
718 text=text+' '.join(line.split()[2:])+"\n"
719 if j==task.remd_nrep:
721 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
723 if 'Total wall' in line:
726 task.results_text=text
729 if task.md_pdbref and task.type=='remd':
733 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
736 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
738 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
740 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
742 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
744 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
745 except EnvironmentError:
746 print 'file_wham_T*pdb open error'
748 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
751 if 'RMSD of the common residues=' in line:
752 text=' RMSD='+line.split()[5]
753 if 'TM-score =' in line:
754 text=text+' TMscore='+line.split()[2]
755 if 'GDT-TS-score=' in line:
756 text=text+' GDT_TS='+line.split()[1]
759 task.remd_model1=task.remd_model1+text
761 task.remd_model2=task.remd_model2+text
763 task.remd_model3=task.remd_model3+text
765 task.remd_model4=task.remd_model4+text
767 task.remd_model5=task.remd_model5+text
771 if task.type=='remd':
772 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
775 if 'sumprob' in line:
782 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
784 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
786 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
788 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
790 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
795 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
796 if (task.type=='min'):
799 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
804 last = line.split()[0]
807 task.running=int(1+int(last)*100.0/task.md_nstep)