Multipeak fitting


        I would like to make a wish for some developments in multipeak fit package. I am using this package to fit core-level spectrum. Our results usually contain doublet and multi-component of voigt function with shifted energies. In order to fit them, I have to make sure all components having same lorentzian width. Hence, I have difficulties in using the current version (2.0) as following:

I have to fit with two singlet voigt function and fix parameters to force them having same width. Then apply these values to the other doublet components. It would be great if one user defined doublet of voigt function could be an option for fitting the width together with different positions.  

By the way, I am still using the package to fit doublet data. It works but takes a lot time "try and error" by fixing width and shape of the voigt function in order to be scientific reasonable. (Mathematically, the package is perfect)

If you would still develop the multipeak fit package to be more perfect, I am looking forward to see doublet options. Thank you very much!




I read that as two separate requests:

1) You would like to have a Voigt function where you can define the Gauss and Lorentz widths separately without the 'shape' parameter. This would need a different implementation of the Voigt function in Igor. Would be nice to have, indeed.

If you can live with a pseudo-Voigt function or a numerical Voigt function (i.e., a numerical convolution), then you could have this immediately. 'All it needs' is to write a custom fit function for the Multi-Peak Fit 2 (MPF2) package. When you are well versed in programming in Igor, you could try for yourself. Execute 

DisplayHelpTopic "Adding Your Own Peak Function"

in the command line with the package loaded. If I find the time, I might give it a shot.

2) You would like to have a doublet function which already includes two peaks. While this could be convenient, it is a rather special case and would be horrible to automatically guess by the program. I think it is better to take two individual peaks and link them via constraints, no? If 1) is fulfilled, would that work for you?

There is a very old user project, which is dedicated to solve the problem you describe. You may want to give it a look, but I have never used it and do not know if it works at all:

At one point I had written functions for a photoemission doublet of any brand It is not really that difficult to write. It may be cumbersome to adapt to the control panel inputs in the MPF package.

chozo: As you might be interested, contact me off-line for my thoughts.

In reply to by chozo

Hi, Chozo


                 It is great to hear from you. Actually I have read many of your posts and find them very helpful. I would like to thank you first for your contributions. I will try to write the custom fit function and I hope it is not beyond my ability in programming. Furthermore, I have another question regarding to analyse ARPES data. In the experimental set up in our lab, we have horizontal analyser slit and two rotation axis (polar and azimuth), which only allows me to map the 2D surface Brillouin zone by rotating azimuth. Do you know some references that deal with this kind of data plot? Thank you very much for your time!





Hi Weimin,

Great, thank you for you kind comment. You can start writing you own peak functions easier by copying and modifying the official functions within the PeakFunctions2.ipf file. Even if it is too difficult to write a Voigt function in the end, it is a good exercise which might come in handy later. Just write here if you have problems. You need these four functions:

XXX_PeakFuncInfo(), GaussToXXXGuess(), XXXPeak(), and XXXPeakParams()

Do you know some references that deal with this kind of data plot?

I am not sure I understand. Do you want to hear some good papers where methods are explained? I think this is quite a standard way of doing a Brillouin zone map, but I cannot tell you some references from the to of my head atm. Does your Analyzer cover the full angular range in the perpendicular direction so that you need to rotate only one angle?

Unfortunately I am unable to get to the files with the code until after a few weeks. As I recall, I hard coded the offset and relative area as parameters rather than as constraints.