Rotkit

From PyMOLWiki
Revision as of 18:10, 29 August 2011 by Tlinnet (talk | contribs)
Jump to navigation Jump to search

Author

This pymol script is made by Troels Emtekær Linnet

Introduction

Example of use

The dye .pdb file

COMPND    Atto590
AUTHOR    GENERATED BY OPEN BABEL 2.2.3 an in Avogadro
HETATM    1  C   LIG     1      -4.057   2.454  -1.838  1.00  0.00           C
HETATM    2  N   LIG     1      -2.619   2.797  -1.904  1.00  0.00           N
HETATM    3  C   LIG     1      -4.780   3.335  -0.830  1.00  0.00           C
HETATM    4  C   LIG     1      -4.192   1.001  -1.344  1.00  0.00           C
HETATM    5  C   LIG     1      -4.793   2.597  -3.193  1.00  0.00           C
HETATM    6  C   LIG     1      -1.942   3.160  -0.686  1.00  0.00           C
HETATM    7  C   LIG     1      -4.149   3.889   0.224  1.00  0.00           C
HETATM    8  C   LIG     1      -2.678   3.711   0.383  1.00  0.00           C
HETATM    9  C   LIG     1      -2.011   4.104   1.567  1.00  0.00           C
HETATM   10  C   LIG     1      -0.555   2.983  -0.540  1.00  0.00           C
HETATM   11  C   LIG     1      -0.625   3.896   1.713  1.00  0.00           C
HETATM   12  C   LIG     1       0.087   3.328   0.645  1.00  0.00           C
HETATM   13  O   LIG     1       1.412   3.104   0.756  1.00  0.00           O
HETATM   14  C   LIG     1       0.146   4.247   2.961  1.00  0.00           C
HETATM   15  C   LIG     1       1.477   3.899   3.020  1.00  0.00           C
HETATM   16  C   LIG     1       2.103   3.331   1.896  1.00  0.00           C
HETATM   17  C   LIG     1       3.458   3.002   1.923  1.00  0.00           C
HETATM   18  C   LIG     1       2.254   4.083   4.182  1.00  0.00           C
HETATM   19  C   LIG     1       4.257   3.179   3.087  1.00  0.00           C
HETATM   20  C   LIG     1       3.617   3.727   4.231  1.00  0.00           C
HETATM   21  N   LIG     1       5.544   2.857   3.105  1.00  0.00           N
HETATM   22  C   LIG     1       4.377   3.930   5.483  1.00  0.00           C
HETATM   23  C   LIG     1       6.402   3.070   4.308  1.00  0.00           C
HETATM   24  C   LIG     1       5.668   3.624   5.509  1.00  0.00           C
HETATM   25  C   LIG     1       7.010   1.725   4.768  1.00  0.00           C
HETATM   26  C   LIG     1       7.526   4.086   3.998  1.00  0.00           C
HETATM   27  H   LIG     1      -5.861   3.428  -0.908  1.00  0.00           H
HETATM   28  H   LIG     1      -2.574   4.547   2.368  1.00  0.00           H
HETATM   29  H   LIG     1       0.038   2.543  -1.329  1.00  0.00           H
HETATM   30  C   LIG     1      -0.510   4.983   4.109  1.00  0.00           C
HETATM   31  H   LIG     1       1.794   4.486   5.067  1.00  0.00           H
HETATM   32  H   LIG     1       3.861   2.612   1.004  1.00  0.00           H
HETATM   33  H   LIG     1       6.234   3.777   6.426  1.00  0.00           H
HETATM   34  C   LIG     1       3.721   4.478   6.733  1.00  0.00           C
HETATM   35  H   LIG     1       6.199   1.004   5.010  1.00  0.00           H
HETATM   36  H   LIG     1       7.638   1.861   5.675  1.00  0.00           H
HETATM   37  H   LIG     1       7.662   1.271   3.996  1.00  0.00           H
HETATM   38  H   LIG     1       7.085   5.060   3.696  1.00  0.00           H
HETATM   39  H   LIG     1       8.209   3.753   3.194  1.00  0.00           H
HETATM   40  H   LIG     1       8.161   4.256   4.897  1.00  0.00           H
HETATM   41  C   LIG     1       6.193   2.277   1.907  1.00  0.00           C
HETATM   42  H   LIG     1       6.034   2.929   1.021  1.00  0.00           H
HETATM   43  C   LIG     1       5.765   0.821   1.653  1.00  0.00           C
HETATM   44  H   LIG     1       7.291   2.219   2.020  1.00  0.00           H
HETATM   45  H   LIG     1       4.681   0.690   1.481  1.00  0.00           H
HETATM   46  H   LIG     1       6.040   0.186   2.519  1.00  0.00           H
HETATM   47  H   LIG     1       6.299   0.437   0.758  1.00  0.00           H
HETATM   48  C   LIG     1      -1.890   2.833  -3.182  1.00  0.00           C
HETATM   49  H   LIG     1      -2.440   3.435  -3.934  1.00  0.00           H
HETATM   50  C   LIG     1      -1.575   1.431  -3.708  1.00  0.00           C
HETATM   51  H   LIG     1      -0.922   3.362  -3.078  1.00  0.00           H
HETATM   52  H   LIG     1      -2.484   0.841  -3.923  1.00  0.00           H
HETATM   53  H   LIG     1      -0.963   0.879  -2.964  1.00  0.00           H
HETATM   54  H   LIG     1      -0.995   1.515  -4.651  1.00  0.00           H
HETATM   55  H   LIG     1      -4.746   3.648  -3.551  1.00  0.00           H
HETATM   56  H   LIG     1      -5.866   2.324  -3.085  1.00  0.00           H
HETATM   57  H   LIG     1      -4.381   1.935  -3.977  1.00  0.00           H
HETATM   58  H   LIG     1      -3.709   0.878  -0.350  1.00  0.00           H
HETATM   59  H   LIG     1      -3.705   0.294  -2.046  1.00  0.00           H
HETATM   60  H   LIG     1      -5.261   0.709  -1.249  1.00  0.00           H
HETATM   61  C   LIG     1      -4.954   4.653   1.250  1.00  0.00           C
HETATM   62  H   LIG     1      -6.034   4.696   0.992  1.00  0.00           H
HETATM   63  H   LIG     1      -4.575   5.694   1.319  1.00  0.00           H
HETATM   64  H   LIG     1      -4.866   4.160   2.240  1.00  0.00           H
HETATM   65  H   LIG     1       3.315   5.492   6.533  1.00  0.00           H
HETATM   66  H   LIG     1       4.431   4.561   7.584  1.00  0.00           H
HETATM   67  H   LIG     1       2.898   3.803   7.049  1.00  0.00           H
HETATM   68  C   LIG     1      -1.636   4.418   4.750  1.00  0.00           C
HETATM   69  C   LIG     1      -2.232   5.057   5.855  1.00  0.00           C
HETATM   70  C   LIG     1      -1.685   6.253   6.329  1.00  0.00           C
HETATM   71  C   LIG     1      -0.594   6.836   5.705  1.00  0.00           C
HETATM   72  C   LIG     1       0.008   6.242   4.581  1.00  0.00           C
HETATM   73  H   LIG     1      -2.038   3.477   4.395  1.00  0.00           H
HETATM   74  C   LIG     1      -3.451   4.513   6.512  1.00  0.00           C
HETATM   75  H   LIG     1      -2.125   6.763   7.177  1.00  0.00           H
HETATM   76  H   LIG     1      -0.253   7.779   6.099  1.00  0.00           H
HETATM   77  C   LIG     1       1.134   6.976   3.886  1.00  0.00           C
HETATM   78  O   LIG     1       1.472   6.651   2.760  1.00  0.00           O
HETATM   79  O   LIG     1       1.765   8.032   4.452  1.00  0.00           O
HETATM   80  H   LIG     1       1.616   8.338   5.353  1.00  0.00           H
HETATM   81  O   LIG     1      -3.939   5.126   7.450  1.00  0.00           O
HETATM   82  O   LIG     1      -4.098   3.438   5.979  1.00  0.00           O
HETATM   83  N   LIG     1      -5.268   2.966   6.406  1.00  0.00           N
HETATM   84  C   LIG     1      -6.192   2.486   5.575  1.00  0.00           C
HETATM   85  C   LIG     1      -5.710   2.891   7.675  1.00  0.00           C
HETATM   86  O   LIG     1      -5.047   3.211   8.649  1.00  0.00           O
HETATM   87  C   LIG     1      -7.100   2.339   7.770  1.00  0.00           C
HETATM   88  C   LIG     1      -7.441   2.046   6.278  1.00  0.00           C
HETATM   89  H   LIG     1      -7.617   0.963   6.107  1.00  0.00           H
HETATM   90  H   LIG     1      -8.307   2.651   5.933  1.00  0.00           H
HETATM   91  H   LIG     1      -7.781   3.103   8.204  1.00  0.00           H
HETATM   92  H   LIG     1      -7.110   1.409   8.375  1.00  0.00           H
HETATM   93  O   LIG     1      -6.033   2.434   4.365  1.00  0.00           O
END

