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 オブジェクトを生成します。

  • 詳細説明:

    1. まず、cfgfile からサンプル名と3つの格子ベクトルを読み込みます。

    2. 次に、xyzfile からサイト数と各原子サイトの元素名とカートン座標 (name, xc, yc, zc) を読み込みます。

    3. 読み込んだ情報をもとに tkCrystal オブジェクトを構築し、原子のカートン座標を分数座標に変換して tkCrystal オブジェクトに追加します。

    4. グローバル変数 freduce01 フラグが 1 の場合、分数座標は [0, 1) の範囲に正規化されます。

  • 引数:

    • cfgfile (str): 設定ファイル(.cfg)のパス。格子ベクトルやサンプル名を定義します。

    • xyzfile (str): XYZフォーマットの原子座標ファイル(.xyz)のパス。原子種とカートン座標を定義します。

  • 戻り値: tkCrystal オブジェクト。読み込まれた結晶構造データを含みます。

xyz2cif()

  • 概要: XYZファイルと設定ファイルからCIFファイルを生成するメイン処理を実行します。

  • 詳細説明:

    1. グローバル変数 cfgfilexyzfile で指定されたファイルパスを使用して、read_xyzfile() 関数を呼び出し、結晶構造データを含む tkCrystal オブジェクトを取得します。

    2. 取得した結晶情報を標準出力に表示します(cry.PrintInf())。

    3. グローバル変数 ciffile で指定されたパスにCIFファイルを生成・保存します(tkCIFData オブジェクトを使用)。

    4. 処理が完了すると、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