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_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.mfbz.cn/a/432166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch学习 day03(Tensorboard、Transforms)

Tensorboard Tensorboard能够可视化loss的变化过程&#xff0c;便于我们查看模型的训练状态&#xff0c;也能查看模型当前的输入和输出结果 在Pycharm中&#xff0c;可以通过按住ctrl&#xff0c;并左键点击某个库来进入源文件查看该库的使用方法SummaryWriter是用来向log_dir…

工具函数模板题(蓝桥杯 C++ 代码 注解)

目录 一、Vector容器&#xff1a; 二、Queue队列 三、Map映射 四、题目&#xff08;快递分拣 vector&#xff09;&#xff1a; 代码&#xff1a; 五、题目&#xff08;CLZ银行问题 queue&#xff09;&#xff1a; 代码&#xff1a; 六、题目&#xff08;费里的语言 map&…

通过 JS 获取和修改表单元素属性和样式属性

JS 获取和修改表单元素属性 表单(主要是指 input 标签)的以下属性都可以通过 DOM API来修改 value: input 的值checked: 复选框会使用selected: 下拉框会使用disabled: 禁用type: input 的类型(文本, 密码, 按钮, 文件等) 修改 input 的值 > value 示例1: 点击切换状态的…

【CSP试题回顾】202212-2-训练计划

CSP-202212-2-训练计划 解题思路 输入和初始化&#xff1a; 首先&#xff0c;代码从输入中获取项目的截止日期和项目数量。然后&#xff0c;它初始化一个项目列表&#xff0c;每个项目都有其依赖项、被依赖的项目集合、完成时间、总完成时间&#xff08;包括依赖链&#xff09…

深度学习模型部署(番外3)神经网络不同层的量化方法

神经网络层量化 批归一化层Batch Normalization(BN层) 关于归一化的原理可以看之前的这篇blog&#xff1a;BatchNorm原理与应用 批归一化在推理过程中会被融合到上一层或者下一层中&#xff0c;这种处理方式被称为批归一化折叠。这样可以减少量化&#xff0c;也可以减少属于的…

EPSON RA8000CE (RTC模块)压电侠

RA8000CE是一个集成了32.768 kHz数字温度补偿晶体振荡器(DTCXO)的RTC模块。它包括各种功能&#xff0c;如具有闰年校正的秒到年时钟/日历&#xff0c;时间警报&#xff0c;唤醒计时器&#xff0c;时间更新中断&#xff0c;时钟输出和时间戳功能&#xff0c;可以在外部或内部事件…

python 蓝桥杯填空题

文章目录 字母数判断列名&#xff08;进制问题&#xff09;特殊日期 字母数 由于是填空题&#xff0c;那么寻找的话&#xff0c;就直接让每一个位置都是A,通过计算看看是不是结果大于2022即可 判断列名&#xff08;进制问题&#xff09; 这道题目&#xff0c;我们可以往数字进制…

基于“xxx” Androidx平台的驱动及系统开发 之 触摸板篇

目录 一、基于全志 A133 Android10平台&#xff0c;适配1366x768 - ilitek2511触摸1、原理图分析2、驱动移植与适配3、补丁和资源文件 二、基于瑞芯微 RK3566 Android11平台&#xff0c;适配GT9XX触摸1、原理图分析2、补丁及资源文件 三、遇到的问题与解决1、基于amlogic Andro…

Pytorch学习07_torchvision中数据集的使用

torchvision torchvision 是 PyTorch 生态系统中的一个用于计算机视觉任务的包&#xff0c;它提供了一系列用于图像和视频处理的工具和数据集。torchvision 可以帮助你加载、预处理、增强和可视化图像数据&#xff0c;并提供了一些经典的计算机视觉模型和预训练权重&#xff0…

计算机网络——24路由器组成

路由器组成 路由器的结构概况 高层面(非常简化的)通用路由器体系架构 路由&#xff1a;运行路由选择算法&#xff0f;协议 (RIP, OSPF, BGP) - 生成 路由表转发&#xff1a;从输入到输出链路交换数据报 - 根据路由表进行分组的转发 输入端口功能 分布式交换&#xff1a; 根…

