initial git commit
[django_unres.git] / django_simple / todo / views.py
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
4 from .forms import *
5 from .models import Task
6 import datetime
7 import os
8
9 res_codes = [
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'),
17                ]
18
19 three_to_one = dict(res_codes)
20
21 def seq_add_x(sequence):
22     if sequence[0] != 'G':
23         sequence='X'+sequence
24     if sequence[-1] != 'G':
25         sequence=sequence+'X'
26     set ='CDSQKIPTFNGHLRWAVEYMX'
27     sequence = ''.join([c for c in sequence if c in set])
28
29     return(sequence)    
30
31 def from_pdb(file):
32     sequence = []
33     ssbond = []
34     for line in file:
35             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
36               aa = three_to_one.get(line[17:20])
37               sequence.append(aa)
38             if line[0:3] == 'TER':
39               sequence.append('XX')
40             if line[0:6] == 'SSBOND':
41               b=[]
42               b.append(int(line[17:21]))
43               b.append(int(line[31:35]))
44               ssbond.append(b)
45                                                                                     
46             if line[0:3] == 'END':
47               break
48     if sequence[-1] == 'XX':
49             del sequence[-1]
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':
54             sequence.append('X')
55     seq=''.join(sequence)
56     return seq,ssbond
57
58
59 @login_required
60 def index(request):
61     user = request.user
62     tasks = Task.objects.filter(owner=user)
63     return render(request, "index.html", {
64             'tasks': tasks
65         })
66
67 @login_required
68 def add(request):
69     if request.method == 'POST':
70         form = TaskForm(request.POST)
71         if form.is_valid():
72             name = form.cleaned_data["name"]
73             user = request.user
74             task = Task(name=name,owner=user,ready=False)
75             task.save()
76             return redirect('add_min',task_id=task.id)
77     return redirect('/')
78
79
80 @login_required
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)
85         if form.is_valid():
86              task.name=form.cleaned_data["name"]
87              task.type="min"
88              task.myfile1=form.cleaned_data["file1"]
89
90              seq,task.ssbond=from_pdb(task.myfile1)
91              task.md_seq=""
92              for i in range(0,len(seq),40):
93                     task.md_seq=task.md_seq+seq[i:i+40]+" "
94
95              task.ready=True
96              basename = str(task.owner)
97              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
98              task.jobdirname = "_".join([basename, suffix])
99              
100              task.save()
101              return redirect('/')
102     else:
103         data= {'name':task.name}
104         form = TaskForm_min(initial=data)
105     p_type='minimization'
106     basic_adv=True    
107     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
108
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)
113         if form.is_valid():
114              task.name=form.cleaned_data["name"]
115              task.type="min"
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"]
124
125              seq,task.ssbond=from_pdb(task.myfile1)
126              task.md_seq=""
127              for i in range(0,len(seq),40):
128                 task.md_seq=task.md_seq+seq[i:i+40]+" "
129                                                            
130
131              task.ready=True
132              basename = str(task.owner)
133              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
134              task.jobdirname = "_".join([basename, suffix])
135              
136              task.save()
137              return redirect('/')
138     else:
139         data= {'name':task.name}
140         form = TaskForm_min_a(initial=data)
141     basic_adv=False
142     p_type='minimization - advanced options'
143     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
144
145 @login_required
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)
150         if form.is_valid():
151              task.name=form.cleaned_data["name"]
152              task.type="md"
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"]
157              
158              task.myfile1=form.cleaned_data["file1"]
159              task.md_pdbref=form.cleaned_data["md_pdbref"]             
160
161              task.md_seq=""
162              if task.md_start == "pdbstart" or task.md_pdbref:
163                seq,task.ssbond=from_pdb(task.myfile1)
164              else:
165                seq=seq_add_x(form.cleaned_data["md_seq"])
166                        
167              for i in range(0,len(seq),40):
168                 task.md_seq=task.md_seq+seq[i:i+40]+" "
169              
170              if task.md_start != "pdbstart":
171                 task.ssbond=''
172
173              task.ready=True
174              basename = str(task.owner)
175              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
176              task.jobdirname = "_".join([basename, suffix])
177              
178              task.save()
179              return redirect('/')
180     else:
181         data= {'name':task.name}
182         form = TaskForm_md(initial=data)
183     basic_adv=True
184     p_type='molecular dynamics'
185     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
186
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)
191         if form.is_valid():
192              task.name=form.cleaned_data["name"]
193              task.type="md"
194
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"]             
198
199              task.md_seq=""
200              if task.md_start == "pdbstart" or task.md_pdbref:
201                seq,task.ssbond=from_pdb(task.myfile1)
202              else:
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]+" "
206
207              if task.md_start != "pdbstart":
208                 task.ssbond=''
209
210              task.md_seed=form.cleaned_data["md_seed"]
211
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"]
221
222              
223              task.ready=True
224              basename = str(task.owner)
225              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
226              task.jobdirname = "_".join([basename, suffix])
227              
228              task.save()
229              return redirect('/')
230     else:
231         data= {'name':task.name}
232         form = TaskForm_md_a(initial=data)
233     basic_adv=False
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})
236
237 @login_required
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)
242         if form.is_valid():
243              task.name=form.cleaned_data["name"]
244              task.type="remd"
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"]
248
249              task.md_seq=""
250              if task.md_start == "pdbstart" or task.md_pdbref:
251                seq,task.ssbond=from_pdb(task.myfile1)
252              else:
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]+" "
256
257              if task.md_start != "pdbstart":
258                 task.ssbond=''
259
260              task.md_seed=form.cleaned_data["md_seed"]
261
262              task.md_nstep=form.cleaned_data["md_nstep"]
263
264
265              task.ready=True
266              
267              basename = str(task.owner)
268              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
269              task.jobdirname = "_".join([basename, suffix])
270              
271              task.save()
272              return redirect('/')
273     else:
274         data= {'name':task.name}
275         form = TaskForm_remd(initial=data)
276     basic_adv=True
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})
279
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)
284         if form.is_valid():
285              task.name=form.cleaned_data["name"]
286              task.type="remd"
287
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"]                        
291
292              task.md_seq=""
293              if task.md_start == "pdbstart" or task.md_pdbref:
294                seq,task.ssbond=from_pdb(task.myfile1)
295              else:
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]+" "
299
300              if task.md_start != "pdbstart":
301                 task.ssbond=''
302
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"]
313
314              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
315              
316              basename = str(task.owner)
317              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
318              task.jobdirname = "_".join([basename, suffix])
319              
320              task.save()
321              return redirect('addmlist',task_id=task.id)
322     else:
323         data= {'name':task.name}
324         form = TaskForm_remd_a(initial=data)
325     basic_adv=False
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})
328
329
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)
334         if form.is_valid():
335              task.remd_multi_t=form.cleaned_data["temperatures"]
336              task.remd_multi_m=form.cleaned_data["multiplexing"]             
337              task.ready=True
338              
339              task.save()
340              return redirect('/')
341     else:
342         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
343         '["1", "1", "1", "1", "1", "1", "1", "1"]',
344         'temperatures':
345         '["270", "280", "290", "300", "310", "320", "330", "345"]'
346         }
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})
350
351 @login_required
352 def details(request,task_id):
353     task = get_object_or_404(Task, id=task_id)
354     return render(request, "details.html",{'task':task})
355
356 @login_required
357 def delete(request, task_id):
358     Task.objects.get(id=task_id).delete()
359     return redirect('/')
360
361 @login_required
362 def refresh_done(request):
363     user = request.user
364     tasks = Task.objects.filter(owner=user)
365     for task in tasks:
366       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
367          task.done=True
368
369          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
370
371            if task.type=='min' or task.type=='md':
372              text=""
373              for line in f:
374                if 'ETOT' in line:
375                   task.etot=line.split()[1]
376
377                if 'RMS deviation' in line:
378                   text=text+line
379                   i=1
380                   for line1 in f:
381                      text=text+line1
382                      i+=1
383                      if i>6:
384                        break
385                if 'Total wall' in line:
386                   text=text+line
387                   
388            elif task.type=='remd':
389              j=0
390              text="Acceptance for replica exchanges\n"
391              for line in f:
392                         
393                if 'ACC' in line:
394                     j+=1
395                     text=text+line
396                     if j==task.remd_nrep:
397                        j=1
398                        text="Acceptance for replica exchanges\n"+line
399
400                if 'Total wall' in line:
401                   text=text+line
402                        
403
404          task.results_text=text
405
406
407          task.save()
408       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
409          if (task.type=='min'):
410            task.running =1
411          else:
412            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
413               for line in f:
414                 pass
415               if line:
416                 last = line.split()[0]
417               else:
418                 last = 0
419            task.running=1+int(last)*100.0/task.md_nstep
420            if task.running>100:
421              task.running=100
422          task.save()
423     return redirect('/')