dock DockQ
[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
869              task.ready=True
870              
871              
872              task.save()
873              return redirect('addmlist',task_id=task.id)
874
875     else:
876         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
877         form = TaskForm_dock_a(initial=data)
878     basic_adv=False
879     p_type='docking - advanced options'
880     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
881
882
883
884 @login_required
885 def addmlist(request,task_id):
886     task = get_object_or_404(Task, id=task_id)
887     if request.method == 'POST':
888         form = TaskForm_list(task.remd_nrep,request.POST)
889         if form.is_valid():
890              task.remd_multi_t=form.cleaned_data["temperatures"]
891              task.remd_multi_m=form.cleaned_data["multiplexing"]             
892              task.ready=True
893              
894              task.save()
895              if is_lazy_user(request.user):
896               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
897              else:
898               return redirect('/')
899     else:
900       if task.example == 'casp12':
901         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
902         '["2", "2", "2", "2", "2", "2", "2", "2"]',
903         'temperatures':
904         '["270", "280", "290", "300", "310", "320", "330", "340"]'
905         }
906       elif task.unres_ff == 'FF2':
907         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
908         '["1", "1", "1", "1", "1", "1", "1", "1"]',
909         'temperatures':
910         '["270", "280", "290", "300", "310", "320", "330", "345"]'
911         }
912       else: 
913         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
914         '["1", "1", "1", "1", "1", "1", "1", "1"]',
915         'temperatures':
916         '["250", "260", "270", "280", "290", "300", "315", "330"]'
917         }
918       
919       form = TaskForm_list(task.remd_nrep,initial=data)
920     p_type='replica exchange molecular dynamics - advanced options'
921     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
922
923 @login_required
924 def details(request,task_id):
925     task = get_object_or_404(Task, id=task_id)
926     return render(request, "details.html",{'task':task})
927
928
929 def details1(request,user_id,task_id):
930     task = get_object_or_404(Task, id=task_id)
931     return render(request, "details1.html",{'task':task})
932
933
934 @login_required
935 def delete(request, task_id):
936     Task.objects.get(id=task_id).delete()
937     return redirect('/')
938     
939 @login_required
940 def restart(request, task_id):
941     task = get_object_or_404(Task, id=task_id)
942     restart0(task)
943     return redirect('/')
944    
945 def add_restart_inp():
946     with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
947         for line in f1:
948           if 'reset_vel=' in line:
949             f2.write('{:79}'.format('restart'+line[7:]))
950           else:
951             f2.write(line)
952     os.remove('file.inp')
953     os.rename('file.inp.tmp','file.inp')
954     return 
955     
956 def restart0(task):    
957     if os.path.isfile(task.jobdirname+'/finished'):    
958       os.remove(task.jobdirname+'/finished')
959     task.running =1
960     task.done=False
961     task.md_total_steps = task.md_total_steps+task.md_nstep
962     task.save()
963     if task.type == 'md':
964       os.chdir(task.jobdirname)
965       add_restart_inp()
966       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
967       os.chdir('..')
968     elif task.type == 'remd':
969       os.chdir(task.jobdirname)
970       add_restart_inp()
971       tmp1=json.loads(task.remd_multi_m)
972       nreplicas=sum(map(int, tmp1))
973       with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
974         for line in f1:
975           if 'rec_end=' in line:
976             rec=task.md_total_steps/task.md_ntwx
977             f2.write('nfile_cx=1 rec_start='+str(rec/10)
978                +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
979           elif 'isampl=' in line:
980             if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
981                 isampl=1
982             else:
983                 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
984             f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
985           else:
986             f2.write(line)
987       os.remove('file_wham.inp')
988       os.rename('file_wham.tmp','file_wham.inp')
989       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
990       os.chdir('..')
991     return
992
993 def restart1(request, user_id, task_id):
994     task = get_object_or_404(Task, id=task_id)
995     user = task.owner
996     restart0(task)
997     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
998     
999
1000 def refresh_done1(request, task_id):
1001     task = get_object_or_404(Task, id=task_id)
1002     user = task.owner
1003     refresh_done0(task)
1004
1005     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1006     njob=0
1007     nq=0
1008     for line in proc.stdout:
1009       if 'piasek4' in line:
1010         if line.split()[1]=='test_server':
1011           njob+=1
1012           if line.split()[-2]=='Q':
1013             nq+=1
1014     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1015
1016     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1017
1018
1019 @login_required
1020 def refresh_done(request):
1021     user = request.user
1022     tasks = Task.objects.filter(owner=user).order_by('-created_date')
1023     tasks_count = Task.objects.filter(owner=user).count()
1024     alldone = 1
1025     for task in tasks:
1026       refresh_done0(task)
1027       if not task.done:
1028          alldone=0
1029
1030     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1031     njob=0
1032     nq=0
1033     for line in proc.stdout:
1034       if 'piasek4' in line:
1035         if line.split()[1]=='test_server':
1036           njob+=1
1037           if line.split()[-2]=='Q':
1038             nq+=1
1039     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1040
1041     if is_lazy_user(request.user):
1042      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1043     else:
1044      return render(request, "index.html", {
1045                 'tasks': tasks ,
1046                 'variable' : variable,
1047                 'alldone': alldone,
1048                 'tasks_count':tasks_count
1049                         })
1050
1051       
1052 def refresh_done0(task):
1053       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1054          task.done=True
1055
1056          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1057
1058            if task.type=='min' or task.type=='md':
1059              text=""
1060              for line in f:
1061                if 'ETOT' in line:
1062                   task.etot=line.split()[1]
1063
1064                if 'RMS deviation' in line:
1065                   text=text+line
1066                   i=1
1067                   for line1 in f:
1068                      text=text+line1
1069                      i+=1
1070                      if i>6:
1071                        break
1072                if 'Total wall' in line:
1073                   text=text+line
1074                   
1075            elif task.type=='remd' or task.type=='dock':
1076              j=0
1077              text="Acceptance for replica exchanges and number of exchange attempts\n"
1078              for line in f:
1079                         
1080                if 'ACC' in line:
1081                     j+=1
1082                     text=text+' '.join(line.split()[2:])+"\n"
1083                     if j==task.remd_nrep:
1084                        j=1
1085                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1086
1087                if 'Total wall' in line:
1088                   text=text+line
1089                        
1090          task.results_text=text
1091
1092
1093          if task.md_pdbref and task.type=='remd' or task.type=='dock':
1094          
1095           for i in range(1,6):
1096            try:
1097             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
1098                  line=f.readline()
1099                  if i==1:
1100                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
1101                  elif i==2:
1102                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
1103                  elif i==3:
1104                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
1105                  elif i==4:
1106                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
1107                  elif i==5:
1108                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
1109            except EnvironmentError:
1110             print 'file_wham_T*pdb open error'
1111           for i in range(1,6):
1112             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1113                text=''
1114                for line in f:
1115                  if 'RMSD of  the common residues=' in line:
1116                    text=' RMSD='+line.split()[5]
1117                  if 'TM-score    =' in line:
1118                    text=text+' TMscore='+line.split()[2]
1119                  if 'GDT-TS-score=' in line:
1120                    text=text+' GDT_TS='+line.split()[1]
1121                     
1122                if i==1:
1123                      task.remd_model1=task.remd_model1+text
1124                elif i==2:
1125                      task.remd_model2=task.remd_model2+text
1126                elif i==3:
1127                      task.remd_model3=task.remd_model3+text
1128                elif i==4:
1129                      task.remd_model4=task.remd_model4+text
1130                elif i==5:
1131                      task.remd_model5=task.remd_model5+text
1132           
1133           if task.type=='dock':
1134            for i in range(1,6):
1135             with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
1136                text=''
1137                for line in f:
1138                  if 'Fnat' in line:
1139                    text=' Fnat='+line.split()[1]
1140                  if 'iRMS' in line:
1141                    text=text+' iRMS='+line.split()[1]
1142                  if 'LRMS=' in line:
1143                    text=text+' LRMS='+line.split()[1]
1144                  if 'CAPRI' in line:
1145                    text=text+' CAPRI'+line.split()[1]
1146                  if 'DockQ_CAPRI' in line:
1147                    text=text+' DockQ_CAPRI'+line.split()[1]
1148                  if 'DockQ ' in line:
1149                    text=text+' DockQ'+line.split()[1]
1150
1151                if i==1:
1152                      task.remd_model1=task.remd_model1+text
1153                elif i==2:
1154                      task.remd_model2=task.remd_model2+text
1155                elif i==3:
1156                      task.remd_model3=task.remd_model3+text
1157                elif i==4:
1158                      task.remd_model4=task.remd_model4+text
1159                elif i==5:
1160                      task.remd_model5=task.remd_model5+text
1161
1162
1163          if task.type=='remd' or task.type=='dock':  
1164           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1165
1166            for line in f:
1167              if 'sumprob' in line:
1168                 i=0
1169                 for line1 in f:
1170                   i+=1
1171                   if i>6:
1172                        break
1173                   if i==1:
1174                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[-2]
1175                   elif i==2:
1176                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[-2]
1177                   elif i==3:
1178                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[-2]
1179                   elif i==4:
1180                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[-2]
1181                   elif i==5:
1182                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[-2]
1183                      
1184          
1185
1186          task.save()
1187       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1188          if (task.type=='min'):
1189            task.running =1
1190            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1191               line=''
1192               for line in f:
1193                 pass
1194               if line != '':
1195                 last = line.split()[0]
1196               else:
1197                 last = 0
1198            try:
1199               task.running=int(1+int(last)*100.0/task.min_maxmin)
1200            except:
1201               pass
1202            if task.running>100:
1203               task.running=100
1204          else:
1205            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1206               line=''
1207               for line in f:
1208                 pass
1209               if line != '':
1210                 last = line.split()[0]
1211               else:
1212                 last = 0
1213            task.running=int(1+int(last)*100.0/task.md_nstep)
1214            if task.running>100:
1215              task.running=100
1216          task.save()
1217
1218     
1219       return  
1220
1221 @login_required
1222 def zip_all_files(request, task_id):
1223     import os, zipfile
1224     from django.http import HttpResponse
1225     from wsgiref.util import FileWrapper
1226     from django.core.files.temp import NamedTemporaryFile
1227
1228     task = get_object_or_404(Task, id=task_id)
1229
1230     temp=NamedTemporaryFile()
1231     archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
1232     for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
1233        for file1 in filenames:
1234          archive.write(dirpath+"/"+file1,file1)
1235     archive.close()
1236     temp.seek(0)
1237     wrapper = FileWrapper(temp)
1238     response = HttpResponse(wrapper, content_type='application/zip')
1239     response['Content-Disposition'] = 'attachment; filename=all.zip'
1240     return response