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])
39 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
40 aa = three_to_one.get(line[17:20])
44 if line[0:3] == 'TER':
46 if line[0:6] == 'SSBOND':
48 b.append(int(line[17:21]))
49 b.append(int(line[31:35]))
52 if line[0:3] == 'END':
54 while sequence[-1] == 'XX':
56 if sequence[0] != 'G':
57 sequence.insert(0,'X')
58 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
59 if sequence[-1] != 'G':
63 ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
71 tasks = Task.objects.filter(owner=user)
73 return render(request, "index.html", {
79 if request.method == 'POST':
80 form = TaskForm(request.POST)
82 name = form.cleaned_data["name"]
84 task = Task(name=name,owner=user,ready=False)
86 return redirect('add_min',task_id=task.id)
91 def add_min(request,task_id):
92 task = get_object_or_404(Task, id=task_id)
93 if request.method == 'POST':
94 form = TaskForm_min(request.POST,request.FILES)
96 task.name=form.cleaned_data["name"]
98 task.myfile1=form.cleaned_data["file1"]
100 seq,task.ssbond=from_pdb(task.myfile1)
102 for i in range(0,len(seq),40):
103 task.md_seq=task.md_seq+seq[i:i+40]+" "
106 basename = str(task.owner)
107 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
108 task.jobdirname = "_".join([basename, suffix])
113 data= {'name':task.name}
114 form = TaskForm_min(initial=data)
115 p_type='minimization'
117 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
119 def add_min_a(request,task_id):
120 task = get_object_or_404(Task, id=task_id)
121 if request.method == 'POST':
122 form = TaskForm_min_a(request.POST,request.FILES)
124 task.name=form.cleaned_data["name"]
126 task.min_choice=form.cleaned_data["min_choice"]
127 task.min_overlap=form.cleaned_data["min_overlap"]
128 task.min_searchsc=form.cleaned_data["min_searchsc"]
129 task.min_maxmin=form.cleaned_data["min_maxmin"]
130 task.min_maxfun=form.cleaned_data["min_maxfun"]
131 task.min_pdbout=form.cleaned_data["min_pdbout"]
132 task.myfile1=form.cleaned_data["file1"]
133 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
134 task.unres_ff=form.cleaned_data["unres_ff"]
136 seq,task.ssbond=from_pdb(task.myfile1)
138 for i in range(0,len(seq),40):
139 task.md_seq=task.md_seq+seq[i:i+40]+" "
143 basename = str(task.owner)
144 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
145 task.jobdirname = "_".join([basename, suffix])
150 data= {'name':task.name}
151 form = TaskForm_min_a(initial=data)
153 p_type='minimization - advanced options'
154 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
157 def add_md(request,task_id):
158 task = get_object_or_404(Task, id=task_id)
159 if request.method == 'POST':
160 form = TaskForm_md(request.POST,request.FILES)
162 task.name=form.cleaned_data["name"]
164 task.md_seed=form.cleaned_data["md_seed"]
165 task.md_start=form.cleaned_data["md_start"]
166 task.md_temp=form.cleaned_data["md_temp"]
167 task.md_nstep=form.cleaned_data["md_nstep"]
169 task.myfile1=form.cleaned_data["file1"]
170 task.md_pdbref=form.cleaned_data["md_pdbref"]
173 if task.md_start == "pdbstart" or task.md_pdbref:
174 seq,task.ssbond=from_pdb(task.myfile1)
176 seq=seq_add_x(form.cleaned_data["md_seq"])
178 for i in range(0,len(seq),40):
179 task.md_seq=task.md_seq+seq[i:i+40]+" "
181 if task.md_start != "pdbstart":
185 basename = str(task.owner)
186 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
187 task.jobdirname = "_".join([basename, suffix])
192 data= {'name':task.name}
193 form = TaskForm_md(initial=data)
195 p_type='molecular dynamics'
196 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
198 def add_md_a(request,task_id):
199 task = get_object_or_404(Task, id=task_id)
200 if request.method == 'POST':
201 form = TaskForm_md_a(request.POST,request.FILES)
203 task.name=form.cleaned_data["name"]
206 task.myfile1=form.cleaned_data["file1"]
207 task.md_start=form.cleaned_data["md_start"]
208 task.md_pdbref=form.cleaned_data["md_pdbref"]
211 if task.md_start == "pdbstart" or task.md_pdbref:
212 seq,task.ssbond=from_pdb(task.myfile1)
214 seq=seq_add_x(form.cleaned_data["md_seq"])
215 for i in range(0,len(seq),40):
216 task.md_seq=task.md_seq+seq[i:i+40]+" "
218 if task.md_start != "pdbstart":
221 task.md_seed=form.cleaned_data["md_seed"]
223 task.md_temp=form.cleaned_data["md_temp"]
224 task.md_nstep=form.cleaned_data["md_nstep"]
225 task.md_ntwe=form.cleaned_data["md_ntwe"]
226 task.md_ntwx=form.cleaned_data["md_ntwx"]
227 task.md_dt=form.cleaned_data["md_dt"]
228 task.md_lang=form.cleaned_data["md_lang"]
229 task.md_tau=form.cleaned_data["md_tau"]
230 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
231 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
232 task.unres_ff=form.cleaned_data["unres_ff"]
235 basename = str(task.owner)
236 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
237 task.jobdirname = "_".join([basename, suffix])
242 data= {'name':task.name}
243 form = TaskForm_md_a(initial=data)
245 p_type='molecular dynamics - advanced options'
246 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
249 def add_remd(request,task_id):
250 task = get_object_or_404(Task, id=task_id)
251 if request.method == 'POST':
252 form = TaskForm_remd(request.POST,request.FILES)
254 task.name=form.cleaned_data["name"]
256 task.md_start=form.cleaned_data["md_start"]
257 task.myfile1=form.cleaned_data["file1"]
258 task.md_pdbref=form.cleaned_data["md_pdbref"]
259 task.md_ntwx=task.remd_nstex
262 if task.md_start == "pdbstart" or task.md_pdbref:
263 seq,task.ssbond=from_pdb(task.myfile1)
265 seq=seq_add_x(form.cleaned_data["md_seq"])
266 for i in range(0,len(seq),40):
267 task.md_seq=task.md_seq+seq[i:i+40]+" "
269 if task.md_start != "pdbstart":
272 task.md_seed=form.cleaned_data["md_seed"]
274 task.md_nstep=form.cleaned_data["md_nstep"]
279 basename = str(task.owner)
280 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
281 task.jobdirname = "_".join([basename, suffix])
286 data= {'name':task.name}
287 form = TaskForm_remd(initial=data)
289 p_type='replica exchange molecular dynamics'
290 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
292 def add_remd_a(request,task_id):
293 task = get_object_or_404(Task, id=task_id)
294 if request.method == 'POST':
295 form = TaskForm_remd_a(request.POST,request.FILES)
297 task.name=form.cleaned_data["name"]
300 task.myfile1=form.cleaned_data["file1"]
301 task.md_start=form.cleaned_data["md_start"]
302 task.md_pdbref=form.cleaned_data["md_pdbref"]
305 if task.md_start == "pdbstart" or task.md_pdbref:
306 seq,task.ssbond=from_pdb(task.myfile1)
308 seq=seq_add_x(form.cleaned_data["md_seq"])
309 for i in range(0,len(seq),40):
310 task.md_seq=task.md_seq+seq[i:i+40]+" "
312 if task.md_start != "pdbstart":
315 task.md_seed=form.cleaned_data["md_seed"]
316 task.md_nstep=form.cleaned_data["md_nstep"]
317 task.md_dt=form.cleaned_data["md_dt"]
318 task.md_lang=form.cleaned_data["md_lang"]
319 task.md_tau=form.cleaned_data["md_tau"]
320 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
321 task.remd_nrep=form.cleaned_data["remd_nrep"]
322 task.remd_nstex=form.cleaned_data["remd_nstex"]
323 task.md_ntwx=form.cleaned_data["md_ntwx"]
324 task.md_ntwe=form.cleaned_data["md_ntwe"]
325 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
326 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
328 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
329 task.unres_ff=form.cleaned_data["unres_ff"]
331 basename = str(task.owner)
332 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
333 task.jobdirname = "_".join([basename, suffix])
336 return redirect('addmlist',task_id=task.id)
338 data= {'name':task.name}
339 form = TaskForm_remd_a(initial=data)
341 p_type='replica exchange molecular dynamics - advanced options'
342 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
345 def addmlist(request,task_id):
346 task = get_object_or_404(Task, id=task_id)
347 if request.method == 'POST':
348 form = TaskForm_list(task.remd_nrep,request.POST)
350 task.remd_multi_t=form.cleaned_data["temperatures"]
351 task.remd_multi_m=form.cleaned_data["multiplexing"]
357 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
358 '["1", "1", "1", "1", "1", "1", "1", "1"]',
360 '["270", "280", "290", "300", "310", "320", "330", "345"]'
362 form = TaskForm_list(task.remd_nrep,initial=data)
363 p_type='replica exchange molecular dynamics - advanced options'
364 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
367 def details(request,task_id):
368 task = get_object_or_404(Task, id=task_id)
369 return render(request, "details.html",{'task':task})
372 def delete(request, task_id):
373 Task.objects.get(id=task_id).delete()
377 def refresh_done(request):
379 tasks = Task.objects.filter(owner=user)
381 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
384 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
386 if task.type=='min' or task.type=='md':
390 task.etot=line.split()[1]
392 if 'RMS deviation' in line:
400 if 'Total wall' in line:
403 elif task.type=='remd':
405 text="Acceptance for replica exchanges\n"
411 if j==task.remd_nrep:
413 text="Acceptance for replica exchanges\n"+line
415 if 'Total wall' in line:
418 task.results_text=text
421 if task.md_pdbref and task.type=='remd':
424 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
427 task.remd_model1=' '.join(line.split()[-6:])
429 task.remd_model2=' '.join(line.split()[-6:])
431 task.remd_model3=' '.join(line.split()[-6:])
433 task.remd_model4=' '.join(line.split()[-6:])
435 task.remd_model5=' '.join(line.split()[-6:])
438 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
441 if 'RMSD of the common residues=' in line:
442 text=' RMSD='+line.split()[5]
443 if 'TM-score =' in line:
444 text=text+' TMscore='+line.split()[2]
445 if 'GDT-TS-score=' in line:
446 text=text+' GDT_TS='+line.split()[1]
449 task.remd_model1=task.remd_model1+text
451 task.remd_model2=task.remd_model2+text
453 task.remd_model3=task.remd_model3+text
455 task.remd_model4=task.remd_model4+text
457 task.remd_model5=task.remd_model5+text
461 if task.type=='remd':
462 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
465 if 'sumprob' in line:
472 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
474 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
476 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
478 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
480 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
485 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
486 if (task.type=='min'):
489 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
494 last = line.split()[0]
497 task.running=int(1+int(last)*100.0/task.md_nstep)
502 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
505 for line in proc.stdout:
506 if 'piasek4' in line:
507 if line.split()[1]=='test_server':
509 if line.split()[-2]=='Q':
511 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
513 return render(request, "index.html", {
515 'variable' : variable
518 # return redirect('/')