From f72ae250feede595c56746c13eddea84ba8bf5f7 Mon Sep 17 00:00:00 2001 From: jobo322 Date: Tue, 3 Dec 2024 10:28:40 -0500 Subject: [PATCH 1/9] fix: apply phase correction to the region n reduce critFoundJ to 0.75 --- .../modal/MultipletAnalysisModal.tsx | 105 +++++++++++------- .../detectSignalsByMultipletAnalysis.ts | 1 + 2 files changed, 64 insertions(+), 42 deletions(-) diff --git a/src/component/modal/MultipletAnalysisModal.tsx b/src/component/modal/MultipletAnalysisModal.tsx index 2287f3f5e..6db6c5755 100644 --- a/src/component/modal/MultipletAnalysisModal.tsx +++ b/src/component/modal/MultipletAnalysisModal.tsx @@ -1,6 +1,12 @@ -import { Dialog } from '@blueprintjs/core'; +/** @jsxImportSource @emotion/react */ +import { Dialog, DialogBody } from '@blueprintjs/core'; import styled from '@emotion/styled'; -import { xGetFromToIndex, xyToXYObject } from 'ml-spectra-processing'; +import type { DoubleArray } from 'cheminfo-types'; +import { + xGetFromToIndex, + xyToXYObject, + reimPhaseCorrection, +} from 'ml-spectra-processing'; import { analyseMultiplet } from 'multiplet-analysis'; import type { ActiveSpectrum } from 'nmr-load-save'; import { useEffect, useState } from 'react'; @@ -9,44 +15,6 @@ import { Axis, LineSeries, Plot } from 'react-plot'; import { isSpectrum2D } from '../../data/data2d/Spectrum2D/index.js'; import { useChartData } from '../context/ChartContext.js'; import { useScaleChecked } from '../context/ScaleContext.js'; -import { StyledDialogBody } from '../elements/StyledDialogBody.js'; - -const DialogBody = styled(StyledDialogBody)` - button:focus { - outline: none; - } - - .header { - color: #464646; - font-size: 15px; - height: 20px; - } - - .container { - padding: 10px; - max-height: 500px; - overflow-y: auto; - - .row { - outline: none; - display: flex !important; - flex-direction: row; - margin: 0; - - .multiplicity { - flex: 2; - display: flex; - align-items: center; - justify-content: center; - padding: 0 20px; - } - } - - .row:nth-child(odd) { - background: #fafafa; - } - } -`; const LoaderContainer = styled.div` display: flex; @@ -138,7 +106,7 @@ function InnerMultipleAnalysis(props: InnerMultipleAnalysisProps) { } const { - data: { x, re }, + data: { x, re, im }, info, } = spectrum; @@ -149,18 +117,34 @@ function InnerMultipleAnalysis(props: InnerMultipleAnalysisProps) { from, to, }); + + let currentRe = re.slice(fromIndex, toIndex); + if (im) { + const currentIm = im.slice(fromIndex, toIndex); + const ph0 = autoPhaseRegion(currentRe, currentIm); + const phased = reimPhaseCorrection( + { re: currentRe, im: currentIm }, + toRadians(ph0), + 0, + ); + currentRe = phased.re; + } + const analysesProps = { x: x.slice(fromIndex, toIndex), y: re.slice(fromIndex, toIndex), }; + try { const result = analyseMultiplet(analysesProps, { frequency: info.originFrequency, minimalResolution: 0.1, + critFoundJ: 0.75, maxTestedJ: 17, + minTestedJ: 1, takeBestPartMultiplet: true, correctVerticalOffset: true, - symmetrizeEachStep: true, + symmetrizeEachStep: false, decreasingJvalues: true, makeShortCutForSpeed: true, debug: true, @@ -257,3 +241,40 @@ function InnerMultipleAnalysis(props: InnerMultipleAnalysisProps) { ); } + +function autoPhaseRegion(re: DoubleArray, im: DoubleArray): any { + let start = -180; + let stop = 180; + const nSteps = 6; + let maxSteps = 10; + + let bestAng = 0; + let minArea = Number.MAX_SAFE_INTEGER; + while (maxSteps > 0) { + const dAng = (stop - start) / (nSteps + 1); + for (let i = start; i <= stop; i += dAng) { + const tmpPhased = reimPhaseCorrection({ re, im }, toRadians(i), 0); + const negArea = getNegArea(tmpPhased.re); + if (negArea < minArea) { + [minArea, bestAng] = [negArea, i]; + } + } + start = bestAng - dAng; + stop = bestAng + dAng; + maxSteps--; + } + + return bestAng; +} + +function toRadians(degree: number): number { + return (degree * Math.PI) / 180; +} + +function getNegArea(data: DoubleArray): number { + let area = 0; + for (const element of data) { + if (element < 0) area -= element; + } + return area; +} diff --git a/src/data/data1d/Spectrum1D/ranges/detectSignalsByMultipletAnalysis.ts b/src/data/data1d/Spectrum1D/ranges/detectSignalsByMultipletAnalysis.ts index 55bbd2bed..e50473705 100644 --- a/src/data/data1d/Spectrum1D/ranges/detectSignalsByMultipletAnalysis.ts +++ b/src/data/data1d/Spectrum1D/ranges/detectSignalsByMultipletAnalysis.ts @@ -81,6 +81,7 @@ export function detectSignalsByMultipletAnalysis( checkSymmetryFirst: true, takeBestPartMultiplet: true, correctVerticalOffset: true, + critFoundJ: 0.75, symmetrizeEachStep: false, decreasingJvalues: true, makeShortCutForSpeed: true, From 10796378d95b96f1093f7b86fa61b9d117178230 Mon Sep 17 00:00:00 2001 From: jobo322 Date: Tue, 3 Dec 2024 12:40:11 -0500 Subject: [PATCH 2/9] chore: update nmr-processing --- package-lock.json | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6a33e73b4..a3e516edc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,9 +42,9 @@ "ml-stat": "^1.3.3", "ml-tree-similarity": "^2.2.0", "multiplet-analysis": "^2.1.5", - "nmr-correlation": "2.3.3", - "nmr-load-save": "^3.0.0", - "nmr-processing": "^16.0.0", + "nmr-correlation": "^2.3.3", + "nmr-load-save": "^2.2.0", + "nmr-processing": "^14.0.6", "nmredata": "^0.9.11", "numeral": "^2.0.6", "openchemlib": "^8.18.1", @@ -9439,8 +9439,33 @@ "filelist-utils": "^1.11.2", "gyromagnetic-ratio": "^1.2.1", "is-any-array": "^2.0.1", - "jcampconverter": "^11.0.0", - "jeolconverter": "^1.0.4", + "jcampconverter": "^10.0.1", + "jeolconverter": "^1.0.3", + "lodash.merge": "^4.6.2", + "ml-spectra-processing": "^14.6.2", + "nmr-correlation": "^2.3.3", + "nmr-processing": "^14.0.5", + "nmredata": "^0.9.11", + "openchemlib": "^8.17.0", + "openchemlib-utils": "^6.4.1", + "sdf-parser": "^6.0.1", + "varian-converter": "^1.0.0" + } + }, + "node_modules/nmr-processing": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-14.0.6.tgz", + "integrity": "sha512-IiMe2CUOFXx5OW0c48AdwC3jNcjVc3Pwxnqst401igDaeMeqCMf6+a5epKZkvWddCB1XA5Qruq4YGsRgTYLMDg==", + "license": "MIT", + "dependencies": { + "@lukeed/uuid": "^2.0.1", + "@types/d3-color": "^3.1.3", + "@types/d3-interpolate": "^3.0.4", + "binary-search": "^1.3.6", + "d3-color": "^2.0.0", + "d3-interpolate": "^2.0.1", + "gyromagnetic-ratio": "^1.2.1", + "is-any-array": "^2.0.1", "linear-sum-assignment": "^1.0.7", "lodash.merge": "^4.6.2", "ml-spectra-processing": "^14.9.2", From 16ad07ce42e189b47e3d98212bd7fb382bca7c81 Mon Sep 17 00:00:00 2001 From: jobo322 Date: Tue, 3 Dec 2024 16:57:20 -0500 Subject: [PATCH 3/9] fix: improve auto-processing 2D raw data --- package-lock.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index a3e516edc..6b60d71d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "ml-tree-similarity": "^2.2.0", "multiplet-analysis": "^2.1.5", "nmr-correlation": "^2.3.3", - "nmr-load-save": "^2.2.0", + "nmr-load-save": "^2.2.1", "nmr-processing": "^14.0.6", "nmredata": "^0.9.11", "numeral": "^2.0.6", @@ -9425,10 +9425,10 @@ } }, "node_modules/nmr-load-save": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-3.0.0.tgz", - "integrity": "sha512-9cB0XLtIGfPeklOLCXUS99CHVJjf+CGQ2hkv29GAT8C2oxs2JSqObxgldzv+QX0LAtXxB1t1zK+x2etEjzZbRg==", - "license": "CC BY-NC-SA 4.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-2.2.1.tgz", + "integrity": "sha512-gjO+AG2y7x2e6O9pe+zlUVZEEl0b/mdUGnGvmKN8H52QnpZLvL62kzeJOetVUSE+Cm2iuH8J56oNp9YS7K3MDA==", + "license": "MIT", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.9", From 7caad9b8d898b68bd9c39030c34e5dcb1ff0f432 Mon Sep 17 00:00:00 2001 From: jobo322 Date: Wed, 4 Dec 2024 08:49:16 -0500 Subject: [PATCH 4/9] chore: add 2D processing FID --- .../data/brukerFolders/hsqcBrukerFilters.json | 281 ++++++++++++++++++ src/demo/samples.json | 3 + 2 files changed, 284 insertions(+) create mode 100644 public/data/brukerFolders/hsqcBrukerFilters.json diff --git a/public/data/brukerFolders/hsqcBrukerFilters.json b/public/data/brukerFolders/hsqcBrukerFilters.json new file mode 100644 index 000000000..5cd323831 --- /dev/null +++ b/public/data/brukerFolders/hsqcBrukerFilters.json @@ -0,0 +1,281 @@ +{ + "version": 7, + "data": { + "source": { + "entries": [ + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/acqu" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/acqu2" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/acqu2s" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/acqus" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/pdata/1/proc" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/pdata/1/proc2" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/pdata/1/proc2s" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/pdata/1/procs" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/2/ser" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/acqu" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/acqu2" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/acqu2s" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/acqus" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/pdata/1/proc" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/pdata/1/proc2" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/pdata/1/proc2s" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/pdata/1/procs" + }, + { + "baseURL": "", "relativePath": "data/brukerFolders/cosyAndHsqcFid/3/ser" + } + ] + }, + "spectra": [ + { + "id": "1349b256-7a33-4d90-9c7f-cc2e43f3be89", + "meta": {}, + "filters": [ + { + "name": "apodizationDimension1", + "value": { + "exponential": { + "apply": false, + "options": { "lineBroadening": 0.3 } + }, + "sineBell": { "apply": false, "options": { "offset": 0.5 } }, + "sineSquare": { "apply": true, "options": { "offset": 0.5 } }, + "traf": { "apply": false, "options": { "lineBroadening": 0.3 } }, + "gaussian": { + "apply": false, + "options": { "lineBroadening": 0.3, "lineBroadeningCenter": 0 } + } + }, + "enabled": true, + "id": "b2567a33-4d90-4c7f-8c2e-43f3be893962" + }, + { + "name": "zeroFillingDimension1", + "value": { "nbPoints": 1024 }, + "enabled": true, + "id": "567a334d-905c-4fcc-ae43-f3be8939623c" + }, + { + "name": "fftDimension1", + "value": {}, + "enabled": true, + "id": "7a334d90-5c7f-4c2e-83f3-be8939623c3d" + }, + { + "name": "apodizationDimension2", + "value": { + "exponential": { + "apply": false, + "options": { "lineBroadening": 0.3 } + }, + "sineBell": { "apply": false, "options": { "offset": 0.5 } }, + "sineSquare": { "apply": true, "options": { "offset": 0.5 } }, + "traf": { "apply": false, "options": { "lineBroadening": 0.3 } }, + "gaussian": { + "apply": false, + "options": { "lineBroadening": 0.3, "lineBroadeningCenter": 0 } + } + }, + "enabled": true, + "id": "334d905c-7fcc-4e43-b3be-8939623c3d36" + }, + { + "name": "zeroFillingDimension2", + "value": { "nbPoints": 1024 }, + "enabled": true, + "id": "4d905c7f-cc2e-43f3-be89-39623c3d3670" + }, + { + "name": "fftDimension2", + "value": {}, + "enabled": true, + "id": "905c7fcc-2e43-43be-8939-623c3d367007" + }, + { + "name": "phaseCorrectionTwoDimensions", + "value": { + "horizontal": { "ph0": 33.84521484375, "ph1": -5.625 }, + "vertical": { "ph0": -15.28564453125, "ph1": 33.75 } + }, + "enabled": true, + "id": "5c7fcc2e-43f3-4e89-b962-3c3d36700728" + } + ], + "info": {}, + "display": { + "isPositiveVisible": true, + "isNegativeVisible": true, + "isVisible": true, + "contourOptions": { + "positive": { "contourLevels": [47, 100], "numberOfLayers": 10 }, + "negative": { "contourLevels": [47, 100], "numberOfLayers": 10 } + }, + "dimension": 2, + "negativeColor": "yellow", + "positiveColor": "black" + }, + "data": {}, + "sourceSelector": { + "files": [ + "data/brukerFolders/cosyAndHsqcFid/3/acqu2s", + "data/brukerFolders/cosyAndHsqcFid/3/acqus", + "data/brukerFolders/cosyAndHsqcFid/3/ser", + "data/brukerFolders/cosyAndHsqcFid/3/pdata/1/procs", + "data/brukerFolders/cosyAndHsqcFid/3/pdata/1/proc2s" + ] + }, + "zones": { + "values": [], + "options": { "isSumConstant": true, "sumAuto": true } + }, + "customInfo": {} + }, + { + "id": "7b9a1a5f-da6e-4dc9-88f1-18972ad0f7e7", + "meta": {}, + "sourceSelector": { + "files": [ + "data/brukerFolders/cosyAndHsqcFid/2/acqu2s", + "data/brukerFolders/cosyAndHsqcFid/2/acqus", + "data/brukerFolders/cosyAndHsqcFid/2/ser", + "data/brukerFolders/cosyAndHsqcFid/2/pdata/1/procs", + "data/brukerFolders/cosyAndHsqcFid/2/pdata/1/proc2s" + ] + }, + "filters": [ + { + "name": "apodizationDimension1", + "value": { + "exponential": { + "apply": false, + "options": { "lineBroadening": 0.3 } + }, + "sineBell": { + "apply": true, + "options": { "offset": 0, "exponent": 1 } + }, + "sineSquare": { "apply": false, "options": { "offset": 0 } }, + "traf": { "apply": false, "options": { "lineBroadening": 0.3 } }, + "gaussian": { + "apply": false, + "options": { "lineBroadening": 0.3, "lineBroadeningCenter": 0 } + } + }, + "enabled": true, + "id": "1a5fda6e-9dc9-48f1-9897-2ad0f7e70197" + }, + { + "name": "zeroFillingDimension1", + "value": { "nbPoints": 1024 }, + "enabled": true, + "id": "5fda6e9d-c948-4118-972a-d0f7e70197ad" + }, + { + "name": "fftDimension1", + "value": {}, + "enabled": true, + "id": "da6e9dc9-48f1-4897-aad0-f7e70197ad07" + }, + { + "name": "apodizationDimension2", + "value": { + "exponential": { + "apply": false, + "options": { "lineBroadening": 0.3 } + }, + "sineBell": { + "apply": true, + "options": { "offset": 0, "exponent": 1 } + }, + "sineSquare": { "apply": false, "options": { "offset": 0 } }, + "traf": { "apply": false, "options": { "lineBroadening": 0.3 } }, + "gaussian": { + "apply": false, + "options": { "lineBroadening": 0.3, "lineBroadeningCenter": 0 } + } + }, + "enabled": true, + "id": "6e9dc948-f118-472a-90f7-e70197ad075d" + }, + { + "name": "zeroFillingDimension2", + "value": { "nbPoints": 1024 }, + "enabled": true, + "id": "9dc948f1-1897-4ad0-b7e7-0197ad075d90" + }, + { + "name": "fftDimension2", + "value": {}, + "enabled": true, + "id": "c948f118-972a-40f7-a701-97ad075d90f1" + }, + { + "name": "phaseCorrectionTwoDimensions", + "value": {}, + "enabled": true, + "id": "48f11897-2ad0-47e7-8197-ad075d90f11e", + "error": "Phase correction is not applicable to raw data" + }, + { + "name": "symmetrizeCosyLike", + "value": {}, + "enabled": false, + "id": "f118972a-d0f7-4701-97ad-075d90f11e9a" + } + ], + "info": {}, + "display": { + "isPositiveVisible": true, + "isNegativeVisible": true, + "isVisible": true, + "contourOptions": { + "positive": { "contourLevels": [51, 100], "numberOfLayers": 10 }, + "negative": { "contourLevels": [51, 100], "numberOfLayers": 10 } + }, + "dimension": 2, + "negativeColor": "blue", + "positiveColor": "darkblue" + }, + "data": {}, + "zones": { + "values": [], + "options": { "isSumConstant": true, "sumAuto": true } + }, + "customInfo": {} + } + ] + } +} diff --git a/src/demo/samples.json b/src/demo/samples.json index 1905fab24..0c676502e 100644 --- a/src/demo/samples.json +++ b/src/demo/samples.json @@ -151,6 +151,9 @@ { "file": "./data/brukerFolders/cosyAndHsqcFid.json", "title": "Bruker Directory 2D FIDs" + },{ + "file": "./data/brukerFolders/hsqcBrukerFilters.json", + "title": "Bruker Directory 2D processing" }, { "file": "./data/cytisine/1H_Cytisin_linkJcamp.json", From 5f1302e00362f4423e9889f2c7a0c73837324079 Mon Sep 17 00:00:00 2001 From: jobo322 Date: Thu, 5 Dec 2024 11:30:01 -0500 Subject: [PATCH 5/9] refactor: use xreimMultipletAnalysis for manual range picking mulitplicity detection --- package-lock.json | 157 ++++++++---------- .../modal/MultipletAnalysisModal.tsx | 96 +++-------- .../detectSignalsByMultipletAnalysis.ts | 40 +++-- 3 files changed, 122 insertions(+), 171 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b60d71d5..2e3fc73f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "multiplet-analysis": "^2.1.5", "nmr-correlation": "^2.3.3", "nmr-load-save": "^2.2.1", - "nmr-processing": "^14.0.6", + "nmr-processing": "file:../nmr-processing", "nmredata": "^0.9.11", "numeral": "^2.0.6", "openchemlib": "^8.18.1", @@ -111,6 +111,73 @@ "react-dom": ">=18.0.0" } }, + "../nmr-processing": { + "version": "14.0.5", + "license": "MIT", + "dependencies": { + "@lukeed/uuid": "^2.0.1", + "@types/d3-color": "^3.1.3", + "@types/d3-interpolate": "^3.0.4", + "binary-search": "^1.3.6", + "d3-color": "^2.0.0", + "d3-interpolate": "^2.0.1", + "gyromagnetic-ratio": "^1.2.1", + "is-any-array": "^2.0.1", + "linear-sum-assignment": "^1.0.7", + "lodash.omit": "^4.5.0", + "ml-airpls": "^2.0.0", + "ml-direct": "^1.0.0", + "ml-gsd": "^12.1.8", + "ml-hclust": "^3.1.0", + "ml-levenberg-marquardt": "^4.1.3", + "ml-matrix": "^6.11.1", + "ml-matrix-convolution": "^1.0.0", + "ml-matrix-peaks-finder": "^1.0.0", + "ml-peak-shape-generator": "^4.1.4", + "ml-regression-base": "^4.0.0", + "ml-regression-exponential": "^3.0.1", + "ml-regression-polynomial": "^3.0.1", + "ml-regression-simple-linear": "^3.0.1", + "ml-savitzky-golay-generalized": "^4.2.0", + "ml-signal-processing": "^1.1.1", + "ml-simple-clustering": "^0.1.0", + "ml-sparse-matrix": "^2.1.0", + "ml-spectra-processing": "^14.6.0", + "ml-tree-set": "^0.1.1", + "multiplet-analysis": "^2.1.4", + "nmr-correlation": "^2.3.3", + "numeral": "^2.0.6", + "openchemlib-utils": "^6.4.1", + "spectrum-generator": "^8.0.11" + }, + "devDependencies": { + "@microsoft/api-extractor": "^7.47.10", + "@types/lodash.omit": "^4.5.9", + "@types/node": "^22.7.5", + "@types/numeral": "^2.0.5", + "@vitest/coverage-v8": "^2.1.3", + "bruker-data-test": "^0.5.4", + "brukerconverter": "^7.0.3", + "cheminfo-build": "^1.2.0", + "cheminfo-types": "^1.8.1", + "esbuild": "^0.24.0", + "eslint": "^9.12.0", + "eslint-config-cheminfo-typescript": "^16.0.0", + "fifo-logger": "^1.0.0", + "filelist-utils": "^1.11.2", + "globals": "^15.11.0", + "jcamp-data-test": "^0.8.1", + "jest-matcher-deep-close-to": "^3.0.2", + "nmr-load-save": "^2.1.0", + "nmr-xy-testdata": "^0.5.1", + "openchemlib": "^8.17.0", + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "typescript": "~5.6.3", + "undici": "^6.20.1", + "vitest": "^2.1.3" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -3147,6 +3214,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-contour": { @@ -3243,6 +3311,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-color": "*" @@ -7608,12 +7677,6 @@ "tslib": "^2.0.3" } }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "license": "MIT" - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -7810,15 +7873,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/install": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", - "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -8636,18 +8690,6 @@ "immediate": "~3.0.5" } }, - "node_modules/linear-sum-assignment": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/linear-sum-assignment/-/linear-sum-assignment-1.0.7.tgz", - "integrity": "sha512-jfLoSGwZNyjfY8eK4ayhjfcIu3BfWvP6sWieYzYI3AWldwXVoWEz1gtrQL10v/8YltYLBunqNjeVFXPMUs+MJg==", - "license": "MIT", - "dependencies": { - "cheminfo-types": "^1.7.3", - "install": "^0.13.0", - "ml-matrix": "^6.11.0", - "ml-spectra-processing": "^14.2.2" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -9088,12 +9130,6 @@ "integrity": "sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==", "license": "MIT" }, - "node_modules/ml-distance-matrix": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ml-distance-matrix/-/ml-distance-matrix-2.0.1.tgz", - "integrity": "sha512-6wt3bvK8WzAjyuBt9+wnyGanphrAZyqJGwiEEfuknfu8IQBtHYWpyLhjtQ8R7rjiPyXlF9eP7GcI5L7OA1NLEQ==", - "license": "MIT" - }, "node_modules/ml-fft": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ml-fft/-/ml-fft-1.3.5.tgz", @@ -9123,28 +9159,6 @@ "ml-spectra-processing": "^14.5.3" } }, - "node_modules/ml-hash-table": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ml-hash-table/-/ml-hash-table-1.0.0.tgz", - "integrity": "sha512-KV2uRIUbox0xuJ5Gkmr3udX0eNqr+c2HiSqz+sqAtQOnSm46zBmzDJvZX9t4hhcqqyEmGPvxFzx5SnwCfGhXNw==", - "license": "MIT", - "dependencies": { - "binary-search": "^1.3.5", - "num-sort": "^2.0.0" - } - }, - "node_modules/ml-hclust": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ml-hclust/-/ml-hclust-3.1.0.tgz", - "integrity": "sha512-EI6VCHrPHOsPsgZ1a/auhdxzHpEZ+kV7yjCGGIU+EWtb/XV1ZWSg5GlU32Qt4T05m98wCSQykPBhIg5aW6JjuQ==", - "license": "MIT", - "dependencies": { - "heap": "^0.2.6", - "ml-distance-euclidean": "^2.0.0", - "ml-distance-matrix": "^2.0.1", - "ml-matrix": "^6.8.0" - } - }, "node_modules/ml-levenberg-marquardt": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ml-levenberg-marquardt/-/ml-levenberg-marquardt-4.1.3.tgz", @@ -9203,16 +9217,6 @@ "is-any-array": "^2.0.1" } }, - "node_modules/ml-regression-exponential": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/ml-regression-exponential/-/ml-regression-exponential-3.0.2.tgz", - "integrity": "sha512-drV4ZSGKMMVNETVa7+/z15Uq9C0F69wNsJbhPvVbERgYRSmoGg+e0X7BYK75TzUvFY8IlYZmvVQOZK334slpbQ==", - "license": "MIT", - "dependencies": { - "ml-regression-base": "^4.0.0", - "ml-regression-simple-linear": "^3.0.0" - } - }, "node_modules/ml-regression-polynomial": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-3.0.1.tgz", @@ -9267,21 +9271,6 @@ "ml-spectra-processing": "^14.6.2" } }, - "node_modules/ml-simple-clustering": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ml-simple-clustering/-/ml-simple-clustering-0.1.0.tgz", - "integrity": "sha512-t1jLL5nzUsNXBcAjcHTkCK2E7i2pEO1qrGzZmzS4BHWWMFxi2OUzBLTpK4MgwxLt0oQLkNGLr6NL4vcDxC2ePw==", - "license": "MIT" - }, - "node_modules/ml-sparse-matrix": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ml-sparse-matrix/-/ml-sparse-matrix-2.1.0.tgz", - "integrity": "sha512-ukJGbyGv+Zc0llNLVRpegMhRFW14O+i9ZhSEGBxuuSX8g5rA1S+Q+0r2JMKDM9cNM8QsvgtOPG7z/7pbjpoqzg==", - "license": "MIT", - "dependencies": { - "ml-hash-table": "^1.0.0" - } - }, "node_modules/ml-spectra-fitting": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.4.tgz", @@ -9317,12 +9306,6 @@ "integrity": "sha512-F6plydFIKFZA+7j/pRsRrfRu4nwsruQvYD9QxHWc4hFUdASVznsKUL2hgAwgMVizY/P0+b1L9bVQexKES5y/uw==", "license": "MIT" }, - "node_modules/ml-tree-set": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ml-tree-set/-/ml-tree-set-0.1.1.tgz", - "integrity": "sha512-9XZv+/hSltnsN61Cgb7PCFGxmo1HZn2JxDugnNHZDh0ZryJp7qtmcnPZLw/KrQLgG1JqdkKlfhmAYajSukb8yg==", - "license": "MIT" - }, "node_modules/ml-tree-similarity": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ml-tree-similarity/-/ml-tree-similarity-2.2.0.tgz", diff --git a/src/component/modal/MultipletAnalysisModal.tsx b/src/component/modal/MultipletAnalysisModal.tsx index 6db6c5755..a56b92928 100644 --- a/src/component/modal/MultipletAnalysisModal.tsx +++ b/src/component/modal/MultipletAnalysisModal.tsx @@ -1,14 +1,9 @@ /** @jsxImportSource @emotion/react */ import { Dialog, DialogBody } from '@blueprintjs/core'; import styled from '@emotion/styled'; -import type { DoubleArray } from 'cheminfo-types'; -import { - xGetFromToIndex, - xyToXYObject, - reimPhaseCorrection, -} from 'ml-spectra-processing'; -import { analyseMultiplet } from 'multiplet-analysis'; +import { xGetFromToIndex, xyToXYObject } from 'ml-spectra-processing'; import type { ActiveSpectrum } from 'nmr-load-save'; +import { xreimMultipletAnalysis } from 'nmr-processing'; import { useEffect, useState } from 'react'; import { Axis, LineSeries, Plot } from 'react-plot'; @@ -118,36 +113,34 @@ function InnerMultipleAnalysis(props: InnerMultipleAnalysisProps) { to, }); - let currentRe = re.slice(fromIndex, toIndex); - if (im) { - const currentIm = im.slice(fromIndex, toIndex); - const ph0 = autoPhaseRegion(currentRe, currentIm); - const phased = reimPhaseCorrection( - { re: currentRe, im: currentIm }, - toRadians(ph0), - 0, - ); - currentRe = phased.re; - } - const analysesProps = { x: x.slice(fromIndex, toIndex), - y: re.slice(fromIndex, toIndex), + re: re.slice(fromIndex, toIndex), + im: im?.slice(fromIndex, toIndex), }; - + // console.log( + // 'hola', + // JSON.stringify(analysesProps, (key, value) => + // ArrayBuffer.isView(value) ? Array.from(value as any) : value, + // ), + // ); try { - const result = analyseMultiplet(analysesProps, { - frequency: info.originFrequency, - minimalResolution: 0.1, - critFoundJ: 0.75, - maxTestedJ: 17, - minTestedJ: 1, - takeBestPartMultiplet: true, - correctVerticalOffset: true, - symmetrizeEachStep: false, - decreasingJvalues: true, - makeShortCutForSpeed: true, - debug: true, + const result = xreimMultipletAnalysis(analysesProps, { + autoPhase: false, + analyzer: { + frequency: info.originFrequency, + minimalResolution: 0.1, + critFoundJ: 0.75, + maxTestedJ: 17, + minTestedJ: 1, + checkSymmetryFirst: false, + takeBestPartMultiplet: true, + correctVerticalOffset: true, + symmetrizeEachStep: false, + decreasingJvalues: true, + makeShortCutForSpeed: true, + debug: true, + }, }); setCalcFinished(true); setAnalysisData(result); @@ -241,40 +234,3 @@ function InnerMultipleAnalysis(props: InnerMultipleAnalysisProps) { ); } - -function autoPhaseRegion(re: DoubleArray, im: DoubleArray): any { - let start = -180; - let stop = 180; - const nSteps = 6; - let maxSteps = 10; - - let bestAng = 0; - let minArea = Number.MAX_SAFE_INTEGER; - while (maxSteps > 0) { - const dAng = (stop - start) / (nSteps + 1); - for (let i = start; i <= stop; i += dAng) { - const tmpPhased = reimPhaseCorrection({ re, im }, toRadians(i), 0); - const negArea = getNegArea(tmpPhased.re); - if (negArea < minArea) { - [minArea, bestAng] = [negArea, i]; - } - } - start = bestAng - dAng; - stop = bestAng + dAng; - maxSteps--; - } - - return bestAng; -} - -function toRadians(degree: number): number { - return (degree * Math.PI) / 180; -} - -function getNegArea(data: DoubleArray): number { - let area = 0; - for (const element of data) { - if (element < 0) area -= element; - } - return area; -} diff --git a/src/data/data1d/Spectrum1D/ranges/detectSignalsByMultipletAnalysis.ts b/src/data/data1d/Spectrum1D/ranges/detectSignalsByMultipletAnalysis.ts index e50473705..085deab91 100644 --- a/src/data/data1d/Spectrum1D/ranges/detectSignalsByMultipletAnalysis.ts +++ b/src/data/data1d/Spectrum1D/ranges/detectSignalsByMultipletAnalysis.ts @@ -1,9 +1,12 @@ import type { DataXY } from 'cheminfo-types'; import { optimizePeaksWithLogs } from 'ml-gsd'; import { xMaxValue } from 'ml-spectra-processing'; -import { analyseMultiplet } from 'multiplet-analysis'; import type { NMRPeak1DWithShapeID } from 'nmr-processing'; -import { signalJoinCouplings, xyAutoPeaksPicking } from 'nmr-processing'; +import { + signalJoinCouplings, + xreimMultipletAnalysis, + xyAutoPeaksPicking, +} from 'nmr-processing'; export function detectSignalsByMultipletAnalysis( data: DataXY, @@ -74,18 +77,27 @@ export function detectSignalsByMultipletAnalysis( } } - const result = analyseMultiplet(dataRoi, { - frequency, - minimalResolution: 0.1, - maxTestedJ: 17, - checkSymmetryFirst: true, - takeBestPartMultiplet: true, - correctVerticalOffset: true, - critFoundJ: 0.75, - symmetrizeEachStep: false, - decreasingJvalues: true, - makeShortCutForSpeed: true, - }); + const result = xreimMultipletAnalysis( + { + x: dataRoi.x, + re: dataRoi.y, + }, + { + autoPhase: true, + analyzer: { + frequency, + minimalResolution: 0.1, + maxTestedJ: 17, + checkSymmetryFirst: true, + takeBestPartMultiplet: true, + correctVerticalOffset: true, + critFoundJ: 0.75, + symmetrizeEachStep: false, + decreasingJvalues: true, + makeShortCutForSpeed: true, + }, + }, + ); if (result && result.chemShift === undefined) return []; From c1d97f10e8684bf1bc25dab9c5e48de6cacc04a4 Mon Sep 17 00:00:00 2001 From: jobo322 Date: Mon, 9 Dec 2024 09:10:15 -0500 Subject: [PATCH 6/9] chore: fix nmr-processing version --- package-lock.json | 163 ++++++++++++++++++++++++++-------------------- 1 file changed, 93 insertions(+), 70 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2e3fc73f2..bfe1637c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "multiplet-analysis": "^2.1.5", "nmr-correlation": "^2.3.3", "nmr-load-save": "^2.2.1", - "nmr-processing": "file:../nmr-processing", + "nmr-processing": "^14.0.6", "nmredata": "^0.9.11", "numeral": "^2.0.6", "openchemlib": "^8.18.1", @@ -111,73 +111,6 @@ "react-dom": ">=18.0.0" } }, - "../nmr-processing": { - "version": "14.0.5", - "license": "MIT", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "@types/d3-color": "^3.1.3", - "@types/d3-interpolate": "^3.0.4", - "binary-search": "^1.3.6", - "d3-color": "^2.0.0", - "d3-interpolate": "^2.0.1", - "gyromagnetic-ratio": "^1.2.1", - "is-any-array": "^2.0.1", - "linear-sum-assignment": "^1.0.7", - "lodash.omit": "^4.5.0", - "ml-airpls": "^2.0.0", - "ml-direct": "^1.0.0", - "ml-gsd": "^12.1.8", - "ml-hclust": "^3.1.0", - "ml-levenberg-marquardt": "^4.1.3", - "ml-matrix": "^6.11.1", - "ml-matrix-convolution": "^1.0.0", - "ml-matrix-peaks-finder": "^1.0.0", - "ml-peak-shape-generator": "^4.1.4", - "ml-regression-base": "^4.0.0", - "ml-regression-exponential": "^3.0.1", - "ml-regression-polynomial": "^3.0.1", - "ml-regression-simple-linear": "^3.0.1", - "ml-savitzky-golay-generalized": "^4.2.0", - "ml-signal-processing": "^1.1.1", - "ml-simple-clustering": "^0.1.0", - "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^14.6.0", - "ml-tree-set": "^0.1.1", - "multiplet-analysis": "^2.1.4", - "nmr-correlation": "^2.3.3", - "numeral": "^2.0.6", - "openchemlib-utils": "^6.4.1", - "spectrum-generator": "^8.0.11" - }, - "devDependencies": { - "@microsoft/api-extractor": "^7.47.10", - "@types/lodash.omit": "^4.5.9", - "@types/node": "^22.7.5", - "@types/numeral": "^2.0.5", - "@vitest/coverage-v8": "^2.1.3", - "bruker-data-test": "^0.5.4", - "brukerconverter": "^7.0.3", - "cheminfo-build": "^1.2.0", - "cheminfo-types": "^1.8.1", - "esbuild": "^0.24.0", - "eslint": "^9.12.0", - "eslint-config-cheminfo-typescript": "^16.0.0", - "fifo-logger": "^1.0.0", - "filelist-utils": "^1.11.2", - "globals": "^15.11.0", - "jcamp-data-test": "^0.8.1", - "jest-matcher-deep-close-to": "^3.0.2", - "nmr-load-save": "^2.1.0", - "nmr-xy-testdata": "^0.5.1", - "openchemlib": "^8.17.0", - "prettier": "^3.3.3", - "rimraf": "^6.0.1", - "typescript": "~5.6.3", - "undici": "^6.20.1", - "vitest": "^2.1.3" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -3214,7 +3147,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true, "license": "MIT" }, "node_modules/@types/d3-contour": { @@ -3311,7 +3243,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dev": true, "license": "MIT", "dependencies": { "@types/d3-color": "*" @@ -7677,6 +7608,12 @@ "tslib": "^2.0.3" } }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "license": "MIT" + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -7873,6 +7810,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -8690,6 +8636,18 @@ "immediate": "~3.0.5" } }, + "node_modules/linear-sum-assignment": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/linear-sum-assignment/-/linear-sum-assignment-1.0.7.tgz", + "integrity": "sha512-jfLoSGwZNyjfY8eK4ayhjfcIu3BfWvP6sWieYzYI3AWldwXVoWEz1gtrQL10v/8YltYLBunqNjeVFXPMUs+MJg==", + "license": "MIT", + "dependencies": { + "cheminfo-types": "^1.7.3", + "install": "^0.13.0", + "ml-matrix": "^6.11.0", + "ml-spectra-processing": "^14.2.2" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -8730,6 +8688,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", + "license": "MIT" + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -9130,6 +9094,12 @@ "integrity": "sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==", "license": "MIT" }, + "node_modules/ml-distance-matrix": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ml-distance-matrix/-/ml-distance-matrix-2.0.1.tgz", + "integrity": "sha512-6wt3bvK8WzAjyuBt9+wnyGanphrAZyqJGwiEEfuknfu8IQBtHYWpyLhjtQ8R7rjiPyXlF9eP7GcI5L7OA1NLEQ==", + "license": "MIT" + }, "node_modules/ml-fft": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ml-fft/-/ml-fft-1.3.5.tgz", @@ -9159,6 +9129,28 @@ "ml-spectra-processing": "^14.5.3" } }, + "node_modules/ml-hash-table": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ml-hash-table/-/ml-hash-table-1.0.0.tgz", + "integrity": "sha512-KV2uRIUbox0xuJ5Gkmr3udX0eNqr+c2HiSqz+sqAtQOnSm46zBmzDJvZX9t4hhcqqyEmGPvxFzx5SnwCfGhXNw==", + "license": "MIT", + "dependencies": { + "binary-search": "^1.3.5", + "num-sort": "^2.0.0" + } + }, + "node_modules/ml-hclust": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ml-hclust/-/ml-hclust-3.1.0.tgz", + "integrity": "sha512-EI6VCHrPHOsPsgZ1a/auhdxzHpEZ+kV7yjCGGIU+EWtb/XV1ZWSg5GlU32Qt4T05m98wCSQykPBhIg5aW6JjuQ==", + "license": "MIT", + "dependencies": { + "heap": "^0.2.6", + "ml-distance-euclidean": "^2.0.0", + "ml-distance-matrix": "^2.0.1", + "ml-matrix": "^6.8.0" + } + }, "node_modules/ml-levenberg-marquardt": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ml-levenberg-marquardt/-/ml-levenberg-marquardt-4.1.3.tgz", @@ -9217,6 +9209,16 @@ "is-any-array": "^2.0.1" } }, + "node_modules/ml-regression-exponential": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ml-regression-exponential/-/ml-regression-exponential-3.0.2.tgz", + "integrity": "sha512-drV4ZSGKMMVNETVa7+/z15Uq9C0F69wNsJbhPvVbERgYRSmoGg+e0X7BYK75TzUvFY8IlYZmvVQOZK334slpbQ==", + "license": "MIT", + "dependencies": { + "ml-regression-base": "^4.0.0", + "ml-regression-simple-linear": "^3.0.0" + } + }, "node_modules/ml-regression-polynomial": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-3.0.1.tgz", @@ -9271,6 +9273,21 @@ "ml-spectra-processing": "^14.6.2" } }, + "node_modules/ml-simple-clustering": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ml-simple-clustering/-/ml-simple-clustering-0.1.0.tgz", + "integrity": "sha512-t1jLL5nzUsNXBcAjcHTkCK2E7i2pEO1qrGzZmzS4BHWWMFxi2OUzBLTpK4MgwxLt0oQLkNGLr6NL4vcDxC2ePw==", + "license": "MIT" + }, + "node_modules/ml-sparse-matrix": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ml-sparse-matrix/-/ml-sparse-matrix-2.1.0.tgz", + "integrity": "sha512-ukJGbyGv+Zc0llNLVRpegMhRFW14O+i9ZhSEGBxuuSX8g5rA1S+Q+0r2JMKDM9cNM8QsvgtOPG7z/7pbjpoqzg==", + "license": "MIT", + "dependencies": { + "ml-hash-table": "^1.0.0" + } + }, "node_modules/ml-spectra-fitting": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.4.tgz", @@ -9306,6 +9323,12 @@ "integrity": "sha512-F6plydFIKFZA+7j/pRsRrfRu4nwsruQvYD9QxHWc4hFUdASVznsKUL2hgAwgMVizY/P0+b1L9bVQexKES5y/uw==", "license": "MIT" }, + "node_modules/ml-tree-set": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ml-tree-set/-/ml-tree-set-0.1.1.tgz", + "integrity": "sha512-9XZv+/hSltnsN61Cgb7PCFGxmo1HZn2JxDugnNHZDh0ZryJp7qtmcnPZLw/KrQLgG1JqdkKlfhmAYajSukb8yg==", + "license": "MIT" + }, "node_modules/ml-tree-similarity": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ml-tree-similarity/-/ml-tree-similarity-2.2.0.tgz", From cb53890e3271f12d89602627b8aca63b20ac6885 Mon Sep 17 00:00:00 2001 From: jobo322 Date: Mon, 10 Feb 2025 11:47:39 -0500 Subject: [PATCH 7/9] chore: update deps --- package-lock.json | 49 +++++++++-------------------------------------- 1 file changed, 9 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfe1637c9..6a33e73b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,9 +42,9 @@ "ml-stat": "^1.3.3", "ml-tree-similarity": "^2.2.0", "multiplet-analysis": "^2.1.5", - "nmr-correlation": "^2.3.3", - "nmr-load-save": "^2.2.1", - "nmr-processing": "^14.0.6", + "nmr-correlation": "2.3.3", + "nmr-load-save": "^3.0.0", + "nmr-processing": "^16.0.0", "nmredata": "^0.9.11", "numeral": "^2.0.6", "openchemlib": "^8.18.1", @@ -8688,12 +8688,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, - "node_modules/lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", - "license": "MIT" - }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -9431,10 +9425,10 @@ } }, "node_modules/nmr-load-save": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-2.2.1.tgz", - "integrity": "sha512-gjO+AG2y7x2e6O9pe+zlUVZEEl0b/mdUGnGvmKN8H52QnpZLvL62kzeJOetVUSE+Cm2iuH8J56oNp9YS7K3MDA==", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-3.0.0.tgz", + "integrity": "sha512-9cB0XLtIGfPeklOLCXUS99CHVJjf+CGQ2hkv29GAT8C2oxs2JSqObxgldzv+QX0LAtXxB1t1zK+x2etEjzZbRg==", + "license": "CC BY-NC-SA 4.0", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.9", @@ -9445,33 +9439,8 @@ "filelist-utils": "^1.11.2", "gyromagnetic-ratio": "^1.2.1", "is-any-array": "^2.0.1", - "jcampconverter": "^10.0.1", - "jeolconverter": "^1.0.3", - "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.6.2", - "nmr-correlation": "^2.3.3", - "nmr-processing": "^14.0.5", - "nmredata": "^0.9.11", - "openchemlib": "^8.17.0", - "openchemlib-utils": "^6.4.1", - "sdf-parser": "^6.0.1", - "varian-converter": "^1.0.0" - } - }, - "node_modules/nmr-processing": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-14.0.6.tgz", - "integrity": "sha512-IiMe2CUOFXx5OW0c48AdwC3jNcjVc3Pwxnqst401igDaeMeqCMf6+a5epKZkvWddCB1XA5Qruq4YGsRgTYLMDg==", - "license": "MIT", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "@types/d3-color": "^3.1.3", - "@types/d3-interpolate": "^3.0.4", - "binary-search": "^1.3.6", - "d3-color": "^2.0.0", - "d3-interpolate": "^2.0.1", - "gyromagnetic-ratio": "^1.2.1", - "is-any-array": "^2.0.1", + "jcampconverter": "^11.0.0", + "jeolconverter": "^1.0.4", "linear-sum-assignment": "^1.0.7", "lodash.merge": "^4.6.2", "ml-spectra-processing": "^14.9.2", From ba11bbd9a14110d94bd12b4e9d967e806369aa6e Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Thu, 20 Feb 2025 13:57:22 +0100 Subject: [PATCH 8/9] style: fix 'Multiplet analysis modal' style --- .../modal/MultipletAnalysisModal.tsx | 157 ++++++++++-------- 1 file changed, 92 insertions(+), 65 deletions(-) diff --git a/src/component/modal/MultipletAnalysisModal.tsx b/src/component/modal/MultipletAnalysisModal.tsx index a56b92928..36e63156d 100644 --- a/src/component/modal/MultipletAnalysisModal.tsx +++ b/src/component/modal/MultipletAnalysisModal.tsx @@ -1,5 +1,4 @@ -/** @jsxImportSource @emotion/react */ -import { Dialog, DialogBody } from '@blueprintjs/core'; +import { Dialog } from '@blueprintjs/core'; import styled from '@emotion/styled'; import { xGetFromToIndex, xyToXYObject } from 'ml-spectra-processing'; import type { ActiveSpectrum } from 'nmr-load-save'; @@ -10,6 +9,32 @@ import { Axis, LineSeries, Plot } from 'react-plot'; import { isSpectrum2D } from '../../data/data2d/Spectrum2D/index.js'; import { useChartData } from '../context/ChartContext.js'; import { useScaleChecked } from '../context/ScaleContext.js'; +import { StyledDialogBody } from '../elements/StyledDialogBody.js'; + +const Container = styled.div` + padding: 10px; + max-height: 500px; + overflow-y: auto; +`; + +const Row = styled.div` + outline: none; + display: flex; + flex-direction: row; + margin: 0; + + &:nth-child(odd) { + background: #fafafa; + } +`; + +const Multiplicity = styled.div` + flex: 2; + display: flex; + align-items: center; + justify-content: center; + padding: 0 20px; +`; const LoaderContainer = styled.div` display: flex; @@ -61,11 +86,11 @@ export default function MultipletAnalysisModal({ return ( onClose()} title="Analyse multiplet" - style={{ width: 900, height: 400 }} > - + - + ); } @@ -166,71 +191,73 @@ function InnerMultipleAnalysis(props: InnerMultipleAnalysisProps) { } return ( -
+ {analysisData?.debug?.steps.map((d, index) => { return ( // eslint-disable-next-line react/no-array-index-key -
- - - - - -
-

- {analysisData.js[index] - ? `${analysisData.js[index]?.multiplicity}: ${analysisData.js[ - index - ]?.coupling.toFixed(3)} Hz` - : ''} -

+ +
+ + + + + +
+ + {analysisData.js[index] + ? `${analysisData.js[index]?.multiplicity}: ${analysisData.js[ + index + ]?.coupling.toFixed(3)} Hz` + : ''} + +
+ + + + +
- - - - - -
+ ); })} -
+
); } From 3739ff83ce52809fb7881f3855dbcbfe01f34156 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Thu, 20 Feb 2025 13:58:45 +0100 Subject: [PATCH 9/9] chore: remove unused code --- src/component/modal/MultipletAnalysisModal.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/component/modal/MultipletAnalysisModal.tsx b/src/component/modal/MultipletAnalysisModal.tsx index 36e63156d..fa043585b 100644 --- a/src/component/modal/MultipletAnalysisModal.tsx +++ b/src/component/modal/MultipletAnalysisModal.tsx @@ -143,12 +143,7 @@ function InnerMultipleAnalysis(props: InnerMultipleAnalysisProps) { re: re.slice(fromIndex, toIndex), im: im?.slice(fromIndex, toIndex), }; - // console.log( - // 'hola', - // JSON.stringify(analysesProps, (key, value) => - // ArrayBuffer.isView(value) ? Array.from(value as any) : value, - // ), - // ); + try { const result = xreimMultipletAnalysis(analysesProps, { autoPhase: false,