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 seq_2d_from_pdb(seq_2d,seq):
35 seq_2d=seq_2d.replace('C', '-')
38 for i in range(0,len(seq)):
40 seq_2d_tmp=seq_2d_tmp+'-'
43 seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
46 for i in range(0,len(seq_2d_tmp),40):
47 tmp=tmp+seq_2d_tmp[i:i+40]+" "
50 def seq_2d_add_x(seq_2d,seq,seq_form):
53 seq_2d=seq_2d[:len(seq_form)]
54 seq_2d=seq_2d.replace('C', '-')
55 if seq_form[0] !='X' and seq[0] == 'X':
57 if seq_form[-1] !='X' and seq[-1] == 'X':
59 seq_2d=seq_2d[:len(seq)]
61 for i in range(0,len(seq_2d),40):
62 tmp=tmp+seq_2d[i:i+40]+" "
65 def seq_add_x(sequence):
66 if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
68 if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
70 set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
71 sequence = ''.join([c for c in sequence if c in set])
87 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
88 aa = three_to_one.get(line[17:20])
91 if newchain or i!=ires[-1]:
96 chain_sorted.extend(ch)
98 if line[0:3] == 'TER':
102 if line[0:6] == 'SSBOND':
104 b.append(int(line[17:21]))
105 b.append(int(line[31:35]))
108 c.append((line[15:16]))
109 c.append((line[29:30]))
111 if line[0:3] == 'END':
113 if not sequence[-1] == 'XX':
115 while sequence[-1] == 'XX':
117 if sequence[0] != 'G':
118 sequence.insert(0,'X')
119 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
120 if sequence[-1] != 'G':
122 seq=''.join(sequence)
124 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
126 for c in chain_sorted:
127 unres_shift[c]=i+chain_start[c]
128 i=i-(chain_end[c]-chain_start[c])-3
129 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
131 return seq,json.dumps(ssbond)
137 tasks = Task.objects.filter(owner=user).order_by('-created_date')
139 return render(request, "index.html", {
140 'tasks': tasks, 'alldone': 0
145 if request.method == 'POST':
146 form = TaskForm(request.POST)
148 name = form.cleaned_data["name"]
150 task = Task(name=name,owner=user,ready=False)
152 return redirect('add_min',task_id=task.id)
156 def add_min(request,task_id):
157 task = get_object_or_404(Task, id=task_id)
158 if request.method == 'POST':
159 if '_example' in request.POST:
160 data= {'name':task.name,'pdbid':'1BDD'}
161 form = TaskForm_min(initial=data)
163 form = TaskForm_min(request.POST,request.FILES)
165 task.name=form.cleaned_data["name"]
167 pdbid=form.cleaned_data["pdbid"]
169 basename = str(task.owner)
170 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
171 task.jobdirname = "_".join([basename, suffix])
174 os.mkdir(task.jobdirname)
175 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
176 task.jobdirname+'/plik.pdb')
179 task.myfile1=form.cleaned_data["file1"]
181 seq,task.ssbond=from_pdb(task.myfile1)
183 for i in range(0,len(seq),40):
184 task.md_seq=task.md_seq+seq[i:i+40]+" "
189 if is_lazy_user(request.user):
190 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
194 data= {'name':task.name}
195 form = TaskForm_min(initial=data)
196 p_type='minimization'
198 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
201 def add_min_a(request,task_id):
202 task = get_object_or_404(Task, id=task_id)
203 if request.method == 'POST':
204 if '_example' in request.POST:
205 data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
206 form = TaskForm_min_a(initial=data)
208 form = TaskForm_min_a(request.POST,request.FILES)
210 task.name=form.cleaned_data["name"]
212 task.min_choice=form.cleaned_data["min_choice"]
213 task.min_overlap=form.cleaned_data["min_overlap"]
214 task.min_searchsc=form.cleaned_data["min_searchsc"]
215 task.min_maxmin=form.cleaned_data["min_maxmin"]
216 task.min_maxfun=form.cleaned_data["min_maxfun"]
217 task.min_pdbout=form.cleaned_data["min_pdbout"]
219 basename = str(task.owner)
220 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
221 task.jobdirname = "_".join([basename, suffix])
223 pdbid=form.cleaned_data["pdbid"]
225 os.mkdir(task.jobdirname)
226 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
227 task.jobdirname+'/plik.pdb')
230 task.myfile1=form.cleaned_data["file1"]
232 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
233 task.unres_ff=form.cleaned_data["unres_ff"]
234 task.boxx=form.cleaned_data["boxx"]
235 task.boxy=form.cleaned_data["boxy"]
236 task.boxz=form.cleaned_data["boxz"]
238 seq,task.ssbond=from_pdb(task.myfile1)
240 for i in range(0,len(seq),40):
241 task.md_seq=task.md_seq+seq[i:i+40]+" "
246 if is_lazy_user(request.user):
247 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
251 data= {'name':task.name}
252 form = TaskForm_min_a(initial=data)
254 p_type='minimization - advanced options'
255 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
258 def add_md(request,task_id):
259 task = get_object_or_404(Task, id=task_id)
260 if request.method == 'POST':
261 if '_example' in request.POST:
262 data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
263 'md_pdbref':True,'md_temp':200}
264 form = TaskForm_md(initial=data)
266 form = TaskForm_md(request.POST,request.FILES)
268 task.name=form.cleaned_data["name"]
270 task.md_seed=form.cleaned_data["md_seed"]
271 task.md_start=form.cleaned_data["md_start"]
272 task.md_temp=form.cleaned_data["md_temp"]
273 task.md_nstep=form.cleaned_data["md_nstep"]
275 basename = str(task.owner)
276 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
277 task.jobdirname = "_".join([basename, suffix])
279 pdbid=form.cleaned_data["pdbid"]
281 os.mkdir(task.jobdirname)
282 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
283 task.jobdirname+'/plik.pdb')
286 task.myfile1=form.cleaned_data["file1"]
287 task.md_pdbref=form.cleaned_data["md_pdbref"]
290 if task.md_start == "pdbstart" or task.md_pdbref:
291 seq,task.ssbond=from_pdb(task.myfile1)
293 seq=seq_add_x(form.cleaned_data["md_seq"])
295 for i in range(0,len(seq),40):
296 task.md_seq=task.md_seq+seq[i:i+40]+" "
298 if task.md_start != "pdbstart":
304 if is_lazy_user(request.user):
305 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
309 data= {'name':task.name}
310 form = TaskForm_md(initial=data)
312 p_type='molecular dynamics'
313 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
316 def add_md_a(request,task_id):
317 task = get_object_or_404(Task, id=task_id)
318 if request.method == 'POST':
319 if '_example' in request.POST:
320 data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
321 'md_pdbref':True,'md_mdpdb':True}
322 form = TaskForm_md_a(initial=data)
324 form = TaskForm_md_a(request.POST,request.FILES)
326 task.name=form.cleaned_data["name"]
329 basename = str(task.owner)
330 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
331 task.jobdirname = "_".join([basename, suffix])
333 pdbid=form.cleaned_data["pdbid"]
335 os.mkdir(task.jobdirname)
336 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
337 task.jobdirname+'/plik.pdb')
340 task.myfile1=form.cleaned_data["file1"]
341 task.md_start=form.cleaned_data["md_start"]
342 task.md_pdbref=form.cleaned_data["md_pdbref"]
345 if task.md_start == "pdbstart" or task.md_pdbref:
346 seq,task.ssbond=from_pdb(task.myfile1)
347 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
349 seq=seq_add_x(form.cleaned_data["md_seq"])
350 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
352 for i in range(0,len(seq),40):
353 task.md_seq=task.md_seq+seq[i:i+40]+" "
355 if task.md_start != "pdbstart":
358 task.md_seed=form.cleaned_data["md_seed"]
360 task.md_temp=form.cleaned_data["md_temp"]
361 task.md_nstep=form.cleaned_data["md_nstep"]
362 task.md_ntwe=form.cleaned_data["md_ntwe"]
363 task.md_ntwx=form.cleaned_data["md_ntwx"]
364 task.md_dt=form.cleaned_data["md_dt"]
365 task.md_lang=form.cleaned_data["md_lang"]
366 task.md_tau=form.cleaned_data["md_tau"]
367 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
368 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
369 task.unres_ff=form.cleaned_data["unres_ff"]
370 task.md_respa=form.cleaned_data["md_respa"]
371 task.boxx=form.cleaned_data["boxx"]
372 task.boxy=form.cleaned_data["boxy"]
373 task.boxz=form.cleaned_data["boxz"]
379 if is_lazy_user(request.user):
380 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
384 data= {'name':task.name}
385 form = TaskForm_md_a(initial=data)
387 p_type='molecular dynamics - advanced options'
388 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
391 def add_remd(request,task_id):
392 task = get_object_or_404(Task, id=task_id)
393 if request.method == 'POST':
394 if '_example' in request.POST:
395 data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True}
396 form = TaskForm_remd(initial=data)
398 form = TaskForm_remd(request.POST,request.FILES)
400 task.name=form.cleaned_data["name"]
402 task.md_start=form.cleaned_data["md_start"]
404 basename = str(task.owner)
405 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
406 task.jobdirname = "_".join([basename, suffix])
408 pdbid=form.cleaned_data["pdbid"]
410 os.mkdir(task.jobdirname)
411 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
412 task.jobdirname+'/plik.pdb')
415 task.myfile1=form.cleaned_data["file1"]
416 task.md_pdbref=form.cleaned_data["md_pdbref"]
417 task.md_ntwx=task.remd_nstex
420 if task.md_start == "pdbstart" or task.md_pdbref:
421 seq,task.ssbond=from_pdb(task.myfile1)
423 seq=seq_add_x(form.cleaned_data["md_seq"])
424 for i in range(0,len(seq),40):
425 task.md_seq=task.md_seq+seq[i:i+40]+" "
427 if task.md_start != "pdbstart":
430 task.md_seed=form.cleaned_data["md_seed"]
432 task.md_nstep=form.cleaned_data["md_nstep"]
439 if is_lazy_user(request.user):
440 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
444 data= {'name':task.name}
445 form = TaskForm_remd(initial=data)
447 p_type='replica exchange molecular dynamics'
448 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
451 def add_remd_a(request,task_id):
452 from django.core.files.uploadedfile import UploadedFile
453 task = get_object_or_404(Task, id=task_id)
454 if request.method == 'POST':
455 if '_example' in request.POST:
456 data= {'name':task.name,'pdbid':'1E0G','md_pdbref':True,
457 'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2',
458 'remd_cluter_temp':280}
459 form = TaskForm_remd_a(initial=data)
460 elif '_example_saxs' in request.POST:
461 data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
462 'md_nstep':200000,'md_lang':'langevin','unres_ff':'E0LL2Y',
463 'remd_cluter_temp':270,
464 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
502 form = TaskForm_remd_a(initial=data)
504 form = TaskForm_remd_a(request.POST,request.FILES)
506 task.name=form.cleaned_data["name"]
509 basename = str(task.owner)
510 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
511 task.jobdirname = "_".join([basename, suffix])
513 pdbid=form.cleaned_data["pdbid"]
515 os.mkdir(task.jobdirname)
516 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
517 task.jobdirname+'/plik.pdb')
520 task.myfile1=form.cleaned_data["file1"]
521 task.md_start=form.cleaned_data["md_start"]
522 task.md_pdbref=form.cleaned_data["md_pdbref"]
525 if task.md_start == "pdbstart" or task.md_pdbref:
526 seq,task.ssbond=from_pdb(task.myfile1)
527 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
529 seq=seq_add_x(form.cleaned_data["md_seq"])
530 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
532 for i in range(0,len(seq),40):
533 task.md_seq=task.md_seq+seq[i:i+40]+" "
535 if task.md_start != "pdbstart":
538 task.md_seed=form.cleaned_data["md_seed"]
539 task.md_nstep=form.cleaned_data["md_nstep"]
540 task.md_dt=form.cleaned_data["md_dt"]
541 task.md_lang=form.cleaned_data["md_lang"]
542 task.md_tau=form.cleaned_data["md_tau"]
543 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
544 task.remd_nrep=form.cleaned_data["remd_nrep"]
545 task.remd_nstex=form.cleaned_data["remd_nstex"]
546 task.md_ntwx=form.cleaned_data["md_ntwx"]
547 task.md_ntwe=form.cleaned_data["md_ntwe"]
548 task.md_respa=form.cleaned_data["md_respa"]
549 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
550 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
552 task.boxx=form.cleaned_data["boxx"]
553 task.boxy=form.cleaned_data["boxy"]
554 task.boxz=form.cleaned_data["boxz"]
556 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
557 task.unres_ff=form.cleaned_data["unres_ff"]
559 task.scal_rad = form.cleaned_data["scal_rad"]
560 task.saxs_data = form.cleaned_data["saxs_data"]
561 task.wsaxs = form.cleaned_data["wsaxs"]
564 return redirect('addmlist',task_id=task.id)
566 data= {'name':task.name}
567 form = TaskForm_remd_a(initial=data)
569 p_type='replica exchange molecular dynamics - advanced options'
570 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
573 def addmlist(request,task_id):
574 task = get_object_or_404(Task, id=task_id)
575 if request.method == 'POST':
576 form = TaskForm_list(task.remd_nrep,request.POST)
578 task.remd_multi_t=form.cleaned_data["temperatures"]
579 task.remd_multi_m=form.cleaned_data["multiplexing"]
583 if is_lazy_user(request.user):
584 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
588 if task.unres_ff == 'E0LL2Y':
589 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
590 '["1", "1", "1", "1", "1", "1", "1", "1"]',
592 '["270", "280", "290", "300", "310", "320", "330", "345"]'
595 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
596 '["1", "1", "1", "1", "1", "1", "1", "1"]',
598 '["250", "260", "270", "280", "290", "300", "315", "330"]'
601 form = TaskForm_list(task.remd_nrep,initial=data)
602 p_type='replica exchange molecular dynamics - advanced options'
603 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
606 def details(request,task_id):
607 task = get_object_or_404(Task, id=task_id)
608 return render(request, "details.html",{'task':task})
611 def details1(request,user_id,task_id):
612 task = get_object_or_404(Task, id=task_id)
613 return render(request, "details1.html",{'task':task})
617 def delete(request, task_id):
618 Task.objects.get(id=task_id).delete()
621 def refresh_done1(request, task_id):
622 task = get_object_or_404(Task, id=task_id)
626 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
629 for line in proc.stdout:
630 if 'piasek4' in line:
631 if line.split()[1]=='test_server':
633 if line.split()[-2]=='Q':
635 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
637 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
641 def refresh_done(request):
643 tasks = Task.objects.filter(owner=user).order_by('-created_date')
650 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
653 for line in proc.stdout:
654 if 'piasek4' in line:
655 if line.split()[1]=='test_server':
657 if line.split()[-2]=='Q':
659 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
661 if is_lazy_user(request.user):
662 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
664 return render(request, "index.html", {
666 'variable' : variable,
671 def refresh_done0(task):
672 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
675 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
677 if task.type=='min' or task.type=='md':
681 task.etot=line.split()[1]
683 if 'RMS deviation' in line:
691 if 'Total wall' in line:
694 elif task.type=='remd':
696 text="Acceptance for replica exchanges and number of exchange attempts\n"
701 text=text+' '.join(line.split()[2:])+"\n"
702 if j==task.remd_nrep:
704 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
706 if 'Total wall' in line:
709 task.results_text=text
712 if task.md_pdbref and task.type=='remd':
716 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
719 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
721 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
723 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
725 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
727 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
728 except EnvironmentError:
729 print 'file_wham_T*pdb open error'
731 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
734 if 'RMSD of the common residues=' in line:
735 text=' RMSD='+line.split()[5]
736 if 'TM-score =' in line:
737 text=text+' TMscore='+line.split()[2]
738 if 'GDT-TS-score=' in line:
739 text=text+' GDT_TS='+line.split()[1]
742 task.remd_model1=task.remd_model1+text
744 task.remd_model2=task.remd_model2+text
746 task.remd_model3=task.remd_model3+text
748 task.remd_model4=task.remd_model4+text
750 task.remd_model5=task.remd_model5+text
754 if task.type=='remd':
755 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
758 if 'sumprob' in line:
765 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
767 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
769 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
771 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
773 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
778 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
779 if (task.type=='min'):
782 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
787 last = line.split()[0]
790 task.running=int(1+int(last)*100.0/task.md_nstep)