Mol2文件处理-拆分、合并、提取名称、计数与格式转换

欢迎浏览我的CSND博客! Blockbuater_drug …点击进入


前言

Mol2格式文件是常用的分子结构存储文件,可以在一个.Mol2文件中记录单个或多个分子的立体结构信息、电荷信息以及其他信息。
本文介绍Mol2分子处理的常见操作,包括文件合并与拆分,分子名称修改,分子计数与变量传递等。
在这里插入图片描述
Mol2文件格式的介绍:化学分子Mol2文件格式与使用注意事项
Tripos Mol2 Format File,分子结构 mol2格式文件的详细介绍:mol2格式文件的详细介绍PDF

一、Mol2文件合并

6个文件,每个包含0个,1个或者过个分子:M1.mo2, M2.mol2,M3.mol2,M4.mo2,M5.mol2,M6.mol2
合并前三个文件到新文件merge-3.mol2,利用Linux命令cat:

#用cat命令,定向输出
cat *.mol2 > Merge1-3.mol2

将M4.mo2,M5.mol2,M6.mol2三个文件中分子,添加进Merge1-3.mol2,命名Merge1-6.mol2;

# cat 追加,然后改名
cat M4.mo2 M5.mol2 M6.mol2  >>  Merge1-3.mol2
mv Merge1-3.mol2 Merge1-6.mol2

具体用法:
obabel *.mol2 -omol2 -O mergemol2.mol2

obabel *.mol2 -omol2 -O mergemol2.mol2
obabel *.mol2 -osdf -O mergemol2.sdf

二、Mol2文件拆分为含有单个分子的文件

来自数据库或者供应商的文件列表往往是包含多个分子的文件,多分子的Mol2文件可以用以下Python脚本拆分,支持Python2或者Python3,来自AspirinCode博主。
用法:

python split_multimol2.py multi-mol2.mol2 out_dir

将需要拆分的文件命名为multi-mol2.mol2,在同一目录建立文件夹out_dir,运行以上脚本。

split_multimol2.py脚本内容:

#Python2 or Python3
#AspirinCode 2018
#Script that splits a multi-mol2 file into individual mol2 files.
#python split_multimol2.py multi-mol2.mol2 out_dirimport sys
import osdef split_multimol2(multimol2):"""Splits a multi-mol2 file.Parameters----------multimol2 : strPath to the multi-mol2 file.Returns----------A generator object for lists for every extracted mol2-file. Lists containthe molecule ID and the mol2 file contents.e.g., ['ID1234', '@<TRIPOS>MOLECULE...'"""with open(multimol2, 'r') as mol2file:line = mol2file.readline()while not mol2file.tell() == os.fstat(mol2file.fileno()).st_size:if line.startswith("@<TRIPOS>MOLECULE"):mol2cont = []mol2cont.append(line)line = mol2file.readline()molecule_id = line.strip()while not line.startswith("@<TRIPOS>MOLECULE"):mol2cont.append(line)line = mol2file.readline()if mol2file.tell() == os.fstat(mol2file.fileno()).st_size:mol2cont.append(line)breakmol2cont[-1] = mol2cont[-1].rstrip() # removes blank line at file endyield [molecule_id, "".join(mol2cont)]def write_multimol2(multimol2, out_dir):"""Splits a multi-mol2 file into smaller multi-mol2 files.Parameters-----------multimol2 : strPath to the multi-mol2 file.out_dir : str:Output directory. New files will be named<molecule_name_1>.mol2, ... <molecule_name_n>.mol2Returns-----------chunks : intNumber of files written."""if not out_dir:os.mkdir(out_dir)single_mol2s = split_multimol2(args.MOL2_FILE)for mol2 in single_mol2s:out_mol2 = os.path.join(args.OUT_DIR, mol2[0]) + '.mol2'with open(out_mol2, 'w') as out_file:for line in mol2[1]:out_file.write(line)out_file.write('\n')def write_multimol2_chunks(multimol2, chunk_size, out_dir):"""Splits a multi-mol2 file into smaller multi-mol2 files.Parameters-----------multimol2 : strPath to the multi-mol2 file.chunksize : intNumber of mol2 files per chunk.out_dir : str:Output directory. New files will be named<multimol2>_1.mol2, ... <multimol2>_n.mol2Returns-----------chunks : intNumber of files written."""if not os.path.exists(out_dir):os.mkdir(out_dir)out_path_stem = os.path.dirname(multimol2)out_file_stem = os.path.basename(multimol2).split('.mol2')[0]cnt = 0chunks = 1out_file = open(os.path.join(out_dir, out_file_stem)+'_%d.mol2' % chunks, 'w')for mol2 in split_multimol2(multimol2):cnt += 1if cnt == chunk_size:cnt = 0chunks += 1out_file.close()out_file = open(os.path.join(out_dir, out_file_stem)+'_%d.mol2' % chunks, 'w')out_file.write(mol2[1] + '\n')out_file.close()return chunksif __name__ == '__main__':import argparseparser = argparse.ArgumentParser(description='Splits a multi-mol2 file into individual mol2 files',formatter_class=argparse.RawTextHelpFormatter)parser.add_argument('MOL2_FILE')parser.add_argument('OUT_DIR')parser.add_argument('-c', '--chunksize', help='Number of MOL2 structures per file (1 by default)', type=int)parser.add_argument('-v', '--version', action='version', version='split_multimol2 v. 1.1')args = parser.parse_args()if args.chunksize:write_multimol2_chunks(multimol2=args.MOL2_FILE, chunk_size=args.chunksize, out_dir=args.OUT_DIR)else:write_multimol2(multimol2=args.MOL2_FILE, out_dir=args.OUT_DIR)

