#視覺化#Pymol小指令碼之Rotkit
Rotkit是一個pymol小指令碼工具包,依稀記得還是大四的時候有人在bioms群裡出售一個指令碼,可以將配體周圍的氨基酸殘基進行突變,然後進行突變對接或者分析,來簡單的檢視突變對配體與蛋白之間的相互影響。當時覺得非常的高達上,今天檢視Pymol的時候發現這個小指令碼就可以非常容易的實現這個功能,當然pymol的功能不僅僅如此,還有更多的功能。
這個指令碼套件是一個小的指令碼合集,能夠精確的將小分子放在你想要的蛋白質上。(雖然官方介紹這麼說,但是還是要強調一下功能遠不止如此)
PyMOL可用的指令碼功能
rotateline(Pos1,Pos2,degangle,molecule):
"Pos1>Pos2"定義了一個“分子”將旋轉“degangle”的度數
rotateline Pos1=P513C_CA, Pos2=P513C_CB, degangle=5, molecule=Atto590
rotateline Pos1=dyeatom87, Pos2=dyeatom85, degangle=10, molecule=Atto590
mutate(molecule,chain,resi,target="CYS",mutframe="1"):
突變目標一個/分子/鏈/殘基,並且選擇最可能的幀
mutate 1HP1, chain=A, resi=515, target=CYS, mutframe=1
toline(Pos1,Pos2,atom,molecule,dist=1):
平移分子原子,1 埃的距離,方向為Pos1>Pos2
toline Pos1=P513C_CA, Pos2=P513C_CB, atom=dyeatom87, molecule=Atto590, dist=3
通過rotkit.functionname(可能運用不多)
printMat(matrix):
列印 TTT matrix 格式. (4X4)
getxyz(Sel):
輸出一個列表[x,y,z],為浮點數
vector(Sel1,Sel2):
尋找兩個點的向量
vectorstr(vector):
將vector的格式轉換為str格式(開始為列表格式)
transmat(vector,dist=1):
根據輸入向量製作TTT轉換矩陣。 向量乘以距離。
unitvector(vector):
將vector變為單位向量
radangle(angle):
轉換角度變為弧度(radians)
rotmat(angle,vectornorm,pointcoord):
圍繞一個座標點進行旋轉
point.crossprod(Vector1, Vector2):
兩個向量進行向量積
crosspoint(Pos1, crossprod):
Returns the endpoint for the Position plus the crossproduct vector. Suitable if one would like to rotate around a crossvector.
示例
示例1-對結構進行旋轉
reinitialize
import rotkit
fetch 1HP1, async=0
show_as cartoon, 1HP1
show_as sticks, 1HP1 and resn ATP
###################### Make rotation axis #################
pseudoatom axisA, vdw=1.0
pseudoatom axisB, vdw=1.0
rotkit.toline("/1HP1//A/477/C","/1HP1//A/423/CG1","axisA","axisA",20)
rotkit.toline("/1HP1//A/423/CG1","/1HP1//A/477/C","axisB","axisB",5)
show spheres, axisA or axisB
label axisA, "axisA"
label axisB, "axisB"
dist rotaxis, axisA, axisB
color green, rotaxis
set dash_width, 5
set dash_gap, 0
hide label, rotaxis
## Create rotate states of 1HP1
create 1HP1_rot, 1HP1, 1, 1
python
ang_incr = 1
anglerange = range(2,98,ang_incr)
nrstates = len(anglerange)+1
states = 1
for angle in anglerange:
states += 1
rot_1HP1 = "1HP1_rot_%s"%angle
cmd.create(rot_1HP1,"(1HP1 and resi 363-550) or (1HP1 and resn ATP)")
rotkit.rotateline("axisA","axisB",-(angle-1),rot_1HP1)
cmd.create("1HP1_rot",rot_1HP1,1,states)
cmd.create("1HP1_rot",rot_1HP1,1,2*nrstates-states)
cmd.delete(rot_1HP1)
python end
hide cartoon, (1HP1 and resi 363-550)
hide sticks, (1HP1 and resn ATP)
mplay
示例2-模擬染料的自由度
reinitialize
import rotkit
fetch 1HP1, async=0
show_as cartoon, 1HP1
show_as sticks, 1HP1 and resn ATP
set auto_zoom, off
###################### Make rotation axis #################
pseudoatom axisA, vdw=1.0
pseudoatom axisB, vdw=1.0
rotkit.toline("/1HP1//A/477/C","/1HP1//A/423/CG1","axisA","axisA",20)
rotkit.toline("/1HP1//A/423/CG1","/1HP1//A/477/C","axisB","axisB",5)
show spheres, axisA or axisB
label axisA, "axisA"
label axisB, "axisB"
dist rotaxis, axisA, axisB
color green, rotaxis
set dash_width, 5
set dash_gap, 0
hide label, rotaxis
####################### Create rotate states of dye atoms ###################
##### First mutate, the mutate functions take 0.2 seconds, so we put in a refesh command to wait for everything is done
rotkit.mutate("1HP1", chain="A", resi=308, target="CYS", mutframe=1)
cmd.refresh()
rotkit.mutate("1HP1", chain="A", resi=513, target="CYS", mutframe=1)
cmd.refresh()
##### Create simulated dye movement atoms
pseudoatom Donor, vdw=0.5
pseudoatom Acceptor, vdw=0.5
show spheres, Donor or Acceptor
rotkit.toline("1HP1 and resi 308 and name CA","1HP1 and resi 308 and name SG","Donor","Donor",15.0)
rotkit.toline("1HP1 and resi 513 and name CA","1HP1 and resi 513 and name SG","Acceptor","Acceptor",15.0)
python
Dye_ang_incr = 6
Donor_angle_range = range(0,359,Dye_ang_incr)
Acceptor_angle_range = range(0,359,Dye_ang_incr)
nrstates = len(Donor_angle_range)+1
Donor_states = 1
Acceptor_states = 1
for Donor_angle in Donor_angle_range:
Donor_states += 1
Donor_angle_name="Donor_%s"%(Donor_angle)
cmd.create(Donor_angle_name,"Donor")
rotkit.rotateline("1HP1 and resi 308 and name CA","1HP1 and resi 308 and name CB",Donor_angle,Donor_angle_name)
# Save it as states in Donor
cmd.create("Donor",Donor_angle_name,1,Donor_states)
cmd.create("Donor",Donor_angle_name,1,2*nrstates-Donor_states)
cmd.group("All_Donors",Donor_angle_name)
for Acceptor_angle in Acceptor_angle_range:
Acceptor_states += 1
Acceptor_angle_name="Acceptor_%s"%(Acceptor_angle)
cmd.create(Acceptor_angle_name,"Acceptor")
rotkit.rotateline("1HP1 and resi 513 and name CA","1HP1 and resi 513 and name CB",Acceptor_angle,Acceptor_angle_name)
# Save it as states in Acceptor
cmd.create("Acceptor",Acceptor_angle_name,1,Acceptor_states)
cmd.create("Acceptor",Acceptor_angle_name,1,2*nrstates-Acceptor_states)
cmd.group("All_Acceptors",Acceptor_angle_name)
python end
disable All_Donors
disable All_Acceptors
cmd.create("Donor","All_Donors",1,1)
cmd.create("Acceptor","All_Acceptors",1,1)
mplay
示例3-建立距離分佈直方圖
reinitialize
import rotkit
fetch 1HP1, async=0
show_as cartoon, 1HP1
show_as sticks, 1HP1 and resn ATP
set auto_zoom, off
####################### Create rotate states of dye atoms ###################
##### First mutate, the mutate functions take 0.2 seconds, so we put in a refesh command to wait for everything is done
rotkit.mutate("1HP1", chain="A", resi=308, target="CYS", mutframe=1)
cmd.refresh()
rotkit.mutate("1HP1", chain="A", resi=513, target="CYS", mutframe=1)
cmd.refresh()
##### Create simulated dye movement atoms
pseudoatom Donor, vdw=0.5
pseudoatom Acceptor, vdw=0.5
show spheres, Donor or Acceptor
rotkit.toline("1HP1 and resi 308 and name CA","1HP1 and resi 308 and name SG","Donor","Donor",15.0)
rotkit.toline("1HP1 and resi 513 and name CA","1HP1 and resi 513 and name SG","Acceptor","Acceptor",15.0)
python
Dye_ang_incr = 6
Donor_angle_range = range(0,359,Dye_ang_incr)
Acceptor_angle_range = range(0,359,Dye_ang_incr)
Donor_names = []
Acceptor_names = []
for Donor_angle in Donor_angle_range:
Donor_angle_name="Donor_%s"%(Donor_angle)
Donor_names.append([Donor_angle,Donor_angle_name])
cmd.create(Donor_angle_name,"Donor")
rotkit.rotateline("1HP1 and resi 308 and name CA","1HP1 and resi 308 and name CB",Donor_angle,Donor_angle_name)
cmd.group("All_Donors",Donor_angle_name)
for Acceptor_angle in Acceptor_angle_range:
Acceptor_angle_name="Acceptor_%s"%(Acceptor_angle)
Acceptor_names.append([Acceptor_angle,Acceptor_angle_name])
cmd.create(Acceptor_angle_name,"Acceptor")
rotkit.rotateline("1HP1 and resi 513 and name CA","1HP1 and resi 513 and name CB",Acceptor_angle,Acceptor_angle_name)
cmd.group("All_Acceptors",Acceptor_angle_name)
python end
disable All_Donors
disable All_Acceptors
cmd.create("Donor","All_Donors")
cmd.create("Acceptor","All_Acceptors")
cmd.refresh()
# Make a distribution for the Open case
Don_Acc_distribution = []
python
for Don in Donor_names:
for Acc in Acceptor_names:
distname = "%s_%s"%(Don[1],Acc[1])
distance = cmd.dist(distname,Don[1],Acc[1])
Don_Acc_distribution.append([Don[0], Acc[1], distance])
cmd.delete(distname)
python end
Newdir=rotkit.createdirs("results_rotkit")
os.chdir(Newdir)
rotkit.makehistogram(Don_Acc_distribution,dataname="Don_Acc_Open",datalistindex=2,nrbins=100,binrange=[0,0])
# Make a distribution for angle range
cmd.create("Acceptor_rot","All_Acceptors")
python
ang_incr = 1
anglerange = range(2,98,ang_incr)
nrstates = len(anglerange)+1
states = 1
for angle in anglerange:
states += 1
rot_Acceptor = "Acceptor_rot_%s"%angle
cmd.create(rot_Acceptor,"Acceptor_rot")
rotkit.rotateline("/1HP1//A/423/CG1","/1HP1//A/477/C",-(angle-1),rot_Acceptor)
cmd.create("Acceptor_rot",rot_Acceptor,1,states)
cmd.create("Acceptor_rot",rot_Acceptor,1,2*nrstates-states)
cmd.delete(rot_Acceptor)
for Acc in Acceptor_names:
rotkit.rotateline("/1HP1//A/423/CG1","/1HP1//A/477/C",(angle-1),Acc[1])
python end
mplay
示例5-功能嚮導檔案
通過這個功能可以瞭解該外掛是怎樣進行工作的
reinitialize
import rotkit
fetch 1HP1, async=0
python
if 'PYMOL_GIT_MOD' in os.environ:
example_dir = os.path.join(os.path.split(os.environ['PYMOL_GIT_MOD'])[0],"files_for_examples")
cmd.load(os.path.join(example_dir,"Atto590.pdb"))
else:
cmd.load("Atto590.pdb")
python end
# Make sure everything is loaded before we continue
cmd.refresh()
### 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"
molselect13="%s and id 13"%molname
molnameselect13="dyeatom13"
molselect12="%s and id 12"%molname
molnameselect12="dyeatom12"
### Make some selections
cmd.select("%s"%protnameselectCB,"%s"%protselectCB)
cmd.select("%s"%protnameselectCA,"%s"%protselectCA)
cmd.select("%s"%molnameselect13,"%s"%molselect13)
cmd.label("%s"%molnameselect13,"13")
cmd.select("%s"%molnameselect12,"%s"%molselect12)
cmd.label("%s"%molnameselect12,"12")
### 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
### To print a objects TTT matrix in a readable format
rotkit.printMat(cmd.get_object_matrix(molname))
##### 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
diffvector = rotkit.vector("%s"%molselect13,"%s"%protnameselectCB)
##### Then move the dye
move = rotkit.transmat(diffvector)
##### print the matrix for fun
rotkit.printMat(move)
##### Move the dye
cmd.transform_selection("%s"%molname,move)
##### Now we want to displace the dye in the CA-CB bond direction
##### 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)
##### 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
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)
##### We are not quite satisfied, we want to rotate it around its own bond
##### So we rotate in around its own 13 -> 12 bonds
diffvector = rotkit.vector("%s"%molnameselect13,"%s"%molnameselect12)
uvector = rotkit.unitvector(diffvector)[0]
xyz12 = rotkit.getxyz("%s"%molnameselect12)[0]
rmat = rotkit.rotmat(rotkit.radangle(10),uvector,xyz12)
##### Copy paste this line into pymol to see it manually
cmd.transform_selection("%s"%molname,rmat)
##### 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
rotkit.rotateline("%s"%molnameselect13,"%s"%molnameselect12,180,"%s"%molname)
##### 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"%(molnameselect13, molnameselect12, 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)
cmd.label("%s and id 12"%molanglename,"12")
cmd.label("%s and id 13"%molanglename,"13")
### Rotate the copy
rotkit.rotateline("%s"%protnameselectCB,"%s"%molnameselect13,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
rotkit.mutate(protname, chain="A", resi=513, target="CYS", mutframe=1)
##### The mutate functions take 0.2 seconds, so we put in a refesh command to wait for everything is done
cmd.refresh()
##### 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
rotkit.toline(protnameselectCAcys,protnameselectCBcys,molnameselect13,molname,3)
rotkit.rotateline(protnameselectCAcys,protnameselectCBcys,180,molname)
rotkit.rotateline(molnameselect13,molnameselect12,10,molname)
print("toline Pos1=%s, Pos2=%s, atom=%s, molecule=%s, dist=%s"%(protnameselectCAcys,protnameselectCBcys,molnameselect13,molname,3))
print("rotateline Pos1=%s, Pos2=%s, degangle=180, molecule=%s"%(protnameselectCAcys, protnameselectCBcys, molname))
print("rotateline Pos1=%s, Pos2=%s, degangle=10, molecule=%s"%(molnameselect13, molnameselect12, molname))
cmd.refresh()
####### End of PART II ####
####### Now we make a cross product ####
molselect14="%s and id 14"%molname
molnameselect14="dyeatom14"
cmd.select("%s"%molnameselect14,"%s"%molselect14)
cmd.label("%s"%molnameselect14,"14")
cross = rotkit.crossprod(rotkit.vector(molselect13,molselect12),rotkit.vector(molselect13,molselect14))
unity_cross = rotkit.unitvector(cross)[0]
point_cross = rotkit.crosspoint(molselect13,cross)
rotkit.rotateline(molnameselect13,point_cross,180,molname)
print("rotateline Pos1=%s, Pos2=%s, degangle=10, molecule=%s"%(molnameselect13, point_cross, molname))
更多原創精彩視訊敬請關注生信雜談:
相關文章
- 視覺化之資料視覺化最強工具推薦視覺化
- 淺析“程式碼視覺化”視覺化
- 在NS3下如何用Python指令碼,以及PyViz視覺化S3Python指令碼視覺化
- Tableau視覺化結果的優化小技巧(二)視覺化優化
- 程式碼視覺化的自動化之路視覺化
- 視覺化視覺化
- 綻放資料視覺化之美視覺化
- 資料視覺化之風向圖視覺化
- 資料視覺化編輯平臺上線,小程式也能擁有視覺化圖層視覺化
- 3D視覺化|疫情態勢視覺化3D視覺化
- 視覺化圖形制作之關係圖視覺化
- 視覺化拖拽 UI 佈局之拖拽篇視覺化UI
- 視覺化portainer視覺化AI
- 資料視覺化設計的25個小技巧視覺化
- 資料視覺化基本原理——視覺化模型視覺化模型
- CNN視覺化技術總結(三)--類視覺化CNN視覺化
- 資料視覺化與資訊視覺化怎麼搞?視覺化
- 碼棧搭建自動化應用(視覺化模式)視覺化模式
- 聊聊程式碼倉庫視覺化:gource 篇視覺化Go
- 前端之圖形學-1 資料視覺化前端視覺化
- 資料視覺化圖表之折線圖視覺化
- 新書預告《資料視覺化之美》新書視覺化
- 小程式海報最佳實現思路,視覺化編輯直接生成程式碼使用視覺化
- 視覺化影像處理 | 視覺化訓練器 | 影像分類視覺化
- 資料視覺化詳解+程式碼演練視覺化
- 低程式碼 系列 —— 視覺化編輯器3視覺化
- 一份視覺化特徵圖的程式碼視覺化特徵
- API安全閘道器之視覺化相關科普API視覺化
- Python資料視覺化之Pygal圖表型別Python視覺化型別
- 【TensorFlow篇】--Tensorflow框架視覺化之Tensorboard框架視覺化ORB
- caffe之提取任意層特徵並進行視覺化特徵視覺化
- oracle資料庫之plsql視覺化操作建表Oracle資料庫SQL視覺化
- 資料視覺化如何選擇合適的視覺化圖表?視覺化
- 【程式碼視覺化實踐】程式碼變更影響分析視覺化
- Oracle檢視每小時日誌切換量指令碼Oracle指令碼
- github repository視覺化Github視覺化
- 視覺化速成指南-大小視覺化
- 資料看板視覺化視覺化