0

我正在尝试将化学结构转换为 ECFP 数据。购买,我的折叠步骤有问题。

我通过 D. Rogers 和 M. Hahn 的论文(J. Chem. Inf. Model., Vol. 50, No. 5, 2010)了解了生成 ECFP 数据的所有过程

我在 python 中使用了一个小指模块来计算每个分子的 ECFP。(https://github.com/ubccr/pinky/blob/master/pinky/fingerprints/ecfp.py

该函数的输出如下

{6456320269923861509: 1,
 -3040533427843102467: 2,
 -7329542376511023568: 1,
 -5821485132112031149: 1,
 -643847807504931861: 1,
 3054809300354049582: 1,
 -3679727481768249355: 1,
 -2240115528993944325: 1,
 5159885938473603439: 1,
 1268207003089618622: 1,
 267156486644197995: 1,
 6401915128722912935: 1,
 -8944122298402911035: 1,
 -7116035920000285502: 1}

我知道它是什么以及它意味着什么。

但我不知道如何将此数据转换为二进制数据形式。

在本网站(https://docs.chemaxon.com/display/docs/extended-connectivity-fingerprint-ecfp.md)中,将上述标识符转换为定长位串(折叠过程)

如何将上述原子标识符转换为定长位串?

任何人都可以为 ECFP 方法建议一个合适的哈希函数吗?

4

1 回答 1

1

我不相信你在这里需要一个散列函数,因为你显示的字典中的键似乎已经是原子邻域的散列。我相信将其表示为固定长度的位向量就像 bit_index = hash % n_bits 一样简单:

假设您使用的是标准模块并且变量 hash_dict 是您显示的输出。

n_bits = 1024  # Number of bits in fixed-length fingerprint
fp = [0 for _ in range(n_bits)]  # The fingerprint as a python list

# I ignore the counts here for a binary output
for nbrhood_hash in hash_dict.keys():
    bit = nbrhood_hash % n_bits
    fp[bit] = 1

# Take a look at non-zero indexes
indexes = [ix for ix, bit in enumerate(fp) if bit > 0]
indexes

>>> [5, 194, 197, 251, 253, 367, 558, 560, 595, 619, 679, 702, 1003, 1013]

我相信这种方式与 RDKit 包等效(ish):

from rdkit import Chem
from rdkit.Chem import AllChem

mol = Chem.MolFromSmiles('CC(C)Oc1ccc(-c2nc(-c3cccc4c3CC[C@H]4NCCC(=O)O)no2)cc1C#N')

# Sparse ECFP
fp_sparse = AllChem.GetMorganFingerprint(mol, 2)

# BitVector ECFP (fixed length)
fp_bitvect = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=n_bits)

# Convert hashes from sparse fingerprint into fixed-length indicies
bit_set = set()
for nbrhood_hash in fp_sparse.GetNonzeroElements().keys():
    bit = nbrhood_hash % n_bits  # Same as before
    bit_set.add(bit)

# Check these are equivalent to the rdkit fixed-length fingerprint
set(fp_bitvect.GetOnBits()) == bit_set

>>> True
于 2021-01-18T13:04:39.497 回答