openbabel 将 CML 文件转换为图像的替代方法是什么?

计算科学 软件 计算化学
2021-11-29 01:04:31

我最近开始使用NBO6进行自然共振理论 (NRT) 分析。该程序可能会自动创建具有处理过的结构的化学标记语言 ( cml ) 文件。不幸的是,我的 cml 说得不够好,无法判断生成的文件是否好。

我想做的是将这个生成的文件转换成图像。这意味着,包含的 3D 坐标必须被展平为 2D。我认为问题出在这一步,因为我报告了错误的结构。

作为测试分子,我选择了乙酸,我总共包括三个共振结构(当我使用更多时会变得更糟)。第一个和主要贡献者显示得很好。第二个缺少正式指控。这些在 cml 文件中没有明确给出,因此需要计算它们。Openbabel 当然可以做到这一点,但由于某种原因,它在这里不起作用。第三个结构完全被撕裂了。原子应该与第一张和第二张图像中的位置相同。

我正在使用带有以下命令(最后为 test.cml)的自编译本地版本的 openbabel(2.3.2):

  ~/local/tools/openbabel-install/bin/babel -icml test.cml -opng test.png

我得到以下图像:

openbabel 输出

连同错误消息:

==============================
*** Open Babel Error  in DoHCounts
  In atom a1 the number of explicit hydrogens exceeds the hydrogenCount attribute.
==============================
*** Open Babel Error  in DoHCounts
  In atom a1 the number of explicit hydrogens exceeds the hydrogenCount attribute.
==============================
*** Open Babel Error  in DoHCounts
  In atom a1 the number of explicit hydrogens exceeds the hydrogenCount attribute.
3 molecules converted
3 errors 109 audit log messages

我不知道如何访问这些审计日志消息(/var/log/messages: Permission denied)以及它们是否有任何帮助。
但是,错误消息似乎已经表明生成的 cml 文件有问题。

