JSPM

  • Created
  • Published
  • Downloads 1550
  • Score
    100M100P100Q127120F
  • License MIT

Fit spectra using guassian or lorentzian

Package Exports

  • ml-spectra-fitting

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (ml-spectra-fitting) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

NPM version build status npm download

ml-spectra-fitting

Curve fitting method in javascript.

This is spectra fitting package optimize the position (x), max intensity (y), full width at half maximum (width) and the percent of gaussian (mu). It supports three kind of shapes:

Name Equation
Gaussian
Lorentzian
Pseudo Voigt

where

It is a wrapper of ml-levenberg-marquardt

API Documentation

Installation

$ npm install ml-spectra-fitting

Example

// import library
import { optimizeSum } from 'ml-spectra-fitting';
import { generateSpectrum } from 'spectrum-generator';

const peaks = [
  { x: 0.5, y: 0.2, width: 0.2 },
  { x: -0.5, y: 0.2, width: 0.3 },
];
const data = generateSpectrum(peaks, {from: -1, to: 1, nbPoints: 41});


//the approximate values to be optimized, It could come from a peak picking with ml-gsd
let peakList = [
  {
    x: -0.5,
    y: 0.18,
    width: 0.18,
  },
  {
    x: 0.52,
    y: 0.17,
    width: 0.37,
  },
];

// the function recive a peaklist with {x, y, width} as a guess
// and return a list of objects

let fittedParams = optimize(data, peakList);
console.log(fittedParams);
/**
 {
    error: 0.010502794375558983,
    iterations: 15,
    peaks: [
      {
        x: -0.49999760133593774,
        y: 0.1999880261075537,
        width: 0.3000369491704072
      },
      {
        x: 0.5000084944744884,
        y: 0.20004144804853427,
        width: 0.1999731186595336
      }
    ]
  }
 */

For data with and combination of signals with shapes between gaussian and lorentzians, we could use the kind pseudovoigt to fit the data.

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 }, { width: 0.2 });
generator.addPeak(
  { x: -0.5, y: 0.2 },
  {
    width: 0.1,
    shape: {
      kind: 'lorentzian',
      options: {
        fwhm: 1000,
        length: 50001,
        factor: 5
      },
    },
  },
);

//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 peakList = [
  {
    x: -0.5,
    y: 0.22,
    width: 0.25,
  },
  {
    x: 0.52,
    y: 0.18,
    width: 0.18,
  },
];

// the function recive a peaklist with {x, y, width} as a guess
// and return a list of objects
let fittedParams = optimize(data, peakList, { kind: 'pseudovoigt' });

console.log(fittedParams);
/**
{
  error: 0.12361588652854476,
  iterations: 100,
  peaks: [
    {
      x: -0.5000014532421942,
      y: 0.19995307937326137,
      width: 0.10007670374735196,
      mu: 0.004731136777288483
    },
    {
      x: 0.5001051783652894,
      y: 0.19960010175400406,
      width: 0.19935932346969124,
      mu: 1
    }
  ]
}
*/

License

MIT