Renumber: Difference between revisions

From PyMOLWiki
Jump to navigation Jump to search
(created)
(moved script to github)
Line 1: Line 1:
{{Infobox script-repo
|type      = module
|filename  = renumber.py
|author    = [[User:Speleo3|Thomas Holder]]
|license  = BSD-2-Clause
}}
[[renumber]] sets new residue numbers (resi) for a polymer based on connectivity.
[[renumber]] sets new residue numbers (resi) for a polymer based on connectivity.


Line 13: Line 20:
# renumber polymer, first 27 residues of Q8N2U3_HUMAN missing.
# renumber polymer, first 27 residues of Q8N2U3_HUMAN missing.
renumber chain A, 28
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>
</syntaxhighlight>



Revision as of 04:44, 1 February 2012

Type Python Module
Download renumber.py
Author(s) Thomas Holder
License BSD-2-Clause
This code has been put under version control in the project Pymol-script-repo

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

See Also