|
|
Line 87: |
Line 87: |
| | | |
| == Python Code == | | == Python Code == |
− | <source lang="python">
| + | This code has been put under version control. In the project, [http://www.pymolwiki.org/index.php/Git_intro Pymol-script-repo]. |
− | import pymol
| |
− | import cmd
| |
− | from pymol import stored
| |
| | | |
− | ### Thanks for inspiration from:
| + | You can see the code here: |
− | """
| + | https://github.com/Pymol-Scripts/Pymol-script-repo/blob/master/colorbydisplacement.py |
− | --- ColorByRMSD: RMSD based coloring ---
| + | Or download here: |
− | Authors : Shivender Shandilya; Jason Vertrees
| + | https://raw.github.com/Pymol-Scripts/Pymol-script-repo/master/colorbydisplacement.py |
− | 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]] |