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' and i != '':
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.min_maxfun=form.cleaned_data["min_maxfun"]
556 task.remd_nrep=form.cleaned_data["remd_nrep"]
557 task.remd_nstex=form.cleaned_data["remd_nstex"]
558 task.md_ntwx=form.cleaned_data["md_ntwx"]
559 task.md_ntwe=form.cleaned_data["md_ntwe"]
560 task.md_respa=form.cleaned_data["md_respa"]
561 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
562 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
564 task.boxx=form.cleaned_data["boxx"]
565 task.boxy=form.cleaned_data["boxy"]
566 task.boxz=form.cleaned_data["boxz"]
568 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
569 task.unres_ff=form.cleaned_data["unres_ff"]
571 task.scal_rad = form.cleaned_data["scal_rad"]
572 task.saxs_data = form.cleaned_data["saxs_data"]
573 task.wsaxs = form.cleaned_data["wsaxs"]
576 return redirect('addmlist',task_id=task.id)
578 data= {'name':task.name}
579 form = TaskForm_remd_a(initial=data)
581 p_type='replica exchange molecular dynamics - advanced options'
582 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
585 def addmlist(request,task_id):
586 task = get_object_or_404(Task, id=task_id)
587 if request.method == 'POST':
588 form = TaskForm_list(task.remd_nrep,request.POST)
590 task.remd_multi_t=form.cleaned_data["temperatures"]
591 task.remd_multi_m=form.cleaned_data["multiplexing"]
595 if is_lazy_user(request.user):
596 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
600 if task.example == 'casp12':
601 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
602 '["2", "2", "2", "2", "2", "2", "2", "2"]',
604 '["270", "280", "290", "300", "310", "320", "330", "340"]'
606 elif task.unres_ff == 'FF2':
607 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
608 '["1", "1", "1", "1", "1", "1", "1", "1"]',
610 '["270", "280", "290", "300", "310", "320", "330", "345"]'
613 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
614 '["1", "1", "1", "1", "1", "1", "1", "1"]',
616 '["250", "260", "270", "280", "290", "300", "315", "330"]'
619 form = TaskForm_list(task.remd_nrep,initial=data)
620 p_type='replica exchange molecular dynamics - advanced options'
621 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
624 def details(request,task_id):
625 task = get_object_or_404(Task, id=task_id)
626 return render(request, "details.html",{'task':task})
629 def details1(request,user_id,task_id):
630 task = get_object_or_404(Task, id=task_id)
631 return render(request, "details1.html",{'task':task})
635 def delete(request, task_id):
636 Task.objects.get(id=task_id).delete()
639 def refresh_done1(request, task_id):
640 task = get_object_or_404(Task, id=task_id)
644 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
647 for line in proc.stdout:
648 if 'piasek4' in line:
649 if line.split()[1]=='test_server':
651 if line.split()[-2]=='Q':
653 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
655 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
659 def refresh_done(request):
661 tasks = Task.objects.filter(owner=user).order_by('-created_date')
668 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
671 for line in proc.stdout:
672 if 'piasek4' in line:
673 if line.split()[1]=='test_server':
675 if line.split()[-2]=='Q':
677 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
679 if is_lazy_user(request.user):
680 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
682 return render(request, "index.html", {
684 'variable' : variable,
689 def refresh_done0(task):
690 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
693 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
695 if task.type=='min' or task.type=='md':
699 task.etot=line.split()[1]
701 if 'RMS deviation' in line:
709 if 'Total wall' in line:
712 elif task.type=='remd':
714 text="Acceptance for replica exchanges and number of exchange attempts\n"
719 text=text+' '.join(line.split()[2:])+"\n"
720 if j==task.remd_nrep:
722 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
724 if 'Total wall' in line:
727 task.results_text=text
730 if task.md_pdbref and task.type=='remd':
734 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
737 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
739 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
741 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
743 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
745 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
746 except EnvironmentError:
747 print 'file_wham_T*pdb open error'
749 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
752 if 'RMSD of the common residues=' in line:
753 text=' RMSD='+line.split()[5]
754 if 'TM-score =' in line:
755 text=text+' TMscore='+line.split()[2]
756 if 'GDT-TS-score=' in line:
757 text=text+' GDT_TS='+line.split()[1]
760 task.remd_model1=task.remd_model1+text
762 task.remd_model2=task.remd_model2+text
764 task.remd_model3=task.remd_model3+text
766 task.remd_model4=task.remd_model4+text
768 task.remd_model5=task.remd_model5+text
772 if task.type=='remd':
773 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
776 if 'sumprob' in line:
783 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
785 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
787 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
789 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
791 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
796 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
797 if (task.type=='min'):
800 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
805 last = line.split()[0]
808 task.running=int(1+int(last)*100.0/task.md_nstep)