最終更新:2025-09-28
概要
本記事では、自作ライブラリ(MultiOptPy)で、BH9データセット 1. Radical rearrangement and addition No. 15の素過程の遷移状態構造を算出してみる。計算レベルは、Meta社のFAIR Chemistryが開発したニューラルネットワークポテンシャル(NNP)であるUMA(Meta’s Universal Model for Atoms)とした。
MultiOptPyは電子状態計算ソフトウェアを用いた分子構造最適化手法の勉強を目的として作成したpythonライブラリである。
MultiOptPyのレポジトリ:https://github.com/ss0832/MultiOptPy
BH9のデータセットについて:
- J. Chem. Theory Comput. 2022, 18, 1, 151–166 https://doi.org/10.1021/acs.jctc.1c00694
今回使用したニューラルネットワークポテンシャルについて:
- https://ai.meta.com/blog/meta-fair-science-new-open-source-releases/ (UMAの公開に関する記事)
- https://github.com/facebookresearch/fairchem (FAIR Chemistryの提供するGitHubのレポジトリ)
- https://fair-chem.github.io/ (同上のレポジトリの内容に関して説明したサイト)
- https://huggingface.co/facebook/UMA (NNPの配布サイト, Hugging Faceへのアカウント登録と配布元の使用許諾が必要である。)
- arXiv preprint arXiv:2505.08762 (2025). (プレプリント)
使用した自作ライブラリMultiOptPyのバージョン
v1.17.2
環境
Windows 11
※Windows 11環境下でAnaconda PowerShell Promptを使用した。
Source codeのダウンロード
wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.17.2.zip
unzip v1.17.2.zip
cd MultiOptPy-v1.17.2
環境構築手順
今回は、Windows 11のPower Shellを使用した。初めに、NNPを使用できる環境が整ったAnaconda PowerShell Promptを用意する手順を説明する。
1, https://repo.anaconda.com/archive/ より、Anaconda3-2025.06-1-Windows-x86_64.exe
でAnacondaをインストールする。
2, 検索機能を使い、スタートからAnaconda PowerShell Prompt
を開く。
3, 以下のコマンドを実行し、仮想環境を作成する。
conda create -n (任意の仮想環境名) python=3.12.7
4, 先ほど作成した仮想環境をconda activate (仮想環境名)
で起動させる。
5, 以下のコマンドを実行し、必要なライブラリを導入する。
pip install ase==3.26.0 fairchem-core==2.7.1 torch==2.6.0
- fairchem-coreは、FAIR Chemistryが管理しているNNPを動作させるために必要なライブラリである。
- aseはNNPに電子エネルギーを算出したい分子構造を渡すために必要なインターフェイスの役割を果たすために必要なライブラリである。
- torchはPyTorchライブラリを指す。これはニューラルネットワークなどの機械学習を行ったり、学習結果を扱ったりするために必須なライブラリである。
これで、Anaconda PowerShell Prompt
から仮想環境を立ち上げることで、NNPを使用する準備が整えることが出来る。
次に、NNPを使用するために必要なModelの情報が保存されている.pt
ファイルのダウンロードおよびNNPの自作ライブラリへの導入方法について説明する。
1, 以下のサイトにアクセスして、uma-s-1p1.pt
をダウンロードする。(使用許諾が下りていれば可能である。)
https://huggingface.co/facebook/UMA
2, ダウンロード後、MultiOptPy-v1.17.2
ディレクトリ内に存在するsoftware_path.conf
に対して、uma-s-1p1.pt
の絶対パスを用いて以下を追記する。
uma-s-1p1::(uma-s-1p1.ptの絶対パス)
これで、MultiOptPy-v1.17.2
がNNPuma-s-1p1
を使用できるようになる。
使用するNNPに関する具体的な説明
今回使用するNNPについて具体的に説明する。
- UMAのModel Checkpointは
uma-s-1p1
を使用した。 - 小分子系のトレーニングセットである
Omol25
(omol
)を使用して学習したニューラルネットワークポテンシャルを使用する。
※自作ライブラリでの具体的な使用の仕方に関しては、ase_calculation_tools.py
を参照
手順
1. 初期構造の準備
モデル反応系として、以下の構造を用意した。今回はファイルの名前をbh9_1_15.xyz
とした。 初期構造は以下のものを使用した。(uma-s-1
を使って構造最適化したものを使用している。)
20
OptimizedStructure
C -1.516069579504 -2.237069767820 1.275702907950
C -0.230568630297 -2.027042828262 1.756384204459
C 0.712516976032 -1.373021902256 0.979248446727
C 0.368050584782 -0.903032744850 -0.284406053882
C -0.916846432367 -1.121652171760 -0.772504982149
C -1.851843947648 -1.786211821829 0.007317388655
H -2.247301177277 -2.754818478606 1.881889028590
H 0.043621694672 -2.381695976994 2.741741436841
H 1.721316355771 -1.220055090769 1.340923494846
H -1.171762168678 -0.776253284526 -1.766979217189
H -2.848717208541 -1.952229824999 -0.381034724887
N 1.348706903863 -0.272264024226 -1.085940114555
C 1.319556438517 0.980632905026 -1.240791649628
H 2.087319183594 1.412795604746 -1.885789240934
C 0.351667958927 1.965838685410 -0.635224111396
H -0.463060873782 2.113572763749 -1.364810652514
H -0.130188526664 1.534133520168 0.244450910999
C 0.997936061047 3.264393041818 -0.323334032055
H 1.893744003437 3.572949128343 -0.842761023371
H 0.531922384117 3.961032267637 0.355917983495
2. 遷移状態構造最適化のための初期構造の算出
a. 初期構造をカレントディレクトリにbh9_1_15.xyz
として保存し、以下を実行する。
python optmain.py .\bh9_1_15.xyz -ma 200 13 18 -os uma-s-1p1 -fc 50 -opt rsirfo_fsb -spin 2 -elec 0
-opt rsirfo_fsb
は準ニュートン法であるRS-I-RFO法を構造最適化に使用することを示す。初期のへシアンに関しては、特にオプションで指定しない限り、単位行列が使われる。-spin
はスピン多重度の指定である。PySCFを使用するときは目的とするスピン多重度に1を引いた値を指定する。(デフォルトでは1が指定される。)今回はUMAモデルのNNPを使用し、ラジカル反応を扱うためスピンだ重度を2とした。-elec M
は形式電荷をMとすることを示す。(デフォルトでは0が指定される。)-ma yyy a b
はyyykJ/molの活性化障壁を超えうるペア同士を近づける力を原子のラベル番号aとbのペアに構造最適化時に加えることを示す。-os uma-s-1p1
は今回使用するNNPを指定している。これを使用する際にASEライブラリが必要である。-fc X
はX回の反復計算ごとに正確なHessianを計算することを指定する。Hessianの計算コストは勾配の場合と比べると大きいが、構造最適化の収束までの時間を短縮できる。
これを実行すると、omol
のデータセットを使用したuma-s-1p1
モデルのNNPで得たエネルギーに対して、指定した人工力ポテンシャルを加えた上で初期構造を構造最適化することができる。
結果はyyyy_mm_dd
(今日の年月日)ディレクトリの中に存在するディレクトリを開いて確認できる。
正常終了していれば、このディレクトリ中に、bh9_1_15_traj.xyz
が存在するので、これをコピーして、MultiOptPy-v1.17.2
ディレクトリに置く。
bh9_1_15_traj.xyz
は構造最適化の過程をAvogadro(公式ページ:https://avogadro.cc/ )等で可視化して確認できるようにしている。このbh9_1_15_traj.xyz
は次のNEB計算に使用する。
※bh9_1_15_traj.xyz
をアニメーションとして表示したい場合は、[https://github.com/ss0832/molecule_movie] を使うと良い。
(この人工力ポテンシャルを加えて行った構造最適化の結果はbh9_1_15_optimized.xyz
で確認できる。構造を可視化して、生成系になっているか確認する。反応系のままであれば、-ma
の設定を見直してb.をやり直す。今回の場合以下の構造が得られた。生成系の安定構造に近いものが得られていると判断できるため、次のNEB計算を行うことが可能である。)
b. bh9_1_15_traj.xyz
を初期パスとして、NEB法で経路の緩和を行う。
NEB法を用いることで、先ほど得られたbh9_1_15_traj.xyz
全体のエネルギーを下げることができる。これにより、パスのエネルギー極大値を持つ構造を遷移状態構造に近づける。(この時点ではまだ正確な遷移状態構造は求められていない。)
python nebmain.py bh9_1_15_traj.xyz -os uma-s-1p1 -ns 15 -aneb 3 5 -modelhess -spng -ndb 0.5 -ad 9999 -spin 2 -elec 0
-ad X
は線形補間で、各ノード間の距離を全て等しくするための処理である。X回の反復計算ごとに本処理を行う。Xを-ns
よりも大きな数値を指定することで、初期経路に対してのみ処理を行うことが出来る。-ndb N
はノード間の距離をN Åとして初期経路を作成することを示す。経路作成時に元のノードをベルンシュタイン多項式を用いてがたついた経路を滑らかにする。
→プログラムの仕様上-ad
の処理を行った後に、-ndb
の処理を行うようになっている。
-ns n
はn回分NEB法による経路の緩和を行うことを示す。-fc M
はM回あたりの経路緩和回数に対して1回だけ正確なHessianを計算し、経路緩和に使用する。これを使用すると、Hessianを使用しない場合の経路緩和アルゴリズムとは別のものを使用して、経路緩和を行う。-spng
は緩和中のパスのエネルギープロファイルや各ノードの勾配のRMS値をmatplotlibで可視化するオプションである。-os uma-s-1p1
は今回使用するNNPを指定している。これを使用する際にASEライブラリが必要である。-aneb A B
これを指定すると、(B+1)回の緩和ごとに、エネルギー極大値を示すノードと前後のノードの間に線形補間でA個の新規ノードを内挿するようにできる。デフォルトではこのような操作は行われない。このオプションを使用するとノードの数が徐々に増えるため、計算コストが使用しない場合と比べて増加する。一方で、エネルギー極大値を示すノード周辺にノードを増加させるため、緩和している経路中のノードが遷移状態構造付近に存在する可能性が高くすることが出来る。
c. 初期構造の決定及び遷移状態構造の計算
MultiOptPy-v1.17.2
と同じディレクトリ内に、NEBという名前を含むディレクトリが生成されている。 そのディレクトリ内のenergy_plot.csv
を確認し、緩和後のパスのエネルギー極大値を示す構造を確認する。
パスの緩和後の各ノードのエネルギー一覧(単位
※bias_force_rms.csv
にて、各Iterationごとのすべてのノードの勾配のRMS値を確認できる。
経路緩和の結果、経路のエネルギー極大値を示す構造の中から目視で、緩和後に得られた経路の15番(グラフ上では16番)の構造を遷移状態構造を求める初期構造として採用した。
※こちら[https://ss0832.github.io/molecule_viewer/] を使うことでも可視化は可能である。
bh9_1_15_traj_15.xyz
20
0 2
C -1.447309925130 -2.292611017520 1.295968663378
C -0.183933749666 -2.080051276997 1.832783067729
C 0.742246966172 -1.301427488125 1.159691231807
C 0.412493341168 -0.690806783587 -0.051458122707
C -0.858972884089 -0.915947624077 -0.591202258307
C -1.774144381638 -1.715094866183 0.077674484190
H -2.163424285214 -2.916806441223 1.813566408674
H 0.088746487199 -2.541369742393 2.773464050398
H 1.741318266761 -1.158658086979 1.550293926283
H -1.108756297164 -0.502667231312 -1.560760741342
H -2.746417864730 -1.896708348862 -0.363697274454
N 1.414910515542 0.002686056062 -0.737507616955
C 1.175841847872 1.170378372641 -1.291644580994
H 1.904079464627 1.488169469377 -2.030353401320
C 0.015043184245 2.097987647788 -1.075515293500
H -0.361356686519 2.594176501023 -1.966990898080
H -0.776263159933 1.683789920976 -0.462637534880
C 1.076887028362 2.778152077049 -0.317717966956
H 1.743387660677 3.465479178516 -0.815590506962
H 1.105624471461 2.731329683828 0.761634363999
構造が壊れていないので、これを遷移状態を求めるための初期構造とする。
遷移状態構造を求めるための初期構造を含むxyzファイルをMultiOptPy-v1.17.2
と同じディレクトリ内にコピーする。
そして、以下を実行する。
python optmain.py .\bh9_1_15_traj_15.xyz -spin 2 -elec 0 -os uma-s-1p1 -fc 5 -tcc -freq -opt rsirfo_bofill -order 1
-opt rsirfo_bofill
は遷移状態構造の最適化向けのoptimizerを指定することを意味する。準ニュートン法であるRS-I-RFO法を使用する。今回は-fc
で正確なへシアンを計算するようにしているので、初期へシアンは正確なへシアンを使用するようになっている。-order 1
は一次の鞍点を求めることを指定する。(デフォルトだと極小値を求めるようになっている。)-fc 5
は5回の反復回数当たり1回正確なへシアンを計算することを指定する。-freq
は収束条件を満たした後に基準振動解析を行うことを示す。(自前で実装しているため、あくまで目安として使用することを推奨する。各振動モードをvibration_animation
内のxyzファイルで可視化できる。)UMAモデルから算出されるHessianは数値微分により求めているため、原子数Zが多いとZの二乗オーダーで計算コストが急増する。-tcc
は収束条件を厳しくすることを示す。(Gaussianのtightと同等)
実行して得られた正確な遷移状態構造と思われる構造を以下に示す。
(実行して得られた正確な遷移状態構造は計算開始時に、yyyy_mm_dd
ディレクトリ内に生成された新規ディレクトリ内のYYY_optimized.xyz
として保存されている。)
20
OptimizedStructure
C -1.410331304546 -2.112641618962 1.358290485808
C -0.143162490370 -1.818478046412 1.842041371341
C 0.770424823193 -1.136090464155 1.053220528985
C 0.418658574344 -0.712412375405 -0.227812312564
C -0.854304581648 -1.016760478058 -0.713257404880
C -1.756831606180 -1.715300973245 0.074695315637
H -2.116756249691 -2.656410405825 1.971108880854
H 0.142200633511 -2.132682106403 2.838013035600
H 1.768659008548 -0.925240282918 1.415176999480
H -1.119044103534 -0.721644259544 -1.721360723742
H -2.736735131509 -1.952796564948 -0.320151958525
N 1.382793645474 -0.064370116056 -1.019502094487
C 1.165557059720 1.164136852189 -1.418471745852
H 1.897463205472 1.583671222152 -2.100593354543
C 0.010475809232 2.072176350374 -1.075824015624
H -0.207894233014 2.800606228847 -1.849938712800
H -0.875815070159 1.572958578166 -0.703925622116
C 0.993145851075 2.481160025142 -0.062497811195
H 1.684092014279 3.289731842894 -0.242480098056
H 0.987404145805 2.000386592167 0.903269236677
停留点に収束した分子構造が得られた。-freq
オプションにより生成されたnormal_modes.txt
やvibration_animation
ディレクトリ内の振動モードのアニメーションを確認した。
以下に-freq
オプションで生成されたnormal_modes.txt
の一部を示す。
Mode 0 1 2
Freq [cm^-1] -624.8014 47.1947 92.8866
Reduced mass [au] 9.2437 4.0223 3.3472
Force const [Dyne/A] -2.1261 0.0053 0.0170
Char temp [K] 0.0000 67.9027 133.6430
Normal mode x y z x y z x y z
C 0.00056 0.00034 0.00051 -0.00534 -0.03113 -0.01018 -0.00228 0.09134 0.02263
C 0.00054 0.00167 -0.00099 0.01706 -0.11075 -0.01898 0.02333 0.03378 -0.00906
C -0.00103 0.00409 -0.00294 0.02382 -0.09177 0.00656 0.03933 -0.02465 -0.03988
C -0.00333 -0.00330 -0.00318 0.01196 0.01006 0.04227 0.03057 -0.02276 -0.03682
C 0.00116 -0.00685 -0.00080 -0.01062 0.08615 0.05067 0.01391 0.01349 -0.01428
C -0.00125 -0.00037 0.00066 -0.01885 0.06673 0.02411 -0.00489 0.07394 0.01808
H 0.00153 0.00011 0.00144 -0.01146 -0.04703 -0.03131 -0.01983 0.14487 0.04989
H 0.00251 0.00178 -0.00163 0.02826 -0.18965 -0.04711 0.02705 0.03987 -0.00825
H 0.00029 0.00206 -0.00471 0.04004 -0.15284 -0.00309 0.05397 -0.05582 -0.06215
H 0.00164 -0.00895 -0.00200 -0.02077 0.15090 0.07241 0.00848 0.00614 -0.01488
H -0.00217 0.00144 0.00205 -0.03489 0.12578 0.02837 -0.02332 0.11105 0.04153
N -0.00060 0.00608 -0.01769 0.02961 0.01703 0.07341 0.03494 -0.01518 -0.02551
C -0.03252 -0.13122 -0.12124 0.01734 -0.00842 0.00245 0.02662 -0.00402 0.01273
H 0.03759 -0.05446 -0.01133 0.04254 -0.02681 0.01778 0.05712 0.04459 0.07542
C 0.07820 -0.02549 0.02040 -0.00512 -0.00225 -0.09056 -0.02145 -0.04559 -0.02983
H 0.06425 -0.02452 0.01788 0.02348 -0.04220 -0.13649 0.04662 0.00127 -0.00488
H 0.05477 0.00785 0.01977 -0.01938 0.01538 -0.10232 -0.05222 -0.07867 -0.14921
C -0.06064 0.15184 0.11678 -0.05647 0.06168 -0.06521 -0.12619 -0.09595 0.08985
H 0.03840 0.04877 0.04829 -0.05688 0.06027 -0.07310 -0.13053 -0.06462 0.21473
H 0.02771 0.05198 0.06622 -0.09029 0.10425 -0.04407 -0.20228 -0.17079 0.05239
(...snip...)
その結果、虚振動が1つであることが確認できた。つまりこの構造は遷移状態構造である。
次に、vibration_animation
内の虚振動を示す分子振動が示されたxyzファイル(mode_1_XXXi_wave_number.xyz
)をAvogadroで確認すると、想定される反応系と生成系をつなぐ方向に振動していることを確認できた。
終わりに
自作ライブラリで、UMAモデルのニューラルネットワークポテンシャル(NNP)を用いて、BH9データセット 1. Radical rearrangement and addition No. 15の素過程のある1つの遷移状態構造を算出する手順を説明した。
参考
- https://github.com/ss0832/MultiOptPy (自作ライブラリMultiOptPyのレポジトリ)
- https://avogadro.cc/ (Avogadro、分子構造可視化ツール)
- https://ai.meta.com/blog/meta-fair-science-new-open-source-releases/ (UMAの公開に関する記事)
- https://github.com/facebookresearch/fairchem (FAIR Chemistryの提供するGitHubのレポジトリ)
- https://fair-chem.github.io/ (同上のレポジトリの内容に関して説明したサイト)
- https://huggingface.co/facebook/UMA (NNPの配布サイト, Hugging Faceへのアカウント登録と配布元の使用許諾が必要である。)
- arXiv preprint arXiv:2505.08762 (2025). (プレプリント)
- The Journal of Chemical Physics 2010, 132, 241102.
- The Journal of Chemical Physics 1991, 94, 751–760.
- In Classical and Quantum Dynamics in Condensed Phase Simulations; WORLD SCIENTIFIC: LERICI, Villa Marigola, 1998; pp 385–404.
- The Journal of Chemical Physics, 2020, 153, 024109.
- The Journal of Chemical Physics, 2022, 144, 214108.
- J. Chem. Theory Comput. 2022, 18, 1, 151–166 https://doi.org/10.1021/acs.jctc.1c00694 (BH9のデータセットについて)