{"version":3,"file":"convert-to-jcamp.min.js","sources":["../lib-esm/utils/addInfoData.js","../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-spectra-processing/lib-esm/x/xDivide.js","../node_modules/ml-spectra-processing/lib-esm/x/utils/getOutputArray.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixMinMaxZ.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixCheck.js","../lib-esm/utils/checkMatrix.js","../lib-esm/utils/checkNumberOrArray.js","../lib-esm/utils/getExtremeValues.js","../lib-esm/utils/getFactorNumber.js","../lib-esm/utils/getBestFactor.js","../lib-esm/utils/getNumber.js","../lib-esm/utils/rescaleAndEnsureInteger.js","../lib-esm/utils/vectorEncoder.js","../lib-esm/fromJSON.js","../lib-esm/utils/xyDataCreator.js","../lib-esm/utils/peakTableCreator.js","../lib-esm/from1DNMRVariables.js","../lib-esm/from2DNMRVariables.js","../lib-esm/utils/getBestFactorMatrix.js","../lib-esm/fromVariables.js","../lib-esm/creatorNtuples.js"],"sourcesContent":["export const addInfoData = (data, options = {}) => {\n    const { keys = Object.keys(data), prefix = '##$' } = options;\n    let header = '';\n    for (const key of keys) {\n        header +=\n            typeof data[key] === 'object'\n                ? `${prefix}${key}=${JSON.stringify(data[key])}\\n`\n                : `${prefix}${key}=${data[key]}\\n`;\n    }\n    return header;\n};\n//# sourceMappingURL=addInfoData.js.map","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport { getOutputArray } from '..';\n/**\n * This function divide the first array by the second array or a constant value to each element of the first array\n *\n * @param array1 - first array\n * @param array2 - second array or number\n * @param options - options\n */\nexport function xDivide(array1, array2, options = {}) {\n    let isConstant = false;\n    let constant = 0;\n    if (isAnyArray(array2)) {\n        if (array1.length !== array2.length) {\n            throw new Error('xDivide: size of array1 and array2 must be identical');\n        }\n    }\n    else {\n        isConstant = true;\n        constant = Number(array2);\n    }\n    let array3 = getOutputArray(options.output, array1.length);\n    if (isConstant) {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] / constant;\n        }\n    }\n    else {\n        for (let i = 0; i < array1.length; i++) {\n            array3[i] = array1[i] / array2[i];\n        }\n    }\n    return array3;\n}\n//# sourceMappingURL=xDivide.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * This function\n * @param output - undefined or a new array\n * @param length - length of the output array\n * @returns\n */\nexport function getOutputArray(output, length) {\n    if (output !== undefined) {\n        if (!isAnyArray(output)) {\n            throw new TypeError('output option must be an array if specified');\n        }\n        if (output.length !== length) {\n            throw new TypeError('the output array does not have the correct length');\n        }\n        return output;\n    }\n    else {\n        return new Float64Array(length);\n    }\n}\n//# sourceMappingURL=getOutputArray.js.map","import { xCheck } from './xCheck';\n/**\n * Return min and max values of an array\n *\n * @param array - array of number\n * @returns - Object with 2 properties, min and max\n */\nexport function xMinMaxValues(array) {\n    xCheck(array);\n    let min = array[0];\n    let max = array[0];\n    for (let value of array) {\n        if (value < min)\n            min = value;\n        if (value > max)\n            max = value;\n    }\n    return { min, max };\n}\n//# sourceMappingURL=xMinMaxValues.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input, options = {}) {\n    const { minLength } = options;\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    if (minLength && input.length < minLength) {\n        throw new Error(`input must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xCheck.js.map","import { matrixCheck } from './matrixCheck';\n/**\n * Get min and max Z\n *\n * @param matrix - matrix [rows][cols].\n */\nexport function matrixMinMaxZ(matrix) {\n    matrixCheck(matrix);\n    const nbRows = matrix.length;\n    const nbColumns = matrix[0].length;\n    let min = matrix[0][0];\n    let max = matrix[0][0];\n    for (let column = 0; column < nbColumns; column++) {\n        for (let row = 0; row < nbRows; row++) {\n            if (matrix[row][column] < min)\n                min = matrix[row][column];\n            if (matrix[row][column] > max)\n                max = matrix[row][column];\n        }\n    }\n    return { min, max };\n}\n//# sourceMappingURL=matrixMinMaxZ.js.map","export function matrixCheck(data) {\n    if (data.length === 0 || data[0].length === 0) {\n        throw new RangeError('matrix should contain data');\n    }\n    const firstLength = data[0].length;\n    for (let i = 1; i < data.length; i++) {\n        if (data[i].length !== firstLength) {\n            throw new RangeError('All rows should has the same length');\n        }\n    }\n}\n//# sourceMappingURL=matrixCheck.js.map","import { isAnyArray } from 'is-any-array';\nexport function checkMatrix(data) {\n    if (!isAnyArray(data) || !isAnyArray(data[0])) {\n        throw new Error(`2D data should be a matrix`);\n    }\n}\n//# sourceMappingURL=checkMatrix.js.map","import { isAnyArray } from 'is-any-array';\nexport function checkNumberOrArray(data) {\n    if (!isAnyArray(data) || isAnyArray(data[0])) {\n        throw new Error(`x and y data should be an array of numbers`);\n    }\n}\n//# sourceMappingURL=checkNumberOrArray.js.map","import { isAnyArray } from 'is-any-array';\nimport { matrixMinMaxZ, xMinMaxValues, } from 'ml-spectra-processing';\nimport { checkMatrix } from './checkMatrix';\nimport { checkNumberOrArray } from './checkNumberOrArray';\nexport function getExtremeValues(data) {\n    if (isAnyArray(data[0])) {\n        checkMatrix(data);\n        const firstRow = data[0];\n        return {\n            firstLast: {\n                first: firstRow[0],\n                last: data[data.length - 1][data[0].length - 1],\n            },\n            minMax: matrixMinMaxZ(data),\n        };\n    }\n    checkNumberOrArray(data);\n    return {\n        firstLast: {\n            first: data[0],\n            last: data[data.length - 1],\n        },\n        minMax: xMinMaxValues(data),\n    };\n}\n//# sourceMappingURL=getExtremeValues.js.map","export function getFactorNumber(minMax, maxValue = 2 ** 31 - 1) {\n    let factor;\n    if (minMax.min < 0) {\n        if (minMax.max > 0) {\n            factor = Math.max(-minMax.min, minMax.max) / maxValue;\n        }\n        else {\n            factor = -minMax.min / maxValue;\n        }\n    }\n    else {\n        factor = minMax.max / maxValue;\n    }\n    return factor;\n}\n//# sourceMappingURL=getFactorNumber.js.map","import { xMinMaxValues } from 'ml-spectra-processing';\nimport { getFactorNumber } from './getFactorNumber';\nexport function getBestFactor(array, options = {}) {\n    const { maxValue, factor, minMax } = options;\n    if (factor !== undefined) {\n        return factor;\n    }\n    // is there non integer number ?\n    let onlyInteger = true;\n    for (const y of array) {\n        if (Math.round(y) !== y) {\n            onlyInteger = false;\n            break;\n        }\n    }\n    if (onlyInteger) {\n        return 1;\n    }\n    // we need to rescale the values\n    // need to find the max and min values\n    const extremeValues = minMax || xMinMaxValues(array);\n    return getFactorNumber(extremeValues, maxValue);\n}\n//# sourceMappingURL=getBestFactor.js.map","/**\n * Reconvert number to original value\n * @param number Number used for computation\n * @param factor Multiplying factor\n * @returns Original value\n */\nexport function getNumber(number, factor) {\n    if (factor !== 1)\n        number /= factor;\n    const rounded = Math.round(number);\n    if (rounded !== number && Math.abs(rounded - number) <= Number.EPSILON) {\n        return rounded;\n    }\n    return number;\n}\n//# sourceMappingURL=getNumber.js.map","import { xDivide } from 'ml-spectra-processing';\nexport function rescaleAndEnsureInteger(data, factor = 1) {\n    if (factor === 1)\n        return data.map((value) => Math.round(value));\n    return xDivide(data, factor).map((value) => Math.round(value));\n}\n//# sourceMappingURL=rescaleAndEnsureInteger.js.map","/**\n * class encodes a integer vector as a String in order to store it in a text file.\n * The algorithms used to encode the data are describe in:\n *            http://www.iupac.org/publications/pac/pdf/2001/pdf/7311x1765.pdf\n */\nconst newLine = '\\n';\nconst pseudoDigits = [\n    ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],\n    ['@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'],\n    ['@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'],\n    ['%', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R'],\n    ['%', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r'],\n    [' ', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 's'],\n];\nconst SQZ_P = 1;\nconst SQZ_N = 2;\nconst DIF_P = 3;\nconst DIF_N = 4;\nconst DUP = 5;\nconst maxLinelength = 100;\n/**\n * This function encodes the given vector. The xyEncoding format is specified by the\n * xyEncoding option\n * @param xyEncoding: ('FIX','SQZ','DIF','DIFDUP','CVS','PAC') Default 'DIFDUP'\n * @return {string}\n */\nexport function vectorEncoder(data, firstX, intervalX, xyEncoding) {\n    switch (xyEncoding) {\n        case 'FIX':\n            return fixEncoding(data, firstX, intervalX);\n        case 'SQZ':\n            return squeezedEncoding(data, firstX, intervalX);\n        case 'DIF':\n            return differenceEncoding(data, firstX, intervalX);\n        case 'DIFDUP':\n            return differenceDuplicateEncoding(data, firstX, intervalX);\n        case 'CSV':\n            return commaSeparatedValuesEncoding(data, firstX, intervalX);\n        case 'PAC':\n            return packedEncoding(data, firstX, intervalX);\n        default:\n            return differenceEncoding(data, firstX, intervalX);\n    }\n}\n/**\n * @private\n * No data compression used. The data is separated by a comma(',').\n */\nexport function commaSeparatedValuesEncoding(data, firstX, intervalX) {\n    return fixEncoding(data, firstX, intervalX, ',');\n}\n/**\n * @private\n * No data compression used. The data is separated by the specified separator.\n */\nexport function fixEncoding(data, firstX, intervalX, separator = ' ') {\n    let outputData = '';\n    let j = 0;\n    const dataLength = data.length;\n    while (j < dataLength - 7) {\n        outputData += Math.ceil(firstX + j * intervalX);\n        for (let i = 0; i < 8; i++) {\n            outputData += `${separator}${data[j++]}`;\n        }\n        outputData += newLine;\n    }\n    if (j < dataLength) {\n        // We add last numbers\n        outputData += Math.ceil(firstX + j * intervalX);\n        for (let i = j; i < dataLength; i++) {\n            outputData += `${separator}${data[i]}`;\n        }\n    }\n    return outputData;\n}\n/**\n * @private\n * No data compression used. The data is separated by the sign of the number.\n */\nexport function packedEncoding(data, firstX, intervalX) {\n    let outputData = '';\n    let j = 0;\n    const dataLength = data.length;\n    while (j < dataLength - 7) {\n        outputData += Math.ceil(firstX + j * intervalX);\n        for (let i = 0; i < 8; i++) {\n            outputData += data[j] < 0 ? data[j++] : `+${data[j++]}`;\n        }\n        outputData += newLine;\n    }\n    if (j < dataLength) {\n        // We add last numbers\n        outputData += Math.ceil(firstX + j * intervalX);\n        for (let i = j; i < dataLength; i++) {\n            outputData += data[i] < 0 ? data[i] : `+${data[i]}`;\n        }\n    }\n    return outputData;\n}\n/**\n * @private\n * Data compression is possible using the squeezed form (SQZ) in which the delimiter, the leading digit,\n * and sign are replaced by a pseudo-digit from Table 1. For example, the Y-values 30, 32 would be\n * represented as C0C2.\n */\nexport function squeezedEncoding(data, firstX, intervalX) {\n    let outputData = '';\n    // String outputData = new String();\n    let j = 0;\n    const dataLength = data.length;\n    while (j < dataLength - 10) {\n        outputData += Math.ceil(firstX + j * intervalX);\n        for (let i = 0; i < 10; i++) {\n            outputData += squeezedDigit(data[j++].toString());\n        }\n        outputData += newLine;\n    }\n    if (j < dataLength) {\n        // We add last numbers\n        outputData += Math.ceil(firstX + j * intervalX);\n        for (let i = j; i < dataLength; i++) {\n            outputData += squeezedDigit(data[i].toString());\n        }\n    }\n    return outputData;\n}\n/**\n * @private\n * Duplicate suppression xyEncoding\n */\nexport function differenceDuplicateEncoding(data, firstX, intervalX) {\n    let mult = 0;\n    let index = 0;\n    let charCount = 0;\n    // We built a string where we store the encoded data.\n    let encodedData = '';\n    let encodedNumber = '';\n    let temp = '';\n    // We calculate the differences vector\n    const diffData = new Array(data.length - 1);\n    for (let i = 0; i < diffData.length; i++) {\n        diffData[i] = data[i + 1] - data[i];\n    }\n    // We simulate a line carry\n    const numDiff = diffData.length;\n    while (index < numDiff) {\n        if (charCount === 0) {\n            // Start line\n            encodedNumber = `${Math.ceil(firstX + index * intervalX)}${squeezedDigit(data[index].toString())}${differenceDigit(diffData[index].toString())}`;\n            encodedData += encodedNumber;\n            charCount += encodedNumber.length;\n        }\n        else if (diffData[index - 1] === diffData[index]) {\n            // Try to insert next difference\n            mult++;\n        }\n        else if (mult > 0) {\n            // Now we know that it can be in line\n            mult++;\n            encodedNumber = duplicateDigit(mult.toString());\n            encodedData += encodedNumber;\n            charCount += encodedNumber.length;\n            mult = 0;\n            index--;\n        }\n        else {\n            // Check if it fits, otherwise start a new line\n            encodedNumber = differenceDigit(diffData[index].toString());\n            if (encodedNumber.length + charCount < maxLinelength) {\n                encodedData += encodedNumber;\n                charCount += encodedNumber.length;\n            }\n            else {\n                // start a new line\n                encodedData += newLine;\n                temp = `${Math.ceil(firstX + index * intervalX)}${squeezedDigit(data[index].toString())}${encodedNumber}`;\n                encodedData += temp; // Each line start with first index number.\n                charCount = temp.length;\n            }\n        }\n        index++;\n    }\n    if (mult > 0) {\n        encodedData += duplicateDigit((mult + 1).toString());\n    }\n    // We insert the last data from fid. It is done to control of data\n    // The last line start with the number of datas in the fid.\n    encodedData += `${newLine}${Math.ceil(firstX + index * intervalX)}${squeezedDigit(data[index].toString())}`;\n    return encodedData;\n}\n/**\n * @private\n * Differential xyEncoding\n */\nexport function differenceEncoding(data, firstX, intervalX) {\n    let index = 0;\n    let charCount = 0;\n    let i;\n    let encodedData = '';\n    let encodedNumber = '';\n    let temp = '';\n    // We calculate the differences vector\n    const diffData = new Array(data.length - 1);\n    for (i = 0; i < diffData.length; i++) {\n        diffData[i] = data[i + 1] - data[i];\n    }\n    const numDiff = diffData.length;\n    while (index < numDiff) {\n        if (charCount === 0) {\n            // We convert the first number.\n            encodedNumber = `${Math.ceil(firstX + index * intervalX)}${squeezedDigit(data[index].toString())}${differenceDigit(diffData[index].toString())}`;\n            encodedData += encodedNumber;\n            charCount += encodedNumber.length;\n        }\n        else {\n            encodedNumber = differenceDigit(diffData[index].toString());\n            if (encodedNumber.length + charCount < maxLinelength) {\n                encodedData += encodedNumber;\n                charCount += encodedNumber.length;\n            }\n            else {\n                encodedData += newLine;\n                temp = `${Math.ceil(firstX + index * intervalX)}${squeezedDigit(data[index].toString())}${encodedNumber}`;\n                encodedData += temp; // Each line start with first index number.\n                charCount = temp.length;\n            }\n        }\n        index++;\n    }\n    // We insert the last number from data. It is done to control of data\n    encodedData += `${newLine}${Math.ceil(firstX + index * intervalX)}${squeezedDigit(data[index].toString())}`;\n    return encodedData;\n}\n/**\n * @private\n * Convert number to the ZQZ format, using pseudo digits.\n */\nfunction squeezedDigit(num) {\n    let sqzDigits = '';\n    if (num.startsWith('-')) {\n        sqzDigits += pseudoDigits[SQZ_N][num.charCodeAt(1) - 48];\n        if (num.length > 2) {\n            sqzDigits += num.substring(2);\n        }\n    }\n    else {\n        sqzDigits += pseudoDigits[SQZ_P][num.charCodeAt(0) - 48];\n        if (num.length > 1) {\n            sqzDigits += num.substring(1);\n        }\n    }\n    return sqzDigits;\n}\n/**\n * Convert number to the DIF format, using pseudo digits.\n */\nfunction differenceDigit(num) {\n    let diffDigits = '';\n    if (num.startsWith('-')) {\n        diffDigits += pseudoDigits[DIF_N][num.charCodeAt(1) - 48];\n        if (num.length > 2) {\n            diffDigits += num.substring(2);\n        }\n    }\n    else {\n        diffDigits += pseudoDigits[DIF_P][num.charCodeAt(0) - 48];\n        if (num.length > 1) {\n            diffDigits += num.substring(1);\n        }\n    }\n    return diffDigits;\n}\n/**\n * Convert number to the DUP format, using pseudo digits.\n */\nfunction duplicateDigit(num) {\n    let dupDigits = '';\n    dupDigits += pseudoDigits[DUP][num.charCodeAt(0) - 48];\n    if (num.length > 1) {\n        dupDigits += num.substring(1);\n    }\n    return dupDigits;\n}\n//# sourceMappingURL=vectorEncoder.js.map","import { addInfoData } from './utils/addInfoData';\nimport { getBestFactor } from './utils/getBestFactor';\nimport { peakTableCreator } from './utils/peakTableCreator';\nimport { xyDataCreator } from './utils/xyDataCreator';\n/**\n * Create a jcamp\n * @param data object of array\n * @param [options={meta:{},info:{}} - metadata object\n * @returns JCAMP of the input\n */\nexport function fromJSON(data, options = {}) {\n    const { meta = {}, info = {}, xyEncoding } = options;\n    const { title = '', owner = '', origin = '', dataType = '', xUnits = '', yUnits = '', ...resInfo } = info;\n    let { xFactor, yFactor } = info;\n    data = { x: data.x, y: data.y };\n    let header = `##TITLE=${title}\n##JCAMP-DX=4.24\n##DATA TYPE=${dataType}\n##ORIGIN=${origin}\n##OWNER=${owner}\n##XUNITS=${xUnits}\n##YUNITS=${yUnits}\\n`;\n    header += addInfoData(resInfo, { prefix: '##' });\n    header += addInfoData(meta);\n    // we leave the header and utf8 fonts ${header.replace(/[^\\t\\n\\x20-\\x7F]/g, '')\n    if (xyEncoding) {\n        xFactor = getBestFactor(data.x, { factor: xFactor });\n        yFactor = getBestFactor(data.y, { factor: yFactor });\n        return `${header}##NPOINTS=${data.x.length}\n${xyDataCreator(data, { info: { xFactor, yFactor }, xyEncoding }).join('\\n')}\n##END=`;\n    }\n    else {\n        if (xFactor === undefined)\n            xFactor = 1;\n        if (yFactor === undefined)\n            yFactor = 1;\n        if (xFactor !== 1) {\n            //@ts-expect-error xFactor is always defined\n            data.x = data.x.map((value) => value / xFactor);\n        }\n        if (yFactor !== 1) {\n            //@ts-expect-error yFactor is always defined\n            data.y = data.y.map((value) => value / yFactor);\n        }\n        return `${header}##NPOINTS=${data.x.length}\n${peakTableCreator(data, { info: { xFactor, yFactor } }).join('\\n')}\n##END=`;\n    }\n}\n//# sourceMappingURL=fromJSON.js.map","import { rescaleAndEnsureInteger } from './rescaleAndEnsureInteger';\nimport { vectorEncoder } from './vectorEncoder';\nexport function xyDataCreator(data, options = {}) {\n    const { xyEncoding = 'DIF' } = options;\n    const { xFactor = 1, yFactor = 1 } = options.info || {};\n    const firstX = data.x[0];\n    const lastX = data.x[data.x.length - 1];\n    const firstY = data.y[0];\n    const lastY = data.y[data.y.length - 1];\n    const nbPoints = data.x.length;\n    const deltaX = (lastX - firstX) / (nbPoints - 1);\n    const lines = [];\n    lines.push(`##FIRSTX=${firstX}`);\n    lines.push(`##LASTX=${lastX}`);\n    lines.push(`##FIRSTY=${firstY}`);\n    lines.push(`##LASTY=${lastY}`);\n    lines.push(`##DELTAX=${deltaX}`);\n    lines.push(`##XFACTOR=${xFactor}`);\n    lines.push(`##YFACTOR=${yFactor}`);\n    lines.push('##XYDATA=(X++(Y..Y))');\n    const line = vectorEncoder(rescaleAndEnsureInteger(data.y, yFactor), firstX / xFactor, deltaX / xFactor, xyEncoding);\n    if (line)\n        lines.push(line);\n    return lines;\n}\n//# sourceMappingURL=xyDataCreator.js.map","import { getNumber } from './getNumber';\nexport function peakTableCreator(data, options = {}) {\n    const { xFactor = 1, yFactor = 1 } = options.info || {};\n    let firstX = Number.POSITIVE_INFINITY;\n    let lastX = Number.NEGATIVE_INFINITY;\n    let firstY = Number.POSITIVE_INFINITY;\n    let lastY = Number.NEGATIVE_INFINITY;\n    const lines = [];\n    for (let i = 0; i < data.x.length; i++) {\n        const x = data.x[i];\n        const y = data.y[i];\n        if (firstX > x) {\n            firstX = x;\n        }\n        if (lastX < x) {\n            lastX = x;\n        }\n        if (firstY > y) {\n            firstY = y;\n        }\n        if (lastY < y) {\n            lastY = y;\n        }\n    }\n    lines.push(`##FIRSTX=${firstX}`);\n    lines.push(`##LASTX=${lastX}`);\n    lines.push(`##FIRSTY=${firstY}`);\n    lines.push(`##LASTY=${lastY}`);\n    lines.push(`##XFACTOR=${xFactor}`);\n    lines.push(`##YFACTOR=${yFactor}`);\n    lines.push('##PEAK TABLE=(XY..XY)');\n    for (let i = 0; i < data.x.length; i++) {\n        lines.push(`${getNumber(data.x[i], xFactor)} ${getNumber(data.y[i], yFactor)}`);\n    }\n    return lines;\n}\n//# sourceMappingURL=peakTableCreator.js.map","import { addInfoData } from './utils/addInfoData';\nimport { checkNumberOrArray } from './utils/checkNumberOrArray';\nimport { getBestFactor } from './utils/getBestFactor';\nimport { getExtremeValues } from './utils/getExtremeValues';\nimport { rescaleAndEnsureInteger } from './utils/rescaleAndEnsureInteger';\nimport { vectorEncoder } from './utils/vectorEncoder';\nconst ntuplesKeys = ['r', 'i'];\nfunction isNTuplesData(variables) {\n    return 'r' in variables && 'i' in variables;\n}\nfunction isRealData(variables) {\n    return 'r' in variables && !('i' in variables);\n}\n/**\n * Create a jcamp of 1D NMR data by variables x and y or x, r, i\n * @param variables - Variables to convert to jcamp\n * @param [options={}] - options that allows to add meta data in the jcamp\n * @return JCAMP-DX text file corresponding to the variables\n */\nexport function from1DNMRVariables(variables, options) {\n    const { meta = {}, info = {}, xyEncoding = '' } = options;\n    const factor = 'factor' in options\n        ? { ...options.factor }\n        : {};\n    const { title = '', owner = '', origin = '', dataType = '', dataClass = '', ...resInfo } = info;\n    if (!('.OBSERVE FREQUENCY' in info)) {\n        throw new Error('.OBSERVE FREQUENCY is mandatory into the info object for nmr data');\n    }\n    const xVariable = variables.x;\n    const xData = xVariable.data.slice();\n    let header = `##TITLE=${title}\n##JCAMP-DX=6.00\n##DATA TYPE= ${dataType}\n##DATA CLASS= ${dataClass}\n##ORIGIN=${origin}\n##OWNER=${owner}\\n`;\n    header += addInfoData(resInfo, { prefix: '##' });\n    header += addInfoData(meta);\n    const nbPoints = xData.length;\n    const spectralWidth = Math.abs(xData[nbPoints - 1] - xData[0]);\n    const firstPoint = xData[0] > xData[1] ? spectralWidth : 0;\n    const lastPoint = xData[0] > xData[1] ? 0 : spectralWidth;\n    const symbol = ['X'];\n    const varDim = [nbPoints];\n    const units = [xVariable.units];\n    const varType = ['INDEPENDENT'];\n    const varForm = ['AFFN'];\n    const factorArray = [spectralWidth / (nbPoints - 1)];\n    const varName = [xVariable.label.replace(/ *\\[.*/, '') || 'X'];\n    const first = [firstPoint];\n    const last = [lastPoint];\n    const max = [Math.max(lastPoint, firstPoint)];\n    const min = [Math.min(lastPoint, firstPoint)];\n    for (const key of ntuplesKeys) {\n        const variable = variables[key];\n        if (!variable) {\n            if (key !== 'i') {\n                throw new Error(`variable ${key} is mandatory in real/imaginary data`);\n            }\n            continue;\n        }\n        const name = variable?.label.replace(/ *\\[.*/, '');\n        const unit = variable?.label.replace(/.*\\[(?<units>.*)\\].*/, '$<units>');\n        const { firstLast, minMax } = getExtremeValues(variable.data);\n        factor[key] = getBestFactor(variable.data, {\n            factor: factor[key],\n            minMax,\n        });\n        const currentFactor = factor[key];\n        factorArray.push(currentFactor || 1);\n        symbol.push(variable.symbol || key);\n        varName.push(name || key);\n        varDim.push(variable.data.length);\n        varForm.push('ASDF');\n        first.push(firstLast.first);\n        last.push(firstLast.last);\n        max.push(minMax.max);\n        min.push(minMax.min);\n        varType.push('DEPENDENT');\n        units.push(variable.units || unit || '');\n    }\n    return isNTuplesData(variables)\n        ? addNtuplesHeader(header, variables, {\n            symbol,\n            varName,\n            varDim,\n            varForm,\n            first,\n            last,\n            min,\n            max,\n            units,\n            factor,\n            varType,\n            factorArray,\n        }, { dataType, ...resInfo })\n        : isRealData(variables)\n            ? addRealData(header, {\n                xData,\n                yData: variables.r.data,\n                xyEncoding,\n                info: {\n                    XUNITS: 'HZ',\n                    YUNITS: units[1],\n                    XFACTOR: factorArray[0],\n                    YFACTOR: factorArray[1],\n                    DELTAX: xData[1] - xData[0],\n                    FIRSTX: first[0],\n                    FIRSTY: first[1],\n                    LASTX: last[0],\n                    MAXY: max[1],\n                    MINY: min[1],\n                    NPOINTS: xData.length,\n                    XYDATA: '(X++(Y..Y))',\n                },\n            })\n            : header;\n}\nfunction addNtuplesHeader(header, variables, inputs, info) {\n    const { dataType = '' } = info;\n    const { symbol, varName, varDim, first, last, min, max, units, varType, varForm, factorArray, xyEncoding, factor, } = inputs;\n    header += `##NTUPLES= ${dataType}\n##VAR_NAME=  ${varName.join()}\n##SYMBOL=    ${symbol.join()}\n##VAR_TYPE=  ${varType.join()}\n##VAR_FORM=  ${varForm.join()}\n##VAR_DIM=   ${varDim.join()}\n##UNITS=     ${units.join()}\n##FACTOR=    ${factorArray.join()}\n##FIRST=     ${first.join()}\n##LAST=      ${last.join()}\n##MIN=       ${min.join()}\n##MAX=       ${max.join()}\\n`;\n    for (const key of ['r', 'i']) {\n        const variable = variables[key];\n        if (!variable)\n            continue;\n        checkNumberOrArray(variable.data);\n        header += `##PAGE= N=${key === 'r' ? 1 : 2}\\n`;\n        header += `##DATA TABLE= (X++(${key === 'r' ? 'R..R' : 'I..I'})), XYDATA\\n`;\n        header += vectorEncoder(rescaleAndEnsureInteger(variable.data, factor[key]), first[0] > last[0] ? varDim[0] : 0, first[0] > last[0] ? -1 : 1, xyEncoding);\n        header += '\\n';\n    }\n    header += `##END NTUPLES= ${dataType}\\n`;\n    header += '##END=';\n    return header;\n}\nfunction addRealData(header, options) {\n    const { xData, yData, info, xyEncoding } = options;\n    header += addInfoData(info, { prefix: '##' });\n    return `${header}${vectorEncoder(rescaleAndEnsureInteger(yData, info.YFACTOR), xData.length - 1, -1, xyEncoding)}\n##END=`;\n}\n//# sourceMappingURL=from1DNMRVariables.js.map","import { isAnyArray } from 'is-any-array';\nimport { addInfoData } from './utils/addInfoData';\nimport { checkMatrix } from './utils/checkMatrix';\nimport { checkNumberOrArray } from './utils/checkNumberOrArray';\nimport { getBestFactor } from './utils/getBestFactor';\nimport { getBestFactorMatrix } from './utils/getBestFactorMatrix';\nimport { getExtremeValues } from './utils/getExtremeValues';\nimport { rescaleAndEnsureInteger } from './utils/rescaleAndEnsureInteger';\nimport { vectorEncoder } from './utils/vectorEncoder';\n/**\n * Create a jcamp of 2D NMR data by variables. Currently only the convertion of processed data\n * is supported. The variables x and y are the direct (F2 in Bruker) and indirect (F1 in bruker),\n * data should be in ppm scale, the z variable is the intensity (dependent)\n */\nexport function from2DNMRVariables(variables, options = {}) {\n    const { info = {}, meta = {}, xyEncoding = 'DIFDUP' } = options;\n    const factor = 'factor' in options\n        ? { ...options.factor }\n        : {};\n    const { title = '', owner = '', origin = '', dataType = 'NMR SPECTRUM', ...resInfo } = info;\n    const symbol = [];\n    const varName = [];\n    const varType = [];\n    const varDim = [];\n    const units = [];\n    const first = [];\n    const last = [];\n    const min = [];\n    const max = [];\n    const factors = [];\n    const keys = ['y', 'x', 'z'];\n    for (let i = 0; i < keys.length; i++) {\n        const key = keys[i];\n        const variable = variables[key];\n        if (!variable)\n            throw new Error('variables x, y and z are mandatory');\n        const name = variable?.label.replace(/ *\\[.*/, '');\n        const unit = variable?.label.replace(/.*\\[(?<units>.*)\\].*/, '$<units>');\n        const { firstLast, minMax } = getExtremeValues(variable.data);\n        if (!(key in factor))\n            factor[key] = calculateFactor(variable.data, minMax);\n        symbol.push(variable.symbol || key);\n        varName.push(name || key);\n        varDim.push(variable.data.length);\n        first.push(firstLast.first);\n        last.push(firstLast.last);\n        max.push(minMax.max);\n        min.push(minMax.min);\n        factors.push(factor[key]);\n        if (variable.isDependent !== undefined) {\n            varType.push(variable.isDependent ? 'DEPENDENT' : 'INDEPENDENT');\n        }\n        else {\n            varType.push(variable.isDependent !== undefined\n                ? !variable.isDependent\n                : i === 0\n                    ? 'INDEPENDENT'\n                    : 'DEPENDENT');\n        }\n        units.push(variable.units || unit || '');\n    }\n    let header = `##TITLE=${title}\n##JCAMP-DX=6.00\n##DATA TYPE=${dataType}\n##DATA CLASS= NTUPLES\n##ORIGIN=${origin}\n##OWNER=${owner}\\n`;\n    header += addInfoData(resInfo, { prefix: '##' });\n    header += addInfoData(meta);\n    let xData = variables.x.data;\n    let yData = variables.y.data;\n    checkNumberOrArray(xData);\n    checkNumberOrArray(yData);\n    checkMandatoryParameters(meta);\n    const zData = variables.z?.data || [];\n    checkMatrix(zData);\n    const { direct, indirect, dependent } = getDimensionIndices(symbol);\n    const nuc1 = String(meta.NUC1);\n    const nuc2 = String(meta.NUC2);\n    const nucleus = new Array(3);\n    nucleus[direct] = nuc1;\n    nucleus[indirect] = nuc2;\n    const sfo1 = Number(meta.SFO1);\n    const sfo2 = Number(meta.SFO2);\n    const optionsScaleAndJoin = {\n        indices: { direct, indirect },\n        sfo1,\n        sfo2,\n    };\n    header += `##NTUPLES= ${dataType}\n##VAR_NAME=  ${varName.join()}\n##SYMBOL=    ${symbol.join()}\n##VAR_TYPE=  ${varType.join()}\n##VAR_DIM=   ${varDim.join()}\n##.NUCLEUS=  ${nucleus.join()}\n##UNITS=     ${units.join()}\n##FACTOR=    ${factors.join()}\n##FIRST=     ${scaleAndJoin(first, optionsScaleAndJoin)}\n##LAST=      ${scaleAndJoin(last, optionsScaleAndJoin)}\n##MIN=       ${scaleAndJoin(min, optionsScaleAndJoin)}\n##MAX=       ${scaleAndJoin(max, optionsScaleAndJoin)}\\n`;\n    header += `##VAR_FORM= AFFN, AFFN, ASDF\\n`;\n    header += '##NUM DIM= 2\\n';\n    if (keys[direct] !== 'x') {\n        [yData, xData] = [xData, yData];\n    }\n    const directSymbol = symbol[direct].toUpperCase();\n    const indirectSymbol = symbol[indirect].toUpperCase();\n    const firstY = yData[0] * sfo2;\n    const lastY = yData[yData.length - 1] * sfo2;\n    const firstX = xData[0];\n    const lastX = xData[xData.length - 1];\n    const deltaX = (lastX - firstX) / (xData.length - 1);\n    const deltaY = (lastY - firstY) / (yData.length - 1);\n    const firstData = new Float64Array(3);\n    firstData[direct] = firstX * sfo1;\n    firstData[indirect] = firstY;\n    const yFactor = factor.y || 1;\n    const xFactor = factor.x || 1;\n    const zFactor = factor.z || 1;\n    for (let index = 0; index < zData.length; index++) {\n        firstData[dependent] = zData[index][0];\n        header += `##PAGE= ${indirectSymbol}=${(firstY + deltaY * index) / yFactor}\\n`;\n        header += `##FIRST=  ${firstData.join()}\\n`;\n        header += `##DATA TABLE= (${directSymbol}++(Y..Y)), PROFILE\\n`;\n        header += vectorEncoder(rescaleAndEnsureInteger(zData[index], zFactor), firstX / xFactor, deltaX / xFactor, xyEncoding);\n        header += '\\n';\n    }\n    return header;\n}\nfunction scaleAndJoin(variable, options) {\n    const { sfo1, sfo2 } = options;\n    const { direct, indirect } = options.indices;\n    const copy = variable.slice();\n    copy[direct] *= sfo1;\n    copy[indirect] *= sfo2;\n    return copy.join();\n}\nfunction getDimensionIndices(entry) {\n    const symbol = entry.map((e) => e.toUpperCase());\n    const direct = symbol.includes('F2')\n        ? symbol.indexOf('F2')\n        : symbol.indexOf('T2');\n    const indirect = symbol.includes('F1')\n        ? symbol.indexOf('F1')\n        : symbol.indexOf('T1');\n    if (direct === -1 || indirect === -1) {\n        throw new Error('F2/T2 and F1/T1 symbol should be defined for nD NMR SPECTRUM');\n    }\n    return { direct, indirect, dependent: 3 - direct - indirect };\n}\nfunction checkMandatoryParameters(meta) {\n    const list = ['SFO1', 'SFO2', 'NUC1', 'NUC2'];\n    for (const key of list) {\n        if (!meta[key]) {\n            throw new Error(`${key} in options.meta should be defined`);\n        }\n    }\n}\nfunction calculateFactor(data, minMax) {\n    return isAnyArray(data[0])\n        ? getBestFactorMatrix(data, { minMax })\n        : getBestFactor(data, { minMax });\n}\n//# sourceMappingURL=from2DNMRVariables.js.map","import { matrixMinMaxZ } from 'ml-spectra-processing';\nimport { getFactorNumber } from './getFactorNumber';\nexport function getBestFactorMatrix(matrix, options = {}) {\n    const { maxValue, factor, minMax } = options;\n    if (factor !== undefined) {\n        return factor;\n    }\n    // is there non integer number ?\n    let onlyInteger = true;\n    for (const row of matrix) {\n        for (const y of row) {\n            if (Math.round(y) !== y) {\n                onlyInteger = false;\n                break;\n            }\n        }\n    }\n    if (onlyInteger) {\n        return 1;\n    }\n    // we need to rescale the values\n    // need to find the max and min values\n    const extremeValues = minMax || matrixMinMaxZ(matrix);\n    return getFactorNumber(extremeValues, maxValue);\n}\n//# sourceMappingURL=getBestFactorMatrix.js.map","import creatorNtuples from './creatorNtuples';\nimport { fromJSON } from './fromJSON';\nimport { checkNumberOrArray } from './utils/checkNumberOrArray';\n/**\n * Create a jcamp from variables\n */\nexport function fromVariables(\n/** object of variables */\nvariables, options = {}) {\n    const { info = {}, meta = {}, forceNtuples = false } = options;\n    const jcampOptions = {\n        info,\n        meta,\n    };\n    const keys = Object.keys(variables).map((key) => key.toLowerCase());\n    if (!forceNtuples && keys.length === 2) {\n        const x = variables.x;\n        const xLabel = x.label || 'x';\n        if (variables.x.units) {\n            if (xLabel.includes(variables.x.units)) {\n                jcampOptions.info.xUnits = xLabel;\n            }\n            else {\n                jcampOptions.info.xUnits = `${xLabel} (${variables.x.units})`;\n            }\n        }\n        else {\n            jcampOptions.info.xUnits = xLabel;\n        }\n        const y = variables.y;\n        const yLabel = y.label || 'y';\n        if (variables.y.units) {\n            if (yLabel.includes(variables.y.units)) {\n                jcampOptions.info.xUnits = yLabel;\n            }\n            else {\n                jcampOptions.info.yUnits = `${yLabel} (${variables.y.units})`;\n            }\n        }\n        else {\n            jcampOptions.info.yUnits = yLabel;\n        }\n        const xData = variables.x.data;\n        const yData = variables.y.data;\n        checkNumberOrArray(xData);\n        checkNumberOrArray(yData);\n        return fromJSON({ x: xData, y: yData }, jcampOptions);\n    }\n    else {\n        return creatorNtuples(variables, options);\n    }\n}\n//# sourceMappingURL=fromVariables.js.map","import { addInfoData } from './utils/addInfoData';\nimport { getExtremeValues } from './utils/getExtremeValues';\n/**\n * Parse from a xyxy data array\n * @param variables - Variables to convert to jcamp\n * @param [options={}] - options that allows to add meta data in the jcamp\n * @return JCAMP-DX text file corresponding to the variables\n */\nexport default function creatorNtuples(variables, options) {\n    const { meta = {}, info = {} } = options;\n    const { title = '', owner = '', origin = '', dataType = '', ...resInfo } = info;\n    const symbol = [];\n    const varName = [];\n    const varType = [];\n    const varDim = [];\n    const units = [];\n    const first = [];\n    const last = [];\n    const min = [];\n    const max = [];\n    const keys = Object.keys(variables);\n    for (let i = 0; i < keys.length; i++) {\n        const key = keys[i];\n        const variable = variables[key];\n        if (!variable)\n            continue;\n        const name = variable?.label.replace(/ *\\[.*/, '');\n        const unit = variable?.label.replace(/.*\\[(?<units>.*)\\].*/, '$<units>');\n        const { firstLast, minMax } = getExtremeValues(variable.data);\n        symbol.push(variable.symbol || key);\n        varName.push(name || key);\n        varDim.push(variable.data.length);\n        first.push(firstLast.first);\n        last.push(firstLast.last);\n        max.push(minMax.max);\n        min.push(minMax.min);\n        if (variable.isDependent !== undefined) {\n            varType.push(variable.isDependent ? 'DEPENDENT' : 'INDEPENDENT');\n        }\n        else {\n            varType.push(variable.isDependent !== undefined\n                ? !variable.isDependent\n                : i === 0\n                    ? 'INDEPENDENT'\n                    : 'DEPENDENT');\n        }\n        units.push(variable.units || unit || '');\n    }\n    let header = `##TITLE=${title}\n##JCAMP-DX=6.00\n##DATA TYPE=${dataType}\n##DATA CLASS= NTUPLES\n##ORIGIN=${origin}\n##OWNER=${owner}\\n`;\n    header += addInfoData(resInfo, { prefix: '##' });\n    header += addInfoData(meta);\n    header += `##NTUPLES= ${dataType}\n##VAR_NAME=  ${varName.join()}\n##SYMBOL=    ${symbol.join()}\n##VAR_TYPE=  ${varType.join()}\n##VAR_DIM=   ${varDim.join()}\n##UNITS=     ${units.join()}\n##FIRST=     ${first.join()}\n##LAST=      ${last.join()}\n##MIN=       ${min.join()}\n##MAX=       ${max.join()}\n##PAGE= N=1\\n`;\n    header += `##DATA TABLE= (${symbol.join('')}..${symbol.join('')}), PEAKS\\n`;\n    for (let i = 0; i < variables.x.data.length; i++) {\n        const point = [];\n        for (const key of keys) {\n            const variable = variables[key];\n            if (!variable)\n                continue;\n            point.push(variable.data[i]);\n        }\n        header += `${point.join('\\t')}\\n`;\n    }\n    header += `##END NTUPLES= ${dataType}\\n`;\n    header += '##END=\\n##END=';\n    return header;\n}\n//# sourceMappingURL=creatorNtuples.js.map"],"names":["addInfoData","data","options","keys","Object","prefix","header","key","JSON","stringify","toString","prototype","isAnyArray","value","tag","call","endsWith","includes","xDivide","array1","array2","isConstant","constant","length","Error","Number","array3","output","undefined","TypeError","Float64Array","getOutputArray","i","xMinMaxValues","array","input","minLength","xCheck","min","max","matrixMinMaxZ","matrix","RangeError","firstLength","matrixCheck","nbRows","nbColumns","column","row","checkMatrix","checkNumberOrArray","getExtremeValues","firstLast","first","last","minMax","getFactorNumber","maxValue","factor","Math","getBestFactor","onlyInteger","y","round","getNumber","number","rounded","abs","EPSILON","rescaleAndEnsureInteger","map","newLine","pseudoDigits","SQZ_P","SQZ_N","DIF_P","DIF_N","DUP","maxLinelength","vectorEncoder","firstX","intervalX","xyEncoding","fixEncoding","outputData","j","dataLength","ceil","squeezedDigit","squeezedEncoding","differenceEncoding","mult","index","charCount","encodedData","encodedNumber","temp","diffData","Array","numDiff","differenceDigit","duplicateDigit","differenceDuplicateEncoding","commaSeparatedValuesEncoding","packedEncoding","separator","num","sqzDigits","startsWith","charCodeAt","substring","diffDigits","dupDigits","fromJSON","meta","info","title","owner","origin","dataType","xUnits","yUnits","resInfo","xFactor","yFactor","x","lastX","firstY","lastY","deltaX","lines","push","line","xyDataCreator","join","POSITIVE_INFINITY","NEGATIVE_INFINITY","peakTableCreator","ntuplesKeys","scaleAndJoin","variable","sfo1","sfo2","direct","indirect","indices","copy","slice","calculateFactor","getBestFactorMatrix","variables","dataClass","xVariable","xData","nbPoints","spectralWidth","firstPoint","lastPoint","symbol","varDim","units","varType","varForm","factorArray","varName","label","replace","name","unit","currentFactor","isNTuplesData","inputs","addNtuplesHeader","isRealData","yData","YFACTOR","addRealData","r","XUNITS","YUNITS","XFACTOR","DELTAX","FIRSTX","FIRSTY","LASTX","MAXY","MINY","NPOINTS","XYDATA","factors","isDependent","list","checkMandatoryParameters","zData","z","dependent","entry","e","toUpperCase","indexOf","getDimensionIndices","nuc1","String","NUC1","nuc2","NUC2","nucleus","SFO1","SFO2","optionsScaleAndJoin","directSymbol","indirectSymbol","deltaY","firstData","zFactor","forceNtuples","jcampOptions","toLowerCase","point","creatorNtuples","xLabel","yLabel"],"mappings":"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"}