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"]
169 seq,task.ssbond=from_pdb(task.myfile1)
171 for i in range(0,len(seq),40):
172 task.md_seq=task.md_seq+seq[i:i+40]+" "
176 basename = str(task.owner)
177 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
178 task.jobdirname = "_".join([basename, suffix])
183 data= {'name':task.name}
184 form = TaskForm_min_a(initial=data)
186 p_type='minimization - advanced options'
187 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
190 def add_md(request,task_id):
191 task = get_object_or_404(Task, id=task_id)
192 if request.method == 'POST':
193 form = TaskForm_md(request.POST,request.FILES)
195 task.name=form.cleaned_data["name"]
197 task.md_seed=form.cleaned_data["md_seed"]
198 task.md_start=form.cleaned_data["md_start"]
199 task.md_temp=form.cleaned_data["md_temp"]
200 task.md_nstep=form.cleaned_data["md_nstep"]
202 task.myfile1=form.cleaned_data["file1"]
203 task.md_pdbref=form.cleaned_data["md_pdbref"]
206 if task.md_start == "pdbstart" or task.md_pdbref:
207 seq,task.ssbond=from_pdb(task.myfile1)
209 seq=seq_add_x(form.cleaned_data["md_seq"])
211 for i in range(0,len(seq),40):
212 task.md_seq=task.md_seq+seq[i:i+40]+" "
214 if task.md_start != "pdbstart":
218 basename = str(task.owner)
219 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
220 task.jobdirname = "_".join([basename, suffix])
225 data= {'name':task.name}
226 form = TaskForm_md(initial=data)
228 p_type='molecular dynamics'
229 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
232 def add_md_a(request,task_id):
233 task = get_object_or_404(Task, id=task_id)
234 if request.method == 'POST':
235 form = TaskForm_md_a(request.POST,request.FILES)
237 task.name=form.cleaned_data["name"]
240 task.myfile1=form.cleaned_data["file1"]
241 task.md_start=form.cleaned_data["md_start"]
242 task.md_pdbref=form.cleaned_data["md_pdbref"]
245 if task.md_start == "pdbstart" or task.md_pdbref:
246 seq,task.ssbond=from_pdb(task.myfile1)
248 seq=seq_add_x(form.cleaned_data["md_seq"])
249 for i in range(0,len(seq),40):
250 task.md_seq=task.md_seq+seq[i:i+40]+" "
252 if task.md_start != "pdbstart":
255 task.md_seed=form.cleaned_data["md_seed"]
257 task.md_temp=form.cleaned_data["md_temp"]
258 task.md_nstep=form.cleaned_data["md_nstep"]
259 task.md_ntwe=form.cleaned_data["md_ntwe"]
260 task.md_ntwx=form.cleaned_data["md_ntwx"]
261 task.md_dt=form.cleaned_data["md_dt"]
262 task.md_lang=form.cleaned_data["md_lang"]
263 task.md_tau=form.cleaned_data["md_tau"]
264 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
265 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
266 task.unres_ff=form.cleaned_data["unres_ff"]
269 basename = str(task.owner)
270 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
271 task.jobdirname = "_".join([basename, suffix])
276 data= {'name':task.name}
277 form = TaskForm_md_a(initial=data)
279 p_type='molecular dynamics - advanced options'
280 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
283 def add_remd(request,task_id):
284 task = get_object_or_404(Task, id=task_id)
285 if request.method == 'POST':
286 form = TaskForm_remd(request.POST,request.FILES)
288 task.name=form.cleaned_data["name"]
290 task.md_start=form.cleaned_data["md_start"]
291 task.myfile1=form.cleaned_data["file1"]
292 task.md_pdbref=form.cleaned_data["md_pdbref"]
293 task.md_ntwx=task.remd_nstex
296 if task.md_start == "pdbstart" or task.md_pdbref:
297 seq,task.ssbond=from_pdb(task.myfile1)
299 seq=seq_add_x(form.cleaned_data["md_seq"])
300 for i in range(0,len(seq),40):
301 task.md_seq=task.md_seq+seq[i:i+40]+" "
303 if task.md_start != "pdbstart":
306 task.md_seed=form.cleaned_data["md_seed"]
308 task.md_nstep=form.cleaned_data["md_nstep"]
313 basename = str(task.owner)
314 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
315 task.jobdirname = "_".join([basename, suffix])
320 data= {'name':task.name}
321 form = TaskForm_remd(initial=data)
323 p_type='replica exchange molecular dynamics'
324 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
327 def add_remd_a(request,task_id):
328 task = get_object_or_404(Task, id=task_id)
329 if request.method == 'POST':
330 form = TaskForm_remd_a(request.POST,request.FILES)
332 task.name=form.cleaned_data["name"]
335 task.myfile1=form.cleaned_data["file1"]
336 task.md_start=form.cleaned_data["md_start"]
337 task.md_pdbref=form.cleaned_data["md_pdbref"]
340 if task.md_start == "pdbstart" or task.md_pdbref:
341 seq,task.ssbond=from_pdb(task.myfile1)
343 seq=seq_add_x(form.cleaned_data["md_seq"])
344 for i in range(0,len(seq),40):
345 task.md_seq=task.md_seq+seq[i:i+40]+" "
347 if task.md_start != "pdbstart":
350 task.md_seed=form.cleaned_data["md_seed"]
351 task.md_nstep=form.cleaned_data["md_nstep"]
352 task.md_dt=form.cleaned_data["md_dt"]
353 task.md_lang=form.cleaned_data["md_lang"]
354 task.md_tau=form.cleaned_data["md_tau"]
355 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
356 task.remd_nrep=form.cleaned_data["remd_nrep"]
357 task.remd_nstex=form.cleaned_data["remd_nstex"]
358 task.md_ntwx=form.cleaned_data["md_ntwx"]
359 task.md_ntwe=form.cleaned_data["md_ntwe"]
360 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
361 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
363 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
364 task.unres_ff=form.cleaned_data["unres_ff"]
366 basename = str(task.owner)
367 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
368 task.jobdirname = "_".join([basename, suffix])
371 return redirect('addmlist',task_id=task.id)
373 data= {'name':task.name}
374 form = TaskForm_remd_a(initial=data)
376 p_type='replica exchange molecular dynamics - advanced options'
377 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
380 def addmlist(request,task_id):
381 task = get_object_or_404(Task, id=task_id)
382 if request.method == 'POST':
383 form = TaskForm_list(task.remd_nrep,request.POST)
385 task.remd_multi_t=form.cleaned_data["temperatures"]
386 task.remd_multi_m=form.cleaned_data["multiplexing"]
392 if task.unres_ff == 'E0LL2Y':
393 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
394 '["1", "1", "1", "1", "1", "1", "1", "1"]',
396 '["270", "280", "290", "300", "310", "320", "330", "345"]'
399 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
400 '["1", "1", "1", "1", "1", "1", "1", "1"]',
402 '["250", "260", "270", "280", "290", "300", "315", "330"]'
405 form = TaskForm_list(task.remd_nrep,initial=data)
406 p_type='replica exchange molecular dynamics - advanced options'
407 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
410 def details(request,task_id):
411 task = get_object_or_404(Task, id=task_id)
412 return render(request, "details.html",{'task':task})
415 def delete(request, task_id):
416 Task.objects.get(id=task_id).delete()
420 def refresh_done(request):
422 tasks = Task.objects.filter(owner=user).order_by('-created_date')
424 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
427 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
429 if task.type=='min' or task.type=='md':
433 task.etot=line.split()[1]
435 if 'RMS deviation' in line:
443 if 'Total wall' in line:
446 elif task.type=='remd':
448 text="Acceptance for replica exchanges\n"
454 if j==task.remd_nrep:
456 text="Acceptance for replica exchanges\n"+line
458 if 'Total wall' in line:
461 task.results_text=text
464 if task.md_pdbref and task.type=='remd':
468 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
471 task.remd_model1=' '.join(line.split()[-6:])
473 task.remd_model2=' '.join(line.split()[-6:])
475 task.remd_model3=' '.join(line.split()[-6:])
477 task.remd_model4=' '.join(line.split()[-6:])
479 task.remd_model5=' '.join(line.split()[-6:])
480 except EnvironmentError:
481 print 'file_wham_T*pdb open error'
483 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
486 if 'RMSD of the common residues=' in line:
487 text=' RMSD='+line.split()[5]
488 if 'TM-score =' in line:
489 text=text+' TMscore='+line.split()[2]
490 if 'GDT-TS-score=' in line:
491 text=text+' GDT_TS='+line.split()[1]
494 task.remd_model1=task.remd_model1+text
496 task.remd_model2=task.remd_model2+text
498 task.remd_model3=task.remd_model3+text
500 task.remd_model4=task.remd_model4+text
502 task.remd_model5=task.remd_model5+text
506 if task.type=='remd':
507 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
510 if 'sumprob' in line:
517 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
519 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
521 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
523 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
525 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
530 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
531 if (task.type=='min'):
534 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
539 last = line.split()[0]
542 task.running=int(1+int(last)*100.0/task.md_nstep)
547 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
550 for line in proc.stdout:
551 if 'piasek4' in line:
552 if line.split()[1]=='test_server':
554 if line.split()[-2]=='Q':
556 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
558 return render(request, "index.html", {
560 'variable' : variable
563 # return redirect('/')