ピークと基線
グラフまたはワークシートから入力XYデータを取得
以下のセクションでは、入力XYデータとしてワークシートまたはグラフから取得可能であることを示しています。ここをクリックしてウィンドウからデータを取得する方法のヘルプを確認できます。
基線を作成Baseline, Create
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);
}
基線を削除Baseline, Remove
基線の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;
ピークを検索Peaks, Find
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]);
}
ピークの積分とフィット Peaks, IntegratePeaks, Fit
ピークの積分
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クラスは、異なるフィット関数でピークフィットを行うメソッドをサポートしています。
|