以下のセクションでは、入力XYデータとしてワークシートまたはグラフから取得可能であることを示しています。ここをクリックしてウィンドウからデータを取得する方法のヘルプを確認できます。
ocmath_create_baseline_by_masking_peaks関数は、正のピークのみ、負のピークのみ、正負両方のピークに対して基線を作成します。
次のサンプルは、入力XYデータ(vx, vy)で、正のピークと負のピークに対して基線を作成する方法を示します。
// 基線のXYベクトルにメモリを確保 vector vxBaseline(vx.GetSize()), vyBaseline(vx.GetSize()); // 基線のXYデータを見つける int nRet = ocmath_create_baseline_by_masking_peaks(vx.GetSize(), vx, vy, vxBaseline.GetSize(), vxBaseline, vyBaseline, BOTH_DIRECTION); // XデータでXYデータを昇順にソート if( OE_NOERROR == nRet ) { vector<uint> vn; vxBaseline.Sort(SORT_ASCENDING, true, vn); vyBaseline.Reorder(vn); }
基線のX座標がピークの曲線のX座標と同じであれば直接減算でき、それ以外の場合、基線を除去する前に補間を行う必要があります。次のコードは、補間を行う方法を示し、基線を除去します。現在のワークシートは、ピークXYデータと基線XYデータの4列を持っています。
Worksheet wks = Project.ActiveLayer(); Column colPeakX(wks, 0), colPeakY(wks, 1); Column colBaseLineX(wks, 2), colBaseLineY(wks, 3); // ピークXYデータを取得 // 基線を減算したいので参照でYデータを取得 vector vPeakX = colPeakX.GetDataObject(); vector& vPeakY = colPeakY.GetDataObject(); // 基線データの取得 vector vBaselineX = colBaseLineX.GetDataObject(); vector vBaselineY = colBaseLineY.GetDataObject(); if( vPeakX.GetSize() != vPeakY.GetSize() || vPeakX.GetSize() == 0 || vBaselineX.GetSize() == 0 ) return; // 基線データの補間を行い、ピークデータと同じX座標を保持 vector vyBaseTemp(vPeakX.GetSize()); if(OE_NOERROR != ocmath_interpolate(vPeakX, vyBaseTemp, vPeakX.GetSize(), vBaselineX, vBaselineY, vBaselineX.GetSize(), INTERP_TYPE_LINEAR)) { return; } // 基線の減算 vPeakY -= vyBaseTemp;
ocmath_find_peaks_* 関数は、複数の方法でピークを見つけるのに使われます。
次のサンプルは、nLocalPtsで選択したローカルスコープの局所最大点を見つける方法を示します。nIndexで印を付けた現在のポイントに対して、スコープは [nIndex-nLocalPts, nIndex+nLocalPts]です。
// 出力ベクターとしてメモリを確保 UINT nDataSize = vxData.GetSize(); vector vxPeaks(nDataSize), vyPeaks(nDataSize); vector<int> vnIndices(nDataSize); // nDataSizeは入力データ, vxData, vyDataのサイズは // 出力データ, ピークの数を返す int nLocalPts = 10; int nRet = ocmath_find_peaks_by_local_maximum( &nDataSize, vxData, vyData, vxPeaks, vyPeaks, vnIndices, POSITIVE_DIRECTION | NEGATIVE_DIRECTION, nLocalPts); if(OE_NOERROR == nRet) { printf("Peak Num=%d\n", nDataSize); vxPeaks.SetSize(nDataSize); vyPeaks.SetSize(nDataSize); }
Origin Cは、次の2つの関数をサポートしています。ocmath_test_peaks_by_height と ocmath_test_peaks_by_numberは、それぞれ指定した高さとピークの数によりピークを確認します。
次は、最小ピーク高さでピークを確認する方法を示すサンプルです。
// 元のYデータから最小値と最大値を取得 double dMin, dMax; vyData.GetMinMax(dMin, dMax); // 最高点、最低点からより大きな値を取得 // そして、20%を乗算し、ピークの最小高さを取得 double dTotalHeight = max(abs(dMax), abs(dMin)); double dPeakMinHeight = dTotalHeight * 20 / 100; // 指定した最小高さでピークを確認 nRet = ocmath_test_peaks_by_height(&nDataSize, vxPeaks, vyPeaks, vnIndices, dPeakMinHeight); printf("Peak Num = %d\n", nDataSize); for(int ii=0; ii<nDataSize; ii++) { printf("Peak %d: (%f,%f)\n", ii+1, vxPeaks[ii], vyPeaks[ii]); }
ocmath_integrate関数は、曲線以下の面積を積分するのに使われます。
次のサンプルは、1つのピークの部分曲線の積分を実行します。
int i1 = 51, i2 = 134; // 1つのピークの部分範囲を設定する開始と終了のインデックス IntegrationResult IntResult; // 出力, 積分結果 vector vIntegral(i2+1); // 出力, 積分データ // 積分し結果を出力 if( OE_NOERROR == ocmath_integrate(vx, vy, i1, i2, &IntResult, vIntegral, MATHEMATICAL_AREA, NULL, false, SEARCH_FROM_PEAK) ) { printf("Peak 1: Peak Index = %d, Area = %g, FWHM = %g, Center = %g, Height = %g\n", IntResult.iPeak, IntResult.Area, IntResult.dxPeak, IntResult.xPeak, IntResult.yPeak); }
Origin CのNLFitSessionクラスは、異なるフィット関数でピークフィットを行うメソッドをサポートしています。