{"version":3,"file":"screening.umd.js","sources":["../lib/utils/numberToString.js","../lib/utils/numberToPosition.js","../lib/utils/stringToNumber.js","../lib/utils/positionToNumber.js","../lib/plate.js","../lib/generateIconNMRFile.js","../lib/generateIconNMRFileFromPlate.js"],"sourcesContent":["/**\n * Convert number like 1 to string like 'A'\n * @param number\n * @returns\n */\nexport function numberToString(number) {\n    let string = '';\n    while (number !== 0) {\n        string = String.fromCodePoint(((number - 1) % 26) + 65) + string;\n        number = Math.floor((number - 1) / 26);\n    }\n    return string;\n}\n//# sourceMappingURL=numberToString.js.map","import { numberToString } from \"./numberToString.js\";\n/**\n * Convert number like 5 to plate position 'A5'\n * @param number\n * @param width\n * @returns\n */\nexport function numberToPosition(number, width) {\n    if (width === undefined) {\n        throw new Error('need to specify width for numberToPosition');\n    }\n    number--;\n    return (numberToString(Math.floor(number / width) + 1) +\n        String((number % width) + 1));\n}\n//# sourceMappingURL=numberToPosition.js.map","/**\n * Convert string like 'A' to number like 1\n * @param string\n * @returns\n */\nexport function stringToNumber(string) {\n    let number = 0;\n    for (let i = 0; i < string.length; i++) {\n        number *= 26;\n        number += Number(string.codePointAt(i)) - 64;\n    }\n    return number;\n}\n//# sourceMappingURL=stringToNumber.js.map","import { stringToNumber } from \"./stringToNumber.js\";\n/**\n * Convert plate position like 'A5' to 5\n * @param position\n * @param width\n * @returns number\n */\nexport function positionToNumber(position, width) {\n    if (width === undefined) {\n        throw new Error('need to specify width for numberToPosition');\n    }\n    position = position.toUpperCase().replaceAll(/[^0-9A-Z]/g, '');\n    const string = position.replace(/[0-9]+/, '');\n    const number = Number(position.replace(/[A-Z]+/, ''));\n    return (stringToNumber(string) - 1) * width + number * 1;\n}\n//# sourceMappingURL=positionToNumber.js.map","import { numberToPosition } from \"./utils/numberToPosition.js\";\nimport { positionToNumber } from \"./utils/positionToNumber.js\";\nexport class Plate {\n    width;\n    height;\n    size;\n    wells = [];\n    constructor(options = {}) {\n        this.width = options.width ?? 12;\n        this.height = options.height ?? (this.width / 3) * 2;\n        this.size = this.width * this.height;\n        this.initialize();\n    }\n    getWells() {\n        return this.wells;\n    }\n    select(range) {\n        if (range) {\n            // reset all\n            for (const well of this.wells) {\n                well.selected = false;\n            }\n            const reg = /(\\d+)(-(\\d+))?,?/g;\n            let m;\n            while ((m = reg.exec(range))) {\n                const from = Number(m[1]);\n                const to = m[3] ? Number(m[3]) : undefined;\n                if (to && from <= to) {\n                    for (let i = from; i <= to; i++) {\n                        const well = this.wells[i - 1];\n                        if (!isEmpty(well.info))\n                            well.selected = true;\n                    }\n                }\n                else {\n                    const well = this.wells[from - 1];\n                    if (!isEmpty(well.info))\n                        well.selected = true;\n                }\n            }\n        }\n        else {\n            // auto-select wells with info\n            for (const well of this.wells) {\n                well.selected = !isEmpty(well.info);\n            }\n        }\n    }\n    getArrayElement(index) {\n        return this.wells[index];\n    }\n    updateColor() {\n        for (const well of this.wells) {\n            if (isEmpty(well.info)) {\n                // empty well = white\n                well.info.color = 'white';\n            }\n            else if (well.selected) {\n                // selected = strong highlight\n                well.info.color = 'rgba(144, 238, 144, 1)';\n            }\n            else {\n                // unselected = faded highlight\n                well.info.color = 'rgba(144, 238, 144, 0.3)';\n            }\n        }\n    }\n    getByPosition(position) {\n        const index = positionToNumber(position, this.width) - 1;\n        return this.wells[index];\n    }\n    getByNumber(number) {\n        return this.wells[number - 1];\n    }\n    initialize() {\n        this.wells = new Array(this.size);\n        for (let row = 0; row < this.height; row++) {\n            for (let column = 0; column < this.width; column++) {\n                const i = row * this.width + column;\n                this.wells[i] = {\n                    number: i + 1,\n                    position: numberToPosition(i + 1, this.width),\n                    info: {},\n                };\n            }\n        }\n    }\n}\n// ----------- Helpers -----------\nfunction isEmpty(object) {\n    return (object &&\n        typeof object === 'object' &&\n        !Array.isArray(object) &&\n        Object.keys(object).length === 0);\n}\n//# sourceMappingURL=plate.js.map","/**\n * Generate iconNMR text file from requests\n * @param requests - array of PlateRequest objects\n * @param options - options for generating the file\n * @returns iconNMR text file\n */\nexport function generateIconNMRFile(requests, options = {}) {\n    const { eol = '\\r\\n', deleteExistingHolder = false, autoSubmit = false, } = options;\n    const textFile = [];\n    for (const request of requests) {\n        let experimentNumberCounter = 1;\n        const { holder } = request;\n        if (deleteExistingHolder) {\n            textFile.push(`USER ${request.user}`, `HOLDER ${holder}`, 'DELETE'); // this is required to delete already existing entries\n        }\n        textFile.push(`USER ${request.user}`, `HOLDER ${holder}`);\n        if (!autoSubmit)\n            textFile.push('NO_SUBMIT');\n        textFile.push(`NAME ${request.name}`, `TITLE ${request.title}`);\n        for (const experiment of request.experiments) {\n            let experimentNumber = experiment.experimentNumber || experimentNumberCounter++;\n            textFile.push(`EXPNO ${experimentNumber++}`, `SOLVENT ${experiment.solvent}`, `EXPERIMENT ${experiment.experiment}`);\n            if (experiment.parameters && experiment.parameters.length > 0) {\n                const parameters = [];\n                for (const parameter of experiment.parameters) {\n                    parameters.push(parameter.label, parameter.value);\n                }\n                textFile.push(`PARAMETERS ${parameters.join(',')}`);\n            }\n        }\n        textFile.push('');\n    }\n    return textFile.join(eol);\n}\n//# sourceMappingURL=generateIconNMRFile.js.map","import { generateIconNMRFile } from \"./generateIconNMRFile.js\";\nimport { positionToNumber } from \"./utils/positionToNumber.js\";\n/**\n * Generate iconNMR text file from requests with plate positions\n * @param requests - array of PlateRequest objects\n * @param options - options for generating the file\n * @returns iconNMR text file\n */\nexport function generateIconNMRFileFromPlate(requests, options = {}) {\n    const { plateNumber = 1 } = options;\n    const holderRequests = [];\n    for (const request of requests) {\n        const { position, holder, experiments, ...rest } = request;\n        const newHolder = holder ?? getHolder(position, plateNumber);\n        let experimentNumber = getExperimentNumber(position);\n        const experimentsWithHolder = [];\n        for (const experiment of experiments) {\n            experimentsWithHolder.push({\n                experimentNumber: experimentNumber++,\n                ...experiment,\n            });\n        }\n        holderRequests.push({\n            holder: newHolder,\n            experiments: experimentsWithHolder,\n            ...rest,\n        });\n    }\n    return generateIconNMRFile(holderRequests, options);\n}\nfunction getHolder(position, plateNumber) {\n    return plateNumber * 100 + positionToNumber(position, 12);\n}\nfunction getExperimentNumber(position) {\n    return positionToNumber(position, 12) * 10;\n}\n//# sourceMappingURL=generateIconNMRFileFromPlate.js.map"],"names":["numberToString","number","string","String","fromCodePoint","Math","floor","numberToPosition","width","undefined","Error","stringToNumber","i","length","Number","codePointAt","positionToNumber","position","toUpperCase","replaceAll","replace","Plate","height","size","wells","constructor","options","initialize","getWells","select","range","well","selected","reg","m","exec","from","to","isEmpty","info","getArrayElement","index","updateColor","color","getByPosition","getByNumber","Array","row","column","object","isArray","Object","keys","generateIconNMRFile","requests","eol","deleteExistingHolder","autoSubmit","textFile","request","experimentNumberCounter","holder","push","user","name","title","experiment","experiments","experimentNumber","solvent","parameters","parameter","label","value","join","generateIconNMRFileFromPlate","plateNumber","holderRequests","rest","newHolder","getHolder","getExperimentNumber","experimentsWithHolder"],"mappings":"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"}