{"version":3,"file":"mgf-parser.min.js","sources":["../node_modules/is-any-array/src/index.js","../node_modules/ml-array-max/node_modules/is-any-array/src/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-array-sum/node_modules/is-any-array/src/index.js","../node_modules/ml-array-sum/lib-es6/index.js","../node_modules/ml-array-normed/lib-es6/index.js","../node_modules/ml-array-xy-sort-x/src/index.js","../node_modules/ml-arrayxy-uniquex/src/index.js","../src/index.js"],"sourcesContent":["const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n","'use strict';\n\nconst toString = Object.prototype.toString;\n\nfunction isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n\nmodule.exports = isAnyArray;\n","import isArray from 'is-any-array';\n\n/**\n * Computes the maximum of the given values\n * @param {Array<number>} input\n * @return {number}\n */\n\nfunction max(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var maxValue = input[0];\n\n  for (var i = 1; i < input.length; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport default max;\n","'use strict';\n\nconst toString = Object.prototype.toString;\n\nfunction isAnyArray(object) {\n  return toString.call(object).endsWith('Array]');\n}\n\nmodule.exports = isAnyArray;\n","import isArray from 'is-any-array';\n\n/**\n * Computes the mean of the given values\n * @param {Array<number>} input\n * @return {number}\n */\n\nfunction sum(input) {\n  if (!isArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += input[i];\n  }\n\n  return sumValue;\n}\n\nexport default sum;\n","import isArray from 'is-any-array';\nimport max from 'ml-array-max';\nimport sum from 'ml-array-sum';\n\n/**\n * Computes the norm of the given values\n * @param {Array<number>} input\n * @param {object} [options={}]\n * @param {string} [options.algorithm='absolute'] absolute, sum or max\n * @param {number} [options.maxValue=1] new max value for algo max\n * @param {Array} [options.output=[]] specify the output array, can be the input array for in place modification\n * @return {number}\n */\n\nfunction norm(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var _options$algorithm = options.algorithm,\n      algorithm = _options$algorithm === void 0 ? 'absolute' : _options$algorithm,\n      _options$maxValue = options.maxValue,\n      maxValue = _options$maxValue === void 0 ? 1 : _options$maxValue;\n\n  if (!isArray(input)) {\n    throw new Error('input must be an array');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  if (input.length === 0) {\n    throw new Error('input must not be empty');\n  }\n\n  switch (algorithm.toLowerCase()) {\n    case 'absolute':\n      {\n        var absoluteSumValue = absoluteSum(input);\n        if (absoluteSumValue === 0) return input.slice(0);\n\n        for (var i = 0; i < input.length; i++) {\n          output[i] = input[i] / absoluteSumValue;\n        }\n\n        return output;\n      }\n\n    case 'max':\n      {\n        var currentMaxValue = max(input);\n        if (currentMaxValue === 0) return input.slice(0);\n        var factor = maxValue / currentMaxValue;\n\n        for (var _i = 0; _i < input.length; _i++) {\n          output[_i] = input[_i] * factor;\n        }\n\n        return output;\n      }\n\n    case 'sum':\n      {\n        var sumValue = sum(input);\n        if (sumValue === 0) return input.slice(0);\n\n        for (var _i2 = 0; _i2 < input.length; _i2++) {\n          output[_i2] = input[_i2] / sumValue;\n        }\n\n        return output;\n      }\n\n    default:\n      throw new Error(\"norm: unknown algorithm: \".concat(algorithm));\n  }\n}\n\nfunction absoluteSum(input) {\n  var sumValue = 0;\n\n  for (var i = 0; i < input.length; i++) {\n    sumValue += Math.abs(input[i]);\n  }\n\n  return sumValue;\n}\n\nexport default norm;\n","export default function sortX(points, options = {}) {\n  const { x, y } = points;\n  const { reverse = false } = options;\n\n  var sortFunc;\n  if (!reverse) {\n    sortFunc = (a, b) => a.x - b.x;\n  } else {\n    sortFunc = (a, b) => b.x - a.x;\n  }\n\n  var grouped = x\n    .map((val, index) => ({\n      x: val,\n      y: y[index]\n    }))\n    .sort(sortFunc);\n\n  var response = { x: x.slice(), y: y.slice() };\n  for (var i = 0; i < x.length; i++) {\n    response.x[i] = grouped[i].x;\n    response.y[i] = grouped[i].y;\n  }\n\n  return response;\n}\n","\n/**\n * In place modification of the 2 arrays to make X unique and sum the Y if X has the same value\n * @param {object} [points={}] : Object of points contains property x (an array) and y (an array)\n * @return points\n */\n\nexport default function uniqueX(points = {}) {\n  const { x, y } = points;\n  if (x.length < 2) return;\n  if (x.length !== y.length) {\n    throw new Error('The X and Y arrays mush have the same length');\n  }\n\n  let current = x[0];\n  let counter = 0;\n\n  for (let i = 1; i < x.length; i++) {\n    if (current !== x[i]) {\n      counter++;\n      current = x[i];\n      x[counter] = x[i];\n      if (i !== counter) {\n        y[counter] = 0;\n      }\n    }\n    if (i !== counter) {\n      y[counter] += y[i];\n    }\n  }\n\n  x.length = counter + 1;\n  y.length = counter + 1;\n}\n","import normalizeY from 'ml-array-normed';\nimport sortArrayXY from 'ml-array-xy-sort-x';\nimport uniqueArrayXY from 'ml-arrayxy-uniquex';\n\n/**\n * parses MGF files into a JSON. The spectrum can be delimited by ' ', '\\t', ',' or ';'.\n * @param {string} rawData input data (MGF)\n * @param {object} options\n * @param {string} [options.recordTypes = ''] allows to filter the data entries based on their type\n * @param {boolean} [options.sortX = false] should the MS spectrum be sorted by x values\n * @param {boolean} [options.uniqueX = false] should merge the repeating x values of MS spectrum (summing the y values together). Sets sortX to true if true.\n * @param {boolean} [options.normedY = false] should the MS spectrum be normalized (sum of y values = 1)\n * @param {number} [options.maxY = undefined] if not undefined, rescale MS spectrum so that max Y value equals maxY (must be bigger than 0)\n * @returns {array<object>} parsed data\n */\nexport function parse(rawData, options = {}) {\n  const {\n    recordTypes = '',\n    uniqueX = false,\n    normedY = false,\n    maxY = undefined,\n  } = options;\n\n  let sortX = uniqueX\n    ? true\n    : options.sortX === undefined\n    ? false\n    : options.sortX;\n\n  let lines = rawData.split(/\\r?\\n/);\n  let results = [];\n  let entry;\n  let ms;\n  let skip = false;\n\n  for (let i = 0; i < lines.length; i++) {\n    let line = lines[i].trim(); // remove space before of after line with trim\n    if (!line) continue; // handling empty lines\n\n    // verify if line is the beginning of an entry\n    if (line.startsWith('BEGIN')) {\n      // console.log({ linePointer });\n      entry = {\n        data: {},\n        meta: {},\n      };\n      ms = { x: [], y: [] };\n      entry.kind = line.substring(6);\n      if (!entry.kind.match(recordTypes)) {\n        skip = true;\n      } else {\n        skip = false;\n      }\n    } else if (skip) {\n      continue;\n    } else if (line.includes('=')) {\n      // verify if line is part of the metadata\n      let equalPos = line.indexOf('=');\n      let key = line.substring(0, equalPos);\n      let value = line.substring(equalPos + 1);\n\n      entry.meta[key] = value;\n    } else if (line.substring(0, 3) === 'END') {\n      // detect end of an entry and push it to results\n      let treatedSpectrum = { x: [], y: [] };\n\n      if (sortX && uniqueX) {\n        treatedSpectrum = sortArrayXY(ms);\n        uniqueArrayXY(treatedSpectrum);\n      } else if (sortX && !uniqueX) {\n        treatedSpectrum = sortArrayXY(ms);\n      } else if (!sortX && !uniqueX) {\n        treatedSpectrum = ms;\n      }\n\n      if (normedY && maxY === undefined) {\n        entry.data.x = treatedSpectrum.x;\n        entry.data.y = normalizeY(treatedSpectrum.y);\n      } else if (!normedY && maxY !== undefined) {\n        entry.data.x = treatedSpectrum.x;\n        entry.data.y = normalizeY(treatedSpectrum.y, {\n          algorithm: 'max',\n          maxValue: maxY,\n        });\n      } else if (!normedY && maxY === undefined) {\n        entry.data = treatedSpectrum;\n      } else if (normedY && maxY !== undefined) {\n        throw new Error('Option maxY must be undefined if normedY is true');\n      }\n\n      results.push(entry);\n    } else {\n      // handling the case where line is a mass spectrum entry\n      let lineArray = line.split(/[ \\t,;]+/); // considering multiple delimiter types\n      if (lineArray.length !== 2) {\n        throw new Error(`Could not parse line number ${i + 1}`);\n      }\n      // creating mass spectrum (1 array of mz and 1 array of intensities)\n      ms.x.push(Number(lineArray[0]));\n      ms.y.push(Number(lineArray[1]));\n    }\n  }\n  return results;\n}\n"],"names":["toString","Object","prototype","isAnyArray","object","call","endsWith","max","input","isArray","TypeError","length","maxValue","i","sum","sumValue","norm","output","options","arguments","undefined","_options$algorithm","algorithm","_options$maxValue","Error","Array","toLowerCase","absoluteSumValue","absoluteSum","slice","currentMaxValue","factor","_i","_i2","concat","Math","abs","sortX","points","x","y","reverse","sortFunc","a","b","grouped","map","val","index","sort","response","uniqueX","current","counter","rawData","recordTypes","normedY","maxY","entry","ms","lines","split","results","skip","line","trim","startsWith","data","meta","kind","substring","match","includes","equalPos","indexOf","key","value","treatedSpectrum","sortArrayXY","uniqueArrayXY","normalizeY","push","lineArray","Number"],"mappings":"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"}