The testrotkit.pml file

#-------------------------------------------------------------------------------
# Name:		rotkit.py
# Purpose:      To rotate molecules easier in pymol
#
# Author:      tlinnet
#
# Created:     30/08/2011
# Copyright:   (c) tlinnet 2011
# Licence:     Free
#-------------------------------------------------------------------------------

cd C:\Users\tlinnet\Documents\My Dropbox\Speciale\5NT-project\Mutant-construct\Distance-Plot
import rotkit

#fetch 1HP1, async=0
load 1HP1.pdb
load Atto590.pdb

### Get the names of the loaded objects
protname = cmd.get_names()[0]
molname = cmd.get_names()[1]

### Make the names we are going to use
protselectCB="%s and resi 308 and name CB"%protname
protnameselectCB="K308CB"
protselectCA="%s and resi 308 and name CA"%protname
protnameselectCA="K308CA"
molselect87="%s and id 87"%molname
molnameselect87="dyeatom87"
molselect85="%s and id 85"%molname
molnameselect85="dyeatom85"

### Make some selections
cmd.select("%s"%protnameselectCB,"%s"%protselectCB)
cmd.select("%s"%protnameselectCA,"%s"%protselectCA)
cmd.select("%s"%molnameselect85,"%s"%molselect85)
cmd.select("%s"%molnameselect87,"%s"%molselect87)

