Difference between revisions of "Renumber"

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 05: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