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':'1E0G','md_pdbref':True,
468 'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2',
469 'remd_cluter_temp':280}
470 form = TaskForm_remd_a(initial=data)
471 elif '_example_saxs' in request.POST:
472 data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
473 'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2',
474 'remd_cluter_temp':270,
475 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
513 form = TaskForm_remd_a(initial=data)
515 form = TaskForm_remd_a(request.POST,request.FILES)
517 task.name=form.cleaned_data["name"]
520 basename = str(task.owner)
521 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
522 task.jobdirname = "_".join([basename, suffix])
524 pdbid=form.cleaned_data["pdbid"]
526 task.myfile1=load_pdbid(pdbid,task.jobdirname)
529 task.myfile1=form.cleaned_data["file1"]
530 task.md_start=form.cleaned_data["md_start"]
531 task.md_pdbref=form.cleaned_data["md_pdbref"]
534 if task.md_start == "pdbstart" or task.md_pdbref:
535 seq,task.ssbond=from_pdb(task.myfile1)
536 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
538 seq=seq_add_x(form.cleaned_data["md_seq"])
539 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
541 for i in range(0,len(seq),40):
542 task.md_seq=task.md_seq+seq[i:i+40]+" "
544 if task.md_start != "pdbstart":
547 task.md_seed=form.cleaned_data["md_seed"]
548 task.md_nstep=form.cleaned_data["md_nstep"]
549 task.md_dt=form.cleaned_data["md_dt"]
550 task.md_lang=form.cleaned_data["md_lang"]
551 task.md_tau=form.cleaned_data["md_tau"]
552 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
553 task.remd_nrep=form.cleaned_data["remd_nrep"]
554 task.remd_nstex=form.cleaned_data["remd_nstex"]
555 task.md_ntwx=form.cleaned_data["md_ntwx"]
556 task.md_ntwe=form.cleaned_data["md_ntwe"]
557 task.md_respa=form.cleaned_data["md_respa"]
558 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
559 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
561 task.boxx=form.cleaned_data["boxx"]
562 task.boxy=form.cleaned_data["boxy"]
563 task.boxz=form.cleaned_data["boxz"]
565 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
566 task.unres_ff=form.cleaned_data["unres_ff"]
568 task.scal_rad = form.cleaned_data["scal_rad"]
569 task.saxs_data = form.cleaned_data["saxs_data"]
570 task.wsaxs = form.cleaned_data["wsaxs"]
573 return redirect('addmlist',task_id=task.id)
575 data= {'name':task.name}
576 form = TaskForm_remd_a(initial=data)
578 p_type='replica exchange molecular dynamics - advanced options'
579 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
582 def addmlist(request,task_id):
583 task = get_object_or_404(Task, id=task_id)
584 if request.method == 'POST':
585 form = TaskForm_list(task.remd_nrep,request.POST)
587 task.remd_multi_t=form.cleaned_data["temperatures"]
588 task.remd_multi_m=form.cleaned_data["multiplexing"]
592 if is_lazy_user(request.user):
593 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
597 if task.unres_ff == 'FF2':
598 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
599 '["1", "1", "1", "1", "1", "1", "1", "1"]',
601 '["270", "280", "290", "300", "310", "320", "330", "345"]'
604 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
605 '["1", "1", "1", "1", "1", "1", "1", "1"]',
607 '["250", "260", "270", "280", "290", "300", "315", "330"]'
610 form = TaskForm_list(task.remd_nrep,initial=data)
611 p_type='replica exchange molecular dynamics - advanced options'
612 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
615 def details(request,task_id):
616 task = get_object_or_404(Task, id=task_id)
617 return render(request, "details.html",{'task':task})
620 def details1(request,user_id,task_id):
621 task = get_object_or_404(Task, id=task_id)
622 return render(request, "details1.html",{'task':task})
626 def delete(request, task_id):
627 Task.objects.get(id=task_id).delete()
630 def refresh_done1(request, task_id):
631 task = get_object_or_404(Task, id=task_id)
635 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
638 for line in proc.stdout:
639 if 'piasek4' in line:
640 if line.split()[1]=='test_server':
642 if line.split()[-2]=='Q':
644 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
646 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
650 def refresh_done(request):
652 tasks = Task.objects.filter(owner=user).order_by('-created_date')
659 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
662 for line in proc.stdout:
663 if 'piasek4' in line:
664 if line.split()[1]=='test_server':
666 if line.split()[-2]=='Q':
668 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
670 if is_lazy_user(request.user):
671 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
673 return render(request, "index.html", {
675 'variable' : variable,
680 def refresh_done0(task):
681 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
684 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
686 if task.type=='min' or task.type=='md':
690 task.etot=line.split()[1]
692 if 'RMS deviation' in line:
700 if 'Total wall' in line:
703 elif task.type=='remd':
705 text="Acceptance for replica exchanges and number of exchange attempts\n"
710 text=text+' '.join(line.split()[2:])+"\n"
711 if j==task.remd_nrep:
713 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
715 if 'Total wall' in line:
718 task.results_text=text
721 if task.md_pdbref and task.type=='remd':
725 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
728 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
730 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
732 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
734 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
736 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
737 except EnvironmentError:
738 print 'file_wham_T*pdb open error'
740 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
743 if 'RMSD of the common residues=' in line:
744 text=' RMSD='+line.split()[5]
745 if 'TM-score =' in line:
746 text=text+' TMscore='+line.split()[2]
747 if 'GDT-TS-score=' in line:
748 text=text+' GDT_TS='+line.split()[1]
751 task.remd_model1=task.remd_model1+text
753 task.remd_model2=task.remd_model2+text
755 task.remd_model3=task.remd_model3+text
757 task.remd_model4=task.remd_model4+text
759 task.remd_model5=task.remd_model5+text
763 if task.type=='remd':
764 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
767 if 'sumprob' in line:
774 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
776 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
778 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
780 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
782 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
787 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
788 if (task.type=='min'):
791 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
796 last = line.split()[0]
799 task.running=int(1+int(last)*100.0/task.md_nstep)