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

news2024/11/27 0:34:05

欢迎浏览我的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_dir

import sys
import os


def split_multimol2(multimol2):
    """
    Splits a multi-mol2 file.

    Parameters
    ----------
    multimol2 : str
      Path to the multi-mol2 file.

    Returns
    ----------
    A generator object for lists for every extracted mol2-file. Lists contain
      the 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)
                        break
                mol2cont[-1] = mol2cont[-1].rstrip() # removes blank line at file end
                yield [molecule_id, "".join(mol2cont)]


def write_multimol2(multimol2, out_dir):
    """
    Splits a multi-mol2 file into smaller multi-mol2 files.

    Parameters
    -----------
    multimol2 : str
      Path to the multi-mol2 file.

    out_dir : str:
      Output directory. New files will be named
      <molecule_name_1>.mol2, ... <molecule_name_n>.mol2

    Returns
    -----------
    chunks : int
      Number 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 : str
      Path to the multi-mol2 file.

    chunksize : int
      Number of mol2 files per chunk.

    out_dir : str:
      Output directory. New files will be named
      <multimol2>_1.mol2, ... <multimol2>_n.mol2

    Returns
    -----------
    chunks : int
      Number 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 = 0
    chunks = 1
    out_file = open(os.path.join(out_dir, out_file_stem)+'_%d.mol2' % chunks, 'w')
    for mol2 in split_multimol2(multimol2):
        cnt += 1
        if cnt == chunk_size:
            cnt = 0
            chunks += 1
            out_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 chunks


if __name__ == '__main__':

    import argparse

    parser = 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.coloradmin.cn/o/1492832.html

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

相关文章

容器化软件应用简化传统设备的连接

| Docker容器如何简化工业物联网解决方案 制造和包装工厂可通过集成IT和OT技术来改善运营&#xff0c;从而释放预测性维护、数据分析以及接入强大的企业管理应用等优势。然而&#xff0c;对于缺乏员工、时间或资源的企业而言&#xff0c;实施工业物联网解决方案并不容易。对此…

Nircmd集成定时执行专家之后的使用场景

Nircmd工具拥有了定时执行功能之后&#xff0c;可以用于以下场景&#xff1a; 1. 自动化日常工作 定时清理系统垃圾文件定时备份重要文件定时关闭或重启电脑定时发送邮件或短信定时执行其他程序或脚本 2. 监控系统状态 定时检查系统温度定时检查磁盘空间定时检查网络连接定时…

浏览器工作原理与Javascript高级(异步)

总体介绍 浏览器运行是多进程的&#xff0c;包括主进程、渲染进行、网络进程和GPU进程等等 解析HTML时(渲染进程)用到两大引擎&#xff0c;一个是渲染引擎&#xff08;用于渲染页面&#xff09;、一个是JS引擎用于解析JS代码。又JS引擎运行是单线程的&#xff0c;所以渲染和 …

【LeetCode:98. 验证二叉搜索树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

消息队列-kafka-服务端处理架构(架构,Topic文件结构,服务端数据的一致性)

服务端处理架构 资料来源于网络 网络线程池&#xff1a; 接受请求&#xff0c;num.network.threads&#xff0c;默认为 3&#xff0c;专门处理客户的发送的请求。 IO 线程池&#xff1a; num.io.threads&#xff0c;默认为 8&#xff0c;专门处理业务请求。也就是它不负责发…

CSS盒模型居中方法,web开发问题

CSS 篇 link 与 import 的区别 link 是 HTML 方式&#xff0c; import 是CSS方式link 最大限度支持并行下载&#xff0c; import 过多嵌套导致串行下载&#xff0c;出现 FOUC (文档样式短暂失效)link 可以通过 rel"alternate stylesheet" 指定候选样式浏览器对 lin…

数据结构学习(四)高级数据结构

高级数据结构 1. 概念 之所以称它们为高级的数据结构&#xff0c;是因为它们的实现要比那些常用的数据结构要复杂很多&#xff0c;能够让我们在处理复杂问题的过程中&#xff0c; 多拥有一把利器&#xff0c;同时掌握好它们的性质&#xff0c;以及所适应的场合&#xff0c;在…

第十篇:如何利用人工智能技术做好营销流量整形管理?(Traffic Shaping)- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市​​​​​​​。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先…

基于springboot+vue实现食品安全管理系统项目【项目源码+论文说明】

基于springboot实现食品安全管理系统演示 摘要 食品行业同其他行业有很多的差别&#xff0c;食品行业不仅要管食品的生产和销售&#xff0c;还要管食品的库存和保质期&#xff0c;那么对于食品管理者来说&#xff0c;就存在着一定的难度。况且食品的种类复杂&#xff0c;存储条…

