{"version":3,"file":"convert-to-jcamp.js","sources":["../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-spectra-processing/lib-esm/x/utils/getOutputArray.js","../node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-spectra-processing/lib-esm/x/xDivide.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixCheck.js","../node_modules/ml-spectra-processing/lib-esm/matrix/matrixMinMaxZ.js","../lib-esm/utils/addInfoData.js","../lib-esm/utils/checkNumberOrArray.js","../lib-esm/utils/checkMatrix.js","../lib-esm/utils/getExtremeValues.js","../lib-esm/utils/vectorEncoder.js","../lib-esm/creatorNtuples.js","../lib-esm/utils/getFactorNumber.js","../lib-esm/utils/getBestFactor.js","../lib-esm/utils/getNumber.js","../lib-esm/utils/peakTableCreator.js","../lib-esm/utils/rescaleAndEnsureInteger.js","../lib-esm/utils/xyDataCreator.js","../lib-esm/fromJSON.js","../lib-esm/fromVariables.js","../lib-esm/utils/getBestFactorMatrix.js","../lib-esm/from2DNMRVariables.js"],"sourcesContent":["const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n    return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.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 { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input) {\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}\n//# sourceMappingURL=xCheck.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 { 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","export function matrixCheck(data) {\n    if (data.length === 0 || data[0].length === 0) {\n        throw 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 { 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 const addInfoData = (data, keys = Object.keys(data), prefix = '##$') => {\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","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';\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';\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","/**\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    let 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    let 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    let 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    let 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    let numDiff = diffData.length;\n    while (index < numDiff) {\n        if (charCount === 0) {\n            // Start line\n            encodedNumber =\n                Math.ceil(firstX + index * intervalX) +\n                    squeezedDigit(data[index].toString()) +\n                    differenceDigit(diffData[index].toString());\n            encodedData += encodedNumber;\n            charCount += encodedNumber.length;\n        }\n        else {\n            // Try to insert next difference\n            if (diffData[index - 1] === diffData[index]) {\n                mult++;\n            }\n            else {\n                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                    // Mirar si cabe, en caso contrario iniciar una nueva linea\n                    encodedNumber = differenceDigit(diffData[index].toString());\n                    if (encodedNumber.length + charCount < maxLinelength) {\n                        encodedData += encodedNumber;\n                        charCount += encodedNumber.length;\n                    }\n                    else {\n                        // Iniciar nueva linea\n                        encodedData += newLine;\n                        temp =\n                            Math.ceil(firstX + index * intervalX) +\n                                squeezedDigit(data[index].toString()) +\n                                encodedNumber;\n                        encodedData += temp; // Each line start with first index number.\n                        charCount = temp.length;\n                    }\n                }\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 +=\n        newLine +\n            Math.ceil(firstX + index * intervalX) +\n            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    let diffData = new Array(data.length - 1);\n    for (i = 0; i < diffData.length; i++) {\n        diffData[i] = data[i + 1] - data[i];\n    }\n    let numDiff = diffData.length;\n    while (index < numDiff) {\n        if (charCount === 0) {\n            // We convert the first number.\n            encodedNumber =\n                Math.ceil(firstX + index * intervalX) +\n                    squeezedDigit(data[index].toString()) +\n                    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 =\n                    Math.ceil(firstX + index * intervalX) +\n                        squeezedDigit(data[index].toString()) +\n                        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 +=\n        newLine +\n            Math.ceil(firstX + index * intervalX) +\n            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 { xDivide } from 'ml-spectra-processing';\nimport { addInfoData } from './utils/addInfoData';\nimport { checkNumberOrArray } from './utils/checkNumberOrArray';\nimport { getExtremeValues } from './utils/getExtremeValues';\nimport { vectorEncoder } from './utils/vectorEncoder';\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 = {}, xyEncoding = '' } = options;\n    const { title = '', owner = '', origin = '', dataType = '', xFactor = 1, yFactor = 1, } = 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        let variable = variables[key];\n        if (!variable)\n            continue;\n        let name = variable?.label.replace(/ *\\[.*/, '');\n        let 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    const infoKeys = Object.keys(info).filter((e) => !['title', 'owner', 'origin', 'dataType'].includes(e));\n    header += addInfoData(info, infoKeys, '##');\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`;\n    if (options.isNMR) {\n        let xData = variables.x.data;\n        let yData = variables.y.data;\n        checkNumberOrArray(xData);\n        checkNumberOrArray(yData);\n        if (options.isPeakData) {\n            header += `##DATA TABLE= (XY..XY), PEAKS\\n`;\n            for (let point = 0; point < varDim[0]; point++) {\n                header += `${xData[point]}, ${yData[point]}\\n`;\n            }\n        }\n        else if (options.isXYData) {\n            const firstX = xData[0];\n            const lastX = xData[xData.length - 1];\n            const deltaX = (lastX - firstX) / xData.length;\n            for (const key of ['r', 'i']) {\n                const variable = variables[key];\n                if (variable) {\n                    checkNumberOrArray(variable.data);\n                    header += `##PAGE= ${key === 'r' ? 1 : 2}\\n`;\n                    header += `##DATA TABLE= (X++(${key === 'r' ? 'R..R' : 'I..I'})), XYDATA\\n`;\n                    header += vectorEncoder(xDivide(variable.data, yFactor, { output: variable.data }), firstX / xFactor, deltaX / xFactor, xyEncoding);\n                }\n            }\n        }\n    }\n    else {\n        header += `##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            let point = [];\n            for (let key of keys) {\n                let variable = variables[key];\n                if (!variable)\n                    continue;\n                point.push(variable.data[i]);\n            }\n            header += `${point.join('\\t')}\\n`;\n        }\n    }\n    header += `##NTUPLES= ${dataType}\\n`;\n    header += '##END=';\n    return header;\n}\n//# sourceMappingURL=creatorNtuples.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 (let 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 { 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    let lines = [];\n    for (let i = 0; i < data.x.length; i++) {\n        let x = data.x[i];\n        let 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 { xDivide } from 'ml-spectra-processing';\nexport function rescaleAndEnsureInteger(data, factor) {\n    if (factor === 1)\n        return data.map((value) => Math.round(value));\n    return xDivide(data, factor);\n}\n//# sourceMappingURL=rescaleAndEnsureInteger.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    let firstX = data.x[0];\n    let lastX = data.x[data.x.length - 1];\n    let firstY = data.y[0];\n    let lastY = data.y[data.y.length - 1];\n    let nbPoints = data.x.length;\n    let deltaX = (lastX - firstX) / (nbPoints - 1);\n    let 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    let 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 { addInfoData } from './utils/addInfoData';\nimport { getBestFactor } from './utils/getBestFactor';\nimport { peakTableCreator } from './utils/peakTableCreator';\nimport { xyDataCreator } from './utils/xyDataCreator';\nconst infoDefaultKeys = [\n    'title',\n    'owner',\n    'origin',\n    'dataType',\n    'xUnits',\n    'yUnits',\n    'xFactor',\n    'yFactor',\n];\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    let { title = '', owner = '', origin = '', dataType = '', xUnits = '', yUnits = '', 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    const infoKeys = Object.keys(info).filter((keys) => !infoDefaultKeys.includes(keys));\n    header += addInfoData(info, infoKeys, '##');\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 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    let jcampOptions = {\n        info,\n        meta,\n    };\n    let keys = Object.keys(variables).map((key) => key.toLowerCase());\n    if (keys.length === 2 &&\n        keys.includes('x') &&\n        keys.includes('y') &&\n        !forceNtuples) {\n        let x = variables.x;\n        let 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        let y = variables.y;\n        let 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 { 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 (let row of matrix) {\n        for (let 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 { 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 from variables\n */\nexport function from2DNMRVariables(\n/** object of variables */\nvariables, options = {}) {\n    const { info = {}, meta = {}, xyEncoding = 'DIFDUP' } = options;\n    const { title = '', owner = '', origin = '', dataType = '' } = 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 factor = [];\n    const keys = ['y', 'x', 'z'];\n    for (let i = 0; i < keys.length; i++) {\n        const key = keys[i];\n        let variable = variables[key];\n        if (!variable)\n            throw new Error('variables x, y and z are mandatory');\n        let name = variable?.label.replace(/ *\\[.*/, '');\n        let 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        //@ts-expect-error it will be included\n        factor.push(variable.factor || calculateFactor(variable.data, minMax));\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    const infoKeys = Object.keys(info).filter((e) => !['title', 'owner', 'origin', 'dataType'].includes(e));\n    header += addInfoData(info, infoKeys, '##');\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=    ${factor.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    let firstData = new Float64Array(3);\n    firstData[direct] = firstX * sfo1;\n    firstData[indirect] = firstY;\n    const yFactor = factor[indirect];\n    const xFactor = factor[direct];\n    const zFactor = factor[dependent];\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"],"names":["toString","Object","prototype","isAnyArray","value","call","endsWith","getOutputArray","output","length","undefined","TypeError","Float64Array","xCheck","input","xDivide","array1","array2","options","isConstant","constant","Error","Number","array3","i","xMinMaxValues","array","min","max","matrixCheck","data","RangeError","firstLength","matrixMinMaxZ","matrix","nbRows","nbColumns","column","row","addInfoData","keys","prefix","header","key","JSON","stringify","checkNumberOrArray","checkMatrix","getExtremeValues","firstRow","firstLast","first","last","minMax","newLine","pseudoDigits","SQZ_P","SQZ_N","DIF_P","DIF_N","DUP","maxLinelength","vectorEncoder","firstX","intervalX","xyEncoding","fixEncoding","squeezedEncoding","differenceEncoding","differenceDuplicateEncoding","commaSeparatedValuesEncoding","packedEncoding","separator","outputData","j","dataLength","Math","ceil","squeezedDigit","mult","index","charCount","encodedData","encodedNumber","temp","diffData","Array","numDiff","differenceDigit","duplicateDigit","num","sqzDigits","startsWith","charCodeAt","substring","diffDigits","dupDigits","creatorNtuples","variables","meta","info","title","owner","origin","dataType","xFactor","yFactor","symbol","varName","varType","varDim","units","variable","name","label","replace","unit","push","isDependent","infoKeys","filter","e","includes","join","isNMR","xData","x","yData","y","isPeakData","point","isXYData","lastX","deltaX","getFactorNumber","maxValue","factor","getBestFactor","onlyInteger","round","extremeValues","getNumber","number","rounded","abs","EPSILON","peakTableCreator","POSITIVE_INFINITY","NEGATIVE_INFINITY","firstY","lastY","lines","rescaleAndEnsureInteger","map","xyDataCreator","nbPoints","line","infoDefaultKeys","fromJSON","xUnits","yUnits","fromVariables","forceNtuples","jcampOptions","toLowerCase","xLabel","yLabel","getBestFactorMatrix","from2DNMRVariables","calculateFactor","checkMandatoryParameters","zData","z","direct","indirect","dependent","getDimensionIndices","nuc1","String","NUC1","nuc2","NUC2","nucleus","sfo1","SFO1","sfo2","SFO2","optionsScaleAndJoin","indices","scaleAndJoin","directSymbol","toUpperCase","indirectSymbol","deltaY","firstData","zFactor","copy","slice","entry","indexOf","list"],"mappings":"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"}