### Make nice representations
cmd.show_as("cartoon","%s"%protname)
cmd.show("sticks","byres %s"%protnameselectCB)

##### PART I: Use of functions #####
### This view will take you to the first part
set_view (\
     0.377224118,    0.880101919,   -0.288305759,\
     0.661396861,   -0.473919988,   -0.581338286,\
    -0.648268998,    0.028612033,   -0.760871351,\
     0.000000000,    0.000000000,  -56.408561707,\
    19.480533600,   34.572898865,    6.978204727,\
    46.615653992,   66.201446533,  -20.000001907 )

#### Just unhash each part for itself, as you continue through
#### The python mini shell is important, to get the return values of the functions

### To print a objects TTT matrix in a readable format
python
rotkit.printMat(cmd.get_object_matrix(molname))
python end

##### We want to move the dye to a desired location, and rotate it to a view we desire
##### First get the vector bewteen the dyeatom and the protein atom
##python
##diffvector = rotkit.vector("%s"%molselect87,"%s"%protnameselectCB)
##python end
##
##### Then move the dye
##python
##move = rotkit.transmat(diffvector)
##### print the matrix for fun
##rotkit.printMat(move)
##### Move the dye
##cmd.transform_selection("%s"%molname,move)
##python end
##
##### Now we want to displace the dye in the CA-CB bond direction
##python
##### First find the vector/direction to displace it in. From A -> B
##diffvector = rotkit.vector("%s"%protnameselectCA,"%s"%protnameselectCB)
##### Make the vector so its lenth is equal 1
##uvector = rotkit.unitvector(diffvector)[0]
##### Make the move translation matrix, and we multiply the matrix with 3, so it moves 3 Angstrom
##move = rotkit.transmat(uvector,3)
##### Print the matrix
##rotkit.printMat(move)
##### Displace it in the CA-CB direction
##cmd.transform_selection("%s"%molname,move)
##python end
##
##### Now we want to rotate it a single time. We convert 40 degress to radians
##### The input is the angle, the line to rotate around, and a point where the line goes through
##python
##CBxyz = rotkit.getxyz("%s"%protnameselectCB)[0]
##rmat = rotkit.rotmat(rotkit.radangle(40),uvector,CBxyz)
##rotkit.printMat(rmat)
##### Copy paste this line into pymol to see it manually
##cmd.transform_selection("%s"%molname,rmat)
##python end
##
##### We are not quite satisfied, we want to rotate it around its own bond
##### So we rotate in around its own 87-85 bonds
##python
##diffvector = rotkit.vector("%s"%molnameselect87,"%s"%molnameselect85)
##uvector = rotkit.unitvector(diffvector)[0]
##xyz85 = rotkit.getxyz("%s"%molnameselect85)[0]
##rmat = rotkit.rotmat(rotkit.radangle(10),uvector,xyz85)
##### Copy paste this line into pymol to see it manually
##cmd.transform_selection("%s"%molname,rmat)
##python end
##
##### Now, lets make a function that collects all these call in one function
##### We only want to define two positions that defines the line, the angle and the object to rotate
##python
##rotkit.rotateline("%s"%molnameselect87,"%s"%molnameselect85,180,"%s"%molname)
##python end
##### This is made as a pymol command as well. I first print the names that we should write manually in the consol
##print("rotateline Pos1=%s, Pos2=%s, degangle=15, molecule=%s"%(molnameselect87, molnameselect85, molname))
##
##### To illustate best, we create som copies of the dye
##python
##anglerange = range(90,360,90)
##for angle in anglerange:
##	### Make a suitable name for the new molecule
##	molanglename="%s%s"%(molname,angle)
##	### Now make a copy
##	cmd.create(molanglename,molname)
##	### Rotate the copy
##	rotkit.rotateline("%s"%molnameselect87,"%s"%molnameselect85,angle,"%s"%molanglename)
##python end
##
####### End of PART I ####
####### PART II: More advanced functions #####
##### This view will take you to the second part
##set_view (\
##     0.723298192,    0.467510879,    0.508201897,\
##     0.371686131,   -0.883831143,    0.284063697,\
##     0.581970334,   -0.016570913,   -0.813038886,\
##     0.000000000,    0.000000000,  -76.609786987,\
##    11.790571213,   64.992294312,   20.803859711,\
##   -31.181428909,  184.401092529,  -20.000001907 )
##
##### We can fast mutate a protein. frame 1 is the most probable mutation
##python
##rotkit.mutate(protname, chain="A", resi=513, target="CYS", mutframe=1)
##python end
##### This is made as a pymol command as well. I first print the names that we should write manually in the consol
##print("mutate %s, chain=%s, resi=%s, target=CYS, mutframe=1"%(protname, "A", 515))
##
##### We now make some selections for this mutation
##protselectCBcys="%s and resi 513 and name CB"%protname
##protnameselectCBcys="P513C_CB"
##protselectCAcys="%s and resi 513 and name CA"%protname
##protnameselectCAcys="P513C_CA"
##cmd.select("%s"%protnameselectCBcys,"%s"%protselectCBcys)
##cmd.select("%s"%protnameselectCAcys,"%s"%protselectCAcys)
##
##### Now, lets make a function that collects all the commands to put on an atom on the same line defined by two points
##### The input is the two points that define the line, the atom of a molecule to be put on the line, and the distance to move
##python
##rotkit.toline(protnameselectCAcys,protnameselectCBcys,molnameselect87,molname,3)
##rotkit.rotateline(protnameselectCAcys,protnameselectCBcys,5,molname)
##rotkit.rotateline(molnameselect87,molnameselect85,10,molname)
##python end
##print("toline Pos1=%s, Pos2=%s, atom=%s, molecule=%s, dist=%s"%(protnameselectCAcys,protnameselectCBcys,molnameselect87,molname,3))
##print("rotateline Pos1=%s, Pos2=%s, degangle=5, molecule=%s"%(protnameselectCAcys, protnameselectCBcys, molname))
##print("rotateline Pos1=%s, Pos2=%s, degangle=10, molecule=%s"%(molnameselect87, molnameselect85, molname))
##
####### End of PART II ####

