xyz2cif.py
概要
xyz2cif.py は、XYZ形式の原子座標ファイルと設定ファイルからCIF (Crystallographic Information File) 形式のファイルを生成するスクリプトです。
詳細説明
本スクリプトは、特定のフォーマットのXYZファイルとCFGファイルを解釈し、内部的に tkCrystal オブジェクトを構築します。CFGファイルはサンプル名と格子ベクトルを定義し、XYZファイルは原子の数と各原子のカートン座標を定義します。読み込まれたカートン座標は、指定された格子ベクトルに基づいて分数座標に変換され、必要に応じて [0, 1) の範囲に正規化されます。最終的に、構築された結晶情報は tkCIFData オブジェクトを通じてCIFファイルとして保存されます。
関連リンク
:doc:xyz2cif_usage
必要ライブラリ
このスクリプトは以下のライブラリを使用します。
標準ライブラリ
os: オペレーティングシステム機能へのアクセス。sys: システム固有のパラメータと機能へのアクセス。shutil: 高水準のファイル操作。glob: ワイルドカードを使ったパス名のパターンマッチング。csv: CSVファイルの読み書き。pprint: データの整形出力。
非標準ライブラリ
numpy: 数値計算のための多次元配列オブジェクトとそれらを操作するツールを提供します。scipy.interpolate.interp1d: 1次元補間。matplotlib.pyplot: グラフ描画のためのライブラリ。
カスタムライブラリ
以下のカスタムライブラリは、sys.path に指定されたパス(c:/Programs/python/lib および d:/Programs/python/lib)からインポートされます。
tklib.tkfile.tkFile: ファイル操作を扱うクラス。tklib.tkutils.IsDir: ディレクトリの存在を確認する関数。tklib.tkutils.IsFile: ファイルの存在を確認する関数。tklib.tkutils.SplitFilePath: ファイルパスを分割する関数。tklib.tksci.tksci.Reduce01: 数値を[0, 1)の範囲に正規化する関数。tklib.tksci.tksci.Round: 数値を丸める関数。tklib.tkutils.terminate: スクリプトを終了させる関数。tklib.tkutils.pint: 文字列を整数に変換する関数。tklib.tkutils.pfloat: 文字列を浮動小数点数に変換する関数。tklib.tkutils.getarg: コマンドライン引数を取得する関数。tklib.tkutils.getintarg: コマンドライン引数を整数として取得する関数。tklib.tkutils.getfloatarg: コマンドライン引数を浮動小数点数として取得する関数。tklib.tksci.tkmatrix.make_matrix1: コードからは具体的な用途は確認できませんが、行列を生成する関数と思われます。tklib.tksci.tkmatrix.make_matrix2: コードからは具体的な用途は確認できませんが、行列を生成する関数と思われます。tklib.tksci.tkmatrix.make_matrix3: コードからは具体的な用途は確認できませんが、行列を生成する関数と思われます。tklib.tkcrystal.tkcif.tkCIF: CIFに関連するクラス。tklib.tkcrystal.tkcif.tkCIFData: CIFデータ構造を扱うクラス。tklib.tkcrystal.tkcrystal.tkCrystal: 結晶構造データを扱うクラス。tklib.tkcrystal.tkatomtype.tkAtomType: 原子タイプを扱うクラス。
グローバル変数
スクリプト内で定義されているグローバル変数は以下の通りです。
debug(int): デバッグモードのフラグ。デフォルト値は0です。cfgfile(str): 設定ファイル(.cfg)のファイル名。デフォルト値は'STD0.cfg'です。コマンドライン引数によって更新されます。xyzfile(str): XYZ形式の原子座標ファイル(.xyz)のファイル名。デフォルト値は'STD0.xyz'です。コマンドライン引数によって更新されます。ciffile(str): 出力CIFファイル(.cif)のファイル名。デフォルト値は'STD0.cif'です。コマンドライン引数によって更新されます。freduce01(int): 分数座標を[0, 1)の範囲に正規化するかどうかを制御するフラグ。1の場合、正規化が実行されます。デフォルト値は1です。
関数説明
usage()
概要: スクリプトの正しい使用方法を標準出力に表示します。
詳細説明: コマンドライン引数の正しい形式と、
reduce01パラメータの意味について説明します。主に、引数が不足している場合や不正な場合にterminate()関数を通じて呼び出されます。引数: なし。
戻り値: なし。
updatevars()
概要: コマンドライン引数を解析し、グローバル変数を更新します。
詳細説明:
sys.argvからXYZファイル名とfreduce01フラグを読み取ります。XYZファイル名に基づいて、対応する設定ファイル(CFG)名と出力CIFファイル名を派生させ、これらのグローバル変数を更新します。引数: なし(グローバル変数
sys.argvを参照)。戻り値: なし(グローバル変数
cfgfile,xyzfile,ciffile,freduce01を更新します)。
read_xyzfile(cfgfile, xyzfile)
概要: 設定ファイルとXYZファイルから結晶構造データを読み込み、
tkCrystalオブジェクトを生成します。詳細説明:
まず、
cfgfileからサンプル名と3つの格子ベクトルを読み込みます。次に、
xyzfileからサイト数と各原子サイトの元素名とカートン座標 (name, xc, yc, zc) を読み込みます。読み込んだ情報をもとに
tkCrystalオブジェクトを構築し、原子のカートン座標を分数座標に変換してtkCrystalオブジェクトに追加します。グローバル変数
freduce01フラグが1の場合、分数座標は[0, 1)の範囲に正規化されます。
引数:
cfgfile(str): 設定ファイル(.cfg)のパス。格子ベクトルやサンプル名を定義します。xyzfile(str): XYZフォーマットの原子座標ファイル(.xyz)のパス。原子種とカートン座標を定義します。
戻り値:
tkCrystalオブジェクト。読み込まれた結晶構造データを含みます。
xyz2cif()
概要: XYZファイルと設定ファイルからCIFファイルを生成するメイン処理を実行します。
詳細説明:
グローバル変数
cfgfileとxyzfileで指定されたファイルパスを使用して、read_xyzfile()関数を呼び出し、結晶構造データを含むtkCrystalオブジェクトを取得します。取得した結晶情報を標準出力に表示します(
cry.PrintInf())。グローバル変数
ciffileで指定されたパスにCIFファイルを生成・保存します(tkCIFDataオブジェクトを使用)。処理が完了すると、
terminate()関数を呼び出してスクリプトを終了します。
引数: なし(グローバル変数
cfgfile,xyzfile,ciffileを参照)。戻り値: なし。
main()
概要: スクリプトのエントリーポイントです。
詳細説明: コマンドライン引数を解析してグローバル変数を更新し(
updatevars()関数)、その後、XYZファイルと設定ファイルからCIFファイルを生成する主要な処理(xyz2cif()関数)を呼び出します。引数: なし。
戻り値: なし。
入出力
入力
コマンドライン引数:
第一引数 (必須): XYZファイル名 (例:
STD0.xyz)。このファイル名から、対応する.cfgファイル名 (例:STD0.cfg) と出力.cifファイル名 (例:STD0.cif) が派生します。第二引数 (オプション):
freduce01(整数)。分数座標を[0, 1)の範囲に正規化するかどうかを指定します。デフォルトは1で、正規化を行います。
ファイル:
設定ファイル (
.cfg):例:
STD0.cfg内容: 最初の行はコメント、2行目にサンプル名、その後
"Defining vectors"というマーカーの後に3つの格子ベクトルが3行にわたって記述されます。例 (抜粋):
# Comment line SAMPLE_NAME_1 Defining vectors 10.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 10.0
XYZファイル (
.xyz):例:
STD0.xyz内容: 最初の行に原子サイトの総数、2行目はコメント行(スクリプトでは読み飛ばされる)、3行目以降に各原子サイトの元素名とカートン座標 (
xc, yc, zc) が記述されます。例 (抜粋):
2 This is a comment line C 0.0000 0.0000 0.0000 O 1.2345 0.0000 0.0000
出力
ファイル:
CIFファイル (
.cif): 入力されたXYZファイル名に基づいて生成されるファイル名 (例:STD0.cif)。IUCr (International Union of Crystallography) が定めたCIF形式で結晶構造情報が記述されます。
標準出力:
スクリプトの使用方法 (引数エラー時)。
読み込まれたサンプル名、サイト数。
構築された
tkCrystalオブジェクトの結晶情報 (cry.PrintInf()の出力)。処理の進行状況やエラーメッセージ。
使用例
以下のコマンドは、STD0.xyz ファイルを読み込み、分数座標を [0, 1) に正規化して(freduce01=1)、STD0.cif ファイルを生成します。
python xyz2cif.py STD0.xyz 1
または、freduce01 を省略した場合、デフォルト値の 1 が適用されます。
python xyz2cif.py STD0.xyz