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"]
129 seq,task.ssbond=from_pdb(task.myfile1)
131 for i in range(0,len(seq),40):
132 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_a(initial=data)
146 p_type='minimization - advanced options'
147 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
150 def add_md(request,task_id):
151 task = get_object_or_404(Task, id=task_id)
152 if request.method == 'POST':
153 form = TaskForm_md(request.POST,request.FILES)
155 task.name=form.cleaned_data["name"]
157 task.md_seed=form.cleaned_data["md_seed"]
158 task.md_start=form.cleaned_data["md_start"]
159 task.md_temp=form.cleaned_data["md_temp"]
160 task.md_nstep=form.cleaned_data["md_nstep"]
162 task.myfile1=form.cleaned_data["file1"]
163 task.md_pdbref=form.cleaned_data["md_pdbref"]
166 if task.md_start == "pdbstart" or task.md_pdbref:
167 seq,task.ssbond=from_pdb(task.myfile1)
169 seq=seq_add_x(form.cleaned_data["md_seq"])
171 for i in range(0,len(seq),40):
172 task.md_seq=task.md_seq+seq[i:i+40]+" "
174 if task.md_start != "pdbstart":
178 basename = str(task.owner)
179 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
180 task.jobdirname = "_".join([basename, suffix])
185 data= {'name':task.name}
186 form = TaskForm_md(initial=data)
188 p_type='molecular dynamics'
189 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
191 def add_md_a(request,task_id):
192 task = get_object_or_404(Task, id=task_id)
193 if request.method == 'POST':
194 form = TaskForm_md_a(request.POST,request.FILES)
196 task.name=form.cleaned_data["name"]
199 task.myfile1=form.cleaned_data["file1"]
200 task.md_start=form.cleaned_data["md_start"]
201 task.md_pdbref=form.cleaned_data["md_pdbref"]
204 if task.md_start == "pdbstart" or task.md_pdbref:
205 seq,task.ssbond=from_pdb(task.myfile1)
207 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":
214 task.md_seed=form.cleaned_data["md_seed"]
216 task.md_temp=form.cleaned_data["md_temp"]
217 task.md_nstep=form.cleaned_data["md_nstep"]
218 task.md_ntwe=form.cleaned_data["md_ntwe"]
219 task.md_ntwx=form.cleaned_data["md_ntwx"]
220 task.md_dt=form.cleaned_data["md_dt"]
221 task.md_lang=form.cleaned_data["md_lang"]
222 task.md_tau=form.cleaned_data["md_tau"]
223 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
224 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
228 basename = str(task.owner)
229 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
230 task.jobdirname = "_".join([basename, suffix])
235 data= {'name':task.name}
236 form = TaskForm_md_a(initial=data)
238 p_type='molecular dynamics - advanced options'
239 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
242 def add_remd(request,task_id):
243 task = get_object_or_404(Task, id=task_id)
244 if request.method == 'POST':
245 form = TaskForm_remd(request.POST,request.FILES)
247 task.name=form.cleaned_data["name"]
249 task.md_start=form.cleaned_data["md_start"]
250 task.myfile1=form.cleaned_data["file1"]
251 task.md_pdbref=form.cleaned_data["md_pdbref"]
254 if task.md_start == "pdbstart" or task.md_pdbref:
255 seq,task.ssbond=from_pdb(task.myfile1)
257 seq=seq_add_x(form.cleaned_data["md_seq"])
258 for i in range(0,len(seq),40):
259 task.md_seq=task.md_seq+seq[i:i+40]+" "
261 if task.md_start != "pdbstart":
264 task.md_seed=form.cleaned_data["md_seed"]
266 task.md_nstep=form.cleaned_data["md_nstep"]
271 basename = str(task.owner)
272 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
273 task.jobdirname = "_".join([basename, suffix])
278 data= {'name':task.name}
279 form = TaskForm_remd(initial=data)
281 p_type='replica exchange molecular dynamics'
282 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
284 def add_remd_a(request,task_id):
285 task = get_object_or_404(Task, id=task_id)
286 if request.method == 'POST':
287 form = TaskForm_remd_a(request.POST,request.FILES)
289 task.name=form.cleaned_data["name"]
292 task.myfile1=form.cleaned_data["file1"]
293 task.md_start=form.cleaned_data["md_start"]
294 task.md_pdbref=form.cleaned_data["md_pdbref"]
297 if task.md_start == "pdbstart" or task.md_pdbref:
298 seq,task.ssbond=from_pdb(task.myfile1)
300 seq=seq_add_x(form.cleaned_data["md_seq"])
301 for i in range(0,len(seq),40):
302 task.md_seq=task.md_seq+seq[i:i+40]+" "
304 if task.md_start != "pdbstart":
307 task.md_seed=form.cleaned_data["md_seed"]
308 task.md_nstep=form.cleaned_data["md_nstep"]
309 task.md_dt=form.cleaned_data["md_dt"]
310 task.md_lang=form.cleaned_data["md_lang"]
311 task.md_tau=form.cleaned_data["md_tau"]
312 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
313 task.remd_nrep=form.cleaned_data["remd_nrep"]
314 task.remd_nstex=form.cleaned_data["remd_nstex"]
315 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
316 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
318 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
320 basename = str(task.owner)
321 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
322 task.jobdirname = "_".join([basename, suffix])
325 return redirect('addmlist',task_id=task.id)
327 data= {'name':task.name}
328 form = TaskForm_remd_a(initial=data)
330 p_type='replica exchange molecular dynamics - advanced options'
331 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
334 def addmlist(request,task_id):
335 task = get_object_or_404(Task, id=task_id)
336 if request.method == 'POST':
337 form = TaskForm_list(task.remd_nrep,request.POST)
339 task.remd_multi_t=form.cleaned_data["temperatures"]
340 task.remd_multi_m=form.cleaned_data["multiplexing"]
346 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
347 '["1", "1", "1", "1", "1", "1", "1", "1"]',
349 '["270", "280", "290", "300", "310", "320", "330", "345"]'
351 form = TaskForm_list(task.remd_nrep,initial=data)
352 p_type='replica exchange molecular dynamics - advanced options'
353 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
356 def details(request,task_id):
357 task = get_object_or_404(Task, id=task_id)
358 return render(request, "details.html",{'task':task})
361 def delete(request, task_id):
362 Task.objects.get(id=task_id).delete()
366 def refresh_done(request):
368 tasks = Task.objects.filter(owner=user)
370 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
373 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
375 if task.type=='min' or task.type=='md':
379 task.etot=line.split()[1]
381 if 'RMS deviation' in line:
389 if 'Total wall' in line:
392 elif task.type=='remd':
394 text="Acceptance for replica exchanges\n"
400 if j==task.remd_nrep:
402 text="Acceptance for replica exchanges\n"+line
404 if 'Total wall' in line:
407 task.results_text=text
410 if task.md_pdbref and task.type=='remd':
413 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
416 task.remd_model1=' '.join(line.split()[-6:])
418 task.remd_model2=' '.join(line.split()[-6:])
420 task.remd_model3=' '.join(line.split()[-6:])
422 task.remd_model4=' '.join(line.split()[-6:])
424 task.remd_model5=' '.join(line.split()[-6:])
427 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
430 if 'RMSD of the common residues=' in line:
431 text=' RMSD='+line.split()[5]
432 if 'TM-score =' in line:
433 text=text+' TMscore='+line.split()[2]
434 if 'GDT-TS-score=' in line:
435 text=text+' GDT_TS='+line.split()[1]
438 task.remd_model1=task.remd_model1+text
440 task.remd_model2=task.remd_model2+text
442 task.remd_model3=task.remd_model3+text
444 task.remd_model4=task.remd_model4+text
446 task.remd_model5=task.remd_model5+text
450 if task.type=='remd':
451 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
454 if 'sumprob' in line:
461 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
463 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
465 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
467 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
469 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
474 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
475 if (task.type=='min'):
478 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
483 last = line.split()[0]
486 task.running=int(1+int(last)*100.0/task.md_nstep)
491 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
494 for line in proc.stdout:
495 if 'piasek4' in line:
496 if line.split()[1]=='test_server':
498 if line.split()[-2]=='Q':
500 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
502 return render(request, "index.html", {
504 'variable' : variable
507 # return redirect('/')