<?xml version="1.0"?>
<cml title="Resonance forms from NRT analysis">
 <molecule id="1" title="Wgt=64.49%">
  <atomArray>
   <atom id="a1" elementType="C" hydrogenCount="0" x3="-1.40" y3="-0.11" z3="0.00" lonePair="0"/>
   <atom id="a2" elementType="H" hydrogenCount="0" x3="-1.93" y3="0.86" z3="0.00" lonePair="0"/>
   <atom id="a3" elementType="H" hydrogenCount="0" x3="-1.70" y3="-0.70" z3="0.89" lonePair="0"/>
   <atom id="a4" elementType="H" hydrogenCount="0" x3="-1.70" y3="-0.70" z3="-0.89" lonePair="0"/>
   <atom id="a5" elementType="C" hydrogenCount="0" x3="0.09" y3="0.13" z3="-0.00" lonePair="0"/>
   <atom id="a6" elementType="O" hydrogenCount="0" x3="0.78" y3="-1.05" z3="0.00" lonePair="2"/>
   <atom id="a7" elementType="O" hydrogenCount="0" x3="0.65" y3="1.21" z3="0.00" lonePair="2"/>
   <atom id="a8" elementType="H" hydrogenCount="0" x3="1.73" y3="-0.80" z3="0.00" lonePair="0"/>
  </atomArray>
  <bondArray>
   <bond atomRefs2="a1 a2" order="1"/>
   <bond atomRefs2="a1 a3" order="1"/>
   <bond atomRefs2="a1 a4" order="1"/>
   <bond atomRefs2="a1 a5" order="1"/>
   <bond atomRefs2="a5 a6" order="1"/>
   <bond atomRefs2="a5 a7" order="2"/>
   <bond atomRefs2="a6 a8" order="1"/>
  </bondArray>
 </molecule>
 <molecule id="2" title="Wgt=23.43%">
  <atomArray>
   <atom id="a1" elementType="C" hydrogenCount="0" x3="-1.40" y3="-0.11" z3="0.00" lonePair="0"/>
   <atom id="a2" elementType="H" hydrogenCount="0" x3="-1.93" y3="0.86" z3="0.00" lonePair="0"/>
   <atom id="a3" elementType="H" hydrogenCount="0" x3="-1.70" y3="-0.70" z3="0.89" lonePair="0"/>
   <atom id="a4" elementType="H" hydrogenCount="0" x3="-1.70" y3="-0.70" z3="-0.89" lonePair="0"/>
   <atom id="a5" elementType="C" hydrogenCount="0" x3="0.09" y3="0.13" z3="-0.00" lonePair="0"/>
   <atom id="a6" elementType="O" hydrogenCount="0" x3="0.78" y3="-1.05" z3="0.00" lonePair="1"/>
   <atom id="a7" elementType="O" hydrogenCount="0" x3="0.65" y3="1.21" z3="0.00" lonePair="3"/>
   <atom id="a8" elementType="H" hydrogenCount="0" x3="1.73" y3="-0.80" z3="0.00" lonePair="0"/>
  </atomArray>
  <bondArray>
   <bond atomRefs2="a1 a2" order="1"/>
   <bond atomRefs2="a1 a3" order="1"/>
   <bond atomRefs2="a1 a4" order="1"/>
   <bond atomRefs2="a1 a5" order="1"/>
   <bond atomRefs2="a5 a6" order="2"/>
   <bond atomRefs2="a5 a7" order="1"/>
   <bond atomRefs2="a6 a8" order="1"/>
  </bondArray>
 </molecule>
 <molecule id="3" title="Wgt=4.20%">
  <atomArray>
   <atom id="a1" elementType="C" hydrogenCount="0" x3="-1.40" y3="-0.11" z3="0.00" lonePair="0"/>
   <atom id="a2" elementType="H" hydrogenCount="0" x3="-1.93" y3="0.86" z3="0.00" lonePair="0"/>
   <atom id="a3" elementType="H" hydrogenCount="0" x3="-1.70" y3="-0.70" z3="0.89" lonePair="0"/>
   <atom id="a4" elementType="H" hydrogenCount="0" x3="-1.70" y3="-0.70" z3="-0.89" lonePair="0"/>
   <atom id="a5" elementType="C" hydrogenCount="0" x3="0.09" y3="0.13" z3="-0.00" lonePair="0"/>
   <atom id="a6" elementType="O" hydrogenCount="0" x3="0.78" y3="-1.05" z3="0.00" lonePair="3"/>
   <atom id="a7" elementType="O" hydrogenCount="0" x3="0.65" y3="1.21" z3="0.00" lonePair="1"/>
   <atom id="a8" elementType="H" hydrogenCount="0" x3="1.73" y3="-0.80" z3="0.00" lonePair="0"/>
  </atomArray>
  <bondArray>
   <bond atomRefs2="a1 a2" order="1"/>
   <bond atomRefs2="a1 a3" order="1"/>
   <bond atomRefs2="a1 a4" order="1"/>
   <bond atomRefs2="a1 a5" order="1"/>
   <bond atomRefs2="a5 a7" order="3"/>
   <bond atomRefs2="a6 a8" order="1"/>
  </bondArray>
 </molecule>
</cml>

如果您查看坐标信息,您会发现它们是相同的。键阵列只是随着孤对的变化而变化。上述错误的来源也很明显。每个条目都有hydrogenCount="0",这可能是正确的,因为有明确的氢。但我不确定。我发现了一个引用此属性的开放错误报告。

现在我似乎找不到这种行为的原因,我需要找到替代方法。目前对我来说唯一可行且可靠的方法是手动解释 NRT 的输出。

因此,我有几个问题:

  • 生成的 cml 文件是否正确?它是否包含错误,因此问题不在于 openbabel?
  • 如果文件是正确的,是否有 openbabel 的替代品,可以正确处理它并且能够将其转换为 2D 图像(结构表示)?(我更喜欢命令行工具。)

输出应该类似于这个手动创建的图像:

(有点)正确/预期的输出

我已经尝试过其他程序,到目前为止运气不佳。
Chemdraw可以读取 cml 文件并生成具有正确键的结构,并且原子位于正确的位置。然而,电荷缺失,所有分子都在同一位置,因此很难获得良好的图像。它也无法阅读标题声明。
JChemPaint虽然在技术上能够读取 cml,但无法读取此文件。我可以将其定位到第三个结构,它会产生错误并中止。如果只包括前两个,它也无法产生费用。
ChemSketch无法读取 cml 格式。

0个回答
没有发现任何回复~