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])
55 if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
57 chain_=tmp.split(', ')
58 chain_[-1]=chain_[-1][0]
61 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
62 aa = three_to_one.get(line[17:20])
64 if newchain or i!=ires[-1]:
69 chain_start[chain[ichain]]=i
71 if line[0:3] == 'TER':
74 chain_end[chain[ichain]]=i
77 if line[0:6] == 'SSBOND':
79 b.append(int(line[17:21]))
80 b.append(int(line[31:35]))
83 c.append((line[15:16]))
84 c.append((line[29:30]))
86 if line[0:3] == 'END':
88 while sequence[-1] == 'XX':
90 if sequence[0] != 'G':
91 sequence.insert(0,'X')
92 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
93 if sequence[-1] != 'G':
97 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
100 unres_shift[c]=i+chain_start[c]
101 i=i-(chain_end[c]-chain_start[c])-3
102 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
104 return seq,json.dumps(ssbond)
110 tasks = Task.objects.filter(owner=user).order_by('-created_date')
112 return render(request, "index.html", {
118 if request.method == 'POST':
119 form = TaskForm(request.POST)
121 name = form.cleaned_data["name"]
123 task = Task(name=name,owner=user,ready=False)
125 return redirect('add_min',task_id=task.id)
129 def add_min(request,task_id):
130 task = get_object_or_404(Task, id=task_id)
131 if request.method == 'POST':
132 if '_example' in request.POST:
133 data= {'name':task.name,'pdbid':'1BDD'}
134 form = TaskForm_min(initial=data)
136 form = TaskForm_min(request.POST,request.FILES)
138 task.name=form.cleaned_data["name"]
140 pdbid=form.cleaned_data["pdbid"]
142 basename = str(task.owner)
143 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
144 task.jobdirname = "_".join([basename, suffix])
147 os.mkdir(task.jobdirname)
148 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
149 task.jobdirname+'/plik.pdb')
152 task.myfile1=form.cleaned_data["file1"]
154 seq,task.ssbond=from_pdb(task.myfile1)
156 for i in range(0,len(seq),40):
157 task.md_seq=task.md_seq+seq[i:i+40]+" "
162 if is_lazy_user(request.user):
163 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
167 data= {'name':task.name}
168 form = TaskForm_min(initial=data)
169 p_type='minimization'
171 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
174 def add_min_a(request,task_id):
175 task = get_object_or_404(Task, id=task_id)
176 if request.method == 'POST':
177 if '_example' in request.POST:
178 data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
179 form = TaskForm_min_a(initial=data)
181 form = TaskForm_min_a(request.POST,request.FILES)
183 task.name=form.cleaned_data["name"]
185 task.min_choice=form.cleaned_data["min_choice"]
186 task.min_overlap=form.cleaned_data["min_overlap"]
187 task.min_searchsc=form.cleaned_data["min_searchsc"]
188 task.min_maxmin=form.cleaned_data["min_maxmin"]
189 task.min_maxfun=form.cleaned_data["min_maxfun"]
190 task.min_pdbout=form.cleaned_data["min_pdbout"]
192 basename = str(task.owner)
193 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
194 task.jobdirname = "_".join([basename, suffix])
196 pdbid=form.cleaned_data["pdbid"]
198 os.mkdir(task.jobdirname)
199 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
200 task.jobdirname+'/plik.pdb')
203 task.myfile1=form.cleaned_data["file1"]
205 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
206 task.unres_ff=form.cleaned_data["unres_ff"]
207 task.boxx=form.cleaned_data["boxx"]
208 task.boxy=form.cleaned_data["boxy"]
209 task.boxz=form.cleaned_data["boxz"]
211 seq,task.ssbond=from_pdb(task.myfile1)
213 for i in range(0,len(seq),40):
214 task.md_seq=task.md_seq+seq[i:i+40]+" "
219 if is_lazy_user(request.user):
220 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
224 data= {'name':task.name}
225 form = TaskForm_min_a(initial=data)
227 p_type='minimization - advanced options'
228 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
231 def add_md(request,task_id):
232 task = get_object_or_404(Task, id=task_id)
233 if request.method == 'POST':
234 if '_example' in request.POST:
235 data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
236 'md_pdbref':True,'md_temp':200}
237 form = TaskForm_md(initial=data)
239 form = TaskForm_md(request.POST,request.FILES)
241 task.name=form.cleaned_data["name"]
243 task.md_seed=form.cleaned_data["md_seed"]
244 task.md_start=form.cleaned_data["md_start"]
245 task.md_temp=form.cleaned_data["md_temp"]
246 task.md_nstep=form.cleaned_data["md_nstep"]
248 basename = str(task.owner)
249 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
250 task.jobdirname = "_".join([basename, suffix])
252 pdbid=form.cleaned_data["pdbid"]
254 os.mkdir(task.jobdirname)
255 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
256 task.jobdirname+'/plik.pdb')
259 task.myfile1=form.cleaned_data["file1"]
260 task.md_pdbref=form.cleaned_data["md_pdbref"]
263 if task.md_start == "pdbstart" or task.md_pdbref:
264 seq,task.ssbond=from_pdb(task.myfile1)
266 seq=seq_add_x(form.cleaned_data["md_seq"])
268 for i in range(0,len(seq),40):
269 task.md_seq=task.md_seq+seq[i:i+40]+" "
271 if task.md_start != "pdbstart":
277 if is_lazy_user(request.user):
278 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
282 data= {'name':task.name}
283 form = TaskForm_md(initial=data)
285 p_type='molecular dynamics'
286 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
289 def add_md_a(request,task_id):
290 task = get_object_or_404(Task, id=task_id)
291 if request.method == 'POST':
292 if '_example' in request.POST:
293 data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
294 'md_pdbref':True,'md_mdpdb':True}
295 form = TaskForm_md_a(initial=data)
297 form = TaskForm_md_a(request.POST,request.FILES)
299 task.name=form.cleaned_data["name"]
302 basename = str(task.owner)
303 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
304 task.jobdirname = "_".join([basename, suffix])
306 pdbid=form.cleaned_data["pdbid"]
308 os.mkdir(task.jobdirname)
309 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
310 task.jobdirname+'/plik.pdb')
313 task.myfile1=form.cleaned_data["file1"]
314 task.md_start=form.cleaned_data["md_start"]
315 task.md_pdbref=form.cleaned_data["md_pdbref"]
318 if task.md_start == "pdbstart" or task.md_pdbref:
319 seq,task.ssbond=from_pdb(task.myfile1)
321 seq=seq_add_x(form.cleaned_data["md_seq"])
322 for i in range(0,len(seq),40):
323 task.md_seq=task.md_seq+seq[i:i+40]+" "
325 if task.md_start != "pdbstart":
328 task.md_seed=form.cleaned_data["md_seed"]
330 task.md_temp=form.cleaned_data["md_temp"]
331 task.md_nstep=form.cleaned_data["md_nstep"]
332 task.md_ntwe=form.cleaned_data["md_ntwe"]
333 task.md_ntwx=form.cleaned_data["md_ntwx"]
334 task.md_dt=form.cleaned_data["md_dt"]
335 task.md_lang=form.cleaned_data["md_lang"]
336 task.md_tau=form.cleaned_data["md_tau"]
337 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
338 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
339 task.unres_ff=form.cleaned_data["unres_ff"]
340 task.md_respa=form.cleaned_data["md_respa"]
341 task.boxx=form.cleaned_data["boxx"]
342 task.boxy=form.cleaned_data["boxy"]
343 task.boxz=form.cleaned_data["boxz"]
349 if is_lazy_user(request.user):
350 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
354 data= {'name':task.name}
355 form = TaskForm_md_a(initial=data)
357 p_type='molecular dynamics - advanced options'
358 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
361 def add_remd(request,task_id):
362 task = get_object_or_404(Task, id=task_id)
363 if request.method == 'POST':
364 if '_example' in request.POST:
365 data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True}
366 form = TaskForm_remd(initial=data)
368 form = TaskForm_remd(request.POST,request.FILES)
370 task.name=form.cleaned_data["name"]
372 task.md_start=form.cleaned_data["md_start"]
374 basename = str(task.owner)
375 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
376 task.jobdirname = "_".join([basename, suffix])
378 pdbid=form.cleaned_data["pdbid"]
380 os.mkdir(task.jobdirname)
381 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
382 task.jobdirname+'/plik.pdb')
385 task.myfile1=form.cleaned_data["file1"]
386 task.md_pdbref=form.cleaned_data["md_pdbref"]
387 task.md_ntwx=task.remd_nstex
390 if task.md_start == "pdbstart" or task.md_pdbref:
391 seq,task.ssbond=from_pdb(task.myfile1)
393 seq=seq_add_x(form.cleaned_data["md_seq"])
394 for i in range(0,len(seq),40):
395 task.md_seq=task.md_seq+seq[i:i+40]+" "
397 if task.md_start != "pdbstart":
400 task.md_seed=form.cleaned_data["md_seed"]
402 task.md_nstep=form.cleaned_data["md_nstep"]
409 if is_lazy_user(request.user):
410 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
414 data= {'name':task.name}
415 form = TaskForm_remd(initial=data)
417 p_type='replica exchange molecular dynamics'
418 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
421 def add_remd_a(request,task_id):
422 from django.core.files.uploadedfile import UploadedFile
423 task = get_object_or_404(Task, id=task_id)
424 if request.method == 'POST':
425 if '_example' in request.POST:
426 data= {'name':task.name,'pdbid':'1E0G','md_pdbref':True,
427 'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2',
428 'remd_cluter_temp':280}
429 form = TaskForm_remd_a(initial=data)
430 elif '_example_saxs' in request.POST:
431 data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
432 'md_nstep':200000,'md_lang':'langevin','unres_ff':'E0LL2Y',
433 'remd_cluter_temp':270,
434 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
472 form = TaskForm_remd_a(initial=data)
474 form = TaskForm_remd_a(request.POST,request.FILES)
476 task.name=form.cleaned_data["name"]
479 basename = str(task.owner)
480 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
481 task.jobdirname = "_".join([basename, suffix])
483 pdbid=form.cleaned_data["pdbid"]
485 os.mkdir(task.jobdirname)
486 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
487 task.jobdirname+'/plik.pdb')
490 task.myfile1=form.cleaned_data["file1"]
491 task.md_start=form.cleaned_data["md_start"]
492 task.md_pdbref=form.cleaned_data["md_pdbref"]
495 if task.md_start == "pdbstart" or task.md_pdbref:
496 seq,task.ssbond=from_pdb(task.myfile1)
498 seq=seq_add_x(form.cleaned_data["md_seq"])
499 for i in range(0,len(seq),40):
500 task.md_seq=task.md_seq+seq[i:i+40]+" "
502 if task.md_start != "pdbstart":
505 task.md_seed=form.cleaned_data["md_seed"]
506 task.md_nstep=form.cleaned_data["md_nstep"]
507 task.md_dt=form.cleaned_data["md_dt"]
508 task.md_lang=form.cleaned_data["md_lang"]
509 task.md_tau=form.cleaned_data["md_tau"]
510 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
511 task.remd_nrep=form.cleaned_data["remd_nrep"]
512 task.remd_nstex=form.cleaned_data["remd_nstex"]
513 task.md_ntwx=form.cleaned_data["md_ntwx"]
514 task.md_ntwe=form.cleaned_data["md_ntwe"]
515 task.md_respa=form.cleaned_data["md_respa"]
516 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
517 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
519 task.boxx=form.cleaned_data["boxx"]
520 task.boxy=form.cleaned_data["boxy"]
521 task.boxz=form.cleaned_data["boxz"]
523 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
524 task.unres_ff=form.cleaned_data["unres_ff"]
526 task.scal_rad = form.cleaned_data["scal_rad"]
527 task.saxs_data = form.cleaned_data["saxs_data"]
528 task.wsaxs = form.cleaned_data["wsaxs"]
531 return redirect('addmlist',task_id=task.id)
533 data= {'name':task.name}
534 form = TaskForm_remd_a(initial=data)
536 p_type='replica exchange molecular dynamics - advanced options'
537 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
540 def addmlist(request,task_id):
541 task = get_object_or_404(Task, id=task_id)
542 if request.method == 'POST':
543 form = TaskForm_list(task.remd_nrep,request.POST)
545 task.remd_multi_t=form.cleaned_data["temperatures"]
546 task.remd_multi_m=form.cleaned_data["multiplexing"]
550 if is_lazy_user(request.user):
551 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
555 if task.unres_ff == 'E0LL2Y':
556 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
557 '["1", "1", "1", "1", "1", "1", "1", "1"]',
559 '["270", "280", "290", "300", "310", "320", "330", "345"]'
562 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
563 '["1", "1", "1", "1", "1", "1", "1", "1"]',
565 '["250", "260", "270", "280", "290", "300", "315", "330"]'
568 form = TaskForm_list(task.remd_nrep,initial=data)
569 p_type='replica exchange molecular dynamics - advanced options'
570 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
573 def details(request,task_id):
574 task = get_object_or_404(Task, id=task_id)
575 return render(request, "details.html",{'task':task})
578 def details1(request,user_id,task_id):
579 task = get_object_or_404(Task, id=task_id)
580 return render(request, "details1.html",{'task':task})
584 def delete(request, task_id):
585 Task.objects.get(id=task_id).delete()
588 def refresh_done1(request, task_id):
589 task = get_object_or_404(Task, id=task_id)
593 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
596 for line in proc.stdout:
597 if 'piasek4' in line:
598 if line.split()[1]=='test_server':
600 if line.split()[-2]=='Q':
602 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
604 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
608 def refresh_done(request):
610 tasks = Task.objects.filter(owner=user).order_by('-created_date')
614 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
617 for line in proc.stdout:
618 if 'piasek4' in line:
619 if line.split()[1]=='test_server':
621 if line.split()[-2]=='Q':
623 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
625 if is_lazy_user(request.user):
626 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
628 return render(request, "index.html", {
630 'variable' : variable
634 def refresh_done0(task):
635 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
638 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
640 if task.type=='min' or task.type=='md':
644 task.etot=line.split()[1]
646 if 'RMS deviation' in line:
654 if 'Total wall' in line:
657 elif task.type=='remd':
659 text="Acceptance for replica exchanges and number of exchange attempts\n"
664 text=text+' '.join(line.split()[2:])+"\n"
665 if j==task.remd_nrep:
667 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
669 if 'Total wall' in line:
672 task.results_text=text
675 if task.md_pdbref and task.type=='remd':
679 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
682 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
684 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
686 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
688 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
690 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
691 except EnvironmentError:
692 print 'file_wham_T*pdb open error'
694 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
697 if 'RMSD of the common residues=' in line:
698 text=' RMSD='+line.split()[5]
699 if 'TM-score =' in line:
700 text=text+' TMscore='+line.split()[2]
701 if 'GDT-TS-score=' in line:
702 text=text+' GDT_TS='+line.split()[1]
705 task.remd_model1=task.remd_model1+text
707 task.remd_model2=task.remd_model2+text
709 task.remd_model3=task.remd_model3+text
711 task.remd_model4=task.remd_model4+text
713 task.remd_model5=task.remd_model5+text
717 if task.type=='remd':
718 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
721 if 'sumprob' in line:
728 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
730 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
732 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
734 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
736 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
741 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
742 if (task.type=='min'):
745 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
750 last = line.split()[0]
753 task.running=int(1+int(last)*100.0/task.md_nstep)