|
|
(16 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| == Acknowledgement == | | {{Infobox script-repo |
| This pymol script is made by Troels Emtekær Linnet.
| | |type = script |
| | | |filename = colorbydisplacement.py |
| This script is based on the scaffold from [[ColorByRMSD]]. Peace love and harmony goes to Shivender Shandilya and Jason Vertrees.
| | |author = [[User:Tlinnet|Troels E. Linnet]] |
| | |license = BSD |
| | }} |
|
| |
|
| == Introduction == | | == Introduction == |
| This script allows you to color two structures by distance displacement between an Open and Closed form of a protein, as calculated by PyMol's internal distance command. The pairwise distance is calculated between, C-alpha or all-atoms. The distance displacement values are stored as B-factors of these residues, which are colored by a ''rainbow'' color spectrum, with blue specifying minimum and red indicating maximum. | | This script allows you to color two structures by distance displacement between an Open and Closed form of a protein, as calculated by PyMol's internal distance command. The pairwise distance is calculated between all-atoms. The distance displacement values are stored as B-factors of these residues, which are colored by a ''rainbow'' color spectrum, with blue specifying minimum and red indicating maximum. |
|
| |
|
| == Code ==
| |
| Do keep in mind, all original B-factors values are overwritten! | | Do keep in mind, all original B-factors values are overwritten! |
|
| |
|
| There exist two versions. <br> | | There exist one version. <br> |
| ColorByDisplacement'''CA''' is quick and is between CA atoms. Ideal for helices representation. <br>
| |
| ColorByDisplacement'''All''' is between All atoms in residues and is quite slow => 3-5 mins for a run. Ideal for sticks representation. | | ColorByDisplacement'''All''' is between All atoms in residues and is quite slow => 3-5 mins for a run. Ideal for sticks representation. |
|
| |
|
Line 24: |
Line 24: |
|
| |
|
| === Examples === | | === Examples === |
| <source lang="python"> | | <syntaxhighlight lang="python"> |
| ColorByDisplacementCA O5NT, C5NT, super1=resi 26-355, super2=resi 26-355, doColor=t, doAlign=t
| |
| ColorByDisplacementAll O5NT, C5NT, super1=resi 26-355, super2=resi 26-355, doColor=t, doAlign=t | | ColorByDisplacementAll O5NT, C5NT, super1=resi 26-355, super2=resi 26-355, doColor=t, doAlign=t |
|
| |
|
| ColorByDisplacementCA O5NT, C5NT, super1=resi 26-355, super2=resi 26-355, doColor=t, doAlign=t, AlignedWhite='no'
| |
| ColorByDisplacementAll O5NT, C5NT, super1=resi 26-355, super2=resi 26-355, doColor=t, doAlign=t, AlignedWhite='no' | | ColorByDisplacementAll O5NT, C5NT, super1=resi 26-355, super2=resi 26-355, doColor=t, doAlign=t, AlignedWhite='no' |
| | | </syntaxhighlight> |
| ColorByDisplacementCA O5NT, C5NT, resi 26-355, resi 26-355
| |
| ColorByDisplacementAll O5NT, C5NT, resi 26-355, resi 26-355
| |
| </source> | |
|
| |
|
| <gallery heights="240px" widths="340px"> | | <gallery heights="240px" widths="340px"> |
| Image:ColorByDisplacement-CA-1.png|ColorByDisplacementCA used on 1HP1 and 1HPU aligned and colored by distance displacement.
| |
| Image:ColorByDisplacement-CA-2.png|ColorByDisplacementCA used on 1HP1 and 1HPU aligned and colored by distance displacement.
| |
| Image:ColorByDisplacement-All-1.png|ColorByDisplacementAll used on 1HP1 and 1HPU aligned and colored by distance displacement. | | Image:ColorByDisplacement-All-1.png|ColorByDisplacementAll used on 1HP1 and 1HPU aligned and colored by distance displacement. |
| Image:ColorByDisplacement-All-2.png|ColorByDisplacementAll used on 1HP1 and 1HPU aligned and colored by distance displacement. | | Image:ColorByDisplacement-All-2.png|ColorByDisplacementAll used on 1HP1 and 1HPU aligned and colored by distance displacement. |
Line 45: |
Line 38: |
| Residues not in both pdb files is colored black | | Residues not in both pdb files is colored black |
|
| |
|
| == Example Pymol Script == | | == Example 1 == |
| <source lang="python">
| | {{Template:PymolScriptRepoDownload|examples/colorbydisplacement_1.pml}} |
| cd C:\Users\tlinnet\Documents\My Dropbox\Speciale\5NT-project\Mutant-construct\Distance-Plot
| | <include src="https://raw.github.com/Pymol-Scripts/Pymol-script-repo/master/examples/colorbydisplacement_1.pml" highlight="python" /> |
| #cd /homes/linnet/Documents/Speciale/5NT-project/Mutant-construct/Distance-Plot
| |
| ### load pdb files and rename
| |
| load 1HP1.pdb, O5NT-1HP1
| |
| load 1HPU.pdb, C5NT-1HPU
| |
| | |
| hide everything
| |
| ### Select asymmetric units from pdb file
| |
| create O5NT, /O5NT-1HP1//A
| |
| create C5NT, /C5NT-1HPU//C
| |
| delete O5NT-1HP1
| |
| delete C5NT-1HPU
| |
| | |
| cartoon auto
| |
| show cartoon, O5NT
| |
| show cartoon, C5NT
| |
| set cartoon_fancy_helices=1
| |
| set bg,[1,1,1]
| |
| | |
| set auto_zoom, off
| |
| | |
| ### Make sharper
| |
| set fog=0
| |
| | |
| ### Load my function, and run function with input
| |
| run ColorByDisplacement.py
| |
| ColorByDisplacementCA O5NT, C5NT, super1=resi 26-355, super2=resi 26-355, doColor=t, doAlign=t
| |
| #ColorByDisplacementAll O5NT, C5NT, super1=resi 26-355, super2=resi 26-355, doColor=t, doAlign=t
| |
| | |
| set_view (\
| |
| 0.094686687, -0.390707940, 0.915631354,\
| |
| 0.809000611, -0.505792081, -0.299485058,\
| |
| 0.580131471, 0.769104064, 0.268191338,\
| |
| 0.000000000, 0.000000000, -280.940521240,\
| |
| 26.240486145, 46.146961212, 21.702068329,\
| |
| 231.830673218, 330.050415039, -20.000000000 )
| |
| </source>
| |
| | |
| | |
| == Python Code ==
| |
| <source lang="python"> | |
| import pymol
| |
| import cmd
| |
| from pymol import stored
| |
| | |
| ### Thanks for inspiration from:
| |
| """
| |
| --- ColorByRMSD: RMSD based coloring ---
| |
| Authors : Shivender Shandilya; Jason Vertrees
| |
| Program : ColorByRMSD
| |
| Date : July 2009
| |
| http://www.pymolwiki.org/index.php/ColorByRMSD
| |
| """
| |
| ### Author Troels Linnet - troels.linnet att bbz.uni-leipzig.de
| |
| """
| |
| --- ColorByDisplacementCA: Displacement based coloring ---
| |
| Authors : Troels E. Linnet
| |
| Program : ColorByDisplacementCA
| |
| Date : January 2011
| |
| email: troels.linnet att bbz.uni-leipzig.de
| |
| """
| |
| | |
| """
| |
| ColorByDisplacementCA --
| |
| Show the distance displacement deviation in color to more easily see variable regions.
| |
| | |
| PARAMS
| |
| | |
| objSel1 (valid PyMOL object or selection)
| |
| The first object
| |
| | |
| objSel2 (valid PyMOL object or selection)
| |
| The second object
| |
| | |
| doColor (boolean, either True or False)
| |
| If doColor=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.
| |
| | |
| """
| |
| | |
| def strTrue(p):
| |
| return p[0].upper() == "T"
| |
| | |
| # The main function that assigns current displacement distance as the new B-factor
| |
| def displacementUpdateB(objA, alnAri, objB, alnBri):
| |
| ### If residue is unassigned in one of the pdb files, we reset its value
| |
| for x in range(len(alnAri)):
| |
| s1 = objA + " and name CA and resi " + alnAri[x]
| |
| cmd.alter( s1, "b = " + str(-0.01))
| |
| for x in range(len(alnBri)):
| |
| s2 = objB + " and name CA and resi " + alnBri[x]
| |
| cmd.alter( s2, "b = " + str(-0.01))
| |
| cmd.sort(objA); cmd.sort(objB)
| |
| for x in range(len(alnAri)):
| |
| s1 = objA + " and name CA and resi " + alnAri[x]
| |
| s2 = objB + " and name CA and resi " + alnAri[x]
| |
| ### Names starting with __ (underscores) are normally hidden by PyMOL
| |
| tempObject = "__tempObject"
| |
| Displacement = cmd.distance(tempObject, s1, s2)
| |
| cmd.alter( s1, "b = " + str(Displacement))
| |
| cmd.alter( s2, "b = " + str(Displacement))
| |
| cmd.delete(tempObject)
| |
| cmd.sort(objA); cmd.sort(objB)
| |
| | |
| def ColorByDisplacementCA(objSel1, objSel2, super1='all', super2='all', doColor="True", doAlign="True", AlignedWhite='yes'):
| |
| ### First create backup copies; names starting with __ (underscores) are normally hidden by PyMOL
| |
| tObj1, tObj2, aln = "__tempObj1", "__tempObj2", "__aln"
| |
| | |
| if strTrue(doAlign):
| |
| ### Create temp objects
| |
| cmd.create( tObj1, objSel1 )
| |
| cmd.create( tObj2, objSel2 )
| |
| ### Align and make create an object aln which indicates which atoms were paired between the two structures
| |
| ### Super is must faster than align http://www.pymolwiki.org/index.php/Super
| |
| cmd.super(tObj1 + ' and ' + str(super1), tObj2 + ' and ' + str(super2), object=aln)
| |
| ### Modify the original matrix of object1 from the alignment
| |
| cmd.matrix_copy(tObj1, objSel1)
| |
| else:
| |
| ### Create temp objects
| |
| cmd.create( tObj1, objSel1 )
| |
| cmd.create( tObj2, objSel2 )
| |
| ### Align and make create an object aln which indicates which atoms were paired between the two structures
| |
| ### Super is must faster than align http://www.pymolwiki.org/index.php/Super
| |
| cmd.super(tObj1 + ' and ' + str(super1), tObj2 + ' and ' + str(super2), 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=-0.2")
| |
| 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 = [], []
| |
| | |
| ### Iterate over objects
| |
| if AlignedWhite=='yes':
| |
| cmd.iterate(tObj1 + " and n. CA and not " + aln, "stored.alnAres.append(resi)")
| |
| cmd.iterate(tObj2 + " and n. CA and not " + aln, "stored.alnBres.append(resi)")
| |
| else:
| |
| cmd.iterate(tObj1 + " and n. CA", "stored.alnAres.append(resi)")
| |
| cmd.iterate(tObj2 + " and n. CA", "stored.alnBres.append(resi)")
| |
| | |
| ### Change the B-factors for EACH object
| |
| displacementUpdateB(tObj1,stored.alnAres,tObj2,stored.alnBres)
| |
| | |
| ### Store the NEW B-factors
| |
| stored.alnAnb, stored.alnBnb = [], []
| |
| ### Iterate over objects and get b
| |
| if AlignedWhite=='yes':
| |
| ### Iterate over objects which is not aligned
| |
| cmd.iterate(tObj1 + " and n. CA and not " + aln, "stored.alnAnb.append(b)" )
| |
| cmd.iterate(tObj2 + " and n. CA and not " + aln, "stored.alnBnb.append(b)" )
| |
| else:
| |
| ### Or Iterate over all objects with CA
| |
| cmd.iterate(tObj1 + " and n. CA", "stored.alnAnb.append(b)" )
| |
| cmd.iterate(tObj2 + " and n. CA", "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 "\nColorByDisplacementCA completed successfully."
| |
| print "The MAXIMUM Displacement is: "+str(max(stored.allRMSDval)) +" residue "+str(stored.alnAres[int(stored.allRMSDval.index(max(stored.allRMSDval)))])
| |
| | |
| if strTrue(doColor):
| |
| ### Showcase what we did
| |
| #cmd.orient()
| |
| #cmd.hide("all")
| |
| cmd.show("cartoon", objSel1 + " or " + objSel2)
| |
| ### Select the residues not used for alignment; they still have their B-factors as "-0.2"
| |
| cmd.select("notUsedForAln", "b = -0.2")
| |
| ### White-wash the residues not used for alignment
| |
| cmd.color("white", "notUsedForAln")
| |
| ### Select the residues not in both pdb files; they have their B-factors as "-0. 01"
| |
| cmd.select("ResNotInBothPDB", "b = -0.01")
| |
| ### White-wash the residues not used for alignment
| |
| cmd.color("black", "ResNotInBothPDB")
| |
| ### Color the residues used for alignment according to their B-factors (Displacment values)
| |
| # cmd.spectrum("b", 'rainbow', "((" + objSel1 + " and n. CA) or (n. CA and " + objSel2 +" )) and not notUsedForAln+ResNotInBothPDB")
| |
| cmd.spectrum("b", 'rainbow', "((" + objSel1 + " and n. CA) or (n. CA and " + objSel2 +" )) and not (notUsedForAln or ResNotInBothPDB)")
| |
| ### 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 abowe.
| |
| cmd.disable("notUsedForAln")
| |
| cmd.delete("notUsedForAln")
| |
| cmd.disable("ResNotInBothPDB")
| |
| cmd.delete("ResNotInBothPDB")
| |
| | |
| print "\nObjects are now colored by C-alpha displacement deviation."
| |
| print "Blue is minimum and red is maximum..."
| |
| print "White is those residues used in the alignment algorithm. Can be turned off in top of algorithm."
| |
| print "Black is residues that does not exist in both files..."
| |
| cmd.extend("ColorByDisplacementCA", ColorByDisplacementCA)
| |
| | |
| def displacementUpdateBAll(objA, alnAri, objB, alnBri):
| |
| print "This will take a while to go through the for loops. Give me around 3-5 minutes..."
| |
| ### If residue is unassigned in one of the pdb files, we reset its value
| |
| for x in range(len(alnAri)):
| |
| s1 = objA + " and resi " + alnAri[x][0] + " and name " + str(alnAri[x][1])
| |
| cmd.alter( s1, "b = " + str(-0.01))
| |
| for x in range(len(alnBri)):
| |
| s2 = objB + " and resi " + alnBri[x][0] + " and name " + alnBri[x][1]
| |
| cmd.alter( s2, "b = " + str(-0.01))
| |
| cmd.sort(objA); cmd.sort(objB)
| |
| for x in range(len(alnAri)):
| |
| s1 = objA + " and resi " + alnAri[x][0] + " and name " + alnAri[x][1]
| |
| s2 = objB + " and resi " + alnAri[x][0] + " and name " + alnAri[x][1]
| |
| ### Names starting with __ (underscores) are normally hidden by PyMOL
| |
| tempObject = "__tempObject"
| |
| Displacement = cmd.distance(tempObject, s1, s2)
| |
| cmd.alter( s1, "b = " + str(Displacement))
| |
| cmd.alter( s2, "b = " + str(Displacement))
| |
| cmd.delete(tempObject)
| |
| cmd.sort(objA); cmd.sort(objB)
| |
| | |
| def ColorByDisplacementAll(objSel1, objSel2, super1='all', super2='all', doColor="True", doAlign="True", AlignedWhite='yes'):
| |
| ### First create backup copies; names starting with __ (underscores) are normally hidden by PyMOL
| |
| tObj1, tObj2, aln = "__tempObj1", "__tempObj2", "__aln"
| |
| | |
| if strTrue(doAlign):
| |
| ### Create temp objects
| |
| cmd.create( tObj1, objSel1 )
| |
| cmd.create( tObj2, objSel2 )
| |
| ### Align and make create an object aln which indicates which atoms were paired between the two structures
| |
| ### Super is must faster than align http://www.pymolwiki.org/index.php/Super
| |
| cmd.super(tObj1 + ' and ' + str(super1), tObj2 + ' and ' + str(super2), object=aln)
| |
| ### Modify the original matrix of object1 from the alignment
| |
| cmd.matrix_copy(tObj1, objSel1)
| |
| else:
| |
| ### Create temp objects
| |
| cmd.create( tObj1, objSel1 )
| |
| cmd.create( tObj2, objSel2 )
| |
| ### Align and make create an object aln which indicates which atoms were paired between the two structures
| |
| ### Super is must faster than align http://www.pymolwiki.org/index.php/Super
| |
| cmd.super(tObj1 + ' and ' + str(super1), tObj2 + ' and ' + str(super2), 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=-0.2")
| |
| 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 = [], []
| |
| | |
| ### Iterate over objects and get resi
| |
| if AlignedWhite=='yes':
| |
| cmd.iterate(tObj1 + " and not " + aln, "stored.alnAres.append((resi, name))")
| |
| cmd.iterate(tObj2 + " and not " + aln, "stored.alnBres.append((resi, name))")
| |
| else:
| |
| cmd.iterate(tObj1, "stored.alnAres.append((resi, name))")
| |
| cmd.iterate(tObj2, "stored.alnBres.append((resi, name))")
| |
| | |
| ### Change the B-factors for EACH object
| |
| displacementUpdateBAll(tObj1,stored.alnAres,tObj2,stored.alnBres)
| |
| | |
| ### Store the NEW B-factors
| |
| stored.alnAnb, stored.alnBnb = [], []
| |
| ### Iterate over objects and get b
| |
| | |
| if AlignedWhite=='yes':
| |
| ### Iterate over objects which is not aligned
| |
| cmd.iterate(tObj1 + " and not " + aln, "stored.alnAnb.append(b)" )
| |
| cmd.iterate(tObj2 + " and not " + aln, "stored.alnBnb.append(b)" )
| |
| else:
| |
| ### Or Iterate over all objects with CA
| |
| cmd.iterate(tObj1, "stored.alnAnb.append(b)" )
| |
| cmd.iterate(tObj2, "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
| |
| print "Sooon ready. 1 more minute"
| |
| for x in range(len(stored.alnAres)):
| |
| cmd.alter(objSel1 + " and resi " + str(stored.alnAres[x][0]) + " and name " + str(stored.alnAres[x][1]), "b = " + str(stored.alnAnb[x]))
| |
| for x in range(len(stored.alnBres)):
| |
| cmd.alter(objSel2 + " and resi " + str(stored.alnBres[x][0]) + " and name " + str(stored.alnBres[x][1]), "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 "\nColorByDisplacementAll completed successfully."
| |
| print "The MAXIMUM Displacement is: "+str(max(stored.allRMSDval)) +" residue "+str(stored.alnAres[int(stored.allRMSDval.index(max(stored.allRMSDval)))])
| |
| | |
| if strTrue(doColor):
| |
| ### Showcase what we did
| |
| #cmd.orient()
| |
| #cmd.hide("all")
| |
| cmd.show("sticks", objSel1 + " or " + objSel2)
| |
| ### Select the residues not used for alignment; they still have their B-factors as "-0.2"
| |
| cmd.select("notUsedForAln", "b = -0.2")
| |
| ### White-wash the residues not used for alignment
| |
| cmd.color("white", "notUsedForAln")
| |
| ### Select the residues not in both pdb files; they have their B-factors as "-0.01"
| |
| cmd.select("ResNotInBothPDB", "b = -0.01")
| |
| ### White-wash the residues not used for alignment
| |
| cmd.color("black", "ResNotInBothPDB")
| |
| ### Color the residues used for alignment according to their B-factors (Displacement values)
| |
| # cmd.spectrum("b", 'rainbow', "((" + objSel1 + ") or (" + objSel2 +" )) and not notUsedForAln+ResNotInBothPDB")
| |
| cmd.spectrum("b", 'rainbow', "((" + objSel1 + ") or (" + objSel2 +" )) and not (notUsedForAln or ResNotInBothPDB)")
| |
| ### 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 abowe.
| |
| cmd.disable("notUsedForAln")
| |
| cmd.delete("notUsedForAln")
| |
| cmd.disable("ResNotInBothPDB")
| |
| cmd.delete("ResNotInBothPDB")
| |
| print "\nObjects are now colored by C-alpha displacement deviation."
| |
| print "Blue is minimum and red is maximum..."
| |
| print "White is those residues used in the alignment algorithm. Can be turned off in top of algorithm."
| |
| print "Black is residues that does not exist in both files..."
| |
| cmd.extend("ColorByDisplacementAll", ColorByDisplacementAll)
| |
| </source>
| |
|
| |
|
| [[Category:Script_Library]] | | [[Category:Script_Library]] |
| [[Category:Structural_Biology_Scripts]] | | [[Category:Structural_Biology_Scripts]] |
| | [[Category:Pymol-script-repo]] |