rotkit.py

The code can be downloaded fast from here http://tinyurl.com/pymolrotkit

  1. wget http://tinyurl.com/pymolrotkit
  2. mv pymolrotkit rotkit.py
#-------------------------------------------------------------------------------
# Name:		rotkit.py   examples
# Purpose:      To rotate molecules easier
#
# Author:      tlinnet
#
# Created:     30/08/2011
# Copyright:   (c) tlinnet 2011
# Licence:     Free
#-------------------------------------------------------------------------------


from pymol import cmd
import math

def printMat(matrix):
	print("%s %s %s %s \n%s %s %s %s \n%s %s %s %s \n%s %s %s %s"%(matrix[0],matrix[1],matrix[2],matrix[3],matrix[4],matrix[5],matrix[6],matrix[7],matrix[8],matrix[9],matrix[10],matrix[11],matrix[12],matrix[13],matrix[14],matrix[15]))
	return None

def getxyz(Sel):
	if type(Sel)==list and len(Sel)==3:
		return Sel, "listXYZ"
	if type(Sel)==str and Sel[0]=="[" and Sel[-1]=="]":
		Selsplit = list(Sel[1:-1].split(","))
		Selsplit = [float(x) for x in Selsplit]
		return Selsplit, "strXYZ"
	if type(Sel)==str:
		pos = cmd.get_atom_coords(Sel)
		return pos, "selXYZ"