SkyWalking链路追踪上下文TraceContext的traceId生成的实现原理剖析

结论先行 【结论】 SkyWalking通过字节码增强技术实现&#xff0c;结合依赖注入和控制反转思想&#xff0c;以SkyWalking方式将追踪身份traceId编织到链路追踪上下文TraceContext中。 是不是很有趣&#xff0c;很有意思&#xff01;&#xff01;&#xff01; 【收获】 skywal…

什么是jwt

jwt是JSON Web Token&#xff0c;由3部分构成&#xff1a; 头部Header&#xff1a;头部包含了两部分&#xff0c;token 类型和采用的加密算法&#xff08;可为none&#xff0c;后端应限制加密算法&#xff0c;不以这里为准&#xff09;。 载荷Payload&#xff1a;这部分才是重要…

Linux网络隧道协议IPIP认知(基于Linux network namespace 的 IPIP 隧道通信)

写在前面 博文内容为 Linux 隧道通信 IPIP认知内容涉及&#xff1a;ipip 介绍&#xff0c;一个 ipip 通信 Demo 以及数据帧流转分析理解不足小伙伴帮忙指正 某些人和事&#xff0c;哪怕没有缘分&#xff0c;是路边的风景&#xff0c;可是只要看一眼&#xff0c;依然会让人觉得…

空间直角坐标系、大地坐标系、平面坐标系介绍

空间直角坐标系、大地坐标系、平面坐标系 2017-04-11 13:53 ( 一)空间直角坐标系 空间直角坐标系的坐标原点位于参考椭球的中心,Z轴指向参考椭球的北极,X轴指向起始子午面与赤道的交点,Y轴位于赤道面上切按右手系于X轴呈90度夹角,某点中的坐标可用该点在此坐标系的各…

九型人格测试,3号成就型人格的职业分析

成就型人格&#xff08;也叫3号人格&#xff09;&#xff0c;在九型人格中&#xff0c;是一种喜欢争强好胜的人格&#xff08;这跟和平型人格具有强烈的对比性&#xff09;。这种人格的人&#xff0c;对于一切给自己带来成就感的事情会表现得非常上心&#xff0c;不会有丝毫地疏…

【鸿蒙 HarmonyOS 4.0】多设备响应式布局

一、背景 在渲染页面时&#xff0c;需要根据不同屏幕大小渲染出不同的效果&#xff0c;动态的判断设备屏幕大小&#xff0c;便需要采用多设备响应式布局。这种设计方法能够动态适配各种屏幕大小&#xff0c;确保网站在不同设备上都能呈现出最佳的效果。 二、媒体查询&#xf…

EMO在哪体验?阿里对口型视频生成工具EMO下载地址?阿里巴巴新模型EMO的技术原理

这几天&#xff0c;阿里的对口型视频生成工具EMO火了。根据官方宣传&#xff0c;EMO只需要上传一张图片和一段音频就可以一键生成对口型视频&#xff0c;而且视频中的嘴型还可以与声音匹配。这项技术支持多语言、对话、唱歌以及快速语速的适配&#xff0c;但也可能成为制造虚假…

[两个栈实现队列]

[两个栈实现队列] 一、题目二、思路三、代码 一、题目 二、思路 //思路:两个栈实现队列&#xff0c;栈是先入后出&#xff0c;队列是队尾入&#xff0c;对头出&#xff0c;&#xff08;先入先出&#xff09;&#xff0c;那么可以这样干&#xff0c;假设一个栈Pushst&#xff0c…

C++ Python网易云音乐播放器

程序示例精选 网易云音乐播放器 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《网易云音乐播放器》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。…

Javaweb之SpringBootWeb案例之自动配置案例的自定义starter实现的详细解析

3.2.4.2 自定义starter实现 自定义starter的步骤我们刚才已经分析了&#xff0c;接下来我们就按照分析的步骤来完成自定义starter的开发。 首先我们先来创建两个Maven模块&#xff1a; 1). aliyun-oss-spring-boot-starter模块 创建完starter模块后&#xff0c;删除多余的文件…