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':
30 if sequence[-1] != 'G':
32 set ='CDSQKIPTFNGHLRWAVEYMX'
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.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 task = get_object_or_404(Task, id=task_id)
417 if request.method == 'POST':
418 if '_example' in request.POST:
419 data= {'name':task.name,'pdbid':'1E0G','md_pdbref':True,
420 'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2',
421 'remd_cluter_temp':280}
422 form = TaskForm_remd_a(initial=data)
424 form = TaskForm_remd_a(request.POST,request.FILES)
426 task.name=form.cleaned_data["name"]
429 basename = str(task.owner)
430 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
431 task.jobdirname = "_".join([basename, suffix])
433 pdbid=form.cleaned_data["pdbid"]
435 os.mkdir(task.jobdirname)
436 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
437 task.jobdirname+'/plik.pdb')
440 task.myfile1=form.cleaned_data["file1"]
441 task.md_start=form.cleaned_data["md_start"]
442 task.md_pdbref=form.cleaned_data["md_pdbref"]
445 if task.md_start == "pdbstart" or task.md_pdbref:
446 seq,task.ssbond=from_pdb(task.myfile1)
448 seq=seq_add_x(form.cleaned_data["md_seq"])
449 for i in range(0,len(seq),40):
450 task.md_seq=task.md_seq+seq[i:i+40]+" "
452 if task.md_start != "pdbstart":
455 task.md_seed=form.cleaned_data["md_seed"]
456 task.md_nstep=form.cleaned_data["md_nstep"]
457 task.md_dt=form.cleaned_data["md_dt"]
458 task.md_lang=form.cleaned_data["md_lang"]
459 task.md_tau=form.cleaned_data["md_tau"]
460 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
461 task.remd_nrep=form.cleaned_data["remd_nrep"]
462 task.remd_nstex=form.cleaned_data["remd_nstex"]
463 task.md_ntwx=form.cleaned_data["md_ntwx"]
464 task.md_ntwe=form.cleaned_data["md_ntwe"]
465 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
466 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
468 task.boxx=form.cleaned_data["boxx"]
469 task.boxy=form.cleaned_data["boxy"]
470 task.boxz=form.cleaned_data["boxz"]
472 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
473 task.unres_ff=form.cleaned_data["unres_ff"]
476 return redirect('addmlist',task_id=task.id)
478 data= {'name':task.name}
479 form = TaskForm_remd_a(initial=data)
481 p_type='replica exchange molecular dynamics - advanced options'
482 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
485 def addmlist(request,task_id):
486 task = get_object_or_404(Task, id=task_id)
487 if request.method == 'POST':
488 form = TaskForm_list(task.remd_nrep,request.POST)
490 task.remd_multi_t=form.cleaned_data["temperatures"]
491 task.remd_multi_m=form.cleaned_data["multiplexing"]
495 if is_lazy_user(request.user):
496 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
500 if task.unres_ff == 'E0LL2Y':
501 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
502 '["1", "1", "1", "1", "1", "1", "1", "1"]',
504 '["270", "280", "290", "300", "310", "320", "330", "345"]'
507 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
508 '["1", "1", "1", "1", "1", "1", "1", "1"]',
510 '["250", "260", "270", "280", "290", "300", "315", "330"]'
513 form = TaskForm_list(task.remd_nrep,initial=data)
514 p_type='replica exchange molecular dynamics - advanced options'
515 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
518 def details(request,task_id):
519 task = get_object_or_404(Task, id=task_id)
520 return render(request, "details.html",{'task':task})
523 def details1(request,user_id,task_id):
524 task = get_object_or_404(Task, id=task_id)
525 return render(request, "details1.html",{'task':task})
529 def delete(request, task_id):
530 Task.objects.get(id=task_id).delete()
533 def refresh_done1(request, task_id):
534 task = get_object_or_404(Task, id=task_id)
538 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
541 for line in proc.stdout:
542 if 'piasek4' in line:
543 if line.split()[1]=='test_server':
545 if line.split()[-2]=='Q':
547 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
549 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
553 def refresh_done(request):
555 tasks = Task.objects.filter(owner=user).order_by('-created_date')
559 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
562 for line in proc.stdout:
563 if 'piasek4' in line:
564 if line.split()[1]=='test_server':
566 if line.split()[-2]=='Q':
568 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
570 if is_lazy_user(request.user):
571 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
573 return render(request, "index.html", {
575 'variable' : variable
579 def refresh_done0(task):
580 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
583 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
585 if task.type=='min' or task.type=='md':
589 task.etot=line.split()[1]
591 if 'RMS deviation' in line:
599 if 'Total wall' in line:
602 elif task.type=='remd':
604 text="Acceptance for replica exchanges\n"
610 if j==task.remd_nrep:
612 text="Acceptance for replica exchanges\n"+line
614 if 'Total wall' in line:
617 task.results_text=text
620 if task.md_pdbref and task.type=='remd':
624 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
627 task.remd_model1=' '.join(line.split()[-6:])
629 task.remd_model2=' '.join(line.split()[-6:])
631 task.remd_model3=' '.join(line.split()[-6:])
633 task.remd_model4=' '.join(line.split()[-6:])
635 task.remd_model5=' '.join(line.split()[-6:])
636 except EnvironmentError:
637 print 'file_wham_T*pdb open error'
639 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
642 if 'RMSD of the common residues=' in line:
643 text=' RMSD='+line.split()[5]
644 if 'TM-score =' in line:
645 text=text+' TMscore='+line.split()[2]
646 if 'GDT-TS-score=' in line:
647 text=text+' GDT_TS='+line.split()[1]
650 task.remd_model1=task.remd_model1+text
652 task.remd_model2=task.remd_model2+text
654 task.remd_model3=task.remd_model3+text
656 task.remd_model4=task.remd_model4+text
658 task.remd_model5=task.remd_model5+text
662 if task.type=='remd':
663 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
666 if 'sumprob' in line:
673 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
675 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
677 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
679 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
681 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
686 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
687 if (task.type=='min'):
690 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
695 last = line.split()[0]
698 task.running=int(1+int(last)*100.0/task.md_nstep)