トップページに戻る
データ変換プログラム (filter) (plug-in ver)
公開対象: 全ユーザ
必要ファイル: tklib
参考プログラム
参考プログラムが XRD\filter, PES\filter などに入っています: filter-plugin - D2MatE
プログラム仕様
修正
全体方針
- pythonモジュールを importlib
で読み込む場合、モジュールでエラーが起こったとしても
”読み込みエラー"
としか表示されず、デバッグができません。
そのため必ず、モジュール単独で動作し、動作確認できるようにします。
- pluginの動的読み込みには、importlib を使います。
1つだけ読み込む場合: tkApplication.load_module()
を使います
指定してplugin_dir内のすべてのplugin-inを読み込む場合:
tkApplication.load_modules(plugin_dir, "*.py") を使います
- tkProgで公開しているプログラムは、アプリケーションオブジェクト
tkApplication および変数オブジェクト cparams
を利用しています。
本plug-inの仕様では、tklibの使用は必須ではありませんが、使用することを推奨します。
- 変数の初期化 initialize()、起動時変数の読み込み
update_vars() 、usageを表示する usage()
を使用することを推奨します。必須ではありません
- 標準関数 (API) の多くは、以下の引数を受け取ります。
基本的に、filter動作に直接関係する変数は cparams
の属性として渡します。
リスト引数 *args、キーワード引数 **kwargs
を受け取るので、任意の引数を与えることができますが、プログラムの見通しが悪くなるため、推奨しません。
・ print_level: コンソール出力を制御する変数。
デフォルトは 1 (最小の負か情報出力)
0 の場合は付加情報出力はしない
・ app:
tklib.tkApplication オブジェクト。デフォルトは None
・ cparams: tklib.tkParams オブジェクト。デフォルトは None
・ その他、関数依存引数
- データの構造
data_list、inf["data_list"] 変数として共有します。
data_listの各要素に対するラベル名を、labels,
data_list["labels"]変数として共有します。
下記の API では、主にこの2つの変数を使って print, save,
plot を行います。
plugin_ver |
Region |
Xデータ変数 |
Yデータ変数 |
data_list |
変数の数 |
nregion |
nX |
nspectrum |
|
0.2 (標準) |
region 1 |
xa |
ya1, ya2, .. |
[[xa, ya1, ya2, ...], [xb, yb1, yb2, ...], ...] |
|
region 2 |
xb |
yb1, yb2, .. |
|
|
... |
|
|
|
0.1 (obsolete) |
region 1のみ |
x |
y1, y2, .. |
[x, y1, y2, ...] |
|
|
|
|
|
.その他 (個別拡張) |
region 1 |
xa1, xa2, ... |
ya1, ya2, .. |
[[xa1, xa2, ya1, ya2, ...], [xb1, xb2, yb1, yb2, ...], ...] |
|
region 2 |
xb1, xb2, ... |
yb1, yb2, .. |
|
-
- 標準的なスペクトルデータ
data_listは、複数のRegion (異なるX範囲)
のデータを持つことができます。
Regionの数を nregion とします。
各 Region
のデータは1つのX軸データと、複数のY軸データを持つことができます。
Y軸データの数を nspectrum とします。
・ X軸データ: 1次元リスト x
・ Y軸データ: nspectrum個の1次元リスト y1, y2, ...
これらのデータは 1次元リスト data_list1 etc
として管理します。 data_list1 = [x, y1, y2, ...]
全Regionのデータは、1次元リスト data_list
として扱います。
data_list = [data_list1, data_list2, data_list3, ...]
それぞれのデータを識別するlabelも1次元リストで与えます。
labels = [["x", "y1", "y2", ...],
["xa", "ya1", "ya2", ...]] etc
共通で使うメタデータは inf["meta"]
に辞書変数を指定します
inf["meta"] = {"filename": path, "sample_name":
"sample1"} etc
- その他のデータ
TFTの VG - VD -
ID特性のように、X変数が複数の場合などは、個別のフォーマットで対応し、将来統一を進めます。
現状では、inf["nX"]
変数にX変数の数を指定することとします。
data_list = [[x1, x2, y1, y2], [xa1, xa2, ya1, ya2] etc
inf["data_list"] = data_list
inf["nregion"] = len(data_list)
inf["nX"] = 2
inf["nspectrum"] = len(data_list[0]) - inf["nX"]
また、data_listに含めないデータは、個別の変数として与えます。リストの次元、階層も個別に対応します
inf["VHall"] = [VHall]
また、data_listに含めないデータは、個別の変数として与えます。リストの次元、階層も個別に対応します
inf["VHall"] = [VHall]
その他、メタデータは等は個別に決めたメンバ変数として保存します。
inf["meta_other"] = { ... }
- plugin_ver=0.1のスペクトルデータ: 互換性維持のために残しています
nregion == 1 の場合、data_list、labels
は、1階層の1次元リスト変数です
data_list = [x, y1, y2, ...]
labels = ["x", "y1", "y2", ...]
これらの変数の型は、以下のように判別できます。
・ plugin_ver
nregion==1の書式の場合、plugin_ver = 0.1
今後開発するプログラムは、plugin_ver >=
0.2
とし、nregion=1の場合でも、複数Regionの変数を使ってください
・ inf["labels"][0] が str型であれば、plugin_ver=0.1、list型であれば0.2以降になります。
if type(inf["labels"][0]) is str
単独動作させるため、また、動作テストのためのコード
__name__ == "__main__"
で判定することにより、単独起動時にはmain()関数を呼び出すようにします。
標準的な main() 関数を示します。
このプログラムでは、データファイルのフォーマットチェックをしたのちにデータを読み込み、データの表示、グラフの描画を行い、usageを表示して終了します。
def main():
#==================================================================
# Initialize parameters
#==================================================================
app = tkApplication(usage_str = usage_str, globals = globals(), locals = locals())
cparams = app.get_params()
initialize(app, cparams)
update_vars(app, cparams)
print("")
print( "==========================================================================")
print(" Convert CIF file to powder XRD pattern")
print( "==========================================================================")
print(f"Input file: {cparams.infile}")
logfile = app.replace_path(cparams.infile, template =
["{dirname}", "{filebody}-out.txt"])
print(f"Open logfile [{logfile}]")
app.redirect(targets = ["stdout", logfile], mode = 'w')
cparams.outfile = get_output_path(cparams.infile)
print("Output file:")
print(f" xlsx file: {cparams.outfile}")
file_type = check_file_type(cparams.infile)
if file_type is None:
app.terminate(f"Error: [{cparams.infile}] invalid file type", usage = usage)
if 'Error' in file_type:
app.terminate(file_type, usage = usage)
inf = read_data(cparams.infile, cparams = cparams)
print_data(inf)
inf = convert(inf, cparams = cparams)
save_data([cparams.outfile], inf, cparams = cparams)
plot_data(inf, cparams = cparams)
app.terminate(usage = usage)
if __name__ == "__main__":
main()
plug-in global 変数
必須
- plugin_ver:
plug-inの目的とバージョンを指定します。データの読み込み等で利用することがあります。
plugin_ver = "data:0.1" # data_list_type = [x, y]
plugin_ver = "data:0.2" # data_list_type = [ [x, y]]
- default_ext = '.txt': 標準の拡張子
- input_type = "Bruker Lynkx .txt":
入力ファイルフォーマットを区別する識別子
- output_type = "pXRD":
出力ファイルフォーマットを区別する識別子
オプショナル
-
written_by = 'Toshio Kmaiya'
-
copyright = ''
-
extensions = ['.txt', 'ras']: 受け取れる拡張子のリスト
-
input_dir:
入力ファイルをディレクトリ内の複数ファイルから読み込む場合
plug-in 標準関数 (API)
各関数に渡すパラメータは、cparamsオブジェクト, あるいは
リスト args, 辞書 kwargs で渡します。
他のプログラムとの互換性のため、cparamsオブジェクトの仕様を推奨します。
- def check_file_type(infile, inf = None, app = None, cparams = None, *args, **kwargs):
入力ファイルフォーマットの確認。対応していない場合はNoneを返し、対応している場合はフォーマット情報の辞書変数を返す。
対応している場合の辞書変数例 {"file_type":
input_type}
- def get_input_type(inf = None, app = None, cparams = None, *args, **kwargs):
入力ファイルフォーマットを識別する辞書変数を返す。
標準の例 {"file_type": input_type}
- def get_output_type(inf = None, app = None, cparams = None, *args, **kwargs):
出力ファイルフォーマットを識別する辞書変数を返す。
標準の例 {"file_type": output_type}
- def read_data(infile, app = None, cparams = None, print_level = 1, *args,
**kwargs):
データを読み込む。失敗した場合はNoneを返し、成功した場合はメタデータを含む情報の辞書変数を返す。
必須の項目:
inf["filename"] = infile
# 入力ファイル
inf["data_list_type"] = "[x, y]" #
inf["data_list"]の型を識別する文字列。 plugin_ver=0.1の場合は "[x, y]"、0.2以降の場合は
"[[x, y]]"
inf["meta"] =
meta
# メタ情報の辞書変数 (あるいは辞書変数のリスト)
inf["sample_name"] = sample_name # 試料名
inf["labels"] = [r"2$\theta$ ($\degree$)", "Intensity"] #
グラフのx,y軸のラベル
inf["data_list"] = [x, y] # x,yデータのリスト。多次元のデータの場合は
[x, y1, y2, ...], 複数Regionの場合は [[x1, y1], [x2, y2]] など
inf["nregion"] = 1 #
Region数
以下は、単一Regionの場合のみ
inf["nspectrum"] = 1 # 1
Regionにおけるスペクトルの数 (x軸データを除く。data_listの列数
- 1)
inf["ndata"] = ndata # データ数
以下は、x変数が複数ある場合
inf["nx"] = 2
以下は、x値のステップ幅が一定の場合のみ
inf["xmin"] = x[0] #
xの開始値
inf["xmax"] = x[ndata - 1] # xの修了値
inf["xstep"] = x[1] - x[0] # xのステップ値
- def get_output_path(infile, inf = None, app = None, cparams = None,
print_level = 1, *args, **kwargs):
出力ファイル名を作成して返す
- def print_data(inf, app = None, cparams = None):
データ、メタ情報を表示
- def plot_data(inf, app = None, cparams = None, action = 'plot', save_file
= None, pause = True, print_level = 1, *args, **kwargs):
グラフ描画、保存
- def save_data(outfiles, inf, app = None, cparams = None, print_level =
1, *args, **kwargs):
データを保存