aea28ecdf9e324dcab1e9f9f388e5cc3f8ad1364
[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              task.dock_peptide=form.cleaned_data["dock_peptide"]
754
755              task.md_seq=""
756
757              seq1,ssbond1=from_pdb(task.myfile1)
758              seq2,ssbond2=from_pdb(task.myfile2)
759              
760              if seq1[-1]=='X' and seq2[0]=='X':
761               seq=seq1+seq2
762              elif seq1[-1]!='X' and seq2[0]!='X':
763               seq=seq1+'XX'+seq2
764              else:
765               seq=seq1+'X'+seq2
766              
767              for i in range(0,len(seq),40):
768                 task.md_seq=task.md_seq+seq[i:i+40]+" "
769
770              task.md_seed=form.cleaned_data["md_seed"]
771
772              task.md_nstep=form.cleaned_data["md_nstep"]
773              task.md_total_steps=task.md_nstep
774
775              if any(c.islower() for c in seq):
776               task.md_respa=False
777               task.damino=True
778
779
780              task.ready=True
781              
782              
783              task.save()
784              if is_lazy_user(request.user):
785               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
786              else:
787               return redirect('/')
788     else:
789         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
790         form = TaskForm_dock(initial=data)
791     basic_adv=True
792     p_type='docking'
793     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
794
795 @login_required
796 def add_dock_a(request,task_id):
797     task = get_object_or_404(Task, id=task_id)
798     if request.method == 'POST':
799      if '_example' in request.POST:
800         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
801         form = TaskForm_dock_a(initial=data)     
802      else:
803         form = TaskForm_dock_a(request.POST,request.FILES)
804         if form.is_valid():
805              task.name=form.cleaned_data["name"]
806              task.type="dock"
807
808              basename = str(task.owner)
809              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
810              task.jobdirname = "_".join([basename, suffix])
811
812              pdbid=form.cleaned_data["pdbid"]
813              if pdbid:
814               task.myfile1=load_pdbid(pdbid,task.jobdirname)
815               task.pdbcode=pdbid
816              else:
817               task.myfile1=form.cleaned_data["file1"]
818               
819              pdbid2=form.cleaned_data["pdbid2"]
820              if pdbid2:
821               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
822               task.pdbcode2=pdbid2
823              else:
824               task.myfile2=form.cleaned_data["file2"]
825
826              task.md_ntwx=task.remd_nstex 
827              task.md_start="pdbstart"
828              task.md_pdbref=True
829              task.md_respa=False
830              task.ssbond=""
831               
832              task.md_seq=""
833
834              seq1,ssbond1=from_pdb(task.myfile1)
835              seq2,ssbond2=from_pdb(task.myfile2)
836              
837              if seq1[-1]=='X' and seq2[0]=='X':
838               seq=seq1+seq2
839              elif seq1[-1]!='X' and seq2[0]!='X':
840               seq=seq1+'XX'+seq2
841              else:
842               seq=seq1+'X'+seq2
843              
844              for i in range(0,len(seq),40):
845                 task.md_seq=task.md_seq+seq[i:i+40]+" "
846
847              task.md_seed=form.cleaned_data["md_seed"]
848
849              task.md_nstep=form.cleaned_data["md_nstep"]
850              task.md_total_steps=task.md_nstep
851              
852              task.md_dt=form.cleaned_data["md_dt"]
853              task.md_lang=form.cleaned_data["md_lang"]
854              task.md_tau=form.cleaned_data["md_tau"]
855              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
856              task.min_maxfun=form.cleaned_data["min_maxfun"]
857              task.remd_nrep=form.cleaned_data["remd_nrep"]
858              task.remd_nstex=form.cleaned_data["remd_nstex"]
859              task.md_ntwx=form.cleaned_data["md_ntwx"]             
860              task.md_ntwe=form.cleaned_data["md_ntwe"]
861
862              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
863              task.unres_ff=form.cleaned_data["unres_ff"]
864
865              if any(c.islower() for c in seq):
866               task.md_respa=False
867               task.damino=True
868
869              task.save()
870              return redirect('addmlist',task_id=task.id)
871
872     else:
873         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
874         form = TaskForm_dock_a(initial=data)
875     basic_adv=False
876     p_type='docking - advanced options'
877     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
878
879
880
881 @login_required
882 def addmlist(request,task_id):
883     task = get_object_or_404(Task, id=task_id)
884     if request.method == 'POST':
885         form = TaskForm_list(task.remd_nrep,request.POST)
886         if form.is_valid():
887              task.remd_multi_t=form.cleaned_data["temperatures"]
888              task.remd_multi_m=form.cleaned_data["multiplexing"]             
889              task.ready=True
890              
891              task.save()
892              if is_lazy_user(request.user):
893               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
894              else:
895               return redirect('/')
896     else:
897       if task.example == 'casp12':
898         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
899         '["2", "2", "2", "2", "2", "2", "2", "2"]',
900         'temperatures':
901         '["270", "280", "290", "300", "310", "320", "330", "340"]'
902         }
903       elif task.unres_ff == 'FF2':
904         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
905         '["1", "1", "1", "1", "1", "1", "1", "1"]',
906         'temperatures':
907         '["270", "280", "290", "300", "310", "320", "330", "345"]'
908         }
909       else: 
910         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
911         '["1", "1", "1", "1", "1", "1", "1", "1"]',
912         'temperatures':
913         '["250", "260", "270", "280", "290", "300", "315", "330"]'
914         }
915       
916       form = TaskForm_list(task.remd_nrep,initial=data)
917     p_type='replica exchange molecular dynamics - advanced options'
918     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
919
920 @login_required
921 def details(request,task_id):
922     task = get_object_or_404(Task, id=task_id)
923     return render(request, "details.html",{'task':task})
924
925
926 def details1(request,user_id,task_id):
927     task = get_object_or_404(Task, id=task_id)
928     return render(request, "details1.html",{'task':task})
929
930
931 @login_required
932 def delete(request, task_id):
933     Task.objects.get(id=task_id).delete()
934     return redirect('/')
935     
936 @login_required
937 def restart(request, task_id):
938     task = get_object_or_404(Task, id=task_id)
939     restart0(task)
940     return redirect('/')
941    
942 def add_restart_inp():
943     with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
944         for line in f1:
945           if 'reset_vel=' in line:
946             f2.write('{:79}'.format('restart'+line[7:]))
947           else:
948             f2.write(line)
949     os.remove('file.inp')
950     os.rename('file.inp.tmp','file.inp')
951     return 
952     
953 def restart0(task):    
954     if os.path.isfile(task.jobdirname+'/finished'):    
955       os.remove(task.jobdirname+'/finished')
956     task.running =1
957     task.done=False
958     task.md_total_steps = task.md_total_steps+task.md_nstep
959     task.save()
960     if task.type == 'md':
961       os.chdir(task.jobdirname)
962       add_restart_inp()
963       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
964       os.chdir('..')
965     elif task.type == 'remd':
966       os.chdir(task.jobdirname)
967       add_restart_inp()
968       tmp1=json.loads(task.remd_multi_m)
969       nreplicas=sum(map(int, tmp1))
970       with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
971         for line in f1:
972           if 'rec_end=' in line:
973             rec=task.md_total_steps/task.md_ntwx
974             f2.write('nfile_cx=1 rec_start='+str(rec/10)
975                +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
976           elif 'isampl=' in line:
977             if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
978                 isampl=1
979             else:
980                 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
981             f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
982           else:
983             f2.write(line)
984       os.remove('file_wham.inp')
985       os.rename('file_wham.tmp','file_wham.inp')
986       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
987       os.chdir('..')
988     return
989
990 def restart1(request, user_id, task_id):
991     task = get_object_or_404(Task, id=task_id)
992     user = task.owner
993     restart0(task)
994     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
995     
996
997 def refresh_done1(request, task_id):
998     task = get_object_or_404(Task, id=task_id)
999     user = task.owner
1000     refresh_done0(task)
1001
1002     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1003     njob=0
1004     nq=0
1005     for line in proc.stdout:
1006       if 'piasek4' in line:
1007         if line.split()[1]=='test_server':
1008           njob+=1
1009           if line.split()[-2]=='Q':
1010             nq+=1
1011     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1012
1013     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1014
1015
1016 @login_required
1017 def refresh_done(request):
1018     user = request.user
1019     tasks = Task.objects.filter(owner=user).order_by('-created_date')
1020     tasks_count = Task.objects.filter(owner=user).count()
1021     alldone = 1
1022     for task in tasks:
1023       refresh_done0(task)
1024       if not task.done:
1025          alldone=0
1026
1027     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1028     njob=0
1029     nq=0
1030     for line in proc.stdout:
1031       if 'piasek4' in line:
1032         if line.split()[1]=='test_server':
1033           njob+=1
1034           if line.split()[-2]=='Q':
1035             nq+=1
1036     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1037
1038     if is_lazy_user(request.user):
1039      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1040     else:
1041      return render(request, "index.html", {
1042                 'tasks': tasks ,
1043                 'variable' : variable,
1044                 'alldone': alldone,
1045                 'tasks_count':tasks_count
1046                         })
1047
1048       
1049 def refresh_done0(task):
1050       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1051          task.done=True
1052
1053          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1054
1055            if task.type=='min' or task.type=='md':
1056              text=""
1057              for line in f:
1058                if 'ETOT' in line:
1059                   task.etot=line.split()[1]
1060
1061                if 'RMS deviation' in line:
1062                   text=text+line
1063                   i=1
1064                   for line1 in f:
1065                      text=text+line1
1066                      i+=1
1067                      if i>6:
1068                        break
1069                if 'Total wall' in line:
1070                   text=text+line
1071                   
1072            elif task.type=='remd' or task.type=='dock':
1073              j=0
1074              text="Acceptance for replica exchanges and number of exchange attempts\n"
1075              for line in f:
1076                         
1077                if 'ACC' in line:
1078                     j+=1
1079                     text=text+' '.join(line.split()[2:])+"\n"
1080                     if j==task.remd_nrep:
1081                        j=1
1082                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1083
1084                if 'Total wall' in line:
1085                   text=text+line
1086                        
1087          task.results_text=text
1088
1089
1090          if task.md_pdbref and task.type=='remd' or task.type=='dock':
1091          
1092           for i in range(1,6):
1093            try:
1094             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
1095                  line=f.readline()
1096                  if i==1:
1097                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
1098                  elif i==2:
1099                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
1100                  elif i==3:
1101                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
1102                  elif i==4:
1103                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
1104                  elif i==5:
1105                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
1106            except EnvironmentError:
1107             print 'file_wham_T*pdb open error'
1108           for i in range(1,6):
1109             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1110                text=''
1111                for line in f:
1112                  if 'RMSD of  the common residues=' in line:
1113                    text=' RMSD='+line.split()[5]
1114                  if 'TM-score    =' in line:
1115                    text=text+' TMscore='+line.split()[2]
1116                  if 'GDT-TS-score=' in line:
1117                    text=text+' GDT_TS='+line.split()[1]
1118                     
1119                if i==1:
1120                      task.remd_model1=task.remd_model1+text
1121                elif i==2:
1122                      task.remd_model2=task.remd_model2+text
1123                elif i==3:
1124                      task.remd_model3=task.remd_model3+text
1125                elif i==4:
1126                      task.remd_model4=task.remd_model4+text
1127                elif i==5:
1128                      task.remd_model5=task.remd_model5+text
1129           
1130           if task.type=='dock':
1131            for i in range(1,6):
1132             with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
1133                text=''
1134                for line in f:
1135                  if 'Fnat' in line:
1136                    text=' Fnat='+line.split()[1]
1137                  if 'iRMS' in line:
1138                    text=text+' iRMS='+line.split()[1]
1139                  if 'LRMS' in line:
1140                    text=text+' LRMS='+line.split()[1]
1141                  if 'CAPRI' in line and not 'DockQ_CAPRI' in line:
1142                    text=text+' CAPRI='+line.split()[1]
1143                  if 'DockQ_CAPRI' in line:
1144                    text=text+' DockQ_CAPRI= '+line.split()[1]
1145                  if 'DockQ ' in line:
1146                    text=text+' DockQ='+line.split()[1]
1147
1148                if i==1:
1149                      task.remd_model1=task.remd_model1+text
1150                elif i==2:
1151                      task.remd_model2=task.remd_model2+text
1152                elif i==3:
1153                      task.remd_model3=task.remd_model3+text
1154                elif i==4:
1155                      task.remd_model4=task.remd_model4+text
1156                elif i==5:
1157                      task.remd_model5=task.remd_model5+text
1158
1159
1160          if task.type=='remd' or task.type=='dock':  
1161           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1162
1163            for line in f:
1164              if 'sumprob' in line:
1165                 i=0
1166                 for line1 in f:
1167                   i+=1
1168                   if i>6:
1169                        break
1170                   if i==1:
1171                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[-2]
1172                   elif i==2:
1173                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[-2]
1174                   elif i==3:
1175                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[-2]
1176                   elif i==4:
1177                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[-2]
1178                   elif i==5:
1179                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[-2]
1180                      
1181          
1182
1183          task.save()
1184       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1185          if (task.type=='min'):
1186            task.running =1
1187            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1188               line=''
1189               for line in f:
1190                 pass
1191               if line != '':
1192                 last = line.split()[0]
1193               else:
1194                 last = 0
1195            try:
1196               task.running=int(1+int(last)*100.0/task.min_maxmin)
1197            except:
1198               pass
1199            if task.running>100:
1200               task.running=100
1201          else:
1202            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1203               line=''
1204               for line in f:
1205                 pass
1206               if line != '':
1207                 last = line.split()[0]
1208               else:
1209                 last = 0
1210            task.running=int(1+int(last)*100.0/task.md_nstep)
1211            if task.running>100:
1212              task.running=100
1213          task.save()
1214
1215     
1216       return  
1217
1218 @login_required
1219 def zip_all_files(request, task_id):
1220     import os, zipfile
1221     from django.http import HttpResponse
1222     from wsgiref.util import FileWrapper
1223     from django.core.files.temp import NamedTemporaryFile
1224
1225     task = get_object_or_404(Task, id=task_id)
1226
1227     temp=NamedTemporaryFile()
1228     archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
1229     for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
1230        for file1 in filenames:
1231          archive.write(dirpath+"/"+file1,file1)
1232     archive.close()
1233     temp.seek(0)
1234     wrapper = FileWrapper(temp)
1235     response = HttpResponse(wrapper, content_type='application/zip')
1236     response['Content-Disposition'] = 'attachment; filename=all.zip'
1237     return response