|
|
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 == |
− | This script allows you to color two structures by Root Mean Square Deviation (RMSD), as calculated by PyMol's internal [[Rms_Cur]] command. The pairwise, C-alpha, RMSD is calculated only between those residues which are first used by PyMol's internal [[Super]] command to superpose the two structures. The RMSD values are stored as B-factors of these residues, which are colored by a ''rainbow'' color spectrum, with blue specifying the minimum pairwise RMSD and red indicating the maximum. Residues ''NOT'' used by [[Super]] for superposition, and hence for RMSD calculation, are colored ''white''. | + | 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. |
| | | |
− | == Code == | + | == Usage == |
− | Please use this script with the option '''doPretty=T''' to gain the most benefit. Additionally, setting [[Cartoon]] representation to ''loop'', with the command: <source lang="python"> cartoon loop </source> may help ease comparisons. Do keep in mind, all original B-factors values are overwritten!
| |
| | | |
− | ==== Examples ==== | + | 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 == |
| <source lang="python"> | | <source lang="python"> |
| # example #1 | | # example #1 |
− | colorByRMSD 1cbs, 1hmt, doAlign=T, doPretty=T
| + | colorbyrmsd 1cbs, 1hmt, doAlign=1, doPretty=1 |
| # example #2 | | # example #2 |
− | colorByRMSD 1eaz, 1fao, doAlign=T, doPretty=T
| + | colorbyrmsd 1eaz, 1fao, doAlign=1, doPretty=1 |
| </source> | | </source> |
| | | |
Line 17: |
Line 36: |
| 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. | | 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.1.1
| |
− | 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 current RMSD as the new B-factor
| |
− | def rmsUpdateB(objA, alnAri, objB, alnBri):
| |
− | 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 as is?
| |
− | If doAlign=True then your original proteins are aligned.
| |
− | If 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
| |
− | highlight the differences. If False, then no changes are made.
| |
− | DEFAULT: False
| |
− |
| |
− | RETURNS
| |
− | None.
| |
− |
| |
− | SIDE-EFFECTS
| |
− | Modifies the B-factor columns in your original structures.
| |
− |
| |
− | """
| |
− | # First create backup copies; names starting with __ (underscores) are
| |
− | # normally hidden by PyMOL
| |
− | tObj1, tObj2, aln = "__tempObj1", "__tempObj2", "__aln"
| |
− |
| |
− | if strTrue(doAlign):
| |
− | # perform the alignment
| |
− | cmd.create( tObj1, objSel1 )
| |
− | cmd.create( tObj2, objSel2 )
| |
− | cmd.super( tObj1, tObj2, object=aln )
| |
− | cmd.matrix_copy(tObj1, objSel1)
| |
− | else:
| |
− | # perform the alignment
| |
− | cmd.create( tObj1, objSel1 )
| |
− | cmd.create( tObj2, objSel2 )
| |
− | cmd.super( tObj1, tObj2, object=aln )
| |
− |
| |
− | # Modify the B-factor columns of the original objects,
| |
− | # in order to identify the residues NOT used for alignment, later on
| |
− | cmd.alter( objSel1 + " or " + objSel2, "b=-10")
| |
− | cmd.alter( tObj1 + " or " + tObj2, "chain='A'")
| |
− | cmd.alter( tObj1 + " or " + tObj2, "segi='A'")
| |
− |
| |
− | # Update pymol internal representations; one of these should do the trick
| |
− | cmd.refresh(); cmd.rebuild(); cmd.sort(tObj1); cmd.sort(tObj2)
| |
− |
| |
− | # Create lists for storage
| |
− | stored.alnAres, stored.alnBres = [], []
| |
− |
| |
− | # Get the residue identifiers from the alignment object "aln"
| |
− | cmd.iterate(tObj1 + " and n. CA and " + aln, "stored.alnAres.append(resi)")
| |
− | cmd.iterate(tObj2 + " and n. CA and " + aln, "stored.alnBres.append(resi)")
| |
− |
| |
− | # Change 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 and clean up
| |
− | cmd.delete(tObj1)
| |
− | cmd.delete(tObj2)
| |
− | cmd.delete(aln)
| |
− |
| |
− | # Assign the just stored NEW B-factors to the original objects
| |
− | 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)
| |
− |
| |
− | # Provide some useful information
| |
− | stored.allRMSDval = []
| |
− | stored.allRMSDval = stored.alnAnb + stored.alnBnb
| |
− | print "\nColorByRMSD completed successfully."
| |
− | print "The MINIMUM RMSD value is: "+str(min(stored.allRMSDval))
| |
− | print "The MAXIMUM RMSD value is: "+str(max(stored.allRMSDval))
| |
− |
| |
− | 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")
| |
− | # 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")
| |
− | # Delete the selection of atoms not used for alignment
| |
− | # If you would like to keep this selection intact,
| |
− | # just comment "cmd.delete" line and
| |
− | # uncomment the "cmd.disable" line below.
| |
− | cmd.delete("notUsedForAln")
| |
− | # cmd.disable("notUsedForAln")
| |
− |
| |
− | print "\nObjects are now colored by C-alpha RMS deviation."
| |
− | print "All residues with RMSD values greater than the maximum are colored white..."
| |
− |
| |
− | cmd.extend("colorByRMSD", colorByRMSD)
| |
− | </source>
| |
| | | |
| [[Category:Script_Library]] | | [[Category:Script_Library]] |
| [[Category:Structural_Biology_Scripts]] | | [[Category:Structural_Biology_Scripts]] |
| + | [[Category:Pymol-script-repo]] |