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
10 from lazysignup.decorators import allow_lazy_user
13 # 20 canonical amino acids
14 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
15 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
16 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
17 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
18 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
19 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
20 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
24 three_to_one = dict(res_codes)
26 def seq_add_x(sequence):
27 if sequence[0] != 'G':
29 if sequence[-1] != 'G':
31 set ='CDSQKIPTFNGHLRWAVEYMX'
32 sequence = ''.join([c for c in sequence if c in set])
49 if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
51 chain_=tmp.split(', ')
52 chain_[-1]=chain_[-1][0]
55 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
56 aa = three_to_one.get(line[17:20])
58 if newchain or i!=ires[-1]:
63 chain_start[chain[ichain]]=i
65 if line[0:3] == 'TER':
68 chain_end[chain[ichain]]=i
71 if line[0:6] == 'SSBOND':
73 b.append(int(line[17:21]))
74 b.append(int(line[31:35]))
77 c.append((line[15:16]))
78 c.append((line[29:30]))
80 if line[0:3] == 'END':
82 while sequence[-1] == 'XX':
84 if sequence[0] != 'G':
85 sequence.insert(0,'X')
86 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
87 if sequence[-1] != 'G':
91 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
94 unres_shift[c]=i+chain_start[c]
95 i=i-(chain_end[c]-chain_start[c])-3
96 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
98 return seq,json.dumps(ssbond)
104 tasks = Task.objects.filter(owner=user).order_by('-created_date')
106 return render(request, "index.html", {
112 if request.method == 'POST':
113 form = TaskForm(request.POST)
115 name = form.cleaned_data["name"]
117 task = Task(name=name,owner=user,ready=False)
119 return redirect('add_min',task_id=task.id)
123 def add_min(request,task_id):
124 task = get_object_or_404(Task, id=task_id)
125 if request.method == 'POST':
126 form = TaskForm_min(request.POST,request.FILES)
128 task.name=form.cleaned_data["name"]
130 task.myfile1=form.cleaned_data["file1"]
132 seq,task.ssbond=from_pdb(task.myfile1)
134 for i in range(0,len(seq),40):
135 task.md_seq=task.md_seq+seq[i:i+40]+" "
138 basename = str(task.owner)
139 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
140 task.jobdirname = "_".join([basename, suffix])
145 data= {'name':task.name}
146 form = TaskForm_min(initial=data)
147 p_type='minimization'
149 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
152 def add_min_a(request,task_id):
153 task = get_object_or_404(Task, id=task_id)
154 if request.method == 'POST':
155 form = TaskForm_min_a(request.POST,request.FILES)
157 task.name=form.cleaned_data["name"]
159 task.min_choice=form.cleaned_data["min_choice"]
160 task.min_overlap=form.cleaned_data["min_overlap"]
161 task.min_searchsc=form.cleaned_data["min_searchsc"]
162 task.min_maxmin=form.cleaned_data["min_maxmin"]
163 task.min_maxfun=form.cleaned_data["min_maxfun"]
164 task.min_pdbout=form.cleaned_data["min_pdbout"]
165 task.myfile1=form.cleaned_data["file1"]
166 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
167 task.unres_ff=form.cleaned_data["unres_ff"]
168 task.boxx=form.cleaned_data["boxx"]
169 task.boxy=form.cleaned_data["boxy"]
170 task.boxz=form.cleaned_data["boxz"]
172 seq,task.ssbond=from_pdb(task.myfile1)
174 for i in range(0,len(seq),40):
175 task.md_seq=task.md_seq+seq[i:i+40]+" "
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_min_a(initial=data)
189 p_type='minimization - advanced options'
190 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
193 def add_md(request,task_id):
194 task = get_object_or_404(Task, id=task_id)
195 if request.method == 'POST':
196 form = TaskForm_md(request.POST,request.FILES)
198 task.name=form.cleaned_data["name"]
200 task.md_seed=form.cleaned_data["md_seed"]
201 task.md_start=form.cleaned_data["md_start"]
202 task.md_temp=form.cleaned_data["md_temp"]
203 task.md_nstep=form.cleaned_data["md_nstep"]
205 task.myfile1=form.cleaned_data["file1"]
206 task.md_pdbref=form.cleaned_data["md_pdbref"]
209 if task.md_start == "pdbstart" or task.md_pdbref:
210 seq,task.ssbond=from_pdb(task.myfile1)
212 seq=seq_add_x(form.cleaned_data["md_seq"])
214 for i in range(0,len(seq),40):
215 task.md_seq=task.md_seq+seq[i:i+40]+" "
217 if task.md_start != "pdbstart":
221 basename = str(task.owner)
222 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
223 task.jobdirname = "_".join([basename, suffix])
228 data= {'name':task.name}
229 form = TaskForm_md(initial=data)
231 p_type='molecular dynamics'
232 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
235 def add_md_a(request,task_id):
236 task = get_object_or_404(Task, id=task_id)
237 if request.method == 'POST':
238 form = TaskForm_md_a(request.POST,request.FILES)
240 task.name=form.cleaned_data["name"]
243 task.myfile1=form.cleaned_data["file1"]
244 task.md_start=form.cleaned_data["md_start"]
245 task.md_pdbref=form.cleaned_data["md_pdbref"]
248 if task.md_start == "pdbstart" or task.md_pdbref:
249 seq,task.ssbond=from_pdb(task.myfile1)
251 seq=seq_add_x(form.cleaned_data["md_seq"])
252 for i in range(0,len(seq),40):
253 task.md_seq=task.md_seq+seq[i:i+40]+" "
255 if task.md_start != "pdbstart":
258 task.md_seed=form.cleaned_data["md_seed"]
260 task.md_temp=form.cleaned_data["md_temp"]
261 task.md_nstep=form.cleaned_data["md_nstep"]
262 task.md_ntwe=form.cleaned_data["md_ntwe"]
263 task.md_ntwx=form.cleaned_data["md_ntwx"]
264 task.md_dt=form.cleaned_data["md_dt"]
265 task.md_lang=form.cleaned_data["md_lang"]
266 task.md_tau=form.cleaned_data["md_tau"]
267 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
268 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
269 task.unres_ff=form.cleaned_data["unres_ff"]
270 task.boxx=form.cleaned_data["boxx"]
271 task.boxy=form.cleaned_data["boxy"]
272 task.boxz=form.cleaned_data["boxz"]
276 basename = str(task.owner)
277 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
278 task.jobdirname = "_".join([basename, suffix])
283 data= {'name':task.name}
284 form = TaskForm_md_a(initial=data)
286 p_type='molecular dynamics - advanced options'
287 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
290 def add_remd(request,task_id):
291 task = get_object_or_404(Task, id=task_id)
292 if request.method == 'POST':
293 form = TaskForm_remd(request.POST,request.FILES)
295 task.name=form.cleaned_data["name"]
297 task.md_start=form.cleaned_data["md_start"]
298 task.myfile1=form.cleaned_data["file1"]
299 task.md_pdbref=form.cleaned_data["md_pdbref"]
300 task.md_ntwx=task.remd_nstex
303 if task.md_start == "pdbstart" or task.md_pdbref:
304 seq,task.ssbond=from_pdb(task.myfile1)
306 seq=seq_add_x(form.cleaned_data["md_seq"])
307 for i in range(0,len(seq),40):
308 task.md_seq=task.md_seq+seq[i:i+40]+" "
310 if task.md_start != "pdbstart":
313 task.md_seed=form.cleaned_data["md_seed"]
315 task.md_nstep=form.cleaned_data["md_nstep"]
320 basename = str(task.owner)
321 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
322 task.jobdirname = "_".join([basename, suffix])
327 data= {'name':task.name}
328 form = TaskForm_remd(initial=data)
330 p_type='replica exchange molecular dynamics'
331 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
334 def add_remd_a(request,task_id):
335 task = get_object_or_404(Task, id=task_id)
336 if request.method == 'POST':
337 form = TaskForm_remd_a(request.POST,request.FILES)
339 task.name=form.cleaned_data["name"]
342 task.myfile1=form.cleaned_data["file1"]
343 task.md_start=form.cleaned_data["md_start"]
344 task.md_pdbref=form.cleaned_data["md_pdbref"]
347 if task.md_start == "pdbstart" or task.md_pdbref:
348 seq,task.ssbond=from_pdb(task.myfile1)
350 seq=seq_add_x(form.cleaned_data["md_seq"])
351 for i in range(0,len(seq),40):
352 task.md_seq=task.md_seq+seq[i:i+40]+" "
354 if task.md_start != "pdbstart":
357 task.md_seed=form.cleaned_data["md_seed"]
358 task.md_nstep=form.cleaned_data["md_nstep"]
359 task.md_dt=form.cleaned_data["md_dt"]
360 task.md_lang=form.cleaned_data["md_lang"]
361 task.md_tau=form.cleaned_data["md_tau"]
362 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
363 task.remd_nrep=form.cleaned_data["remd_nrep"]
364 task.remd_nstex=form.cleaned_data["remd_nstex"]
365 task.md_ntwx=form.cleaned_data["md_ntwx"]
366 task.md_ntwe=form.cleaned_data["md_ntwe"]
367 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
368 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
370 task.boxx=form.cleaned_data["boxx"]
371 task.boxy=form.cleaned_data["boxy"]
372 task.boxz=form.cleaned_data["boxz"]
375 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
376 task.unres_ff=form.cleaned_data["unres_ff"]
378 basename = str(task.owner)
379 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
380 task.jobdirname = "_".join([basename, suffix])
383 return redirect('addmlist',task_id=task.id)
385 data= {'name':task.name}
386 form = TaskForm_remd_a(initial=data)
388 p_type='replica exchange molecular dynamics - advanced options'
389 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
392 def addmlist(request,task_id):
393 task = get_object_or_404(Task, id=task_id)
394 if request.method == 'POST':
395 form = TaskForm_list(task.remd_nrep,request.POST)
397 task.remd_multi_t=form.cleaned_data["temperatures"]
398 task.remd_multi_m=form.cleaned_data["multiplexing"]
404 if task.unres_ff == 'E0LL2Y':
405 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
406 '["1", "1", "1", "1", "1", "1", "1", "1"]',
408 '["270", "280", "290", "300", "310", "320", "330", "345"]'
411 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
412 '["1", "1", "1", "1", "1", "1", "1", "1"]',
414 '["250", "260", "270", "280", "290", "300", "315", "330"]'
417 form = TaskForm_list(task.remd_nrep,initial=data)
418 p_type='replica exchange molecular dynamics - advanced options'
419 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
421 def details(request,task_id):
422 task = get_object_or_404(Task, id=task_id)
423 return render(request, "details.html",{'task':task})
426 def delete(request, task_id):
427 Task.objects.get(id=task_id).delete()
431 def refresh_done(request):
433 tasks = Task.objects.filter(owner=user).order_by('-created_date')
435 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
438 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
440 if task.type=='min' or task.type=='md':
444 task.etot=line.split()[1]
446 if 'RMS deviation' in line:
454 if 'Total wall' in line:
457 elif task.type=='remd':
459 text="Acceptance for replica exchanges\n"
465 if j==task.remd_nrep:
467 text="Acceptance for replica exchanges\n"+line
469 if 'Total wall' in line:
472 task.results_text=text
475 if task.md_pdbref and task.type=='remd':
479 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
482 task.remd_model1=' '.join(line.split()[-6:])
484 task.remd_model2=' '.join(line.split()[-6:])
486 task.remd_model3=' '.join(line.split()[-6:])
488 task.remd_model4=' '.join(line.split()[-6:])
490 task.remd_model5=' '.join(line.split()[-6:])
491 except EnvironmentError:
492 print 'file_wham_T*pdb open error'
494 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
497 if 'RMSD of the common residues=' in line:
498 text=' RMSD='+line.split()[5]
499 if 'TM-score =' in line:
500 text=text+' TMscore='+line.split()[2]
501 if 'GDT-TS-score=' in line:
502 text=text+' GDT_TS='+line.split()[1]
505 task.remd_model1=task.remd_model1+text
507 task.remd_model2=task.remd_model2+text
509 task.remd_model3=task.remd_model3+text
511 task.remd_model4=task.remd_model4+text
513 task.remd_model5=task.remd_model5+text
517 if task.type=='remd':
518 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
521 if 'sumprob' in line:
528 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
530 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
532 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
534 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
536 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
541 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
542 if (task.type=='min'):
545 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
550 last = line.split()[0]
553 task.running=int(1+int(last)*100.0/task.md_nstep)
558 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
561 for line in proc.stdout:
562 if 'piasek4' in line:
563 if line.split()[1]=='test_server':
565 if line.split()[-2]=='Q':
567 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
569 return render(request, "index.html", {
571 'variable' : variable
574 # return redirect('/')