From: Cezary Czaplewski Date: Thu, 18 Jan 2018 10:18:47 +0000 (+0100) Subject: secondary structure restraints for md and remd X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=commitdiff_plain;h=a6e111e381a874bd15dd6dcb33fdeb18079e3286;p=django_unres.git secondary structure restraints for md and remd --- diff --git a/django_simple/todo/forms.py b/django_simple/todo/forms.py index 16d942a..c0b1667 100644 --- a/django_simple/todo/forms.py +++ b/django_simple/todo/forms.py @@ -7,6 +7,14 @@ from .models import FF_CHOICE import json import urllib +def code_2d(line): + msg='' + set ='HEC-' + line2 = ''.join([c for c in line if c in set]) + if line2 != line: + msg='use only H,E,C or - letters' + return(msg) + def pdb_missing_res(file): msg='' newchain = True @@ -230,6 +238,11 @@ class TaskForm_md_a(forms.Form): 'field is ignored when uploading starting/reference PDB file', required=False, widget=forms.Textarea(attrs={'cols': 70, 'rows': 2})) + md_2d = forms.CharField(label='Secondary structure restraints', + help_text='single letter code: H - helix, E - extended/beta, C or - no restraints', + required=False, + widget=forms.Textarea(attrs={'cols': 70, 'rows': 2})) + file1 = forms.FileField(label='Upload a PDB file',required=False, help_text='starting structure for pdbstart/reference structure') pdbid = forms.CharField(min_length=4,max_length=4,required=False, @@ -272,6 +285,7 @@ class TaskForm_md_a(forms.Form): pdbid = cleaned_data.get("pdbid") md_seq = cleaned_data.get("md_seq") md_pdbref = cleaned_data.get("md_pdbref") + md_2d = cleaned_data.get("md_2d") if md_start == 'pdbstart' and not (file1 or pdbid): msg = 'pdbstart with no PDB file or code' @@ -301,7 +315,11 @@ class TaskForm_md_a(forms.Form): msg=pdb_missing_res(file1) if msg != '': self.add_error('file1',msg) - + + if md_2d: + msg=code_2d(md_2d) + if msg != '': + self.add_error('md_2d',msg) class TaskForm_remd(forms.Form): name = forms.CharField(max_length=20) @@ -374,6 +392,10 @@ class TaskForm_remd_a(forms.Form): 'field is ignored when uploading starting/reference PDB file', required=False, widget=forms.Textarea(attrs={'cols': 70, 'rows': 2})) + md_2d = forms.CharField(label='Secondary structure restraints', + help_text='single letter code: H - helix, E - extended/beta, C or - no restraints', + required=False, + widget=forms.Textarea(attrs={'cols': 70, 'rows': 2})) file1 = forms.FileField(label='Upload a PDB file',required=False, help_text='starting structure for pdbstart/reference structure') pdbid = forms.CharField(min_length=4,max_length=4,required=False, @@ -432,6 +454,7 @@ class TaskForm_remd_a(forms.Form): pdbid = cleaned_data.get("pdbid") md_seq = cleaned_data.get("md_seq") md_pdbref = cleaned_data.get("md_pdbref") + md_2d = cleaned_data.get("md_2d") if md_start == 'pdbstart' and not (file1 or pdbid): msg = 'pdbstart with no PDB file or code' @@ -462,6 +485,11 @@ class TaskForm_remd_a(forms.Form): if msg != '': self.add_error('file1',msg) + if md_2d: + msg=code_2d(md_2d) + if msg != '': + self.add_error('md_2d',msg) + class TaskForm_list(forms.Form): diff --git a/django_simple/todo/jobfiles.py b/django_simple/todo/jobfiles.py index 2badbc2..4d9270c 100644 --- a/django_simple/todo/jobfiles.py +++ b/django_simple/todo/jobfiles.py @@ -13,6 +13,36 @@ import textwrap logging.basicConfig() logger = logging.getLogger(__name__) +def seq_2d_write(line): + line=line.replace(" ", "") + out='{:d}\n{:6.1f}\n'.format(len(line),50.0) + for i in range(1,4): + out=out+'{:5d}{:8.3f}{:8.3f}\n'.format(i,0.0,180.0) + for e in line[:-3]: + i+=1 + if e=='-': + out=out+'{:5d}{:8.3f}{:8.3f}\n'.format(i,0.0,180.0) + elif e=='H': + out=out+'{:5d}{:8.3f}{:8.3f}\n'.format(i,50.0,20.0) + elif e=='E': + out=out+'{:5d}{:8.3f}{:8.3f}\n'.format(i,180.0,40.0) + return(out) + +def seq_2d_write_50(line): + line=line.replace(" ", "") + out='{:d}\n'.format(len(line)) + for i in range(1,4): + out=out+'{:5d}{:8.3f}{:8.3f}{:8.3f}\n'.format(i,0.0,180.0,50.0) + for e in line[:-3]: + i+=1 + if e=='-': + out=out+'{:5d}{:8.3f}{:8.3f}{:8.3f}\n'.format(i,0.0,180.0,50.0) + elif e=='H': + out=out+'{:5d}{:8.3f}{:8.3f}{:8.3f}\n'.format(i,50.0,20.0,50.0) + elif e=='E': + out=out+'{:5d}{:8.3f}{:8.3f}{:8.3f}\n'.format(i,180.0,40.0,50.0) + return(out) + def write_ssbond(ssbond): list=[] if ssbond!='': @@ -211,8 +241,10 @@ CUTOFF=7.00000 WCORR4=0.00000""" if instance.type == 'min' or instance.md_start == 'pdbstart': f.write('plik.pdb\n') f.write(write_ssbond(instance.ssbond)) - f.write('0\n') - + if instance.md_seq_2d == '': + f.write('0\n') + else: + f.write(seq_2d_write(instance.md_seq_2d)) if instance.type == 'md' and instance.md_start != 'pdbstart': @@ -221,7 +253,12 @@ CUTOFF=7.00000 WCORR4=0.00000""" f.write(str(len(seq))+'\n') for i in range(0,len(seq),80): f.write(seq[i:i+80]+'\n') - f.write('0\n0\n') + f.write('0\n') + if instance.md_2d == '': + f.write('0\n') + else: + f.write(seq_2d_write(instance.md_2d)) + if instance.type == 'remd' and instance.md_start != 'pdbstart': @@ -230,7 +267,12 @@ CUTOFF=7.00000 WCORR4=0.00000""" f.write(str(len(seq))+'\n') for i in range(0,len(seq),80): f.write(seq[i:i+80]+'\n') - f.write('0\n0\n') + f.write('0\n') + if instance.md_2d == '': + f.write('0\n') + else: + f.write(seq_2d_write(instance.md_2d)) + if instance.saxs_data != '': lines=instance.saxs_data.split('\n') @@ -322,19 +364,23 @@ CUTOFF=7.00000 WCORR4=0.00000""" if instance.md_pdbref: f.write('{:79}'.format('SEED='+str(instance.md_seed)+' isampl='+str(isampl)+ ' einicheck=1 rescale=2 delta=0.02 cxfile classify')+'&\n') - f.write('BOXX='+str(instance.boxx)+' BOXY='+str(instance.boxy)+ - ' BOXZ='+str(instance.boxz)+cntrl_saxs +'\n') else: f.write('{:79}'.format('SEED='+str(instance.md_seed)+' isampl='+str(isampl)+ ' einicheck=1 rescale=2 delta=0.02 cxfile')+'&\n') - f.write('BOXX='+str(instance.boxx)+' BOXY='+str(instance.boxy)+ + if instance.md_2d != '': + f.write('{:79}'.format(' WITH_DIHED_CONSTR')+'&\n') + f.write('BOXX='+str(instance.boxx)+' BOXY='+str(instance.boxy)+ ' BOXZ='+str(instance.boxz)+cntrl_saxs +'\n') + f.write('nres='+str(len(seq))+' one_letter\n') for i in range(0,len(seq),80): f.write(seq[i:i+80]+'\n') f.write(write_ssbond(instance.ssbond)) + if instance.md_2d != '': + f.write(seq_2d_write_50(instance.md_2d)) + if instance.saxs_data != '': fsaxs = open(instance.jobdirname+'/saxs.data', 'w') lines=instance.saxs_data.split('\n') @@ -366,12 +412,16 @@ CUTOFF=7.00000 WCORR4=0.00000""" f.write('{:79}'.format('nres='+str(len(seq)) +' one_letter rescale=2 PRINT_CART PDBOUT=1 iopt=1' +' temper='+str(instance.remd_cluter_temp))+'&\n') + if instance.md_2d != '': + f.write('{:79}'.format(' WITH_DIHED_CONSTR')+'&\n') f.write('BOXX='+str(instance.boxx)+' BOXY='+str(instance.boxy)+ ' BOXZ='+str(instance.boxz)+cntrl_saxs +'\n') f.write(w+'\n') for i in range(0,len(seq),80): f.write(seq[i:i+80]+'\n') f.write(write_ssbond(instance.ssbond)) + if instance.md_2d != '': + f.write(seq_2d_write_50(instance.md_2d)) if instance.saxs_data != '': lines=instance.saxs_data.split('\n') for line in lines: diff --git a/django_simple/todo/models.py b/django_simple/todo/models.py index da15522..ee54314 100644 --- a/django_simple/todo/models.py +++ b/django_simple/todo/models.py @@ -65,6 +65,7 @@ class Task(models.Model): md_scal_fric = models.FloatField(default=0.02) md_mdpdb = models.BooleanField(default=False) md_seq = models.TextField(max_length=2000,default='') + md_2d = models.TextField(max_length=2000,default='') #remd remd_nrep = models.IntegerField(default=8) diff --git a/django_simple/todo/templates/details.html b/django_simple/todo/templates/details.html index af51ef1..e2251f3 100644 --- a/django_simple/todo/templates/details.html +++ b/django_simple/todo/templates/details.html @@ -77,6 +77,13 @@ Created {{ task.created_date }}
  • +
    secondary structure + restraints
    +
    {{ task.md_2d}}
    +
  • + + +
  • SSBOND
    {{ task.ssbond}}
  • diff --git a/django_simple/todo/views.py b/django_simple/todo/views.py index 6a244b0..0387f29 100644 --- a/django_simple/todo/views.py +++ b/django_simple/todo/views.py @@ -29,12 +29,45 @@ res_codes = [ three_to_one = dict(res_codes) +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' and sequence[0] != 'g': + if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X': sequence='X'+sequence - if sequence[-1] != 'G' and sequence[-1] != 'g': + if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X': sequence=sequence+'X' - set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnghlrwaveym' + set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym' sequence = ''.join([c for c in sequence if c in set]) return(sequence) @@ -311,8 +344,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]+" " @@ -488,8 +524,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]+" "