Jump to content

Rotkit

From PyMOL Wiki
Revision as of 23:10, 29 August 2011 by Tlinnet (talk | contribs)

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)