rdkit-users-jp WEB pages
2022年10月21日に RDKit 2022.09.1 がリリースされました。この記事では新バージョンのリリースノートの抄訳と新機能のコード例を紹介します。より詳細な情報を知りたい方はリリースノートの原文 (2022_09_1 (Q3 2022) Release) をご確認ください。
RegistrationHash
モジュールが追加されました。GetBestRMS()
と CalcRMS()
は終端のカルボキシラートアニオンやニトロ基などの共役官能基を対称に取り扱うのがデフォルトになりました。例えば C(=[O:1])[O-:2]
はどちらの方向にもマッチします。この変更で影響される官能基を表すSMARTSパターンは[{atomP};$([{atomP}]-[*]=[{atomP}]),$([{atomP}]=[*]-[{atomP}])]~[*]
です({atomP}
は O,N;D1
)。以前の挙動を再現するにはGetBestRMS()
や CalcRMS()
を呼び出す際の引数でsymmetrizeConjugatedTerminalGroups
をfalseに設定してください。RDConfig.h
で今後提供・使用されません
BUILD_COORDGEN_SUPPORT
: 代わりに RDK_BUILD_COORDGEN_SUPPORT
を使用してくださいRDK_THREADSAFE_SSS
: 代わりに RDK_BUILD_THREADSAFE_SSS
を使用してくださいUSE_BUILTIN_POPCOUNT
: 代わりに RDK_OPTIMIZE_POPCNT
を使用してくださいChem.GetSSSR()
は環の個数ではなく見つかったSSSR (訳注: smallest set of smallest rings) 環を返すようになりました。この挙動は Chem.GetSymmSSSR()
と一貫性があり、より便利です。SmilesParserParams.useLegacyStereo
の値を無視するようになりました( false
に設定されている場合を除く)。詳細は useLegacyStereo
の非推奨に関する下の記述をご覧ください。set_2d_coords_aligned()
が追加のパラメータ char **match_json
を取るようになりました。match_json
が NULL
ではない場合、*match_json
はマッチ部分の原子と結合を含むJSON文字列を指します。この文字列のメモリ解放はユーザーが行う必要があります。(訳注: 省略します。ご興味のある方は原文をご確認ください。)
RDLog::BlockLogs
は削除されました。クラス RDLog::LogStateSetter
を使用してください。 Python クラス rdBase.BlockLogs()
は現在もサポートされており使用可能です。rdkit.Chem.WrapLogs()
は削除されました。rdkit.rdBase.LogToPythonStderr()
を使用してください。rdkit.rdBase.WrapLogs()
も存在しますが、標準エラー出力へ同時に出力する古い挙動が必要な場合を除いて前者が好ましいです。rdkit.Chem.LogWarningMsg()
は削除されました。rdkit.rdBase.LogWarningMsg()
を使用してください。rdkit.Chem.LogErrorMsg()
は削除されました。rdkit.rdBase.LogErrorMsg()
を使用してください。SmilesParserParams
の useLegacyStereo
オプションは非推奨となり、2023.03 のリリースで削除されます。代わりに SetUseLegacyStereoPerception()
を使用してください。次のリリースまでの間、SMILES パーサーが SmilesParserParams.useLegacyStereo
の値を使用するのは その値が false
に設定されている場合だけです。それ以外の場合はグローバルパラメータ useLegacyStereoPerception
の値が SMILES パーサーの挙動を指定します。PandasTools
内の PrintAsBase64PNGString
関数は非推奨となり、PNGとSVGの両方をサポートすることを示すより適切な名前である PrintAsImageString
に置き換えられました。ここでは新機能の詳細を紹介します。
xyz2molはXYZ形式のファイルをRDKitのmoleculeオブジェクトとして読み込む機能です。この機能は (Kim, 2015) で提案された手法の Jan Jensen氏による実装 を取り込んだものになります(Pull Request)。コードやドキュメントは Code/GraphMol/DetermineBonds にあります。
Pythonでxyz2molを使う例を以下に示します。コード中の test10.xyz
は test_data/connectivity からダウンロードしたものです。ドキュメントが見当たらなかったため、テストコードを参考にしました。
from rdkit import Chem
from rdkit.Chem import rdDetermineBonds
# XYZファイルの読み込み
# XYZを読み込んだ時点では結合が存在しません
mol = Chem.MolFromXYZFile("test10.xyz")
print(Chem.MolToSmiles(mol))
# 'C.C.C.C.N.[HH].[HH].[HH].[HH].[HH].[HH].[HH].[HH].[HH]'
# 結合の予測
rdDetermineBonds.DetermineBonds(mol)
print(Chem.MolToSmiles(mol))
# [H]C([H])=C(N([H])[H])C([H])([H])C([H])([H])[H]
# 結合の有無のみ予測
rdDetermineBonds.DetermineConnectivity(mol)
print(Chem.MolToSmiles(mol))
# [H]C([H])C(N([H])[H])C([H])([H])C([H])([H])[H]
# 結合次数の予測
rdDetermineBonds.DetermineBondOrders(mol)
print(Chem.MolToSmiles(mol))
# [H]C([H])=C(N([H])[H])C([H])([H])C([H])([H])[H]
なお、執筆時点 (2022/10/30) では筆者の環境でRDKitをPyPI経由でインストールするとrdDetermineBonds
のインポートに失敗したため、このコードはAnacondaでインストールしたRDKitで検証しました。
DetermineBonds.h のコメントの翻訳です。
DetermineBonds()
は現在の結合を破棄し、原子座標を元に原子間結合を割り当てる関数です。embedChiral
を True
に設定しないでこの関数を呼び出した場合には分子をサニタイズすることが推奨されます。以下の引数があります。以下の引数があります。
mol
(RWMol): 対象となる分子。3次元構造を持つ必要があるuseHueckel
(bool, optional): True
にすると結合予測にファン・デル・ワールス法ではなく拡張ヒュッケル法が用いられる。デフォルトは False
charge
(int, optional): 分子の電荷。電荷が非ゼロのときに指定する必要がある。デフォルトは 0
covFactor
(double, optional): ファン・デル・ワールス法を用いる場合に各共有結合半径に掛けられる係数。デフォルトは 1.3
allowChargedFragments
(bool, optional): True
にすると原子価に応じた形式電荷が原子に置かれます。False
にすると原子にラジカル電荷が置かれます。デフォルトは True
embedChiral
(bool, optional): True
にすると分子にキラリティの情報が埋め込まれます。この引数がTrue
の場合、この関数は sanitizeMol()
を呼び出します。デフォルトは True
useAtomMap
(bool, optional): True
にすると分子の原子マップが生成されます。デフォルトは False
DetermineConnectivity()
は現在の結合を破棄し、原子座標を元に原子間結合を割り当てる関数です。結合次数の予測を行わない点が DetermineBonds()
と異なります。以下の引数があります。
mol
(RWMol): 対象となる分子。3次元構造を持つ必要があるuseHueckel
(bool, optional): True
にすると結合予測にファン・デル・ワールス法ではなく拡張ヒュッケル法が用いられる。デフォルトは False
charge
(int, optional): 分子の電荷。ヒュッケル法を使用する場合で電荷が非ゼロのときに指定する必要がある。デフォルトは 0
covFactor
(double, optional): ファン・デル・ワールス法を用いる場合に各共有結合半径に掛けられる係数。デフォルトは 1.3
DetermineBondOrders()
は原子間結合が定義された分子に結合次数を割り当てる関数です。embedChiral
を True
に設定しないでこの関数を呼び出した場合には分子をサニタイズすることが推奨されます。以下の引数があります。
mol
(RWMol): 対象となる分子。原子間結合に対応する単結合を持つ必要があるcharge
(int, optional): 分子の電荷。電荷が非ゼロのときに指定する必要がある。デフォルトは 0
allowChargedFragments
(bool, optional): True
にすると原子価に応じた形式電荷が原子に置かれます。False
にすると原子にラジカル電荷が置かれます。デフォルトは True
embedChiral
(bool, optional): True
にすると分子にキラリティの情報が埋め込まれます。この引数がTrue
の場合、この関数は sanitizeMol()
を呼び出します。デフォルトは True
useAtomMap
(bool, optional): True
にすると分子の原子マップが生成されます。デフォルトは False
RegistrationHash は Schrödinger 社が分子の重複を防ぐために使っている関数をオープンソース化したものです。UGM 2022でのLightning talk で概要が説明されています。
ドキュメントによると、SMILESに比べて以下の点が優れているそうです。
C[C@H](O)CC |&1:1|
と C[C@@H](O)CC |&1:1|
が同じハッシュ値になる)基本的な使い方は以下の通りです。
from rdkit import Chem
from rdkit.Chem import RegistrationHash
mol = Chem.MolFromSmiles('CNCC(=O)OC')
scheme = RegistrationHash.HashScheme.ALL_LAYERS
hash = RegistrationHash.GetMolHash(RegistrationHash.GetMolLayers(mol), scheme)
print(hash) # 48b5d33cd3a5b7f859dad34ab19cdab3b8dd6cf3
scheme
には以下の三種類を指定することができます。
ALL_LAYERS
: 全レイヤーを用いた最も厳格なハッシュスキームSTEREO_INSENSITIVE_LAYERS
: 立体化学に関するレイヤーを除くTAUTOMER_INSENSITIVE_LAYERS
: 互変異性体に関するレイヤーを除く以上です。ドキュメントの誤りや改善点を見つけた場合はユーザー会のSlackかGitHubまでご連絡ください。