4cbd2e590238df98bf3f5ea1dc462d3633704e25
[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 import random
13
14 res_codes = [
15                 # 20 canonical amino acids
16                 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
17                 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
18                 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
19                 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
20                 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
21                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
22                 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
23                 ('CYX', 'C'),
24                 ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
25                 ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
26                 ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
27                 ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
28                 ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),                
29                ]
30
31 three_to_one = dict(res_codes)
32
33 def load_pdbid(pdbid,dirname,filename='plik.pdb'):
34     if (not os.path.isdir(dirname)):
35        os.mkdir(dirname)
36     if len(pdbid)==4:
37        file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
38                      dirname+'/'+filename)     
39     else:
40        chain=pdbid[5]
41        pdbid=pdbid[:4]
42        pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
43        with open(dirname+'/'+filename, 'w') as outfile:
44         for line in pdb_tmp:
45           if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
46             outfile.write(line)
47           if line[0:6] == 'ATOM  ' and line[21] == chain:
48             outfile.write(line)
49           if line[0:6] == 'ENDMDL':
50             break
51        pdb_tmp.close()
52        file=dirname+'/'+filename
53        
54     return(file)
55
56
57 def seq_2d_from_pdb(seq_2d,seq):
58     if seq_2d =='':
59       return(seq_2d)
60     seq_2d=seq_2d.replace('C', '-')
61     seq_2d_tmp=''
62     ii=0
63     for i in range(0,len(seq)):
64       if seq[i]=='X':
65          seq_2d_tmp=seq_2d_tmp+'-'
66       else:
67          if len(seq_2d)>ii:
68             seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
69             ii+=1
70     tmp=''
71     for i in range(0,len(seq_2d_tmp),40):
72       tmp=tmp+seq_2d_tmp[i:i+40]+" "
73     return(tmp)
74
75 def seq_2d_add_x(seq_2d,seq,seq_form):
76     if seq_2d =='':
77       return(seq_2d)
78     seq_2d=seq_2d[:len(seq_form)]
79     seq_2d=seq_2d.replace('C', '-')
80     if seq_form[0] !='X' and seq[0] == 'X':
81       seq_2d='-'+seq_2d
82     if seq_form[-1] !='X' and seq[-1] == 'X':
83       seq_2d=seq_2d+'-'
84     seq_2d=seq_2d[:len(seq)]
85     tmp=''
86     for i in range(0,len(seq_2d),40):
87       tmp=tmp+seq_2d[i:i+40]+" "
88     return(tmp)
89
90 def seq_add_x(sequence):
91     if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
92         sequence='X'+sequence
93     if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
94         sequence=sequence+'X'
95     set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
96     sequence = ''.join([c for c in sequence if c in set])
97
98     return(sequence)    
99
100 def from_pdb(file):
101     sequence = []
102     ssbond = []
103     ssbond_ch = []
104     ires = []
105     chain_start = {}
106     chain_end = {}
107     unres_shift = {}
108     chain_sorted=[]
109     newchain = True
110     i=''
111     for line in file:
112             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
113               aa = three_to_one.get(line[17:20])
114               i = int(line[22:26])
115               ch = line[21:22]
116               if newchain or i!=ires[-1]:
117                 sequence.append(aa)
118                 ires.append(i)
119                 if newchain:
120                  chain_start[ch]=i
121                  chain_sorted.extend(ch)
122                  newchain = False
123             if line[0:3] == 'TER' and i != '':
124               sequence.append('XX')
125               chain_end[ch]=i
126               newchain = True
127             if line[0:6] == 'SSBOND':
128               b=[]
129               b.append(int(line[17:21]))
130               b.append(int(line[31:35]))
131               ssbond.append(b)
132               c = []
133               c.append((line[15:16]))
134               c.append((line[29:30]))
135               ssbond_ch.append(c)                                                                      
136             if line[0:3] == 'END':
137               break
138     if not sequence[-1] == 'XX':
139             chain_end[ch]=i
140     while sequence[-1] == 'XX':
141             del sequence[-1]
142     if sequence[0] != 'G':
143             sequence.insert(0,'X')
144             ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
145     if sequence[-1] != 'G':
146             sequence.append('X')
147     seq=''.join(sequence)
148 #    if ires[0] != 1:
149 #            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
150     i=0
151     for c in chain_sorted:
152       unres_shift[c]=i+chain_start[c]
153       i=i-(chain_end[c]-chain_start[c])-3
154     ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]     
155
156     return seq,json.dumps(ssbond)
157
158
159 @login_required
160 def index(request):
161     user = request.user
162     tasks = Task.objects.filter(owner=user).order_by('-created_date')
163     variable = ''
164     tasks_count = Task.objects.filter(owner=user).count()
165     return render(request, "index.html", {
166             'tasks': tasks, 'alldone': 0, 'tasks_count':tasks_count
167         })
168
169 @login_required
170 def add(request):
171     if request.method == 'POST':
172         form = TaskForm(request.POST)
173         if form.is_valid():
174             name = form.cleaned_data["name"]
175             user = request.user
176             task = Task(name=name,owner=user,ready=False)
177             task.save()
178             return redirect('add_min',task_id=task.id)
179     return redirect('/')
180
181 @login_required
182 def add_min(request,task_id):
183     task = get_object_or_404(Task, id=task_id)
184     if request.method == 'POST':
185      if '_example' in request.POST:
186         data= {'name':task.name,'pdbid':'1BDD'}
187         form = TaskForm_min(initial=data)     
188      else:
189         form = TaskForm_min(request.POST,request.FILES)
190         if form.is_valid():
191              task.name=form.cleaned_data["name"]
192              task.type="min"
193              pdbid=form.cleaned_data["pdbid"]
194
195              basename = str(task.owner)
196              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
197              task.jobdirname = "_".join([basename, suffix])
198
199              if pdbid:
200               task.myfile1=load_pdbid(pdbid,task.jobdirname)
201               task.pdbcode=pdbid
202              else:
203               task.myfile1=form.cleaned_data["file1"]
204
205              seq,task.ssbond=from_pdb(task.myfile1)
206              task.md_seq=""
207              for i in range(0,len(seq),40):
208                     task.md_seq=task.md_seq+seq[i:i+40]+" "
209
210              task.ready=True
211              
212              task.save()
213              if is_lazy_user(request.user):
214               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
215              else:
216               return redirect('/')
217     else:
218         data= {'name':task.name}
219         form = TaskForm_min(initial=data)
220     p_type='minimization'
221     basic_adv=True    
222     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
223
224 @login_required
225 def add_min_a(request,task_id):
226     task = get_object_or_404(Task, id=task_id)
227     if request.method == 'POST':
228      if '_example' in request.POST:
229         data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
230         form = TaskForm_min_a(initial=data)     
231      else:
232         form = TaskForm_min_a(request.POST,request.FILES)
233         if form.is_valid():
234              task.name=form.cleaned_data["name"]
235              task.type="min"
236 #             task.min_choice=form.cleaned_data["min_choice"]
237              task.min_overlap=form.cleaned_data["min_overlap"]
238              task.min_searchsc=form.cleaned_data["min_searchsc"]
239              task.min_maxmin=form.cleaned_data["min_maxmin"]
240              task.min_maxfun=form.cleaned_data["min_maxfun"]
241              task.min_pdbout=form.cleaned_data["min_pdbout"]
242
243              basename = str(task.owner)
244              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
245              task.jobdirname = "_".join([basename, suffix])
246              
247              pdbid=form.cleaned_data["pdbid"]
248              if pdbid:
249               task.myfile1=load_pdbid(pdbid,task.jobdirname)
250               task.pdbcode=pdbid
251              else:
252               task.myfile1=form.cleaned_data["file1"]
253
254              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
255              task.unres_ff=form.cleaned_data["unres_ff"]
256              task.boxx=form.cleaned_data["boxx"]
257              task.boxy=form.cleaned_data["boxy"]             
258              task.boxz=form.cleaned_data["boxz"]             
259
260              seq,task.ssbond=from_pdb(task.myfile1)
261              task.md_seq=""
262              for i in range(0,len(seq),40):
263                 task.md_seq=task.md_seq+seq[i:i+40]+" "
264                                                            
265              task.ready=True
266              
267              task.save()
268              if is_lazy_user(request.user):
269               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
270              else:
271               return redirect('/')
272     else:
273         data= {'name':task.name}
274         form = TaskForm_min_a(initial=data)
275     basic_adv=False
276     p_type='minimization - advanced options'
277     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
278
279 @login_required
280 def add_md(request,task_id):
281     task = get_object_or_404(Task, id=task_id)
282     if request.method == 'POST':
283      if '_example' in request.POST:
284         data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
285         'md_pdbref':True,'md_temp':200,'md_seed':-39912345}
286         form = TaskForm_md(initial=data)     
287      else:
288         form = TaskForm_md(request.POST,request.FILES)
289         if form.is_valid():
290              task.name=form.cleaned_data["name"]
291              task.type="md"
292              task.md_seed=form.cleaned_data["md_seed"]
293              task.md_start=form.cleaned_data["md_start"]
294              task.md_temp=form.cleaned_data["md_temp"]
295              task.md_nstep=form.cleaned_data["md_nstep"]
296              task.md_total_steps=task.md_nstep
297              if task.md_nstep<250000:
298                  task.md_ntwx=100
299
300              basename = str(task.owner)
301              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
302              task.jobdirname = "_".join([basename, suffix])
303
304              pdbid=form.cleaned_data["pdbid"]
305              if pdbid:
306               task.myfile1=load_pdbid(pdbid,task.jobdirname)
307               task.pdbcode=pdbid
308              else:
309               task.myfile1=form.cleaned_data["file1"]
310              task.md_pdbref=form.cleaned_data["md_pdbref"]             
311
312              task.md_seq=""
313              if task.md_start == "pdbstart" or task.md_pdbref:
314                seq,task.ssbond=from_pdb(task.myfile1)
315              else:
316                seq=seq_add_x(form.cleaned_data["md_seq"])
317                        
318              for i in range(0,len(seq),40):
319                 task.md_seq=task.md_seq+seq[i:i+40]+" "
320              
321              if task.md_start != "pdbstart":
322                 task.ssbond=''
323
324              if any(c.islower() for c in seq):
325               task.md_respa=False
326               task.damino=True
327
328              task.ready=True
329              
330              task.save()
331              if is_lazy_user(request.user):
332               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
333              else:
334               return redirect('/')
335     else:
336         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
337         form = TaskForm_md(initial=data)
338     basic_adv=True
339     p_type='molecular dynamics'
340     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
341
342 @login_required
343 def add_md_a(request,task_id):
344     task = get_object_or_404(Task, id=task_id)
345     if request.method == 'POST':
346      if '_example' in request.POST:
347         data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
348          'md_pdbref':True,'md_mdpdb':True,'md_seed':-39912345}
349         form = TaskForm_md_a(initial=data)     
350      else:
351         form = TaskForm_md_a(request.POST,request.FILES)
352         if form.is_valid():
353              task.name=form.cleaned_data["name"]
354              task.type="md"
355
356              basename = str(task.owner)
357              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
358              task.jobdirname = "_".join([basename, suffix])
359
360              pdbid=form.cleaned_data["pdbid"]
361              if pdbid:
362               task.myfile1=load_pdbid(pdbid,task.jobdirname)
363               task.pdbcode=pdbid
364              else:
365               task.myfile1=form.cleaned_data["file1"]
366              task.md_start=form.cleaned_data["md_start"]
367              task.md_pdbref=form.cleaned_data["md_pdbref"]             
368
369              task.md_seq=""
370              if task.md_start == "pdbstart" or task.md_pdbref:
371                seq,task.ssbond=from_pdb(task.myfile1)
372                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
373              else:
374                seq=seq_add_x(form.cleaned_data["md_seq"])
375                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
376
377              for i in range(0,len(seq),40):
378                 task.md_seq=task.md_seq+seq[i:i+40]+" "
379
380              if task.md_start != "pdbstart":
381                 task.ssbond=''
382
383              task.md_seed=form.cleaned_data["md_seed"]
384
385              task.md_temp=form.cleaned_data["md_temp"]
386              task.md_nstep=form.cleaned_data["md_nstep"]
387              task.md_total_steps=task.md_nstep
388              task.md_ntwe=form.cleaned_data["md_ntwe"]
389              task.md_ntwx=form.cleaned_data["md_ntwx"]
390              task.md_dt=form.cleaned_data["md_dt"]
391              task.md_lang=form.cleaned_data["md_lang"]
392              task.md_tau=form.cleaned_data["md_tau"]
393              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
394              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
395              task.unres_ff=form.cleaned_data["unres_ff"]
396              task.md_respa=form.cleaned_data["md_respa"]             
397              if any(c.islower() for c in seq):
398               task.md_respa=False
399               task.damino=True
400              task.boxx=form.cleaned_data["boxx"]
401              task.boxy=form.cleaned_data["boxy"]             
402              task.boxz=form.cleaned_data["boxz"]             
403
404              
405              task.ready=True
406              
407              task.save()
408              if is_lazy_user(request.user):
409               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
410              else:
411               return redirect('/')
412     else:
413         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
414         form = TaskForm_md_a(initial=data)
415     basic_adv=False
416     p_type='molecular dynamics - advanced options'
417     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
418
419 @login_required
420 def add_remd(request,task_id):
421     task = get_object_or_404(Task, id=task_id)
422     if request.method == 'POST':
423      if '_example' in request.POST:
424         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
425         form = TaskForm_remd(initial=data)     
426      else:
427         form = TaskForm_remd(request.POST,request.FILES)
428         if form.is_valid():
429              task.name=form.cleaned_data["name"]
430              task.type="remd"
431              task.md_start=form.cleaned_data["md_start"]
432
433              basename = str(task.owner)
434              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
435              task.jobdirname = "_".join([basename, suffix])
436
437              pdbid=form.cleaned_data["pdbid"]
438              if pdbid:
439               task.myfile1=load_pdbid(pdbid,task.jobdirname)
440               task.pdbcode=pdbid
441              else:
442               task.myfile1=form.cleaned_data["file1"]
443              task.md_pdbref=form.cleaned_data["md_pdbref"]
444              task.md_ntwx=task.remd_nstex 
445
446              task.md_seq=""
447              if task.md_start == "pdbstart" or task.md_pdbref:
448                seq,task.ssbond=from_pdb(task.myfile1)
449              else:
450                seq=seq_add_x(form.cleaned_data["md_seq"])
451              for i in range(0,len(seq),40):
452                 task.md_seq=task.md_seq+seq[i:i+40]+" "
453
454              if task.md_start != "pdbstart":
455                 task.ssbond=''
456
457              task.md_seed=form.cleaned_data["md_seed"]
458
459              task.md_nstep=form.cleaned_data["md_nstep"]
460              task.md_total_steps=task.md_nstep
461
462              if any(c.islower() for c in seq):
463               task.md_respa=False
464               task.damino=True
465
466
467              task.ready=True
468              
469              
470              task.save()
471              if is_lazy_user(request.user):
472               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
473              else:
474               return redirect('/')
475     else:
476         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
477         form = TaskForm_remd(initial=data)
478     basic_adv=True
479     p_type='replica exchange molecular dynamics'
480     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
481
482 @login_required
483 def add_remd_a(request,task_id):
484     from django.core.files.uploadedfile import UploadedFile
485     task = get_object_or_404(Task, id=task_id)
486     if request.method == 'POST':
487      if '_example' in request.POST:
488         data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
489          'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2','md_seed':-39912345,
490          'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
491         form = TaskForm_remd_a(initial=data)    
492         task.example='casp12'
493         task.save() 
494      elif '_example_saxs' in request.POST:
495         data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
496          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
497          'remd_cluter_temp':270, 
498          'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
499 """ 0.5     1.33868e-02
500  1.5     1.95880e-02
501  2.5     2.68896e-02
502  3.5     3.43737e-02
503  4.5     4.07099e-02
504  5.5     4.47875e-02
505  6.5     4.63486e-02
506  7.5     4.60514e-02
507  8.5     4.49130e-02
508  9.5     4.36744e-02
509 10.5     4.26085e-02
510 11.5     4.17464e-02
511 12.5     4.11217e-02
512 13.5     4.07835e-02
513 14.5     4.06776e-02
514 15.5     4.06060e-02
515 16.5     4.03241e-02
516 17.5     3.96655e-02
517 18.5     3.85756e-02
518 19.5     3.70537e-02
519 20.5     3.50982e-02
520 21.5     3.27236e-02
521 22.5     3.00046e-02
522 23.5     2.70643e-02
523 24.5     2.40044e-02
524 25.5     2.08595e-02
525 26.5     1.76342e-02
526 27.5     1.43802e-02
527 28.5     1.12281e-02
528 29.5     8.34574e-03
529 30.5     5.87354e-03
530 31.5     3.88732e-03
531 32.5     2.39755e-03
532 33.5     1.36323e-03
533 34.5     7.06686e-04
534 35.5     3.30592e-04
535 36.5     1.38359e-04"""}
536         form = TaskForm_remd_a(initial=data)     
537      elif '_example_saxs1' in request.POST:
538         data= {'name':task.name,'pdbid':'2KMS','md_pdbref':True,'md_start':'pdbstart',
539         'md_2d':'----EEEEEE-EEEEE-------EEEEEEEEE--EEEEEE-EEEE---EEEEEEEEE-----EEEEEEE-EEE-HHHHH-EEEE-EEEEEEEEE----EEEEEE---EEE-----',
540          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
541          'remd_cluter_temp':280, 'min_maxfun':50,
542          'scal_rad':5.0,'wsaxs':1000.0,'saxs_data':
543 """0.7100E-00 0.2036E-03
544 0.1420E+01 0.4221E-03
545 0.2130E+01 0.6548E-03
546 0.2840E+01 0.9001E-03
547 0.3550E+01 0.1156E-02
548 0.4260E+01 0.1421E-02
549 0.4970E+01 0.1692E-02
550 0.5680E+01 0.1965E-02
551 0.6390E+01 0.2239E-02
552 0.7100E+01 0.2509E-02
553 0.7810E+01 0.2772E-02
554 0.8520E+01 0.3025E-02
555 0.9230E+01 0.3265E-02
556 0.9940E+01 0.3489E-02
557 0.1065E+02 0.3694E-02
558 0.1136E+02 0.3878E-02
559 0.1207E+02 0.4039E-02
560 0.1278E+02 0.4177E-02
561 0.1349E+02 0.4289E-02
562 0.1420E+02 0.4377E-02
563 0.1491E+02 0.4439E-02
564 0.1562E+02 0.4478E-02
565 0.1633E+02 0.4493E-02
566 0.1704E+02 0.4487E-02
567 0.1775E+02 0.4461E-02
568 0.1846E+02 0.4418E-02
569 0.1917E+02 0.4361E-02
570 0.1988E+02 0.4291E-02
571 0.2059E+02 0.4211E-02
572 0.2130E+02 0.4125E-02
573 0.2201E+02 0.4034E-02
574 0.2272E+02 0.3942E-02
575 0.2343E+02 0.3850E-02
576 0.2414E+02 0.3761E-02
577 0.2485E+02 0.3677E-02
578 0.2556E+02 0.3598E-02
579 0.2627E+02 0.3526E-02
580 0.2698E+02 0.3462E-02
581 0.2769E+02 0.3405E-02
582 0.2840E+02 0.3356E-02
583 0.2911E+02 0.3315E-02
584 0.2982E+02 0.3280E-02
585 0.3053E+02 0.3251E-02
586 0.3124E+02 0.3226E-02
587 0.3195E+02 0.3205E-02
588 0.3266E+02 0.3186E-02
589 0.3337E+02 0.3167E-02
590 0.3408E+02 0.3147E-02
591 0.3479E+02 0.3125E-02
592 0.3550E+02 0.3099E-02
593 0.3621E+02 0.3068E-02
594 0.3692E+02 0.3031E-02
595 0.3763E+02 0.2987E-02
596 0.3834E+02 0.2937E-02
597 0.3905E+02 0.2878E-02
598 0.3976E+02 0.2812E-02
599 0.4047E+02 0.2739E-02
600 0.4118E+02 0.2658E-02
601 0.4189E+02 0.2571E-02
602 0.4260E+02 0.2478E-02
603 0.4331E+02 0.2381E-02
604 0.4402E+02 0.2279E-02
605 0.4473E+02 0.2174E-02
606 0.4544E+02 0.2068E-02
607 0.4615E+02 0.1960E-02
608 0.4686E+02 0.1853E-02
609 0.4757E+02 0.1748E-02
610 0.4828E+02 0.1644E-02
611 0.4899E+02 0.1544E-02
612 0.4970E+02 0.1447E-02
613 0.5041E+02 0.1355E-02
614 0.5112E+02 0.1267E-02
615 0.5183E+02 0.1184E-02
616 0.5254E+02 0.1106E-02
617 0.5325E+02 0.1033E-02
618 0.5396E+02 0.9646E-03
619 0.5467E+02 0.9008E-03
620 0.5538E+02 0.8411E-03
621 0.5609E+02 0.7852E-03
622 0.5680E+02 0.7327E-03
623 0.5751E+02 0.6831E-03
624 0.5822E+02 0.6360E-03
625 0.5893E+02 0.5909E-03
626 0.5964E+02 0.5475E-03
627 0.6035E+02 0.5055E-03
628 0.6106E+02 0.4646E-03
629 0.6177E+02 0.4245E-03
630 0.6248E+02 0.3853E-03
631 0.6319E+02 0.3467E-03
632 0.6390E+02 0.3089E-03
633 0.6461E+02 0.2719E-03
634 0.6532E+02 0.2357E-03
635 0.6603E+02 0.2007E-03
636 0.6674E+02 0.1669E-03
637 0.6745E+02 0.1345E-03
638 0.6816E+02 0.1038E-03
639 0.6887E+02 0.7482E-04
640 0.6958E+02 0.4782E-04
641 0.7029E+02 0.2286E-04"""}
642         form = TaskForm_remd_a(initial=data)     
643      else:
644         form = TaskForm_remd_a(request.POST,request.FILES)
645         if form.is_valid():
646              task.name=form.cleaned_data["name"]
647              task.type="remd"
648
649              basename = str(task.owner)
650              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
651              task.jobdirname = "_".join([basename, suffix])
652
653              pdbid=form.cleaned_data["pdbid"]
654              if pdbid:
655               task.myfile1=load_pdbid(pdbid,task.jobdirname)
656               task.pdbcode=pdbid
657              else:
658               task.myfile1=form.cleaned_data["file1"]
659              task.md_start=form.cleaned_data["md_start"]  
660              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
661
662              task.md_seq=""
663              if task.md_start == "pdbstart" or task.md_pdbref:
664                seq,task.ssbond=from_pdb(task.myfile1)
665                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
666              else:
667                seq=seq_add_x(form.cleaned_data["md_seq"])
668                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
669
670              for i in range(0,len(seq),40):
671                 task.md_seq=task.md_seq+seq[i:i+40]+" "
672
673              if task.md_start != "pdbstart":
674                 task.ssbond=''
675
676              task.md_seed=form.cleaned_data["md_seed"]
677              task.md_nstep=form.cleaned_data["md_nstep"]
678              task.md_total_steps=task.md_nstep
679              task.md_dt=form.cleaned_data["md_dt"]
680              task.md_lang=form.cleaned_data["md_lang"]
681              task.md_tau=form.cleaned_data["md_tau"]
682              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
683              task.min_maxfun=form.cleaned_data["min_maxfun"]
684              task.remd_nrep=form.cleaned_data["remd_nrep"]
685              task.remd_nstex=form.cleaned_data["remd_nstex"]
686              task.md_ntwx=form.cleaned_data["md_ntwx"]             
687              task.md_ntwe=form.cleaned_data["md_ntwe"]
688              task.md_respa=form.cleaned_data["md_respa"]
689              if any(c.islower() for c in seq):
690               task.md_respa=False
691               task.damino=True
692              
693 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
694 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
695
696              task.boxx=form.cleaned_data["boxx"]
697              task.boxy=form.cleaned_data["boxy"]             
698              task.boxz=form.cleaned_data["boxz"]             
699
700              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
701              task.unres_ff=form.cleaned_data["unres_ff"]
702              
703              task.scal_rad = form.cleaned_data["scal_rad"]
704              task.saxs_data = form.cleaned_data["saxs_data"]
705              task.wsaxs = form.cleaned_data["wsaxs"]
706              
707              task.save()
708              return redirect('addmlist',task_id=task.id)
709     else:
710         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
711         form = TaskForm_remd_a(initial=data)
712     basic_adv=False
713     p_type='replica exchange molecular dynamics - advanced options'
714     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
715
716 @login_required
717 def add_dock(request,task_id):
718     task = get_object_or_404(Task, id=task_id)
719     if request.method == 'POST':
720      if '_example' in request.POST:
721         data= {'name':task.name,'pdbid':'1BON:A','pdbid2':'1BON:B','md_seed':-12396738,'md_nstep':500000}
722         form = TaskForm_dock(initial=data)     
723      else:
724         form = TaskForm_dock(request.POST,request.FILES)
725         if form.is_valid():
726              task.name=form.cleaned_data["name"]
727              task.type="dock"
728
729              basename = str(task.owner)
730              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
731              task.jobdirname = "_".join([basename, suffix])
732
733              pdbid=form.cleaned_data["pdbid"]
734              if pdbid:
735               task.myfile1=load_pdbid(pdbid,task.jobdirname)
736               task.pdbcode=pdbid
737              else:
738               task.myfile1=form.cleaned_data["file1"]
739
740              pdbid2=form.cleaned_data["pdbid2"]
741              if pdbid2:
742               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
743               task.pdbcode2=pdbid2
744              else:
745               task.myfile2=form.cleaned_data["file2"]
746
747              task.md_ntwx=task.remd_nstex 
748              task.md_start="pdbstart"
749              task.remd_multi_m='["3", "3", "3", "3", "3", "3", "3", "3"]'
750              task.md_pdbref=True
751              task.md_respa=False
752              task.ssbond=""
753
754              task.md_seq=""
755
756              seq1,ssbond1=from_pdb(task.myfile1)
757              seq2,ssbond2=from_pdb(task.myfile2)
758              
759              if seq1[-1]=='X' and seq2[0]=='X':
760               seq=seq1+seq2
761              elif seq1[-1]!='X' and seq2[0]!='X':
762               seq=seq1+'XX'+seq2
763              else:
764               seq=seq1+'X'+seq2
765              
766              for i in range(0,len(seq),40):
767                 task.md_seq=task.md_seq+seq[i:i+40]+" "
768
769              task.md_seed=form.cleaned_data["md_seed"]
770
771              task.md_nstep=form.cleaned_data["md_nstep"]
772              task.md_total_steps=task.md_nstep
773
774              if any(c.islower() for c in seq):
775               task.md_respa=False
776               task.damino=True
777
778
779              task.ready=True
780              
781              
782              task.save()
783              if is_lazy_user(request.user):
784               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
785              else:
786               return redirect('/')
787     else:
788         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
789         form = TaskForm_dock(initial=data)
790     basic_adv=True
791     p_type='docking'
792     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
793
794 @login_required
795 def add_dock_a(request,task_id):
796     task = get_object_or_404(Task, id=task_id)
797     if request.method == 'POST':
798      if '_example' in request.POST:
799         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
800         form = TaskForm_dock_a(initial=data)     
801      else:
802         form = TaskForm_dock_a(request.POST,request.FILES)
803         if form.is_valid():
804              task.name=form.cleaned_data["name"]
805              task.type="dock"
806
807              basename = str(task.owner)
808              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
809              task.jobdirname = "_".join([basename, suffix])
810
811              pdbid=form.cleaned_data["pdbid"]
812              if pdbid:
813               task.myfile1=load_pdbid(pdbid,task.jobdirname)
814               task.pdbcode=pdbid
815              else:
816               task.myfile1=form.cleaned_data["file1"]
817               
818              pdbid2=form.cleaned_data["pdbid2"]
819              if pdbid2:
820               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
821               task.pdbcode2=pdbid2
822              else:
823               task.myfile2=form.cleaned_data["file2"]
824
825              task.md_ntwx=task.remd_nstex 
826              task.md_start="pdbstart"
827              task.md_pdbref=True
828              task.md_respa=False
829              task.ssbond=""
830               
831              task.md_seq=""
832
833              seq1,ssbond1=from_pdb(task.myfile1)
834              seq2,ssbond2=from_pdb(task.myfile2)
835              
836              if seq1[-1]=='X' and seq2[0]=='X':
837               seq=seq1+seq2
838              elif seq1[-1]!='X' and seq2[0]!='X':
839               seq=seq1+'XX'+seq2
840              else:
841               seq=seq1+'X'+seq2
842              
843              for i in range(0,len(seq),40):
844                 task.md_seq=task.md_seq+seq[i:i+40]+" "
845
846              task.md_seed=form.cleaned_data["md_seed"]
847
848              task.md_nstep=form.cleaned_data["md_nstep"]
849              task.md_total_steps=task.md_nstep
850              
851              task.md_dt=form.cleaned_data["md_dt"]
852              task.md_lang=form.cleaned_data["md_lang"]
853              task.md_tau=form.cleaned_data["md_tau"]
854              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
855              task.min_maxfun=form.cleaned_data["min_maxfun"]
856              task.remd_nrep=form.cleaned_data["remd_nrep"]
857              task.remd_nstex=form.cleaned_data["remd_nstex"]
858              task.md_ntwx=form.cleaned_data["md_ntwx"]             
859              task.md_ntwe=form.cleaned_data["md_ntwe"]
860
861              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
862              task.unres_ff=form.cleaned_data["unres_ff"]
863
864              if any(c.islower() for c in seq):
865               task.md_respa=False
866               task.damino=True
867
868              task.save()
869              return redirect('addmlist',task_id=task.id)
870
871     else:
872         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
873         form = TaskForm_dock_a(initial=data)
874     basic_adv=False
875     p_type='docking - advanced options'
876     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
877
878
879
880 @login_required
881 def addmlist(request,task_id):
882     task = get_object_or_404(Task, id=task_id)
883     if request.method == 'POST':
884         form = TaskForm_list(task.remd_nrep,request.POST)
885         if form.is_valid():
886              task.remd_multi_t=form.cleaned_data["temperatures"]
887              task.remd_multi_m=form.cleaned_data["multiplexing"]             
888              task.ready=True
889              
890              task.save()
891              if is_lazy_user(request.user):
892               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
893              else:
894               return redirect('/')
895     else:
896       if task.example == 'casp12':
897         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
898         '["2", "2", "2", "2", "2", "2", "2", "2"]',
899         'temperatures':
900         '["270", "280", "290", "300", "310", "320", "330", "340"]'
901         }
902       elif task.unres_ff == 'FF2':
903         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
904         '["1", "1", "1", "1", "1", "1", "1", "1"]',
905         'temperatures':
906         '["270", "280", "290", "300", "310", "320", "330", "345"]'
907         }
908       else: 
909         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
910         '["1", "1", "1", "1", "1", "1", "1", "1"]',
911         'temperatures':
912         '["250", "260", "270", "280", "290", "300", "315", "330"]'
913         }
914       
915       form = TaskForm_list(task.remd_nrep,initial=data)
916     p_type='replica exchange molecular dynamics - advanced options'
917     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
918
919 @login_required
920 def details(request,task_id):
921     task = get_object_or_404(Task, id=task_id)
922     return render(request, "details.html",{'task':task})
923
924
925 def details1(request,user_id,task_id):
926     task = get_object_or_404(Task, id=task_id)
927     return render(request, "details1.html",{'task':task})
928
929
930 @login_required
931 def delete(request, task_id):
932     Task.objects.get(id=task_id).delete()
933     return redirect('/')
934     
935 @login_required
936 def restart(request, task_id):
937     task = get_object_or_404(Task, id=task_id)
938     restart0(task)
939     return redirect('/')
940    
941 def add_restart_inp():
942     with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
943         for line in f1:
944           if 'reset_vel=' in line:
945             f2.write('{:79}'.format('restart'+line[7:]))
946           else:
947             f2.write(line)
948     os.remove('file.inp')
949     os.rename('file.inp.tmp','file.inp')
950     return 
951     
952 def restart0(task):    
953     if os.path.isfile(task.jobdirname+'/finished'):    
954       os.remove(task.jobdirname+'/finished')
955     task.running =1
956     task.done=False
957     task.md_total_steps = task.md_total_steps+task.md_nstep
958     task.save()
959     if task.type == 'md':
960       os.chdir(task.jobdirname)
961       add_restart_inp()
962       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
963       os.chdir('..')
964     elif task.type == 'remd':
965       os.chdir(task.jobdirname)
966       add_restart_inp()
967       tmp1=json.loads(task.remd_multi_m)
968       nreplicas=sum(map(int, tmp1))
969       with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
970         for line in f1:
971           if 'rec_end=' in line:
972             rec=task.md_total_steps/task.md_ntwx
973             f2.write('nfile_cx=1 rec_start='+str(rec/10)
974                +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
975           elif 'isampl=' in line:
976             if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
977                 isampl=1
978             else:
979                 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
980             f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
981           else:
982             f2.write(line)
983       os.remove('file_wham.inp')
984       os.rename('file_wham.tmp','file_wham.inp')
985       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
986       os.chdir('..')
987     return
988
989 def restart1(request, user_id, task_id):
990     task = get_object_or_404(Task, id=task_id)
991     user = task.owner
992     restart0(task)
993     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
994     
995
996 def refresh_done1(request, task_id):
997     task = get_object_or_404(Task, id=task_id)
998     user = task.owner
999     refresh_done0(task)
1000
1001     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1002     njob=0
1003     nq=0
1004     for line in proc.stdout:
1005       if 'piasek4' in line:
1006         if line.split()[1]=='test_server':
1007           njob+=1
1008           if line.split()[-2]=='Q':
1009             nq+=1
1010     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1011
1012     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1013
1014
1015 @login_required
1016 def refresh_done(request):
1017     user = request.user
1018     tasks = Task.objects.filter(owner=user).order_by('-created_date')
1019     tasks_count = Task.objects.filter(owner=user).count()
1020     alldone = 1
1021     for task in tasks:
1022       refresh_done0(task)
1023       if not task.done:
1024          alldone=0
1025
1026     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1027     njob=0
1028     nq=0
1029     for line in proc.stdout:
1030       if 'piasek4' in line:
1031         if line.split()[1]=='test_server':
1032           njob+=1
1033           if line.split()[-2]=='Q':
1034             nq+=1
1035     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1036
1037     if is_lazy_user(request.user):
1038      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1039     else:
1040      return render(request, "index.html", {
1041                 'tasks': tasks ,
1042                 'variable' : variable,
1043                 'alldone': alldone,
1044                 'tasks_count':tasks_count
1045                         })
1046
1047       
1048 def refresh_done0(task):
1049       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1050          task.done=True
1051
1052          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1053
1054            if task.type=='min' or task.type=='md':
1055              text=""
1056              for line in f:
1057                if 'ETOT' in line:
1058                   task.etot=line.split()[1]
1059
1060                if 'RMS deviation' in line:
1061                   text=text+line
1062                   i=1
1063                   for line1 in f:
1064                      text=text+line1
1065                      i+=1
1066                      if i>6:
1067                        break
1068                if 'Total wall' in line:
1069                   text=text+line
1070                   
1071            elif task.type=='remd' or task.type=='dock':
1072              j=0
1073              text="Acceptance for replica exchanges and number of exchange attempts\n"
1074              for line in f:
1075                         
1076                if 'ACC' in line:
1077                     j+=1
1078                     text=text+' '.join(line.split()[2:])+"\n"
1079                     if j==task.remd_nrep:
1080                        j=1
1081                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1082
1083                if 'Total wall' in line:
1084                   text=text+line
1085                        
1086          task.results_text=text
1087
1088
1089          if task.md_pdbref and task.type=='remd' or task.type=='dock':
1090          
1091           for i in range(1,6):
1092            try:
1093             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
1094                  line=f.readline()
1095                  if i==1:
1096                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
1097                  elif i==2:
1098                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
1099                  elif i==3:
1100                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
1101                  elif i==4:
1102                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
1103                  elif i==5:
1104                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
1105            except EnvironmentError:
1106             print 'file_wham_T*pdb open error'
1107           for i in range(1,6):
1108             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1109                text=''
1110                for line in f:
1111                  if 'RMSD of  the common residues=' in line:
1112                    text=' RMSD='+line.split()[5]
1113                  if 'TM-score    =' in line:
1114                    text=text+' TMscore='+line.split()[2]
1115                  if 'GDT-TS-score=' in line:
1116                    text=text+' GDT_TS='+line.split()[1]
1117                     
1118                if i==1:
1119                      task.remd_model1=task.remd_model1+text
1120                elif i==2:
1121                      task.remd_model2=task.remd_model2+text
1122                elif i==3:
1123                      task.remd_model3=task.remd_model3+text
1124                elif i==4:
1125                      task.remd_model4=task.remd_model4+text
1126                elif i==5:
1127                      task.remd_model5=task.remd_model5+text
1128           
1129           if task.type=='dock':
1130            for i in range(1,6):
1131             with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
1132                text=''
1133                for line in f:
1134                  if 'Fnat' in line:
1135                    text=' Fnat='+line.split()[1]
1136                  if 'iRMS' in line:
1137                    text=text+' iRMS='+line.split()[1]
1138                  if 'LRMS' in line:
1139                    text=text+' LRMS='+line.split()[1]
1140                  if 'CAPRI' in line and not 'DockQ_CAPRI' in line:
1141                    text=text+' CAPRI='+line.split()[1]
1142                  if 'DockQ_CAPRI' in line:
1143                    text=text+' DockQ_CAPRI= '+line.split()[1]
1144                  if 'DockQ ' in line:
1145                    text=text+' DockQ='+line.split()[1]
1146
1147                if i==1:
1148                      task.remd_model1=task.remd_model1+text
1149                elif i==2:
1150                      task.remd_model2=task.remd_model2+text
1151                elif i==3:
1152                      task.remd_model3=task.remd_model3+text
1153                elif i==4:
1154                      task.remd_model4=task.remd_model4+text
1155                elif i==5:
1156                      task.remd_model5=task.remd_model5+text
1157
1158
1159          if task.type=='remd' or task.type=='dock':  
1160           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1161
1162            for line in f:
1163              if 'sumprob' in line:
1164                 i=0
1165                 for line1 in f:
1166                   i+=1
1167                   if i>6:
1168                        break
1169                   if i==1:
1170                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[-2]
1171                   elif i==2:
1172                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[-2]
1173                   elif i==3:
1174                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[-2]
1175                   elif i==4:
1176                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[-2]
1177                   elif i==5:
1178                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[-2]
1179                      
1180          
1181
1182          task.save()
1183       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1184          if (task.type=='min'):
1185            task.running =1
1186            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1187               line=''
1188               for line in f:
1189                 pass
1190               if line != '':
1191                 last = line.split()[0]
1192               else:
1193                 last = 0
1194            try:
1195               task.running=int(1+int(last)*100.0/task.min_maxmin)
1196            except:
1197               pass
1198            if task.running>100:
1199               task.running=100
1200          else:
1201            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1202               line=''
1203               for line in f:
1204                 pass
1205               if line != '':
1206                 last = line.split()[0]
1207               else:
1208                 last = 0
1209            task.running=int(1+int(last)*100.0/task.md_nstep)
1210            if task.running>100:
1211              task.running=100
1212          task.save()
1213
1214     
1215       return  
1216
1217 @login_required
1218 def zip_all_files(request, task_id):
1219     import os, zipfile
1220     from django.http import HttpResponse
1221     from wsgiref.util import FileWrapper
1222     from django.core.files.temp import NamedTemporaryFile
1223
1224     task = get_object_or_404(Task, id=task_id)
1225
1226     temp=NamedTemporaryFile()
1227     archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
1228     for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
1229        for file1 in filenames:
1230          archive.write(dirpath+"/"+file1,file1)
1231     archive.close()
1232     temp.seek(0)
1233     wrapper = FileWrapper(temp)
1234     response = HttpResponse(wrapper, content_type='application/zip')
1235     response['Content-Disposition'] = 'attachment; filename=all.zip'
1236     return response