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])
38 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
39 aa = three_to_one.get(line[17:20])
41 if line[0:3] == 'TER':
43 if line[0:6] == 'SSBOND':
45 b.append(int(line[17:21]))
46 b.append(int(line[31:35]))
49 if line[0:3] == 'END':
51 while sequence[-1] == 'XX':
53 if sequence[0] != 'G':
54 sequence.insert(0,'X')
55 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
56 if sequence[-1] != 'G':
65 tasks = Task.objects.filter(owner=user)
67 return render(request, "index.html", {
73 if request.method == 'POST':
74 form = TaskForm(request.POST)
76 name = form.cleaned_data["name"]
78 task = Task(name=name,owner=user,ready=False)
80 return redirect('add_min',task_id=task.id)
85 def add_min(request,task_id):
86 task = get_object_or_404(Task, id=task_id)
87 if request.method == 'POST':
88 form = TaskForm_min(request.POST,request.FILES)
90 task.name=form.cleaned_data["name"]
92 task.myfile1=form.cleaned_data["file1"]
94 seq,task.ssbond=from_pdb(task.myfile1)
96 for i in range(0,len(seq),40):
97 task.md_seq=task.md_seq+seq[i:i+40]+" "
100 basename = str(task.owner)
101 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
102 task.jobdirname = "_".join([basename, suffix])
107 data= {'name':task.name}
108 form = TaskForm_min(initial=data)
109 p_type='minimization'
111 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
113 def add_min_a(request,task_id):
114 task = get_object_or_404(Task, id=task_id)
115 if request.method == 'POST':
116 form = TaskForm_min_a(request.POST,request.FILES)
118 task.name=form.cleaned_data["name"]
120 task.min_choice=form.cleaned_data["min_choice"]
121 task.min_overlap=form.cleaned_data["min_overlap"]
122 task.min_searchsc=form.cleaned_data["min_searchsc"]
123 task.min_maxmin=form.cleaned_data["min_maxmin"]
124 task.min_maxfun=form.cleaned_data["min_maxfun"]
125 task.min_pdbout=form.cleaned_data["min_pdbout"]
126 task.myfile1=form.cleaned_data["file1"]
127 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
128 task.unres_ff=form.cleaned_data["unres_ff"]
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]+" "
137 basename = str(task.owner)
138 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
139 task.jobdirname = "_".join([basename, suffix])
144 data= {'name':task.name}
145 form = TaskForm_min_a(initial=data)
147 p_type='minimization - advanced options'
148 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
151 def add_md(request,task_id):
152 task = get_object_or_404(Task, id=task_id)
153 if request.method == 'POST':
154 form = TaskForm_md(request.POST,request.FILES)
156 task.name=form.cleaned_data["name"]
158 task.md_seed=form.cleaned_data["md_seed"]
159 task.md_start=form.cleaned_data["md_start"]
160 task.md_temp=form.cleaned_data["md_temp"]
161 task.md_nstep=form.cleaned_data["md_nstep"]
163 task.myfile1=form.cleaned_data["file1"]
164 task.md_pdbref=form.cleaned_data["md_pdbref"]
167 if task.md_start == "pdbstart" or task.md_pdbref:
168 seq,task.ssbond=from_pdb(task.myfile1)
170 seq=seq_add_x(form.cleaned_data["md_seq"])
172 for i in range(0,len(seq),40):
173 task.md_seq=task.md_seq+seq[i:i+40]+" "
175 if task.md_start != "pdbstart":
179 basename = str(task.owner)
180 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
181 task.jobdirname = "_".join([basename, suffix])
186 data= {'name':task.name}
187 form = TaskForm_md(initial=data)
189 p_type='molecular dynamics'
190 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
192 def add_md_a(request,task_id):
193 task = get_object_or_404(Task, id=task_id)
194 if request.method == 'POST':
195 form = TaskForm_md_a(request.POST,request.FILES)
197 task.name=form.cleaned_data["name"]
200 task.myfile1=form.cleaned_data["file1"]
201 task.md_start=form.cleaned_data["md_start"]
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"])
209 for i in range(0,len(seq),40):
210 task.md_seq=task.md_seq+seq[i:i+40]+" "
212 if task.md_start != "pdbstart":
215 task.md_seed=form.cleaned_data["md_seed"]
217 task.md_temp=form.cleaned_data["md_temp"]
218 task.md_nstep=form.cleaned_data["md_nstep"]
219 task.md_ntwe=form.cleaned_data["md_ntwe"]
220 task.md_ntwx=form.cleaned_data["md_ntwx"]
221 task.md_dt=form.cleaned_data["md_dt"]
222 task.md_lang=form.cleaned_data["md_lang"]
223 task.md_tau=form.cleaned_data["md_tau"]
224 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
225 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
226 task.unres_ff=form.cleaned_data["unres_ff"]
229 basename = str(task.owner)
230 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
231 task.jobdirname = "_".join([basename, suffix])
236 data= {'name':task.name}
237 form = TaskForm_md_a(initial=data)
239 p_type='molecular dynamics - advanced options'
240 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
243 def add_remd(request,task_id):
244 task = get_object_or_404(Task, id=task_id)
245 if request.method == 'POST':
246 form = TaskForm_remd(request.POST,request.FILES)
248 task.name=form.cleaned_data["name"]
250 task.md_start=form.cleaned_data["md_start"]
251 task.myfile1=form.cleaned_data["file1"]
252 task.md_pdbref=form.cleaned_data["md_pdbref"]
255 if task.md_start == "pdbstart" or task.md_pdbref:
256 seq,task.ssbond=from_pdb(task.myfile1)
258 seq=seq_add_x(form.cleaned_data["md_seq"])
259 for i in range(0,len(seq),40):
260 task.md_seq=task.md_seq+seq[i:i+40]+" "
262 if task.md_start != "pdbstart":
265 task.md_seed=form.cleaned_data["md_seed"]
267 task.md_nstep=form.cleaned_data["md_nstep"]
272 basename = str(task.owner)
273 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
274 task.jobdirname = "_".join([basename, suffix])
279 data= {'name':task.name}
280 form = TaskForm_remd(initial=data)
282 p_type='replica exchange molecular dynamics'
283 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
285 def add_remd_a(request,task_id):
286 task = get_object_or_404(Task, id=task_id)
287 if request.method == 'POST':
288 form = TaskForm_remd_a(request.POST,request.FILES)
290 task.name=form.cleaned_data["name"]
293 task.myfile1=form.cleaned_data["file1"]
294 task.md_start=form.cleaned_data["md_start"]
295 task.md_pdbref=form.cleaned_data["md_pdbref"]
298 if task.md_start == "pdbstart" or task.md_pdbref:
299 seq,task.ssbond=from_pdb(task.myfile1)
301 seq=seq_add_x(form.cleaned_data["md_seq"])
302 for i in range(0,len(seq),40):
303 task.md_seq=task.md_seq+seq[i:i+40]+" "
305 if task.md_start != "pdbstart":
308 task.md_seed=form.cleaned_data["md_seed"]
309 task.md_nstep=form.cleaned_data["md_nstep"]
310 task.md_dt=form.cleaned_data["md_dt"]
311 task.md_lang=form.cleaned_data["md_lang"]
312 task.md_tau=form.cleaned_data["md_tau"]
313 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
314 task.remd_nrep=form.cleaned_data["remd_nrep"]
315 task.remd_nstex=form.cleaned_data["remd_nstex"]
316 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
317 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
319 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
320 task.unres_ff=form.cleaned_data["unres_ff"]
322 basename = str(task.owner)
323 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
324 task.jobdirname = "_".join([basename, suffix])
327 return redirect('addmlist',task_id=task.id)
329 data= {'name':task.name}
330 form = TaskForm_remd_a(initial=data)
332 p_type='replica exchange molecular dynamics - advanced options'
333 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
336 def addmlist(request,task_id):
337 task = get_object_or_404(Task, id=task_id)
338 if request.method == 'POST':
339 form = TaskForm_list(task.remd_nrep,request.POST)
341 task.remd_multi_t=form.cleaned_data["temperatures"]
342 task.remd_multi_m=form.cleaned_data["multiplexing"]
348 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
349 '["1", "1", "1", "1", "1", "1", "1", "1"]',
351 '["270", "280", "290", "300", "310", "320", "330", "345"]'
353 form = TaskForm_list(task.remd_nrep,initial=data)
354 p_type='replica exchange molecular dynamics - advanced options'
355 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
358 def details(request,task_id):
359 task = get_object_or_404(Task, id=task_id)
360 return render(request, "details.html",{'task':task})
363 def delete(request, task_id):
364 Task.objects.get(id=task_id).delete()
368 def refresh_done(request):
370 tasks = Task.objects.filter(owner=user)
372 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
375 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
377 if task.type=='min' or task.type=='md':
381 task.etot=line.split()[1]
383 if 'RMS deviation' in line:
391 if 'Total wall' in line:
394 elif task.type=='remd':
396 text="Acceptance for replica exchanges\n"
402 if j==task.remd_nrep:
404 text="Acceptance for replica exchanges\n"+line
406 if 'Total wall' in line:
409 task.results_text=text
412 if task.md_pdbref and task.type=='remd':
415 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
418 task.remd_model1=' '.join(line.split()[-6:])
420 task.remd_model2=' '.join(line.split()[-6:])
422 task.remd_model3=' '.join(line.split()[-6:])
424 task.remd_model4=' '.join(line.split()[-6:])
426 task.remd_model5=' '.join(line.split()[-6:])
429 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
432 if 'RMSD of the common residues=' in line:
433 text=' RMSD='+line.split()[5]
434 if 'TM-score =' in line:
435 text=text+' TMscore='+line.split()[2]
436 if 'GDT-TS-score=' in line:
437 text=text+' GDT_TS='+line.split()[1]
440 task.remd_model1=task.remd_model1+text
442 task.remd_model2=task.remd_model2+text
444 task.remd_model3=task.remd_model3+text
446 task.remd_model4=task.remd_model4+text
448 task.remd_model5=task.remd_model5+text
452 if task.type=='remd':
453 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
456 if 'sumprob' in line:
463 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
465 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
467 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
469 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
471 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
476 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
477 if (task.type=='min'):
480 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
485 last = line.split()[0]
488 task.running=int(1+int(last)*100.0/task.md_nstep)
493 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
496 for line in proc.stdout:
497 if 'piasek4' in line:
498 if line.split()[1]=='test_server':
500 if line.split()[-2]=='Q':
502 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
504 return render(request, "index.html", {
506 'variable' : variable
509 # return redirect('/')