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"]
253 task.md_ntwx=task.remd_nstex
256 if task.md_start == "pdbstart" or task.md_pdbref:
257 seq,task.ssbond=from_pdb(task.myfile1)
259 seq=seq_add_x(form.cleaned_data["md_seq"])
260 for i in range(0,len(seq),40):
261 task.md_seq=task.md_seq+seq[i:i+40]+" "
263 if task.md_start != "pdbstart":
266 task.md_seed=form.cleaned_data["md_seed"]
268 task.md_nstep=form.cleaned_data["md_nstep"]
273 basename = str(task.owner)
274 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
275 task.jobdirname = "_".join([basename, suffix])
280 data= {'name':task.name}
281 form = TaskForm_remd(initial=data)
283 p_type='replica exchange molecular dynamics'
284 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
286 def add_remd_a(request,task_id):
287 task = get_object_or_404(Task, id=task_id)
288 if request.method == 'POST':
289 form = TaskForm_remd_a(request.POST,request.FILES)
291 task.name=form.cleaned_data["name"]
294 task.myfile1=form.cleaned_data["file1"]
295 task.md_start=form.cleaned_data["md_start"]
296 task.md_pdbref=form.cleaned_data["md_pdbref"]
299 if task.md_start == "pdbstart" or task.md_pdbref:
300 seq,task.ssbond=from_pdb(task.myfile1)
302 seq=seq_add_x(form.cleaned_data["md_seq"])
303 for i in range(0,len(seq),40):
304 task.md_seq=task.md_seq+seq[i:i+40]+" "
306 if task.md_start != "pdbstart":
309 task.md_seed=form.cleaned_data["md_seed"]
310 task.md_nstep=form.cleaned_data["md_nstep"]
311 task.md_dt=form.cleaned_data["md_dt"]
312 task.md_lang=form.cleaned_data["md_lang"]
313 task.md_tau=form.cleaned_data["md_tau"]
314 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
315 task.remd_nrep=form.cleaned_data["remd_nrep"]
316 task.remd_nstex=form.cleaned_data["remd_nstex"]
317 task.md_ntwx=form.cleaned_data["md_ntwx"]
318 task.md_ntwe=form.cleaned_data["md_ntwe"]
319 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
320 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
322 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
323 task.unres_ff=form.cleaned_data["unres_ff"]
325 basename = str(task.owner)
326 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
327 task.jobdirname = "_".join([basename, suffix])
330 return redirect('addmlist',task_id=task.id)
332 data= {'name':task.name}
333 form = TaskForm_remd_a(initial=data)
335 p_type='replica exchange molecular dynamics - advanced options'
336 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
339 def addmlist(request,task_id):
340 task = get_object_or_404(Task, id=task_id)
341 if request.method == 'POST':
342 form = TaskForm_list(task.remd_nrep,request.POST)
344 task.remd_multi_t=form.cleaned_data["temperatures"]
345 task.remd_multi_m=form.cleaned_data["multiplexing"]
351 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
352 '["1", "1", "1", "1", "1", "1", "1", "1"]',
354 '["270", "280", "290", "300", "310", "320", "330", "345"]'
356 form = TaskForm_list(task.remd_nrep,initial=data)
357 p_type='replica exchange molecular dynamics - advanced options'
358 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
361 def details(request,task_id):
362 task = get_object_or_404(Task, id=task_id)
363 return render(request, "details.html",{'task':task})
366 def delete(request, task_id):
367 Task.objects.get(id=task_id).delete()
371 def refresh_done(request):
373 tasks = Task.objects.filter(owner=user)
375 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
378 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
380 if task.type=='min' or task.type=='md':
384 task.etot=line.split()[1]
386 if 'RMS deviation' in line:
394 if 'Total wall' in line:
397 elif task.type=='remd':
399 text="Acceptance for replica exchanges\n"
405 if j==task.remd_nrep:
407 text="Acceptance for replica exchanges\n"+line
409 if 'Total wall' in line:
412 task.results_text=text
415 if task.md_pdbref and task.type=='remd':
418 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
421 task.remd_model1=' '.join(line.split()[-6:])
423 task.remd_model2=' '.join(line.split()[-6:])
425 task.remd_model3=' '.join(line.split()[-6:])
427 task.remd_model4=' '.join(line.split()[-6:])
429 task.remd_model5=' '.join(line.split()[-6:])
432 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
435 if 'RMSD of the common residues=' in line:
436 text=' RMSD='+line.split()[5]
437 if 'TM-score =' in line:
438 text=text+' TMscore='+line.split()[2]
439 if 'GDT-TS-score=' in line:
440 text=text+' GDT_TS='+line.split()[1]
443 task.remd_model1=task.remd_model1+text
445 task.remd_model2=task.remd_model2+text
447 task.remd_model3=task.remd_model3+text
449 task.remd_model4=task.remd_model4+text
451 task.remd_model5=task.remd_model5+text
455 if task.type=='remd':
456 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
459 if 'sumprob' in line:
466 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
468 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
470 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
472 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
474 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
479 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
480 if (task.type=='min'):
483 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
488 last = line.split()[0]
491 task.running=int(1+int(last)*100.0/task.md_nstep)
496 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
499 for line in proc.stdout:
500 if 'piasek4' in line:
501 if line.split()[1]=='test_server':
503 if line.split()[-2]=='Q':
505 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
507 return render(request, "index.html", {
509 'variable' : variable
512 # return redirect('/')