diff --git a/package-lock.json b/package-lock.json index f092eff5f..66346c589 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "ml-array-mean": "^2.0.0", "ml-array-median": "^2.0.0", "ml-conrec": "^6.0.0", - "ml-gsd": "^13.1.2", + "ml-gsd": "^14.0.1", "ml-signal-processing": "^2.2.1", "ml-spectra-processing": "^14.28.1", "ml-tree-similarity": "^2.2.0", @@ -439,7 +439,6 @@ "resolved": "https://registry.npmjs.org/@blueprintjs/core/-/core-6.12.1.tgz", "integrity": "sha512-HVWCbNjW6MLFrcWBGOMMsbn+Q4AqddDixCkNjXnO2Hjh7CQ/y27pPuZuEEIs0c90ADgLZaIL0d78B0RofFX1OQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@blueprintjs/colors": "^5.1.16", "@blueprintjs/icons": "^6.9.1", @@ -471,7 +470,6 @@ "resolved": "https://registry.npmjs.org/@blueprintjs/icons/-/icons-6.9.1.tgz", "integrity": "sha512-Zy4SY0jDaUoDJ9nMUM5PVaAuZx1ViQbEgaXElySb4MOdhxJMM97OY2YKL6sdJspZOsPPsuBG2DABd81JU3GSdA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "change-case": "^4.1.2", "classnames": "^2.3.1", @@ -493,7 +491,6 @@ "resolved": "https://registry.npmjs.org/@blueprintjs/select/-/select-6.1.10.tgz", "integrity": "sha512-QWvehtSZEgOboLCeC/UTvcNI3o7roRC3cMIJ9tXXxKcwRygzvDVAWL8AshKSrHW3Vpcl0/6koya1Yi+GO70vYg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@blueprintjs/colors": "^5.1.16", "@blueprintjs/core": "^6.12.1", @@ -548,7 +545,6 @@ "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -707,7 +703,6 @@ "integrity": "sha512-IQA++Idqb8fZzkCbHq3+T+9yG9WpeaBxomOrG2KcR/Pj0CgnovzuApYKL2cc35UWLePboKinMeqEPiweFpHVug==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=22.18.0" } @@ -789,8 +784,7 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.1.1.tgz", "integrity": "sha512-y/Vgo6qY08e1t9OqR56qjoFLBCpi4QfWMf2qzD1l9omRZwvSMQGRPz4x0bxkkkU4oocMAeztjzCsmLew//c/8w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@cspell/dict-dart": { "version": "2.3.2", @@ -930,16 +924,14 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.15.tgz", "integrity": "sha512-GJYnYKoD9fmo2OI0aySEGZOjThnx3upSUvV7mmqUu8oG+mGgzqm82P/f7OqsuvTaInZZwZbo+PwJQd/yHcyFIw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@cspell/dict-html-symbol-entities": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@cspell/dict-java": { "version": "5.0.12", @@ -1137,8 +1129,7 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@cspell/dict-vue": { "version": "3.0.5", @@ -1248,7 +1239,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=20.19.0" }, @@ -1297,7 +1287,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=20.19.0" } @@ -1385,7 +1374,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" @@ -1398,7 +1386,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -1472,7 +1459,6 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2636,7 +2622,6 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -3381,7 +3366,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -3413,7 +3397,6 @@ "integrity": "sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.2", @@ -3453,7 +3436,6 @@ "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.59.2", "@typescript-eslint/types": "8.59.2", @@ -3723,7 +3705,6 @@ "integrity": "sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.5", @@ -3991,7 +3972,6 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4529,7 +4509,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -5336,7 +5315,6 @@ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" @@ -5486,7 +5464,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -6041,7 +6018,6 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6852,7 +6828,6 @@ "resolved": "https://registry.npmjs.org/fifo-logger/-/fifo-logger-2.0.1.tgz", "integrity": "sha512-AwCaBK389hl67z4AJ5+8uOsxU07olw0DzowzA6Znr/eaItMCsXXxzA1DjY/KCABWu/4Bq+wrBhn1p7hsjNDv4g==", "license": "MIT", - "peer": true, "dependencies": { "typescript-event-target": "^1.1.1" } @@ -8355,7 +8330,6 @@ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -9259,15 +9233,15 @@ } }, "node_modules/ml-gsd": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-13.1.2.tgz", - "integrity": "sha512-MXdQEE/HRQO1e4LZ0EBcj23vnKCsLjWebiNQFDmun9vHji0BzC+/kOQf/2qosIZXiKgFZlaCVRC/veL2vdum+w==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-14.0.1.tgz", + "integrity": "sha512-cvWt1TpZL+JJ0Gk+BfR5R8ovXdYAhS3tWrFNXduQLQr6krMlncPFFM1j2FwfqD/iAt80yhIlCS2gr54uev+X9w==", "license": "MIT", "dependencies": { "cheminfo-types": "^1.15.0", "ml-peak-shape-generator": "^4.2.0", "ml-savitzky-golay-generalized": "^5.0.0", - "ml-spectra-fitting": "^5.0.1", + "ml-spectra-fitting": "^6.0.1", "ml-spectra-processing": "^14.28.1" } }, @@ -9414,6 +9388,32 @@ "ml-spectra-processing": "^14.28.1" } }, + "node_modules/ml-signal-processing/node_modules/ml-gsd": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-13.1.2.tgz", + "integrity": "sha512-MXdQEE/HRQO1e4LZ0EBcj23vnKCsLjWebiNQFDmun9vHji0BzC+/kOQf/2qosIZXiKgFZlaCVRC/veL2vdum+w==", + "license": "MIT", + "dependencies": { + "cheminfo-types": "^1.15.0", + "ml-peak-shape-generator": "^4.2.0", + "ml-savitzky-golay-generalized": "^5.0.0", + "ml-spectra-fitting": "^5.0.1", + "ml-spectra-processing": "^14.28.1" + } + }, + "node_modules/ml-signal-processing/node_modules/ml-spectra-fitting": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-5.0.1.tgz", + "integrity": "sha512-uqSc01tED7PNYYEvtPCAp7QGybZVi1K0HgHlqu5cAxjbpfnDS+XcOc2rTPprf8GoZ9Y3xL/fxyY4Gc5+Dh7e4A==", + "license": "MIT", + "dependencies": { + "cheminfo-types": "^1.7.2", + "ml-direct": "^1.0.0", + "ml-levenberg-marquardt": "^5.0.0", + "ml-peak-shape-generator": "^4.1.4", + "ml-spectra-processing": "^14.2.0" + } + }, "node_modules/ml-simple-clustering": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ml-simple-clustering/-/ml-simple-clustering-1.0.0.tgz", @@ -9430,9 +9430,9 @@ } }, "node_modules/ml-spectra-fitting": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-5.0.1.tgz", - "integrity": "sha512-uqSc01tED7PNYYEvtPCAp7QGybZVi1K0HgHlqu5cAxjbpfnDS+XcOc2rTPprf8GoZ9Y3xL/fxyY4Gc5+Dh7e4A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-6.0.1.tgz", + "integrity": "sha512-Izfi1ibuWsmnEivpoMK7GAEe16vHOL1V+4tIcL/YIsPuaUGvG1ydgmAOnkGxbYecM1QFgK1E3ZDFn0i2S9pzeA==", "license": "MIT", "dependencies": { "cheminfo-types": "^1.7.2", @@ -9603,6 +9603,19 @@ "spectrum-generator": "^8.2.0" } }, + "node_modules/nmr-processing/node_modules/ml-gsd": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-13.1.2.tgz", + "integrity": "sha512-MXdQEE/HRQO1e4LZ0EBcj23vnKCsLjWebiNQFDmun9vHji0BzC+/kOQf/2qosIZXiKgFZlaCVRC/veL2vdum+w==", + "license": "MIT", + "dependencies": { + "cheminfo-types": "^1.15.0", + "ml-peak-shape-generator": "^4.2.0", + "ml-savitzky-golay-generalized": "^5.0.0", + "ml-spectra-fitting": "^5.0.1", + "ml-spectra-processing": "^14.28.1" + } + }, "node_modules/nmr-processing/node_modules/ml-matrix-convolution": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ml-matrix-convolution/-/ml-matrix-convolution-2.0.0.tgz", @@ -9622,6 +9635,19 @@ "ml-matrix-convolution": "^2.0.0" } }, + "node_modules/nmr-processing/node_modules/ml-spectra-fitting": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-5.0.1.tgz", + "integrity": "sha512-uqSc01tED7PNYYEvtPCAp7QGybZVi1K0HgHlqu5cAxjbpfnDS+XcOc2rTPprf8GoZ9Y3xL/fxyY4Gc5+Dh7e4A==", + "license": "MIT", + "dependencies": { + "cheminfo-types": "^1.7.2", + "ml-direct": "^1.0.0", + "ml-levenberg-marquardt": "^5.0.0", + "ml-peak-shape-generator": "^4.1.4", + "ml-spectra-processing": "^14.2.0" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -9888,8 +9914,7 @@ "version": "9.22.1", "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.22.1.tgz", "integrity": "sha512-2eVe8uVNipaeWXuZMVk7vSqiPwyoWe2+klSjMopTDMtpr1n8hO8Q5er3+nXxBc5wMC4XRssZyVDhC/r8uj28xA==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/openchemlib-utils": { "version": "8.15.0", @@ -10311,7 +10336,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -10354,7 +10378,6 @@ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -10649,7 +10672,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -10675,7 +10697,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -10750,7 +10771,6 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.75.0.tgz", "integrity": "sha512-Ovv94H+0p3sJ7B9B5QxPuCP1u8V/cHuVGyH55cSwodYDtoJwK+fqk3vjfIgSX59I2U/bU4z0nRJ9HMLpNiWEmw==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.0.0" }, @@ -12597,7 +12617,6 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12787,7 +12806,6 @@ "integrity": "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", @@ -12881,7 +12899,6 @@ "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.1.5", "@vitest/mocker": "4.1.5", @@ -13270,7 +13287,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 58c263f90..a615e637d 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "ml-array-mean": "^2.0.0", "ml-array-median": "^2.0.0", "ml-conrec": "^6.0.0", - "ml-gsd": "^13.1.2", + "ml-gsd": "^14.0.1", "ml-signal-processing": "^2.2.1", "ml-spectra-processing": "^14.28.1", "ml-tree-similarity": "^2.2.0", diff --git a/src/component/1d/peaks/usePeakShapesPath.ts b/src/component/1d/peaks/usePeakShapesPath.ts index 530f7cad2..bbe7e9b20 100644 --- a/src/component/1d/peaks/usePeakShapesPath.ts +++ b/src/component/1d/peaks/usePeakShapesPath.ts @@ -28,12 +28,13 @@ export function usePeakShapesPath(spectrum: Spectrum1D) { const frequency = spectrum.info.originFrequency; let pathSeries: DataXY | null = null; + switch (target) { case 'peakShape': { const { peak } = options; pathSeries = peakToXY(peak, { frequency, - nbPoints: 1024, + nbPoints: Math.ceil(width * 3), from: peak.x - (peak.width / frequency) * 9, to: peak.x + (peak.width / frequency) * 9, }); @@ -43,9 +44,9 @@ export function usePeakShapesPath(spectrum: Spectrum1D) { const { peaks } = options; pathSeries = peaksToXY(peaks, { frequency, - nbPoints: width, + nbPoints: Math.ceil(width * 3), from: xDomain[0], - to: xDomain[1], + to:xDomain[1], }); break; } diff --git a/src/component/panels/PeaksPanel/PeaksPanel.tsx b/src/component/panels/PeaksPanel/PeaksPanel.tsx index 3840ae937..ec6e0ead3 100644 --- a/src/component/panels/PeaksPanel/PeaksPanel.tsx +++ b/src/component/panels/PeaksPanel/PeaksPanel.tsx @@ -105,11 +105,11 @@ function PeaksPanelInner(props: PeaksPanelInnerProps) { const filterPeaks = peaks.values.filter((peak) => isInRange(peak.x, { from, to }), ); - if (filterPeaks.length <= 4) { + if (filterPeaks.length <= 15) { dispatch({ type: 'OPTIMIZE_PEAKS', payload: { peaks: filterPeaks } }); } else { toaster.show({ - message: 'optimization can be done on no more than 4 peaks', + message: 'optimization can be done on no more than 15 peaks', intent: 'danger', }); } diff --git a/src/data/data1d/Spectrum1D/peaks/optimizePeaks.ts b/src/data/data1d/Spectrum1D/peaks/optimizePeaks.ts index 486d13586..43b500c05 100644 --- a/src/data/data1d/Spectrum1D/peaks/optimizePeaks.ts +++ b/src/data/data1d/Spectrum1D/peaks/optimizePeaks.ts @@ -31,10 +31,86 @@ export function optimizePeaks( x = x.subarray(fromIndex, ToIndex); re = re.subarray(fromIndex, ToIndex); - const newPeaks = xyPeaksOptimization({ x, y: re }, peaks, { + let newPeaks = xyPeaksOptimization({ x, y: re }, peaks, { frequency, groupingFactor: 3, + optimization: { kind: 'lm', options: { maxIterations: 20 } }, + parameters: { + fwhm: { + optimize: true, + min: (peak) => (peak.shape?.fwhm ?? 0) / 3, + max: (peak) => (peak.shape?.fwhm ?? 0) * 3, + }, + mu: { optimize: false }, + x: { optimize: false }, + y: { + optimize: true, + min: 0, + init: (peak) => peak.y * 0.8, + }, + } }); + + newPeaks = xyPeaksOptimization({ x, y: re }, newPeaks, { + frequency, + groupingFactor: 3, + optimization: { kind: 'lm', options: { maxIterations: 20, } }, + parameters: { + fwhm: { + optimize: true, + min: (peak) => (peak.shape?.fwhm ?? 0) / 3, + max: (peak) => (peak.shape?.fwhm ?? 0) * 3, + }, + mu: { optimize: true }, + x: { optimize: false }, + y: { + optimize: true, + min: 0, + }, + } + }); + + + newPeaks = xyPeaksOptimization({ x, y: re }, newPeaks, { + frequency, + groupingFactor: 4, + optimization: { kind: 'lm', options: { maxIterations: 20, } }, + parameters: { + fwhm: { + optimize: true, + min: (peak) => (peak.shape?.fwhm ?? 0) / 2, + max: (peak) => (peak.shape?.fwhm ?? 0) * 2, + }, + mu: { + optimize: false, + }, + x: { optimize: true }, + y: { optimize: true, + min: 0, + }, + } + }); + + newPeaks = xyPeaksOptimization({ x, y: re }, newPeaks, { + frequency, + groupingFactor: 3, + optimization: { kind: 'lm', options: { maxIterations: 10 } }, + parameters: { + fwhm: { + optimize: true, + min: (peak) => (peak.shape?.fwhm ?? 0) / 2, + max: (peak) => (peak.shape?.fwhm ?? 0) * 2, + }, + mu: { + optimize: true, + }, + x: { optimize: true }, + y: { optimize: true, + min: 0, + }, + } + }); + return mapPeaks(spectrum.peaks.values.concat(newPeaks), spectrum, { checkIsExisting: false, });