LabTalkによるカーブフィットとバッチ処理

概要

このチュートリアルでは、データのインポート、データ操作、カーブフィットの実行、ループで複数のデータセットのバッチ処理の方法を示すスクリプトサンプルを多数用意しています。

学習する項目

このチュートリアルでは、以下の項目について解説します。

  1. データのインポート
  2. 非線形回帰を実行
  3. 線形回帰を実行
  4. バッチ処理

データのインポート

LabTalkスクリプトの中には、ワークシートに既にインポートまたは入力されているデータを操作するものがあります。

多くの場合、LabTalkスクリプトを記述して選択したデータファイルをインポートする必要があります。

Origin でインポートがサポートされているすべてのファイルタイプには、独自のXファンクションがあります。たとえば、データ:ファイルからインポート:CSVメニューオプションを選択し、開いたダイアログでデータファイルを選択してOKをクリックしたときに、「オプションダイアログを表示」 にチェックがついていると、impCSVダイアログが表示されます。ダイアログのタイトルにインポートで使用されるXファンクションの名前が表示されます。

また、ほかの例として、pCLAMPファイルをインポートする場合には、imppClampを使用します。

 

*.datファイルのインポート

ASCIIファイルをインポートするには、XファンクションimpASCを使用します。

 string fname$ = system.path.program$ + "Samples\Curve Fitting\Multiple Gaussians.dat";
 impASC fname:=fname$;

ImpASCオプションツリーノード

メニューからインポートを行う場合、オプションダイアログを開くことができます。このダイアログの設定には、Treenode変数タイプによってアクセスできます。

XファンクションimpASCには、次のような入力変数があります。

 options: [in] 
   type=TreeNode
   default=<unassigned>
   description=Specify the import options in the dialog.

このサンプルでは、 impASC Xファンクションの多くの詳細オプションの使用方法を利用しています。すべてが impASC の呼び出しの一部であることを示すセミコロン (すべてのオプションの割り当てに続く) が1つだけであることに注意してください。

 string fn$=system.path.program$ + "Samples\Spectroscopy\HiddenPeaks.dat"; 
 impasc fname:=fn$ 
 options.ImpMode:=3                        /* 新規ブックで開始 */
 options.Sparklines:=0                     /* スパークラインオフ */
 options.Names.AutoNames:=0                /* 自動名前変更オフ */
 options.Names.FNameToSht:=1               /* シートをファイル名に変更 */
 options.Miscellaneous.LeadingZeros:=1;    /* 数値の前にあるゼロを消去*/

データのフィッティング

LabTalkでのフィット操作では、次の3つのXファンクションがこの順序の通りに使用されます。

  • nlbegin
  • nlfit
  • nlend

XファンクションNLBEGIN

フィット処理を開始します。入力データ、フィット関数の種類、入力パラメータを定義します。

この関数には多くの入力変数があります。デフォルト値を持たないのはfunc変数だけなので、nlbeginを使用する場合は、最低限フィット関数を指定する必要があります。指定した関数は、 解析:フィット:非線形曲線フィットメニューからフィットする場合と同様に、アクティブなXY範囲をフィットするために使用されます。

// ガウスモデルを使用してアクティブプロットのフィッティングを初期化
nlbegin iy:=1 func:=gauss nltree:=tt; 
// expgrow1モデルを初期化して、列1をX、列2をYとしてフィット
nlbegin iy:=(1,2) func:=expgrow1 nltree:=tt;

nltree変数は重要です。

 nltree: [in/out] 
 type=TreeNode
 default=nlt
 description=Tree containing the information of fitting such as parameter values, standard 
               error, etc.

XファンクションNLFIT

この関数はフィットの計算処理を実行します。2つの入力変数があります。

変数

 n: [in] 
   type=int
   default=-1
   description=Number of Iterations
 method: [in] 
   type=int
   default=0
   description=Iteration Method
   allowed values: 0=lm:LM, 1=s:Simplex

スクリプトの使用例

 nlfit 0; // フィット曲線を更新しカイ二乗を再計算
 nlfit 1; // 1回反復
 nlfit; // 収束までフィット

XファンクションNLEND

このXファンクションはフィッティングプロセスを終了し、パラメーター値を出力します。

 nlend output:=1 autoupdate:=1

ガウスフィットのサンプル

