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'),
25 three_to_one = dict(res_codes)
27 def seq_add_x(sequence):
28 if sequence[0] != 'G' and sequence[0] != 'g':
30 if sequence[-1] != 'G' and sequence[-1] != 'g':
32 set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnghlrwaveym'
33 sequence = ''.join([c for c in sequence if c in set])
50 if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
52 chain_=tmp.split(', ')
53 chain_[-1]=chain_[-1][0]
56 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
57 aa = three_to_one.get(line[17:20])
59 if newchain or i!=ires[-1]:
64 chain_start[chain[ichain]]=i
66 if line[0:3] == 'TER':
69 chain_end[chain[ichain]]=i
72 if line[0:6] == 'SSBOND':
74 b.append(int(line[17:21]))
75 b.append(int(line[31:35]))
78 c.append((line[15:16]))
79 c.append((line[29:30]))
81 if line[0:3] == 'END':
83 while sequence[-1] == 'XX':
85 if sequence[0] != 'G':
86 sequence.insert(0,'X')
87 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
88 if sequence[-1] != 'G':
92 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
95 unres_shift[c]=i+chain_start[c]
96 i=i-(chain_end[c]-chain_start[c])-3
97 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
99 return seq,json.dumps(ssbond)
105 tasks = Task.objects.filter(owner=user).order_by('-created_date')
107 return render(request, "index.html", {
113 if request.method == 'POST':
114 form = TaskForm(request.POST)
116 name = form.cleaned_data["name"]
118 task = Task(name=name,owner=user,ready=False)
120 return redirect('add_min',task_id=task.id)
124 def add_min(request,task_id):
125 task = get_object_or_404(Task, id=task_id)
126 if request.method == 'POST':
127 if '_example' in request.POST:
128 data= {'name':task.name,'pdbid':'1BDD'}
129 form = TaskForm_min(initial=data)
131 form = TaskForm_min(request.POST,request.FILES)
133 task.name=form.cleaned_data["name"]
135 pdbid=form.cleaned_data["pdbid"]
137 basename = str(task.owner)
138 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
139 task.jobdirname = "_".join([basename, suffix])
142 os.mkdir(task.jobdirname)
143 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
144 task.jobdirname+'/plik.pdb')
147 task.myfile1=form.cleaned_data["file1"]
149 seq,task.ssbond=from_pdb(task.myfile1)
151 for i in range(0,len(seq),40):
152 task.md_seq=task.md_seq+seq[i:i+40]+" "
157 if is_lazy_user(request.user):
158 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
162 data= {'name':task.name}
163 form = TaskForm_min(initial=data)
164 p_type='minimization'
166 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
169 def add_min_a(request,task_id):
170 task = get_object_or_404(Task, id=task_id)
171 if request.method == 'POST':
172 if '_example' in request.POST:
173 data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
174 form = TaskForm_min_a(initial=data)
176 form = TaskForm_min_a(request.POST,request.FILES)
178 task.name=form.cleaned_data["name"]
180 task.min_choice=form.cleaned_data["min_choice"]
181 task.min_overlap=form.cleaned_data["min_overlap"]
182 task.min_searchsc=form.cleaned_data["min_searchsc"]
183 task.min_maxmin=form.cleaned_data["min_maxmin"]
184 task.min_maxfun=form.cleaned_data["min_maxfun"]
185 task.min_pdbout=form.cleaned_data["min_pdbout"]
187 basename = str(task.owner)
188 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
189 task.jobdirname = "_".join([basename, suffix])
191 pdbid=form.cleaned_data["pdbid"]
193 os.mkdir(task.jobdirname)
194 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
195 task.jobdirname+'/plik.pdb')
198 task.myfile1=form.cleaned_data["file1"]
200 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
201 task.unres_ff=form.cleaned_data["unres_ff"]
202 task.boxx=form.cleaned_data["boxx"]
203 task.boxy=form.cleaned_data["boxy"]
204 task.boxz=form.cleaned_data["boxz"]
206 seq,task.ssbond=from_pdb(task.myfile1)
208 for i in range(0,len(seq),40):
209 task.md_seq=task.md_seq+seq[i:i+40]+" "
214 if is_lazy_user(request.user):
215 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
219 data= {'name':task.name}
220 form = TaskForm_min_a(initial=data)
222 p_type='minimization - advanced options'
223 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
226 def add_md(request,task_id):
227 task = get_object_or_404(Task, id=task_id)
228 if request.method == 'POST':
229 if '_example' in request.POST:
230 data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
231 'md_pdbref':True,'md_temp':200}
232 form = TaskForm_md(initial=data)
234 form = TaskForm_md(request.POST,request.FILES)
236 task.name=form.cleaned_data["name"]
238 task.md_seed=form.cleaned_data["md_seed"]
239 task.md_start=form.cleaned_data["md_start"]
240 task.md_temp=form.cleaned_data["md_temp"]
241 task.md_nstep=form.cleaned_data["md_nstep"]
243 basename = str(task.owner)
244 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
245 task.jobdirname = "_".join([basename, suffix])
247 pdbid=form.cleaned_data["pdbid"]
249 os.mkdir(task.jobdirname)
250 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
251 task.jobdirname+'/plik.pdb')
254 task.myfile1=form.cleaned_data["file1"]
255 task.md_pdbref=form.cleaned_data["md_pdbref"]
258 if task.md_start == "pdbstart" or task.md_pdbref:
259 seq,task.ssbond=from_pdb(task.myfile1)
261 seq=seq_add_x(form.cleaned_data["md_seq"])
263 for i in range(0,len(seq),40):
264 task.md_seq=task.md_seq+seq[i:i+40]+" "
266 if task.md_start != "pdbstart":
272 if is_lazy_user(request.user):
273 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
277 data= {'name':task.name}
278 form = TaskForm_md(initial=data)
280 p_type='molecular dynamics'
281 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
284 def add_md_a(request,task_id):
285 task = get_object_or_404(Task, id=task_id)
286 if request.method == 'POST':
287 if '_example' in request.POST:
288 data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
289 'md_pdbref':True,'md_mdpdb':True}
290 form = TaskForm_md_a(initial=data)
292 form = TaskForm_md_a(request.POST,request.FILES)
294 task.name=form.cleaned_data["name"]
297 basename = str(task.owner)
298 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
299 task.jobdirname = "_".join([basename, suffix])
301 pdbid=form.cleaned_data["pdbid"]
303 os.mkdir(task.jobdirname)
304 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
305 task.jobdirname+'/plik.pdb')
308 task.myfile1=form.cleaned_data["file1"]
309 task.md_start=form.cleaned_data["md_start"]
310 task.md_pdbref=form.cleaned_data["md_pdbref"]
313 if task.md_start == "pdbstart" or task.md_pdbref:
314 seq,task.ssbond=from_pdb(task.myfile1)
316 seq=seq_add_x(form.cleaned_data["md_seq"])
317 for i in range(0,len(seq),40):
318 task.md_seq=task.md_seq+seq[i:i+40]+" "
320 if task.md_start != "pdbstart":
323 task.md_seed=form.cleaned_data["md_seed"]
325 task.md_temp=form.cleaned_data["md_temp"]
326 task.md_nstep=form.cleaned_data["md_nstep"]
327 task.md_ntwe=form.cleaned_data["md_ntwe"]
328 task.md_ntwx=form.cleaned_data["md_ntwx"]
329 task.md_dt=form.cleaned_data["md_dt"]
330 task.md_lang=form.cleaned_data["md_lang"]
331 task.md_tau=form.cleaned_data["md_tau"]
332 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
333 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
334 task.unres_ff=form.cleaned_data["unres_ff"]
335 task.md_respa=form.cleaned_data["md_respa"]
336 task.boxx=form.cleaned_data["boxx"]
337 task.boxy=form.cleaned_data["boxy"]
338 task.boxz=form.cleaned_data["boxz"]
344 if is_lazy_user(request.user):
345 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
349 data= {'name':task.name}
350 form = TaskForm_md_a(initial=data)
352 p_type='molecular dynamics - advanced options'
353 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
356 def add_remd(request,task_id):
357 task = get_object_or_404(Task, id=task_id)
358 if request.method == 'POST':
359 if '_example' in request.POST:
360 data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True}
361 form = TaskForm_remd(initial=data)
363 form = TaskForm_remd(request.POST,request.FILES)
365 task.name=form.cleaned_data["name"]
367 task.md_start=form.cleaned_data["md_start"]
369 basename = str(task.owner)
370 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
371 task.jobdirname = "_".join([basename, suffix])
373 pdbid=form.cleaned_data["pdbid"]
375 os.mkdir(task.jobdirname)
376 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
377 task.jobdirname+'/plik.pdb')
380 task.myfile1=form.cleaned_data["file1"]
381 task.md_pdbref=form.cleaned_data["md_pdbref"]
382 task.md_ntwx=task.remd_nstex
385 if task.md_start == "pdbstart" or task.md_pdbref:
386 seq,task.ssbond=from_pdb(task.myfile1)
388 seq=seq_add_x(form.cleaned_data["md_seq"])
389 for i in range(0,len(seq),40):
390 task.md_seq=task.md_seq+seq[i:i+40]+" "
392 if task.md_start != "pdbstart":
395 task.md_seed=form.cleaned_data["md_seed"]
397 task.md_nstep=form.cleaned_data["md_nstep"]
404 if is_lazy_user(request.user):
405 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
409 data= {'name':task.name}
410 form = TaskForm_remd(initial=data)
412 p_type='replica exchange molecular dynamics'
413 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
416 def add_remd_a(request,task_id):
417 from django.core.files.uploadedfile import UploadedFile
418 task = get_object_or_404(Task, id=task_id)
419 if request.method == 'POST':
420 if '_example' in request.POST:
421 data= {'name':task.name,'pdbid':'1E0G','md_pdbref':True,
422 'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2',
423 'remd_cluter_temp':280}
424 form = TaskForm_remd_a(initial=data)
425 elif '_example_saxs' in request.POST:
426 data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
427 'md_nstep':200000,'md_lang':'langevin','unres_ff':'E0LL2Y',
428 'remd_cluter_temp':270,
429 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
467 form = TaskForm_remd_a(initial=data)
469 form = TaskForm_remd_a(request.POST,request.FILES)
471 task.name=form.cleaned_data["name"]
474 basename = str(task.owner)
475 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
476 task.jobdirname = "_".join([basename, suffix])
478 pdbid=form.cleaned_data["pdbid"]
480 os.mkdir(task.jobdirname)
481 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
482 task.jobdirname+'/plik.pdb')
485 task.myfile1=form.cleaned_data["file1"]
486 task.md_start=form.cleaned_data["md_start"]
487 task.md_pdbref=form.cleaned_data["md_pdbref"]
490 if task.md_start == "pdbstart" or task.md_pdbref:
491 seq,task.ssbond=from_pdb(task.myfile1)
493 seq=seq_add_x(form.cleaned_data["md_seq"])
494 for i in range(0,len(seq),40):
495 task.md_seq=task.md_seq+seq[i:i+40]+" "
497 if task.md_start != "pdbstart":
500 task.md_seed=form.cleaned_data["md_seed"]
501 task.md_nstep=form.cleaned_data["md_nstep"]
502 task.md_dt=form.cleaned_data["md_dt"]
503 task.md_lang=form.cleaned_data["md_lang"]
504 task.md_tau=form.cleaned_data["md_tau"]
505 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
506 task.remd_nrep=form.cleaned_data["remd_nrep"]
507 task.remd_nstex=form.cleaned_data["remd_nstex"]
508 task.md_ntwx=form.cleaned_data["md_ntwx"]
509 task.md_ntwe=form.cleaned_data["md_ntwe"]
510 task.md_respa=form.cleaned_data["md_respa"]
511 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
512 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
514 task.boxx=form.cleaned_data["boxx"]
515 task.boxy=form.cleaned_data["boxy"]
516 task.boxz=form.cleaned_data["boxz"]
518 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
519 task.unres_ff=form.cleaned_data["unres_ff"]
521 task.scal_rad = form.cleaned_data["scal_rad"]
522 task.saxs_data = form.cleaned_data["saxs_data"]
523 task.wsaxs = form.cleaned_data["wsaxs"]
526 return redirect('addmlist',task_id=task.id)
528 data= {'name':task.name}
529 form = TaskForm_remd_a(initial=data)
531 p_type='replica exchange molecular dynamics - advanced options'
532 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
535 def addmlist(request,task_id):
536 task = get_object_or_404(Task, id=task_id)
537 if request.method == 'POST':
538 form = TaskForm_list(task.remd_nrep,request.POST)
540 task.remd_multi_t=form.cleaned_data["temperatures"]
541 task.remd_multi_m=form.cleaned_data["multiplexing"]
545 if is_lazy_user(request.user):
546 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
550 if task.unres_ff == 'E0LL2Y':
551 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
552 '["1", "1", "1", "1", "1", "1", "1", "1"]',
554 '["270", "280", "290", "300", "310", "320", "330", "345"]'
557 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
558 '["1", "1", "1", "1", "1", "1", "1", "1"]',
560 '["250", "260", "270", "280", "290", "300", "315", "330"]'
563 form = TaskForm_list(task.remd_nrep,initial=data)
564 p_type='replica exchange molecular dynamics - advanced options'
565 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
568 def details(request,task_id):
569 task = get_object_or_404(Task, id=task_id)
570 return render(request, "details.html",{'task':task})
573 def details1(request,user_id,task_id):
574 task = get_object_or_404(Task, id=task_id)
575 return render(request, "details1.html",{'task':task})
579 def delete(request, task_id):
580 Task.objects.get(id=task_id).delete()
583 def refresh_done1(request, task_id):
584 task = get_object_or_404(Task, id=task_id)
588 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
591 for line in proc.stdout:
592 if 'piasek4' in line:
593 if line.split()[1]=='test_server':
595 if line.split()[-2]=='Q':
597 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
599 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
603 def refresh_done(request):
605 tasks = Task.objects.filter(owner=user).order_by('-created_date')
609 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
612 for line in proc.stdout:
613 if 'piasek4' in line:
614 if line.split()[1]=='test_server':
616 if line.split()[-2]=='Q':
618 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
620 if is_lazy_user(request.user):
621 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
623 return render(request, "index.html", {
625 'variable' : variable
629 def refresh_done0(task):
630 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
633 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
635 if task.type=='min' or task.type=='md':
639 task.etot=line.split()[1]
641 if 'RMS deviation' in line:
649 if 'Total wall' in line:
652 elif task.type=='remd':
654 text="Acceptance for replica exchanges and number of exchange attempts\n"
659 text=text+' '.join(line.split()[2:])+"\n"
660 if j==task.remd_nrep:
662 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
664 if 'Total wall' in line:
667 task.results_text=text
670 if task.md_pdbref and task.type=='remd':
674 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
677 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
679 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
681 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
683 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
685 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
686 except EnvironmentError:
687 print 'file_wham_T*pdb open error'
689 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
692 if 'RMSD of the common residues=' in line:
693 text=' RMSD='+line.split()[5]
694 if 'TM-score =' in line:
695 text=text+' TMscore='+line.split()[2]
696 if 'GDT-TS-score=' in line:
697 text=text+' GDT_TS='+line.split()[1]
700 task.remd_model1=task.remd_model1+text
702 task.remd_model2=task.remd_model2+text
704 task.remd_model3=task.remd_model3+text
706 task.remd_model4=task.remd_model4+text
708 task.remd_model5=task.remd_model5+text
712 if task.type=='remd':
713 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
716 if 'sumprob' in line:
723 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
725 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
727 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
729 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
731 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
736 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
737 if (task.type=='min'):
740 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
745 last = line.split()[0]
748 task.running=int(1+int(last)*100.0/task.md_nstep)