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
12 # 20 canonical amino acids
13 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
14 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
15 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
16 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
17 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
18 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
19 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
23 three_to_one = dict(res_codes)
25 def seq_add_x(sequence):
26 if sequence[0] != 'G':
28 if sequence[-1] != 'G':
30 set ='CDSQKIPTFNGHLRWAVEYMX'
31 sequence = ''.join([c for c in sequence if c in set])
48 if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
50 chain_=tmp.split(', ')
51 chain_[-1]=chain_[-1][0]
54 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
55 aa = three_to_one.get(line[17:20])
57 if newchain or i!=ires[-1]:
62 chain_start[chain[ichain]]=i
64 if line[0:3] == 'TER':
67 chain_end[chain[ichain]]=i
70 if line[0:6] == 'SSBOND':
72 b.append(int(line[17:21]))
73 b.append(int(line[31:35]))
76 c.append((line[15:16]))
77 c.append((line[29:30]))
79 if line[0:3] == 'END':
81 while sequence[-1] == 'XX':
83 if sequence[0] != 'G':
84 sequence.insert(0,'X')
85 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
86 if sequence[-1] != 'G':
90 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
93 unres_shift[c]=i+chain_start[c]
94 i=i-(chain_end[c]-chain_start[c])-3
95 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
97 return seq,json.dumps(ssbond)
103 tasks = Task.objects.filter(owner=user).order_by('-created_date')
105 return render(request, "index.html", {
111 if request.method == 'POST':
112 form = TaskForm(request.POST)
114 name = form.cleaned_data["name"]
116 task = Task(name=name,owner=user,ready=False)
118 return redirect('add_min',task_id=task.id)
123 def add_min(request,task_id):
124 task = get_object_or_404(Task, id=task_id)
125 if request.method == 'POST':
126 form = TaskForm_min(request.POST,request.FILES)
128 task.name=form.cleaned_data["name"]
130 task.myfile1=form.cleaned_data["file1"]
132 seq,task.ssbond=from_pdb(task.myfile1)
134 for i in range(0,len(seq),40):
135 task.md_seq=task.md_seq+seq[i:i+40]+" "
138 basename = str(task.owner)
139 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
140 task.jobdirname = "_".join([basename, suffix])
145 data= {'name':task.name}
146 form = TaskForm_min(initial=data)
147 p_type='minimization'
149 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
151 def add_min_a(request,task_id):
152 task = get_object_or_404(Task, id=task_id)
153 if request.method == 'POST':
154 form = TaskForm_min_a(request.POST,request.FILES)
156 task.name=form.cleaned_data["name"]
158 task.min_choice=form.cleaned_data["min_choice"]
159 task.min_overlap=form.cleaned_data["min_overlap"]
160 task.min_searchsc=form.cleaned_data["min_searchsc"]
161 task.min_maxmin=form.cleaned_data["min_maxmin"]
162 task.min_maxfun=form.cleaned_data["min_maxfun"]
163 task.min_pdbout=form.cleaned_data["min_pdbout"]
164 task.myfile1=form.cleaned_data["file1"]
165 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
166 task.unres_ff=form.cleaned_data["unres_ff"]
168 seq,task.ssbond=from_pdb(task.myfile1)
170 for i in range(0,len(seq),40):
171 task.md_seq=task.md_seq+seq[i:i+40]+" "
175 basename = str(task.owner)
176 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
177 task.jobdirname = "_".join([basename, suffix])
182 data= {'name':task.name}
183 form = TaskForm_min_a(initial=data)
185 p_type='minimization - advanced options'
186 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
189 def add_md(request,task_id):
190 task = get_object_or_404(Task, id=task_id)
191 if request.method == 'POST':
192 form = TaskForm_md(request.POST,request.FILES)
194 task.name=form.cleaned_data["name"]
196 task.md_seed=form.cleaned_data["md_seed"]
197 task.md_start=form.cleaned_data["md_start"]
198 task.md_temp=form.cleaned_data["md_temp"]
199 task.md_nstep=form.cleaned_data["md_nstep"]
201 task.myfile1=form.cleaned_data["file1"]
202 task.md_pdbref=form.cleaned_data["md_pdbref"]
205 if task.md_start == "pdbstart" or task.md_pdbref:
206 seq,task.ssbond=from_pdb(task.myfile1)
208 seq=seq_add_x(form.cleaned_data["md_seq"])
210 for i in range(0,len(seq),40):
211 task.md_seq=task.md_seq+seq[i:i+40]+" "
213 if task.md_start != "pdbstart":
217 basename = str(task.owner)
218 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
219 task.jobdirname = "_".join([basename, suffix])
224 data= {'name':task.name}
225 form = TaskForm_md(initial=data)
227 p_type='molecular dynamics'
228 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
230 def add_md_a(request,task_id):
231 task = get_object_or_404(Task, id=task_id)
232 if request.method == 'POST':
233 form = TaskForm_md_a(request.POST,request.FILES)
235 task.name=form.cleaned_data["name"]
238 task.myfile1=form.cleaned_data["file1"]
239 task.md_start=form.cleaned_data["md_start"]
240 task.md_pdbref=form.cleaned_data["md_pdbref"]
243 if task.md_start == "pdbstart" or task.md_pdbref:
244 seq,task.ssbond=from_pdb(task.myfile1)
246 seq=seq_add_x(form.cleaned_data["md_seq"])
247 for i in range(0,len(seq),40):
248 task.md_seq=task.md_seq+seq[i:i+40]+" "
250 if task.md_start != "pdbstart":
253 task.md_seed=form.cleaned_data["md_seed"]
255 task.md_temp=form.cleaned_data["md_temp"]
256 task.md_nstep=form.cleaned_data["md_nstep"]
257 task.md_ntwe=form.cleaned_data["md_ntwe"]
258 task.md_ntwx=form.cleaned_data["md_ntwx"]
259 task.md_dt=form.cleaned_data["md_dt"]
260 task.md_lang=form.cleaned_data["md_lang"]
261 task.md_tau=form.cleaned_data["md_tau"]
262 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
263 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
264 task.unres_ff=form.cleaned_data["unres_ff"]
267 basename = str(task.owner)
268 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
269 task.jobdirname = "_".join([basename, suffix])
274 data= {'name':task.name}
275 form = TaskForm_md_a(initial=data)
277 p_type='molecular dynamics - advanced options'
278 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
281 def add_remd(request,task_id):
282 task = get_object_or_404(Task, id=task_id)
283 if request.method == 'POST':
284 form = TaskForm_remd(request.POST,request.FILES)
286 task.name=form.cleaned_data["name"]
288 task.md_start=form.cleaned_data["md_start"]
289 task.myfile1=form.cleaned_data["file1"]
290 task.md_pdbref=form.cleaned_data["md_pdbref"]
291 task.md_ntwx=task.remd_nstex
294 if task.md_start == "pdbstart" or task.md_pdbref:
295 seq,task.ssbond=from_pdb(task.myfile1)
297 seq=seq_add_x(form.cleaned_data["md_seq"])
298 for i in range(0,len(seq),40):
299 task.md_seq=task.md_seq+seq[i:i+40]+" "
301 if task.md_start != "pdbstart":
304 task.md_seed=form.cleaned_data["md_seed"]
306 task.md_nstep=form.cleaned_data["md_nstep"]
311 basename = str(task.owner)
312 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
313 task.jobdirname = "_".join([basename, suffix])
318 data= {'name':task.name}
319 form = TaskForm_remd(initial=data)
321 p_type='replica exchange molecular dynamics'
322 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
324 def add_remd_a(request,task_id):
325 task = get_object_or_404(Task, id=task_id)
326 if request.method == 'POST':
327 form = TaskForm_remd_a(request.POST,request.FILES)
329 task.name=form.cleaned_data["name"]
332 task.myfile1=form.cleaned_data["file1"]
333 task.md_start=form.cleaned_data["md_start"]
334 task.md_pdbref=form.cleaned_data["md_pdbref"]
337 if task.md_start == "pdbstart" or task.md_pdbref:
338 seq,task.ssbond=from_pdb(task.myfile1)
340 seq=seq_add_x(form.cleaned_data["md_seq"])
341 for i in range(0,len(seq),40):
342 task.md_seq=task.md_seq+seq[i:i+40]+" "
344 if task.md_start != "pdbstart":
347 task.md_seed=form.cleaned_data["md_seed"]
348 task.md_nstep=form.cleaned_data["md_nstep"]
349 task.md_dt=form.cleaned_data["md_dt"]
350 task.md_lang=form.cleaned_data["md_lang"]
351 task.md_tau=form.cleaned_data["md_tau"]
352 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
353 task.remd_nrep=form.cleaned_data["remd_nrep"]
354 task.remd_nstex=form.cleaned_data["remd_nstex"]
355 task.md_ntwx=form.cleaned_data["md_ntwx"]
356 task.md_ntwe=form.cleaned_data["md_ntwe"]
357 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
358 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
360 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
361 task.unres_ff=form.cleaned_data["unres_ff"]
363 basename = str(task.owner)
364 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
365 task.jobdirname = "_".join([basename, suffix])
368 return redirect('addmlist',task_id=task.id)
370 data= {'name':task.name}
371 form = TaskForm_remd_a(initial=data)
373 p_type='replica exchange molecular dynamics - advanced options'
374 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
377 def addmlist(request,task_id):
378 task = get_object_or_404(Task, id=task_id)
379 if request.method == 'POST':
380 form = TaskForm_list(task.remd_nrep,request.POST)
382 task.remd_multi_t=form.cleaned_data["temperatures"]
383 task.remd_multi_m=form.cleaned_data["multiplexing"]
389 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
390 '["1", "1", "1", "1", "1", "1", "1", "1"]',
392 '["270", "280", "290", "300", "310", "320", "330", "345"]'
394 form = TaskForm_list(task.remd_nrep,initial=data)
395 p_type='replica exchange molecular dynamics - advanced options'
396 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
399 def details(request,task_id):
400 task = get_object_or_404(Task, id=task_id)
401 return render(request, "details.html",{'task':task})
404 def delete(request, task_id):
405 Task.objects.get(id=task_id).delete()
409 def refresh_done(request):
411 tasks = Task.objects.filter(owner=user).order_by('-created_date')
413 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
416 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
418 if task.type=='min' or task.type=='md':
422 task.etot=line.split()[1]
424 if 'RMS deviation' in line:
432 if 'Total wall' in line:
435 elif task.type=='remd':
437 text="Acceptance for replica exchanges\n"
443 if j==task.remd_nrep:
445 text="Acceptance for replica exchanges\n"+line
447 if 'Total wall' in line:
450 task.results_text=text
453 if task.md_pdbref and task.type=='remd':
457 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
460 task.remd_model1=' '.join(line.split()[-6:])
462 task.remd_model2=' '.join(line.split()[-6:])
464 task.remd_model3=' '.join(line.split()[-6:])
466 task.remd_model4=' '.join(line.split()[-6:])
468 task.remd_model5=' '.join(line.split()[-6:])
469 except EnvironmentError:
470 print 'file_wham_T*pdb open error'
472 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
475 if 'RMSD of the common residues=' in line:
476 text=' RMSD='+line.split()[5]
477 if 'TM-score =' in line:
478 text=text+' TMscore='+line.split()[2]
479 if 'GDT-TS-score=' in line:
480 text=text+' GDT_TS='+line.split()[1]
483 task.remd_model1=task.remd_model1+text
485 task.remd_model2=task.remd_model2+text
487 task.remd_model3=task.remd_model3+text
489 task.remd_model4=task.remd_model4+text
491 task.remd_model5=task.remd_model5+text
495 if task.type=='remd':
496 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
499 if 'sumprob' in line:
506 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
508 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
510 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
512 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
514 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
519 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
520 if (task.type=='min'):
523 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
528 last = line.split()[0]
531 task.running=int(1+int(last)*100.0/task.md_nstep)
536 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
539 for line in proc.stdout:
540 if 'piasek4' in line:
541 if line.split()[1]=='test_server':
543 if line.split()[-2]=='Q':
545 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
547 return render(request, "index.html", {
549 'variable' : variable
552 # return redirect('/')