import datetime
import os
import subprocess
+import json
+from lazysignup.decorators import allow_lazy_user
+from lazysignup.utils import is_lazy_user
+import random
res_codes = [
# 20 canonical amino acids
('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
('CYX', 'C'),
+ ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
+ ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
+ ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
+ ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
+ ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),
]
three_to_one = dict(res_codes)
+def dock_box(file):
+ import math
+ coord = list()
+ for line in file:
+ if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
+ x=float(line[30:38])
+ y=float(line[38:46])
+ z=float(line[46:54])
+ coord.append([x, y, z])
+ if line[0:3] == 'END':
+ break
+ maxd=0
+ l=len(coord)
+ for i in xrange(l):
+ for j in xrange(i+1,l):
+ p1=coord[i]
+ p2=coord[j]
+ d=(p1[0]-p2[0])**2 + (p1[1]-p2[1])**2 + (p1[2]-p2[2])**2
+ if d > maxd:
+ maxd=d
+ return math.sqrt(maxd)
+
+
+def load_pdbid(pdbid,dirname,filename='plik.pdb'):
+ if (not os.path.isdir(dirname)):
+ os.mkdir(dirname)
+ if len(pdbid)==4:
+ file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
+ dirname+'/'+filename)
+ else:
+ chain=pdbid[5]
+ pdbid=pdbid[:4]
+ pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
+ with open(dirname+'/'+filename, 'w') as outfile:
+ for line in pdb_tmp:
+ if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
+ outfile.write(line)
+ if line[0:6] == 'ATOM ' and line[21] == chain:
+ outfile.write(line)
+ if line[0:6] == 'ENDMDL':
+ break
+ pdb_tmp.close()
+ file=dirname+'/'+filename
+
+ return(file)
+
+
+def seq_2d_from_pdb(seq_2d,seq):
+ if seq_2d =='':
+ return(seq_2d)
+ seq_2d=seq_2d.replace('C', '-')
+ seq_2d_tmp=''
+ ii=0
+ for i in range(0,len(seq)):
+ if seq[i]=='X':
+ seq_2d_tmp=seq_2d_tmp+'-'
+ else:
+ if len(seq_2d)>ii:
+ seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
+ ii+=1
+ tmp=''
+ for i in range(0,len(seq_2d_tmp),40):
+ tmp=tmp+seq_2d_tmp[i:i+40]+" "
+ return(tmp)
+
+def seq_2d_add_x(seq_2d,seq,seq_form):
+ if seq_2d =='':
+ return(seq_2d)
+ seq_2d=seq_2d[:len(seq_form)]
+ seq_2d=seq_2d.replace('C', '-')
+ if seq_form[0] !='X' and seq[0] == 'X':
+ seq_2d='-'+seq_2d
+ if seq_form[-1] !='X' and seq[-1] == 'X':
+ seq_2d=seq_2d+'-'
+ seq_2d=seq_2d[:len(seq)]
+ tmp=''
+ for i in range(0,len(seq_2d),40):
+ tmp=tmp+seq_2d[i:i+40]+" "
+ return(tmp)
+
def seq_add_x(sequence):
- if sequence[0] != 'G':
+ if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
sequence='X'+sequence
- if sequence[-1] != 'G':
+ if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
sequence=sequence+'X'
- set ='CDSQKIPTFNGHLRWAVEYMX'
+ set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
sequence = ''.join([c for c in sequence if c in set])
return(sequence)
def from_pdb(file):
sequence = []
ssbond = []
+ ssbond_ch = []
+ ires = []
+ chain_start = {}
+ chain_end = {}
+ unres_shift = {}
+ chain_sorted=[]
+ newchain = True
+ i=''
for line in file:
if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
aa = three_to_one.get(line[17:20])
- sequence.append(aa)
- if line[0:3] == 'TER':
+ i = int(line[22:26])
+ ch = line[21:22]
+ if newchain or i!=ires[-1]:
+ sequence.append(aa)
+ ires.append(i)
+ if newchain:
+ chain_start[ch]=i
+ chain_sorted.extend(ch)
+ newchain = False
+ if line[0:3] == 'TER' and i != '':
sequence.append('XX')
+ chain_end[ch]=i
+ newchain = True
if line[0:6] == 'SSBOND':
b=[]
b.append(int(line[17:21]))
b.append(int(line[31:35]))
ssbond.append(b)
-
+ c = []
+ c.append((line[15:16]))
+ c.append((line[29:30]))
+ ssbond_ch.append(c)
if line[0:3] == 'END':
break
+ if not sequence[-1] == 'XX':
+ chain_end[ch]=i
while sequence[-1] == 'XX':
del sequence[-1]
if sequence[0] != 'G':
if sequence[-1] != 'G':
sequence.append('X')
seq=''.join(sequence)
- return seq,ssbond
+# if ires[0] != 1:
+# ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
+ i=0
+ for c in chain_sorted:
+ unres_shift[c]=i+chain_start[c]
+ i=i-(chain_end[c]-chain_start[c])-3
+ ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
+
+ return seq,json.dumps(ssbond)
@login_required
def index(request):
user = request.user
- tasks = Task.objects.filter(owner=user)
+ tasks = Task.objects.filter(owner=user).order_by('-created_date')
variable = ''
+ tasks_count = Task.objects.filter(owner=user).count()
return render(request, "index.html", {
- 'tasks': tasks
+ 'tasks': tasks, 'alldone': 0, 'tasks_count':tasks_count
})
@login_required
return redirect('add_min',task_id=task.id)
return redirect('/')
-
@login_required
def add_min(request,task_id):
task = get_object_or_404(Task, id=task_id)
if request.method == 'POST':
+ if '_example' in request.POST:
+ data= {'name':task.name,'pdbid':'1BDD'}
+ form = TaskForm_min(initial=data)
+ else:
form = TaskForm_min(request.POST,request.FILES)
if form.is_valid():
task.name=form.cleaned_data["name"]
task.type="min"
- task.myfile1=form.cleaned_data["file1"]
+ pdbid=form.cleaned_data["pdbid"]
+
+ basename = str(task.owner)
+ suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+ task.jobdirname = "_".join([basename, suffix])
+
+ if pdbid:
+ task.myfile1=load_pdbid(pdbid,task.jobdirname)
+ task.pdbcode=pdbid
+ else:
+ task.myfile1=form.cleaned_data["file1"]
seq,task.ssbond=from_pdb(task.myfile1)
task.md_seq=""
task.md_seq=task.md_seq+seq[i:i+40]+" "
task.ready=True
- basename = str(task.owner)
- suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
- task.jobdirname = "_".join([basename, suffix])
task.save()
- return redirect('/')
+ if is_lazy_user(request.user):
+ return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
+ else:
+ return redirect('/')
else:
data= {'name':task.name}
form = TaskForm_min(initial=data)
basic_adv=True
return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+@login_required
def add_min_a(request,task_id):
task = get_object_or_404(Task, id=task_id)
if request.method == 'POST':
+ if '_example' in request.POST:
+ data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
+ form = TaskForm_min_a(initial=data)
+ else:
form = TaskForm_min_a(request.POST,request.FILES)
if form.is_valid():
task.name=form.cleaned_data["name"]
task.type="min"
- task.min_choice=form.cleaned_data["min_choice"]
+# task.min_choice=form.cleaned_data["min_choice"]
task.min_overlap=form.cleaned_data["min_overlap"]
task.min_searchsc=form.cleaned_data["min_searchsc"]
task.min_maxmin=form.cleaned_data["min_maxmin"]
task.min_maxfun=form.cleaned_data["min_maxfun"]
task.min_pdbout=form.cleaned_data["min_pdbout"]
- task.myfile1=form.cleaned_data["file1"]
+
+ basename = str(task.owner)
+ suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+ task.jobdirname = "_".join([basename, suffix])
+
+ pdbid=form.cleaned_data["pdbid"]
+ if pdbid:
+ task.myfile1=load_pdbid(pdbid,task.jobdirname)
+ task.pdbcode=pdbid
+ else:
+ task.myfile1=form.cleaned_data["file1"]
+
task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
+ task.unres_ff=form.cleaned_data["unres_ff"]
+ task.boxx=form.cleaned_data["boxx"]
+ task.boxy=form.cleaned_data["boxy"]
+ task.boxz=form.cleaned_data["boxz"]
seq,task.ssbond=from_pdb(task.myfile1)
task.md_seq=""
for i in range(0,len(seq),40):
task.md_seq=task.md_seq+seq[i:i+40]+" "
-
task.ready=True
- basename = str(task.owner)
- suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
- task.jobdirname = "_".join([basename, suffix])
task.save()
- return redirect('/')
+ if is_lazy_user(request.user):
+ return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
+ else:
+ return redirect('/')
else:
data= {'name':task.name}
form = TaskForm_min_a(initial=data)
def add_md(request,task_id):
task = get_object_or_404(Task, id=task_id)
if request.method == 'POST':
+ if '_example' in request.POST:
+ data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
+ 'md_pdbref':True,'md_temp':200,'md_seed':-39912345}
+ form = TaskForm_md(initial=data)
+ else:
form = TaskForm_md(request.POST,request.FILES)
if form.is_valid():
task.name=form.cleaned_data["name"]
task.md_start=form.cleaned_data["md_start"]
task.md_temp=form.cleaned_data["md_temp"]
task.md_nstep=form.cleaned_data["md_nstep"]
-
- task.myfile1=form.cleaned_data["file1"]
+ task.md_total_steps=task.md_nstep
+ if task.md_nstep<250000:
+ task.md_ntwx=100
+
+ basename = str(task.owner)
+ suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+ task.jobdirname = "_".join([basename, suffix])
+
+ pdbid=form.cleaned_data["pdbid"]
+ if pdbid:
+ task.myfile1=load_pdbid(pdbid,task.jobdirname)
+ task.pdbcode=pdbid
+ else:
+ task.myfile1=form.cleaned_data["file1"]
task.md_pdbref=form.cleaned_data["md_pdbref"]
task.md_seq=""
if task.md_start != "pdbstart":
task.ssbond=''
+ if any(c.islower() for c in seq):
+ task.md_respa=False
+ task.damino=True
+
task.ready=True
- basename = str(task.owner)
- suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
- task.jobdirname = "_".join([basename, suffix])
task.save()
- return redirect('/')
+ if is_lazy_user(request.user):
+ return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
+ else:
+ return redirect('/')
else:
- data= {'name':task.name}
+ data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
form = TaskForm_md(initial=data)
basic_adv=True
p_type='molecular dynamics'
return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+@login_required
def add_md_a(request,task_id):
task = get_object_or_404(Task, id=task_id)
if request.method == 'POST':
+ if '_example' in request.POST:
+ data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
+ 'md_pdbref':True,'md_mdpdb':True,'md_seed':-39912345}
+ form = TaskForm_md_a(initial=data)
+ else:
form = TaskForm_md_a(request.POST,request.FILES)
if form.is_valid():
task.name=form.cleaned_data["name"]
task.type="md"
- task.myfile1=form.cleaned_data["file1"]
+ basename = str(task.owner)
+ suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+ task.jobdirname = "_".join([basename, suffix])
+
+ pdbid=form.cleaned_data["pdbid"]
+ if pdbid:
+ task.myfile1=load_pdbid(pdbid,task.jobdirname)
+ task.pdbcode=pdbid
+ else:
+ task.myfile1=form.cleaned_data["file1"]
task.md_start=form.cleaned_data["md_start"]
task.md_pdbref=form.cleaned_data["md_pdbref"]
task.md_seq=""
if task.md_start == "pdbstart" or task.md_pdbref:
seq,task.ssbond=from_pdb(task.myfile1)
+ task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
else:
seq=seq_add_x(form.cleaned_data["md_seq"])
+ task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
+
for i in range(0,len(seq),40):
task.md_seq=task.md_seq+seq[i:i+40]+" "
task.md_temp=form.cleaned_data["md_temp"]
task.md_nstep=form.cleaned_data["md_nstep"]
+ task.md_total_steps=task.md_nstep
task.md_ntwe=form.cleaned_data["md_ntwe"]
task.md_ntwx=form.cleaned_data["md_ntwx"]
task.md_dt=form.cleaned_data["md_dt"]
task.md_tau=form.cleaned_data["md_tau"]
task.md_scal_fric=form.cleaned_data["md_scal_fric"]
task.md_mdpdb=form.cleaned_data["md_mdpdb"]
+ task.unres_ff=form.cleaned_data["unres_ff"]
+ task.md_respa=form.cleaned_data["md_respa"]
+ if any(c.islower() for c in seq):
+ task.md_respa=False
+ task.damino=True
+ task.boxx=form.cleaned_data["boxx"]
+ task.boxy=form.cleaned_data["boxy"]
+ task.boxz=form.cleaned_data["boxz"]
task.ready=True
- basename = str(task.owner)
- suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
- task.jobdirname = "_".join([basename, suffix])
task.save()
- return redirect('/')
+ if is_lazy_user(request.user):
+ return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
+ else:
+ return redirect('/')
else:
- data= {'name':task.name}
+ data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
form = TaskForm_md_a(initial=data)
basic_adv=False
p_type='molecular dynamics - advanced options'
def add_remd(request,task_id):
task = get_object_or_404(Task, id=task_id)
if request.method == 'POST':
+ if '_example' in request.POST:
+ data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
+ form = TaskForm_remd(initial=data)
+ else:
form = TaskForm_remd(request.POST,request.FILES)
if form.is_valid():
task.name=form.cleaned_data["name"]
task.type="remd"
task.md_start=form.cleaned_data["md_start"]
- task.myfile1=form.cleaned_data["file1"]
+
+ basename = str(task.owner)
+ suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+ task.jobdirname = "_".join([basename, suffix])
+
+ pdbid=form.cleaned_data["pdbid"]
+ if pdbid:
+ task.myfile1=load_pdbid(pdbid,task.jobdirname)
+ task.pdbcode=pdbid
+ else:
+ task.myfile1=form.cleaned_data["file1"]
task.md_pdbref=form.cleaned_data["md_pdbref"]
+ task.md_ntwx=task.remd_nstex
task.md_seq=""
if task.md_start == "pdbstart" or task.md_pdbref:
task.md_seed=form.cleaned_data["md_seed"]
task.md_nstep=form.cleaned_data["md_nstep"]
+ task.md_total_steps=task.md_nstep
+
+ if any(c.islower() for c in seq):
+ task.md_respa=False
+ task.damino=True
task.ready=True
- basename = str(task.owner)
- suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
- task.jobdirname = "_".join([basename, suffix])
task.save()
- return redirect('/')
+ if is_lazy_user(request.user):
+ return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
+ else:
+ return redirect('/')
else:
- data= {'name':task.name}
+ data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
form = TaskForm_remd(initial=data)
basic_adv=True
p_type='replica exchange molecular dynamics'
return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+@login_required
def add_remd_a(request,task_id):
+ from django.core.files.uploadedfile import UploadedFile
task = get_object_or_404(Task, id=task_id)
if request.method == 'POST':
+ if '_example' in request.POST:
+ data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
+ 'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2','md_seed':-39912345,
+ 'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
+ form = TaskForm_remd_a(initial=data)
+ task.example='casp12'
+ task.save()
+ elif '_example_saxs' in request.POST:
+ data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
+ 'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
+ 'remd_cluter_temp':270,
+ 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
+""" 0.5 1.33868e-02
+ 1.5 1.95880e-02
+ 2.5 2.68896e-02
+ 3.5 3.43737e-02
+ 4.5 4.07099e-02
+ 5.5 4.47875e-02
+ 6.5 4.63486e-02
+ 7.5 4.60514e-02
+ 8.5 4.49130e-02
+ 9.5 4.36744e-02
+10.5 4.26085e-02
+11.5 4.17464e-02
+12.5 4.11217e-02
+13.5 4.07835e-02
+14.5 4.06776e-02
+15.5 4.06060e-02
+16.5 4.03241e-02
+17.5 3.96655e-02
+18.5 3.85756e-02
+19.5 3.70537e-02
+20.5 3.50982e-02
+21.5 3.27236e-02
+22.5 3.00046e-02
+23.5 2.70643e-02
+24.5 2.40044e-02
+25.5 2.08595e-02
+26.5 1.76342e-02
+27.5 1.43802e-02
+28.5 1.12281e-02
+29.5 8.34574e-03
+30.5 5.87354e-03
+31.5 3.88732e-03
+32.5 2.39755e-03
+33.5 1.36323e-03
+34.5 7.06686e-04
+35.5 3.30592e-04
+36.5 1.38359e-04"""}
+ form = TaskForm_remd_a(initial=data)
+ elif '_example_saxs1' in request.POST:
+ data= {'name':task.name,'pdbid':'2KMS','md_pdbref':True,'md_start':'pdbstart',
+ 'md_2d':'----EEEEEE-EEEEE-------EEEEEEEEE--EEEEEE-EEEE---EEEEEEEEE-----EEEEEEE-EEE-HHHHH-EEEE-EEEEEEEEE----EEEEEE---EEE-----',
+ 'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
+ 'remd_cluter_temp':280, 'min_maxfun':50,
+ 'scal_rad':5.0,'wsaxs':1000.0,'saxs_data':
+"""0.7100E-00 0.2036E-03
+0.1420E+01 0.4221E-03
+0.2130E+01 0.6548E-03
+0.2840E+01 0.9001E-03
+0.3550E+01 0.1156E-02
+0.4260E+01 0.1421E-02
+0.4970E+01 0.1692E-02
+0.5680E+01 0.1965E-02
+0.6390E+01 0.2239E-02
+0.7100E+01 0.2509E-02
+0.7810E+01 0.2772E-02
+0.8520E+01 0.3025E-02
+0.9230E+01 0.3265E-02
+0.9940E+01 0.3489E-02
+0.1065E+02 0.3694E-02
+0.1136E+02 0.3878E-02
+0.1207E+02 0.4039E-02
+0.1278E+02 0.4177E-02
+0.1349E+02 0.4289E-02
+0.1420E+02 0.4377E-02
+0.1491E+02 0.4439E-02
+0.1562E+02 0.4478E-02
+0.1633E+02 0.4493E-02
+0.1704E+02 0.4487E-02
+0.1775E+02 0.4461E-02
+0.1846E+02 0.4418E-02
+0.1917E+02 0.4361E-02
+0.1988E+02 0.4291E-02
+0.2059E+02 0.4211E-02
+0.2130E+02 0.4125E-02
+0.2201E+02 0.4034E-02
+0.2272E+02 0.3942E-02
+0.2343E+02 0.3850E-02
+0.2414E+02 0.3761E-02
+0.2485E+02 0.3677E-02
+0.2556E+02 0.3598E-02
+0.2627E+02 0.3526E-02
+0.2698E+02 0.3462E-02
+0.2769E+02 0.3405E-02
+0.2840E+02 0.3356E-02
+0.2911E+02 0.3315E-02
+0.2982E+02 0.3280E-02
+0.3053E+02 0.3251E-02
+0.3124E+02 0.3226E-02
+0.3195E+02 0.3205E-02
+0.3266E+02 0.3186E-02
+0.3337E+02 0.3167E-02
+0.3408E+02 0.3147E-02
+0.3479E+02 0.3125E-02
+0.3550E+02 0.3099E-02
+0.3621E+02 0.3068E-02
+0.3692E+02 0.3031E-02
+0.3763E+02 0.2987E-02
+0.3834E+02 0.2937E-02
+0.3905E+02 0.2878E-02
+0.3976E+02 0.2812E-02
+0.4047E+02 0.2739E-02
+0.4118E+02 0.2658E-02
+0.4189E+02 0.2571E-02
+0.4260E+02 0.2478E-02
+0.4331E+02 0.2381E-02
+0.4402E+02 0.2279E-02
+0.4473E+02 0.2174E-02
+0.4544E+02 0.2068E-02
+0.4615E+02 0.1960E-02
+0.4686E+02 0.1853E-02
+0.4757E+02 0.1748E-02
+0.4828E+02 0.1644E-02
+0.4899E+02 0.1544E-02
+0.4970E+02 0.1447E-02
+0.5041E+02 0.1355E-02
+0.5112E+02 0.1267E-02
+0.5183E+02 0.1184E-02
+0.5254E+02 0.1106E-02
+0.5325E+02 0.1033E-02
+0.5396E+02 0.9646E-03
+0.5467E+02 0.9008E-03
+0.5538E+02 0.8411E-03
+0.5609E+02 0.7852E-03
+0.5680E+02 0.7327E-03
+0.5751E+02 0.6831E-03
+0.5822E+02 0.6360E-03
+0.5893E+02 0.5909E-03
+0.5964E+02 0.5475E-03
+0.6035E+02 0.5055E-03
+0.6106E+02 0.4646E-03
+0.6177E+02 0.4245E-03
+0.6248E+02 0.3853E-03
+0.6319E+02 0.3467E-03
+0.6390E+02 0.3089E-03
+0.6461E+02 0.2719E-03
+0.6532E+02 0.2357E-03
+0.6603E+02 0.2007E-03
+0.6674E+02 0.1669E-03
+0.6745E+02 0.1345E-03
+0.6816E+02 0.1038E-03
+0.6887E+02 0.7482E-04
+0.6958E+02 0.4782E-04
+0.7029E+02 0.2286E-04"""}
+ form = TaskForm_remd_a(initial=data)
+ else:
form = TaskForm_remd_a(request.POST,request.FILES)
if form.is_valid():
task.name=form.cleaned_data["name"]
task.type="remd"
- task.myfile1=form.cleaned_data["file1"]
+ basename = str(task.owner)
+ suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+ task.jobdirname = "_".join([basename, suffix])
+
+ pdbid=form.cleaned_data["pdbid"]
+ if pdbid:
+ task.myfile1=load_pdbid(pdbid,task.jobdirname)
+ task.pdbcode=pdbid
+ else:
+ task.myfile1=form.cleaned_data["file1"]
task.md_start=form.cleaned_data["md_start"]
task.md_pdbref=form.cleaned_data["md_pdbref"]
task.md_seq=""
if task.md_start == "pdbstart" or task.md_pdbref:
seq,task.ssbond=from_pdb(task.myfile1)
+ task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
else:
seq=seq_add_x(form.cleaned_data["md_seq"])
+ task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
+
for i in range(0,len(seq),40):
task.md_seq=task.md_seq+seq[i:i+40]+" "
task.md_seed=form.cleaned_data["md_seed"]
task.md_nstep=form.cleaned_data["md_nstep"]
+ task.md_total_steps=task.md_nstep
task.md_dt=form.cleaned_data["md_dt"]
task.md_lang=form.cleaned_data["md_lang"]
task.md_tau=form.cleaned_data["md_tau"]
task.md_scal_fric=form.cleaned_data["md_scal_fric"]
+ task.min_maxfun=form.cleaned_data["min_maxfun"]
task.remd_nrep=form.cleaned_data["remd_nrep"]
task.remd_nstex=form.cleaned_data["remd_nstex"]
+ task.md_ntwx=form.cleaned_data["md_ntwx"]
+ task.md_ntwe=form.cleaned_data["md_ntwe"]
+ task.md_respa=form.cleaned_data["md_respa"]
+ if any(c.islower() for c in seq):
+ task.md_respa=False
+ task.damino=True
+
# task.remd_traj1file=form.cleaned_data["remd_traj1file"]
# task.remd_rest1file=form.cleaned_data["remd_rest1file"]
+ task.boxx=form.cleaned_data["boxx"]
+ task.boxy=form.cleaned_data["boxy"]
+ task.boxz=form.cleaned_data["boxz"]
+
task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
+ task.unres_ff=form.cleaned_data["unres_ff"]
+
+ task.scal_rad = form.cleaned_data["scal_rad"]
+ task.saxs_data = form.cleaned_data["saxs_data"]
+ task.wsaxs = form.cleaned_data["wsaxs"]
+ task.save()
+ return redirect('addmlist',task_id=task.id)
+ else:
+ data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
+ form = TaskForm_remd_a(initial=data)
+ basic_adv=False
+ p_type='replica exchange molecular dynamics - advanced options'
+ return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+
+@login_required
+def add_dock(request,task_id):
+ task = get_object_or_404(Task, id=task_id)
+ if request.method == 'POST':
+ if '_example' in request.POST:
+ data= {'name':task.name,'pdbid':'1BON:A','pdbid2':'1BON:B','md_seed':-12396738,'md_nstep':500000}
+ form = TaskForm_dock(initial=data)
+ else:
+ form = TaskForm_dock(request.POST,request.FILES)
+ if form.is_valid():
+ task.name=form.cleaned_data["name"]
+ task.type="dock"
+
basename = str(task.owner)
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
task.jobdirname = "_".join([basename, suffix])
+
+ pdbid=form.cleaned_data["pdbid"]
+ if pdbid:
+ task.myfile1=load_pdbid(pdbid,task.jobdirname)
+ task.pdbcode=pdbid
+ else:
+ task.myfile1=form.cleaned_data["file1"]
+
+ pdbid2=form.cleaned_data["pdbid2"]
+ if pdbid2:
+ task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
+ task.pdbcode2=pdbid2
+ seq2,ssbond2=from_pdb(task.myfile2)
+ else:
+ task.myfile2=form.cleaned_data["file2"]
+ if not task.myfile2:
+ seq2=seq_add_x(form.cleaned_data["md_seq"])
+ task.md_seq2=seq2
+ else:
+ seq2,ssbond2=from_pdb(task.myfile2)
+
+ task.md_ntwx=task.remd_nstex
+ task.md_start="pdbstart"
+ task.remd_multi_m='["3", "3", "3", "3", "3", "3", "3", "3"]'
+ if task.md_seq2 =='':
+ task.md_pdbref=True
+ task.md_respa=False
+ task.ssbond=""
+ task.dock_peptide=form.cleaned_data["dock_peptide"]
+
+ task.md_seq=""
+
+ seq1,ssbond1=from_pdb(task.myfile1)
+
+
+ if seq1[-1]=='X' and seq2[0]=='X':
+ seq=seq1+seq2
+ elif seq1[-1]!='X' and seq2[0]!='X':
+ seq=seq1+'XX'+seq2
+ else:
+ seq=seq1+'X'+seq2
+
+ for i in range(0,len(seq),40):
+ task.md_seq=task.md_seq+seq[i:i+40]+" "
+
+ task.md_seed=form.cleaned_data["md_seed"]
+
+ task.md_nstep=form.cleaned_data["md_nstep"]
+ task.md_total_steps=task.md_nstep
+
+ if any(c.islower() for c in seq):
+ task.md_respa=False
+ task.damino=True
+
+ box1=dock_box(task.myfile1)
+ if task.myfile2:
+ box2=dock_box(task.myfile2)
+ else:
+ box2=len(task.md_seq2)*2.0
+ task.boxx=(box1+box2)*1.2+20
+ task.boxy=(box1+box2)*1.2+20
+ task.boxz=(box1+box2)*1.2+20
+
+ task.ready=True
+
+
task.save()
+ if is_lazy_user(request.user):
+ return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
+ else:
+ return redirect('/')
+ else:
+ data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
+ form = TaskForm_dock(initial=data)
+ basic_adv=True
+ p_type='docking'
+ return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+
+@login_required
+def add_dock_a(request,task_id):
+ task = get_object_or_404(Task, id=task_id)
+ if request.method == 'POST':
+ if '_example' in request.POST:
+ data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
+ form = TaskForm_dock_a(initial=data)
+ else:
+ form = TaskForm_dock_a(request.POST,request.FILES)
+ if form.is_valid():
+ task.name=form.cleaned_data["name"]
+ task.type="dock"
+
+ basename = str(task.owner)
+ suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+ task.jobdirname = "_".join([basename, suffix])
+
+ pdbid=form.cleaned_data["pdbid"]
+ if pdbid:
+ task.myfile1=load_pdbid(pdbid,task.jobdirname)
+ task.pdbcode=pdbid
+ else:
+ task.myfile1=form.cleaned_data["file1"]
+
+ pdbid2=form.cleaned_data["pdbid2"]
+ if pdbid2:
+ task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
+ task.pdbcode2=pdbid2
+ else:
+ task.myfile2=form.cleaned_data["file2"]
+ if not task.myfile2:
+ seq2=seq_add_x(form.cleaned_data["md_seq"])
+ task.md_seq2=seq2
+ else:
+ seq2,ssbond2=from_pdb(task.myfile2)
+
+
+ task.md_ntwx=task.remd_nstex
+ task.md_start="pdbstart"
+ task.md_pdbref=True
+ task.md_respa=False
+ task.ssbond=""
+ task.dock_peptide=form.cleaned_data["dock_peptide"]
+
+ task.md_seq=""
+
+ seq1,ssbond1=from_pdb(task.myfile1)
+
+ if seq1[-1]=='X' and seq2[0]=='X':
+ seq=seq1+seq2
+ elif seq1[-1]!='X' and seq2[0]!='X':
+ seq=seq1+'XX'+seq2
+ else:
+ seq=seq1+'X'+seq2
+
+ for i in range(0,len(seq),40):
+ task.md_seq=task.md_seq+seq[i:i+40]+" "
+
+ task.md_seed=form.cleaned_data["md_seed"]
+
+ task.md_nstep=form.cleaned_data["md_nstep"]
+ task.md_total_steps=task.md_nstep
+
+ task.md_dt=form.cleaned_data["md_dt"]
+ task.md_lang=form.cleaned_data["md_lang"]
+ task.md_tau=form.cleaned_data["md_tau"]
+ task.md_scal_fric=form.cleaned_data["md_scal_fric"]
+ task.min_maxfun=form.cleaned_data["min_maxfun"]
+ task.remd_nrep=form.cleaned_data["remd_nrep"]
+ task.remd_nstex=form.cleaned_data["remd_nstex"]
+ task.md_ntwx=form.cleaned_data["md_ntwx"]
+ task.md_ntwe=form.cleaned_data["md_ntwe"]
+
+ task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
+ task.unres_ff=form.cleaned_data["unres_ff"]
+
+ if any(c.islower() for c in seq):
+ task.md_respa=False
+ task.damino=True
+
+ box1=dock_box(task.myfile1)
+ if task.myfile2:
+ box2=dock_box(task.myfile2)
+ else:
+ box2=len(task.md_seq2)*2.0
+ task.boxx=(box1+box2)*1.2+20
+ task.boxy=(box1+box2)*1.2+20
+ task.boxz=(box1+box2)*1.2+20
+
+ task.save()
return redirect('addmlist',task_id=task.id)
+
else:
- data= {'name':task.name}
- form = TaskForm_remd_a(initial=data)
+ data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
+ form = TaskForm_dock_a(initial=data)
basic_adv=False
- p_type='replica exchange molecular dynamics - advanced options'
+ p_type='docking - advanced options'
return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+
+@login_required
def addmlist(request,task_id):
task = get_object_or_404(Task, id=task_id)
if request.method == 'POST':
task.ready=True
task.save()
- return redirect('/')
+ if is_lazy_user(request.user):
+ return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
+ else:
+ return redirect('/')
else:
+ if task.example == 'casp12':
+ data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
+ '["2", "2", "2", "2", "2", "2", "2", "2"]',
+ 'temperatures':
+ '["270", "280", "290", "300", "310", "320", "330", "340"]'
+ }
+ elif task.unres_ff == 'FF2':
data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
'["1", "1", "1", "1", "1", "1", "1", "1"]',
'temperatures':
'["270", "280", "290", "300", "310", "320", "330", "345"]'
}
- form = TaskForm_list(task.remd_nrep,initial=data)
+ else:
+ data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
+ '["1", "1", "1", "1", "1", "1", "1", "1"]',
+ 'temperatures':
+ '["250", "260", "270", "280", "290", "300", "315", "330"]'
+ }
+
+ form = TaskForm_list(task.remd_nrep,initial=data)
p_type='replica exchange molecular dynamics - advanced options'
return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
task = get_object_or_404(Task, id=task_id)
return render(request, "details.html",{'task':task})
+
+def details1(request,user_id,task_id):
+ task = get_object_or_404(Task, id=task_id)
+ return render(request, "details1.html",{'task':task})
+
+
@login_required
def delete(request, task_id):
Task.objects.get(id=task_id).delete()
return redirect('/')
+
+@login_required
+def restart(request, task_id):
+ task = get_object_or_404(Task, id=task_id)
+ restart0(task)
+ return redirect('/')
+
+def add_restart_inp():
+ with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
+ for line in f1:
+ if 'reset_vel=' in line:
+ f2.write('{:79}'.format('restart'+line[7:]))
+ else:
+ f2.write(line)
+ os.remove('file.inp')
+ os.rename('file.inp.tmp','file.inp')
+ return
+
+def restart0(task):
+ if os.path.isfile(task.jobdirname+'/finished'):
+ os.remove(task.jobdirname+'/finished')
+ task.running =1
+ task.done=False
+ task.md_total_steps = task.md_total_steps+task.md_nstep
+ task.save()
+ if task.type == 'md':
+ os.chdir(task.jobdirname)
+ add_restart_inp()
+ ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ os.chdir('..')
+ elif task.type == 'remd':
+ os.chdir(task.jobdirname)
+ add_restart_inp()
+ tmp1=json.loads(task.remd_multi_m)
+ nreplicas=sum(map(int, tmp1))
+ with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
+ for line in f1:
+ if 'rec_end=' in line:
+ rec=task.md_total_steps/task.md_ntwx
+ f2.write('nfile_cx=1 rec_start='+str(rec/10)
+ +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
+ elif 'isampl=' in line:
+ if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
+ isampl=1
+ else:
+ isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
+ f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
+ else:
+ f2.write(line)
+ os.remove('file_wham.inp')
+ os.rename('file_wham.tmp','file_wham.inp')
+ ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ os.chdir('..')
+ return
+
+def restart1(request, user_id, task_id):
+ task = get_object_or_404(Task, id=task_id)
+ user = task.owner
+ restart0(task)
+ return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
+
+
+def refresh_done1(request, task_id):
+ task = get_object_or_404(Task, id=task_id)
+ user = task.owner
+ refresh_done0(task)
+
+ proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
+ njob=0
+ nq=0
+ for line in proc.stdout:
+ if 'piasek4' in line:
+ if line.split()[1]=='test_server':
+ njob+=1
+ if line.split()[-2]=='Q':
+ nq+=1
+ variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
+
+ return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
+
@login_required
def refresh_done(request):
user = request.user
- tasks = Task.objects.filter(owner=user)
+ tasks = Task.objects.filter(owner=user).order_by('-created_date')
+ tasks_count = Task.objects.filter(owner=user).count()
+ alldone = 1
for task in tasks:
+ refresh_done0(task)
+ if not task.done:
+ alldone=0
+
+ proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
+ njob=0
+ nq=0
+ for line in proc.stdout:
+ if 'piasek4' in line:
+ if line.split()[1]=='test_server':
+ njob+=1
+ if line.split()[-2]=='Q':
+ nq+=1
+ variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
+
+ if is_lazy_user(request.user):
+ return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
+ else:
+ return render(request, "index.html", {
+ 'tasks': tasks ,
+ 'variable' : variable,
+ 'alldone': alldone,
+ 'tasks_count':tasks_count
+ })
+
+
+def refresh_done0(task):
if os.path.isfile(task.jobdirname+'/finished') and not task.done:
task.done=True
if 'Total wall' in line:
text=text+line
- elif task.type=='remd':
+ elif task.type=='remd' or task.type=='dock':
j=0
- text="Acceptance for replica exchanges\n"
+ text="Acceptance for replica exchanges and number of exchange attempts\n"
for line in f:
if 'ACC' in line:
j+=1
- text=text+line
+ text=text+' '.join(line.split()[2:])+"\n"
if j==task.remd_nrep:
j=1
- text="Acceptance for replica exchanges\n"+line
+ text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
if 'Total wall' in line:
text=text+line
task.results_text=text
- if task.md_pdbref and task.type=='remd':
+ if task.md_pdbref and task.type=='remd' or task.type=='dock' and task.md_seq2 == '':
for i in range(1,6):
+ try:
with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
line=f.readline()
if i==1:
- task.remd_model1=' '.join(line.split()[-6:])
+ task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
elif i==2:
- task.remd_model2=' '.join(line.split()[-6:])
+ task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
elif i==3:
- task.remd_model3=' '.join(line.split()[-6:])
+ task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
elif i==4:
- task.remd_model4=' '.join(line.split()[-6:])
+ task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
elif i==5:
- task.remd_model5=' '.join(line.split()[-6:])
+ task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
+ except EnvironmentError:
+ print 'file_wham_T*pdb open error'
+ for i in range(1,6):
+ with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
+ text=''
+ for line in f:
+ if 'RMSD of the common residues=' in line:
+ text=' RMSD='+line.split()[5]
+ if 'TM-score =' in line:
+ text=text+' TMscore='+line.split()[2]
+ if 'GDT-TS-score=' in line:
+ text=text+' GDT_TS='+line.split()[1]
+
+ if i==1:
+ task.remd_model1=task.remd_model1+text
+ elif i==2:
+ task.remd_model2=task.remd_model2+text
+ elif i==3:
+ task.remd_model3=task.remd_model3+text
+ elif i==4:
+ task.remd_model4=task.remd_model4+text
+ elif i==5:
+ task.remd_model5=task.remd_model5+text
+
+ if task.type=='dock':
+ for i in range(1,6):
+ with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
+ text=''
+ for line in f:
+ if 'Fnat' in line:
+ text=' Fnat='+line.split()[1]
+ if 'iRMS' in line:
+ text=text+' iRMS='+line.split()[1]
+ if 'LRMS' in line:
+ text=text+' LRMS='+line.split()[1]
+ if 'CAPRI' in line and not 'DockQ_CAPRI' in line:
+ text=text+' CAPRI='+line.split()[1]
+ if 'DockQ_CAPRI' in line:
+ text=text+' DockQ_CAPRI= '+line.split()[1]
+ if 'DockQ ' in line:
+ text=text+' DockQ='+line.split()[1]
+
+ if i==1:
+ task.remd_model1=task.remd_model1+text
+ elif i==2:
+ task.remd_model2=task.remd_model2+text
+ elif i==3:
+ task.remd_model3=task.remd_model3+text
+ elif i==4:
+ task.remd_model4=task.remd_model4+text
+ elif i==5:
+ task.remd_model5=task.remd_model5+text
- if task.type=='remd':
+
+ if task.type=='remd' or task.type=='dock':
with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
for line in f:
if i>6:
break
if i==1:
- task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
+ task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[-2]
elif i==2:
- task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
+ task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[-2]
elif i==3:
- task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
+ task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[-2]
elif i==4:
- task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
+ task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[-2]
elif i==5:
- task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
+ task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[-2]
elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
if (task.type=='min'):
task.running =1
+ with open(task.jobdirname+'/file.out_GB000', 'r') as f:
+ line=''
+ for line in f:
+ pass
+ if line != '':
+ last = line.split()[0]
+ else:
+ last = 0
+ try:
+ task.running=int(1+int(last)*100.0/task.min_maxmin)
+ except:
+ pass
+ if task.running>100:
+ task.running=100
else:
with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
line=''
task.running=100
task.save()
- proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
- njob=0
- nq=0
- for line in proc.stdout:
- if 'piasek4' in line:
- if line.split()[1]=='test_server':
- njob+=1
- if line.split()[-2]=='Q':
- nq+=1
- variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
-
- return render(request, "index.html", {
- 'tasks': tasks ,
- 'variable' : variable
- })
-# return redirect('/')
+ return
+
+@login_required
+def zip_all_files(request, task_id):
+ import os, zipfile
+ from django.http import HttpResponse
+ from wsgiref.util import FileWrapper
+ from django.core.files.temp import NamedTemporaryFile
+
+ task = get_object_or_404(Task, id=task_id)
+
+ temp=NamedTemporaryFile()
+ archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
+ for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
+ for file1 in filenames:
+ archive.write(dirpath+"/"+file1,file1)
+ archive.close()
+ temp.seek(0)
+ wrapper = FileWrapper(temp)
+ response = HttpResponse(wrapper, content_type='application/zip')
+ response['Content-Disposition'] = 'attachment; filename=all.zip'
+ return response