ピーク分析

ベースラインを定義して減算後ピークの分析を行うといった操作をLabTalkで行うスクリプトのサンプルです。

  1. グラフ内のアクティブな曲線を指定したX範囲で積分
  2. ベースラインの減算とピークの積分
  3. ピークの検索と積分を複数のDSCファイルで行う
  4. PAのフィット結果を比較

グラフ内のアクティブな曲線を指定したX範囲で積分

Xファンクションinteg1を使って、グラフ内のアクティブな曲線を指定したX範囲で積分

// このサンプルでは以下を行います:
//	1. ファイルインポート
//	2. グラフ作成
//	3. グラフ内の指定したX範囲で曲線を積分
 
 
// 新しいブックを作成してサンプルファイルをインポート
newbook;
string fname$ = system.path.program$ + "samples\curve fitting\multiple peaks.dat";
impasc;
 
// 1列目に対して4列目のデータを折れ線でプロット
plotxy iy:=(1,4) plot:=200;
 
// 3番目のピークがあるX範囲6.5から9.5の行インデックスを取得
int ix1=xindex(6.5,%c);
int ix2=xindex(9.5,%c);
 
// この範囲の曲線を積分し、結果を表示
range rr=(%c)[$(ix1): $(ix2)];
integ1 rr;
integ1.=;

ベースラインの減算とピークの積分

このサンプルでは、1つのファイルに対して処理しますが、複数ファイルでループするように修正して使用することもできます。

// このサンプルでは以下を行います:
//	1. ファイルをインポート
//	2. ベースラインの検索と減算
//	3. ピークの検索
//	4. 各ピークを積分
//	5. 各ピークの積分面積をサマリーシートに追加
 
// プロジェクトをクリアして空のスペースで開始
doc -s;doc -n;{win -cd};
 
//  複数ピークの分析結果を保存するための新しいブックを作成
newbook name:="Integ Peaks" sheet:=0;
string result$ = %h;
newsheet cols:=5 xy:="NXYXY" name:="Results";
// 全列の範囲を定義し、列に名前を付ける
range rFilename=1, rPkindex=2, rArea=3, rCenter=4, rHeight=5;
rFilename[L]$ = "File Name";
rPkindex[L]$ = "Peak Index";
rArea[L]$ = "Area";
rCenter[L]$ = "Center";
rHeight[L]$ = "Height";
// filename列の幅を広げる
wcolwidth irng:= col(1) width:=20;
 
// データファイルを指定
fname$= system.path.program$ + "Samples\Spectroscopy\Peaks with Base.dat"; 
 
newbook;// データ用の新しいブックを使用(結果用ブックとは異なる)
 
//impfile filtername:="ASCII.oif";
impASC;
// 最初の2列のみ使用
wks.ncols = 2;
range baseline=3;
range subtracted=4;// ピーク検索、積分を行う減算データ
range -x anchors = (5,6);
// ピーク検索結果をいれる列
range pcenter=7, pleft=8, pright=9;
// ベースラインのアンカーポイントを検索して列5、6に入れる
blauto iy:=(1,2) oy:=anchors;
 
// 3次B-スプラインで補間して列5に入れる
interp1 ix:=1 iy:=anchors method:=spline ox:=baseline;
baseline[L]$="Baseline";
baseline[C]$="Interpolated from Found Anchor Pts";
// ベースラインを減算
subtracted = col(2) - baseline;
subtracted[L]$="Subtracted";
 
// ピーク検索
pkfind subtracted ocenter:=pcenter oleft:=pleft oright:=pright;
 
// 各ピークでループして面積を求める
for(int ipeak = 1; ipeak <= pcenter.GetSize(); ipeak++)
{
	int n1 = pleft[ipeak];
	int n2 = pright[ipeak];
	range rint = subtracted[$(n1):$(n2)]; // 積分するデータ範囲
	double aa, x0, y0;
	integ1 rint oy:=<optional> area:=aa x0:=xx y0:=yy;
 
	rFilename[ipeak]$ = %(page.info.system.import.filename$);
	rPkindex[ipeak] = ipeak;
	rArea[ipeak] = aa;
	rCenter[ipeak] = xx;
	rHeight[ipeak] = yy;
}

