Materials Projectからバンド構造とX線吸収のデータを取得する

## はじめに
**[Materials Project](https://materialsproject.org/)からバンド構造とX線吸収のデータを取得する方法を解説いたします。**Materials Projectに関しては以下の記事も投稿していますので、よろしければ参考にして下さい。

- [Materials Projectの概要](https://qiita.com/oki_kosuke/items/6be3d1dbe1c7e16a5276)
- [Materials Projectから取得できるデータの説明](https://qiita.com/oki_kosuke/items/5604a2532a6ad68f5894)

※マテリアルズインフォマティクス関係の内容を他にも投稿していますので、よろしければ[こちら](https://qiita.com/oki_kosuke/items/34b1071224953776c211#%E6%8A%95%E7%A8%BF%E4%B8%80%E8%A6%A7)の一覧から他の投稿も見て頂けますと幸いです。


## Materials Projectからデータを取得して活用する
今回は[LiF（mp-1009009）](https://materialsproject.org/materials/mp-1009009/)を例としてデータを取得していきます。
### 環境
- windows10
- conda 4.9.2
- python 3.7.1
- pymatgen 2020.4.29

### バンド構造の取得
#### バンド構造とは？
結晶中での電子の状態を表しています。[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%B3%E3%83%89%E6%A7%8B%E9%80%A0)から以下に引用します。

>一般的に波数kと対応するエネルギー固有値（固有エネルギー）εkとの関係を分散関係と言う。波数とバンド構造との関係はバンド曲線、E-k曲線（E-k分散）、バンド分散などと呼ばれることもある。
バンド構造は通常、縦軸がエネルギー、横軸が第一ブリュアンゾーンの適当に選んだいくつかの直線上のk点となっている（系の持つ対称性に依存する）。各k点上に電子の取り得る固有状態（バンド）があり、これらが繋がって曲線をなしている（繋がり方も重要）。バンド構造を見ることにより、バンドギャップが空いているかどうか（つまり対応する系が金属かそうでないか）、バンドの分散が強いか弱いかによる電子状態の違い（分散が弱いと、そのバンドの電子はより束縛された状態となっている。強いと逆）、異なる系同士のバンド構造を比較することにより、系の安定性（どちらがより安定か）などの議論が可能である（注：バンド構造だけでは判断できない場合もある）。

バンド図の見方は[こちら](http://akitsu.ee.ehime-u.ac.jp/lect/m/optlect14_06.pdf)や教科書などを参考にするのがよいと思います。（自分もこの周辺は苦手意識があるので勉強せねば…）

#### Materials Projectからバンド構造情報を取得していく

```python
# バンド構造のプロット用するためのライブラリのインポート
%matplotlib inline
from pymatgen.electronic_structure.plotter import BSPlotter
from pymatgen.ext.matproj import MPRester

# Materials Project の API キーの入力
API_KEY = 'Your API'
a = MPRester(API_KEY)
# 欲しい材料のidを指定して、http通信で取得。LiFでトライ(mp-1009009を取得します)
bs = a.get_bandstructure_by_material_id("mp-1009009")
```

バンドギャップに関する情報を取得します。

```python
bs.get_band_gap()
```
```:出力結果
{'direct': False, 'energy': 7.5592999999999995, 'transition': 'M-\\Gamma'}
```

直接遷移に関するバンドギャップ情報を取得してみます。（ここは補足です）

```python
bs.get_direct_band_gap()
```
```:出力結果
8.2315
```

バンド構造を可視化します。

```python
%matplotlib inline
from pymatgen.electronic_structure.plotter import BSPlotter

plotter = BSPlotter(bs)
plotter.get_plot().show()
# グラフの保存
plotter.save_plot("bandstructure.png",  img_format='png')
```

![bandstructure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/62472d4e-fe16-60ec-32c6-82681acb5032.png)

グラフの保存方法は[こちら](https://atomate.org/running_workflows.html)を参考にさせて頂きました。


### X線吸収スペクトルの取得
#### X線吸収スペクトルとは？
物質にX線（波長が1pm - 10nm程度の電磁波）を照射することで得られる吸収スペクトルには物質中に含まれる元素特有の急峻な立ち上がり（=吸収端）が見られます。[wikipedia](https://ja.wikipedia.org/wiki/X%E7%B7%9A%E5%90%B8%E5%8F%8E%E5%88%86%E5%85%89%E6%B3%95)からX線吸収分光法の関する説明を以下に引用します。

>物質の電子状態や局所構造を求めるために使われている手法である。測定対象となる物質は、気体、固体、液体、溶液などと幅広い。この実験は、通常、エネルギー可変で強度の強いX線が得られるシンクロトロン放射光施設を光源として行われる。
X線吸収の測定は、結晶分光器や回折格子分光器を用いて、入射光を内殻電子を励起することができるエネルギー（おおよそ0.1-100 keVの範囲である）にあわせることで行われる。
X線吸収分光法は吸収分光の一種であり、その挙動は量子力学的な選択則に従う。もっとも強度の強い成分は、内殻電子の非占有軌道への双極子遷移(Δ l = ± 1)である。たとえば、K端において強度が強いのは1s → np遷移であるが、L3端では、2p → nd遷移である

#### Materials ProjectからX線吸収スペクトル情報を取得していく
[pymatgenの公式ドキュメント](https://pymatgen.org/pymatgen.ext.matproj.html)を読み解きながら、コードは理解していきました。

```python
from pymatgen.ext.matproj import MPRester

# Materials Project の API キーの入力
API_KEY = 'Your API'
a = MPRester(API_KEY)
#欲しい材料のid, absorbing elemntを指定して取得。LiFで"Li"の吸収をターゲットにデータを取得
Li_xas = a.get_xas_data("mp-1009009", "Li")
```

Li_xasを解読していきます。

```python
Li_xas.keys()
```
```:出力結果
dict_keys(['mid_and_el', 'last_updated', 'spectrum', 'mp_id', 'element', 'valid'])
```

```python
Li_xas['spectrum'].keys()
```
```:出力結果
dict_keys(['@module', '@class', 'x', 'y', 'structure', 'absorption_specie', 'edge'])
```

Li_xasはdic型の中にdict型を内包していることが分かります。'x'と 'y'はlist型として保持されており、これらを用いてスペクトルを可視化していこうと思います。

```python
import numpy as np
import matplotlib.pyplot as plt

# グラフ化のためにxとyを定義
energy = np.array(Li_xas['spectrum']["x"])
abs_coef = np.array(Li_xas['spectrum']["y"])

# 可視化
plt.figure(figsize=(10, 5))
plt.plot(energy, abs_coef, color="green", linestyle="-")
plt.title("Avg. Absorption (K-edge) for Li")
plt.xlabel("Energy [eV]")
plt.ylabel("Absorption Coeff. [a.u.]")
plt.yticks(np.arange(0,28,4))
plt.grid()
plt.show()
```

![x_ray_absorption.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/acc464f8-7e30-1fa6-6914-bd91754d4193.png)

無事にX線吸収スペクトルを可視化することができました。また、"energy"や"abs_coef"の数値データを活用してデータ分析などが出来そうですね。

## まとめ
Materials Projectからバンド構造とX線吸収のデータを取得する方法を解説いたしました。

### 参考
- [Materials Project](https://materialsproject.org/)
- [pythonでなんとなく材料研究者の気分を味わおう【pymatgen入門】](https://qiita.com/KentoObata/items/a909ecc42c8805594c89)
- [atomate]([こちら](https://atomate.org/running_workflows.html))