从大二开始接触PyMol至今已有4年了,之前只会用PyMol展示PDB文件。记得有一回需要找蛋白质所有催化残基3.6埃以内的活性位点。想到PyMol打开PDB文件时肯定已经完成了解析,就想写一个脚本拿到感兴趣的位点然后遍历所有原子坐标找到3.6埃以内的残疾。由于对PyMol不是很熟悉,这个想法在脑海中闪现之后就夭折了。后来我写了个C++程序,从PDB文件开始解析,真是废了九牛二虎之力,现在想想,当时真是太simple,还是要学习啊。

Pymol调用用户脚本

今天学习了一下PyMol调用脚本的过程,于是有了这篇博客。
PyMol是用Python实现的开源软件。用户可以用Python写一个自定义函数(没试过类,以后有需要再试试),关键是如何让让自己写的函数嵌入到PyMol。
主要过程如下(流程图):

Created with Raphaël 2.1.0 run script cmd.extend End

所有操作在PyMol命令窗口中完成。
这里新建了两个文件:pymolrc.pml,start.py。两个文件都放在宿主目录下。请不要修改第一个文件的名字,第二个文件的名字请自便。如果修改的话,下面也要相应修改成你的文件名。Windows的宿主目录位于C:/Users/ste/,C代表系统盘的位置。Linux宿主目录不知道的话,敲个cd直接回车,进入的目录就是你的宿主目录。PyMol在启动时会自动调用宿主目录下的pymolrc文件,在该文件中添加

run start.py

假设在start.py中定义了一个名为hello的函数,并且不传入任何参数。接下来使用

cmd.extend("hello", hello)

将hello函数注册为PyMol命令。当然你也可以将上面这行代码添加到start.py中,接下来就可以像使用label、create这些内置PyMol命令一样使用hello了
command形式:

hello

PyMol API形式:

hello()

使用上述两个文件有一个好处:所有自定义命令会在PyMol启动时注册为PyMol命令,从而扩展了PyMol命令及API。
下面分别是我的pymolrc.pml和start.py文件

set label_position, (3,2,1)
run ~/start.pycd E:\Dropbox\endnote\CRISPR.Data\PDB
#http://pymolwiki.org/index.php/Simple_Scripting#Python_Version_Supported_by_PyMOL
oneLetter ={'VAL':'V', 'ILE':'I', 'LEU':'L', 'GLU':'E', 'GLN':'Q', 'ASP':'D', 'ASN':'N', 'HIS':'H', 'TRP':'W', 'PHE':'F', 'TYR':'Y', 'ARG':'R', 'LYS':'K', 'SER':'S', 'THR':'T', 'MET':'M', 'ALA':'A', 'GLY':'G', 'PRO':'P', 'CYS':'C', 'ADE':'A', 'URI':'U', 'GUA':'G', 'CYT':'C', 'THY':'T'}
mylabel = 'oneLetter[resn] + resi'RPOTEIN = 1
NUCLEICACID = 2
def mylabel(sel, mode=1):mode = int(mode)if mode == 1:cmd.label(sel, 'oneLetter[resn] + resi')else:cmd.label(sel, 'resn + resi')cmd.extend("mylabel", mylabel)from pymol import storeddef getseq2(sel, mode = RPOTEIN):stored.seq = []mode = int(mode)# iterate over state 1, or the sel -- this just means# for each item in the selection do what the next parameter says.# And, that is to append the residue name to the stored.seq# array.if mode == RPOTEIN:sel= sel + " and n. CA"cmd.iterate_state(1, selector.process(sel), "stored.seq.append(oneLetter[resn])")else:sel1= sel + " and n. p"sel2= sel + " and n. c1'"print cmd.count_atoms(sel1)sel = sel1 if cmd.count_atoms(sel1) > cmd.count_atoms(sel2) else sel2cmd.iterate_state(1, selector.process(sel), "stored.seq.append(resn)")print selprint ''.join(stored.seq)cmd.extend("getseq2", getseq2)#iterate al atoms in selection, extract resn per resi
def getseq(sel):stored.seq = []atoms = cmd.get_model(sel)#get first atomatom = atoms.atom[0]resiCurr = atom.resiif atom.resn in oneLetter.keys():stored.seq.append(oneLetter[atom.resn])elif len(atom.resn) == 1:stored.seq.append(atom.resn)else:stored.seq.append(atom.resn + ' ')for atom in atoms.atom:if atom.resi != resiCurr:resiCurr = atom.resiif atom.resn in oneLetter.keys():stored.seq.append(oneLetter[atom.resn])elif len(atom.resn) == 1:stored.seq.append(atom.resn)else:stored.seq.append(' ' + atom.resn + ' ')print re.sub('(.{60})', r'\1\n', ''.join(stored.seq))cmd.extend("getseq", getseq)def mytest():atoms = cmd.get_model("chain A and resi 2-3 and n. C+O+N+CA")for at in atoms.atom:print "ATOM DEFINITION: "+at.chain+" "+at.resn+" "+str(at.resi)+" " +at.name+" "+str(at.index)+" "+str(at.b)+" "+str(at.coord[0])+" "+str(at.coord[1])+" "+str(at.coord[2])cmd.extend("mytest", mytest)def myexit():os._exit(0)
cmd.extend("myexit", myexit)def getseqbychain():chains = cmd.get_chains('all')for chain in chains:#print chainsel = 'chain %s' % chainprint '>%s' % chaingetseq(sel)
cmd.extend('getseqbychain', getseqbychain)

