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 if task.unres_ff == 'E0LL2Y':
390 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
391 '["1", "1", "1", "1", "1", "1", "1", "1"]',
393 '["270", "280", "290", "300", "310", "320", "330", "345"]'
396 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
397 '["1", "1", "1", "1", "1", "1", "1", "1"]',
399 '["250", "260", "270", "280", "290", "300", "315", "330"]'
402 form = TaskForm_list(task.remd_nrep,initial=data)
403 p_type='replica exchange molecular dynamics - advanced options'
404 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
407 def details(request,task_id):
408 task = get_object_or_404(Task, id=task_id)
409 return render(request, "details.html",{'task':task})
412 def delete(request, task_id):
413 Task.objects.get(id=task_id).delete()
417 def refresh_done(request):
419 tasks = Task.objects.filter(owner=user).order_by('-created_date')
421 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
424 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
426 if task.type=='min' or task.type=='md':
430 task.etot=line.split()[1]
432 if 'RMS deviation' in line:
440 if 'Total wall' in line:
443 elif task.type=='remd':
445 text="Acceptance for replica exchanges\n"
451 if j==task.remd_nrep:
453 text="Acceptance for replica exchanges\n"+line
455 if 'Total wall' in line:
458 task.results_text=text
461 if task.md_pdbref and task.type=='remd':
465 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
468 task.remd_model1=' '.join(line.split()[-6:])
470 task.remd_model2=' '.join(line.split()[-6:])
472 task.remd_model3=' '.join(line.split()[-6:])
474 task.remd_model4=' '.join(line.split()[-6:])
476 task.remd_model5=' '.join(line.split()[-6:])
477 except EnvironmentError:
478 print 'file_wham_T*pdb open error'
480 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
483 if 'RMSD of the common residues=' in line:
484 text=' RMSD='+line.split()[5]
485 if 'TM-score =' in line:
486 text=text+' TMscore='+line.split()[2]
487 if 'GDT-TS-score=' in line:
488 text=text+' GDT_TS='+line.split()[1]
491 task.remd_model1=task.remd_model1+text
493 task.remd_model2=task.remd_model2+text
495 task.remd_model3=task.remd_model3+text
497 task.remd_model4=task.remd_model4+text
499 task.remd_model5=task.remd_model5+text
503 if task.type=='remd':
504 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
507 if 'sumprob' in line:
514 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
516 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
518 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
520 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
522 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
527 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
528 if (task.type=='min'):
531 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
536 last = line.split()[0]
539 task.running=int(1+int(last)*100.0/task.md_nstep)
544 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
547 for line in proc.stdout:
548 if 'piasek4' in line:
549 if line.split()[1]=='test_server':
551 if line.split()[-2]=='Q':
553 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
555 return render(request, "index.html", {
557 'variable' : variable
560 # return redirect('/')