CIFファイルの記法をpymatgenやVESTAで整形する

## 背景
結晶構造を記述するCIFファイルの記法には混乱があり、インターネットからダウンロードしたり、リートベルト解析等で自分で作成したCIFが他のソフトウェア（e.g. ASE）で読めないということがたまにある。

中身はテキストファイルなので手動で修正することもできるが、手軽なworkaroundとして、様々なCIFファイルを読み込めるソフトウェアを用いて、一旦（ASE等で読めない）CIFを開いてから書き出す方法がある。以下で解説する。

## 方法
この目的で使えるソフトウェアはいろいろとあるが、ここでは2つ紹介する

1. pymatgenを使う方法
サーバー上でPythonを使って多数バッチ処理するならこっちが便利

2. VESTAを使う方法
手元でGUIベースで数件やるならこっちが便利。
一応コマンドラインでも使えるが、まだexperimentalなように見受けられるので注意

### pymatgenを使う方法
pymatgen (https://pymatgen.org/) は、材料解析用のPythonライブラリ。インストールは公式サイトを参照のこと。サーバー上でPythonスクリプトを使って自動処理する場合には特に便利。

#### pymatgenでCIFを扱う注意点
__pymatgenではCIFファイルの全ての属性をサポートしているわけではなく、CIF読み込み→書き出しの過程で情報が落ちる場合がある。__構造解析では重要なUiso（熱振動因子）の情報もCIFから落ちるので注意。
これらの情報が必要な場合は後述するVESTAを使うほうが良い

#### pymatgenでCIFを書き出す2通りの方法
pymatgenでCIFを書き出すには、`structure`オブジェクトから `.to()` 属性を呼ぶ方法と、`CifWriter`クラスを使う方法の2つがある。

c.f. [Unintuitive behavior when saving to .cif related to space groups](#1230https://github.com/materialsproject/pymatgen/issues/1230)

- `.to()` 属性を呼ぶ方法は便利だが、CIFから空間群の情報が落ちてP1として記録されるので、空間群の情報が必要な場合は問題になるかも
- `CifWriter`を使う方法だと空間群を認識してCIFを書き出すので行儀は良い
  - ただし、空間群が正規化されるので、長軸をc→bに取り直した等価な空間群に変換されるなどの変換が伴う場合がある
  - また、空間群の分析にちょっと（数秒程度）時間がかかる
  - うまくいかない場合は`symprec`の値を見直すこと

それらを踏まえて、pymatgenでCIFを読んで書き出すにはこんな感じでできる

```python
from pymatgen.core import Structure
from pymatgen.io.cif import CifParser, CifWriter

# CIFファイルを読み込んでstructureオブジェクトを作る
parser = CifParser("NaCl.cif")
structure = parser.get_structures()[0]

# structureオブジェクトをCIFファイルとして書き出し（to属性を使う方法）
# ただし、CIFファイルに空間群の情報が書き込まれず空間群P1として記述される
structure.to(filename="NaCl_fixed.cif")

# structureオブジェクトをCIFファイルとして書き出し（CifWriterを使う方法）
# この倍は空間群の情報もCIFに書き込まれる
writer = CifWriter(structure, symprec=0.001)
writer.write_file("NaCl_fixed.cif")
```

多数のcifファイルをまとめて処理するにはこんな感じで

```python
import glob
from pymatgen.core import Structure
from pymatgen.io.cif import CifParser, CifWriter

# 指定したディレクトリ内でcifファイルを全件列挙し、
# ファイル名末尾に_fixedをつけて同じディレクトリ内に書き出す
cif_files = glob.glob(f"cif_files/*.cif")
suffix="_fixed"
for cif_file in cif_files:
    parser = CifParser(cif_file)
    structure = parser.get_structures()[0]
    # .to()属性を使う場合
    structure.to(fmt="cif", filename=cif_file[:-4]+suffix+".cif")

    # CifWriterを使う場合
    writer = CifWriter(structure, symprec=0.001)
    writer.write_file(cif_file[:-4]+suffix+".cif")
```

### VESTAを使う方法
VESTA (https://jp-minerals.org/vesta/jp/) は結晶構造の可視化のためのアプリケーションだが、CIFファイルの処理にも使える。

#### GUIの場合
単にVESTAを起動してCIFファイルを開いてから、CIFファイルとして書き出せばok

#### CLIを使う場合
注意点：
VESTAは、引数を渡すことで一応コマンドでも使えるが、正式にドキュメンテーションされた機能ではない。突然変更されたり消えたりするかもしれない。またVESTAはGUIアプリケーションなので、ディスプレイやXserverが設定されていないサーバー上では起動しない。

参考にした記事：
https://qiita.com/inashiro/items/2cf50f0a84dd98a729a7 


- macの場合
  - VESTA.app（普段はクリックして開くアイコン）はディレクトリであり、実行ファイルの実体は `VESTA.app/Contents/MacOS/VESTA`であることに注意

```shell
/Applications/VESTA/VESTA.app/Contents/MacOS/VESTA -open NaCl.cif
/Applications/VESTA/VESTA.app/Contents/MacOS/VESTA -save NaCl_fixed.cif
```

- Linuxの場合

```shell
# インストール（URLやファイル名は例）
wget https://jp-minerals.org/vesta/archives/3.5.7/VESTA-gtk3.tar.bz2
tar -jxvf VESTA-gtk3.tar.bz2
cd VESTA-gtk3/

# 使い方は基本macと同じ
./VESTA -open NaCl.cif
# （ここでVESTAのウィンドウが開く）
./VESTA -save NaCl_fix.cif
```

- Windowsの場合（未確認）

```powershell
C:\Program Files\VESTA-win64\VESTA.exe -open NaCl.cif
C:\Program Files\VESTA-win64\VESTA.exe -save NaCl.cif
```

## おわりに
CIFは闇