Find peaks in 2D-Spectra and calculate peak-volume?

Dear all,

I have some three-dimensional peaks on a plane (two-dimensional spectrum) and wondered whether there is an existing macro to automatically find these peaks and calculate their peak volumes?

Maybe someone stumbled over this in the past or is actively working with something like this?

If not, what would be the best general way to approach this problem?

Especially I wondered what would be the best (mathematically sound) way to calculate peak volumes?

Thanks for any help!

Best regards,
Peter
Well, here is a function I wrote for another customer that uses ImageAnalyzeParticles to find spots in a 2D wave. It then fits a two-dimensional Gaussian to each spot it finds. The coefficients for the 2D Gaussian are stored in a multi-column wave, one row per spot. You would then need to figure out how to compute the volume for each spot.

Note that this won't do the right thing if the spots overlap. If there are overlapping spots, the problem gets much more complicated.


Function DoParticleAnalysis(imageW)
	Wave imageW
	
	// First, find the spots
	ImageThreshold/I/M=0/T=800/Q imageW
	Wave M_ImageThresh
	ImageAnalyzeParticles /E/W/Q/M=3/A=3 stats, M_ImageThresh
	
	Wave W_ImageObjArea
	Variable nSpots = DimSize(W_ImageObjArea, 0)
	
	// Now we have an estimate of the spot locations- we can now loop through the spots and do fits
	Wave W_xmin, W_xmax, W_ymin, W_ymax
	WaveStats/Q W_ImageObjArea
	Variable maxArea = V_avg+3*V_sdev	// try to eliminate obviously bad "spots"
	Variable i
	Variable V_fitOptions=4
	Variable V_fitError
	Make/N=(nSpots, 7)/O $(nameOfWave(imageW)+"fits")
	Wave results = $(nameOfWave(imageW)+"fits")
	results = nan
	for (i = 0; i < nSpots; i += 1)
		if (W_ImageObjArea[i] > maxArea)
			continue		// this spot looks like a bad one- go around for another
		endif
		
		V_fitError = 0
		// Fit a 2D gaussian to just one spot. The -3, +3 bit is to include sufficient background to get a reliable fit
		CurveFit/N/Q Gauss2d imageW[W_xmin[i]-3, W_xmax[i]+3][W_ymin[i]-3, W_ymax[i]+3]
		Wave W_coef
		if (V_fitError == 0)
			results[i][] = W_coef[q]
		endif
	endfor
end


John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
The image analysis expert has pointed out to me that the function has a hard-coded threshold value of 800. You will need to adjust the code for your data.

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com