ZWT_各向同性线弹性材料本构模型umat的应用

线弹性材料本构模型 对于多数材料而言&#xff0c;在微小变形的假设下&#xff0c;会满足线弹性理论&#xff0c;数学可以表示为&#xff1a; σ i j C i j k l ε k l E 1 ν ( ε i j ν 1 − 2 ν ε k k δ i j ) \begin{align*} \sigma_{ij}&C_{ijkl}\varepsilon…

风丘道路载荷数据采集(RLDA)测试方案

一 背景 整车厂在汽车上市前&#xff0c;了解产品所能承受的载荷是非常重要的&#xff0c;因此需进行道路载荷数据采集&#xff08;RLDA&#xff09;测试。通过获得车辆在实际试验场或公路道路中行驶的载荷信息来为整车台架道路模拟试验提供目标信号输入&#xff0c;以及为用于…

android高级面试题及答案,已拿offer

一、java相关 java基础 1、java 中和 equals 和 hashCode 的区别 2、int、char、long 各占多少字节数 3、int 与 integer 的区别 4、谈谈对 java 多态的理解 5、String、StringBuffer、StringBuilder 区别 6、什么是内部类&#xff1f;内部类的作用 7、抽象类和接口区别 java高…

无人机生态环境监测、图像处理与GIS数据分析

构建“天空地”一体化监测体系是新形势下生态、环境、水文、农业、林业、气象等资源环境领域的重大需求&#xff0c;无人机生态环境监测在一体化监测体系中扮演着极其重要的角色。通过无人机航空遥感技术可以实现对地表空间要素的立体观测&#xff0c;获取丰富多样的地理空间数…

将ppt里的视频导出来

将ppt的后缀从pptx改为zip 找到【media】里面有存放图片和音频以及视频&#xff0c;看文件名后缀可以找到&#xff0c;mp4的即为视频&#xff0c;直接复制粘贴到桌面即可。 关闭压缩软件把ppt后缀改回&#xff0c;不影响ppt正常使用。

【Redis】Redis持久化模式RDB

目录 引子 RDB RDB的优缺点 小节一下 引子 不论把Redis作为数据库还是缓存来使用&#xff0c;他肯定有数据需要持久化&#xff0c;这里我们就来聊聊两种持久化机制。这两种机制&#xff0c;其实是 快照 与 日志 的形式。快照:就是当前数据的备份&#xff0c;我可以拷贝到磁…

Docker入门——安装部署(openEuler)、镜像加速

安装 1&#xff09;依赖的基础环境 64 位CPU Linux kernel(内核) 3.10 Linux kernel cgroups and namespaces 我用的是openEuler&#xff0c;所以直接yum安装(推荐&#xff0c;因为二进制安装&#xff0c;docker命令中补全操作要另外安装软件) [rootlocalhost ~]# yum -y…

WordPress 从入门到精通【设置 WordPress】

前言&#xff1a;为方便演示&#xff0c;前几张图使用 Playground 环境截取 如果你还不会部署WordPress&#xff0c;请看下面的链接并使用雨云可视化构建一个WordPress站点&#xff1a; 超简单EP面板搭建WordPress网站教程 - 风屿岛 10 (biliwind.com) 进入仪表盘 在搭建完…

华为Web举例:私网用户通过三元组NAT访问Internet

Web举例&#xff1a;私网用户通过三元组NAT访问Internet 介绍私网用户通过三元组NAT访问Internet的配置举例。 组网需求 某公司在网络边界处部署了FW作为安全网关。为了使私网中10.1.1.0/24网段的用户可以正常访问Internet&#xff0c;需要在FW上配置源NAT策略。除了公网接口…

flutter旋转动画,算法题+JVM+自定义View

在很多的博客或者书上&#xff0c;说有三种&#xff0c;除了上述的两种以外&#xff0c;还有一种是实现Callable接口。但是这种并不是&#xff0c;因为&#xff0c;我们检查JDK中Thread的源码&#xff0c;看它的注释&#xff1a; There are two ways to create a new thread o…

人工智能艺术的简要时间表

一、简述 技术在任何形式的艺术发展中始终发挥着关键作用。从通过化学发明颜色到通过数学发现分形&#xff1a;艺术、文化和技术是无法完全分开的三个维度。 计算机也不例外&#xff0c;它们从一开始就被用来帮助艺术家&#xff0c;常常揭示出我们无法看到的美丽的复杂性。数字…