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'}
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':250}
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':'1FSD','md_start':'extconf',
289 'md_pdbref':True,'md_lang':'berendsen'}
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 form = TaskForm_remd_a(initial=data)
423 form = TaskForm_remd_a(request.POST,request.FILES)
425 task.name=form.cleaned_data["name"]
428 basename = str(task.owner)
429 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
430 task.jobdirname = "_".join([basename, suffix])
432 pdbid=form.cleaned_data["pdbid"]
434 os.mkdir(task.jobdirname)
435 task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
436 task.jobdirname+'/plik.pdb')
439 task.myfile1=form.cleaned_data["file1"]
440 task.md_start=form.cleaned_data["md_start"]
441 task.md_pdbref=form.cleaned_data["md_pdbref"]
444 if task.md_start == "pdbstart" or task.md_pdbref:
445 seq,task.ssbond=from_pdb(task.myfile1)
447 seq=seq_add_x(form.cleaned_data["md_seq"])
448 for i in range(0,len(seq),40):
449 task.md_seq=task.md_seq+seq[i:i+40]+" "
451 if task.md_start != "pdbstart":
454 task.md_seed=form.cleaned_data["md_seed"]
455 task.md_nstep=form.cleaned_data["md_nstep"]
456 task.md_dt=form.cleaned_data["md_dt"]
457 task.md_lang=form.cleaned_data["md_lang"]
458 task.md_tau=form.cleaned_data["md_tau"]
459 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
460 task.remd_nrep=form.cleaned_data["remd_nrep"]
461 task.remd_nstex=form.cleaned_data["remd_nstex"]
462 task.md_ntwx=form.cleaned_data["md_ntwx"]
463 task.md_ntwe=form.cleaned_data["md_ntwe"]
464 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
465 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
467 task.boxx=form.cleaned_data["boxx"]
468 task.boxy=form.cleaned_data["boxy"]
469 task.boxz=form.cleaned_data["boxz"]
471 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
472 task.unres_ff=form.cleaned_data["unres_ff"]
475 return redirect('addmlist',task_id=task.id)
477 data= {'name':task.name}
478 form = TaskForm_remd_a(initial=data)
480 p_type='replica exchange molecular dynamics - advanced options'
481 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
484 def addmlist(request,task_id):
485 task = get_object_or_404(Task, id=task_id)
486 if request.method == 'POST':
487 form = TaskForm_list(task.remd_nrep,request.POST)
489 task.remd_multi_t=form.cleaned_data["temperatures"]
490 task.remd_multi_m=form.cleaned_data["multiplexing"]
494 if is_lazy_user(request.user):
495 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
499 if task.unres_ff == 'E0LL2Y':
500 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
501 '["1", "1", "1", "1", "1", "1", "1", "1"]',
503 '["270", "280", "290", "300", "310", "320", "330", "345"]'
506 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
507 '["1", "1", "1", "1", "1", "1", "1", "1"]',
509 '["250", "260", "270", "280", "290", "300", "315", "330"]'
512 form = TaskForm_list(task.remd_nrep,initial=data)
513 p_type='replica exchange molecular dynamics - advanced options'
514 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
517 def details(request,task_id):
518 task = get_object_or_404(Task, id=task_id)
519 return render(request, "details.html",{'task':task})
522 def details1(request,user_id,task_id):
523 task = get_object_or_404(Task, id=task_id)
524 return render(request, "details1.html",{'task':task})
528 def delete(request, task_id):
529 Task.objects.get(id=task_id).delete()
532 def refresh_done1(request, task_id):
533 task = get_object_or_404(Task, id=task_id)
537 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
540 for line in proc.stdout:
541 if 'piasek4' in line:
542 if line.split()[1]=='test_server':
544 if line.split()[-2]=='Q':
546 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
548 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
552 def refresh_done(request):
554 tasks = Task.objects.filter(owner=user).order_by('-created_date')
558 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
561 for line in proc.stdout:
562 if 'piasek4' in line:
563 if line.split()[1]=='test_server':
565 if line.split()[-2]=='Q':
567 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
569 if is_lazy_user(request.user):
570 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
572 return render(request, "index.html", {
574 'variable' : variable
578 def refresh_done0(task):
579 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
582 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
584 if task.type=='min' or task.type=='md':
588 task.etot=line.split()[1]
590 if 'RMS deviation' in line:
598 if 'Total wall' in line:
601 elif task.type=='remd':
603 text="Acceptance for replica exchanges\n"
609 if j==task.remd_nrep:
611 text="Acceptance for replica exchanges\n"+line
613 if 'Total wall' in line:
616 task.results_text=text
619 if task.md_pdbref and task.type=='remd':
623 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
626 task.remd_model1=' '.join(line.split()[-6:])
628 task.remd_model2=' '.join(line.split()[-6:])
630 task.remd_model3=' '.join(line.split()[-6:])
632 task.remd_model4=' '.join(line.split()[-6:])
634 task.remd_model5=' '.join(line.split()[-6:])
635 except EnvironmentError:
636 print 'file_wham_T*pdb open error'
638 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
641 if 'RMSD of the common residues=' in line:
642 text=' RMSD='+line.split()[5]
643 if 'TM-score =' in line:
644 text=text+' TMscore='+line.split()[2]
645 if 'GDT-TS-score=' in line:
646 text=text+' GDT_TS='+line.split()[1]
649 task.remd_model1=task.remd_model1+text
651 task.remd_model2=task.remd_model2+text
653 task.remd_model3=task.remd_model3+text
655 task.remd_model4=task.remd_model4+text
657 task.remd_model5=task.remd_model5+text
661 if task.type=='remd':
662 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
665 if 'sumprob' in line:
672 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
674 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
676 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
678 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
680 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
685 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
686 if (task.type=='min'):
689 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
694 last = line.split()[0]
697 task.running=int(1+int(last)*100.0/task.md_nstep)