ピークの検索と積分を複数のDSCファイルで行う

このサンプルでは、サンプルサブフォルダ内のすべてのファイルをループして処理し、サマリーシートを作成します。

///////////////////////////////////////////////////////////////////////////////////////////////////////
// このサンプルでは以下を行います:
//	1. 拡張子dscのファイルをインポート
//	2. 各データファイルをループし、ベースラインの検索と減算、
//	   ピークの検索、ピークの積分、異なるワークシートに積分面積などの結果を出力
//	3. ピークのインデックスでサマリーシートをソート
//
//	このコードは、単独でアクセスできるように、セクション付きのOGS形式で記述されています。
//	このコードを拡張子OGS付きのファイルとしてユーザファイルフォルダ内に保存してください。
//	実行するときは、run.section(filename,Main) で実行します。
//	または、
//	DIR *.OGS<Enter> と入力してOGSファイルのスキャンを行い、filename<Enter>と入力して実行します。
/////////////////////////////////////////////////////////////////////////////////////////////////////////
 
[Help]
type Load one more files with dsc extension and then integrate area of each peak.;
type One argument : %1 = number of files to load, 0 to load all.;
 
[Main]
int nfiles = %1;
 
string LoadDSCogsPath$=system.path.program$ + "Samples\LabTalk Script Examples\LoadDSC.ogs";
%A=LoadDSCogsPath$;
if(!run.section(%A, Main, nfiles))
	return 0;
// データはアクティブブックにロードされる
string dscBook$=%H;
if(dscBook.GetLength() < 1 )
{
  type "new book " + dscBook$ + " is not valid";
  return 0;
}
nfiles = page.nLayers;
 
// サマリーレポート用の新しいシートを作成して範囲を定義
newsheet cols:=8 xy:="LYYYYYYY" name:="Summary";
range rColName = 1, rIndex = 2, rCntrInd = 3, rLtInd = 4, rRtInd = 5;
range rArea = 6, rCntr = 7, rHt = 8;
rColName[L]$ = "Data Name";
rIndex[L]$   = "Peak Index";
rCntrInd[L]$ = "Peak Center Index";
rLtInd[L]$   = "Peak Left Index";
rRtInd[L]$   = "Peak Right Index";
rArea[L]$    = "Peak Area";
rCntr[L]$    = "Peak Center";
rHt[L]$      = "Peak Height";
 
 
for(int ii = 1; ii<= nfiles; ii++)
{
   if(!run.section(, IntegOneData, $(ii)))
	return 0;
}
 
page.active = $(page.nLayers);
dataset sbc = {2};  // 最初のソート順のためにピークのインデックスを選択
dataset sodr= {1};  // 昇順
wsort nestcols:=sbc order:=sodr; // ソートを実行
 
return 1;
 
[IntegOneData]
int sheet = %1;
page.active = $(sheet);
range rinput = $(sheet)!2;
string strData$ = rinput[C]$;
 
// ベースラインと減算データとために列を追加
wks.AddCol();
int n = wks.nCols;
range baseline = $(n);
baseline[L]$="Baseline";
baseline[C]$="Interpolated from Found Anchor Pts";
wks.AddCol();
n = wks.nCols;
range subtracted = $(n);
subtracted[L]$="Subtracted";
 
// ベースラインのアンカーポイントを検索
range -x anchors = (AnchorX, AnchorsY);
blauto iy:=rinput  oy:=anchors;
 
 
// スプラインで補間
interp1 ix:=1 iy:=anchors method:=spline ox:=baseline;
 
// ベースラインを減算
subtracted = rinput - baseline;
 
 
// ピーク検索結果を入れる列
int nn = wks.ncols;
loop(cc, 1, 7)
{
    wks.addcol();
}
 
// ピーク検索
range pindex = $(nn+1), pcenter= $(nn+2), pleft= $(nn+3), pright= $(nn+4), parea= $(nn+5), px =  $(nn+6), py =  $(nn+7);
pkfind subtracted ocenter:=pcenter oleft:=pleft oright:=pright;
 
