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 form = TaskForm_min_a(request.POST,request.FILES)
174 task.name=form.cleaned_data["name"]
176 task.min_choice=form.cleaned_data["min_choice"]
177 task.min_overlap=form.cleaned_data["min_overlap"]
178 task.min_searchsc=form.cleaned_data["min_searchsc"]
179 task.min_maxmin=form.cleaned_data["min_maxmin"]
180 task.min_maxfun=form.cleaned_data["min_maxfun"]
181 task.min_pdbout=form.cleaned_data["min_pdbout"]
182 task.myfile1=form.cleaned_data["file1"]
183 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
184 task.unres_ff=form.cleaned_data["unres_ff"]
185 task.boxx=form.cleaned_data["boxx"]
186 task.boxy=form.cleaned_data["boxy"]
187 task.boxz=form.cleaned_data["boxz"]
189 seq,task.ssbond=from_pdb(task.myfile1)
191 for i in range(0,len(seq),40):
192 task.md_seq=task.md_seq+seq[i:i+40]+" "
196 basename = str(task.owner)
197 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
198 task.jobdirname = "_".join([basename, suffix])
201 if is_lazy_user(request.user):
202 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
206 data= {'name':task.name}
207 form = TaskForm_min_a(initial=data)
209 p_type='minimization - advanced options'
210 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
213 def add_md(request,task_id):
214 task = get_object_or_404(Task, id=task_id)
215 if request.method == 'POST':
216 form = TaskForm_md(request.POST,request.FILES)
218 task.name=form.cleaned_data["name"]
220 task.md_seed=form.cleaned_data["md_seed"]
221 task.md_start=form.cleaned_data["md_start"]
222 task.md_temp=form.cleaned_data["md_temp"]
223 task.md_nstep=form.cleaned_data["md_nstep"]
225 task.myfile1=form.cleaned_data["file1"]
226 task.md_pdbref=form.cleaned_data["md_pdbref"]
229 if task.md_start == "pdbstart" or task.md_pdbref:
230 seq,task.ssbond=from_pdb(task.myfile1)
232 seq=seq_add_x(form.cleaned_data["md_seq"])
234 for i in range(0,len(seq),40):
235 task.md_seq=task.md_seq+seq[i:i+40]+" "
237 if task.md_start != "pdbstart":
241 basename = str(task.owner)
242 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
243 task.jobdirname = "_".join([basename, suffix])
246 if is_lazy_user(request.user):
247 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
251 data= {'name':task.name}
252 form = TaskForm_md(initial=data)
254 p_type='molecular dynamics'
255 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
258 def add_md_a(request,task_id):
259 task = get_object_or_404(Task, id=task_id)
260 if request.method == 'POST':
261 form = TaskForm_md_a(request.POST,request.FILES)
263 task.name=form.cleaned_data["name"]
266 task.myfile1=form.cleaned_data["file1"]
267 task.md_start=form.cleaned_data["md_start"]
268 task.md_pdbref=form.cleaned_data["md_pdbref"]
271 if task.md_start == "pdbstart" or task.md_pdbref:
272 seq,task.ssbond=from_pdb(task.myfile1)
274 seq=seq_add_x(form.cleaned_data["md_seq"])
275 for i in range(0,len(seq),40):
276 task.md_seq=task.md_seq+seq[i:i+40]+" "
278 if task.md_start != "pdbstart":
281 task.md_seed=form.cleaned_data["md_seed"]
283 task.md_temp=form.cleaned_data["md_temp"]
284 task.md_nstep=form.cleaned_data["md_nstep"]
285 task.md_ntwe=form.cleaned_data["md_ntwe"]
286 task.md_ntwx=form.cleaned_data["md_ntwx"]
287 task.md_dt=form.cleaned_data["md_dt"]
288 task.md_lang=form.cleaned_data["md_lang"]
289 task.md_tau=form.cleaned_data["md_tau"]
290 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
291 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
292 task.unres_ff=form.cleaned_data["unres_ff"]
293 task.boxx=form.cleaned_data["boxx"]
294 task.boxy=form.cleaned_data["boxy"]
295 task.boxz=form.cleaned_data["boxz"]
299 basename = str(task.owner)
300 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
301 task.jobdirname = "_".join([basename, suffix])
304 if is_lazy_user(request.user):
305 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
309 data= {'name':task.name}
310 form = TaskForm_md_a(initial=data)
312 p_type='molecular dynamics - advanced options'
313 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
316 def add_remd(request,task_id):
317 task = get_object_or_404(Task, id=task_id)
318 if request.method == 'POST':
319 form = TaskForm_remd(request.POST,request.FILES)
321 task.name=form.cleaned_data["name"]
323 task.md_start=form.cleaned_data["md_start"]
324 task.myfile1=form.cleaned_data["file1"]
325 task.md_pdbref=form.cleaned_data["md_pdbref"]
326 task.md_ntwx=task.remd_nstex
329 if task.md_start == "pdbstart" or task.md_pdbref:
330 seq,task.ssbond=from_pdb(task.myfile1)
332 seq=seq_add_x(form.cleaned_data["md_seq"])
333 for i in range(0,len(seq),40):
334 task.md_seq=task.md_seq+seq[i:i+40]+" "
336 if task.md_start != "pdbstart":
339 task.md_seed=form.cleaned_data["md_seed"]
341 task.md_nstep=form.cleaned_data["md_nstep"]
346 basename = str(task.owner)
347 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
348 task.jobdirname = "_".join([basename, suffix])
351 if is_lazy_user(request.user):
352 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
356 data= {'name':task.name}
357 form = TaskForm_remd(initial=data)
359 p_type='replica exchange molecular dynamics'
360 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
363 def add_remd_a(request,task_id):
364 task = get_object_or_404(Task, id=task_id)
365 if request.method == 'POST':
366 form = TaskForm_remd_a(request.POST,request.FILES)
368 task.name=form.cleaned_data["name"]
371 task.myfile1=form.cleaned_data["file1"]
372 task.md_start=form.cleaned_data["md_start"]
373 task.md_pdbref=form.cleaned_data["md_pdbref"]
376 if task.md_start == "pdbstart" or task.md_pdbref:
377 seq,task.ssbond=from_pdb(task.myfile1)
379 seq=seq_add_x(form.cleaned_data["md_seq"])
380 for i in range(0,len(seq),40):
381 task.md_seq=task.md_seq+seq[i:i+40]+" "
383 if task.md_start != "pdbstart":
386 task.md_seed=form.cleaned_data["md_seed"]
387 task.md_nstep=form.cleaned_data["md_nstep"]
388 task.md_dt=form.cleaned_data["md_dt"]
389 task.md_lang=form.cleaned_data["md_lang"]
390 task.md_tau=form.cleaned_data["md_tau"]
391 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
392 task.remd_nrep=form.cleaned_data["remd_nrep"]
393 task.remd_nstex=form.cleaned_data["remd_nstex"]
394 task.md_ntwx=form.cleaned_data["md_ntwx"]
395 task.md_ntwe=form.cleaned_data["md_ntwe"]
396 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
397 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
399 task.boxx=form.cleaned_data["boxx"]
400 task.boxy=form.cleaned_data["boxy"]
401 task.boxz=form.cleaned_data["boxz"]
404 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
405 task.unres_ff=form.cleaned_data["unres_ff"]
407 basename = str(task.owner)
408 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
409 task.jobdirname = "_".join([basename, suffix])
412 return redirect('addmlist',task_id=task.id)
414 data= {'name':task.name}
415 form = TaskForm_remd_a(initial=data)
417 p_type='replica exchange molecular dynamics - advanced options'
418 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
421 def addmlist(request,task_id):
422 task = get_object_or_404(Task, id=task_id)
423 if request.method == 'POST':
424 form = TaskForm_list(task.remd_nrep,request.POST)
426 task.remd_multi_t=form.cleaned_data["temperatures"]
427 task.remd_multi_m=form.cleaned_data["multiplexing"]
431 if is_lazy_user(request.user):
432 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
436 if task.unres_ff == 'E0LL2Y':
437 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
438 '["1", "1", "1", "1", "1", "1", "1", "1"]',
440 '["270", "280", "290", "300", "310", "320", "330", "345"]'
443 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
444 '["1", "1", "1", "1", "1", "1", "1", "1"]',
446 '["250", "260", "270", "280", "290", "300", "315", "330"]'
449 form = TaskForm_list(task.remd_nrep,initial=data)
450 p_type='replica exchange molecular dynamics - advanced options'
451 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
454 def details(request,task_id):
455 task = get_object_or_404(Task, id=task_id)
456 return render(request, "details.html",{'task':task})
459 def details1(request,user_id,task_id):
460 task = get_object_or_404(Task, id=task_id)
461 return render(request, "details1.html",{'task':task})
465 def delete(request, task_id):
466 Task.objects.get(id=task_id).delete()
469 def refresh_done1(request, task_id):
470 task = get_object_or_404(Task, id=task_id)
474 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
477 for line in proc.stdout:
478 if 'piasek4' in line:
479 if line.split()[1]=='test_server':
481 if line.split()[-2]=='Q':
483 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
485 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
489 def refresh_done(request):
491 tasks = Task.objects.filter(owner=user).order_by('-created_date')
495 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
498 for line in proc.stdout:
499 if 'piasek4' in line:
500 if line.split()[1]=='test_server':
502 if line.split()[-2]=='Q':
504 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
506 if is_lazy_user(request.user):
507 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
509 return render(request, "index.html", {
511 'variable' : variable
515 def refresh_done0(task):
516 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
519 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
521 if task.type=='min' or task.type=='md':
525 task.etot=line.split()[1]
527 if 'RMS deviation' in line:
535 if 'Total wall' in line:
538 elif task.type=='remd':
540 text="Acceptance for replica exchanges\n"
546 if j==task.remd_nrep:
548 text="Acceptance for replica exchanges\n"+line
550 if 'Total wall' in line:
553 task.results_text=text
556 if task.md_pdbref and task.type=='remd':
560 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
563 task.remd_model1=' '.join(line.split()[-6:])
565 task.remd_model2=' '.join(line.split()[-6:])
567 task.remd_model3=' '.join(line.split()[-6:])
569 task.remd_model4=' '.join(line.split()[-6:])
571 task.remd_model5=' '.join(line.split()[-6:])
572 except EnvironmentError:
573 print 'file_wham_T*pdb open error'
575 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
578 if 'RMSD of the common residues=' in line:
579 text=' RMSD='+line.split()[5]
580 if 'TM-score =' in line:
581 text=text+' TMscore='+line.split()[2]
582 if 'GDT-TS-score=' in line:
583 text=text+' GDT_TS='+line.split()[1]
586 task.remd_model1=task.remd_model1+text
588 task.remd_model2=task.remd_model2+text
590 task.remd_model3=task.remd_model3+text
592 task.remd_model4=task.remd_model4+text
594 task.remd_model5=task.remd_model5+text
598 if task.type=='remd':
599 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
602 if 'sumprob' in line:
609 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
611 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
613 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
615 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
617 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
622 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
623 if (task.type=='min'):
626 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
631 last = line.split()[0]
634 task.running=int(1+int(last)*100.0/task.md_nstep)