X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;f=django_simple%2Ftodo%2Fviews.py;h=4db374750591bc07de6cca8f49d0e90c695c7651;hb=d368b6f6d2c47c7f30ca7a0d8dfb02c73de314da;hp=28a060308bdccce5c6911a73b6f0a7998087a674;hpb=2c4b03af8bd8f39f4a501fb0beeecf80d1946f63;p=django_unres.git diff --git a/django_simple/todo/views.py b/django_simple/todo/views.py index 28a0603..4db3747 100644 --- a/django_simple/todo/views.py +++ b/django_simple/todo/views.py @@ -9,6 +9,11 @@ import subprocess import json from lazysignup.decorators import allow_lazy_user from lazysignup.utils import is_lazy_user +import random +import logging + +logging.basicConfig() +logger = logging.getLogger(__name__) res_codes = [ # 20 canonical amino acids @@ -20,16 +25,101 @@ res_codes = [ ('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) @@ -42,32 +132,24 @@ def from_pdb(file): chain_start = {} chain_end = {} unres_shift = {} - chain=[] - ichain=0 + chain_sorted=[] newchain = True - + i='' for line in file: - if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:': - tmp=line[18:] - chain_=tmp.split(', ') - chain_[-1]=chain_[-1][0] - chain.extend(chain_) - if line[0:6] == 'ATOM ' and line[13:15] == 'CA': aa = three_to_one.get(line[17:20]) i = int(line[22:26]) + ch = line[21:22] if newchain or i!=ires[-1]: sequence.append(aa) ires.append(i) if newchain: - if len(chain)>0: - chain_start[chain[ichain]]=i + chain_start[ch]=i + chain_sorted.extend(ch) newchain = False - if line[0:3] == 'TER': + if line[0:3] == 'TER' and i != '': sequence.append('XX') - if len(chain)>0: - chain_end[chain[ichain]]=i - ichain=ichain+1 + chain_end[ch]=i newchain = True if line[0:6] == 'SSBOND': b=[] @@ -80,6 +162,8 @@ def from_pdb(file): 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': @@ -91,7 +175,7 @@ def from_pdb(file): # 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: + 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)] @@ -104,8 +188,9 @@ def index(request): user = request.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 @@ -139,9 +224,7 @@ def add_min(request,task_id): task.jobdirname = "_".join([basename, suffix]) if pdbid: - os.mkdir(task.jobdirname) - task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb', - task.jobdirname+'/plik.pdb') + task.myfile1=load_pdbid(pdbid,task.jobdirname) task.pdbcode=pdbid else: task.myfile1=form.cleaned_data["file1"] @@ -177,7 +260,7 @@ def add_min_a(request,task_id): 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"] @@ -190,9 +273,7 @@ def add_min_a(request,task_id): pdbid=form.cleaned_data["pdbid"] if pdbid: - os.mkdir(task.jobdirname) - task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb', - task.jobdirname+'/plik.pdb') + task.myfile1=load_pdbid(pdbid,task.jobdirname) task.pdbcode=pdbid else: task.myfile1=form.cleaned_data["file1"] @@ -228,7 +309,7 @@ def add_md(request,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_pdbref':True,'md_temp':200,'md_seed':-39912345} form = TaskForm_md(initial=data) else: form = TaskForm_md(request.POST,request.FILES) @@ -239,6 +320,9 @@ def add_md(request,task_id): 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.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") @@ -246,9 +330,7 @@ def add_md(request,task_id): pdbid=form.cleaned_data["pdbid"] if pdbid: - os.mkdir(task.jobdirname) - task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb', - task.jobdirname+'/plik.pdb') + task.myfile1=load_pdbid(pdbid,task.jobdirname) task.pdbcode=pdbid else: task.myfile1=form.cleaned_data["file1"] @@ -266,6 +348,10 @@ def add_md(request,task_id): 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 task.save() @@ -274,7 +360,7 @@ def add_md(request,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' @@ -286,7 +372,7 @@ def add_md_a(request,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_pdbref':True,'md_mdpdb':True,'md_seed':-39912345} form = TaskForm_md_a(initial=data) else: form = TaskForm_md_a(request.POST,request.FILES) @@ -300,9 +386,7 @@ def add_md_a(request,task_id): pdbid=form.cleaned_data["pdbid"] if pdbid: - os.mkdir(task.jobdirname) - task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb', - task.jobdirname+'/plik.pdb') + task.myfile1=load_pdbid(pdbid,task.jobdirname) task.pdbcode=pdbid else: task.myfile1=form.cleaned_data["file1"] @@ -312,8 +396,11 @@ def add_md_a(request,task_id): 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]+" " @@ -324,6 +411,7 @@ def add_md_a(request,task_id): 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"] @@ -332,6 +420,10 @@ def add_md_a(request,task_id): 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"] @@ -345,7 +437,7 @@ def add_md_a(request,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' @@ -356,7 +448,7 @@ 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} + 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) @@ -371,9 +463,7 @@ def add_remd(request,task_id): pdbid=form.cleaned_data["pdbid"] if pdbid: - os.mkdir(task.jobdirname) - task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb', - task.jobdirname+'/plik.pdb') + task.myfile1=load_pdbid(pdbid,task.jobdirname) task.pdbcode=pdbid else: task.myfile1=form.cleaned_data["file1"] @@ -394,6 +484,11 @@ def add_remd(request,task_id): 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 @@ -405,7 +500,7 @@ def add_remd(request,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' @@ -413,12 +508,164 @@ def add_remd(request,task_id): @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':'1E0G','md_pdbref':True, - 'md_nstep':1000000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2', - 'remd_cluter_temp':270} + 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) @@ -432,9 +679,7 @@ def add_remd_a(request,task_id): pdbid=form.cleaned_data["pdbid"] if pdbid: - os.mkdir(task.jobdirname) - task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb', - task.jobdirname+'/plik.pdb') + task.myfile1=load_pdbid(pdbid,task.jobdirname) task.pdbcode=pdbid else: task.myfile1=form.cleaned_data["file1"] @@ -444,8 +689,11 @@ def add_remd_a(request,task_id): 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]+" " @@ -454,14 +702,21 @@ def add_remd_a(request,task_id): 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"] @@ -472,16 +727,221 @@ def add_remd_a(request,task_id): 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} + 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':'2HPL:A','md_seq':'DDLYG','dock_peptide':True,'md_seed':-39912345,'md_nstep':600000} + form = TaskForm_dock_a(initial=data) + task.example='dock_peptide' + task.save() + 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 + 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" + 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 + + 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.remd_cluster_n=form.cleaned_data["remd_cluster_n"] + 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,'md_seed':-random.randint(10000000,99999999)} + form = TaskForm_dock_a(initial=data) + basic_adv=False + 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': @@ -497,7 +957,19 @@ def addmlist(request,task_id): else: return redirect('/') else: - if task.unres_ff == 'E0LL2Y': + 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.example == 'dock_peptide': + data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing': + '["4", "8", "4", "4", "4", "4", "4", "4"]', + 'temperatures': + '["270", "280", "290", "300", "310", "320", "330", "345"]' + } + elif task.unres_ff == 'FF2': data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing': '["1", "1", "1", "1", "1", "1", "1", "1"]', 'temperatures': @@ -517,18 +989,106 @@ def addmlist(request,task_id): @login_required def details(request,task_id): task = get_object_or_404(Task, id=task_id) - return render(request, "details.html",{'task':task}) + try: + remd_models=json.loads(task.remd_models) + except: + remd_models=[] + remd_models.append(task.remd_model1) + remd_models.append(task.remd_model2) + remd_models.append(task.remd_model3) + remd_models.append(task.remd_model4) + remd_models.append(task.remd_model5) + return render(request, "details.html",{'task':task,'remd_models':remd_models,'range':range(1,task.remd_cluster_n+1)}) def details1(request,user_id,task_id): task = get_object_or_404(Task, id=task_id) - return render(request, "details1.html",{'task':task}) + try: + remd_models=json.loads(task.remd_models) + except: + remd_models=[] + remd_models.append(task.remd_model1) + remd_models.append(task.remd_model2) + remd_models.append(task.remd_model3) + remd_models.append(task.remd_model4) + remd_models.append(task.remd_model5) + return render(request, "details1.html",{'task':task,'remd_models':remd_models,'range':range(1,task.remd_cluster_n+1)}) @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' or task.type == 'dock': + 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') + if task.type == 'dock': + with open('pbs8.csh','r') as f1, open ('pbs8.tmp','w') as f2: + for line in f1: + if 'generator_v13' in line: + f2.write('#'+line) + else: + f2.write(line) + os.remove('pbs8.csh') + os.rename('pbs8.tmp','pbs8.csh') + 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) @@ -553,8 +1113,12 @@ def refresh_done1(request, task_id): def refresh_done(request): user = request.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 @@ -572,7 +1136,9 @@ def refresh_done(request): else: return render(request, "index.html", { 'tasks': tasks , - 'variable' : variable + 'variable' : variable, + 'alldone': alldone, + 'tasks_count':tasks_count }) @@ -599,17 +1165,17 @@ def refresh_done0(task): 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 @@ -617,25 +1183,17 @@ def refresh_done0(task): task.results_text=text - if task.md_pdbref and task.type=='remd': + remd_models=[] + if task.md_pdbref and task.type=='remd' or task.type=='dock' and task.md_seq2 == '': - for i in range(1,6): + for i in range(1,task.remd_cluster_n+1): 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:]) - elif i==2: - task.remd_model2=' '.join(line.split()[-6:]) - elif i==3: - task.remd_model3=' '.join(line.split()[-6:]) - elif i==4: - task.remd_model4=' '.join(line.split()[-6:]) - elif i==5: - task.remd_model5=' '.join(line.split()[-6:]) + remd_models.append('Cluster'+str(i)+' '+' '.join(line.split()[-3:])) except EnvironmentError: print 'file_wham_T*pdb open error' - for i in range(1,6): + for i in range(1,task.remd_cluster_n+1): with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f: text='' for line in f: @@ -646,20 +1204,30 @@ def refresh_done0(task): 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=='remd': + remd_models[i-1]=remd_models[i-1]+text + + if task.type=='dock': + for i in range(1,task.remd_cluster_n+1): + 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] + + remd_models[i-1]=remd_models[i-1]+text +# logger.warning("models %d %s" % (i,remd_models)) + + if task.type=='remd' or task.type=='dock': with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f: for line in f: @@ -667,25 +1235,34 @@ def refresh_done0(task): i=0 for line1 in f: i+=1 - if i>6: + if i>task.remd_cluster_n: break - if i==1: - 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] - elif i==3: - 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] - elif i==5: - task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2] + try: + remd_models[i-1]=remd_models[i-1]+' Cluster'+str(i)+' probability= '+line1.split()[-2] + except: + if len(line1.split())==4: + remd_models.append(' Cluster'+str(i)+' probability= '+line1.split()[-2]) - - + task.remd_models=json.dumps(remd_models) +# logger.warning("models%s" % task.remd_models) task.save() 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='' @@ -702,3 +1279,24 @@ def refresh_done0(task): 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