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 # 20 canonical amino acids
11 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
12 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
13 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
14 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
15 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
16 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
19 three_to_one = dict(res_codes)
21 def seq_add_x(sequence):
22 if sequence[0] != 'G':
24 if sequence[-1] != 'G':
26 set ='CDSQKIPTFNGHLRWAVEYMX'
27 sequence = ''.join([c for c in sequence if c in set])
35 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
36 aa = three_to_one.get(line[17:20])
38 if line[0:3] == 'TER':
40 if line[0:6] == 'SSBOND':
42 b.append(int(line[17:21]))
43 b.append(int(line[31:35]))
46 if line[0:3] == 'END':
48 if sequence[-1] == 'XX':
50 if sequence[0] != 'G':
51 sequence.insert(0,'X')
52 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
53 if sequence[-1] != 'G':
62 tasks = Task.objects.filter(owner=user)
63 return render(request, "index.html", {
69 if request.method == 'POST':
70 form = TaskForm(request.POST)
72 name = form.cleaned_data["name"]
74 task = Task(name=name,owner=user,ready=False)
76 return redirect('add_min',task_id=task.id)
81 def add_min(request,task_id):
82 task = get_object_or_404(Task, id=task_id)
83 if request.method == 'POST':
84 form = TaskForm_min(request.POST,request.FILES)
86 task.name=form.cleaned_data["name"]
88 task.myfile1=form.cleaned_data["file1"]
90 seq,task.ssbond=from_pdb(task.myfile1)
92 for i in range(0,len(seq),40):
93 task.md_seq=task.md_seq+seq[i:i+40]+" "
96 basename = str(task.owner)
97 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
98 task.jobdirname = "_".join([basename, suffix])
103 data= {'name':task.name}
104 form = TaskForm_min(initial=data)
105 p_type='minimization'
107 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
109 def add_min_a(request,task_id):
110 task = get_object_or_404(Task, id=task_id)
111 if request.method == 'POST':
112 form = TaskForm_min_a(request.POST,request.FILES)
114 task.name=form.cleaned_data["name"]
116 task.min_choice=form.cleaned_data["min_choice"]
117 task.min_overlap=form.cleaned_data["min_overlap"]
118 task.min_searchsc=form.cleaned_data["min_searchsc"]
119 task.min_maxmin=form.cleaned_data["min_maxmin"]
120 task.min_maxfun=form.cleaned_data["min_maxfun"]
121 task.min_pdbout=form.cleaned_data["min_pdbout"]
122 task.myfile1=form.cleaned_data["file1"]
123 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
125 seq,task.ssbond=from_pdb(task.myfile1)
127 for i in range(0,len(seq),40):
128 task.md_seq=task.md_seq+seq[i:i+40]+" "
132 basename = str(task.owner)
133 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
134 task.jobdirname = "_".join([basename, suffix])
139 data= {'name':task.name}
140 form = TaskForm_min_a(initial=data)
142 p_type='minimization - advanced options'
143 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
146 def add_md(request,task_id):
147 task = get_object_or_404(Task, id=task_id)
148 if request.method == 'POST':
149 form = TaskForm_md(request.POST,request.FILES)
151 task.name=form.cleaned_data["name"]
153 task.md_seed=form.cleaned_data["md_seed"]
154 task.md_start=form.cleaned_data["md_start"]
155 task.md_temp=form.cleaned_data["md_temp"]
156 task.md_nstep=form.cleaned_data["md_nstep"]
158 task.myfile1=form.cleaned_data["file1"]
159 task.md_pdbref=form.cleaned_data["md_pdbref"]
162 if task.md_start == "pdbstart" or task.md_pdbref:
163 seq,task.ssbond=from_pdb(task.myfile1)
165 seq=seq_add_x(form.cleaned_data["md_seq"])
167 for i in range(0,len(seq),40):
168 task.md_seq=task.md_seq+seq[i:i+40]+" "
170 if task.md_start != "pdbstart":
174 basename = str(task.owner)
175 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
176 task.jobdirname = "_".join([basename, suffix])
181 data= {'name':task.name}
182 form = TaskForm_md(initial=data)
184 p_type='molecular dynamics'
185 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
187 def add_md_a(request,task_id):
188 task = get_object_or_404(Task, id=task_id)
189 if request.method == 'POST':
190 form = TaskForm_md_a(request.POST,request.FILES)
192 task.name=form.cleaned_data["name"]
195 task.myfile1=form.cleaned_data["file1"]
196 task.md_start=form.cleaned_data["md_start"]
197 task.md_pdbref=form.cleaned_data["md_pdbref"]
200 if task.md_start == "pdbstart" or task.md_pdbref:
201 seq,task.ssbond=from_pdb(task.myfile1)
203 seq=seq_add_x(form.cleaned_data["md_seq"])
204 for i in range(0,len(seq),40):
205 task.md_seq=task.md_seq+seq[i:i+40]+" "
207 if task.md_start != "pdbstart":
210 task.md_seed=form.cleaned_data["md_seed"]
212 task.md_temp=form.cleaned_data["md_temp"]
213 task.md_nstep=form.cleaned_data["md_nstep"]
214 task.md_ntwe=form.cleaned_data["md_ntwe"]
215 task.md_ntwx=form.cleaned_data["md_ntwx"]
216 task.md_dt=form.cleaned_data["md_dt"]
217 task.md_lang=form.cleaned_data["md_lang"]
218 task.md_tau=form.cleaned_data["md_tau"]
219 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
220 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
224 basename = str(task.owner)
225 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
226 task.jobdirname = "_".join([basename, suffix])
231 data= {'name':task.name}
232 form = TaskForm_md_a(initial=data)
234 p_type='molecular dynamics - advanced options'
235 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
238 def add_remd(request,task_id):
239 task = get_object_or_404(Task, id=task_id)
240 if request.method == 'POST':
241 form = TaskForm_remd(request.POST,request.FILES)
243 task.name=form.cleaned_data["name"]
245 task.md_start=form.cleaned_data["md_start"]
246 task.myfile1=form.cleaned_data["file1"]
247 task.md_pdbref=form.cleaned_data["md_pdbref"]
250 if task.md_start == "pdbstart" or task.md_pdbref:
251 seq,task.ssbond=from_pdb(task.myfile1)
253 seq=seq_add_x(form.cleaned_data["md_seq"])
254 for i in range(0,len(seq),40):
255 task.md_seq=task.md_seq+seq[i:i+40]+" "
257 if task.md_start != "pdbstart":
260 task.md_seed=form.cleaned_data["md_seed"]
262 task.md_nstep=form.cleaned_data["md_nstep"]
267 basename = str(task.owner)
268 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
269 task.jobdirname = "_".join([basename, suffix])
274 data= {'name':task.name}
275 form = TaskForm_remd(initial=data)
277 p_type='replica exchange molecular dynamics'
278 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
280 def add_remd_a(request,task_id):
281 task = get_object_or_404(Task, id=task_id)
282 if request.method == 'POST':
283 form = TaskForm_remd_a(request.POST,request.FILES)
285 task.name=form.cleaned_data["name"]
288 task.myfile1=form.cleaned_data["file1"]
289 task.md_start=form.cleaned_data["md_start"]
290 task.md_pdbref=form.cleaned_data["md_pdbref"]
293 if task.md_start == "pdbstart" or task.md_pdbref:
294 seq,task.ssbond=from_pdb(task.myfile1)
296 seq=seq_add_x(form.cleaned_data["md_seq"])
297 for i in range(0,len(seq),40):
298 task.md_seq=task.md_seq+seq[i:i+40]+" "
300 if task.md_start != "pdbstart":
303 task.md_seed=form.cleaned_data["md_seed"]
304 task.md_nstep=form.cleaned_data["md_nstep"]
305 task.md_dt=form.cleaned_data["md_dt"]
306 task.md_lang=form.cleaned_data["md_lang"]
307 task.md_tau=form.cleaned_data["md_tau"]
308 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
309 task.remd_nrep=form.cleaned_data["remd_nrep"]
310 task.remd_nstex=form.cleaned_data["remd_nstex"]
311 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
312 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
314 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
316 basename = str(task.owner)
317 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
318 task.jobdirname = "_".join([basename, suffix])
321 return redirect('addmlist',task_id=task.id)
323 data= {'name':task.name}
324 form = TaskForm_remd_a(initial=data)
326 p_type='replica exchange molecular dynamics - advanced options'
327 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
330 def addmlist(request,task_id):
331 task = get_object_or_404(Task, id=task_id)
332 if request.method == 'POST':
333 form = TaskForm_list(task.remd_nrep,request.POST)
335 task.remd_multi_t=form.cleaned_data["temperatures"]
336 task.remd_multi_m=form.cleaned_data["multiplexing"]
342 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
343 '["1", "1", "1", "1", "1", "1", "1", "1"]',
345 '["270", "280", "290", "300", "310", "320", "330", "345"]'
347 form = TaskForm_list(task.remd_nrep,initial=data)
348 p_type='replica exchange molecular dynamics - advanced options'
349 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
352 def details(request,task_id):
353 task = get_object_or_404(Task, id=task_id)
354 return render(request, "details.html",{'task':task})
357 def delete(request, task_id):
358 Task.objects.get(id=task_id).delete()
362 def refresh_done(request):
364 tasks = Task.objects.filter(owner=user)
366 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
369 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
371 if task.type=='min' or task.type=='md':
375 task.etot=line.split()[1]
377 if 'RMS deviation' in line:
385 if 'Total wall' in line:
388 elif task.type=='remd':
390 text="Acceptance for replica exchanges\n"
396 if j==task.remd_nrep:
398 text="Acceptance for replica exchanges\n"+line
400 if 'Total wall' in line:
403 task.results_text=text
408 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
411 task.remd_model1=' '.join(line.split()[-6:])
413 task.remd_model2=' '.join(line.split()[-6:])
415 task.remd_model3=' '.join(line.split()[-6:])
417 task.remd_model4=' '.join(line.split()[-6:])
419 task.remd_model5=' '.join(line.split()[-6:])
423 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
424 if (task.type=='min'):
427 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
432 last = line.split()[0]
435 task.running=1+int(last)*100.0/task.md_nstep