// アクティブなワークシートの列1(X)と2(Y)から入力データを取得
// フィッティング関数をガウスとして指定
// ParamTreeという入力パラメーターツリーを作成して
// 非線形フィッティングを開始
nlbegin iy:=(1,2) func:=gauss nltree:=ParamTree;
// ピークの中心を X = 5に固定(オプション) 
ParamTree.xc = 25;     // ピーク中心X値5を割り当て
ParamTree.f_xc = 1;   // ピーク中心固定 (f_xc = 0 は固定なし).
// フィット計算を実行:
nlfit;
// 結果をスクリプト ウィンドウに表示(オプション)
type Baseline y0 is $(ParamTree.y0),; 
type Peak Center is $(ParamTree.xc), and; 
type Peak width (FWHM) is $(ParamTree.w);
// レポートシートなしでフィッティングセッションを終了
nlend;

バッチ処理

バッチ処理の1つの方法として、複数のファイルまたはデータセットをループ処理し、ループ内で適切なXファンクションやその他のスクリプトコマンドを呼び出して必要なデータ処理を実行することで、各データセットを処理するといものがあります。

非線形曲線フィットのバッチ処理

次の例は、10個のファイルをインポートしてカーブ フィットを実行し、フィット結果を出力する方法を示しています。

 // ワイルドカードで全ファイルを検索
 string path$ = system.path.program$ + "Samples\Batch Processing";
 findFiles ext:="T*.csv";
 
 // シートなしのブックから開始
 newbook sheet:=0;
 //全ファイルをループ
 for(int iFile = 1; iFile <= fname.GetNumTokens(CRLF); iFile++)
 {
     // ファイル名を取得
     string file$ = fname.GetToken(iFile, CRLF)$;
     // 新規シートにファイルをインポート
     newsheet;
     impasc file$;
     // 現在のデータの列2にガウスフィッティングを実行
     nlbegin iy:=2 func:=gaussamp nltree:=myfitresult;
     // フィットし、レポートなしで終了
     nlfit;
     nlend;
     // ファイル名と結果を表示
     type "File Name: %(file$)";
     type "   Peak Center= $(myfitresult.xc)";   
     type "   Peak Height= $(myfitresult.A)";    
     type "   Peak Width=  $(myfitresult.w)";    
 }

線形フィットのバッチ処理

//ワイルドカードで全ファイルを選択
 string strpath$ = system.path.program$ + "Samples\Curve Fitting";
 dlgfile group:="Sensor*.dat" init:=strpath$ multi:=1;
//ファイル数を取得
 int nfiles = fname.getnumtokens(CRLF);
//線形フィット結果の傾きを保存する変数を定義
 double dslope; 
//ファイル名を保存する文字列変数を定義
 string strFile$;
//選択したファイルすべてでループ
 loop(ii,1,nfiles)
 {
//ファイル名を取得
  strFile$ = fname.GetToken(ii, CRLF)$;
//新規シートにファイルをインポート
  impASC strFile$ options.ImpMode:=4;
//Xファンクションfitlrでデータセットをフィットし傾きを出力
  fitlr (1,2) b:=bslope;
//結果の文字列をスクリプトウィンドウに出力
  type -a "Slope for %(strFile$) is $(bslope)";
 }

事前に分析テンプレートを作成し、batchProcessXファンクションを呼び出すことでバッチ処理を行うこともできます。これにより、必要なコーディング作業が少なくなります。

ループ内の各データセットの処理

Samples\Data Manipulation\Setting Column Values.OPJのプロジェクトを開き、Columns from Other Sheets サブフォルダを開きます。

サンプルの最初の値からリファレンスの最初の値を減算した値を、サンプル データ全体から減算します。複数のTransducerがあるので、この計算をループで実行します。

 //Referenceワークシート範囲
 range rReference = 1!;
 //Sample ワークシート範囲
 range rSample = 2!;
 //Timeデータ範囲
 range rTime = 2!col(Time);
 //新しいワークシートを作成
 newsheet name:="Corrected Sample";
 //この新しいワークシートの最初の列に時間データ範囲を入力
 wcol(1) = rTime;
 //Transducer列全てでループ
 loop(ii,2,rSample.ncols)
 {
 range rS=rSample!wcol(ii);
 range rR = rReference!wcol(ii);
 wcol(ii) = rS - ( rS[1] - rR[1] );
 }