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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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 render(request, "details.html",{'task':task})
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})
440 def details(request,task_id):
441 task = get_object_or_404(Task, id=task_id)
442 return render(request, "details.html",{'task':task})
445 def delete(request, task_id):
446 Task.objects.get(id=task_id).delete()
450 def refresh_done(request):
452 tasks = Task.objects.filter(owner=user).order_by('-created_date')
454 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
457 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
459 if task.type=='min' or task.type=='md':
463 task.etot=line.split()[1]
465 if 'RMS deviation' in line:
473 if 'Total wall' in line:
476 elif task.type=='remd':
478 text="Acceptance for replica exchanges\n"
484 if j==task.remd_nrep:
486 text="Acceptance for replica exchanges\n"+line
488 if 'Total wall' in line:
491 task.results_text=text
494 if task.md_pdbref and task.type=='remd':
498 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
501 task.remd_model1=' '.join(line.split()[-6:])
503 task.remd_model2=' '.join(line.split()[-6:])
505 task.remd_model3=' '.join(line.split()[-6:])
507 task.remd_model4=' '.join(line.split()[-6:])
509 task.remd_model5=' '.join(line.split()[-6:])
510 except EnvironmentError:
511 print 'file_wham_T*pdb open error'
513 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
516 if 'RMSD of the common residues=' in line:
517 text=' RMSD='+line.split()[5]
518 if 'TM-score =' in line:
519 text=text+' TMscore='+line.split()[2]
520 if 'GDT-TS-score=' in line:
521 text=text+' GDT_TS='+line.split()[1]
524 task.remd_model1=task.remd_model1+text
526 task.remd_model2=task.remd_model2+text
528 task.remd_model3=task.remd_model3+text
530 task.remd_model4=task.remd_model4+text
532 task.remd_model5=task.remd_model5+text
536 if task.type=='remd':
537 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
540 if 'sumprob' in line:
547 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
549 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
551 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
553 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
555 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
560 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
561 if (task.type=='min'):
564 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
569 last = line.split()[0]
572 task.running=int(1+int(last)*100.0/task.md_nstep)
577 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
580 for line in proc.stdout:
581 if 'piasek4' in line:
582 if line.split()[1]=='test_server':
584 if line.split()[-2]=='Q':
586 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
588 if is_lazy_user(request.user):
589 return redirect('/details/'+str(task.id)+'/')
591 return render(request, "index.html", {
593 'variable' : variable
596 # return redirect('/')