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 form = TaskForm_min(request.POST,request.FILES)
129 task.name=form.cleaned_data["name"]
131 task.myfile1=form.cleaned_data["file1"]
133 seq,task.ssbond=from_pdb(task.myfile1)
135 for i in range(0,len(seq),40):
136 task.md_seq=task.md_seq+seq[i:i+40]+" "
139 basename = str(task.owner)
140 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
141 task.jobdirname = "_".join([basename, suffix])
144 if is_lazy_user(request.user):
145 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
149 data= {'name':task.name}
150 form = TaskForm_min(initial=data)
151 p_type='minimization'
153 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
156 def add_min_a(request,task_id):
157 task = get_object_or_404(Task, id=task_id)
158 if request.method == 'POST':
159 form = TaskForm_min_a(request.POST,request.FILES)
161 task.name=form.cleaned_data["name"]
163 task.min_choice=form.cleaned_data["min_choice"]
164 task.min_overlap=form.cleaned_data["min_overlap"]
165 task.min_searchsc=form.cleaned_data["min_searchsc"]
166 task.min_maxmin=form.cleaned_data["min_maxmin"]
167 task.min_maxfun=form.cleaned_data["min_maxfun"]
168 task.min_pdbout=form.cleaned_data["min_pdbout"]
169 task.myfile1=form.cleaned_data["file1"]
170 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
171 task.unres_ff=form.cleaned_data["unres_ff"]
172 task.boxx=form.cleaned_data["boxx"]
173 task.boxy=form.cleaned_data["boxy"]
174 task.boxz=form.cleaned_data["boxz"]
176 seq,task.ssbond=from_pdb(task.myfile1)
178 for i in range(0,len(seq),40):
179 task.md_seq=task.md_seq+seq[i:i+40]+" "
183 basename = str(task.owner)
184 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
185 task.jobdirname = "_".join([basename, suffix])
188 if is_lazy_user(request.user):
189 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
193 data= {'name':task.name}
194 form = TaskForm_min_a(initial=data)
196 p_type='minimization - advanced options'
197 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
200 def add_md(request,task_id):
201 task = get_object_or_404(Task, id=task_id)
202 if request.method == 'POST':
203 form = TaskForm_md(request.POST,request.FILES)
205 task.name=form.cleaned_data["name"]
207 task.md_seed=form.cleaned_data["md_seed"]
208 task.md_start=form.cleaned_data["md_start"]
209 task.md_temp=form.cleaned_data["md_temp"]
210 task.md_nstep=form.cleaned_data["md_nstep"]
212 task.myfile1=form.cleaned_data["file1"]
213 task.md_pdbref=form.cleaned_data["md_pdbref"]
216 if task.md_start == "pdbstart" or task.md_pdbref:
217 seq,task.ssbond=from_pdb(task.myfile1)
219 seq=seq_add_x(form.cleaned_data["md_seq"])
221 for i in range(0,len(seq),40):
222 task.md_seq=task.md_seq+seq[i:i+40]+" "
224 if task.md_start != "pdbstart":
228 basename = str(task.owner)
229 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
230 task.jobdirname = "_".join([basename, suffix])
233 if is_lazy_user(request.user):
234 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
238 data= {'name':task.name}
239 form = TaskForm_md(initial=data)
241 p_type='molecular dynamics'
242 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
245 def add_md_a(request,task_id):
246 task = get_object_or_404(Task, id=task_id)
247 if request.method == 'POST':
248 form = TaskForm_md_a(request.POST,request.FILES)
250 task.name=form.cleaned_data["name"]
253 task.myfile1=form.cleaned_data["file1"]
254 task.md_start=form.cleaned_data["md_start"]
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"])
262 for i in range(0,len(seq),40):
263 task.md_seq=task.md_seq+seq[i:i+40]+" "
265 if task.md_start != "pdbstart":
268 task.md_seed=form.cleaned_data["md_seed"]
270 task.md_temp=form.cleaned_data["md_temp"]
271 task.md_nstep=form.cleaned_data["md_nstep"]
272 task.md_ntwe=form.cleaned_data["md_ntwe"]
273 task.md_ntwx=form.cleaned_data["md_ntwx"]
274 task.md_dt=form.cleaned_data["md_dt"]
275 task.md_lang=form.cleaned_data["md_lang"]
276 task.md_tau=form.cleaned_data["md_tau"]
277 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
278 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
279 task.unres_ff=form.cleaned_data["unres_ff"]
280 task.boxx=form.cleaned_data["boxx"]
281 task.boxy=form.cleaned_data["boxy"]
282 task.boxz=form.cleaned_data["boxz"]
286 basename = str(task.owner)
287 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
288 task.jobdirname = "_".join([basename, suffix])
291 if is_lazy_user(request.user):
292 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
296 data= {'name':task.name}
297 form = TaskForm_md_a(initial=data)
299 p_type='molecular dynamics - advanced options'
300 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
303 def add_remd(request,task_id):
304 task = get_object_or_404(Task, id=task_id)
305 if request.method == 'POST':
306 form = TaskForm_remd(request.POST,request.FILES)
308 task.name=form.cleaned_data["name"]
310 task.md_start=form.cleaned_data["md_start"]
311 task.myfile1=form.cleaned_data["file1"]
312 task.md_pdbref=form.cleaned_data["md_pdbref"]
313 task.md_ntwx=task.remd_nstex
316 if task.md_start == "pdbstart" or task.md_pdbref:
317 seq,task.ssbond=from_pdb(task.myfile1)
319 seq=seq_add_x(form.cleaned_data["md_seq"])
320 for i in range(0,len(seq),40):
321 task.md_seq=task.md_seq+seq[i:i+40]+" "
323 if task.md_start != "pdbstart":
326 task.md_seed=form.cleaned_data["md_seed"]
328 task.md_nstep=form.cleaned_data["md_nstep"]
333 basename = str(task.owner)
334 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
335 task.jobdirname = "_".join([basename, suffix])
338 if is_lazy_user(request.user):
339 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
343 data= {'name':task.name}
344 form = TaskForm_remd(initial=data)
346 p_type='replica exchange molecular dynamics'
347 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
350 def add_remd_a(request,task_id):
351 task = get_object_or_404(Task, id=task_id)
352 if request.method == 'POST':
353 form = TaskForm_remd_a(request.POST,request.FILES)
355 task.name=form.cleaned_data["name"]
358 task.myfile1=form.cleaned_data["file1"]
359 task.md_start=form.cleaned_data["md_start"]
360 task.md_pdbref=form.cleaned_data["md_pdbref"]
363 if task.md_start == "pdbstart" or task.md_pdbref:
364 seq,task.ssbond=from_pdb(task.myfile1)
366 seq=seq_add_x(form.cleaned_data["md_seq"])
367 for i in range(0,len(seq),40):
368 task.md_seq=task.md_seq+seq[i:i+40]+" "
370 if task.md_start != "pdbstart":
373 task.md_seed=form.cleaned_data["md_seed"]
374 task.md_nstep=form.cleaned_data["md_nstep"]
375 task.md_dt=form.cleaned_data["md_dt"]
376 task.md_lang=form.cleaned_data["md_lang"]
377 task.md_tau=form.cleaned_data["md_tau"]
378 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
379 task.remd_nrep=form.cleaned_data["remd_nrep"]
380 task.remd_nstex=form.cleaned_data["remd_nstex"]
381 task.md_ntwx=form.cleaned_data["md_ntwx"]
382 task.md_ntwe=form.cleaned_data["md_ntwe"]
383 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
384 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
386 task.boxx=form.cleaned_data["boxx"]
387 task.boxy=form.cleaned_data["boxy"]
388 task.boxz=form.cleaned_data["boxz"]
391 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
392 task.unres_ff=form.cleaned_data["unres_ff"]
394 basename = str(task.owner)
395 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
396 task.jobdirname = "_".join([basename, suffix])
399 return redirect('addmlist',task_id=task.id)
401 data= {'name':task.name}
402 form = TaskForm_remd_a(initial=data)
404 p_type='replica exchange molecular dynamics - advanced options'
405 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
408 def addmlist(request,task_id):
409 task = get_object_or_404(Task, id=task_id)
410 if request.method == 'POST':
411 form = TaskForm_list(task.remd_nrep,request.POST)
413 task.remd_multi_t=form.cleaned_data["temperatures"]
414 task.remd_multi_m=form.cleaned_data["multiplexing"]
418 if is_lazy_user(request.user):
419 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
423 if task.unres_ff == 'E0LL2Y':
424 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
425 '["1", "1", "1", "1", "1", "1", "1", "1"]',
427 '["270", "280", "290", "300", "310", "320", "330", "345"]'
430 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
431 '["1", "1", "1", "1", "1", "1", "1", "1"]',
433 '["250", "260", "270", "280", "290", "300", "315", "330"]'
436 form = TaskForm_list(task.remd_nrep,initial=data)
437 p_type='replica exchange molecular dynamics - advanced options'
438 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
441 def details(request,task_id):
442 task = get_object_or_404(Task, id=task_id)
443 return render(request, "details.html",{'task':task})
446 def details1(request,user_id,task_id):
447 task = get_object_or_404(Task, id=task_id)
448 return render(request, "details1.html",{'task':task})
452 def delete(request, task_id):
453 Task.objects.get(id=task_id).delete()
456 def refresh_done1(request, task_id):
457 task = get_object_or_404(Task, id=task_id)
461 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
464 for line in proc.stdout:
465 if 'piasek4' in line:
466 if line.split()[1]=='test_server':
468 if line.split()[-2]=='Q':
470 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
472 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
476 def refresh_done(request):
478 tasks = Task.objects.filter(owner=user).order_by('-created_date')
482 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
485 for line in proc.stdout:
486 if 'piasek4' in line:
487 if line.split()[1]=='test_server':
489 if line.split()[-2]=='Q':
491 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
493 if is_lazy_user(request.user):
494 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
496 return render(request, "index.html", {
498 'variable' : variable
502 def refresh_done0(task):
503 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
506 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
508 if task.type=='min' or task.type=='md':
512 task.etot=line.split()[1]
514 if 'RMS deviation' in line:
522 if 'Total wall' in line:
525 elif task.type=='remd':
527 text="Acceptance for replica exchanges\n"
533 if j==task.remd_nrep:
535 text="Acceptance for replica exchanges\n"+line
537 if 'Total wall' in line:
540 task.results_text=text
543 if task.md_pdbref and task.type=='remd':
547 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
550 task.remd_model1=' '.join(line.split()[-6:])
552 task.remd_model2=' '.join(line.split()[-6:])
554 task.remd_model3=' '.join(line.split()[-6:])
556 task.remd_model4=' '.join(line.split()[-6:])
558 task.remd_model5=' '.join(line.split()[-6:])
559 except EnvironmentError:
560 print 'file_wham_T*pdb open error'
562 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
565 if 'RMSD of the common residues=' in line:
566 text=' RMSD='+line.split()[5]
567 if 'TM-score =' in line:
568 text=text+' TMscore='+line.split()[2]
569 if 'GDT-TS-score=' in line:
570 text=text+' GDT_TS='+line.split()[1]
573 task.remd_model1=task.remd_model1+text
575 task.remd_model2=task.remd_model2+text
577 task.remd_model3=task.remd_model3+text
579 task.remd_model4=task.remd_model4+text
581 task.remd_model5=task.remd_model5+text
585 if task.type=='remd':
586 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
589 if 'sumprob' in line:
596 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
598 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
600 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
602 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
604 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
609 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
610 if (task.type=='min'):
613 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
618 last = line.split()[0]
621 task.running=int(1+int(last)*100.0/task.md_nstep)