拆分后单一分子的文件名是mol2分子的名称,即@MOLECULE字段的第一行。

三、Mol2文件分子名称修改与提取

3.1 分子名称修改去除空格

由于包含单一分子的mol2文件中,分子名称(文件第二行)的命名相对自由,其中可以包含空格等字符,以此命名mol2文件名会在后续文件名操作中带入空格,Tab等,出现变量传递错位等问题。
这里展示从拆分后多个mol2文件中删除分子名称中的空格(\s)和Tab(\t):

cd out_dir
filelists=$(ls)
for file in ${filelists}; do if [ ${file##*.} = "mol2" ]; then newmol2name=${file%.*}; sed -i '2s/\s//g; 2s/\t//g' ${file}fi
done
cd ..

3.2 文件名称提取

有时需要mol2文件名字列表:

cd out_dir
ls *mol2 > ./mol2_name_list.csv
cd ..

四、Mol2文件包含分子计数

4.1 Mol2文件中分子计数

Mol2文件格式可以看出,每个分子之间都是以关键字@<TRIPOS>MOLECULE分割,文件中分子计数就是输出其数量;
grep命令简单提取该关键字,然后计数,缺点就是分子数量多的时候,屏幕会滚动输出该关键字。

grep '@<TRIPOS>MOLECULE' ./multi-mol2.mol2 | wc -l

4.2 分子计数传递变量

将数出的分子数量传递给变量mol2_num:

mol2_num=$(grep '@<TRIPOS>MOLECULE' ./multi-mol2.mol2 | wc -l)
echo "the number in multi-mol2.mol2 is: ${mol2_num} "

五、Mol2文件与其他格式文件的转换

可使用Openbabel 批量转换为sdf格式和smile:

obabel *.mol2 -osdf -O .sdf -m
obabel *.mol2 -osmi -O .smi -m

建议使用MOE等软件避免转换中原子类型等不一致。


总结

Mol2格式文件是常用的分子结构存储文件,可以在一个.Mol2文件中记录单个或多个分子的立体结构信息、电荷信息以及其他信息。
本文介绍Mol2分子处理的常见操作,包括文件合并与拆分,分子名称修改,分子计数与变量传递等。

参考资料

  1. https://bbdrug.blog.csdn.net/article/details/136274381
  2. https://download.csdn.net/download/weixin_40192882/88872977

欢迎浏览我的CSND博客! Blockbuater_drug …点击进入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python——与Matlab对应的Python版本

参考资料&#xff1a; Python——与Matlab对应的Python版本

Rust 开发的高性能 Python 包管理工具,可替换 pip、pip-tools 和 virtualenv

最近&#xff0c;我在 Python 潮流周刊 中分享了一个超级火爆的项目&#xff0c;这还不到一个月&#xff0c;它在 Github 上已经拿下了 8K star 的亮眼成绩&#xff0c;可见其受欢迎程度极高&#xff01;国内还未见有更多消息&#xff0c;我趁着周末把一篇官方博客翻译出来了&a…

请说明Vue中的解耦能力

Vue中的解耦能力是指在Vue框架中&#xff0c;我们能够有效地将代码分离成独立的组件或模块&#xff0c;使得这些组件之间的依赖关系减少&#xff0c;实现高内聚、低耦合的设计目标。利用Vue中的组件化开发&#xff0c;可以让不同的模块之间更容易地通信和协作&#xff0c;提高代…

【小白学机器学习7】相关系数R,决定系数R2和SST=SSR+SSE, 离差,偏差,方差,标准差,编译系数,标志误。

目录 1 各种数据指标&#xff0c;分类整理 1.0 关于数据/值有3种 1.1 第1类&#xff1a;描述一堆数据特征的指标&#xff1a;集中度&#xff0c;离散度&#xff0c;形状特征 1.2 第2类&#xff1a;判断预测y值和观测值差距的指标 1.3 第3类&#xff1a;描述误差的各种指标…

无线地勘答题模板

(三)无线网络配置 CII集团公司拟投入13万元(网络设备采购部分),项目要求重点覆盖楼层、走廊和办公室。平面布局如图1所示。 图1 平面布局图 1.绘制AP点位图(包括:AP型号、编号、信道等信息,其中信道采用2.4G的1、6、11三个信道进行规划)。 2.使用无线地勘软件,输出…

html标签之表格标签,程序员必看

突破困境&#xff1a; 1. 提升学历 前端找工作&#xff0c;学历重要吗&#xff1f; 重要。谁要是告诉你不重要那一定是在骗你。现实情况是大专吃紧&#xff0c;本科够用&#xff0c;硕士占优&#xff0c;大专以下找到工作靠运气和 戳这里领取完整开源项目&#xff1a;【一线大…

【力扣经典面试题】14. 最长公共前缀

目录 一、题目描述 二、解题思路 三、解题步骤 四、代码实现&#xff08;C版详细注释&#xff09; 五、总结 欢迎点赞关注哦&#xff01;创作不易&#xff0c;你的支持是我的不竭动力&#xff0c;更多精彩等你哦。 一、题目描述 编写一个函数来查找字符串数组中的最长公共前缀。…

微软研究深度报告:Sora文转视频AI模型全景剖析及未来展望

论文由微软研究团队撰写&#xff0c;这篇论文深入探讨了Sora的发展背景、核心技术、新兴应用场景、现有的局限性以及未来的发展机会&#xff0c;基于公开资料和团队自行进行的逆向工程分析。文中详尽且逻辑清晰&#xff0c;建议细读全文以获得深入了解。 原文&#xff1a;Sora…

第四节 JDBC简单示例代码

本文章教程中将演示如何创建一个简单的JDBC应用程序的示例。 这将显示如何打开数据库连接&#xff0c;执行SQL查询并显示结果。 这个示例代码中涉及所有步骤&#xff0c;一些步骤将在本教程的后续章节中进行说明。 创建JDBC应用程序 构建JDBC应用程序涉及以下六个步骤 - 导…

Java并发编程-进程和线程

一、进程和线程 1. 进程 什么是进程&#xff1f; 简单来说&#xff0c;进程就是程序的一次启动和执行。进程是操作系统中的一个概念&#xff0c;它代表正在运行的程序的实例。每个进程都有自己的内存空间、代码和数据&#xff0c;以及其他操作系统资源&#xff0c;如文件和设备…

Git分布式管理-头歌实验远程版本库

Git的一大特点就是&#xff0c;能为不同系统下的开发者提供了一个协作开发的平台。而团队如果要基于Git进行协同开发&#xff0c;就必须依赖远程版本库。远程版本库允许&#xff0c;我们将本地版本库保存在远端服务器&#xff0c;而且&#xff0c;不同的开发者也是基于远程版本…

力扣hot100:560.和为K的子数组(前缀和+哈希表)

分析&#xff1a; 这个题目乍一看&#xff0c;数据大小用暴力解法大概率会超时&#xff0c;可能想用双指针&#xff0c;但是问题出现在 可能存在负数&#xff0c;也就是说即使是找到了一个答案&#xff0c;后面也可能存在负数和正数抵消&#xff0c;又是答案&#xff0c;因此不…

SpringBoot集成Logback

logback logback-core&#xff1a;其它两个模块的基础模块。logback-classic&#xff1a;它是log4j的一个改良版本&#xff0c;同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access&#xff1a;访问模块与Servlet容器集成提供…

08-prometheus监控的告警通知-alertmanager组件工具

一、概述 prometheus通过规则文件对比抓取到的数据&#xff0c;来判断是否触发告警&#xff0c;我们通过配置告警的工具altermanager进行告警通知&#xff1b; 规则文件&#xff0c;写的就是&#xff0c;当我们获取到的PromeQL的值到达一个设置的规则后&#xff0c;触发告警&am…

刷题笔记day27-回溯算法3

39. 组合总和 var path []int var tmp []int var result [][]int// 还是需要去重复&#xff0c;题目中要求的是至少一个数字备选的数量不同。 // 所以需要剪枝操作&#xff0c;右边的要比左边的> func combinationSum(candidates []int, target int) [][]int {// 组合问题pa…

白皮书发布|超融合运行 K8s 的场景、功能与优势

目前&#xff0c;不少企业都使用虚拟化/超融合运行 Kubernetes 和容器化应用。一些用户可能会有疑惑&#xff1a;既然 Kubernetes 可以部署在裸金属上&#xff0c;使用虚拟化不是“多此一举”吗&#xff1f; 在电子书《IT 基础架构团队的 Kubernetes 管理&#xff1a;从入门到…

详细分析Vue中的$refs用法

目录 1. 基本知识2. Demo 1. 基本知识 在Vue.js中&#xff0c;$refs是一个特殊的属性&#xff0c;用于在组件内部直接访问子组件或者DOM元素 作用&#xff1a; 访问DOM元素&#xff1a; 直接访问模板中的DOM元素&#xff0c;以便执行DOM操作&#xff0c;如聚焦、改变样式等 访…

[极客大挑战 2020]Roamphp1-Welcome ---不会编程的崽

buuctf上的题难度适中。越到后边会越难&#xff0c;但也有例外 页面报错了。报错的原因可能有很多种猜想。所以有没有一种可能是故意这么设计的。先抓包吧 发现是GET请求。修改请求方法再试试呢&#xff1f; <?php error_reporting(0); if ($_SERVER[REQUEST_METHOD] ! P…

Android Studio开发(一) 构建项目

1、项目创建测试 1.1 前言 Android Studio 是由 Google 推出的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发 Android 应用程序。 基于 IntelliJ IDEA: Android Studio 是基于 JetBrains 的 IntelliJ IDEA 开发的&#xff0c;提供了丰富的功能和插件…

Python 全栈系列232 再次搭建RabbitMQ

说明 最近想重新上RabbitMQ&#xff0c;主要目的还是为了分布式任务调度。在Kafka和RabbitMQ两者犹豫了一下&#xff0c;还是觉得RabbitMQ好一些。 在20年的时候有搞过一阵子的RabbitMQ,看了下当时的几篇文章&#xff0c;觉得其实想法一直没变过。 Python - 装机系列24 消息…