import styled from '@emotion/styled'; import type { ActiveSpectrum } from '@zakodium/nmrium-core'; import { xGetFromToIndex, xyToXYObject } from 'ml-spectra-processing'; import { xreimMultipletAnalysis } from 'nmr-processing'; import { useEffect, useState } from 'react'; 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 { StandardDialog } from '../elements/StandardDialog.tsx'; import { StyledDialogBody } from '../elements/StyledDialogBody.js'; const Container = styled.div` max-height: 500px; overflow-y: auto; padding: 10px; `; const Row = styled.div` display: flex; flex-direction: row; margin: 0; outline: none; :nth-child(odd) { background: #fafafa; } `; const Multiplicity = styled.div` align-items: center; display: flex; flex: 2; justify-content: center; padding: 0 20px; `; const LoaderContainer = styled.div` align-items: center; display: flex; flex-direction: column; justify-content: center; user-select: none; svg { animation-direction: inherit; animation-duration: 1s; animation-fill-mode: forwards; animation-iteration-count: infinite; animation-name: spin-animation; animation-timing-function: linear; height: 100px; width: 100px; } @keyframes spin-animation { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } `; interface InnerMultipleAnalysisProps { activeSpectrum: ActiveSpectrum | null; startX: any; endX: any; } interface MultipletAnalysisModalProps extends InnerMultipleAnalysisProps { isOpen: boolean; onClose: (element?: string) => void; } export default function MultipletAnalysisModal({ activeSpectrum, startX, endX, onClose, isOpen, }: MultipletAnalysisModalProps) { return ( onClose()} title="Analyse multiplet" > ); } function InnerMultipleAnalysis(props: InnerMultipleAnalysisProps) { const [calcStart, setCalcStartStatus] = useState(false); const [isCalcFinished, setCalcFinished] = useState(false); const { data } = useChartData(); const { scaleX } = useScaleChecked(); useEffect(() => { setTimeout(() => { setCalcStartStatus(true); }, 400); }, []); const { activeSpectrum, startX, endX } = props; const [analysisData, setAnalysisData] = useState(); useEffect(() => { if (activeSpectrum && startX && endX && calcStart) { const spectrum = data[activeSpectrum.index]; if (isSpectrum2D(spectrum)) { throw new Error('unreachable'); } const { data: { x, re, im }, info, } = spectrum; const from = scaleX().invert(startX); const to = scaleX().invert(endX); const { fromIndex, toIndex } = xGetFromToIndex(x, { from, to, }); const analysesProps = { x: x.slice(fromIndex, toIndex), re: re.slice(fromIndex, toIndex), im: im?.slice(fromIndex, toIndex), }; try { const result = xreimMultipletAnalysis(analysesProps, { autoPhase: false, analyzer: { frequency: info.originFrequency, minimalResolution: 0.1, critFoundJ: 0.75, maxTestedJ: 25, minTestedJ: 1, checkSymmetryFirst: false, takeBestPartMultiplet: true, correctVerticalOffset: true, symmetrizeEachStep: false, decreasingJvalues: true, makeShortCutForSpeed: true, debug: true, }, }); setCalcFinished(true); setAnalysisData(result); } catch (error) { // TODO: handle error reportError(error); } } }, [startX, endX, data, scaleX, activeSpectrum, calcStart]); if (!isCalcFinished) { return ( Analyse Multiplet in progress. Please wait ... ); } return ( {analysisData?.debug?.steps.map((d: any, index: any) => { return ( // eslint-disable-next-line react/no-array-index-key {analysisData.js[index] ? `${analysisData.js[index]?.multiplicity}: ${analysisData.js[ index ]?.coupling.toFixed(3)} Hz` : ''} ); })} ); }
Analyse Multiplet in progress. Please wait ...