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