EXPOでSA の履歴(No.2)


EXPOでsimulated annealingを使う


EXPOについて

 EXPOは粉末回折X線データから未知結晶構造を解く直接法のプログラムだが、直接法だけでなくsimulated annealingを使った実空間探索法も使える。直接法で解けない時とか、データの質が悪い、ピークの重なりが多い時などでは実空間探索法の方が成功の確率が高いかもしれない。私は実空間探索法ではFOXを使っていたのだが、しばらくupdateされていないこともあって(最近FOX2022にアップデートされたが)、EXPOの実空間探索法を試してみた。扱うのは無機物で、無機物の場合は分子結晶と違って分子構造自体を読み込んで使わないが、GUIで実行すると分子構造を読み込むところがあって、そこはバイパスできない。もちろん配位多面体構造を適当に準備しておけばいいのだが、後で見るように.expファイルで配位多面体を定義するのはごく簡単なので、.expファイルを直接編集した方が無機物については簡単であろう。なお.expファイルとはEXPOの実行を制御するdirectiveなどを書き込んだテキストファイルである。GUI操作だけの時もこのファイルは作成されて、保存されているので、後で編集して使うことなどもできる。

EXPO_splash.png

EXPOでsimulated annealingを使う際の手順(無機物の場合)

  1. 粉末回折データを用意する。今回使った測定データはダウンロードできる。これは合成したforsterite(Mg2SiO4)を実験室の粉末X線回折計(Rigaku SmartLab)で普通に測定したもので、波長はCuのKa1である。このページの話と関係ないが、このデータを使うと直接法でもちゃんと結晶構造が得られる。多くの場合Mgの1席とSi席が入れ替わっているので、修正が必要である。bond valence sumを計算してみると(これは構造のwindowから可能)、どれが入れ替わっているか分かりやすい(Mgの価数が4になったりするので)。
  2. 格子定数や空間群が分かってない場合は、EXPOを普通に最初からやってindexingで格子定数を決めて、空間群を推定しておく。これは全てGUIでできる。格子定数については、昨年9月バージョンではなぜかデフォルトで実施するとIndexingでエラーが出るので、PatternメニューからIndexingでNTREORを選んで、そこから実施すると正常に終わるはず。格子定数についてはM20やFOMnewの高い候補が1つだけなので迷うことはない。空間群については2つの可能な空間群があってFoMは同じなので、それぞれの空間群で本当は計算を実施しないといけないが、forsteriteではPnma(実際に出てくるのは軸を取り替えたもの)の方が正しい。それらをメモしておいて、expファイルを編集する(これをGUIだけでやろうしてみたが、うまくいかなかった)。以下にこのforsteriteの場合のforsterite.expファイルの実例を示す。これをforsterite.expファイルとして作っておくか、既存のものを書き換える。
    %structure forsterite
    %job forsterite
    %data
    pattern /Users/masami/forsterite.xy
    range 5.000  100.000
    wave 1.540560
    space P n m a
    cell  10.195509  5.980126  4.753685  90.00  90.00  90.00
    cont Mg8 Si4 O16
    %fragment tetra Si O
    %fragment atoms Mg
    %fragment atoms Mg
    %sannel
  3. contは普通格子定数と密度からほぼ推定できるので、それを入れる。この場合、Mg2SiO4でZ=4になるので、Mg8 Si4 O16になる。直接法でもこの情報は要求される。rangeは角度範囲で全部使うなら指定しなくてもよい。なお、simulated annealing時には全ての回折データを使う訳ではなく、低角度の領域のみを使う。
  4. さて、実空間探索法では、(無機物の場合)格子内に存在するであろう原子や原子団を最初に与えてやる必要がある。forsteriteのようなケイ酸塩では、SiO4の4面体が構造のベースになっているので(高圧相だとSiO6の可能性も出てくるが)、SiO4原子団として与える方が探索の効率がよく、解が得られる可能性が高くなる。これの指定は簡単で%fragment tetra Si Oとするだけ。原子間距離も最後に追加できるが、普通はデフォルトで問題ない。空間群PnmaのInternational Tables Aを見ると分かるが、一般位置(8d)は格子内に8個あるが、forsteriteの場合、Siはcontにあるように格子内に実際は4個しかないので、Siは特殊位置(4aか4bか4c)にあり、1席しかないことがすぐわかる。なのでこの定義は1回だけで良い。複数Siの席がある時は%fragmentをその数だけ繰り返して与える。
  5. Mgについては8個単位格子内にあるので、2つの可能性があり、1席のみで一般位置(8d)にあるか、特殊位置の2席を占めているかである。酸素については16個格子内にあって、さらに可能性があるのだが、forsteriteの場合は既にSiO4の方に必要な酸素が付いているので、酸素を独立に考慮する必要はない。もし、Siに直接繋がってない酸素が構造に存在する場合には、それらを追加で定義してやる必要がある(Mg2SiO4の高圧多形でwadsleyiteは1つそのような酸素席がある)。さて酸素が既にSiO4として付いているので、Mgについては原子として%fragment atoms Mgと定義すればよい(MgO6八面体で与えることも可能であるが酸素のオーバーラップが生じる。オーバーラップはEXPOでもちゃんと扱われるが(dynamic occupancy)、効率が悪いのと解が得られにくいことが多い)。上記のexpは後者の例で、Mgが2席あるとして、%fragment atoms Mgを2回定義している。こちらでないと正解は得られない。
  6. 最後の%sannelでsimulated annealingを選択している。細かいオプション指定はGUIの方でできる。
  7. これでEXPOを立ち上げて、Load and Goでこの.expファイルを選択すると、Global optimization dialogが出てきて、ここでさらに細かい設定ができるが、特に何もしないでExecuteボタンをクリックすると、デフォルトでは10回simulated annealingが実行される。
  8. 実際に上記の設定で実施すると、デフォルトだと10回実行されるが、全てで正しいforsteriteの構造が得られた。得られた構造は自動でcifファイルとして保存される。得られた構造を詳細に見ると、酸素についてはSiO4の4個の酸素を反映してか4席の座標が得られるが、これは正しくない。実際にはそのうちの2つは等価であるので重複しており、1つ削除する必要があった。この辺りの扱いが自動で処理されてないところがちょっと気になった。
  9. simulated annealingを行なって、最終的に得られたパターンを示したが、一致はあまり良くない。一致が悪い1つの理由は上記の酸素が1つ過剰なためであろう。ちなみにSiO4を使わずに、全ての原子を%fragment atomsで定義してみると、正しい構造は得られなかった。また、MgO6を定義してもうまくいかなかった。この辺りが初めて試す方にはハードルが高いと思われそうだ。
  10. 必要ならさらにRietveldへと進む。EXPOでRietveld
  11. 実空間探索法の場合はいくつ独立な席があるかなど予め考察して、可能性をしらみ潰しする必要があるので、直接法よりは手を動かす必要がある。一方で、分光法等から既に分かっている部分構造を活かしやすく、直感的に分かりやすい点もある。なお、直接法でも部分構造を利用することは可能である。
    EXPO_SA_forsterite.png