イオンの部分電荷を計算するとき、各原子の値を足した総和も、そのイオンの電荷に合わせたい。chematic v1.1.3では、この条件を組み込んだEEM部分電荷計算を実装しました。OH⁻では総和が−1、NH₄⁺では+1になります。

同じ原子配置でRDKit 2026.09.1のCalcEEMchargesを実行すると、この2例では総和の符号が逆になります。RDKit側でもissue #9688として報告されている問題です。ここでは公開npm版のchematic v1.1.3と、公開Python版のRDKit 2026.09.1を比べました。

同じ座標で、電荷の総和を比べる

OH⁻はOとHを0.97 Å離して配置しました。NH₄⁺はNを中心に、N–H結合長が1.01 Åになる正四面体の座標を使っています。両ライブラリに同じ原子の並びと座標を渡した結果です。

ion      formal charge  chematic 1.1.3  RDKit 2026.09.1
OH-      -1             -1.000000       1.000000
NH4+      1              1.000000      -1.000000

表の計算値は、全原子のEEM部分電荷を足したものです。電荷は素電荷を単位とした値で、総和が−1なら分子全体で負の電荷を1つ持ちます。比較データには、座標と原子ごとの値も保存しています。

総電荷を、計算の制約として解く

EEM(電気陰性度均等化法)は、元素ごとのパラメーターと原子間距離から部分電荷を求める方法です。chematicの実装には、NEEMPで公開されたモデルのパラメーターを使っています。

v1.1.3では、sum(q_i) = Qという条件を連立方程式へ組み込みました。q_iは各原子の部分電荷、Qは分子の形式電荷の総和です。行と列の対応を明示して、この条件と原子ごとの電荷を同時に解きます。イオンについても、入力した総電荷に沿った結果をそのまま受け取れます。

Rustの実装とPythonの回帰テストでは、OH⁻とNH₄⁺の総和がそれぞれの形式電荷になることを確認しています。

公開npm版で計算する

Node.jsを使える環境で、空の作業フォルダーにv113-eem.mjsを保存し、次を実行します。

npm init -y
npm install --save-exact @kent-tokyo/chematic@1.1.3
node v113-eem.mjs
[OH-] -1.000000
[NH4+] 1.000000

スクリプトは水素を明示した分子を作り、Å単位の座標を原子順に渡します。計算を呼び出すAPIはeem_charges_json(mol, coordsJson)です。返るcharges配列も同じ原子順なので、原子番号と結び付けて表や構造図に使えます。

OH⁻の原子ごとの値は、Oが約−1.063214、Hが約+0.063214です。部分電荷はモデルが各原子へ割り振る実数で、この2値の総和が−1になります。電荷による原子の色付けや分子特徴量の計算へ渡す際にも、イオン全体の電荷との対応を保てます。

比較は2026年10月13日にmacOS arm64上で実行しました。RDKit側の再現スクリプトと、配布物・実行環境・ファイルのハッシュを記録した実行記録も用意しています。