操作原子

到此为止,用户就可以顺利向PyMol注册自定义命令了。接下来要做的就是如何从PyMol获得原子坐标等基本信息。
核心思路是通过selection获得一个object,这个object包含原子信息。
可以参考这篇wiki:get_model
我的start.py有两个函数可以参考:getseq,getseqbychain。getseq主要是根据传入的selection获得所有atom instance,然后遍历之。因为一个残基含有多个原子,这里需要过滤。同一个残基上的原子含有相同的resi,根据这一点去除冗余。
刚开始想到的是使用残基的一个特征原子来代替残基,从而避免遍历所有的原子。对蛋白质,可以使用CA;对核酸就比较复杂了。有些核酸的某个残基没有C1’或者P,导致selection漏掉了这个残基,函数getseq2就是按照这种思路实现的。

资源推荐

  1. pymolwiki
    这里可以找到你想要的PyMol命令的用法及示例。
    simple scripting
  2. pymol mail list
    PyMol用户众多,你遇到的问题,别人很可能已经遇到,而且很可能已经有了解决方案。
  3. Google
    Google在任何时候都是一个很好的助手!

PyMol - script相关推荐

  1. 用PyMOL展示配体和受体相互作用的原子和氢键

    转载于 https://mp.weixin.qq.com/s/P62sjqhSTxmWVicrEAk-RQ 为了简化展示过程,我们设计了一个pml脚本 (脚本内有很详细的解释),只需要修改脚本里面受体 ...

  2. pymol 知道多少?pymol技巧汇总

    基本命令(也可使用鼠标操作,但不如命令来得简单) pwd          # show current directory dir          # list file in the curre ...

  3. Pymol指令大全。官方社区——海量Pymol作图的代码

    Gallery - PyMOLWikihttps://pymolwiki.org/index.php/Gallery美观的PyMOL生成的图像及其脚本.(需要科学上网) 这个官方社区网站聚集了大量大佬 ...

  4. pymol中编写和运行python脚本

    pymol中编写和运行python脚本 0.说明 简单介绍pymol中调用python脚本,后续把详细的图片更新.(2021年9月13日) 后续相关更新会直接粘贴到文件中. 1. 编写功能 批量读取本 ...

  5. python生成化学结构_用PyMOL制作分子结构图像及所用脚本

    信息来源 PyMol is one of the best open source software for visualizing the bio-molecules. Still many com ...

  6. 用PyMOL制作分子结构图像及所用脚本

    信息来源 Cool PyMOL-generated Images and their Scripts. Making animations and images with PyMOL PyMol is ...

  7. python高阶教程译文_高级教程 — PyMOL中文教程 2020.09 文档

    PyMOL脚本.命令.插件¶ PyMOL支持Python 编程语言,故可以借助python让pymol无所不能,pymol除了显示软件,也能成为计算软件. 脚本:把pymol作为一个模块,实现一些计算 ...

  8. 用Pymol的pythonAPI来获取原子所属残基的信息

    import pymol2 with pymol2.PyMOL() as pymol:pymol.cmd.load("1A8O.pdb")for atom in pymol.cmd ...

  9. npm run dev 报错:missing script:dev

    错误描述 运行 npm run dev 报错 missing script:dev 原因 查看package.json发现script中并没有dev而是serve.. 所以运行 npm run ser ...

最新文章

  1. LINUX inner-process communication
  2. oracle竖行的两列变成横行_oracle数据竖列转横向显示问题!
  3. 数字型变量可以直接计算
  4. 微信H5 回调_PHP实现微信H5支付
  5. 网络爬虫--20.【Scrapy-Redis实战】分布式爬虫获取房天下--代码实现
  6. PAMIE:点击网页中的弹出窗口的按钮
  7. 将计算机设置成交换机主机名,交换机命令
  8. 4_less中带参数混合
  9. Java 使用阿里巴巴 Dns Cache Manipulator
  10. 第6章 基于锁的并发数据结构设计
  11. CATransition 动画处理视图切换
  12. Atitit 提升开发效率 mvc 框架 java 目录 第一节 Spark mvc Supt htdpl 1 第二节 jfinal 框架 Supt htdpl 不推荐 1 第三节 个人刚接
  13. C盘清理工具帮你迅速找到大文件
  14. 使用较广泛的安全测试工具有哪些?
  15. DDR3基本概念1 - 存储单元结构和原理
  16. 连续词袋模型(Continous bag of words, CBOW)
  17. 任正非:外界过分吹捧华为,导致员工惰怠,华为必须保持清醒
  18. spring boot runner,destory监听
  19. seata xid是什么_html中的xid
  20. 在WPS的PPT中添加高亮代码(非插入图片)

热门文章

  1. Node.js crypto模块
  2. 中小学图书馆阅览室建设方案
  3. Unity 录屏截屏到Android相册,支持鸿蒙
  4. Python 创建简单的统一格式文件
  5. 《跃迁》--读书笔记--序言
  6. WiFi_Direct 直连开发实战
  7. 赛效:怎么在图片上打马赛克
  8. Spark 2.2.1 SQL UDAF用户自定义函数案例
  9. JavaEE 学习笔记 —— Spring Framework
  10. word 插入高阶组合矩阵