表計算で管理しているSMILESを別の分子ソフトへ渡すときは、化合物IDを持つSDFにすると構造と管理情報を一緒に扱えます。ここではCSVからSDFを作り、各レコードへID、名前、元のSMILES、入力のレコード番号を保存します。

ExcelのSMILES列をSDFなどの分子ファイルへ変換したいという相談では、次に使うソフトがExcelを受け取らないことが作業のきっかけでした。拡張子を変えるだけでは、CSVの表がSDFのレコード構造へ変わるわけではありません。構造を読み込み、保存形式に合わせて書き出します。

入力を用意する

compounds.csvとcsv_to_sdf.pyを同じフォルダーに置きます。

source_id,name,smiles
CMP001,acetic acid,CC(=O)O
CMP002,ethanol,CCO
CMP003,aspirin,CC(=O)Oc1ccccc1C(=O)O

サンプルには5化合物が入っています。手元の表を使う場合も、構造はsmiles、管理用IDはsource_idへ入れてください。各行のIDは空欄にせず、重複しない値を入れてください。後で計算結果や実験値と対応づけるときに使います。

SDFを書き出す

macOSやLinuxでは、CSVとスクリプトのあるフォルダーで次を実行します。

python3 -m venv .venv
.venv/bin/python -m pip install "chematic==1.1.2"
.venv/bin/python csv_to_sdf.py compounds.csv

Pythonを使える環境で実行してください。この例はmacOS arm64とPython 3.13.6で確認しました。Windowsでは、最初の行をpy -m venv .venvに変え、.venv/bin/pythonを.\.venv\Scripts\python.exeに置き換えます。パッケージの取得後、変換は端末内で行います。出力はcompounds.sdfと、入力の各行を記録したsdf-export-report.csvです。

スクリプトはSDWriterを使い、表示用の2次元座標を付けて保存します。各レコードのタイトル行には化合物IDを入れ、SDFのプロパティにも次を残します。

  • compound_id:入力の管理用ID
  • compound_name:入力の名前
  • source_smiles:入力に書かれたSMILES
  • source_row:ヘッダーの次を2とした入力レコードの番号
  • engine_version:変換に使ったchematicの版

出力の構造には2次元座標が入ります。計算化学用の3次元構造を用意する場合は、その後の座標生成と最適化の手順を選んでください。

読み戻してIDを確かめる

SDFを次のソフトへ渡す前に、保存したIDを読み戻して確認します。下のコードをcheck_sdf.pyとして同じフォルダーに保存してください。

import chematic

for mol in chematic.SDMolSupplier("compounds.sdf"):
    print(mol.GetProp("compound_id"), mol.formula, mol.GetProp("source_smiles"))
.venv/bin/python check_sdf.py

公開Pythonパッケージv1.1.2で確認したサンプルの結果です。

CMP001 C2H4O2 CC(=O)O
CMP002 C2H6O CCO
CMP003 C9H8O4 CC(=O)Oc1ccccc1C(=O)O
CMP004 C4H8O2 CCOC(C)=O
CMP005 C2H3NaO2 CC(=O)[O-].[Na+]

5件のIDと元のSMILESを読み戻せることを確認しています。処理記録のstatus=writtenを数えると、書き出したレコード数を入力と照合できます。構造とIDを隣に置いて表示するソフトでは、プロパティのcompound_idを選ぶと元の表と対応付けられます。

出力SDF、処理記録のCSV、実行記録をダウンロードできます。使用したAPIの実装は、Pythonの形式入出力コードで確認できます。