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
11 # 20 canonical amino acids
12 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
13 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
14 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
15 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
16 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
17 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
18 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
22 three_to_one = dict(res_codes)
24 def seq_add_x(sequence):
25 if sequence[0] != 'G':
27 if sequence[-1] != 'G':
29 set ='CDSQKIPTFNGHLRWAVEYMX'
30 sequence = ''.join([c for c in sequence if c in set])
47 if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
49 chain_=tmp.split(', ')
50 chain_[-1]=chain_[-1][0]
53 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
54 aa = three_to_one.get(line[17:20])
56 if newchain or i!=ires[-1]:
60 chain_start[chain[ichain]]=i
62 if line[0:3] == 'TER':
64 chain_end[chain[ichain]]=i
67 if line[0:6] == 'SSBOND':
69 b.append(int(line[17:21]))
70 b.append(int(line[31:35]))
73 c.append((line[15:16]))
74 c.append((line[29:30]))
76 if line[0:3] == 'END':
78 while sequence[-1] == 'XX':
80 if sequence[0] != 'G':
81 sequence.insert(0,'X')
82 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
83 if sequence[-1] != 'G':
87 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
90 unres_shift[c]=i+chain_start[c]
91 i=i-(chain_end[c]-chain_start[c])-3
92 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
100 tasks = Task.objects.filter(owner=user)
102 return render(request, "index.html", {
108 if request.method == 'POST':
109 form = TaskForm(request.POST)
111 name = form.cleaned_data["name"]
113 task = Task(name=name,owner=user,ready=False)
115 return redirect('add_min',task_id=task.id)
120 def add_min(request,task_id):
121 task = get_object_or_404(Task, id=task_id)
122 if request.method == 'POST':
123 form = TaskForm_min(request.POST,request.FILES)
125 task.name=form.cleaned_data["name"]
127 task.myfile1=form.cleaned_data["file1"]
129 seq,task.ssbond=from_pdb(task.myfile1)
131 for i in range(0,len(seq),40):
132 task.md_seq=task.md_seq+seq[i:i+40]+" "
135 basename = str(task.owner)
136 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
137 task.jobdirname = "_".join([basename, suffix])
142 data= {'name':task.name}
143 form = TaskForm_min(initial=data)
144 p_type='minimization'
146 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
148 def add_min_a(request,task_id):
149 task = get_object_or_404(Task, id=task_id)
150 if request.method == 'POST':
151 form = TaskForm_min_a(request.POST,request.FILES)
153 task.name=form.cleaned_data["name"]
155 task.min_choice=form.cleaned_data["min_choice"]
156 task.min_overlap=form.cleaned_data["min_overlap"]
157 task.min_searchsc=form.cleaned_data["min_searchsc"]
158 task.min_maxmin=form.cleaned_data["min_maxmin"]
159 task.min_maxfun=form.cleaned_data["min_maxfun"]
160 task.min_pdbout=form.cleaned_data["min_pdbout"]
161 task.myfile1=form.cleaned_data["file1"]
162 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
163 task.unres_ff=form.cleaned_data["unres_ff"]
165 seq,task.ssbond=from_pdb(task.myfile1)
167 for i in range(0,len(seq),40):
168 task.md_seq=task.md_seq+seq[i:i+40]+" "
172 basename = str(task.owner)
173 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
174 task.jobdirname = "_".join([basename, suffix])
179 data= {'name':task.name}
180 form = TaskForm_min_a(initial=data)
182 p_type='minimization - advanced options'
183 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
186 def add_md(request,task_id):
187 task = get_object_or_404(Task, id=task_id)
188 if request.method == 'POST':
189 form = TaskForm_md(request.POST,request.FILES)
191 task.name=form.cleaned_data["name"]
193 task.md_seed=form.cleaned_data["md_seed"]
194 task.md_start=form.cleaned_data["md_start"]
195 task.md_temp=form.cleaned_data["md_temp"]
196 task.md_nstep=form.cleaned_data["md_nstep"]
198 task.myfile1=form.cleaned_data["file1"]
199 task.md_pdbref=form.cleaned_data["md_pdbref"]
202 if task.md_start == "pdbstart" or task.md_pdbref:
203 seq,task.ssbond=from_pdb(task.myfile1)
205 seq=seq_add_x(form.cleaned_data["md_seq"])
207 for i in range(0,len(seq),40):
208 task.md_seq=task.md_seq+seq[i:i+40]+" "
210 if task.md_start != "pdbstart":
214 basename = str(task.owner)
215 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
216 task.jobdirname = "_".join([basename, suffix])
221 data= {'name':task.name}
222 form = TaskForm_md(initial=data)
224 p_type='molecular dynamics'
225 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
227 def add_md_a(request,task_id):
228 task = get_object_or_404(Task, id=task_id)
229 if request.method == 'POST':
230 form = TaskForm_md_a(request.POST,request.FILES)
232 task.name=form.cleaned_data["name"]
235 task.myfile1=form.cleaned_data["file1"]
236 task.md_start=form.cleaned_data["md_start"]
237 task.md_pdbref=form.cleaned_data["md_pdbref"]
240 if task.md_start == "pdbstart" or task.md_pdbref:
241 seq,task.ssbond=from_pdb(task.myfile1)
243 seq=seq_add_x(form.cleaned_data["md_seq"])
244 for i in range(0,len(seq),40):
245 task.md_seq=task.md_seq+seq[i:i+40]+" "
247 if task.md_start != "pdbstart":
250 task.md_seed=form.cleaned_data["md_seed"]
252 task.md_temp=form.cleaned_data["md_temp"]
253 task.md_nstep=form.cleaned_data["md_nstep"]
254 task.md_ntwe=form.cleaned_data["md_ntwe"]
255 task.md_ntwx=form.cleaned_data["md_ntwx"]
256 task.md_dt=form.cleaned_data["md_dt"]
257 task.md_lang=form.cleaned_data["md_lang"]
258 task.md_tau=form.cleaned_data["md_tau"]
259 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
260 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
261 task.unres_ff=form.cleaned_data["unres_ff"]
264 basename = str(task.owner)
265 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
266 task.jobdirname = "_".join([basename, suffix])
271 data= {'name':task.name}
272 form = TaskForm_md_a(initial=data)
274 p_type='molecular dynamics - advanced options'
275 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
278 def add_remd(request,task_id):
279 task = get_object_or_404(Task, id=task_id)
280 if request.method == 'POST':
281 form = TaskForm_remd(request.POST,request.FILES)
283 task.name=form.cleaned_data["name"]
285 task.md_start=form.cleaned_data["md_start"]
286 task.myfile1=form.cleaned_data["file1"]
287 task.md_pdbref=form.cleaned_data["md_pdbref"]
288 task.md_ntwx=task.remd_nstex
291 if task.md_start == "pdbstart" or task.md_pdbref:
292 seq,task.ssbond=from_pdb(task.myfile1)
294 seq=seq_add_x(form.cleaned_data["md_seq"])
295 for i in range(0,len(seq),40):
296 task.md_seq=task.md_seq+seq[i:i+40]+" "
298 if task.md_start != "pdbstart":
301 task.md_seed=form.cleaned_data["md_seed"]
303 task.md_nstep=form.cleaned_data["md_nstep"]
308 basename = str(task.owner)
309 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
310 task.jobdirname = "_".join([basename, suffix])
315 data= {'name':task.name}
316 form = TaskForm_remd(initial=data)
318 p_type='replica exchange molecular dynamics'
319 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
321 def add_remd_a(request,task_id):
322 task = get_object_or_404(Task, id=task_id)
323 if request.method == 'POST':
324 form = TaskForm_remd_a(request.POST,request.FILES)
326 task.name=form.cleaned_data["name"]
329 task.myfile1=form.cleaned_data["file1"]
330 task.md_start=form.cleaned_data["md_start"]
331 task.md_pdbref=form.cleaned_data["md_pdbref"]
334 if task.md_start == "pdbstart" or task.md_pdbref:
335 seq,task.ssbond=from_pdb(task.myfile1)
337 seq=seq_add_x(form.cleaned_data["md_seq"])
338 for i in range(0,len(seq),40):
339 task.md_seq=task.md_seq+seq[i:i+40]+" "
341 if task.md_start != "pdbstart":
344 task.md_seed=form.cleaned_data["md_seed"]
345 task.md_nstep=form.cleaned_data["md_nstep"]
346 task.md_dt=form.cleaned_data["md_dt"]
347 task.md_lang=form.cleaned_data["md_lang"]
348 task.md_tau=form.cleaned_data["md_tau"]
349 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
350 task.remd_nrep=form.cleaned_data["remd_nrep"]
351 task.remd_nstex=form.cleaned_data["remd_nstex"]
352 task.md_ntwx=form.cleaned_data["md_ntwx"]
353 task.md_ntwe=form.cleaned_data["md_ntwe"]
354 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
355 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
357 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
358 task.unres_ff=form.cleaned_data["unres_ff"]
360 basename = str(task.owner)
361 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
362 task.jobdirname = "_".join([basename, suffix])
365 return redirect('addmlist',task_id=task.id)
367 data= {'name':task.name}
368 form = TaskForm_remd_a(initial=data)
370 p_type='replica exchange molecular dynamics - advanced options'
371 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
374 def addmlist(request,task_id):
375 task = get_object_or_404(Task, id=task_id)
376 if request.method == 'POST':
377 form = TaskForm_list(task.remd_nrep,request.POST)
379 task.remd_multi_t=form.cleaned_data["temperatures"]
380 task.remd_multi_m=form.cleaned_data["multiplexing"]
386 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
387 '["1", "1", "1", "1", "1", "1", "1", "1"]',
389 '["270", "280", "290", "300", "310", "320", "330", "345"]'
391 form = TaskForm_list(task.remd_nrep,initial=data)
392 p_type='replica exchange molecular dynamics - advanced options'
393 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
396 def details(request,task_id):
397 task = get_object_or_404(Task, id=task_id)
398 return render(request, "details.html",{'task':task})
401 def delete(request, task_id):
402 Task.objects.get(id=task_id).delete()
406 def refresh_done(request):
408 tasks = Task.objects.filter(owner=user)
410 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
413 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
415 if task.type=='min' or task.type=='md':
419 task.etot=line.split()[1]
421 if 'RMS deviation' in line:
429 if 'Total wall' in line:
432 elif task.type=='remd':
434 text="Acceptance for replica exchanges\n"
440 if j==task.remd_nrep:
442 text="Acceptance for replica exchanges\n"+line
444 if 'Total wall' in line:
447 task.results_text=text
450 if task.md_pdbref and task.type=='remd':
453 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
456 task.remd_model1=' '.join(line.split()[-6:])
458 task.remd_model2=' '.join(line.split()[-6:])
460 task.remd_model3=' '.join(line.split()[-6:])
462 task.remd_model4=' '.join(line.split()[-6:])
464 task.remd_model5=' '.join(line.split()[-6:])
467 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
470 if 'RMSD of the common residues=' in line:
471 text=' RMSD='+line.split()[5]
472 if 'TM-score =' in line:
473 text=text+' TMscore='+line.split()[2]
474 if 'GDT-TS-score=' in line:
475 text=text+' GDT_TS='+line.split()[1]
478 task.remd_model1=task.remd_model1+text
480 task.remd_model2=task.remd_model2+text
482 task.remd_model3=task.remd_model3+text
484 task.remd_model4=task.remd_model4+text
486 task.remd_model5=task.remd_model5+text
490 if task.type=='remd':
491 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
494 if 'sumprob' in line:
501 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
503 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
505 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
507 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
509 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
514 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
515 if (task.type=='min'):
518 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
523 last = line.split()[0]
526 task.running=int(1+int(last)*100.0/task.md_nstep)
531 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
534 for line in proc.stdout:
535 if 'piasek4' in line:
536 if line.split()[1]=='test_server':
538 if line.split()[-2]=='Q':
540 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
542 return render(request, "index.html", {
544 'variable' : variable
547 # return redirect('/')