ml-spectra-fitting
Version:
Fit spectra using gaussian or lorentzian
192 lines (166 loc) • 6.16 kB
Markdown
# ml-spectra-fitting
[](https://www.npmjs.com/package/ml-spectra-fitting)
[](https://www.npmjs.com/package/ml-spectra-fitting)
[](https://codecov.io/gh/mljs/spectra-fitting)
[](https://github.com/mljs/spectra-fitting/blob/main/LICENSE)
This is a spectra fitting package to optimize the position (x), max intensity (y),
full width at half-maximum (FWHM = width) and the ratio of gaussian contribution (mu) if it's required.
It supports three kinds of shapes:
| Name | Equation |
| ------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| Gaussian | <img src="https://tex.cheminfo.org/?tex=y%20%5Ccdot%20exp%20%5Cleft%5B%5Cfrac%7B%5Cdelta%7D%7B2%20%5Csigma%5E2%7D%5Cright%5D"/> |
| Lorentzian | <img src="https://tex.cheminfo.org/?tex=y%5Ccdot%5Cfrac%7B%5Cgamma%7D%7B%5Cdelta%20%2B%20%5Cgamma%7D"/> |
| Pseudo Voigt | <img src="https://tex.cheminfo.org/?tex=y%20*%20%5Cleft%5B%5Cmu%20%5Ccdot%20exp%20%5Cleft%5B%5Cfrac%7B%5Cdelta%7D%7B2%20%5Csigma%5E2%7D%5Cright%5D%20%2B%20(1%20-%20%5Cmu)%20%5Ccdot%20%5Cfrac%7B%5Cgamma%7D%7B%5Cdelta%20%2B%20%5Cgamma%7D%20%5Cright%5D%0A"/> |
where
| <img src="https://tex.cheminfo.org/?tex=%5Cdelta%20%3D%20%5Cleft(t%20-%20x%5Cright)%5E2%0A"/> | <img src="https://tex.cheminfo.org/?tex=%5Csigma%20%3D%20%5Cfrac%7BFWHM%7D%7B2%5Csqrt%7B2%20%5Ccdot%20Ln(2)%7D%7D"/> | <img src="https://tex.cheminfo.org/?tex=%5Cgamma%3D%5Cleft(FWHM%5Cright)%5E2"/> |
| --------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------ |
It is a wrapper of [ml-levenberg-marquardt](https://github.com/mljs/levenberg-marquardt)
## [API Documentation](https://mljs.github.io/spectra-fitting/)
## Installation
```console
npm i ml-spectra-fitting
```
## Example
```js
import { optimize } from 'ml-spectra-fitting';
import { SpectrumGenerator } from 'spectrum-generator';
const generator = new SpectrumGenerator({
nbPoints: 101,
from: -1,
to: 1,
});
// by default the kind of shape is gaussian;
generator.addPeak({ x: 0.5, y: 0.2 }, { fwhm: 0.2 });
generator.addPeak(
{ x: -0.5, y: 0.2 },
{
shape: {
kind: 'lorentzian',
fwhm: 0.1,
},
},
);
//points to fit {x, y};
let data = generator.getSpectrum();
console.log(JSON.stringify({ x: Array.from(data.x), y: Array.from(data.y) }));
//the approximate values to be optimized, It could coming from a peak picking with ml-gsd
let peaks = [
{
x: -0.5,
y: 0.22,
shape: {
kind: 'gaussian',
fwhm: 0.25,
},
},
{
x: 0.52,
y: 0.18,
shape: {
kind: 'gaussian',
fwhm: 0.18,
},
},
];
// the function receive an array of peak with {x, y, fwhm} as a guess
// and return a list of objects
let fittedParams = optimize(data, peaks, { shape: { kind: 'pseudoVoigt' } });
console.log(fittedParams);
const result = {
error: 0.12361588652854476,
iterations: 100,
peaks: [
{
x: -0.5000014532421942,
y: 0.19995307937326137,
shape: {
kind: 'pseudoVoigt',
fwhm: 0.10007670374735196,
mu: 0.004731136777288483,
},
},
{
x: 0.5001051783652894,
y: 0.19960010175400406,
shape: {
kind: 'pseudoVoigt',
fwhm: 0.19935932346969124,
mu: 1,
},
},
],
};
```
For data with and combination of signals with shapes between gaussian and lorentzians, we could use the kind pseudovoigt to fit the data.
```js
import { optimize } from 'ml-spectra-fitting';
import { SpectrumGenerator } from 'spectrum-generator';
const generator = new SpectrumGenerator({
nbPoints: 101,
from: -1,
to: 1,
});
// by default the kind of shape is gaussian;
generator.addPeak({ x: 0.5, y: 0.2 }, { fwhm: 0.2 });
generator.addPeak(
{ x: -0.5, y: 0.2 },
{
shape: {
kind: 'lorentzian',
fwhm: 0.1,
},
},
);
//points to fit {x, y};
let data = generator.getSpectrum();
console.log(JSON.stringify({ x: Array.from(data.x), y: Array.from(data.y) }));
//the approximate values to be optimized, It could coming from a peak picking with ml-gsd
let peaks = [
{
x: -0.5,
y: 0.22,
shape: {
kind: 'gaussian',
fwhm: 0.25,
},
},
{
x: 0.52,
y: 0.18,
shape: {
kind: 'gaussian',
fwhm: 0.18,
},
},
];
// the function receive an array of peak with {x, y, fwhm} as a guess
// and return a list of objects
let fittedParams = optimize(data, peaks, { shape: { kind: 'pseudoVoigt' } });
console.log(fittedParams);
const result = {
error: 0.12361588652854476,
iterations: 100,
peaks: [
{
x: -0.5000014532421942,
y: 0.19995307937326137,
shape: {
kind: 'pseudoVoigt',
fwhm: 0.10007670374735196,
mu: 0.004731136777288483,
},
},
{
x: 0.5001051783652894,
y: 0.19960010175400406,
shape: {
kind: 'pseudoVoigt',
fwhm: 0.19935932346969124,
mu: 1,
},
},
],
};
```
## License
[MIT](./LICENSE)