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_add_x(sequence):
33 if sequence[0] != 'G' and sequence[0] != 'g':
35 if sequence[-1] != 'G' and sequence[-1] != 'g':
37 set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnghlrwaveym'
38 sequence = ''.join([c for c in sequence if c in set])
54 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
55 aa = three_to_one.get(line[17:20])
58 if newchain or i!=ires[-1]:
63 chain_sorted.extend(ch)
65 if line[0:3] == 'TER':
69 if line[0:6] == 'SSBOND':
71 b.append(int(line[17:21]))
72 b.append(int(line[31:35]))
75 c.append((line[15:16]))
76 c.append((line[29:30]))
78 if line[0:3] == 'END':
80 if not sequence[-1] == 'XX':
82 while sequence[-1] == 'XX':
84 if sequence[0] != 'G':
85 sequence.insert(0,'X')
86 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
87 if sequence[-1] != 'G':
91 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
93 for c in chain_sorted:
94 unres_shift[c]=i+chain_start[c]
95 i=i-(chain_end[c]-chain_start[c])-3
96 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
98 return seq,json.dumps(ssbond)
104 tasks = Task.objects.filter(owner=user).order_by('-created_date')
106 return render(request, "index.html", {
107 'tasks': tasks, 'alldone': 0
112 if request.method == 'POST':
113 form = TaskForm(request.POST)
115 name = form.cleaned_data["name"]
117 task = Task(name=name,owner=user,ready=False)
119 return redirect('add_min',task_id=task.id)
123 def add_min(request,task_id):
124 task = get_object_or_404(Task, id=task_id)
125 if request.method == 'POST':
126 if '_example' in request.POST:
127 data= {'name':task.name,'pdbid':'1BDD'}
128 form = TaskForm_min(initial=data)
130 form = TaskForm_min(request.POST,request.FILES)
132 task.name=form.cleaned_data["name"]
134 pdbid=form.cleaned_data["pdbid"]
136 basename = str(task.owner)
137 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
138 task.jobdirname = "_".join([basename, suffix])
141 os.mkdir(task.jobdirname)
142 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
143 task.jobdirname+'/plik.pdb')
146 task.myfile1=form.cleaned_data["file1"]
148 seq,task.ssbond=from_pdb(task.myfile1)
150 for i in range(0,len(seq),40):
151 task.md_seq=task.md_seq+seq[i:i+40]+" "
156 if is_lazy_user(request.user):
157 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
161 data= {'name':task.name}
162 form = TaskForm_min(initial=data)
163 p_type='minimization'
165 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
168 def add_min_a(request,task_id):
169 task = get_object_or_404(Task, id=task_id)
170 if request.method == 'POST':
171 if '_example' in request.POST:
172 data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
173 form = TaskForm_min_a(initial=data)
175 form = TaskForm_min_a(request.POST,request.FILES)
177 task.name=form.cleaned_data["name"]
179 task.min_choice=form.cleaned_data["min_choice"]
180 task.min_overlap=form.cleaned_data["min_overlap"]
181 task.min_searchsc=form.cleaned_data["min_searchsc"]
182 task.min_maxmin=form.cleaned_data["min_maxmin"]
183 task.min_maxfun=form.cleaned_data["min_maxfun"]
184 task.min_pdbout=form.cleaned_data["min_pdbout"]
186 basename = str(task.owner)
187 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
188 task.jobdirname = "_".join([basename, suffix])
190 pdbid=form.cleaned_data["pdbid"]
192 os.mkdir(task.jobdirname)
193 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
194 task.jobdirname+'/plik.pdb')
197 task.myfile1=form.cleaned_data["file1"]
199 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
200 task.unres_ff=form.cleaned_data["unres_ff"]
201 task.boxx=form.cleaned_data["boxx"]
202 task.boxy=form.cleaned_data["boxy"]
203 task.boxz=form.cleaned_data["boxz"]
205 seq,task.ssbond=from_pdb(task.myfile1)
207 for i in range(0,len(seq),40):
208 task.md_seq=task.md_seq+seq[i:i+40]+" "
213 if is_lazy_user(request.user):
214 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
218 data= {'name':task.name}
219 form = TaskForm_min_a(initial=data)
221 p_type='minimization - advanced options'
222 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
225 def add_md(request,task_id):
226 task = get_object_or_404(Task, id=task_id)
227 if request.method == 'POST':
228 if '_example' in request.POST:
229 data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
230 'md_pdbref':True,'md_temp':200}
231 form = TaskForm_md(initial=data)
233 form = TaskForm_md(request.POST,request.FILES)
235 task.name=form.cleaned_data["name"]
237 task.md_seed=form.cleaned_data["md_seed"]
238 task.md_start=form.cleaned_data["md_start"]
239 task.md_temp=form.cleaned_data["md_temp"]
240 task.md_nstep=form.cleaned_data["md_nstep"]
242 basename = str(task.owner)
243 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
244 task.jobdirname = "_".join([basename, suffix])
246 pdbid=form.cleaned_data["pdbid"]
248 os.mkdir(task.jobdirname)
249 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
250 task.jobdirname+'/plik.pdb')
253 task.myfile1=form.cleaned_data["file1"]
254 task.md_pdbref=form.cleaned_data["md_pdbref"]
257 if task.md_start == "pdbstart" or task.md_pdbref:
258 seq,task.ssbond=from_pdb(task.myfile1)
260 seq=seq_add_x(form.cleaned_data["md_seq"])
262 for i in range(0,len(seq),40):
263 task.md_seq=task.md_seq+seq[i:i+40]+" "
265 if task.md_start != "pdbstart":
271 if is_lazy_user(request.user):
272 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
276 data= {'name':task.name}
277 form = TaskForm_md(initial=data)
279 p_type='molecular dynamics'
280 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
283 def add_md_a(request,task_id):
284 task = get_object_or_404(Task, id=task_id)
285 if request.method == 'POST':
286 if '_example' in request.POST:
287 data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
288 'md_pdbref':True,'md_mdpdb':True}
289 form = TaskForm_md_a(initial=data)
291 form = TaskForm_md_a(request.POST,request.FILES)
293 task.name=form.cleaned_data["name"]
296 basename = str(task.owner)
297 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
298 task.jobdirname = "_".join([basename, suffix])
300 pdbid=form.cleaned_data["pdbid"]
302 os.mkdir(task.jobdirname)
303 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
304 task.jobdirname+'/plik.pdb')
307 task.myfile1=form.cleaned_data["file1"]
308 task.md_start=form.cleaned_data["md_start"]
309 task.md_pdbref=form.cleaned_data["md_pdbref"]
312 if task.md_start == "pdbstart" or task.md_pdbref:
313 seq,task.ssbond=from_pdb(task.myfile1)
315 seq=seq_add_x(form.cleaned_data["md_seq"])
316 for i in range(0,len(seq),40):
317 task.md_seq=task.md_seq+seq[i:i+40]+" "
319 if task.md_start != "pdbstart":
322 task.md_seed=form.cleaned_data["md_seed"]
324 task.md_temp=form.cleaned_data["md_temp"]
325 task.md_nstep=form.cleaned_data["md_nstep"]
326 task.md_ntwe=form.cleaned_data["md_ntwe"]
327 task.md_ntwx=form.cleaned_data["md_ntwx"]
328 task.md_dt=form.cleaned_data["md_dt"]
329 task.md_lang=form.cleaned_data["md_lang"]
330 task.md_tau=form.cleaned_data["md_tau"]
331 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
332 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
333 task.unres_ff=form.cleaned_data["unres_ff"]
334 task.md_respa=form.cleaned_data["md_respa"]
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.md_respa=form.cleaned_data["md_respa"]
510 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
511 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
513 task.boxx=form.cleaned_data["boxx"]
514 task.boxy=form.cleaned_data["boxy"]
515 task.boxz=form.cleaned_data["boxz"]
517 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
518 task.unres_ff=form.cleaned_data["unres_ff"]
520 task.scal_rad = form.cleaned_data["scal_rad"]
521 task.saxs_data = form.cleaned_data["saxs_data"]
522 task.wsaxs = form.cleaned_data["wsaxs"]
525 return redirect('addmlist',task_id=task.id)
527 data= {'name':task.name}
528 form = TaskForm_remd_a(initial=data)
530 p_type='replica exchange molecular dynamics - advanced options'
531 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
534 def addmlist(request,task_id):
535 task = get_object_or_404(Task, id=task_id)
536 if request.method == 'POST':
537 form = TaskForm_list(task.remd_nrep,request.POST)
539 task.remd_multi_t=form.cleaned_data["temperatures"]
540 task.remd_multi_m=form.cleaned_data["multiplexing"]
544 if is_lazy_user(request.user):
545 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
549 if task.unres_ff == 'E0LL2Y':
550 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
551 '["1", "1", "1", "1", "1", "1", "1", "1"]',
553 '["270", "280", "290", "300", "310", "320", "330", "345"]'
556 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
557 '["1", "1", "1", "1", "1", "1", "1", "1"]',
559 '["250", "260", "270", "280", "290", "300", "315", "330"]'
562 form = TaskForm_list(task.remd_nrep,initial=data)
563 p_type='replica exchange molecular dynamics - advanced options'
564 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
567 def details(request,task_id):
568 task = get_object_or_404(Task, id=task_id)
569 return render(request, "details.html",{'task':task})
572 def details1(request,user_id,task_id):
573 task = get_object_or_404(Task, id=task_id)
574 return render(request, "details1.html",{'task':task})
578 def delete(request, task_id):
579 Task.objects.get(id=task_id).delete()
582 def refresh_done1(request, task_id):
583 task = get_object_or_404(Task, id=task_id)
587 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
590 for line in proc.stdout:
591 if 'piasek4' in line:
592 if line.split()[1]=='test_server':
594 if line.split()[-2]=='Q':
596 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
598 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
602 def refresh_done(request):
604 tasks = Task.objects.filter(owner=user).order_by('-created_date')
611 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
614 for line in proc.stdout:
615 if 'piasek4' in line:
616 if line.split()[1]=='test_server':
618 if line.split()[-2]=='Q':
620 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
622 if is_lazy_user(request.user):
623 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
625 return render(request, "index.html", {
627 'variable' : variable,
632 def refresh_done0(task):
633 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
636 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
638 if task.type=='min' or task.type=='md':
642 task.etot=line.split()[1]
644 if 'RMS deviation' in line:
652 if 'Total wall' in line:
655 elif task.type=='remd':
657 text="Acceptance for replica exchanges and number of exchange attempts\n"
662 text=text+' '.join(line.split()[2:])+"\n"
663 if j==task.remd_nrep:
665 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
667 if 'Total wall' in line:
670 task.results_text=text
673 if task.md_pdbref and task.type=='remd':
677 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
680 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
682 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
684 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
686 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
688 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
689 except EnvironmentError:
690 print 'file_wham_T*pdb open error'
692 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
695 if 'RMSD of the common residues=' in line:
696 text=' RMSD='+line.split()[5]
697 if 'TM-score =' in line:
698 text=text+' TMscore='+line.split()[2]
699 if 'GDT-TS-score=' in line:
700 text=text+' GDT_TS='+line.split()[1]
703 task.remd_model1=task.remd_model1+text
705 task.remd_model2=task.remd_model2+text
707 task.remd_model3=task.remd_model3+text
709 task.remd_model4=task.remd_model4+text
711 task.remd_model5=task.remd_model5+text
715 if task.type=='remd':
716 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
719 if 'sumprob' in line:
726 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
728 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
730 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
732 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
734 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
739 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
740 if (task.type=='min'):
743 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
748 last = line.split()[0]
751 task.running=int(1+int(last)*100.0/task.md_nstep)