ピークと基線


グラフまたはワークシートから入力XYデータを取得

以下のセクションでは、入力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_heightocmath_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クラスは、異なるフィット関数でピークフィットを行うメソッドをサポートしています。