openbabel 安装 & 生成指纹方法

今日踩坑小结:
openbabel 安装:
可以装,但是得在 Linux 环境下,win 环境装会报错(安装不会报错,但是生成指纹的时候会)

指纹:
在下面这个链接里,官方给出了命令行调用 openbabel 生成指纹的方法
https://open-babel.readthedocs.io/en/latest/Fingerprints/fingerprints.html
在下面这个链接里,官方给出了 pybel 生成指纹的方法
https://open-babel.readthedocs.io/en/latest/UseTheLibrary/Python_Pybel.html#fingerprints
其中,pybel 教程中指出,fp 对象有两个属性,bitsfps
fp.bits 会返回 1024 维 one-hot 向量上,值为 1 的位置。注意此处的位置是从 1 开始的

在 Linux 下:

conda install openbabel

随后可以运行下面这段代码拿到 1024 维 one-hot 指纹向量:

from openbabel import pybel


smiles = ['CCCC', 'CCCN']
mols = [pybel.readstring("smi", x) for x in smiles]
fps = [x.calcfp() for x in mols]
example_bits = fps[1].bits


def list_to_binary2(positions, binary_length=1024):
    binary_code = ['0'] * binary_length  # Initialize with all zeros

    for pos in positions:
        if 0 <= pos < binary_length:
            binary_code[pos-1] = '1'

    return ''.join(binary_code)


# start from 1
position_list = example_bits
binary_number_new = list_to_binary2(position_list)
decimal_number_new = int(binary_number_new, 2)
print(decimal_number_new)

除了 bits ,fp 还有一个属性叫 fps
该例中:

fps[1].bits = [83, 261, 349, 671, 907]

我们可以使用 numpy 将其进行转换,我们将得到一个长度为 32 的向量。
如果我们把总向量长度 1024 进行切分,可以切分成 32 块。所以此长度为 32 的向量对应 32 块中每一块的压缩值(十进制),因此将每个十进制数转换成二进制,就能复原总长 1024 对应区块的值。
比如,该例中,

fps[1].fp = [         0          0     262144          0          0          0
          0          0         16          0  268435456          0
          0          0          0          0          0          0
          0          0 1073741824          0          0          0
          0          0          0          0       1024          0
          0          0]

我们可以使用下面这段程序拿到复原后的 1024 维向量:

from openbabel import pybel
import numpy as np


smiles = ['CCCC', 'CCCN']
mols = [pybel.readstring("smi", x) for x in smiles]
fps = [x.calcfp() for x in mols]
example_bits = fps[1].fp


def list_to_binary(number_list, fixed_bits=32):
    all_code = ''
    for idx, a_num in enumerate((number_list)):
        binary_representation = format(a_num, f'0{fixed_bits}b')
        all_code = all_code + binary_representation[::-1]
    return all_code



# start from 1
position_list = np.array(example_bits)
binary_number_new = list_to_binary(position_list)
decimal_number_new = int(binary_number_new, 2)
print(decimal_number_new)

在 Linux 环境下运行上述两脚本
在这里插入图片描述
二者输出相同的十进制数,表示我们前面 bits 从1开始计数 没有问题。我们可以通过上述两种途径将 fingerprint 转换成 1024 维 one-hot 向量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值