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