// 各ピークをループして面積を計算
int nNumPeaks = pcenter.GetSize();
for(int ipeak = 1; ipeak <= nNumPeaks; ipeak++)
{
	int n1 = pleft[ipeak];
	int n2 = pright[ipeak];
	range rint = subtracted[$(n1):$(n2)]; // 積分するデータ範囲
	double aa, x0, y0;
	integ1 rint area:=aa x0:=xx y0:=yy oy:=<optional>;
 
	pindex[ipeak] = ipeak;
	parea[ipeak] = aa;
	px[ipeak] = xx;
	py[ipeak] = yy;
 
	// 現ピークの結果をサマリーシートにコピー
	int irow = (($(sheet)-1)*$(nNumPeaks))+$(ipeak) ;
	rColName[$(irow)]$ = rinput[C]$;
	rIndex[$(irow)] = ipeak;
	rCntrInd[$(irow)] = pcenter[ipeak];
	rLtInd[$(irow)] = pleft[ipeak];
	rRtInd[$(irow)] = pright[ipeak];
	rArea[$(irow)] = parea[ipeak];
	rCntr[$(irow)] = px[ipeak];
	rHt[$(irow)] = py[ipeak];
}
 
pindex[L]$ = "Peak Index";
pcenter[L]$ = "Peak Center Index";
pleft[L]$ = "Peak Left Index";
pright[L]$ = "Peak Right Index";
parea[L]$ = "Area";
px[L]$ = "Center";
py[L]$ = "Height";
 
return 1;

PAのフィット結果を比較

一連のサンプルデータにPAを実行したあとに特定のピークのフィットを比較します。
(あらかじめZIPファイルをダウンロードして解凍し、ユーザファイルフォルダの\Themes\AnalysisAndReportTable\に保存してください。)

// このサンプルでは以下を行います:
//	1. 一連のdscファイルのインポート
//	2. ベースラインの自動検索と減算
//	3. テーマファイルからロードした設定でピークの検索とフィット
//	4. 最初のシートに3番目のピークのフィット曲線をプロット
//	5. グラフセル下にこのピークの初期パラメータを追加
//      6. 最後に、ソースデータの同じピークについて比較
 
path$ = system.path.program$ + "Samples\Spectroscopy\DSC\Data\";
 
newbook s:=1 result:=bkn$;
int nfrom =3;
int nto=5;
range ww = !;
ww.ncols = nto - nfrom + 1 + 1; // 最初の列は変数リストのラベル
 
// 比較変数のフォーマット
range rLabel = 1!1;
rLabel[1]$ = "Peak Curve";
rLabel[2]$ = "xc";
rLabel[3]$ = "A";
rLabel[4]$ = "w";
 
int ii;
loop(ii,nfrom,nto) 
{
        //1, 一連のファイルから2データファイルをインポート
        ind$ = $(ii);
        filename$ = "tcal"+ ind$ +".dsc";
        file$ = path$ + filename$;
	newsheet bkn$;
	impfile file$ ;
 
	//2, paスクリプトモードを実行して結果ワークシート名とレポートツリーを保存
	aa$="(1,2)";
	pa iy:=aa$ theme:=the3ndpeaks;
 
	//3, 結果を取得して3番目のピークのプロットを作成
	string pp, fitc, resid, peak3;
	pp$ =__PEAK$;
	fitc$ = __FITCURVE$;
	resid$ = __RESIDUAL$;
	getresults tr:=trRes iw:=__REPORT$;
 
	//4, 3番目のピークをSheet1にプロットして比較
	range r_peak =  1!$(ii-1)[1];
	peak3$ = fitc$ + "(7,8)";
 
	plotxy iy:=peak3$ plot:=200;
	graphname$ = %H;	
	insertGraph gname:=graphname$ embed:=1 resizecell:=1 cell:=r_peak;
 
	//5, ピーク情報を追加
	range r_info =  1!$(ii-1)[2:4];
	r_info[1] = trRes.Parameters.xc__3.Value;
	r_info[2] = trRes.Parameters.A__3.Value;
	r_info[3] = trRes.Parameters.w__3.Value;
 
}
page.active=1;

その他のスクリプトサンプル

 

page_top_icon