secondary structure restraints for md and remd
[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 import subprocess
9 import json
10 from lazysignup.decorators import allow_lazy_user
11 from lazysignup.utils import is_lazy_user
12
13 res_codes = [
14                 # 20 canonical amino acids
15                 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
16                 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
17                 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
18                 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
19                 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
20                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
21                 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
22                 ('CYX', 'C'),
23                 ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
24                 ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
25                 ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
26                 ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
27                 ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),                
28                ]
29
30 three_to_one = dict(res_codes)
31
32 def seq_2d_from_pdb(seq_2d,seq):
33     if seq_2d =='':
34       return(seq_2d)
35     seq_2d=seq_2d.replace('C', '-')
36     seq_2d_tmp=''
37     ii=0
38     for i in range(0,len(seq)):
39       if seq[i]=='X':
40          seq_2d_tmp=seq_2d_tmp+'-'
41       else:
42          if len(seq_2d)>=ii:
43             seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
44             ii+=1
45     tmp=''
46     for i in range(0,len(seq_2d_tmp),40):
47       tmp=tmp+seq_2d_tmp[i:i+40]+" "
48     return(tmp)
49
50 def seq_2d_add_x(seq_2d,seq,seq_form):
51     if seq_2d =='':
52       return(seq_2d)
53     seq_2d=seq_2d[:len(seq_form)]
54     seq_2d=seq_2d.replace('C', '-')
55     if seq_form[0] !='X' and seq[0] == 'X':
56       seq_2d='-'+seq_2d
57     if seq_form[-1] !='X' and seq[-1] == 'X':
58       seq_2d=seq_2d+'-'
59     seq_2d=seq_2d[:len(seq)]
60     tmp=''
61     for i in range(0,len(seq_2d),40):
62       tmp=tmp+seq_2d[i:i+40]+" "
63     return(tmp)
64
65 def seq_add_x(sequence):
66     if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
67         sequence='X'+sequence
68     if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
69         sequence=sequence+'X'
70     set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
71     sequence = ''.join([c for c in sequence if c in set])
72
73     return(sequence)    
74
75 def from_pdb(file):
76     sequence = []
77     ssbond = []
78     ssbond_ch = []
79     ires = []
80     chain_start = {}
81     chain_end = {}
82     unres_shift = {}
83     chain_sorted=[]
84     newchain = True
85     
86     for line in file:
87             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
88               aa = three_to_one.get(line[17:20])
89               i = int(line[22:26])
90               ch = line[21:22]
91               if newchain or i!=ires[-1]:
92                 sequence.append(aa)
93                 ires.append(i)
94                 if newchain:
95                  chain_start[ch]=i
96                  chain_sorted.extend(ch)
97                  newchain = False
98             if line[0:3] == 'TER':
99               sequence.append('XX')
100               chain_end[ch]=i
101               newchain = True
102             if line[0:6] == 'SSBOND':
103               b=[]
104               b.append(int(line[17:21]))
105               b.append(int(line[31:35]))
106               ssbond.append(b)
107               c = []
108               c.append((line[15:16]))
109               c.append((line[29:30]))
110               ssbond_ch.append(c)                                                                      
111             if line[0:3] == 'END':
112               break
113     if not sequence[-1] == 'XX':
114             chain_end[ch]=i
115     while sequence[-1] == 'XX':
116             del sequence[-1]
117     if sequence[0] != 'G':
118             sequence.insert(0,'X')
119             ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
120     if sequence[-1] != 'G':
121             sequence.append('X')
122     seq=''.join(sequence)
123 #    if ires[0] != 1:
124 #            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
125     i=0
126     for c in chain_sorted:
127       unres_shift[c]=i+chain_start[c]
128       i=i-(chain_end[c]-chain_start[c])-3
129     ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]     
130
131     return seq,json.dumps(ssbond)
132
133
134 @login_required
135 def index(request):
136     user = request.user
137     tasks = Task.objects.filter(owner=user).order_by('-created_date')
138     variable = ''
139     return render(request, "index.html", {
140             'tasks': tasks, 'alldone': 0
141         })
142
143 @login_required
144 def add(request):
145     if request.method == 'POST':
146         form = TaskForm(request.POST)
147         if form.is_valid():
148             name = form.cleaned_data["name"]
149             user = request.user
150             task = Task(name=name,owner=user,ready=False)
151             task.save()
152             return redirect('add_min',task_id=task.id)
153     return redirect('/')
154
155 @login_required
156 def add_min(request,task_id):
157     task = get_object_or_404(Task, id=task_id)
158     if request.method == 'POST':
159      if '_example' in request.POST:
160         data= {'name':task.name,'pdbid':'1BDD'}
161         form = TaskForm_min(initial=data)     
162      else:
163         form = TaskForm_min(request.POST,request.FILES)
164         if form.is_valid():
165              task.name=form.cleaned_data["name"]
166              task.type="min"
167              pdbid=form.cleaned_data["pdbid"]
168
169              basename = str(task.owner)
170              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
171              task.jobdirname = "_".join([basename, suffix])
172
173              if pdbid:
174               os.mkdir(task.jobdirname)
175               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
176                      task.jobdirname+'/plik.pdb')     
177               task.pdbcode=pdbid
178              else:
179               task.myfile1=form.cleaned_data["file1"]
180
181              seq,task.ssbond=from_pdb(task.myfile1)
182              task.md_seq=""
183              for i in range(0,len(seq),40):
184                     task.md_seq=task.md_seq+seq[i:i+40]+" "
185
186              task.ready=True
187              
188              task.save()
189              if is_lazy_user(request.user):
190               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
191              else:
192               return redirect('/')
193     else:
194         data= {'name':task.name}
195         form = TaskForm_min(initial=data)
196     p_type='minimization'
197     basic_adv=True    
198     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
199
200 @login_required
201 def add_min_a(request,task_id):
202     task = get_object_or_404(Task, id=task_id)
203     if request.method == 'POST':
204      if '_example' in request.POST:
205         data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
206         form = TaskForm_min_a(initial=data)     
207      else:
208         form = TaskForm_min_a(request.POST,request.FILES)
209         if form.is_valid():
210              task.name=form.cleaned_data["name"]
211              task.type="min"
212              task.min_choice=form.cleaned_data["min_choice"]
213              task.min_overlap=form.cleaned_data["min_overlap"]
214              task.min_searchsc=form.cleaned_data["min_searchsc"]
215              task.min_maxmin=form.cleaned_data["min_maxmin"]
216              task.min_maxfun=form.cleaned_data["min_maxfun"]
217              task.min_pdbout=form.cleaned_data["min_pdbout"]
218
219              basename = str(task.owner)
220              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
221              task.jobdirname = "_".join([basename, suffix])
222              
223              pdbid=form.cleaned_data["pdbid"]
224              if pdbid:
225               os.mkdir(task.jobdirname)
226               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
227                      task.jobdirname+'/plik.pdb')     
228               task.pdbcode=pdbid
229              else:
230               task.myfile1=form.cleaned_data["file1"]
231
232              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
233              task.unres_ff=form.cleaned_data["unres_ff"]
234              task.boxx=form.cleaned_data["boxx"]
235              task.boxy=form.cleaned_data["boxy"]             
236              task.boxz=form.cleaned_data["boxz"]             
237
238              seq,task.ssbond=from_pdb(task.myfile1)
239              task.md_seq=""
240              for i in range(0,len(seq),40):
241                 task.md_seq=task.md_seq+seq[i:i+40]+" "
242                                                            
243              task.ready=True
244              
245              task.save()
246              if is_lazy_user(request.user):
247               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
248              else:
249               return redirect('/')
250     else:
251         data= {'name':task.name}
252         form = TaskForm_min_a(initial=data)
253     basic_adv=False
254     p_type='minimization - advanced options'
255     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
256
257 @login_required
258 def add_md(request,task_id):
259     task = get_object_or_404(Task, id=task_id)
260     if request.method == 'POST':
261      if '_example' in request.POST:
262         data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
263         'md_pdbref':True,'md_temp':200}
264         form = TaskForm_md(initial=data)     
265      else:
266         form = TaskForm_md(request.POST,request.FILES)
267         if form.is_valid():
268              task.name=form.cleaned_data["name"]
269              task.type="md"
270              task.md_seed=form.cleaned_data["md_seed"]
271              task.md_start=form.cleaned_data["md_start"]
272              task.md_temp=form.cleaned_data["md_temp"]
273              task.md_nstep=form.cleaned_data["md_nstep"]
274
275              basename = str(task.owner)
276              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
277              task.jobdirname = "_".join([basename, suffix])
278
279              pdbid=form.cleaned_data["pdbid"]
280              if pdbid:
281               os.mkdir(task.jobdirname)
282               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
283                      task.jobdirname+'/plik.pdb')     
284               task.pdbcode=pdbid
285              else:
286               task.myfile1=form.cleaned_data["file1"]
287              task.md_pdbref=form.cleaned_data["md_pdbref"]             
288
289              task.md_seq=""
290              if task.md_start == "pdbstart" or task.md_pdbref:
291                seq,task.ssbond=from_pdb(task.myfile1)
292              else:
293                seq=seq_add_x(form.cleaned_data["md_seq"])
294                        
295              for i in range(0,len(seq),40):
296                 task.md_seq=task.md_seq+seq[i:i+40]+" "
297              
298              if task.md_start != "pdbstart":
299                 task.ssbond=''
300
301              task.ready=True
302              
303              task.save()
304              if is_lazy_user(request.user):
305               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
306              else:
307               return redirect('/')
308     else:
309         data= {'name':task.name}
310         form = TaskForm_md(initial=data)
311     basic_adv=True
312     p_type='molecular dynamics'
313     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
314
315 @login_required
316 def add_md_a(request,task_id):
317     task = get_object_or_404(Task, id=task_id)
318     if request.method == 'POST':
319      if '_example' in request.POST:
320         data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
321          'md_pdbref':True,'md_mdpdb':True}
322         form = TaskForm_md_a(initial=data)     
323      else:
324         form = TaskForm_md_a(request.POST,request.FILES)
325         if form.is_valid():
326              task.name=form.cleaned_data["name"]
327              task.type="md"
328
329              basename = str(task.owner)
330              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
331              task.jobdirname = "_".join([basename, suffix])
332
333              pdbid=form.cleaned_data["pdbid"]
334              if pdbid:
335               os.mkdir(task.jobdirname)
336               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
337                      task.jobdirname+'/plik.pdb')     
338               task.pdbcode=pdbid
339              else:
340               task.myfile1=form.cleaned_data["file1"]
341              task.md_start=form.cleaned_data["md_start"]
342              task.md_pdbref=form.cleaned_data["md_pdbref"]             
343
344              task.md_seq=""
345              if task.md_start == "pdbstart" or task.md_pdbref:
346                seq,task.ssbond=from_pdb(task.myfile1)
347                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
348              else:
349                seq=seq_add_x(form.cleaned_data["md_seq"])
350                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
351
352              for i in range(0,len(seq),40):
353                 task.md_seq=task.md_seq+seq[i:i+40]+" "
354
355              if task.md_start != "pdbstart":
356                 task.ssbond=''
357
358              task.md_seed=form.cleaned_data["md_seed"]
359
360              task.md_temp=form.cleaned_data["md_temp"]
361              task.md_nstep=form.cleaned_data["md_nstep"]
362              task.md_ntwe=form.cleaned_data["md_ntwe"]
363              task.md_ntwx=form.cleaned_data["md_ntwx"]
364              task.md_dt=form.cleaned_data["md_dt"]
365              task.md_lang=form.cleaned_data["md_lang"]
366              task.md_tau=form.cleaned_data["md_tau"]
367              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
368              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
369              task.unres_ff=form.cleaned_data["unres_ff"]
370              task.md_respa=form.cleaned_data["md_respa"]             
371              task.boxx=form.cleaned_data["boxx"]
372              task.boxy=form.cleaned_data["boxy"]             
373              task.boxz=form.cleaned_data["boxz"]             
374
375              
376              task.ready=True
377              
378              task.save()
379              if is_lazy_user(request.user):
380               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
381              else:
382               return redirect('/')
383     else:
384         data= {'name':task.name}
385         form = TaskForm_md_a(initial=data)
386     basic_adv=False
387     p_type='molecular dynamics - advanced options'
388     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
389
390 @login_required
391 def add_remd(request,task_id):
392     task = get_object_or_404(Task, id=task_id)
393     if request.method == 'POST':
394      if '_example' in request.POST:
395         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True}
396         form = TaskForm_remd(initial=data)     
397      else:
398         form = TaskForm_remd(request.POST,request.FILES)
399         if form.is_valid():
400              task.name=form.cleaned_data["name"]
401              task.type="remd"
402              task.md_start=form.cleaned_data["md_start"]
403
404              basename = str(task.owner)
405              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
406              task.jobdirname = "_".join([basename, suffix])
407
408              pdbid=form.cleaned_data["pdbid"]
409              if pdbid:
410               os.mkdir(task.jobdirname)
411               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
412                      task.jobdirname+'/plik.pdb')     
413               task.pdbcode=pdbid
414              else:
415               task.myfile1=form.cleaned_data["file1"]
416              task.md_pdbref=form.cleaned_data["md_pdbref"]
417              task.md_ntwx=task.remd_nstex 
418
419              task.md_seq=""
420              if task.md_start == "pdbstart" or task.md_pdbref:
421                seq,task.ssbond=from_pdb(task.myfile1)
422              else:
423                seq=seq_add_x(form.cleaned_data["md_seq"])
424              for i in range(0,len(seq),40):
425                 task.md_seq=task.md_seq+seq[i:i+40]+" "
426
427              if task.md_start != "pdbstart":
428                 task.ssbond=''
429
430              task.md_seed=form.cleaned_data["md_seed"]
431
432              task.md_nstep=form.cleaned_data["md_nstep"]
433
434
435              task.ready=True
436              
437              
438              task.save()
439              if is_lazy_user(request.user):
440               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
441              else:
442               return redirect('/')
443     else:
444         data= {'name':task.name}
445         form = TaskForm_remd(initial=data)
446     basic_adv=True
447     p_type='replica exchange molecular dynamics'
448     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
449
450 @login_required
451 def add_remd_a(request,task_id):
452     from django.core.files.uploadedfile import UploadedFile
453     task = get_object_or_404(Task, id=task_id)
454     if request.method == 'POST':
455      if '_example' in request.POST:
456         data= {'name':task.name,'pdbid':'1E0G','md_pdbref':True,
457          'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2',
458          'remd_cluter_temp':280}
459         form = TaskForm_remd_a(initial=data)     
460      elif '_example_saxs' in request.POST:
461         data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
462          'md_nstep':200000,'md_lang':'langevin','unres_ff':'E0LL2Y',
463          'remd_cluter_temp':270, 
464          'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
465 """ 0.5     1.33868e-02
466  1.5     1.95880e-02
467  2.5     2.68896e-02
468  3.5     3.43737e-02
469  4.5     4.07099e-02
470  5.5     4.47875e-02
471  6.5     4.63486e-02
472  7.5     4.60514e-02
473  8.5     4.49130e-02
474  9.5     4.36744e-02
475 10.5     4.26085e-02
476 11.5     4.17464e-02
477 12.5     4.11217e-02
478 13.5     4.07835e-02
479 14.5     4.06776e-02
480 15.5     4.06060e-02
481 16.5     4.03241e-02
482 17.5     3.96655e-02
483 18.5     3.85756e-02
484 19.5     3.70537e-02
485 20.5     3.50982e-02
486 21.5     3.27236e-02
487 22.5     3.00046e-02
488 23.5     2.70643e-02
489 24.5     2.40044e-02
490 25.5     2.08595e-02
491 26.5     1.76342e-02
492 27.5     1.43802e-02
493 28.5     1.12281e-02
494 29.5     8.34574e-03
495 30.5     5.87354e-03
496 31.5     3.88732e-03
497 32.5     2.39755e-03
498 33.5     1.36323e-03
499 34.5     7.06686e-04
500 35.5     3.30592e-04
501 36.5     1.38359e-04"""}
502         form = TaskForm_remd_a(initial=data)     
503      else:
504         form = TaskForm_remd_a(request.POST,request.FILES)
505         if form.is_valid():
506              task.name=form.cleaned_data["name"]
507              task.type="remd"
508
509              basename = str(task.owner)
510              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
511              task.jobdirname = "_".join([basename, suffix])
512
513              pdbid=form.cleaned_data["pdbid"]
514              if pdbid:
515               os.mkdir(task.jobdirname)
516               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
517                      task.jobdirname+'/plik.pdb')     
518               task.pdbcode=pdbid
519              else:
520               task.myfile1=form.cleaned_data["file1"]
521              task.md_start=form.cleaned_data["md_start"]  
522              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
523
524              task.md_seq=""
525              if task.md_start == "pdbstart" or task.md_pdbref:
526                seq,task.ssbond=from_pdb(task.myfile1)
527                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
528              else:
529                seq=seq_add_x(form.cleaned_data["md_seq"])
530                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
531
532              for i in range(0,len(seq),40):
533                 task.md_seq=task.md_seq+seq[i:i+40]+" "
534
535              if task.md_start != "pdbstart":
536                 task.ssbond=''
537
538              task.md_seed=form.cleaned_data["md_seed"]
539              task.md_nstep=form.cleaned_data["md_nstep"]
540              task.md_dt=form.cleaned_data["md_dt"]
541              task.md_lang=form.cleaned_data["md_lang"]
542              task.md_tau=form.cleaned_data["md_tau"]
543              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
544              task.remd_nrep=form.cleaned_data["remd_nrep"]
545              task.remd_nstex=form.cleaned_data["remd_nstex"]
546              task.md_ntwx=form.cleaned_data["md_ntwx"]             
547              task.md_ntwe=form.cleaned_data["md_ntwe"]
548              task.md_respa=form.cleaned_data["md_respa"]
549 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
550 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
551
552              task.boxx=form.cleaned_data["boxx"]
553              task.boxy=form.cleaned_data["boxy"]             
554              task.boxz=form.cleaned_data["boxz"]             
555
556              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
557              task.unres_ff=form.cleaned_data["unres_ff"]
558              
559              task.scal_rad = form.cleaned_data["scal_rad"]
560              task.saxs_data = form.cleaned_data["saxs_data"]
561              task.wsaxs = form.cleaned_data["wsaxs"]
562              
563              task.save()
564              return redirect('addmlist',task_id=task.id)
565     else:
566         data= {'name':task.name}
567         form = TaskForm_remd_a(initial=data)
568     basic_adv=False
569     p_type='replica exchange molecular dynamics - advanced options'
570     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
571
572 @login_required
573 def addmlist(request,task_id):
574     task = get_object_or_404(Task, id=task_id)
575     if request.method == 'POST':
576         form = TaskForm_list(task.remd_nrep,request.POST)
577         if form.is_valid():
578              task.remd_multi_t=form.cleaned_data["temperatures"]
579              task.remd_multi_m=form.cleaned_data["multiplexing"]             
580              task.ready=True
581              
582              task.save()
583              if is_lazy_user(request.user):
584               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
585              else:
586               return redirect('/')
587     else:
588       if task.unres_ff == 'E0LL2Y':
589         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
590         '["1", "1", "1", "1", "1", "1", "1", "1"]',
591         'temperatures':
592         '["270", "280", "290", "300", "310", "320", "330", "345"]'
593         }
594       else: 
595         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
596         '["1", "1", "1", "1", "1", "1", "1", "1"]',
597         'temperatures':
598         '["250", "260", "270", "280", "290", "300", "315", "330"]'
599         }
600       
601       form = TaskForm_list(task.remd_nrep,initial=data)
602     p_type='replica exchange molecular dynamics - advanced options'
603     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
604
605 @login_required
606 def details(request,task_id):
607     task = get_object_or_404(Task, id=task_id)
608     return render(request, "details.html",{'task':task})
609
610
611 def details1(request,user_id,task_id):
612     task = get_object_or_404(Task, id=task_id)
613     return render(request, "details1.html",{'task':task})
614
615
616 @login_required
617 def delete(request, task_id):
618     Task.objects.get(id=task_id).delete()
619     return redirect('/')
620
621 def refresh_done1(request, task_id):
622     task = get_object_or_404(Task, id=task_id)
623     user = task.owner
624     refresh_done0(task)
625
626     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
627     njob=0
628     nq=0
629     for line in proc.stdout:
630       if 'piasek4' in line:
631         if line.split()[1]=='test_server':
632           njob+=1
633           if line.split()[-2]=='Q':
634             nq+=1
635     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
636
637     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
638
639
640 @login_required
641 def refresh_done(request):
642     user = request.user
643     tasks = Task.objects.filter(owner=user).order_by('-created_date')
644     alldone = 1
645     for task in tasks:
646       refresh_done0(task)
647       if not task.done:
648          alldone=0
649
650     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
651     njob=0
652     nq=0
653     for line in proc.stdout:
654       if 'piasek4' in line:
655         if line.split()[1]=='test_server':
656           njob+=1
657           if line.split()[-2]=='Q':
658             nq+=1
659     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
660
661     if is_lazy_user(request.user):
662      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
663     else:
664      return render(request, "index.html", {
665                 'tasks': tasks ,
666                 'variable' : variable,
667                 'alldone': alldone
668                         })
669
670       
671 def refresh_done0(task):
672       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
673          task.done=True
674
675          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
676
677            if task.type=='min' or task.type=='md':
678              text=""
679              for line in f:
680                if 'ETOT' in line:
681                   task.etot=line.split()[1]
682
683                if 'RMS deviation' in line:
684                   text=text+line
685                   i=1
686                   for line1 in f:
687                      text=text+line1
688                      i+=1
689                      if i>6:
690                        break
691                if 'Total wall' in line:
692                   text=text+line
693                   
694            elif task.type=='remd':
695              j=0
696              text="Acceptance for replica exchanges and number of exchange attempts\n"
697              for line in f:
698                         
699                if 'ACC' in line:
700                     j+=1
701                     text=text+' '.join(line.split()[2:])+"\n"
702                     if j==task.remd_nrep:
703                        j=1
704                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
705
706                if 'Total wall' in line:
707                   text=text+line
708                        
709          task.results_text=text
710
711
712          if task.md_pdbref and task.type=='remd':
713          
714           for i in range(1,6):
715            try:
716             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
717                  line=f.readline()
718                  if i==1:
719                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
720                  elif i==2:
721                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
722                  elif i==3:
723                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
724                  elif i==4:
725                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
726                  elif i==5:
727                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
728            except EnvironmentError:
729             print 'file_wham_T*pdb open error'
730           for i in range(1,6):
731             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
732                text=''
733                for line in f:
734                  if 'RMSD of  the common residues=' in line:
735                    text=' RMSD='+line.split()[5]
736                  if 'TM-score    =' in line:
737                    text=text+' TMscore='+line.split()[2]
738                  if 'GDT-TS-score=' in line:
739                    text=text+' GDT_TS='+line.split()[1]
740                     
741                if i==1:
742                      task.remd_model1=task.remd_model1+text
743                elif i==2:
744                      task.remd_model2=task.remd_model2+text
745                elif i==3:
746                      task.remd_model3=task.remd_model3+text
747                elif i==4:
748                      task.remd_model4=task.remd_model4+text
749                elif i==5:
750                      task.remd_model5=task.remd_model5+text
751
752
753
754          if task.type=='remd':  
755           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
756
757            for line in f:
758              if 'sumprob' in line:
759                 i=0
760                 for line1 in f:
761                   i+=1
762                   if i>6:
763                        break
764                   if i==1:
765                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
766                   elif i==2:
767                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
768                   elif i==3:
769                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
770                   elif i==4:
771                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
772                   elif i==5:
773                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
774                      
775          
776
777          task.save()
778       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
779          if (task.type=='min'):
780            task.running =1
781          else:
782            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
783               line=''
784               for line in f:
785                 pass
786               if line != '':
787                 last = line.split()[0]
788               else:
789                 last = 0
790            task.running=int(1+int(last)*100.0/task.md_nstep)
791            if task.running>100:
792              task.running=100
793          task.save()
794
795     
796       return