ColorByRMSD: Difference between revisions

From PyMOLWiki
Jump to navigation Jump to search
(rewrite of script and moved script to github)
 
(12 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{Infobox script-repo
|type      = Python Module
|filename  = colorbyrmsd.py
|author    = [[User:Shiven|Shivender Shandilya]], [[User:Inchoate|Jason Vertrees]], [[User:Speleo3|Thomas Holder]]
|license  = BSD-2-Clause
}}
== Introduction ==
== Introduction ==
An attempt to perform a coloring of two structures by RMS deviation as calculated by PyMol's internal [[Rms_Cur]] command.
This script allows you to color two structures by Root Mean Square Deviation (RMSD).
The distances between aligned C-alpha atom pairs are stored as B-factors of these residues, which are colored by a color spectrum, with blue specifying the minimum pairwise RMSD and red indicating the maximum.
Unaligned residues are colored gray.
 
== Usage ==
 
colorbyrmsd mobile, target [, doAlign [, doPretty [, guide [, method ]]]]
 
== Arguments ==


== Code ==
* '''mobile''' = string: atom selection for mobile atoms
This is new code, modified from the work done by Jason and myself.<br>
* '''target''' = string: atom selection for target atoms
If you use the option '''doPretty=T''', the residues NOT used for alignment/superposition are now colored '''white'''.<br>
* '''doAlign''' = 0 or 1: Superpose selections before calculating distances {default: 1}
Please test and see if it works (somewhat) better. ''--[[User:Shiven|shiven]] 19:38, 16 July 2009 (UTC)''
* '''doPretty''' = 0 or 1: Show nice representation and colors {default: 1}
* '''guide''' = 0 or 1: Only use C-alpha atoms {default: 1}
* '''method''' = align or super: Method to match atoms {default: super}


==== Examples ====
== Examples ==
<source lang="python">
<source lang="python">
# example #1
# example #1
colorByRMSD 1cbs, 1hmt, doAlign=True, doPretty=T
colorbyrmsd 1cbs, 1hmt, doAlign=1, doPretty=1
# example #2
# example #2
colorByRMSD 1eaz, 1fao, doAlign=True, doPretty=T
colorbyrmsd 1eaz, 1fao, doAlign=1, doPretty=1
</source>
</source>


<gallery heights="300px" widths="300px">
<gallery heights="300px" widths="300px">
Image:ColorByRMSD_1cbs_1hmt.png|1cbs and 1hmt aligned and colored by RMSD.  Dark blue is good alignment, higher deviations are in orange/yellow/red.
Image:ColorByRMSD_1cbs_1hmt.png|1cbs and 1hmt aligned and colored by RMSD.  Dark blue is good alignment, higher deviations are in orange/yellow/red. Residues not used for alignment are colored white.
Image:ColorByRMSD_1eaz_1fao.png|1eaz and 1fao aligned and colored by RMSD.  Dark blue is good alignment, higher deviations are in orange/yellow/red.
Image:ColorByRMSD_1eaz_1fao.png|1eaz and 1fao aligned and colored by RMSD.  Dark blue is good alignment, higher deviations are in orange/yellow/red. Residues not used for alignment are colored white.
</gallery>
</gallery>
<source lang="python">
"""
--- ColorByRMSD: RMSD based coloring ---
Authors : Shivender Shandilya; Jason Vertrees
Program : ColorByRMSD
Date    : July 2009
Version : 0.0.3 (very alpha!)
Mail    : firstname.lastname@umassmed.edu
Keywords: color rms rmsd colorbyrms colorbyrmsd
----------------------------------------------------------------------
Reference:
This email from Warren - http://www.mail-archive.com/pymol-users@lists.sourceforge.net/msg07078.html
Literature:
DeLano, W.L. The PyMOL Molecular Graphics System (2002) DeLano Scientific, San Carlos, CA, USA. http://www.pymol.org
----------------------------------------------------------------------
"""
import pymol
import cmd
from pymol import stored
def strTrue(p):
    return p[0].upper() == "T"
# The main function that assigns "cur_rms" as the new b-factor
def rmsUpdateB(objA, alnAri, objB, alnBri):
    # don't need the *10 -- PyMOL scales things for us.
    for x in range(len(alnAri)):
        s1 = objA + " and n. CA and i. " + alnAri[x]
        s2 = objB + " and n. CA and i. " + alnBri[x]
        rmsd = cmd.rms_cur(s1, s2, matchmaker=4)
        cmd.alter( s1, "b = " + str(rmsd))
        cmd.alter( s2, "b = " + str(rmsd))
    cmd.sort(objA); cmd.sort(objB)
def colorByRMSD(objSel1, objSel2, doAlign="True", doPretty=None):
    """
    colorByRMSD -- align two structures and show the structural deviations in
        color to more easily see variable regions.
    PARAMS
        objSel1 (valid PyMOL object or selection)
            The first object to align. 
        objSel2 (valid PyMOL object or selection)
            The second object to align
        doAlign (boolean, either True or False)
            Should this script align your proteins or just leave them where they
            are?  If doAlign=True then your original proteins are aligned.  If
            doAlign=False, then they are not.  Regardless, the b-factors are
            changed.
            DEFAULT: True
        doPretty (boolean, either True or False)
            If doPretty=True then a simple representation is created to high-
            light the differences.  If False, then no change is done to the
            structure.
            DEFAULT: None
    RETURNS
        None.
    SIDE-EFFECTS
        Modified the b-factor columns in your original proteins.
    """
    # create backup copies; names starting with _ (underscores) are
    # hidden by PyMOL
    tObj1, tObj2, aln = "__tempObj1", "__tempObj2", "__aln"
    if strTrue(doAlign):
        # perform the alignment
        cmd.create( tObj1, objSel1 )
        cmd.create( tObj2, objSel2 )
