Difference between revisions of "Renumber"

From PyMOLWiki
Jump to navigation Jump to search
(created)
(recursion limit)
 
(3 intermediate revisions by 2 users not shown)
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 15: Line 22:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== The Script ==
+
This example fixes numbering after concatenating two chains with [[fuse]]. Note that the cartoon representation and the [[seq_view|sequence viewer]] need [[sort|sorting]] to display correctly.
  
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
from pymol import cmd, CmdException
+
fab ACDEFG, chain1
 +
fab HIKLMN, chain2
  
def renumber(selection='all', start=1, startsele=None, quiet=1):
+
disable chain1
    '''
+
as cartoon
DESCRIPTION
 
  
    Set residue numbering (resi) based on connectivity.
+
fuse last (chain1 and name C), first (chain2 and name N)
 +
renumber chain2
 +
sort chain2
 +
</syntaxhighlight>
  
ARGUMENTS
+
== Troubleshooting ==
  
    selection = string: atom selection to renumber {default: all}
+
For large molecules it might be necessary to increase the [http://docs.python.org/library/sys.html#sys.getrecursionlimit python recursion limit]:
  
    start = integer: counting start {default: 1}
+
<syntaxhighlight lang="python">
 
+
import sys
    startsele = string: residue to start counting from {default: first in
+
sys.setrecursionlimit(10**5)
    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>
  
Line 85: Line 52:
  
 
[[Category:Script_Library]]
 
[[Category:Script_Library]]
 +
[[Category:Pymol-script-repo]]

Latest revision as of 06:27, 16 June 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

This example fixes numbering after concatenating two chains with fuse. Note that the cartoon representation and the sequence viewer need sorting to display correctly.

fab ACDEFG, chain1
fab HIKLMN, chain2

disable chain1
as cartoon

fuse last (chain1 and name C), first (chain2 and name N)
renumber chain2
sort chain2

Troubleshooting

For large molecules it might be necessary to increase the python recursion limit:

import sys
sys.setrecursionlimit(10**5)

See Also