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]:
61 chain_start[chain[ichain]]=i
63 if line[0:3] == 'TER':
65 chain_end[chain[ichain]]=i
68 if line[0:6] == 'SSBOND':
70 b.append(int(line[17:21]))
71 b.append(int(line[31:35]))
74 c.append((line[15:16]))
75 c.append((line[29:30]))
77 if line[0:3] == 'END':
79 while sequence[-1] == 'XX':
81 if sequence[0] != 'G':
82 sequence.insert(0,'X')
83 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
84 if sequence[-1] != 'G':
88 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
91 unres_shift[c]=i+chain_start[c]
92 i=i-(chain_end[c]-chain_start[c])-3
93 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
95 return seq,json.dumps(ssbond)
101 tasks = Task.objects.filter(owner=user)
103 return render(request, "index.html", {
109 if request.method == 'POST':
110 form = TaskForm(request.POST)
112 name = form.cleaned_data["name"]
114 task = Task(name=name,owner=user,ready=False)
116 return redirect('add_min',task_id=task.id)
121 def add_min(request,task_id):
122 task = get_object_or_404(Task, id=task_id)
123 if request.method == 'POST':
124 form = TaskForm_min(request.POST,request.FILES)
126 task.name=form.cleaned_data["name"]
128 task.myfile1=form.cleaned_data["file1"]
130 seq,task.ssbond=from_pdb(task.myfile1)
132 for i in range(0,len(seq),40):
133 task.md_seq=task.md_seq+seq[i:i+40]+" "
136 basename = str(task.owner)
137 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
138 task.jobdirname = "_".join([basename, suffix])
143 data= {'name':task.name}
144 form = TaskForm_min(initial=data)
145 p_type='minimization'
147 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
149 def add_min_a(request,task_id):
150 task = get_object_or_404(Task, id=task_id)
151 if request.method == 'POST':
152 form = TaskForm_min_a(request.POST,request.FILES)
154 task.name=form.cleaned_data["name"]
156 task.min_choice=form.cleaned_data["min_choice"]
157 task.min_overlap=form.cleaned_data["min_overlap"]
158 task.min_searchsc=form.cleaned_data["min_searchsc"]
159 task.min_maxmin=form.cleaned_data["min_maxmin"]
160 task.min_maxfun=form.cleaned_data["min_maxfun"]
161 task.min_pdbout=form.cleaned_data["min_pdbout"]
162 task.myfile1=form.cleaned_data["file1"]
163 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
164 task.unres_ff=form.cleaned_data["unres_ff"]
166 seq,task.ssbond=from_pdb(task.myfile1)
168 for i in range(0,len(seq),40):
169 task.md_seq=task.md_seq+seq[i:i+40]+" "
173 basename = str(task.owner)
174 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
175 task.jobdirname = "_".join([basename, suffix])
180 data= {'name':task.name}
181 form = TaskForm_min_a(initial=data)
183 p_type='minimization - advanced options'
184 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
187 def add_md(request,task_id):
188 task = get_object_or_404(Task, id=task_id)
189 if request.method == 'POST':
190 form = TaskForm_md(request.POST,request.FILES)
192 task.name=form.cleaned_data["name"]
194 task.md_seed=form.cleaned_data["md_seed"]
195 task.md_start=form.cleaned_data["md_start"]
196 task.md_temp=form.cleaned_data["md_temp"]
197 task.md_nstep=form.cleaned_data["md_nstep"]
199 task.myfile1=form.cleaned_data["file1"]
200 task.md_pdbref=form.cleaned_data["md_pdbref"]
203 if task.md_start == "pdbstart" or task.md_pdbref:
204 seq,task.ssbond=from_pdb(task.myfile1)
206 seq=seq_add_x(form.cleaned_data["md_seq"])
208 for i in range(0,len(seq),40):
209 task.md_seq=task.md_seq+seq[i:i+40]+" "
211 if task.md_start != "pdbstart":
215 basename = str(task.owner)
216 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
217 task.jobdirname = "_".join([basename, suffix])
222 data= {'name':task.name}
223 form = TaskForm_md(initial=data)
225 p_type='molecular dynamics'
226 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
228 def add_md_a(request,task_id):
229 task = get_object_or_404(Task, id=task_id)
230 if request.method == 'POST':
231 form = TaskForm_md_a(request.POST,request.FILES)
233 task.name=form.cleaned_data["name"]
236 task.myfile1=form.cleaned_data["file1"]
237 task.md_start=form.cleaned_data["md_start"]
238 task.md_pdbref=form.cleaned_data["md_pdbref"]
241 if task.md_start == "pdbstart" or task.md_pdbref:
242 seq,task.ssbond=from_pdb(task.myfile1)
244 seq=seq_add_x(form.cleaned_data["md_seq"])
245 for i in range(0,len(seq),40):
246 task.md_seq=task.md_seq+seq[i:i+40]+" "
248 if task.md_start != "pdbstart":
251 task.md_seed=form.cleaned_data["md_seed"]
253 task.md_temp=form.cleaned_data["md_temp"]
254 task.md_nstep=form.cleaned_data["md_nstep"]
255 task.md_ntwe=form.cleaned_data["md_ntwe"]
256 task.md_ntwx=form.cleaned_data["md_ntwx"]
257 task.md_dt=form.cleaned_data["md_dt"]
258 task.md_lang=form.cleaned_data["md_lang"]
259 task.md_tau=form.cleaned_data["md_tau"]
260 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
261 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
262 task.unres_ff=form.cleaned_data["unres_ff"]
265 basename = str(task.owner)
266 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
267 task.jobdirname = "_".join([basename, suffix])
272 data= {'name':task.name}
273 form = TaskForm_md_a(initial=data)
275 p_type='molecular dynamics - advanced options'
276 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
279 def add_remd(request,task_id):
280 task = get_object_or_404(Task, id=task_id)
281 if request.method == 'POST':
282 form = TaskForm_remd(request.POST,request.FILES)
284 task.name=form.cleaned_data["name"]
286 task.md_start=form.cleaned_data["md_start"]
287 task.myfile1=form.cleaned_data["file1"]
288 task.md_pdbref=form.cleaned_data["md_pdbref"]
289 task.md_ntwx=task.remd_nstex
292 if task.md_start == "pdbstart" or task.md_pdbref:
293 seq,task.ssbond=from_pdb(task.myfile1)
295 seq=seq_add_x(form.cleaned_data["md_seq"])
296 for i in range(0,len(seq),40):
297 task.md_seq=task.md_seq+seq[i:i+40]+" "
299 if task.md_start != "pdbstart":
302 task.md_seed=form.cleaned_data["md_seed"]
304 task.md_nstep=form.cleaned_data["md_nstep"]
309 basename = str(task.owner)
310 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
311 task.jobdirname = "_".join([basename, suffix])
316 data= {'name':task.name}
317 form = TaskForm_remd(initial=data)
319 p_type='replica exchange molecular dynamics'
320 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
322 def add_remd_a(request,task_id):
323 task = get_object_or_404(Task, id=task_id)
324 if request.method == 'POST':
325 form = TaskForm_remd_a(request.POST,request.FILES)
327 task.name=form.cleaned_data["name"]
330 task.myfile1=form.cleaned_data["file1"]
331 task.md_start=form.cleaned_data["md_start"]
332 task.md_pdbref=form.cleaned_data["md_pdbref"]
335 if task.md_start == "pdbstart" or task.md_pdbref:
336 seq,task.ssbond=from_pdb(task.myfile1)
338 seq=seq_add_x(form.cleaned_data["md_seq"])
339 for i in range(0,len(seq),40):
340 task.md_seq=task.md_seq+seq[i:i+40]+" "
342 if task.md_start != "pdbstart":
345 task.md_seed=form.cleaned_data["md_seed"]
346 task.md_nstep=form.cleaned_data["md_nstep"]
347 task.md_dt=form.cleaned_data["md_dt"]
348 task.md_lang=form.cleaned_data["md_lang"]
349 task.md_tau=form.cleaned_data["md_tau"]
350 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
351 task.remd_nrep=form.cleaned_data["remd_nrep"]
352 task.remd_nstex=form.cleaned_data["remd_nstex"]
353 task.md_ntwx=form.cleaned_data["md_ntwx"]
354 task.md_ntwe=form.cleaned_data["md_ntwe"]
355 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
356 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
358 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
359 task.unres_ff=form.cleaned_data["unres_ff"]
361 basename = str(task.owner)
362 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
363 task.jobdirname = "_".join([basename, suffix])
366 return redirect('addmlist',task_id=task.id)
368 data= {'name':task.name}
369 form = TaskForm_remd_a(initial=data)
371 p_type='replica exchange molecular dynamics - advanced options'
372 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
375 def addmlist(request,task_id):
376 task = get_object_or_404(Task, id=task_id)
377 if request.method == 'POST':
378 form = TaskForm_list(task.remd_nrep,request.POST)
380 task.remd_multi_t=form.cleaned_data["temperatures"]
381 task.remd_multi_m=form.cleaned_data["multiplexing"]
387 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
388 '["1", "1", "1", "1", "1", "1", "1", "1"]',
390 '["270", "280", "290", "300", "310", "320", "330", "345"]'
392 form = TaskForm_list(task.remd_nrep,initial=data)
393 p_type='replica exchange molecular dynamics - advanced options'
394 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
397 def details(request,task_id):
398 task = get_object_or_404(Task, id=task_id)
399 return render(request, "details.html",{'task':task})
402 def delete(request, task_id):
403 Task.objects.get(id=task_id).delete()
407 def refresh_done(request):
409 tasks = Task.objects.filter(owner=user)
411 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
414 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
416 if task.type=='min' or task.type=='md':
420 task.etot=line.split()[1]
422 if 'RMS deviation' in line:
430 if 'Total wall' in line:
433 elif task.type=='remd':
435 text="Acceptance for replica exchanges\n"
441 if j==task.remd_nrep:
443 text="Acceptance for replica exchanges\n"+line
445 if 'Total wall' in line:
448 task.results_text=text
451 if task.md_pdbref and task.type=='remd':
454 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
457 task.remd_model1=' '.join(line.split()[-6:])
459 task.remd_model2=' '.join(line.split()[-6:])
461 task.remd_model3=' '.join(line.split()[-6:])
463 task.remd_model4=' '.join(line.split()[-6:])
465 task.remd_model5=' '.join(line.split()[-6:])
468 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
471 if 'RMSD of the common residues=' in line:
472 text=' RMSD='+line.split()[5]
473 if 'TM-score =' in line:
474 text=text+' TMscore='+line.split()[2]
475 if 'GDT-TS-score=' in line:
476 text=text+' GDT_TS='+line.split()[1]
479 task.remd_model1=task.remd_model1+text
481 task.remd_model2=task.remd_model2+text
483 task.remd_model3=task.remd_model3+text
485 task.remd_model4=task.remd_model4+text
487 task.remd_model5=task.remd_model5+text
491 if task.type=='remd':
492 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
495 if 'sumprob' in line:
502 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
504 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
506 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
508 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
510 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
515 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
516 if (task.type=='min'):
519 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
524 last = line.split()[0]
527 task.running=int(1+int(last)*100.0/task.md_nstep)
532 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
535 for line in proc.stdout:
536 if 'piasek4' in line:
537 if line.split()[1]=='test_server':
539 if line.split()[-2]=='Q':
541 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
543 return render(request, "index.html", {
545 'variable' : variable
548 # return redirect('/')