#      cmd.align( tObj1, tObj2, object=aln )
        cmd.super( tObj1, tObj2, object=aln )
        # bug -- every other call undoes this...
        cmd.matrix_copy(tObj1, objSel1)
    else:
        # perform the alignment
        cmd.create( tObj1, objSel1 )
        cmd.create( tObj2, objSel2 )
#      cmd.align( tObj1, tObj2, object=aln )
        cmd.super( tObj1, tObj2, object=aln )
#  cmd.alter( tObj1 + " or " + tObj2, "b=-10")
#  Now modify the B-factor columns of the original objects,
#  so as to later identify the residues NOT used for alignment
    cmd.alter( objSel1 + " or " + objSel2, "b=-10")
    cmd.alter( tObj1 + " or " + tObj2, "chain='A'")
    cmd.alter( tObj1 + " or " + tObj2, "segi='A'")
    # update PyMOL;
    # one of these should do the trick
    cmd.refresh(); cmd.rebuild(); cmd.sort(tObj1); cmd.sort(tObj2)
    #  Get the residue identifiers from the aln object
    stored.alnAres, stored.alnBres = [], []
    cmd.iterate(tObj1 + " and n. CA and " + aln, "stored.alnAres.append(resi)")
    cmd.iterate(tObj2 + " and n. CA and " + aln, "stored.alnBres.append(resi)")
    #print "Length of alnAres using 'super': "+str(len(stored.alnAres))
    #print "Length of alnBres using 'super': "+str(len(stored.alnBres))
    # reset the b-factors for each object
    rmsUpdateB(tObj1,stored.alnAres,tObj2,stored.alnBres)
    # Store the NEW b-factors
    stored.alnAnb, stored.alnBnb = [], []
    cmd.iterate(tObj1 + " and n. CA and " + aln, "stored.alnAnb.append(b)" )
    cmd.iterate(tObj2 + " and n. CA and " + aln, "stored.alnBnb.append(b)" )
    # Get rid of all intermediate objects etc.; clean up
    cmd.delete(tObj1)
    cmd.delete(tObj2)
    cmd.delete(aln)
    # Assign the just stored NEW b-factors to the original object
    for x in range(len(stored.alnAres)):
        cmd.alter(objSel1 + " and n. CA and i. " + str(stored.alnAres[x]), "b = " + str(stored.alnAnb[x]))
    for x in range(len(stored.alnBres)):
        cmd.alter(objSel2 + " and n. CA and i. " + str(stored.alnBres[x]), "b = " + str(stored.alnBnb[x]))
    cmd.rebuild(); cmd.refresh(); cmd.sort(objSel1); cmd.sort(objSel2)
    if doPretty!=None:
        # Showcase what we did
        cmd.orient()
        cmd.hide("all")
        cmd.show_as("cartoon", objSel1 + " or " + objSel2)
        # Select the residues not used for alignment; they still have their B-factors as "-10"
        cmd.select("notUsedForAln", "b < 0")
        cmd.disable("notUsedForAln")
# White-wash the residues not used for alignment
cmd.color("white", "notUsedForAln")
# Color the residues used for alignment according to their B-factors (RMSD values)
        cmd.spectrum("b", 'rainbow',  "((" + objSel1 + " and n. CA) or (n. CA and " + objSel2 +" )) and not notUsedForAln")
        print "ColorByRMSD completed successfully. Objects are now colored by C-alpha RMS deviation.\n"
cmd.extend("colorByRMSD", colorByRMSD)
</source>


[[Category:Script_Library]]
[[Category:Script_Library]]
[[Category:Structural_Biology_Scripts]]
[[Category:Structural_Biology_Scripts]]
[[Category:Pymol-script-repo]]

Latest revision as of 07:59, 16 March 2012

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

Introduction

This script allows you to color two structures by Root Mean Square Deviation (RMSD). The distances between aligned C-alpha atom pairs are stored as B-factors of these residues, which are colored by a color spectrum, with blue specifying the minimum pairwise RMSD and red indicating the maximum. Unaligned residues are colored gray.

Usage

colorbyrmsd mobile, target [, doAlign [, doPretty [, guide [, method ]]]]

Arguments

  • mobile = string: atom selection for mobile atoms
  • target = string: atom selection for target atoms
  • doAlign = 0 or 1: Superpose selections before calculating distances {default: 1}
  • doPretty = 0 or 1: Show nice representation and colors {default: 1}
  • guide = 0 or 1: Only use C-alpha atoms {default: 1}
  • method = align or super: Method to match atoms {default: super}

Examples

# example #1
colorbyrmsd 1cbs, 1hmt, doAlign=1, doPretty=1
# example #2
colorbyrmsd 1eaz, 1fao, doAlign=1, doPretty=1