トップページに戻る
データ変換プログラム (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):
 データを保存