This is a read-only mirror of pymolwiki.org
Difference between revisions of "Renumber"
Jump to navigation
Jump to search
(Redirected page to Pdb retain ids) |
(created) |
||
Line 1: | Line 1: | ||
− | # | + | [[renumber]] sets new residue numbers (resi) for a polymer based on connectivity. |
+ | |||
+ | == Example == | ||
+ | |||
+ | This examples takes a pdb structure with insertion codes and sets a new, linear numbering based on [http://www.uniprot.org/uniprot/Q8N2U3_HUMAN Q8N2U3_HUMAN]. | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | fetch 1h4w, async=0 | ||
+ | |||
+ | # move everything which is not polymer to another chain | ||
+ | alter not polymer, chain="B" | ||
+ | |||
+ | # renumber polymer, first 27 residues of Q8N2U3_HUMAN missing. | ||
+ | renumber chain A, 28 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == The Script == | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | from pymol import cmd, CmdException | ||
+ | |||
+ | def renumber(selection='all', start=1, startsele=None, quiet=1): | ||
+ | ''' | ||
+ | DESCRIPTION | ||
+ | |||
+ | Set residue numbering (resi) based on connectivity. | ||
+ | |||
+ | ARGUMENTS | ||
+ | |||
+ | selection = string: atom selection to renumber {default: all} | ||
+ | |||
+ | start = integer: counting start {default: 1} | ||
+ | |||
+ | startsele = string: residue to start counting from {default: first in | ||
+ | selection} | ||
+ | ''' | ||
+ | start, quiet = int(start), int(quiet) | ||
+ | model = cmd.get_model(selection) | ||
+ | cmd.iterate(selection, 'atom_it.next().model = model', | ||
+ | space={'atom_it': iter(model.atom)}) | ||
+ | if startsele is not None: | ||
+ | startidx = cmd.index('first (' + startsele + ')')[0] | ||
+ | for atom in model.atom: | ||
+ | if (atom.model, atom.index) == startidx: | ||
+ | startatom = atom | ||
+ | break | ||
+ | else: | ||
+ | print ' Error: startsele not in selection' | ||
+ | raise CmdException | ||
+ | else: | ||
+ | startatom = model.atom[0] | ||
+ | for atom in model.atom: | ||
+ | atom.adjacent = [] | ||
+ | atom.visited = False | ||
+ | for bond in model.bond: | ||
+ | atoms = [model.atom[i] for i in bond.index] | ||
+ | atoms[0].adjacent.append(atoms[1]) | ||
+ | atoms[1].adjacent.append(atoms[0]) | ||
+ | def traverse(atom, resi): | ||
+ | atom.resi = resi | ||
+ | atom.visited = True | ||
+ | for other in atom.adjacent: | ||
+ | if other.visited: | ||
+ | continue | ||
+ | if (atom.name, other.name) in [('C','N'), ("O3'", 'P')]: | ||
+ | traverse(other, resi+1) | ||
+ | elif (atom.name, other.name) in [('N','C'), ('P', "O3'")]: | ||
+ | traverse(other, resi-1) | ||
+ | elif (atom.name, other.name) not in [('SG', 'SG')]: | ||
+ | traverse(other, resi) | ||
+ | traverse(startatom, start) | ||
+ | cmd.alter(selection, 'resi = atom_it.next().resi', | ||
+ | space={'atom_it': iter(model.atom)}) | ||
+ | |||
+ | cmd.extend('renumber', renumber) | ||
+ | |||
+ | # vi:expandtab:smarttab | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == See Also == | ||
+ | |||
+ | * [[alter]] | ||
+ | * [[rename]] | ||
+ | * [[pdb_retain_ids]] | ||
+ | |||
+ | [[Category:Script_Library]] |
Revision as of 10:31, 31 January 2012
renumber sets new residue numbers (resi) for a polymer based on connectivity.
Example
This examples takes a pdb structure with insertion codes and sets a new, linear numbering based on Q8N2U3_HUMAN.
fetch 1h4w, async=0
# move everything which is not polymer to another chain
alter not polymer, chain="B"
# renumber polymer, first 27 residues of Q8N2U3_HUMAN missing.
renumber chain A, 28
The Script
from pymol import cmd, CmdException
def renumber(selection='all', start=1, startsele=None, quiet=1):
'''
DESCRIPTION
Set residue numbering (resi) based on connectivity.
ARGUMENTS
selection = string: atom selection to renumber {default: all}
start = integer: counting start {default: 1}
startsele = string: residue to start counting from {default: first in
selection}
'''
start, quiet = int(start), int(quiet)
model = cmd.get_model(selection)
cmd.iterate(selection, 'atom_it.next().model = model',
space={'atom_it': iter(model.atom)})
if startsele is not None:
startidx = cmd.index('first (' + startsele + ')')[0]
for atom in model.atom:
if (atom.model, atom.index) == startidx:
startatom = atom
break
else:
print ' Error: startsele not in selection'
raise CmdException
else:
startatom = model.atom[0]
for atom in model.atom:
atom.adjacent = []
atom.visited = False
for bond in model.bond:
atoms = [model.atom[i] for i in bond.index]
atoms[0].adjacent.append(atoms[1])
atoms[1].adjacent.append(atoms[0])
def traverse(atom, resi):
atom.resi = resi
atom.visited = True
for other in atom.adjacent:
if other.visited:
continue
if (atom.name, other.name) in [('C','N'), ("O3'", 'P')]:
traverse(other, resi+1)
elif (atom.name, other.name) in [('N','C'), ('P', "O3'")]:
traverse(other, resi-1)
elif (atom.name, other.name) not in [('SG', 'SG')]:
traverse(other, resi)
traverse(startatom, start)
cmd.alter(selection, 'resi = atom_it.next().resi',
space={'atom_it': iter(model.atom)})
cmd.extend('renumber', renumber)
# vi:expandtab:smarttab