def vector(Sel1,Sel2):
	PosSel1 = getxyz(Sel1)[0]
	PosSel2 = getxyz(Sel2)[0]
	vectorcalc = [PosSel2[0]-PosSel1[0],PosSel2[1]-PosSel1[1],PosSel2[2]-PosSel1[2]]
	return(vectorcalc)

def vectorstr(vector):
	return("[%s,%s,%s]"%(vector[0],vector[1],vector[2]))

def transmat(vector,dist=1):
	mat = [1,0,0,0,0,1,0,0,0,0,1,0,dist*vector[0],dist*vector[1],dist*vector[2],1]
	return(mat)

def unitvector(vector):
	vectorlen = math.sqrt(math.pow(vector[0],2)+math.pow(vector[1],2)+math.pow(vector[2],2))
	vectordiv = [vector[0]/vectorlen, vector[1]/vectorlen, vector[2]/vectorlen]
	return(vectordiv,vectorlen)

def radangle(angle):
	return(math.radians(angle))

def rotmat(angle,vectornorm,pointcoord):
	### From: http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/ Section 6.2
	u,v,w = vectornorm
	a,b,c = pointcoord
	makerotmat = [(math.pow(u,2)+(math.pow(v,2)+math.pow(w,2))*math.cos(angle)),
	(u*v*(1-math.cos(angle))-w*math.sin(angle)),
	(u*w*(1-math.cos(angle))+v*math.sin(angle)),
	((a*(math.pow(v,2)+math.pow(w,2))-u*(b*v+c*w))*(1-math.cos(angle))+(b*w-c*v)*math.sin(angle)),
	(u*v*(1-math.cos(angle))+w*math.sin(angle)),
	(math.pow(v,2)+(math.pow(u,2)+math.pow(w,2))*math.cos(angle)),
	(v*w*(1-math.cos(angle))-u*math.sin(angle)),
	((b*(math.pow(u,2)+math.pow(w,2))-v*(a*u+c*w))*(1-math.cos(angle))+(c*u-a*w)*math.sin(angle)),
	(u*w*(1-math.cos(angle))-v*math.sin(angle)),
	(v*w*(1-math.cos(angle))+u*math.sin(angle)),
	(math.pow(w,2)+(math.pow(u,2)+math.pow(v,2))*math.cos(angle)),
	((c*(math.pow(u,2)+math.pow(v,2))-w*(a*u+b*v))*(1-math.cos(angle))+(a*v-b*u)*math.sin(angle)),
	(0),(0),(0),(1),]
	return(makerotmat)

def rotateline(Pos1,Pos2,degangle,molecule):
	diffvector = vector(Pos1,Pos2)
	uvector = unitvector(diffvector)[0]
	xyz = getxyz(Pos2)[0]
	rmat = rotmat(radangle(float(degangle)),uvector,xyz)
	cmd.transform_selection(molecule,rmat)
	return(None)
cmd.extend("rotateline",rotateline)

def mutate(molecule,chain,resi,target="CYS",mutframe="1"):
	target = target.upper()
	cmd.wizard("mutagenesis")
	cmd.do("refresh_wizard")
	cmd.get_wizard().set_mode("%s"%target)
	selection="/%s//%s/%s"%(molecule,chain,resi)
	cmd.get_wizard().do_select(selection)
	cmd.frame(str(mutframe))
	cmd.get_wizard().apply()
	cmd.set_wizard("done")
	cmd.select("%s%s%s_%s"%(molecule,chain,resi,target),"byres %s"%(selection))
cmd.extend("mutate",mutate)

def toline(Pos1,Pos2,atom,molecule,dist=1):
	dist = float(dist)
	diffvector = vector(atom,Pos2)
        move = transmat(diffvector)
        cmd.transform_selection("%s"%molecule,move)
	diffvector = vector(Pos1,Pos2)
        uvector = unitvector(diffvector)[0]
        move = transmat(uvector,dist)
        cmd.transform_selection("%s"%molecule,move)
	return(None)
cmd.extend("toline",toline)