ピーク分析
ベースラインを定義して減算後ピークの分析を行うといった操作をLabTalkで行うスクリプトのサンプルです。
グラフ内のアクティブな曲線を指定した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;
その他のスクリプトサンプル