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.remd_traj1file=form.cleaned_data["remd_traj1file"]
319 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
321 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
322 task.unres_ff=form.cleaned_data["unres_ff"]
324 basename = str(task.owner)
325 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
326 task.jobdirname = "_".join([basename, suffix])
329 return redirect('addmlist',task_id=task.id)
331 data= {'name':task.name}
332 form = TaskForm_remd_a(initial=data)
334 p_type='replica exchange molecular dynamics - advanced options'
335 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
338 def addmlist(request,task_id):
339 task = get_object_or_404(Task, id=task_id)
340 if request.method == 'POST':
341 form = TaskForm_list(task.remd_nrep,request.POST)
343 task.remd_multi_t=form.cleaned_data["temperatures"]
344 task.remd_multi_m=form.cleaned_data["multiplexing"]
350 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
351 '["1", "1", "1", "1", "1", "1", "1", "1"]',
353 '["270", "280", "290", "300", "310", "320", "330", "345"]'
355 form = TaskForm_list(task.remd_nrep,initial=data)
356 p_type='replica exchange molecular dynamics - advanced options'
357 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
360 def details(request,task_id):
361 task = get_object_or_404(Task, id=task_id)
362 return render(request, "details.html",{'task':task})
365 def delete(request, task_id):
366 Task.objects.get(id=task_id).delete()
370 def refresh_done(request):
372 tasks = Task.objects.filter(owner=user)
374 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
377 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
379 if task.type=='min' or task.type=='md':
383 task.etot=line.split()[1]
385 if 'RMS deviation' in line:
393 if 'Total wall' in line:
396 elif task.type=='remd':
398 text="Acceptance for replica exchanges\n"
404 if j==task.remd_nrep:
406 text="Acceptance for replica exchanges\n"+line
408 if 'Total wall' in line:
411 task.results_text=text
414 if task.md_pdbref and task.type=='remd':
417 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
420 task.remd_model1=' '.join(line.split()[-6:])
422 task.remd_model2=' '.join(line.split()[-6:])
424 task.remd_model3=' '.join(line.split()[-6:])
426 task.remd_model4=' '.join(line.split()[-6:])
428 task.remd_model5=' '.join(line.split()[-6:])
431 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
434 if 'RMSD of the common residues=' in line:
435 text=' RMSD='+line.split()[5]
436 if 'TM-score =' in line:
437 text=text+' TMscore='+line.split()[2]
438 if 'GDT-TS-score=' in line:
439 text=text+' GDT_TS='+line.split()[1]
442 task.remd_model1=task.remd_model1+text
444 task.remd_model2=task.remd_model2+text
446 task.remd_model3=task.remd_model3+text
448 task.remd_model4=task.remd_model4+text
450 task.remd_model5=task.remd_model5+text
454 if task.type=='remd':
455 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
458 if 'sumprob' in line:
465 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
467 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
469 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
471 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
473 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
478 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
479 if (task.type=='min'):
482 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
487 last = line.split()[0]
490 task.running=int(1+int(last)*100.0/task.md_nstep)
495 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
498 for line in proc.stdout:
499 if 'piasek4' in line:
500 if line.split()[1]=='test_server':
502 if line.split()[-2]=='Q':
504 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
506 return render(request, "index.html", {
508 'variable' : variable
511 # return redirect('/')