# find_clusters.py 解析ドキュメント

以下は Python 言語で実装された find_clusters.py の動作解析と実行に関するガイドです。

---

## 1) プログラムの動作概要

- CIF ファイルを読み込み、結晶情報と原子サイトのリストを取得します。
- 対象原子種（targets）に含まれる原子をすべて抽出し、それらを起点とした近傍検索を実施します。
- 半径 Rmax（Å）以内にある、起点原子と他の対象原子との間の距離を調べ、クラスタ（近傍関係によるグループ）を構築します。
- 起点原子を含む初期クラスタを作成し、それを拡張して全体のクラスタを探索します。
- 探索結果として以下を生成します。
  - 入力 CIF から抽出・拡張した新しい CIF ファイルを作成（extciffile）。
  - 拡張座標を含む新しい Crystal/TkCrystal オブジェクトを作成し、CIF 形式で保存。
  - 標準出力へ、結晶情報（格子パラメータ、密度、原子種、拡張格子、対象原子のインデックス等）、およびクラスタ探索過程のログを出力します。

- ロジックの要点
  - find_next(): 指定した起点サイトから、他の対象サイトへ距離検算を実施。Rmin 以上 Rmax 以下の距離を満たす場合、そのサイトをクラスタに追加して探索を進めます。
  - 追加的な配列操作や補助関数（append_unique, make_matrix1 など）は、tklib ライブラリの機能を用いて管理します。
  - 最終的なクラスタはすべてソートされ、extciffile に基づく拡張結晶を CIF 形式で保存します。

> 注: 実行には tklib ライブラリ群（tkfile, tkutils, tksci, tkcrystal など）に依存します。

---

## 2) 必要な非標準ライブラリとインストール方法

このスクリプトは以下の外部ライブラリ・パッケージに依存します。いずれも標準ライブラリではないため、事前にインストールが必要です。

- numpy
- scipy
- matplotlib
- tklib（tkfile, tkutils, tksci, tkcrystal などを含む内部ライブラリ）

推奨のインストール方法（一例）

- NumPy, SciPy, Matplotlib
  - pip を使う場合:
    - pip install numpy scipy matplotlib
  - または Anaconda/Miniconda 環境を使う場合は:
    - conda install numpy scipy matplotlib

- tklib（カスタムライブラリ）
  - 公開リポジトリで配布されている場合は通常以下のようにインストールします（例）:
    - pip install tklib
  - もしソースから入手可能なら、リポジトリをクローンしてインストール:
    - git clone <repository_url>/tklib
    - cd tklib
    - python setup.py install
  - 注意:
    - このスクリプトは tklib/tk*.py というモジュールをローカルに前提としてあり、環境のパスに含まれている必要があります。入手難易度が高い場合は、プログラムの実行前に PYTHONPATH に tklib のパスを追加してください。

補足

- tklib はカスタムの科学計算用ライブラリで、CIF 読み書き、結晶データ構造、座標系、クラスタ計算などの機能を提供します。公式ドキュメントがある場合は、それに従って適切なバージョンを用意してください。

---

## 3) 必要な入力ファイル

- CIF ファイル（初期入力）
  - デフォルトファイル名: STD0.cif
  - 引数 ciffile で任意の CIF ファイルを指定可能
- 入力ファイルの形式
  - CIF（Crystallographic Information File）形式。結晶の格子パラメータ、原子種リスト、原子サイト、Occupancy、座標などが含まれている必要があります。
- 実行時に生成される補助ファイルの前提
  - 実行時に、元 CIF から拡張座標を含む新しい CIF を作成します。extciffile という名前で保存されます。

---

## 4) 実行後に生成される出力ファイル

実行中に生成・保存される主なファイル

- extracted CIF ファイル（extciffile）
  - ファイル名: header-extracted.cif 形式で保存
  - extciffile は ciffile のベース名から header を取り出し、'-extracted.cif' を付した名前として決定されます（コード内でヘッダ部 header = ファイル名の拡張子なし部分）。
- 拡張結晶 CIF ファイル
  - extciffile という名前の CIF ファイルが作成されます。
  - extcry（拡張座標を含む結晶情報）を元に作成され、tkCIFData を用いて CIF ファイルとして保存されます。
- 実行ログ（標準出力）
  - CIF ファイル名、Extracted CIF 名、Rmax、対象元素、格子パラメータ、密度、原子種リスト、拡張格子範囲、対象インデックス、クラスタ探索の経過等を端末へ出力します。

補足
- プログラムは途中経過を多く標準出力へ出力します。ファイルとしての追加出力は主に extciffile の CIF ファイル保存となります。

---

## 5) コマンドラインでの使用例 (Usage)

- 使い方
  - python find_clusters.py ciffile Rmax targets
  - ciffile: 入力 CIF ファイル名（デフォルトは STD0.cif）
  - Rmax: 対象原子間の半径上限（Å 単位）
  - targets: 対象とする元素のリスト。例: 'O'、'O,In,Ga,Zn' のようにカンマ区切りで指定

- 実行例
  - python find_clusters.py STD0.cif 1.8 O
  - python find_clusters.py mystructure.cif 2.0 O,In,Ga,Zn

- 出力動作
  - STD0.cif を読み込み、Rmax=1.8 Å、対象元素 O の近傍クラスタを探索します。
  - itargets に対象の原子が抽出され、近傍の距離条件を満たす原子ペアを検索します。
  - 結果として header-extracted.cif（拡張座標を含む CIF）および extciffile に保存される拡張結晶 CIF ファイルが生成されます。
  - 実行中はクラスタ構築の過程が画面出力として表示されます。

---

もし環