'''
(c) 2012 Thomas Holder, MPI for Developmental Biology
License: BSD-2-Clause
'''
if not __name__.endswith('.fasta'):
raise Exception("Must do 'import psico.fasta' instead of 'run ...'")
import sys
from pymol import cmd
_auto_arg0_zoom = cmd.auto_arg[0]['zoom']
[docs]
def fasta(selection='(all)', gapped=1, wrap=70, filename='', quiet=1, *, _self=cmd):
'''
DESCRIPTION
Print sequence in FASTA format
ARGUMENTS
selection = string: atom selection {default: all}
gapped = integer: put missing residues as dashes into the sequence {default: 1}
wrap = integer: wrap lines, 0 for no wrapping {default: 70}
SEE ALSO
pir, pymol.exporting.get_fastastr
'''
from . import one_letter
gapped, wrap = int(gapped), int(wrap)
class prev:
key = None
col = 0
if filename:
out = open(filename, 'w')
else:
out = sys.stdout
def write(c):
if wrap > 0 and prev.col == wrap:
out.write('\n')
prev.col = 0
prev.col += 1
out.write(c)
def callback(key, resv, resn):
if key != prev.key:
# different chain
if prev.col > 0:
out.write('\n')
out.write('>%s_%s\n' % key)
prev.key = key
prev.col = 0
elif resv == prev.resv:
# same residue
return
elif gapped:
for _ in range(resv - prev.resv - 1):
# gap
write('-')
prev.resv = resv
write(one_letter.get(resn, 'X'))
_self.iterate('(%s) & polymer' % (selection),
'_cb((model, chain), resv, resn)',
space={'_cb': callback})
if prev.col > 0:
out.write('\n')
if filename:
if not int(quiet):
print(' Wrote sequence to "%s"' % filename)
out.close()
[docs]
def pir(selection='(all)', wrap=70, *, _self=cmd):
'''
DESCRIPTION
Print sequence in PIR format
SEE ALSO
fasta
'''
from . import one_letter
from chempy import cpv
wrap = int(wrap)
for obj in _self.get_object_list('(' + selection + ')'):
seq = []
prev_coord = None
model = _self.get_model('/%s////CA and guide and (%s)' % (obj, selection))
for atom in model.atom:
if prev_coord is not None and cpv.distance(atom.coord, prev_coord) > 4.0:
seq.append('/\n')
prev_coord = atom.coord
seq.append(one_letter.get(atom.resn, 'X'))
seq.append('*')
print('>P1;%s' % (obj))
print('structure:%s:%s:%s:%s:%s::::' % (
obj,
model.atom[0].resi,
model.atom[0].chain,
model.atom[-1].resi,
model.atom[-1].chain,
))
if wrap < 1:
print(''.join(seq))
continue
for i in range(0, len(seq), wrap):
print(''.join(seq[i:i + wrap]))
[docs]
def save_colored_fasta(filename, selection='(all)', gapped=1, quiet=1, *, _self=cmd):
'''
DESCRIPTION
Save a html file with colored (by C-alpha atoms) fasta sequence.
'''
from . import one_letter
from pymol import Scratch_Storage
gapped = int(gapped)
selection = '(%s) and polymer and guide' % (selection)
html = []
stored = Scratch_Storage()
def callback(resv, resn, color):
if stored.resv is None:
stored.resv = resv - (resv % 70)
if gapped:
while stored.resv + 1 < resv:
callback(stored.resv + 1, '-', 25)
stored.resv += 1
if stored.resv % 70 == 1:
html.append(('</font>\n<br>%4d <font>' % (resv)).replace(' ', ' '))
stored.color = None
c = _self.get_color_tuple(color)
color = '#%02x%02x%02x' % tuple(int(0xFF * v) for v in c)
aa = one_letter.get(resn, '-')
if color != stored.color:
html.append('</font><font color="' + color + '">')
stored.color = color
html.append(aa)
for obj in _self.get_object_list('(' + selection + ')'):
for chain in _self.get_chains('model %s and (%s)' % (obj, selection)):
sele = 'model %s and chain "%s" and (%s)' % (obj, chain, selection)
html.append('\n<br>>%s_%s<font>' % (obj, chain))
stored.resv = None if gapped else 0
stored.color = None
_self.iterate(sele, 'callback(resv, resn, color)', space=locals())
html.append('</font>')
handle = open(filename, 'w')
print('<html><body style="font-family:monospace">', file=handle)
print(''.join(html), file=handle)
print('</body></html>', file=handle)
handle.close()
cmd.extend('fasta', fasta)
cmd.extend('pir', pir)
cmd.extend('save_colored_fasta', save_colored_fasta)
cmd.auto_arg[0].update({
'fasta': _auto_arg0_zoom,
'pir': _auto_arg0_zoom,
})
cmd.auto_arg[1].update([
('save_colored_fasta', _auto_arg0_zoom),
])
# vi: ts=4:sw=4:smarttab:expandtab