【问题标题】:ValueError: BitVects must be same length (rdkit)ValueError:BitVects 的长度必须相同(rdkit)
【发布时间】:2021-06-07 21:24:26
【问题描述】:

我正在使用rdkit 计算 2 个摩尔之间的结构相似性概况。当我在 google colab (rdkit=2020.09.2python=3.7) 中运行该程序时,该程序运行良好。

我在 PC 上运行时遇到错误 (rdkit=2021.03.2 python=3.8.5)。错误有点奇怪。数据框包含 500 行,代码仅适用于前 10 行 (0-9),对于后面的行,我收到错误

 s = DataStructs.BulkTanimotoSimilarity(fps_2[n], fps_2[n+1:]) 
    ValueError: BitVects must be same length

代码块如下

  data = pd.read_csv(os.path.join(os.path.join(os.getcwd(), "dataset"), "test_ssp.csv"), index_col=None)
 
  
  #Proff and make a list of Smiles and id
  c_smiles = []
  count = 0
  for index, row in data.iterrows():
    try:
      cs = Chem.CanonSmiles(row['SMILES'])
      c_smiles.append([row['ID_Name'], cs])
    except:
      count = count + 1
      print('Count Invalid SMILES:', count, row['ID_Name'], row['SMILES'])

  # make a list of id, smiles, and mols
  ms = []
  df = DataFrame(c_smiles,columns=['ID_Name','SMILES'])
  for index, row in df.iterrows():
    mol = Chem.MolFromSmiles(row['SMILES'])
    ms.append([row['ID_Name'], row['SMILES'], mol])

  # make a list of id, smiles, mols, and fingerprints (fp)
  fps = []
  df_fps = DataFrame(ms,columns=['ID_Name','SMILES', 'mol'])
  df_fps.head

  for index, row in df_fps.iterrows():
    fps_cal = FingerprintMols.FingerprintMol(row['mol'])
    fps.append([row['ID_Name'], fps_cal])


  fps_2 = DataFrame(fps,columns=['ID_Name','fps'])
  fps_2 = fps_2[fps_2.columns[1]]
  fps_2 = fps_2.values.tolist()


  # compare all fp pairwise without duplicates
  for n in range(len(fps_2)): 
      s = DataStructs.BulkTanimotoSimilarity(fps_2[n], fps_2[n+1:])
      for m in range(len(s)):
          qu.append(c_smiles2[n])
          ta.append(c_smiles2[n+1:][m])
          sim.append(s[m])

您能告诉我为什么我的 PC 上出现此错误,而代码在 Google Colab 中运行良好吗?我该如何解决这个问题?有没有安装rdkit=2020.09.2

可重现的数据

DB00607 [H][C@]12SC(C)(C)[C@@H](N1C(=O)[C@H]2NC(=O)C1=C(OCC)C=CC2=CC=CC=C12)C(O)=O
DB01059 CCN1C=C(C(O)=O)C(=O)C2=CC(F)=C(C=C12)N1CCNCC1
DB09128 O=C1NC2=CC(OCCCCN3CCN(CC3)C3=C4C=CSC4=CC=C3)=CC=C2C=C1
DB04908 FC(F)(F)C1=CC(=CC=C1)N1CCN(CCN2C(=O)NC3=CC=CC=C23)CC1
DB09083 COC1=C(OC)C=C2[C@@H](CN(C)CCCN3CCC4=CC(OC)=C(OC)C=C4CC3=O)CC2=C1
DB08820 CC(C)(C)C1=CC(=C(O)C=C1NC(=O)C1=CNC2=CC=CC=C2C1=O)C(C)(C)C
DB08815 [H][C@@]12[C@H]3CC[C@H](C3)[C@]1([H])C(=O)N(C[C@@H]1CCCC[C@H]1CN1CCN(CC1)C1=NSC3=CC=CC=C13)C2=O
DB09143 [H][C@]1(C)CN(C[C@@]([H])(C)O1)C1=CC=C(NC(=O)C2=CC=CC(=C2C)C2=CC=C(OC(F)(F)F)C=C2)C=N1
DB06237 COC1=C(Cl)C=C(CNC2=C(C=NC(=N2)N2CCC[C@H]2CO)C(=O)NCC2=NC=CC=N2)C=C1
DB01166 O=C1CCC2=C(N1)C=CC(OCCCCC1=NN=NN1C1CCCCC1)=C2
DB00813 CCC(=O)N(C1CCN(CCC2=CC=CC=C2)CC1)C1=CC=CC=C1

【问题讨论】:

  • 您能否添加出现错误的位向量的形状?
  • @mnis 感谢您的评论。我已经检查了(colab 和我的电脑)中位向量的形状。他们为位向量显示了相同的 len
  • @mnis first [1:20] 位向量 2048 2048 2048 2048 2048 2048 2048 2048 2048 1024 2048 2048 2048 2048 2048 2048 2048 1024 2048 的长度。 colab 和 PC 的结果相同。但是 colab 工作正常,但 pc 显示错误

标签: python python-3.x fingerprint rdkit


【解决方案1】:

只是为了扩展 mnis 的答案,因为 FingerPrintMol 默认为 RDKFingerprint,您可能会发现直接使用它更容易,因为它更灵活,而且您不必提供所有参数。在版本 2021.03.3 上测试

Chem.RDKFingerprint(row['mol'], fpSize=2048)

【讨论】:

    【解决方案2】:

    要首先回答如何安装特定版本的 Rdkit,您可以运行以下命令:

    conda install -c rdkit rdkit=2020.09.2
    

    来到原来的问题,错误是因为函数来的:

    FingerprintMols.FingerprintMol()
    

    无论出于何种内部原因,它将前 10 个 SMILES 转换为 2048 长度向量,而将第 11 个 SMILES 转换为 1024 长度向量。旧版本能够处理这种不匹配,但新版本不能。有两种方法可以解决此问题:

    1. 使用我上面提到的命令将 RdKit 降级到旧版本。
    2. 通过将向量作为参数传递来修复向量的长度。基本上,换行
    FingerprintMols.FingerprintMol(row['mol'])
    

    FingerprintMols.FingerprintMol(row['mol'], minPath=1, maxPath=7, fpSize=2048,
                                   bitsPerHash=2, useHs=True, tgtDensity=0.0,
                                   minSize=128)
    

    在替换中,除 fpSize 之外的所有参数都设置为其默认值,fpSize 固定为 2048。请注意,您必须传递所有参数,而不仅仅是 @987654330 @。

    【讨论】:

    • 非常感谢。有效。我花了2天!现在,我想知道两件事,1)这不会改变分数(谷本分数)。对?因为,在以前,我们有不同的位向量,现在我们有相同的位向量! 2) 当我使用pip install rdkit-pypi 安装rdkit 时。无论如何使用pip 降级rdkit。我没有conda
    • 据我所知,它不会改变分数。您可以在两个不同的环境中安装这两个版本,然后进行比较以确定。要安装任何特定版本的 rdkit,您可以转到此link,然后选择您的版本。在左上角,您将看到用于安装该版本的 pip 命令。类似pip install rdkit-pypi==<version-number>
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多