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])
146 data= {'name':task.name}
147 form = TaskForm_min(initial=data)
148 p_type='minimization'
150 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
153 def add_min_a(request,task_id):
154 task = get_object_or_404(Task, id=task_id)
155 if request.method == 'POST':
156 form = TaskForm_min_a(request.POST,request.FILES)
158 task.name=form.cleaned_data["name"]
160 task.min_choice=form.cleaned_data["min_choice"]
161 task.min_overlap=form.cleaned_data["min_overlap"]
162 task.min_searchsc=form.cleaned_data["min_searchsc"]
163 task.min_maxmin=form.cleaned_data["min_maxmin"]
164 task.min_maxfun=form.cleaned_data["min_maxfun"]
165 task.min_pdbout=form.cleaned_data["min_pdbout"]
166 task.myfile1=form.cleaned_data["file1"]
167 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
168 task.unres_ff=form.cleaned_data["unres_ff"]
169 task.boxx=form.cleaned_data["boxx"]
170 task.boxy=form.cleaned_data["boxy"]
171 task.boxz=form.cleaned_data["boxz"]
173 seq,task.ssbond=from_pdb(task.myfile1)
175 for i in range(0,len(seq),40):
176 task.md_seq=task.md_seq+seq[i:i+40]+" "
180 basename = str(task.owner)
181 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
182 task.jobdirname = "_".join([basename, suffix])
187 data= {'name':task.name}
188 form = TaskForm_min_a(initial=data)
190 p_type='minimization - advanced options'
191 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
194 def add_md(request,task_id):
195 task = get_object_or_404(Task, id=task_id)
196 if request.method == 'POST':
197 form = TaskForm_md(request.POST,request.FILES)
199 task.name=form.cleaned_data["name"]
201 task.md_seed=form.cleaned_data["md_seed"]
202 task.md_start=form.cleaned_data["md_start"]
203 task.md_temp=form.cleaned_data["md_temp"]
204 task.md_nstep=form.cleaned_data["md_nstep"]
206 task.myfile1=form.cleaned_data["file1"]
207 task.md_pdbref=form.cleaned_data["md_pdbref"]
210 if task.md_start == "pdbstart" or task.md_pdbref:
211 seq,task.ssbond=from_pdb(task.myfile1)
213 seq=seq_add_x(form.cleaned_data["md_seq"])
215 for i in range(0,len(seq),40):
216 task.md_seq=task.md_seq+seq[i:i+40]+" "
218 if task.md_start != "pdbstart":
222 basename = str(task.owner)
223 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
224 task.jobdirname = "_".join([basename, suffix])
227 if is_lazy_user(request.user):
228 return render(request, "details.html",{'task':task})
232 data= {'name':task.name}
233 form = TaskForm_md(initial=data)
235 p_type='molecular dynamics'
236 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
239 def add_md_a(request,task_id):
240 task = get_object_or_404(Task, id=task_id)
241 if request.method == 'POST':
242 form = TaskForm_md_a(request.POST,request.FILES)
244 task.name=form.cleaned_data["name"]
247 task.myfile1=form.cleaned_data["file1"]
248 task.md_start=form.cleaned_data["md_start"]
249 task.md_pdbref=form.cleaned_data["md_pdbref"]
252 if task.md_start == "pdbstart" or task.md_pdbref:
253 seq,task.ssbond=from_pdb(task.myfile1)
255 seq=seq_add_x(form.cleaned_data["md_seq"])
256 for i in range(0,len(seq),40):
257 task.md_seq=task.md_seq+seq[i:i+40]+" "
259 if task.md_start != "pdbstart":
262 task.md_seed=form.cleaned_data["md_seed"]
264 task.md_temp=form.cleaned_data["md_temp"]
265 task.md_nstep=form.cleaned_data["md_nstep"]
266 task.md_ntwe=form.cleaned_data["md_ntwe"]
267 task.md_ntwx=form.cleaned_data["md_ntwx"]
268 task.md_dt=form.cleaned_data["md_dt"]
269 task.md_lang=form.cleaned_data["md_lang"]
270 task.md_tau=form.cleaned_data["md_tau"]
271 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
272 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
273 task.unres_ff=form.cleaned_data["unres_ff"]
274 task.boxx=form.cleaned_data["boxx"]
275 task.boxy=form.cleaned_data["boxy"]
276 task.boxz=form.cleaned_data["boxz"]
280 basename = str(task.owner)
281 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
282 task.jobdirname = "_".join([basename, suffix])
287 data= {'name':task.name}
288 form = TaskForm_md_a(initial=data)
290 p_type='molecular dynamics - advanced options'
291 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
294 def add_remd(request,task_id):
295 task = get_object_or_404(Task, id=task_id)
296 if request.method == 'POST':
297 form = TaskForm_remd(request.POST,request.FILES)
299 task.name=form.cleaned_data["name"]
301 task.md_start=form.cleaned_data["md_start"]
302 task.myfile1=form.cleaned_data["file1"]
303 task.md_pdbref=form.cleaned_data["md_pdbref"]
304 task.md_ntwx=task.remd_nstex
307 if task.md_start == "pdbstart" or task.md_pdbref:
308 seq,task.ssbond=from_pdb(task.myfile1)
310 seq=seq_add_x(form.cleaned_data["md_seq"])
311 for i in range(0,len(seq),40):
312 task.md_seq=task.md_seq+seq[i:i+40]+" "
314 if task.md_start != "pdbstart":
317 task.md_seed=form.cleaned_data["md_seed"]
319 task.md_nstep=form.cleaned_data["md_nstep"]
324 basename = str(task.owner)
325 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
326 task.jobdirname = "_".join([basename, suffix])
331 data= {'name':task.name}
332 form = TaskForm_remd(initial=data)
334 p_type='replica exchange molecular dynamics'
335 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
338 def add_remd_a(request,task_id):
339 task = get_object_or_404(Task, id=task_id)
340 if request.method == 'POST':
341 form = TaskForm_remd_a(request.POST,request.FILES)
343 task.name=form.cleaned_data["name"]
346 task.myfile1=form.cleaned_data["file1"]
347 task.md_start=form.cleaned_data["md_start"]
348 task.md_pdbref=form.cleaned_data["md_pdbref"]
351 if task.md_start == "pdbstart" or task.md_pdbref:
352 seq,task.ssbond=from_pdb(task.myfile1)
354 seq=seq_add_x(form.cleaned_data["md_seq"])
355 for i in range(0,len(seq),40):
356 task.md_seq=task.md_seq+seq[i:i+40]+" "
358 if task.md_start != "pdbstart":
361 task.md_seed=form.cleaned_data["md_seed"]
362 task.md_nstep=form.cleaned_data["md_nstep"]
363 task.md_dt=form.cleaned_data["md_dt"]
364 task.md_lang=form.cleaned_data["md_lang"]
365 task.md_tau=form.cleaned_data["md_tau"]
366 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
367 task.remd_nrep=form.cleaned_data["remd_nrep"]
368 task.remd_nstex=form.cleaned_data["remd_nstex"]
369 task.md_ntwx=form.cleaned_data["md_ntwx"]
370 task.md_ntwe=form.cleaned_data["md_ntwe"]
371 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
372 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
374 task.boxx=form.cleaned_data["boxx"]
375 task.boxy=form.cleaned_data["boxy"]
376 task.boxz=form.cleaned_data["boxz"]
379 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
380 task.unres_ff=form.cleaned_data["unres_ff"]
382 basename = str(task.owner)
383 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
384 task.jobdirname = "_".join([basename, suffix])
387 return redirect('addmlist',task_id=task.id)
389 data= {'name':task.name}
390 form = TaskForm_remd_a(initial=data)
392 p_type='replica exchange molecular dynamics - advanced options'
393 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
396 def addmlist(request,task_id):
397 task = get_object_or_404(Task, id=task_id)
398 if request.method == 'POST':
399 form = TaskForm_list(task.remd_nrep,request.POST)
401 task.remd_multi_t=form.cleaned_data["temperatures"]
402 task.remd_multi_m=form.cleaned_data["multiplexing"]
408 if task.unres_ff == 'E0LL2Y':
409 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
410 '["1", "1", "1", "1", "1", "1", "1", "1"]',
412 '["270", "280", "290", "300", "310", "320", "330", "345"]'
415 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
416 '["1", "1", "1", "1", "1", "1", "1", "1"]',
418 '["250", "260", "270", "280", "290", "300", "315", "330"]'
421 form = TaskForm_list(task.remd_nrep,initial=data)
422 p_type='replica exchange molecular dynamics - advanced options'
423 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
425 def details(request,task_id):
426 task = get_object_or_404(Task, id=task_id)
427 return render(request, "details.html",{'task':task})
430 def delete(request, task_id):
431 Task.objects.get(id=task_id).delete()
435 def refresh_done(request):
437 tasks = Task.objects.filter(owner=user).order_by('-created_date')
439 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
442 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
444 if task.type=='min' or task.type=='md':
448 task.etot=line.split()[1]
450 if 'RMS deviation' in line:
458 if 'Total wall' in line:
461 elif task.type=='remd':
463 text="Acceptance for replica exchanges\n"
469 if j==task.remd_nrep:
471 text="Acceptance for replica exchanges\n"+line
473 if 'Total wall' in line:
476 task.results_text=text
479 if task.md_pdbref and task.type=='remd':
483 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
486 task.remd_model1=' '.join(line.split()[-6:])
488 task.remd_model2=' '.join(line.split()[-6:])
490 task.remd_model3=' '.join(line.split()[-6:])
492 task.remd_model4=' '.join(line.split()[-6:])
494 task.remd_model5=' '.join(line.split()[-6:])
495 except EnvironmentError:
496 print 'file_wham_T*pdb open error'
498 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
501 if 'RMSD of the common residues=' in line:
502 text=' RMSD='+line.split()[5]
503 if 'TM-score =' in line:
504 text=text+' TMscore='+line.split()[2]
505 if 'GDT-TS-score=' in line:
506 text=text+' GDT_TS='+line.split()[1]
509 task.remd_model1=task.remd_model1+text
511 task.remd_model2=task.remd_model2+text
513 task.remd_model3=task.remd_model3+text
515 task.remd_model4=task.remd_model4+text
517 task.remd_model5=task.remd_model5+text
521 if task.type=='remd':
522 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
525 if 'sumprob' in line:
532 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
534 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
536 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
538 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
540 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
545 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
546 if (task.type=='min'):
549 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
554 last = line.split()[0]
557 task.running=int(1+int(last)*100.0/task.md_nstep)
562 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
565 for line in proc.stdout:
566 if 'piasek4' in line:
567 if line.split()[1]=='test_server':
569 if line.split()[-2]=='Q':
571 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
573 if is_lazy_user(request.user):
574 return redirect('/details/'+str(task.id)+'/')
576 return render(request, "index.html", {
578 'variable' : variable
581 # return redirect('/')