{"version":3,"file":"spectrum-generator.js","sources":["../node_modules/ml-peak-shape-generator/src/util/constants.js","../node_modules/ml-peak-shape-generator/src/util/erfinv.js","../node_modules/ml-peak-shape-generator/src/classes/Gaussian.js","../node_modules/ml-peak-shape-generator/src/classes/Lorentzian.js","../node_modules/ml-peak-shape-generator/src/classes/PseudoVoigt.js","../node_modules/ml-peak-shape-generator/src/util/getShapeGenerator.js","../src/util/addBaseline.js","../node_modules/d3-random/src/defaultSource.js","../node_modules/d3-random/src/uniform.js","../node_modules/d3-random/src/normal.js","../node_modules/ml-xsadd/lib-es6/xsadd.js","../src/util/addNoise.js","../src/index.js"],"sourcesContent":["export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n\nexport default function erfinv(x) {\n  let a = 0.147;\n  if (x === 0) return 0;\n  let ln1MinusXSqrd = Math.log(1 - x * x);\n  let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n  let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n  let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n  return secondSqrt * (x > 0 ? 1 : -1);\n}\n","import {\n  ROOT_2LN2,\n  GAUSSIAN_EXP_FACTOR,\n  ROOT_PI_OVER_LN2,\n} from '../util/constants';\nimport erfinv from '../util/erfinv';\n\nexport class Gaussian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm = 500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.sd] - Standard deviation, if it's defined options.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    this.fwhm = options.sd\n      ? Gaussian.widthToFWHM(2 * options.sd)\n      : options.fwhm\n      ? options.fwhm\n      : 500;\n    this.height =\n      options.height === undefined\n        ? Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI) / this.fwhm\n        : options.height;\n  }\n  /**\n   * Calculate a gaussian shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor = 6] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {number} [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return {Float64Array} y values\n   */\n\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n\n    if (!length) {\n      length = Math.min(Math.ceil(this.fwhm * factor), Math.pow(2, 25) - 1);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a gaussian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @returns {number} - the y value of gaussian with the current parameters.\n   */\n  fct(x) {\n    return Gaussian.fct(x, this.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999]\n   * @returns {number}\n   */\n  getFactor(area = 0.9999) {\n    return Gaussian.getFactor(area);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n\n  getArea() {\n    return Gaussian.getArea(this.fwhm, { height: this.height });\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n   * //https://mathworld.wolfram.com/GaussianFunction.html\n   * @param {number} width - Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    //https://mathworld.wolfram.com/GaussianFunction.html\n    return Gaussian.widthToFWHM(width);\n  }\n\n  /**\n   * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n   * //https://mathworld.wolfram.com/GaussianFunction.html\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @returns {number} width\n   */\n  fwhmToWidth(fwhm = this.fwhm) {\n    return Gaussian.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nGaussian.fct = function fct(x, fwhm = 500) {\n  return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) from the width between the inflection points.\n * //https://mathworld.wolfram.com/GaussianFunction.html\n * @param {number} width - Width between the inflection points\n * @returns {number} fwhm\n */\nGaussian.widthToFWHM = function widthToFWHM(width) {\n  return width * ROOT_2LN2;\n};\n\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * //https://mathworld.wolfram.com/GaussianFunction.html\n * @param {number} fwhm - Full Width at Half Maximum.\n * @returns {number} width\n */\nGaussian.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_2LN2;\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {object} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\n\nGaussian.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1 } = options;\n  return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage.\n * @param {number} [area=0.9999]\n * @returns {number}\n */\nGaussian.getFactor = function getFactor(area = 0.9999) {\n  return Math.sqrt(2) * erfinv(area);\n};\n","import { ROOT_THREE } from '../util/constants';\n\nexport class Lorentzian {\n  /**\n   * @param {object} [options = {}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm = 500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.sd] - Standard deviation, if it's defined options.fwhm will be ignored and the value will be computed sd * Math.sqrt(8 * Math.LN2);\n   */\n  constructor(options = {}) {\n    this.fwhm = options.fwhm === undefined ? 500 : options.fwhm;\n    this.height =\n      options.height === undefined ? 2 / Math.PI / this.fwhm : options.height;\n  }\n  /**\n   * Calculate a lorentzian shape\n   * @param {object} [options = {}]\n   * @param {number} [options.factor = Math.tan(Math.PI * (0.9999 - 0.5))] - Number of time to take fwhm to calculate length. Default covers 99.99 % of area.\n   * @param {number} [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return {Float64Array} y values\n   */\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n\n    if (!length) {\n      length = Math.min(Math.ceil(this.fwhm * factor), Math.pow(2, 25) - 1);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a lorentzian shape (see README for equation).\n   * @param {number} x - x value to calculate.\n   * @returns {number} - the y value of lorentzian with the current parameters.\n   */\n  fct(x) {\n    return Lorentzian.fct(x, this.fwhm);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999]\n   * @returns {number}\n   */\n  getFactor(area = 0.9999) {\n    return Lorentzian.getFactor(area);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n\n  getArea() {\n    return Lorentzian.getArea(this.fwhm, { height: this.height });\n  }\n\n  /**\n   * Compute the value of width between the inflection points of a specific shape from Full Width at Half Maximum (FWHM).\n   * //https://mathworld.wolfram.com/LorentzianFunction.html\n   * @param {number} [fwhm] - Full Width at Half Maximum.\n   * @returns {number} width between the inflection points\n   */\n  fwhmToWidth(fwhm = this.fwhm) {\n    return Lorentzian.fwhmToWidth(fwhm);\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FWHM) of a specific shape from the width between the inflection points.\n   * //https://mathworld.wolfram.com/LorentzianFunction.html\n   * @param {number} [width] Width between the inflection points\n   * @returns {number} fwhm\n   */\n  widthToFWHM(width) {\n    return Lorentzian.widthToFWHM(width);\n  }\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nLorentzian.fct = function fct(x, fwhm) {\n  const squareFWHM = fwhm * fwhm;\n  return squareFWHM / (4 * Math.pow(x, 2) + squareFWHM);\n};\n\n/**\n * Compute the value of width between the inflection points of a specific shape from Full Width at Half Maximum (FWHM).\n * //https://mathworld.wolfram.com/LorentzianFunction.html\n * @param {number} [fwhm] - Full Width at Half Maximum.\n * @returns {number} width between the inflection points\n */\nLorentzian.fwhmToWidth = function fwhmToWidth(fwhm) {\n  return fwhm / ROOT_THREE;\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FWHM) of a specific shape from the width between the inflection points.\n * //https://mathworld.wolfram.com/LorentzianFunction.html\n * @param {number} [width] Width between the inflection points\n * @returns {number} fwhm\n */\nLorentzian.widthToFWHM = function widthToFWHM(width) {\n  return width * ROOT_THREE;\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {*} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\nLorentzian.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1 } = options;\n\n  return (height * Math.PI * fwhm) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage\n * @param {number} [area=0.9999]\n * @returns {number}\n */\nLorentzian.getFactor = function getFactor(area = 0.9999) {\n  return 2 * Math.tan(Math.PI * (area - 0.5));\n};\n","import {\n  GAUSSIAN_EXP_FACTOR,\n  ROOT_2LN2_MINUS_ONE,\n  ROOT_PI_OVER_LN2,\n} from '../util/constants';\n\nimport { Gaussian } from './Gaussian';\nimport { Lorentzian } from './Lorentzian';\n\nexport class PseudoVoigt {\n  /**\n   * @param {object} [options={}]\n   * @param {number} [options.height=x] Define the height of the peak, by default area=1 (normalized)\n   * @param {number} [options.fwhm=500] - Full Width at Half Maximum in the number of points in FWHM.\n   * @param {number} [options.mu=0.5] - ratio of gaussian contribution.\n   */\n\n  constructor(options = {}) {\n    this.mu = options.mu === undefined ? 0.5 : options.mu;\n    this.fwhm = options.fwhm === undefined ? 500 : options.fwhm;\n    this.height =\n      options.height === undefined\n        ? 1 /\n          ((this.mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * this.fwhm +\n            ((1 - this.mu) * this.fwhm * Math.PI) / 2)\n        : options.height;\n  }\n\n  /**\n   * Calculate a linear combination of gaussian and lorentzian function width an same full width at half maximum\n   * @param { object } [options = {}]\n   * @param { number } [options.factor = 2 * Math.tan(Math.PI * (0.9999 - 0.5))] - Number of time to take fwhm in the calculation of the length.Default covers 99.99 % of area.\n   * @param { number } [options.length = fwhm * factor + 1] - total number of points to calculate\n   * @return { object } - { fwhm, data<Float64Array>} - An with the number of points at half maximum and the array of y values covering the 99.99 % of the area.\n   */\n\n  getData(options = {}) {\n    let { length, factor = this.getFactor() } = options;\n    if (!length) {\n      length = Math.ceil(this.fwhm * factor);\n      if (length % 2 === 0) length++;\n    }\n\n    const center = (length - 1) / 2;\n\n    let data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n      data[i] = this.fct(i - center) * this.height;\n      data[length - 1 - i] = data[i];\n    }\n\n    return data;\n  }\n\n  /**\n   * Return a parameterized function of a linear combination of Gaussian and Lorentzian shapes where the full width at half maximum are the same for both kind of shapes (see README for equation).\n   * @param {number} [x] x value to calculate.\n   * @returns {number} - the y value of a pseudo voigt with the current parameters.\n   */\n\n  fct(x) {\n    return PseudoVoigt.fct(x, this.fwhm, this.mu);\n  }\n\n  /**\n   * Calculate the number of times FWHM allows to reach a specific area coverage\n   * @param {number} [area=0.9999] - required area to be coverage\n   * @param {number} [mu=this.mu] - ratio of gaussian contribution.\n   * @returns {number}\n   */\n  getFactor(area = 0.9999, mu = this.mu) {\n    return PseudoVoigt.getFactor(area, mu);\n  }\n\n  /**\n   * Calculate the area of the shape.\n   * @returns {number} - returns the area.\n   */\n  getArea() {\n    return PseudoVoigt.getArea(this.fwhm, { height: this.height, mu: this.mu });\n  }\n\n  /**\n   * Compute the value of Full Width at Half Maximum (FMHM) from width between the inflection points.\n   * @param {number} width - width between the inflection points\n   * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n   * @returns {number} Full Width at Half Maximum (FMHM).\n   */\n  widthToFWHM(width, mu) {\n    return PseudoVoigt.widthToFWHM(width, mu);\n  }\n  /**\n   * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n   * @param {number} fwhm - Full Width at Half Maximum.\n   * @param {number} [mu] - ratio of gaussian contribution.\n   * @returns {number} width between the inflection points.\n   */\n  fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n    return PseudoVoigt.fwhmToWidth(fwhm, mu);\n  }\n\n  /**\n   * set a new full width at half maximum\n   * @param {number} fwhm - full width at half maximum\n   */\n  setFWHM(fwhm) {\n    this.fwhm = fwhm;\n  }\n\n  /**\n   * set a new height\n   * @param {number} height - The maximal intensity of the shape.\n   */\n  setHeight(height) {\n    this.height = height;\n  }\n\n  /**\n   * set a new mu\n   * @param {number} mu - ratio of gaussian contribution.\n   */\n  setMu(mu) {\n    this.mu = mu;\n  }\n}\n\n/**\n * Return a parameterized function of a gaussian shape (see README for equation).\n * @param {number} x - x value to calculate.\n * @param {number} fwhm - full width half maximum\n * @param {number} [mu=0.5] - ratio of gaussian contribution.\n * @returns {number} - the y value of gaussian with the current parameters.\n */\nPseudoVoigt.fct = function fct(x, fwhm, mu = 0.5) {\n  return (1 - mu) * Lorentzian.fct(x, fwhm) + mu * Gaussian.fct(x, fwhm);\n};\n\n/**\n * Compute the value of Full Width at Half Maximum (FMHM) from width between the inflection points.\n * @param {number} width - width between the inflection points\n * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} Full Width at Half Maximum (FMHM).\n */\nPseudoVoigt.widthToFWHM = function widthToFWHM(width, mu = 0.5) {\n  return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\n/**\n * Compute the value of width between the inflection points from Full Width at Half Maximum (FWHM).\n * @param {number} fwhm - Full Width at Half Maximum.\n * @param {number} [mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} width between the inflection points.\n */\nPseudoVoigt.fwhmToWidth = function fwhmToWidth(fwhm, mu = 0.5) {\n  return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\n\n/**\n * Calculate the area of a specific shape.\n * @param {number} fwhm - Full width at half maximum.\n * @param {*} [options = {}] - options.\n * @param {number} [options.height = 1] - Maximum y value of the shape.\n * @param {number} [options.mu = 0.5] - ratio of gaussian contribution.\n * @returns {number} - returns the area of the specific shape and parameters.\n */\nPseudoVoigt.getArea = function getArea(fwhm, options = {}) {\n  let { height = 1, mu = 0.5 } = options;\n  return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\n\n/**\n * Calculate the number of times FWHM allows to reach a specific area coverage\n * @param {number} [area=0.9999] - required area to be coverage\n * @param {number} [mu=this.mu] - ratio of gaussian contribution.\n * @returns {number}\n */\nPseudoVoigt.getFactor = function getFactor(area = 0.9999, mu = 0.5) {\n  return mu < 1 ? Lorentzian.getFactor(area) : Gaussian.getFactor(area);\n};\n","import { Gaussian } from '../classes/Gaussian';\nimport { Lorentzian } from '../classes/Lorentzian';\nimport { PseudoVoigt } from '../classes/PseudoVoigt';\n\nexport function getShapeGenerator(options) {\n  let { kind = 'Gaussian', options: shapeOptions } = options;\n  switch (kind.toLowerCase().replace(/[^a-z]/g, '')) {\n    case 'gaussian':\n      return new Gaussian(shapeOptions);\n    case 'lorentzian':\n      return new Lorentzian(shapeOptions);\n    case 'pseudovoigt':\n      return new PseudoVoigt(shapeOptions);\n    default:\n      throw new Error(`Unknown kind: ${kind}`);\n  }\n}\n","export default function addBaseline(data, baselineFct) {\n  if (!baselineFct) return data;\n  let xs = data.x;\n  let ys = data.y;\n  for (let i = 0; i < xs.length; i++) {\n    ys[i] += baselineFct(xs[i]);\n  }\n  return data;\n}\n","export default Math.random;\n","import defaultSource from \"./defaultSource.js\";\n\nexport default (function sourceRandomUniform(source) {\n  function randomUniform(min, max) {\n    min = min == null ? 0 : +min;\n    max = max == null ? 1 : +max;\n    if (arguments.length === 1) max = min, min = 0;\n    else max -= min;\n    return function() {\n      return source() * max + min;\n    };\n  }\n\n  randomUniform.source = sourceRandomUniform;\n\n  return randomUniform;\n})(defaultSource);\n","import defaultSource from \"./defaultSource.js\";\n\nexport default (function sourceRandomNormal(source) {\n  function randomNormal(mu, sigma) {\n    var x, r;\n    mu = mu == null ? 0 : +mu;\n    sigma = sigma == null ? 1 : +sigma;\n    return function() {\n      var y;\n\n      // If available, use the second previously-generated uniform random.\n      if (x != null) y = x, x = null;\n\n      // Otherwise, generate a new x and y.\n      else do {\n        x = source() * 2 - 1;\n        y = source() * 2 - 1;\n        r = x * x + y * y;\n      } while (!r || r > 1);\n\n      return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);\n    };\n  }\n\n  randomNormal.source = sourceRandomNormal;\n\n  return randomNormal;\n})(defaultSource);\n","const LOOP = 8;\nconst FLOAT_MUL = 1 / 16777216;\nconst sh1 = 15;\nconst sh2 = 18;\nconst sh3 = 11;\nfunction multiply_uint32(n, m) {\n    n >>>= 0;\n    m >>>= 0;\n    const nlo = n & 0xffff;\n    const nhi = n - nlo;\n    return (((nhi * m) >>> 0) + nlo * m) >>> 0;\n}\nexport default class XSadd {\n    constructor(seed = Date.now()) {\n        this.state = new Uint32Array(4);\n        this.init(seed);\n        this.random = this.getFloat.bind(this);\n    }\n    /**\n     * Returns a 32-bit integer r (0 <= r < 2^32)\n     */\n    getUint32() {\n        this.nextState();\n        return (this.state[3] + this.state[2]) >>> 0;\n    }\n    /**\n     * Returns a floating point number r (0.0 <= r < 1.0)\n     */\n    getFloat() {\n        return (this.getUint32() >>> 8) * FLOAT_MUL;\n    }\n    init(seed) {\n        if (!Number.isInteger(seed)) {\n            throw new TypeError('seed must be an integer');\n        }\n        this.state[0] = seed;\n        this.state[1] = 0;\n        this.state[2] = 0;\n        this.state[3] = 0;\n        for (let i = 1; i < LOOP; i++) {\n            this.state[i & 3] ^=\n                (i +\n                    multiply_uint32(1812433253, this.state[(i - 1) & 3] ^ ((this.state[(i - 1) & 3] >>> 30) >>> 0))) >>>\n                    0;\n        }\n        this.periodCertification();\n        for (let i = 0; i < LOOP; i++) {\n            this.nextState();\n        }\n    }\n    periodCertification() {\n        if (this.state[0] === 0 &&\n            this.state[1] === 0 &&\n            this.state[2] === 0 &&\n            this.state[3] === 0) {\n            this.state[0] = 88; // X\n            this.state[1] = 83; // S\n            this.state[2] = 65; // A\n            this.state[3] = 68; // D\n        }\n    }\n    nextState() {\n        let t = this.state[0];\n        t ^= t << sh1;\n        t ^= t >>> sh2;\n        t ^= this.state[3] << sh3;\n        this.state[0] = this.state[1];\n        this.state[1] = this.state[2];\n        this.state[2] = this.state[3];\n        this.state[3] = t;\n    }\n}\n","import { randomUniform, randomNormal } from 'd3-random';\nimport XSAdd from 'ml-xsadd';\n\nexport default function addNoise(data, percent = 0, options = {}) {\n  const { distribution = 'uniform', seed } = options;\n\n  let generateRandomNumber;\n  switch (distribution) {\n    case 'uniform': {\n      generateRandomNumber = getRandom(randomUniform, seed, -0.5, 0.5);\n      break;\n    }\n    case 'normal': {\n      generateRandomNumber = getRandom(randomNormal, seed);\n      break;\n    }\n    default:\n      throw new Error(`Unknown distribution ${options.distribution}`);\n  }\n\n  if (!percent) return data;\n  let ys = data.y;\n  let factor = (percent * findMax(ys)) / 100;\n  for (let i = 0; i < ys.length; i++) {\n    ys[i] += generateRandomNumber() * factor;\n  }\n  return data;\n}\n\nfunction getRandom(func, seed, ...args) {\n  return typeof seed === 'number'\n    ? func.source(new XSAdd(seed).random)(...args)\n    : func(...args);\n}\n\nfunction findMax(array) {\n  let max = Number.MIN_VALUE;\n  for (let item of array) {\n    if (item > max) max = item;\n  }\n  return max;\n}\n","import { getShapeGenerator } from 'ml-peak-shape-generator';\n\nimport addBaseline from './util/addBaseline.js';\nimport addNoise from './util/addNoise.js';\n\nexport class SpectrumGenerator {\n  /**\n   *\n   * @param {object} [options={}]\n   * @param {number} [options.from=0]\n   * @param {number} [options.to=0]\n   * @param {function} [options.nbPoints=10001]\n   * @param {number} [options.factor] default value depends of the shape in order to cover 99.99% of the surface\n   * @param {object} [options.shape={kind:'gaussian'}]\n   * @param {string} [options.shape.kind] kind of shape, gaussian, lorentzian or pseudovoigt\n   * @param {object} [options.shape.options] options for the shape (like `mu` for pseudovoigt)\n   */\n  constructor(options = {}) {\n    options = Object.assign(\n      {},\n      {\n        from: 0,\n        to: 1000,\n        nbPoints: 10001,\n        peakWidthFct: () => 5,\n        shape: {\n          kind: 'gaussian',\n        },\n      },\n      options,\n    );\n\n    this.from = options.from;\n    this.to = options.to;\n    this.nbPoints = options.nbPoints;\n    this.interval = (this.to - this.from) / (this.nbPoints - 1);\n    this.peakWidthFct = options.peakWidthFct;\n    this.maxPeakHeight = Number.MIN_SAFE_INTEGER;\n\n    let shapeGenerator = getShapeGenerator(options.shape);\n    this.shape = shapeGenerator;\n\n    assertNumber(this.from, 'from');\n    assertNumber(this.to, 'to');\n    assertInteger(this.nbPoints, 'nbPoints');\n\n    if (this.to <= this.from) {\n      throw new RangeError('to option must be larger than from');\n    }\n\n    if (typeof this.peakWidthFct !== 'function') {\n      throw new TypeError('peakWidthFct option must be a function');\n    }\n\n    this.reset();\n  }\n\n  addPeaks(peaks, options) {\n    if (\n      !Array.isArray(peaks) &&\n      (typeof peaks !== 'object' ||\n        peaks.x === undefined ||\n        peaks.y === undefined ||\n        !Array.isArray(peaks.x) ||\n        !Array.isArray(peaks.y) ||\n        peaks.x.length !== peaks.y.length)\n    ) {\n      throw new TypeError(\n        'peaks must be an array or an object containing x[] and y[]',\n      );\n    }\n    if (Array.isArray(peaks)) {\n      for (const peak of peaks) {\n        this.addPeak(peak, options);\n      }\n    } else {\n      for (let i = 0; i < peaks.x.length; i++) {\n        this.addPeak([peaks.x[i], peaks.y[i]], options);\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   *\n   * @param {[x,y]|[x,y,w]|{x,y,width}} [peak]\n   * @param {*} options\n   */\n  addPeak(peak, options = {}) {\n    if (\n      typeof peak !== 'object' ||\n      (peak.length !== 2 &&\n        peak.length !== 3 &&\n        (peak.x === undefined || peak.y === undefined))\n    ) {\n      throw new Error(\n        'peak must be an array with two (or three) values or an object with {x,y,width?}',\n      );\n    }\n\n    let xPosition;\n    let intensity;\n    let peakWidth;\n    let peakOptions;\n    if (Array.isArray(peak)) {\n      [xPosition, intensity, peakWidth, peakOptions] = peak;\n    } else {\n      xPosition = peak.x;\n      intensity = peak.y;\n      peakWidth = peak.width;\n      peakOptions = peak.options;\n    }\n\n    if (intensity > this.maxPeakHeight) this.maxPeakHeight = intensity;\n\n    let {\n      width = peakWidth === undefined\n        ? this.peakWidthFct(xPosition)\n        : peakWidth,\n      widthLeft,\n      widthRight,\n      shape: shapeOptions,\n    } = options;\n\n    if (peakOptions) {\n      Object.assign(shapeOptions || {}, peakOptions || {});\n    }\n\n    let shapeGenerator = shapeOptions\n      ? getShapeGenerator(shapeOptions)\n      : this.shape;\n\n    if (!widthLeft) widthLeft = width;\n    if (!widthRight) widthRight = width;\n\n    let factor =\n      options.factor === undefined\n        ? shapeGenerator.getFactor()\n        : options.factor;\n\n    const firstValue = xPosition - (widthLeft / 2) * factor;\n    const lastValue = xPosition + (widthRight / 2) * factor;\n\n    const firstPoint = Math.max(\n      0,\n      Math.floor((firstValue - this.from) / this.interval),\n    );\n    const lastPoint = Math.min(\n      this.nbPoints - 1,\n      Math.ceil((lastValue - this.from) / this.interval),\n    );\n    const middlePoint = Math.round((xPosition - this.from) / this.interval);\n    // PEAK SHAPE MAY BE ASYMMETRC (widthLeft and widthRight) !\n    // we calculate the left part of the shape\n\n    shapeGenerator.setFWHM(widthLeft);\n    for (let index = firstPoint; index < Math.max(middlePoint, 0); index++) {\n      this.data.y[index] +=\n        intensity * shapeGenerator.fct(this.data.x[index] - xPosition);\n    }\n\n    // we calculate the right part of the gaussian\n    shapeGenerator.setFWHM(widthRight);\n    for (\n      let index = Math.min(middlePoint, lastPoint);\n      index <= lastPoint;\n      index++\n    ) {\n      this.data.y[index] +=\n        intensity * shapeGenerator.fct(this.data.x[index] - xPosition);\n    }\n\n    return this;\n  }\n\n  addBaseline(baselineFct) {\n    addBaseline(this.data, baselineFct);\n    return this;\n  }\n\n  addNoise(percent, options) {\n    addNoise(this.data, percent, options);\n    return this;\n  }\n\n  getSpectrum(options = {}) {\n    if (typeof options === 'boolean') {\n      options = { copy: options };\n    }\n    const { copy = true, threshold = 0 } = options;\n    if (threshold) {\n      let minPeakHeight = this.maxPeakHeight * threshold;\n      let x = [];\n      let y = [];\n      for (let i = 0; i < this.data.x.length; i++) {\n        if (this.data.y[i] >= minPeakHeight) {\n          x.push(this.data.x[i]);\n          y.push(this.data.y[i]);\n        }\n      }\n      return { x, y };\n    }\n    if (copy) {\n      return {\n        x: this.data.x.slice(),\n        y: this.data.y.slice(),\n      };\n    } else {\n      return this.data;\n    }\n  }\n\n  reset() {\n    const spectrum = (this.data = {\n      x: new Float64Array(this.nbPoints),\n      y: new Float64Array(this.nbPoints),\n    });\n\n    for (let i = 0; i < this.nbPoints; i++) {\n      spectrum.x[i] = this.from + i * this.interval;\n    }\n\n    return this;\n  }\n}\n\nfunction assertInteger(value, name) {\n  if (!Number.isInteger(value)) {\n    throw new TypeError(`${name} option must be an integer`);\n  }\n}\n\nfunction assertNumber(value, name) {\n  if (!Number.isFinite(value)) {\n    throw new TypeError(`${name} option must be a number`);\n  }\n}\n\nexport function generateSpectrum(peaks, options = {}) {\n  const generator = new SpectrumGenerator(options);\n\n  generator.addPeaks(peaks, options);\n  if (options.baseline) generator.addBaseline(options.baseline);\n  if (options.noise) generator.addNoise(options.noise.percent, options.noise);\n  return generator.getSpectrum({\n    threshold: options.threshold,\n  });\n}\n"],"names":["GAUSSIAN_EXP_FACTOR","Math","LN2","ROOT_PI_OVER_LN2","sqrt","PI","ROOT_THREE","ROOT_2LN2","ROOT_2LN2_MINUS_ONE","erfinv","x","a","ln1MinusXSqrd","log","lnEtcBy2Plus2","firstSqrt","secondSqrt","Gaussian","constructor","options","fwhm","sd","widthToFWHM","height","undefined","getData","length","factor","getFactor","min","ceil","pow","center","data","Float64Array","i","fct","area","getArea","width","fwhmToWidth","setFWHM","setHeight","exp","Lorentzian","squareFWHM","tan","PseudoVoigt","mu","setMu","getShapeGenerator","kind","shapeOptions","toLowerCase","replace","Error","addBaseline","baselineFct","xs","ys","y","random","sourceRandomUniform","source","randomUniform","max","arguments","defaultSource","sourceRandomNormal","randomNormal","sigma","r","LOOP","FLOAT_MUL","sh1","sh2","sh3","multiply_uint32","n","m","nlo","nhi","XSadd","seed","Date","now","state","Uint32Array","init","getFloat","bind","getUint32","nextState","Number","isInteger","TypeError","periodCertification","t","addNoise","percent","distribution","generateRandomNumber","getRandom","findMax","func","args","XSAdd","array","MIN_VALUE","item","SpectrumGenerator","Object","assign","from","to","nbPoints","peakWidthFct","shape","interval","maxPeakHeight","MIN_SAFE_INTEGER","shapeGenerator","assertNumber","assertInteger","RangeError","reset","addPeaks","peaks","Array","isArray","peak","addPeak","xPosition","intensity","peakWidth","peakOptions","widthLeft","widthRight","firstValue","lastValue","firstPoint","floor","lastPoint","middlePoint","round","index","getSpectrum","copy","threshold","minPeakHeight","push","slice","spectrum","value","name","isFinite","generateSpectrum","generator","baseline","noise"],"mappings":"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"}