react-cheminfo 0.69.0 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -2
- package/lib/about/core/providers.d.ts +6 -0
- package/lib/about/core/providers.d.ts.map +1 -1
- package/lib/about/core/providers.js +7 -0
- package/lib/about/core/providers.js.map +1 -1
- package/lib/about/ui/AboutProvidedBy.js +34 -0
- package/lib/about/ui/AboutProvidedBy.js.map +1 -1
- package/lib/chart/ui/useChartPointer.d.ts +9 -1
- package/lib/chart/ui/useChartPointer.d.ts.map +1 -1
- package/lib/chart/ui/useChartPointer.js +11 -3
- package/lib/chart/ui/useChartPointer.js.map +1 -1
- package/lib/credits/core/credits.d.ts +41 -0
- package/lib/credits/core/credits.d.ts.map +1 -1
- package/lib/credits/core/credits.js +50 -0
- package/lib/credits/core/credits.js.map +1 -1
- package/lib/download/core/drawingMarkup.d.ts +8 -1
- package/lib/download/core/drawingMarkup.d.ts.map +1 -1
- package/lib/download/core/drawingMarkup.js +13 -1
- package/lib/download/core/drawingMarkup.js.map +1 -1
- package/lib/download/core/figurePng.d.ts +14 -0
- package/lib/download/core/figurePng.d.ts.map +1 -1
- package/lib/download/core/figurePng.js +21 -6
- package/lib/download/core/figurePng.js.map +1 -1
- package/lib/download/core/figureSvg.d.ts.map +1 -1
- package/lib/download/core/figureSvg.js +5 -3
- package/lib/download/core/figureSvg.js.map +1 -1
- package/lib/download/core/figureTarget.d.ts +13 -0
- package/lib/download/core/figureTarget.d.ts.map +1 -1
- package/lib/download/core/figureTarget.js +25 -5
- package/lib/download/core/figureTarget.js.map +1 -1
- package/lib/download/core/svgBounds.d.ts +15 -0
- package/lib/download/core/svgBounds.d.ts.map +1 -1
- package/lib/download/core/svgBounds.js +20 -0
- package/lib/download/core/svgBounds.js.map +1 -1
- package/lib/download/core/svgToPng.d.ts.map +1 -1
- package/lib/download/core/svgToPng.js +4 -2
- package/lib/download/core/svgToPng.js.map +1 -1
- package/lib/format/core/relativeTime.d.ts +8 -3
- package/lib/format/core/relativeTime.d.ts.map +1 -1
- package/lib/format/core/relativeTime.js +19 -7
- package/lib/format/core/relativeTime.js.map +1 -1
- package/lib/host/core/connectHost.d.ts +25 -34
- package/lib/host/core/connectHost.d.ts.map +1 -1
- package/lib/host/core/connectHost.js +43 -89
- package/lib/host/core/connectHost.js.map +1 -1
- package/lib/host/core/hostOutputs.d.ts +58 -0
- package/lib/host/core/hostOutputs.d.ts.map +1 -0
- package/lib/host/core/hostOutputs.js +151 -0
- package/lib/host/core/hostOutputs.js.map +1 -0
- package/lib/host/core/index.d.ts +9 -3
- package/lib/host/core/index.d.ts.map +1 -1
- package/lib/host/core/index.js +4 -1
- package/lib/host/core/index.js.map +1 -1
- package/lib/host/core/irKinds.d.ts +124 -0
- package/lib/host/core/irKinds.d.ts.map +1 -0
- package/lib/host/core/irKinds.js +46 -0
- package/lib/host/core/irKinds.js.map +1 -0
- package/lib/host/core/kinds.d.ts +13 -5
- package/lib/host/core/kinds.d.ts.map +1 -1
- package/lib/host/core/kinds.js +11 -5
- package/lib/host/core/kinds.js.map +1 -1
- package/lib/host/core/protocol.d.ts +50 -7
- package/lib/host/core/protocol.d.ts.map +1 -1
- package/lib/host/core/protocol.js +10 -6
- package/lib/host/core/protocol.js.map +1 -1
- package/lib/host/core/selectInputs.d.ts +37 -0
- package/lib/host/core/selectInputs.d.ts.map +1 -0
- package/lib/host/core/selectInputs.js +110 -0
- package/lib/host/core/selectInputs.js.map +1 -0
- package/lib/host/testing/sciPeaks.d.ts +31 -0
- package/lib/host/testing/sciPeaks.d.ts.map +1 -1
- package/lib/host/testing/sciPeaks.js +73 -0
- package/lib/host/testing/sciPeaks.js.map +1 -1
- package/lib/host/testing/standInHost.d.ts +9 -1
- package/lib/host/testing/standInHost.d.ts.map +1 -1
- package/lib/host/testing/standInHost.js +19 -1
- package/lib/host/testing/standInHost.js.map +1 -1
- package/lib/host/ui/useHostConnection.d.ts +13 -5
- package/lib/host/ui/useHostConnection.d.ts.map +1 -1
- package/lib/host/ui/useHostConnection.js +4 -3
- package/lib/host/ui/useHostConnection.js.map +1 -1
- package/lib/host-testing.d.ts +2 -2
- package/lib/host-testing.d.ts.map +1 -1
- package/lib/host-testing.js +2 -2
- package/lib/host-testing.js.map +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
- package/lib/ir/core/handPicking.d.ts +58 -0
- package/lib/ir/core/handPicking.d.ts.map +1 -0
- package/lib/ir/core/handPicking.js +130 -0
- package/lib/ir/core/handPicking.js.map +1 -0
- package/lib/ir/core/index.d.ts +3 -0
- package/lib/ir/core/index.d.ts.map +1 -1
- package/lib/ir/core/index.js +3 -0
- package/lib/ir/core/index.js.map +1 -1
- package/lib/ir/core/irBandState.d.ts +57 -0
- package/lib/ir/core/irBandState.d.ts.map +1 -0
- package/lib/ir/core/irBandState.js +119 -0
- package/lib/ir/core/irBandState.js.map +1 -0
- package/lib/ir/core/irCommands.d.ts +11 -0
- package/lib/ir/core/irCommands.d.ts.map +1 -1
- package/lib/ir/core/irCommands.js +6 -0
- package/lib/ir/core/irCommands.js.map +1 -1
- package/lib/ir/core/irPeaks.d.ts +28 -0
- package/lib/ir/core/irPeaks.d.ts.map +1 -0
- package/lib/ir/core/irPeaks.js +66 -0
- package/lib/ir/core/irPeaks.js.map +1 -0
- package/lib/ir/core/irReducer.d.ts +8 -0
- package/lib/ir/core/irReducer.d.ts.map +1 -1
- package/lib/ir/core/irReducer.js +15 -32
- package/lib/ir/core/irReducer.js.map +1 -1
- package/lib/ir/core/irSpectrum.d.ts +15 -0
- package/lib/ir/core/irSpectrum.d.ts.map +1 -1
- package/lib/ir/core/irSpectrum.js.map +1 -1
- package/lib/ir/core/irState.d.ts +9 -6
- package/lib/ir/core/irState.d.ts.map +1 -1
- package/lib/ir/core/irState.js +10 -6
- package/lib/ir/core/irState.js.map +1 -1
- package/lib/ir/core/pickBands.d.ts +14 -0
- package/lib/ir/core/pickBands.d.ts.map +1 -1
- package/lib/ir/core/pickBands.js +39 -33
- package/lib/ir/core/pickBands.js.map +1 -1
- package/lib/ir/core/ramanBands.d.ts +9 -1
- package/lib/ir/core/ramanBands.d.ts.map +1 -1
- package/lib/ir/core/ramanBands.js +2 -2
- package/lib/ir/core/ramanBands.js.map +1 -1
- package/lib/ir/core/spectrumBands.d.ts +46 -0
- package/lib/ir/core/spectrumBands.d.ts.map +1 -0
- package/lib/ir/core/spectrumBands.js +98 -0
- package/lib/ir/core/spectrumBands.js.map +1 -0
- package/lib/ir/ui/BandRow.d.ts +5 -0
- package/lib/ir/ui/BandRow.d.ts.map +1 -1
- package/lib/ir/ui/BandRow.js +4 -3
- package/lib/ir/ui/BandRow.js.map +1 -1
- package/lib/ir/ui/BandsPanel.d.ts +5 -0
- package/lib/ir/ui/BandsPanel.d.ts.map +1 -1
- package/lib/ir/ui/BandsPanel.js +36 -16
- package/lib/ir/ui/BandsPanel.js.map +1 -1
- package/lib/ir/ui/BandsToolbar.d.ts +9 -0
- package/lib/ir/ui/BandsToolbar.d.ts.map +1 -0
- package/lib/ir/ui/BandsToolbar.js +61 -0
- package/lib/ir/ui/BandsToolbar.js.map +1 -0
- package/lib/ir/ui/IrCanvas.d.ts +2 -1
- package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
- package/lib/ir/ui/IrCanvas.js +19 -5
- package/lib/ir/ui/IrCanvas.js.map +1 -1
- package/lib/ir/ui/IrChart.d.ts.map +1 -1
- package/lib/ir/ui/IrChart.js +8 -1
- package/lib/ir/ui/IrChart.js.map +1 -1
- package/lib/ir/ui/IrDocumentationDialog.js +1 -1
- package/lib/ir/ui/IrDocumentationDialog.js.map +1 -1
- package/lib/ir/ui/IrEditor.d.ts +4 -2
- package/lib/ir/ui/IrEditor.d.ts.map +1 -1
- package/lib/ir/ui/IrEditor.js.map +1 -1
- package/lib/ir/ui/IrShell.d.ts.map +1 -1
- package/lib/ir/ui/IrShell.js +6 -0
- package/lib/ir/ui/IrShell.js.map +1 -1
- package/lib/ir/ui/IrStatusBar.d.ts.map +1 -1
- package/lib/ir/ui/IrStatusBar.js +1 -1
- package/lib/ir/ui/IrStatusBar.js.map +1 -1
- package/lib/ir/ui/IrToolbar.d.ts +4 -3
- package/lib/ir/ui/IrToolbar.d.ts.map +1 -1
- package/lib/ir/ui/IrToolbar.js +5 -4
- package/lib/ir/ui/IrToolbar.js.map +1 -1
- package/lib/ir/ui/VibrationalEditor.d.ts +2 -1
- package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -1
- package/lib/ir/ui/VibrationalEditor.js.map +1 -1
- package/lib/ir/ui/irActions.d.ts +5 -0
- package/lib/ir/ui/irActions.d.ts.map +1 -1
- package/lib/ir/ui/irActions.js +6 -0
- package/lib/ir/ui/irActions.js.map +1 -1
- package/lib/ir/ui/irChartProps.d.ts +4 -1
- package/lib/ir/ui/irChartProps.d.ts.map +1 -1
- package/lib/ir/ui/useIrEditor.d.ts +5 -11
- package/lib/ir/ui/useIrEditor.d.ts.map +1 -1
- package/lib/ir/ui/useIrEditor.js +17 -18
- package/lib/ir/ui/useIrEditor.js.map +1 -1
- package/lib/locales/de.json +63 -0
- package/lib/locales/en.json +63 -0
- package/lib/locales/es.json +63 -0
- package/lib/locales/fr.json +63 -0
- package/lib/locales/it.json +63 -0
- package/lib/mass/core/analyseSpectrum.d.ts +85 -0
- package/lib/mass/core/analyseSpectrum.d.ts.map +1 -0
- package/lib/mass/core/analyseSpectrum.js +101 -0
- package/lib/mass/core/analyseSpectrum.js.map +1 -0
- package/lib/mass/core/ascendingTrace.d.ts +24 -0
- package/lib/mass/core/ascendingTrace.d.ts.map +1 -0
- package/lib/mass/core/ascendingTrace.js +57 -0
- package/lib/mass/core/ascendingTrace.js.map +1 -0
- package/lib/mass/core/centroidPeaks.d.ts +77 -0
- package/lib/mass/core/centroidPeaks.d.ts.map +1 -0
- package/lib/mass/core/centroidPeaks.js +62 -0
- package/lib/mass/core/centroidPeaks.js.map +1 -0
- package/lib/mass/core/detectMassFormat.d.ts +24 -0
- package/lib/mass/core/detectMassFormat.d.ts.map +1 -0
- package/lib/mass/core/detectMassFormat.js +105 -0
- package/lib/mass/core/detectMassFormat.js.map +1 -0
- package/lib/mass/core/downloadSpectra.d.ts +24 -0
- package/lib/mass/core/downloadSpectra.d.ts.map +1 -0
- package/lib/mass/core/downloadSpectra.js +35 -0
- package/lib/mass/core/downloadSpectra.js.map +1 -0
- package/lib/mass/core/fromJcamp.d.ts +46 -0
- package/lib/mass/core/fromJcamp.d.ts.map +1 -0
- package/lib/mass/core/fromJcamp.js +123 -0
- package/lib/mass/core/fromJcamp.js.map +1 -0
- package/lib/mass/core/fromText.d.ts +30 -0
- package/lib/mass/core/fromText.d.ts.map +1 -0
- package/lib/mass/core/fromText.js +39 -0
- package/lib/mass/core/fromText.js.map +1 -0
- package/lib/mass/core/index.d.ts +70 -0
- package/lib/mass/core/index.d.ts.map +1 -0
- package/lib/mass/core/index.js +42 -0
- package/lib/mass/core/index.js.map +1 -0
- package/lib/mass/core/jcampTechnique.d.ts +38 -0
- package/lib/mass/core/jcampTechnique.d.ts.map +1 -0
- package/lib/mass/core/jcampTechnique.js +70 -0
- package/lib/mass/core/jcampTechnique.js.map +1 -0
- package/lib/mass/core/labelStackBox.d.ts +49 -0
- package/lib/mass/core/labelStackBox.d.ts.map +1 -0
- package/lib/mass/core/labelStackBox.js +44 -0
- package/lib/mass/core/labelStackBox.js.map +1 -0
- package/lib/mass/core/labelledPeaks.d.ts +79 -0
- package/lib/mass/core/labelledPeaks.d.ts.map +1 -0
- package/lib/mass/core/labelledPeaks.js +74 -0
- package/lib/mass/core/labelledPeaks.js.map +1 -0
- package/lib/mass/core/loadMassSpectra.d.ts +57 -0
- package/lib/mass/core/loadMassSpectra.d.ts.map +1 -0
- package/lib/mass/core/loadMassSpectra.js +45 -0
- package/lib/mass/core/loadMassSpectra.js.map +1 -0
- package/lib/mass/core/loadedMassSpectrum.d.ts +42 -0
- package/lib/mass/core/loadedMassSpectrum.d.ts.map +1 -0
- package/lib/mass/core/loadedMassSpectrum.js +15 -0
- package/lib/mass/core/loadedMassSpectrum.js.map +1 -0
- package/lib/mass/core/massCommands.d.ts +170 -0
- package/lib/mass/core/massCommands.d.ts.map +1 -0
- package/lib/mass/core/massCommands.js +95 -0
- package/lib/mass/core/massCommands.js.map +1 -0
- package/lib/mass/core/massDomain.d.ts +121 -0
- package/lib/mass/core/massDomain.d.ts.map +1 -0
- package/lib/mass/core/massDomain.js +179 -0
- package/lib/mass/core/massDomain.js.map +1 -0
- package/lib/mass/core/massEditorApi.d.ts +65 -0
- package/lib/mass/core/massEditorApi.d.ts.map +1 -0
- package/lib/mass/core/massEditorApi.js +10 -0
- package/lib/mass/core/massEditorApi.js.map +1 -0
- package/lib/mass/core/massFormat.d.ts +78 -0
- package/lib/mass/core/massFormat.d.ts.map +1 -0
- package/lib/mass/core/massFormat.js +168 -0
- package/lib/mass/core/massFormat.js.map +1 -0
- package/lib/mass/core/massMeta.d.ts +85 -0
- package/lib/mass/core/massMeta.d.ts.map +1 -0
- package/lib/mass/core/massMeta.js +182 -0
- package/lib/mass/core/massMeta.js.map +1 -0
- package/lib/mass/core/massReducer.d.ts +82 -0
- package/lib/mass/core/massReducer.d.ts.map +1 -0
- package/lib/mass/core/massReducer.js +163 -0
- package/lib/mass/core/massReducer.js.map +1 -0
- package/lib/mass/core/massResolution.d.ts +92 -0
- package/lib/mass/core/massResolution.d.ts.map +1 -0
- package/lib/mass/core/massResolution.js +126 -0
- package/lib/mass/core/massResolution.js.map +1 -0
- package/lib/mass/core/massSidePanels.d.ts +28 -0
- package/lib/mass/core/massSidePanels.d.ts.map +1 -0
- package/lib/mass/core/massSidePanels.js +12 -0
- package/lib/mass/core/massSidePanels.js.map +1 -0
- package/lib/mass/core/massSpectrum.d.ts +206 -0
- package/lib/mass/core/massSpectrum.d.ts.map +1 -0
- package/lib/mass/core/massSpectrum.js +41 -0
- package/lib/mass/core/massSpectrum.js.map +1 -0
- package/lib/mass/core/massState.d.ts +145 -0
- package/lib/mass/core/massState.d.ts.map +1 -0
- package/lib/mass/core/massState.js +102 -0
- package/lib/mass/core/massState.js.map +1 -0
- package/lib/mass/core/massStateEdits.d.ts +51 -0
- package/lib/mass/core/massStateEdits.d.ts.map +1 -0
- package/lib/mass/core/massStateEdits.js +90 -0
- package/lib/mass/core/massStateEdits.js.map +1 -0
- package/lib/mass/core/massSummary.d.ts +77 -0
- package/lib/mass/core/massSummary.d.ts.map +1 -0
- package/lib/mass/core/massSummary.js +174 -0
- package/lib/mass/core/massSummary.js.map +1 -0
- package/lib/mass/core/mzDecimalsSetting.d.ts +36 -0
- package/lib/mass/core/mzDecimalsSetting.d.ts.map +1 -0
- package/lib/mass/core/mzDecimalsSetting.js +42 -0
- package/lib/mass/core/mzDecimalsSetting.js.map +1 -0
- package/lib/mass/core/nearestPeak.d.ts +75 -0
- package/lib/mass/core/nearestPeak.d.ts.map +1 -0
- package/lib/mass/core/nearestPeak.js +99 -0
- package/lib/mass/core/nearestPeak.js.map +1 -0
- package/lib/mass/core/peakLabelLines.d.ts +77 -0
- package/lib/mass/core/peakLabelLines.d.ts.map +1 -0
- package/lib/mass/core/peakLabelLines.js +54 -0
- package/lib/mass/core/peakLabelLines.js.map +1 -0
- package/lib/mass/core/peakLabelPlan.d.ts +109 -0
- package/lib/mass/core/peakLabelPlan.d.ts.map +1 -0
- package/lib/mass/core/peakLabelPlan.js +143 -0
- package/lib/mass/core/peakLabelPlan.js.map +1 -0
- package/lib/mass/core/peakTable.d.ts +54 -0
- package/lib/mass/core/peakTable.d.ts.map +1 -0
- package/lib/mass/core/peakTable.js +53 -0
- package/lib/mass/core/peakTable.js.map +1 -0
- package/lib/mass/core/resolutionOf.d.ts +60 -0
- package/lib/mass/core/resolutionOf.d.ts.map +1 -0
- package/lib/mass/core/resolutionOf.js +84 -0
- package/lib/mass/core/resolutionOf.js.map +1 -0
- package/lib/mass/core/scanFilter.d.ts +25 -0
- package/lib/mass/core/scanFilter.d.ts.map +1 -0
- package/lib/mass/core/scanFilter.js +107 -0
- package/lib/mass/core/scanFilter.js.map +1 -0
- package/lib/mass/core/spectrumJcamp.d.ts +47 -0
- package/lib/mass/core/spectrumJcamp.d.ts.map +1 -0
- package/lib/mass/core/spectrumJcamp.js +167 -0
- package/lib/mass/core/spectrumJcamp.js.map +1 -0
- package/lib/mass/core/toMassSpectrum.d.ts +67 -0
- package/lib/mass/core/toMassSpectrum.d.ts.map +1 -0
- package/lib/mass/core/toMassSpectrum.js +78 -0
- package/lib/mass/core/toMassSpectrum.js.map +1 -0
- package/lib/mass/core/traceIcon.d.ts +82 -0
- package/lib/mass/core/traceIcon.d.ts.map +1 -0
- package/lib/mass/core/traceIcon.js +66 -0
- package/lib/mass/core/traceIcon.js.map +1 -0
- package/lib/mass/core/writtenResolution.d.ts +40 -0
- package/lib/mass/core/writtenResolution.d.ts.map +1 -0
- package/lib/mass/core/writtenResolution.js +77 -0
- package/lib/mass/core/writtenResolution.js.map +1 -0
- package/lib/mass/ui/MassAboutDialog.d.ts +16 -0
- package/lib/mass/ui/MassAboutDialog.d.ts.map +1 -0
- package/lib/mass/ui/MassAboutDialog.js +44 -0
- package/lib/mass/ui/MassAboutDialog.js.map +1 -0
- package/lib/mass/ui/MassCanvas.d.ts +46 -0
- package/lib/mass/ui/MassCanvas.d.ts.map +1 -0
- package/lib/mass/ui/MassCanvas.js +84 -0
- package/lib/mass/ui/MassCanvas.js.map +1 -0
- package/lib/mass/ui/MassChart.d.ts +21 -0
- package/lib/mass/ui/MassChart.d.ts.map +1 -0
- package/lib/mass/ui/MassChart.js +139 -0
- package/lib/mass/ui/MassChart.js.map +1 -0
- package/lib/mass/ui/MassCommandProvider.d.ts +15 -0
- package/lib/mass/ui/MassCommandProvider.d.ts.map +1 -0
- package/lib/mass/ui/MassCommandProvider.js +14 -0
- package/lib/mass/ui/MassCommandProvider.js.map +1 -0
- package/lib/mass/ui/MassCommandTooltip.d.ts +16 -0
- package/lib/mass/ui/MassCommandTooltip.d.ts.map +1 -0
- package/lib/mass/ui/MassCommandTooltip.js +22 -0
- package/lib/mass/ui/MassCommandTooltip.js.map +1 -0
- package/lib/mass/ui/MassDocumentationDialog.d.ts +18 -0
- package/lib/mass/ui/MassDocumentationDialog.d.ts.map +1 -0
- package/lib/mass/ui/MassDocumentationDialog.js +70 -0
- package/lib/mass/ui/MassDocumentationDialog.js.map +1 -0
- package/lib/mass/ui/MassEditor.d.ts +78 -0
- package/lib/mass/ui/MassEditor.d.ts.map +1 -0
- package/lib/mass/ui/MassEditor.js +42 -0
- package/lib/mass/ui/MassEditor.js.map +1 -0
- package/lib/mass/ui/MassHeader.d.ts +12 -0
- package/lib/mass/ui/MassHeader.d.ts.map +1 -0
- package/lib/mass/ui/MassHeader.js +20 -0
- package/lib/mass/ui/MassHeader.js.map +1 -0
- package/lib/mass/ui/MassLogo.d.ts +21 -0
- package/lib/mass/ui/MassLogo.d.ts.map +1 -0
- package/lib/mass/ui/MassLogo.js +36 -0
- package/lib/mass/ui/MassLogo.js.map +1 -0
- package/lib/mass/ui/MassPointerTracker.d.ts +44 -0
- package/lib/mass/ui/MassPointerTracker.d.ts.map +1 -0
- package/lib/mass/ui/MassPointerTracker.js +29 -0
- package/lib/mass/ui/MassPointerTracker.js.map +1 -0
- package/lib/mass/ui/MassShell.d.ts +29 -0
- package/lib/mass/ui/MassShell.d.ts.map +1 -0
- package/lib/mass/ui/MassShell.js +133 -0
- package/lib/mass/ui/MassShell.js.map +1 -0
- package/lib/mass/ui/MassSidePanel.d.ts +32 -0
- package/lib/mass/ui/MassSidePanel.d.ts.map +1 -0
- package/lib/mass/ui/MassSidePanel.js +44 -0
- package/lib/mass/ui/MassSidePanel.js.map +1 -0
- package/lib/mass/ui/MassStateProvider.d.ts +19 -0
- package/lib/mass/ui/MassStateProvider.d.ts.map +1 -0
- package/lib/mass/ui/MassStateProvider.js +16 -0
- package/lib/mass/ui/MassStateProvider.js.map +1 -0
- package/lib/mass/ui/MassStatusBar.d.ts +15 -0
- package/lib/mass/ui/MassStatusBar.d.ts.map +1 -0
- package/lib/mass/ui/MassStatusBar.js +50 -0
- package/lib/mass/ui/MassStatusBar.js.map +1 -0
- package/lib/mass/ui/MassToolbar.d.ts +24 -0
- package/lib/mass/ui/MassToolbar.d.ts.map +1 -0
- package/lib/mass/ui/MassToolbar.js +36 -0
- package/lib/mass/ui/MassToolbar.js.map +1 -0
- package/lib/mass/ui/MetadataPanel.d.ts +35 -0
- package/lib/mass/ui/MetadataPanel.d.ts.map +1 -0
- package/lib/mass/ui/MetadataPanel.js +100 -0
- package/lib/mass/ui/MetadataPanel.js.map +1 -0
- package/lib/mass/ui/MzDecimalsMenu.d.ts +28 -0
- package/lib/mass/ui/MzDecimalsMenu.d.ts.map +1 -0
- package/lib/mass/ui/MzDecimalsMenu.js +40 -0
- package/lib/mass/ui/MzDecimalsMenu.js.map +1 -0
- package/lib/mass/ui/PeakLabels.d.ts +93 -0
- package/lib/mass/ui/PeakLabels.d.ts.map +1 -0
- package/lib/mass/ui/PeakLabels.js +91 -0
- package/lib/mass/ui/PeakLabels.js.map +1 -0
- package/lib/mass/ui/PeakTable.d.ts +34 -0
- package/lib/mass/ui/PeakTable.d.ts.map +1 -0
- package/lib/mass/ui/PeakTable.js +49 -0
- package/lib/mass/ui/PeakTable.js.map +1 -0
- package/lib/mass/ui/PeaksPanel.d.ts +31 -0
- package/lib/mass/ui/PeaksPanel.d.ts.map +1 -0
- package/lib/mass/ui/PeaksPanel.js +53 -0
- package/lib/mass/ui/PeaksPanel.js.map +1 -0
- package/lib/mass/ui/SpectraPanel.d.ts +17 -0
- package/lib/mass/ui/SpectraPanel.d.ts.map +1 -0
- package/lib/mass/ui/SpectraPanel.js +76 -0
- package/lib/mass/ui/SpectraPanel.js.map +1 -0
- package/lib/mass/ui/SpectrumRow.d.ts +26 -0
- package/lib/mass/ui/SpectrumRow.d.ts.map +1 -0
- package/lib/mass/ui/SpectrumRow.js +141 -0
- package/lib/mass/ui/SpectrumRow.js.map +1 -0
- package/lib/mass/ui/SpectrumTrace.d.ts +46 -0
- package/lib/mass/ui/SpectrumTrace.d.ts.map +1 -0
- package/lib/mass/ui/SpectrumTrace.js +68 -0
- package/lib/mass/ui/SpectrumTrace.js.map +1 -0
- package/lib/mass/ui/index.d.ts +69 -0
- package/lib/mass/ui/index.d.ts.map +1 -0
- package/lib/mass/ui/index.js +42 -0
- package/lib/mass/ui/index.js.map +1 -0
- package/lib/mass/ui/massActions.d.ts +52 -0
- package/lib/mass/ui/massActions.d.ts.map +1 -0
- package/lib/mass/ui/massActions.js +62 -0
- package/lib/mass/ui/massActions.js.map +1 -0
- package/lib/mass/ui/massChartProps.d.ts +128 -0
- package/lib/mass/ui/massChartProps.d.ts.map +1 -0
- package/lib/mass/ui/massChartProps.js +14 -0
- package/lib/mass/ui/massChartProps.js.map +1 -0
- package/lib/mass/ui/massCommandContext.d.ts +36 -0
- package/lib/mass/ui/massCommandContext.d.ts.map +1 -0
- package/lib/mass/ui/massCommandContext.js +45 -0
- package/lib/mass/ui/massCommandContext.js.map +1 -0
- package/lib/mass/ui/massHostPanels.d.ts +48 -0
- package/lib/mass/ui/massHostPanels.d.ts.map +1 -0
- package/lib/mass/ui/massHostPanels.js +41 -0
- package/lib/mass/ui/massHostPanels.js.map +1 -0
- package/lib/mass/ui/massStateContext.d.ts +26 -0
- package/lib/mass/ui/massStateContext.d.ts.map +1 -0
- package/lib/mass/ui/massStateContext.js +37 -0
- package/lib/mass/ui/massStateContext.js.map +1 -0
- package/lib/mass/ui/useIntensityZoom.d.ts +20 -0
- package/lib/mass/ui/useIntensityZoom.d.ts.map +1 -0
- package/lib/mass/ui/useIntensityZoom.js +42 -0
- package/lib/mass/ui/useIntensityZoom.js.map +1 -0
- package/lib/mass/ui/useMassEditor.d.ts +52 -0
- package/lib/mass/ui/useMassEditor.d.ts.map +1 -0
- package/lib/mass/ui/useMassEditor.js +93 -0
- package/lib/mass/ui/useMassEditor.js.map +1 -0
- package/lib/mass/ui/useMassFiles.d.ts +22 -0
- package/lib/mass/ui/useMassFiles.d.ts.map +1 -0
- package/lib/mass/ui/useMassFiles.js +71 -0
- package/lib/mass/ui/useMassFiles.js.map +1 -0
- package/lib/mass/ui/useMassHandle.d.ts +15 -0
- package/lib/mass/ui/useMassHandle.d.ts.map +1 -0
- package/lib/mass/ui/useMassHandle.js +35 -0
- package/lib/mass/ui/useMassHandle.js.map +1 -0
- package/lib/mass/ui/useMassPointer.d.ts +70 -0
- package/lib/mass/ui/useMassPointer.d.ts.map +1 -0
- package/lib/mass/ui/useMassPointer.js +57 -0
- package/lib/mass/ui/useMassPointer.js.map +1 -0
- package/lib/mass/ui/useMassShortcuts.d.ts +21 -0
- package/lib/mass/ui/useMassShortcuts.d.ts.map +1 -0
- package/lib/mass/ui/useMassShortcuts.js +66 -0
- package/lib/mass/ui/useMassShortcuts.js.map +1 -0
- package/lib/mass/ui/useMassSide.d.ts +27 -0
- package/lib/mass/ui/useMassSide.d.ts.map +1 -0
- package/lib/mass/ui/useMassSide.js +45 -0
- package/lib/mass/ui/useMassSide.js.map +1 -0
- package/lib/mass/ui/useMassZoom.d.ts +92 -0
- package/lib/mass/ui/useMassZoom.d.ts.map +1 -0
- package/lib/mass/ui/useMassZoom.js +65 -0
- package/lib/mass/ui/useMassZoom.js.map +1 -0
- package/lib/mass.d.ts +16 -0
- package/lib/mass.d.ts.map +1 -0
- package/lib/mass.js +16 -0
- package/lib/mass.js.map +1 -0
- package/lib/panel/ui/PanelRail.d.ts.map +1 -1
- package/lib/panel/ui/PanelRail.js +6 -1
- package/lib/panel/ui/PanelRail.js.map +1 -1
- package/lib/slides/ui/slideSanitizeSchema.d.ts +3 -2
- package/lib/slides/ui/slideSanitizeSchema.d.ts.map +1 -1
- package/lib/slides/ui/slideSanitizeSchema.js +82 -2
- package/lib/slides/ui/slideSanitizeSchema.js.map +1 -1
- package/package.json +6 -1
- package/src/about/core/providers.ts +7 -0
- package/src/about/ui/AboutProvidedBy.tsx +49 -0
- package/src/chart/ui/useChartPointer.ts +18 -4
- package/src/credits/core/credits.ts +53 -0
- package/src/download/core/drawingMarkup.ts +18 -1
- package/src/download/core/figurePng.ts +21 -8
- package/src/download/core/figureSvg.ts +5 -2
- package/src/download/core/figureTarget.ts +28 -3
- package/src/download/core/svgBounds.ts +21 -0
- package/src/download/core/svgToPng.ts +3 -4
- package/src/format/core/relativeTime.ts +29 -7
- package/src/host/core/connectHost.ts +77 -120
- package/src/host/core/hostOutputs.ts +197 -0
- package/src/host/core/index.ts +13 -7
- package/src/host/core/irKinds.ts +92 -0
- package/src/host/core/kinds.ts +16 -6
- package/src/host/core/protocol.ts +50 -8
- package/src/host/core/selectInputs.ts +145 -0
- package/src/host/testing/sciPeaks.ts +140 -0
- package/src/host/testing/standInHost.ts +30 -5
- package/src/host/ui/useHostConnection.ts +17 -8
- package/src/host-testing.ts +4 -0
- package/src/ir/core/handPicking.ts +154 -0
- package/src/ir/core/index.ts +14 -0
- package/src/ir/core/irBandState.ts +155 -0
- package/src/ir/core/irCommands.ts +7 -0
- package/src/ir/core/irPeaks.ts +79 -0
- package/src/ir/core/irReducer.ts +27 -34
- package/src/ir/core/irSpectrum.ts +16 -0
- package/src/ir/core/irState.ts +15 -8
- package/src/ir/core/pickBands.ts +46 -39
- package/src/ir/core/ramanBands.ts +2 -2
- package/src/ir/core/spectrumBands.ts +113 -0
- package/src/ir/ui/BandRow.tsx +20 -2
- package/src/ir/ui/BandsPanel.tsx +46 -88
- package/src/ir/ui/BandsToolbar.tsx +152 -0
- package/src/ir/ui/IrCanvas.tsx +22 -11
- package/src/ir/ui/IrChart.tsx +10 -1
- package/src/ir/ui/IrDocumentationDialog.tsx +7 -0
- package/src/ir/ui/IrEditor.tsx +4 -2
- package/src/ir/ui/IrShell.tsx +5 -0
- package/src/ir/ui/IrStatusBar.tsx +4 -1
- package/src/ir/ui/IrToolbar.tsx +14 -5
- package/src/ir/ui/VibrationalEditor.tsx +2 -1
- package/src/ir/ui/irActions.ts +11 -0
- package/src/ir/ui/irChartProps.ts +4 -1
- package/src/ir/ui/useIrEditor.ts +21 -21
- package/src/locales/de.json +63 -0
- package/src/locales/en.json +63 -0
- package/src/locales/es.json +63 -0
- package/src/locales/fr.json +63 -0
- package/src/locales/it.json +63 -0
- package/src/mass/core/analyseSpectrum.ts +191 -0
- package/src/mass/core/ascendingTrace.ts +62 -0
- package/src/mass/core/centroidPeaks.ts +114 -0
- package/src/mass/core/detectMassFormat.ts +113 -0
- package/src/mass/core/downloadSpectra.ts +52 -0
- package/src/mass/core/fromJcamp.ts +151 -0
- package/src/mass/core/fromText.ts +58 -0
- package/src/mass/core/index.ts +194 -0
- package/src/mass/core/jcampTechnique.ts +87 -0
- package/src/mass/core/labelStackBox.ts +75 -0
- package/src/mass/core/labelledPeaks.ts +135 -0
- package/src/mass/core/loadMassSpectra.ts +86 -0
- package/src/mass/core/loadedMassSpectrum.ts +43 -0
- package/src/mass/core/massCommands.ts +156 -0
- package/src/mass/core/massDomain.ts +229 -0
- package/src/mass/core/massEditorApi.ts +68 -0
- package/src/mass/core/massFormat.ts +187 -0
- package/src/mass/core/massMeta.ts +239 -0
- package/src/mass/core/massReducer.ts +232 -0
- package/src/mass/core/massResolution.ts +169 -0
- package/src/mass/core/massSidePanels.ts +27 -0
- package/src/mass/core/massSpectrum.ts +220 -0
- package/src/mass/core/massState.ts +206 -0
- package/src/mass/core/massStateEdits.ts +104 -0
- package/src/mass/core/massSummary.ts +213 -0
- package/src/mass/core/mzDecimalsSetting.ts +52 -0
- package/src/mass/core/nearestPeak.ts +130 -0
- package/src/mass/core/peakLabelLines.ts +112 -0
- package/src/mass/core/peakLabelPlan.ts +246 -0
- package/src/mass/core/peakTable.ts +82 -0
- package/src/mass/core/resolutionOf.ts +100 -0
- package/src/mass/core/scanFilter.ts +119 -0
- package/src/mass/core/spectrumJcamp.ts +186 -0
- package/src/mass/core/toMassSpectrum.ts +126 -0
- package/src/mass/core/traceIcon.ts +105 -0
- package/src/mass/core/writtenResolution.ts +81 -0
- package/src/mass/ui/MassAboutDialog.tsx +89 -0
- package/src/mass/ui/MassCanvas.tsx +170 -0
- package/src/mass/ui/MassChart.tsx +266 -0
- package/src/mass/ui/MassCommandProvider.tsx +34 -0
- package/src/mass/ui/MassCommandTooltip.tsx +36 -0
- package/src/mass/ui/MassDocumentationDialog.tsx +136 -0
- package/src/mass/ui/MassEditor.tsx +130 -0
- package/src/mass/ui/MassHeader.tsx +38 -0
- package/src/mass/ui/MassLogo.tsx +84 -0
- package/src/mass/ui/MassPointerTracker.tsx +72 -0
- package/src/mass/ui/MassShell.tsx +237 -0
- package/src/mass/ui/MassSidePanel.tsx +107 -0
- package/src/mass/ui/MassStateProvider.tsx +32 -0
- package/src/mass/ui/MassStatusBar.tsx +108 -0
- package/src/mass/ui/MassToolbar.tsx +120 -0
- package/src/mass/ui/MetadataPanel.tsx +201 -0
- package/src/mass/ui/MzDecimalsMenu.tsx +86 -0
- package/src/mass/ui/PeakLabels.tsx +242 -0
- package/src/mass/ui/PeakTable.tsx +199 -0
- package/src/mass/ui/PeaksPanel.tsx +182 -0
- package/src/mass/ui/SpectraPanel.tsx +153 -0
- package/src/mass/ui/SpectrumRow.tsx +246 -0
- package/src/mass/ui/SpectrumTrace.tsx +119 -0
- package/src/mass/ui/index.ts +69 -0
- package/src/mass/ui/massActions.ts +109 -0
- package/src/mass/ui/massChartProps.ts +130 -0
- package/src/mass/ui/massCommandContext.tsx +65 -0
- package/src/mass/ui/massHostPanels.ts +71 -0
- package/src/mass/ui/massStateContext.ts +48 -0
- package/src/mass/ui/useIntensityZoom.ts +55 -0
- package/src/mass/ui/useMassEditor.ts +156 -0
- package/src/mass/ui/useMassFiles.ts +91 -0
- package/src/mass/ui/useMassHandle.ts +58 -0
- package/src/mass/ui/useMassPointer.ts +120 -0
- package/src/mass/ui/useMassShortcuts.ts +85 -0
- package/src/mass/ui/useMassSide.ts +63 -0
- package/src/mass/ui/useMassZoom.ts +157 -0
- package/src/mass.ts +16 -0
- package/src/panel/ui/PanelRail.tsx +5 -1
- package/src/slides/ui/slideSanitizeSchema.ts +86 -2
- package/styles/chrome.css +7 -0
- package/styles/slides.css +47 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one thing both readers have to do to the points a parser hands back.
|
|
3
|
+
*
|
|
4
|
+
* Every peak lookup, crosshair and label here finds its point by bisection, and
|
|
5
|
+
* bisection over a descending axis does not fail — it answers confidently and
|
|
6
|
+
* wrongly. A JCAMP keeps the order the file wrote, and a peak table pasted out
|
|
7
|
+
* of a report may be sorted by intensity, so the order is checked and mended
|
|
8
|
+
* here, once, rather than trusted downstream.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { NumberArray } from 'cheminfo-types';
|
|
12
|
+
import { xyEnsureFloat64, xySortX, xyUniqueX } from 'ml-spectra-processing';
|
|
13
|
+
|
|
14
|
+
import type { MassTrace } from './massSpectrum.ts';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The points, typed, in increasing m/z, each m/z once.
|
|
18
|
+
*
|
|
19
|
+
* A mass written twice is summed into one point rather than kept as two: a
|
|
20
|
+
* peak list exported from two overlapping scan ranges repeats the masses where
|
|
21
|
+
* they meet, and two sticks at one m/z are one ion measured twice.
|
|
22
|
+
* @param x - The masses, in the order the parser read them.
|
|
23
|
+
* @param y - The intensities, in the same order.
|
|
24
|
+
* @returns The trace; the arrays handed in themselves when they were already
|
|
25
|
+
* typed, ascending and free of repeats.
|
|
26
|
+
*/
|
|
27
|
+
export function ascendingTrace(x: NumberArray, y: NumberArray): MassTrace {
|
|
28
|
+
const typed = xyEnsureFloat64({ x, y });
|
|
29
|
+
const sorted = isAscending(typed.x) ? typed : xySortX(typed);
|
|
30
|
+
if (!repeatsMass(sorted.x)) return sorted;
|
|
31
|
+
return xyEnsureFloat64(
|
|
32
|
+
xyUniqueX(sorted, { algorithm: 'sum', isSorted: true }),
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Whether an axis never steps backwards.
|
|
38
|
+
*
|
|
39
|
+
* Checked rather than sorted unconditionally, because a mass spectrum is
|
|
40
|
+
* written ascending nearly always and the common case then costs one
|
|
41
|
+
* comparison per point and no allocation at all.
|
|
42
|
+
* @param values - The axis.
|
|
43
|
+
* @returns `true` when each point is at least as far along as the one before.
|
|
44
|
+
*/
|
|
45
|
+
function isAscending(values: Float64Array): boolean {
|
|
46
|
+
for (let index = 1; index < values.length; index++) {
|
|
47
|
+
if ((values[index] as number) < (values[index - 1] as number)) return false;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Whether an ascending axis holds the same mass twice.
|
|
54
|
+
* @param values - The axis, ascending.
|
|
55
|
+
* @returns `true` when two neighbours are equal.
|
|
56
|
+
*/
|
|
57
|
+
function repeatsMass(values: Float64Array): boolean {
|
|
58
|
+
for (let index = 1; index < values.length; index++) {
|
|
59
|
+
if (values[index] === values[index - 1]) return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The centroid as `ms-spectrum` wants to see it, and the windowing built on it.
|
|
3
|
+
*
|
|
4
|
+
* Everything that package does to a peak table — filtering it to a window,
|
|
5
|
+
* keeping the most intense, ranking the best — takes and returns an array of
|
|
6
|
+
* `{ x, y }` objects, while this package holds peaks as three parallel typed
|
|
7
|
+
* arrays. The translation is therefore paid on every zoom and every pointer
|
|
8
|
+
* move unless it is paid once, which is what this file is for.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { getPeaks } from 'ms-spectrum';
|
|
12
|
+
|
|
13
|
+
import type { MassPeaks } from './massSpectrum.ts';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* One peak in the shape `ms-spectrum` speaks.
|
|
17
|
+
*
|
|
18
|
+
* `charge` is always present and `0` stands for "none was established", where
|
|
19
|
+
* `ms-spectrum` leaves the property off entirely — the column it comes from is
|
|
20
|
+
* dense, and a consumer reading `peak.charge > 1` should not have to remember
|
|
21
|
+
* which of the two conventions it is holding.
|
|
22
|
+
*/
|
|
23
|
+
export interface MassPeakObject {
|
|
24
|
+
/** Where the peak sits, in m/z. */
|
|
25
|
+
x: number;
|
|
26
|
+
/** Its intensity, on the 0–100 scale the analysis normalised to. */
|
|
27
|
+
y: number;
|
|
28
|
+
/** The charge of the series it belongs to, `0` where none was established. */
|
|
29
|
+
charge: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Which peaks of a centroid a window is interested in. */
|
|
33
|
+
export interface SelectCentroidPeaksOptions {
|
|
34
|
+
/**
|
|
35
|
+
* Lowest m/z considered.
|
|
36
|
+
* @default the m/z of the first peak
|
|
37
|
+
*/
|
|
38
|
+
from?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Highest m/z considered.
|
|
41
|
+
* @default the m/z of the last peak
|
|
42
|
+
*/
|
|
43
|
+
to?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Smallest intensity kept, as a fraction of the base peak of the whole
|
|
46
|
+
* spectrum rather than of the window — zooming into the baseline shows the
|
|
47
|
+
* baseline, not peaks promoted by their neighbours scrolling off.
|
|
48
|
+
* @default 0.01
|
|
49
|
+
*/
|
|
50
|
+
threshold?: number;
|
|
51
|
+
/**
|
|
52
|
+
* How many peaks at most, keeping the most intense. `0` is read as no limit.
|
|
53
|
+
* @default undefined
|
|
54
|
+
*/
|
|
55
|
+
limit?: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The peaks of a centroid as objects, built once and handed out again.
|
|
60
|
+
*
|
|
61
|
+
* Kept in a `WeakMap` on the centroid itself rather than recomputed: a spectrum
|
|
62
|
+
* is windowed on every zoom and every pointer move, and a hundred thousand
|
|
63
|
+
* short-lived objects a gesture is what makes a viewer stutter. The centroid is
|
|
64
|
+
* replaced on a change and never written into, so its identity is a sound key,
|
|
65
|
+
* and the entry goes when the spectrum does. The objects are shared with every
|
|
66
|
+
* caller and with the cache — read them, never write into them.
|
|
67
|
+
* @param centroid - The picked peaks.
|
|
68
|
+
* @returns The same peaks as objects, in increasing m/z.
|
|
69
|
+
* @throws {RangeError} When the three columns are not the same length.
|
|
70
|
+
*/
|
|
71
|
+
export function centroidPeakObjects(centroid: MassPeaks): MassPeakObject[] {
|
|
72
|
+
const cached = peakObjectCache.get(centroid);
|
|
73
|
+
if (cached !== undefined) return cached;
|
|
74
|
+
|
|
75
|
+
const count = centroid.x.length;
|
|
76
|
+
if (centroid.y.length !== count || centroid.charge.length !== count) {
|
|
77
|
+
throw new RangeError(
|
|
78
|
+
`The centroid carries ${count} masses, ${centroid.y.length} intensities and ${centroid.charge.length} charges; every peak needs one of each`,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
const objects = new Array<MassPeakObject>(count);
|
|
82
|
+
for (let index = 0; index < count; index++) {
|
|
83
|
+
objects[index] = {
|
|
84
|
+
x: centroid.x[index] as number,
|
|
85
|
+
y: centroid.y[index] as number,
|
|
86
|
+
charge: centroid.charge[index] as number,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
peakObjectCache.set(centroid, objects);
|
|
90
|
+
return objects;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The peaks of a window, at most so many of them and the most intense kept.
|
|
95
|
+
*
|
|
96
|
+
* What a peak table asks for on every zoom: a centroid has far more peaks than
|
|
97
|
+
* anybody reads, and which ones are worth a row changes with the window. It
|
|
98
|
+
* reads the cached objects, so a zoom costs the filtering alone.
|
|
99
|
+
* @param centroid - The picked peaks.
|
|
100
|
+
* @param options - The window, and how many peaks it has room for.
|
|
101
|
+
* @returns The selected peaks, in increasing m/z, sharing the cached objects.
|
|
102
|
+
*/
|
|
103
|
+
export function selectCentroidPeaks(
|
|
104
|
+
centroid: MassPeaks,
|
|
105
|
+
options: SelectCentroidPeaksOptions = {},
|
|
106
|
+
): MassPeakObject[] {
|
|
107
|
+
const objects = centroidPeakObjects(centroid);
|
|
108
|
+
// `getPeaks` reads the window it was given no bounds for off the first and
|
|
109
|
+
// last peak, which it cannot do when there are none.
|
|
110
|
+
if (objects.length === 0) return [];
|
|
111
|
+
return getPeaks(objects, options) as MassPeakObject[];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const peakObjectCache = new WeakMap<MassPeaks, MassPeakObject[]>();
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which reader a dropped file belongs to, decided from the file itself.
|
|
3
|
+
*
|
|
4
|
+
* The extension is the least reliable thing about a spectrum file: instruments
|
|
5
|
+
* export JCAMP as `.txt`, LIMS systems rename everything to `.dat`, and a user
|
|
6
|
+
* pasting into a text box has no extension at all. So the content decides and
|
|
7
|
+
* the name is consulted only when the content stayed silent.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** What a file can turn out to be, as far as this viewer reads it. */
|
|
11
|
+
export type DetectedMassFormat = 'jcamp' | 'text' | 'unknown';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* How much of the file the decision is taken on.
|
|
15
|
+
*
|
|
16
|
+
* The one marker looked for sits at the very top — `##TITLE=` opens a JCAMP —
|
|
17
|
+
* so reading further would only cost a decode of the whole file.
|
|
18
|
+
*/
|
|
19
|
+
const HEADER_BYTES = 4096;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Extensions that name a format outright, once the content has said nothing.
|
|
23
|
+
*
|
|
24
|
+
* A `Map` rather than an object, because the key comes off a file name the user
|
|
25
|
+
* chose: `spectrum.constructor` read out of an object literal answers with a
|
|
26
|
+
* function inherited from `Object.prototype`, which is neither a format nor
|
|
27
|
+
* `undefined` and so passes every check made of it.
|
|
28
|
+
*/
|
|
29
|
+
const EXTENSIONS = new Map<string, DetectedMassFormat>([
|
|
30
|
+
['jdx', 'jcamp'],
|
|
31
|
+
['dx', 'jcamp'],
|
|
32
|
+
['jcamp', 'jcamp'],
|
|
33
|
+
['txt', 'text'],
|
|
34
|
+
['csv', 'text'],
|
|
35
|
+
['tsv', 'text'],
|
|
36
|
+
['xy', 'text'],
|
|
37
|
+
['asc', 'text'],
|
|
38
|
+
['dat', 'text'],
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The one decoder the header is read through, kept because a drop of fifty
|
|
43
|
+
* files would otherwise build fifty of them for four kilobytes each.
|
|
44
|
+
*/
|
|
45
|
+
const DECODER = new TextDecoder();
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Decide what a dropped file is, from its first bytes and only then its name.
|
|
49
|
+
*
|
|
50
|
+
* Returns `'unknown'` rather than guessing `'text'` for the two cases the
|
|
51
|
+
* readers cannot survive: nothing at all, and bytes that are plainly not text.
|
|
52
|
+
* Handing either to the text reader produces an empty spectrum and a message
|
|
53
|
+
* about missing columns, which sends whoever dropped the file looking in the
|
|
54
|
+
* wrong place.
|
|
55
|
+
* @param data - The file, or the pasted text.
|
|
56
|
+
* @param fileName - Its name, when it has one.
|
|
57
|
+
* @returns The format, or `'unknown'` when nothing in the file names one.
|
|
58
|
+
*/
|
|
59
|
+
export function detectMassFormat(
|
|
60
|
+
data: Uint8Array | string,
|
|
61
|
+
fileName?: string,
|
|
62
|
+
): DetectedMassFormat {
|
|
63
|
+
const header = stripByteOrderMark(readHeader(data)).trimStart();
|
|
64
|
+
if (header.startsWith('##')) return 'jcamp';
|
|
65
|
+
|
|
66
|
+
const named = formatFromExtension(fileName);
|
|
67
|
+
if (named !== undefined && named !== 'text') return named;
|
|
68
|
+
if (header.length === 0) return 'unknown';
|
|
69
|
+
// A binary file decodes to replacement characters; a peak list decodes to
|
|
70
|
+
// digits. Telling them apart on the decode is what stops a stray `.raw` from
|
|
71
|
+
// reaching the text reader and being told it holds no columns of numbers.
|
|
72
|
+
if (header.includes('�') || header.includes('\0')) return 'unknown';
|
|
73
|
+
return 'text';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The first bytes of the file, as text.
|
|
78
|
+
* @param data - The file, or the pasted text.
|
|
79
|
+
* @returns The decoded prefix; a byte sequence cut in half at the end decodes
|
|
80
|
+
* to a replacement character, which the marker looked for does not contain.
|
|
81
|
+
*/
|
|
82
|
+
function readHeader(data: Uint8Array | string): string {
|
|
83
|
+
if (typeof data === 'string') return data.slice(0, HEADER_BYTES);
|
|
84
|
+
return DECODER.decode(data.subarray(0, HEADER_BYTES));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Drop a leading UTF-8 byte order mark.
|
|
89
|
+
*
|
|
90
|
+
* This is the whole reason the header is normalised before it is tested: a
|
|
91
|
+
* `U+FEFF` in front of `##TITLE=` makes a plain `startsWith('##')` fail, and a
|
|
92
|
+
* JCAMP carrying one then goes silently to the text reader, which reads its
|
|
93
|
+
* records as unparsable lines and reports two columns of nothing.
|
|
94
|
+
* @param header - The decoded prefix.
|
|
95
|
+
* @returns The prefix without its mark.
|
|
96
|
+
*/
|
|
97
|
+
function stripByteOrderMark(header: string): string {
|
|
98
|
+
return header.startsWith('') ? header.slice(1) : header;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The format a file name claims, used only once the content has said nothing.
|
|
103
|
+
* @param fileName - The name, when the file has one.
|
|
104
|
+
* @returns The format, or `undefined` when the extension names none.
|
|
105
|
+
*/
|
|
106
|
+
function formatFromExtension(
|
|
107
|
+
fileName?: string,
|
|
108
|
+
): DetectedMassFormat | undefined {
|
|
109
|
+
if (fileName === undefined) return undefined;
|
|
110
|
+
const extension = fileName.split('.').pop();
|
|
111
|
+
if (extension === undefined || extension === fileName) return undefined;
|
|
112
|
+
return EXTENSIONS.get(extension.toLowerCase());
|
|
113
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handing spectra over as a file, from the list they are drawn from.
|
|
3
|
+
*
|
|
4
|
+
* Kept apart from `spectrumJcamp.ts` so that what a file holds can be tested
|
|
5
|
+
* without a DOM, and so that a page wanting the text for something other than a
|
|
6
|
+
* download — a POST to an ELN, a zip of a whole session — reaches for the writer
|
|
7
|
+
* and not for this.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { downloadText } from '../../download/core/downloadText.ts';
|
|
11
|
+
import { sanitizeFileName } from '../../download/core/sanitizeFileName.ts';
|
|
12
|
+
|
|
13
|
+
import type { MassSpectrum } from './massSpectrum.ts';
|
|
14
|
+
import {
|
|
15
|
+
JCAMP_EXTENSION,
|
|
16
|
+
JCAMP_MIME_TYPE,
|
|
17
|
+
massSpectraToJcamp,
|
|
18
|
+
massSpectrumToJcamp,
|
|
19
|
+
} from './spectrumJcamp.ts';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Download one spectrum, named after what the list calls it.
|
|
23
|
+
* @param spectrum - The spectrum.
|
|
24
|
+
*/
|
|
25
|
+
export function downloadMassSpectrum(spectrum: MassSpectrum): void {
|
|
26
|
+
downloadText(
|
|
27
|
+
massSpectrumToJcamp(spectrum),
|
|
28
|
+
`${sanitizeFileName(spectrum.name, 'spectrum')}${JCAMP_EXTENSION}`,
|
|
29
|
+
JCAMP_MIME_TYPE,
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Download the whole list as one file.
|
|
35
|
+
*
|
|
36
|
+
* A list of one is saved under that spectrum's own name, since the file is that
|
|
37
|
+
* spectrum: a chemist who has one spectrum open and asks the panel for it should
|
|
38
|
+
* not have to work out which of their downloads `spectra.jdx` was.
|
|
39
|
+
* @param spectra - The spectra, in the order the list holds them.
|
|
40
|
+
*/
|
|
41
|
+
export function downloadMassSpectra(spectra: readonly MassSpectrum[]): void {
|
|
42
|
+
const only = spectra.length === 1 ? spectra[0] : undefined;
|
|
43
|
+
if (only !== undefined) {
|
|
44
|
+
downloadMassSpectrum(only);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
downloadText(
|
|
48
|
+
massSpectraToJcamp(spectra),
|
|
49
|
+
`spectra${JCAMP_EXTENSION}`,
|
|
50
|
+
JCAMP_MIME_TYPE,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read a JCAMP-DX file into mass spectra, through `jcampconverter`.
|
|
3
|
+
*
|
|
4
|
+
* Every block, never the first: a JCAMP is a container, a `LINK` block holds
|
|
5
|
+
* several spectra and a GC/MS export writes one page per scan of an `NTUPLES`
|
|
6
|
+
* block. Taking only the first would quietly drop what the chemist exported the
|
|
7
|
+
* file for, and would do it without an error, which is the worst way to lose
|
|
8
|
+
* data.
|
|
9
|
+
*
|
|
10
|
+
* Two things the converter reports are deliberately not believed. The order of
|
|
11
|
+
* the points, which `ascendingTrace` mends. And its `isPeaktable` flag, which is
|
|
12
|
+
* set for *any* table of explicit `x y` pairs — instrument software writes
|
|
13
|
+
* continuous Orbitrap scans as `##PEAK TABLE=(XY..XY)` as a matter of course,
|
|
14
|
+
* because the compressed alternative rebuilds the axis from a first x and an
|
|
15
|
+
* increment, and an FT scan is not evenly sampled. Taken at its word, ten
|
|
16
|
+
* thousand points of a profile draw as ten thousand sticks; so the claim is
|
|
17
|
+
* dropped and the spacing of the points decides.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { convert } from 'jcampconverter';
|
|
21
|
+
|
|
22
|
+
import { describeSource, errorMessage } from '../../error/core/index.ts';
|
|
23
|
+
|
|
24
|
+
import { ascendingTrace } from './ascendingTrace.ts';
|
|
25
|
+
import { otherTechnique } from './jcampTechnique.ts';
|
|
26
|
+
import type { LoadedMassSpectrum } from './loadedMassSpectrum.ts';
|
|
27
|
+
import { buildMassMeta, recordText } from './massMeta.ts';
|
|
28
|
+
|
|
29
|
+
/** How a JCAMP is read. */
|
|
30
|
+
export interface MassJcampReadOptions {
|
|
31
|
+
/**
|
|
32
|
+
* The file's name, carried onto every spectrum it produced.
|
|
33
|
+
* @default undefined
|
|
34
|
+
*/
|
|
35
|
+
fileName?: string;
|
|
36
|
+
/** At most how many spectra to read out of it. */
|
|
37
|
+
maxSpectra: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** What a JCAMP turned out to hold. */
|
|
41
|
+
export interface MassJcampReadResult {
|
|
42
|
+
/** The spectra, in the order the file wrote them. */
|
|
43
|
+
spectra: LoadedMassSpectrum[];
|
|
44
|
+
/** How many spectra `maxSpectra` left unread, `0` when none. */
|
|
45
|
+
dropped: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Read every mass spectrum a JCAMP-DX file holds.
|
|
50
|
+
* @param data - The file, as bytes or as text.
|
|
51
|
+
* @param options - The file's name, and how many spectra to read at most.
|
|
52
|
+
* @returns The spectra, and how many were left unread.
|
|
53
|
+
* @throws {Error} When the converter gave up on the file, or when no block of
|
|
54
|
+
* it holds a mass spectrum — with a sentence saying which of the two.
|
|
55
|
+
*/
|
|
56
|
+
export function fromJcamp(
|
|
57
|
+
data: Uint8Array | string,
|
|
58
|
+
options: MassJcampReadOptions,
|
|
59
|
+
): MassJcampReadResult {
|
|
60
|
+
const { fileName, maxSpectra } = options;
|
|
61
|
+
|
|
62
|
+
let entries: ReturnType<typeof convert>['flatten'];
|
|
63
|
+
try {
|
|
64
|
+
entries = convert(data, { keepRecordsRegExp: /.*/ }).flatten;
|
|
65
|
+
} catch (error) {
|
|
66
|
+
// The converter's own words are kept because they name the record it
|
|
67
|
+
// stopped on, which is more than anything written here could say — but they
|
|
68
|
+
// are said about nothing, and a chemist who has just dropped eleven files
|
|
69
|
+
// needs to know which of them this is.
|
|
70
|
+
throw new Error(
|
|
71
|
+
`${describeSource(fileName)} could not be read as JCAMP-DX — the converter stopped on it with: ${errorMessage(error)}`,
|
|
72
|
+
{ cause: error },
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const spectra: LoadedMassSpectrum[] = [];
|
|
77
|
+
const refused: string[] = [];
|
|
78
|
+
let found = 0;
|
|
79
|
+
for (const entry of entries) {
|
|
80
|
+
const technique = otherTechnique(entry);
|
|
81
|
+
if (technique !== null) {
|
|
82
|
+
refused.push(technique);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const meta = buildMassMeta({
|
|
86
|
+
info: entry.info,
|
|
87
|
+
meta: entry.meta,
|
|
88
|
+
...(entry.title === undefined ? {} : { title: entry.title }),
|
|
89
|
+
});
|
|
90
|
+
const title = recordText(entry.title);
|
|
91
|
+
const pages = entry.spectra.length;
|
|
92
|
+
for (const page of entry.spectra) {
|
|
93
|
+
const x = page.data.x ?? [];
|
|
94
|
+
const y = page.data.y ?? [];
|
|
95
|
+
if (x.length === 0) continue;
|
|
96
|
+
found++;
|
|
97
|
+
if (spectra.length >= maxSpectra) continue;
|
|
98
|
+
const loaded: LoadedMassSpectrum = {
|
|
99
|
+
trace: ascendingTrace(x, y),
|
|
100
|
+
meta,
|
|
101
|
+
origin: { format: 'jcamp' },
|
|
102
|
+
};
|
|
103
|
+
const name = pageName(title, pages > 1 ? recordText(page.page) : '');
|
|
104
|
+
if (name !== '') loaded.name = name;
|
|
105
|
+
spectra.push(loaded);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (spectra.length === 0) {
|
|
110
|
+
throw new Error(nothingToRead(describeSource(fileName), refused));
|
|
111
|
+
}
|
|
112
|
+
// Numbered only when there is more than one to tell apart: a file holding
|
|
113
|
+
// one spectrum has no acquisition to point at but the whole file.
|
|
114
|
+
for (let index = 0; spectra.length > 1 && index < spectra.length; index++) {
|
|
115
|
+
(spectra[index] as LoadedMassSpectrum).origin.scanIndex = index;
|
|
116
|
+
}
|
|
117
|
+
for (const spectrum of spectra) {
|
|
118
|
+
if (fileName !== undefined) spectrum.origin.fileName = fileName;
|
|
119
|
+
}
|
|
120
|
+
return { spectra, dropped: found - spectra.length };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* What to call one spectrum of a file: its title, and its page when the block
|
|
125
|
+
* holds several — `T= 720` is how a GC/MS export names the scan at 720 s.
|
|
126
|
+
* @param title - The block's title, `''` when it carries none.
|
|
127
|
+
* @param page - The page's own label, `''` for a block of one spectrum.
|
|
128
|
+
* @returns The name, `''` when there is nothing to call it.
|
|
129
|
+
*/
|
|
130
|
+
function pageName(title: string, page: string): string {
|
|
131
|
+
if (page === '') return title;
|
|
132
|
+
return title === '' ? page : `${title} (${page})`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The sentence for a file that was read and held nothing this viewer wants.
|
|
137
|
+
*
|
|
138
|
+
* Two files end here and only one of them is broken: a file of infrared
|
|
139
|
+
* spectra is a perfectly good JCAMP opened by the wrong viewer, and saying so
|
|
140
|
+
* sends its owner to the right one rather than to the file.
|
|
141
|
+
* @param named - How to name the file at the start of a sentence.
|
|
142
|
+
* @param refused - What each block that stated another technique called itself.
|
|
143
|
+
* @returns The sentence to throw.
|
|
144
|
+
*/
|
|
145
|
+
function nothingToRead(named: string, refused: readonly string[]): string {
|
|
146
|
+
if (refused.length > 0) {
|
|
147
|
+
const stated = [...new Set(refused)].join(', ');
|
|
148
|
+
return `${named} was read as JCAMP-DX but holds no mass spectrum — its blocks state ${stated}. A mass spectrum is read from a block whose ##DATA TYPE names mass spectrometry, or that names no other technique at all.`;
|
|
149
|
+
}
|
|
150
|
+
return `${named} was read as JCAMP-DX but holds no spectrum — no block in it carries points under ##XYDATA=, ##PEAK TABLE=, ##DATA TABLE= or ##NTUPLES=.`;
|
|
151
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read two columns of m/z and intensity, through `xy-parser`.
|
|
3
|
+
*
|
|
4
|
+
* Whatever separates the columns — a tab, a comma, spaces, a semicolon — and
|
|
5
|
+
* whatever header lines come before the numbers, `xy-parser` finds the numbers,
|
|
6
|
+
* so a peak list copied out of an instrument report, a CSV export and a
|
|
7
|
+
* hand-typed table are all one format here.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { parseXY } from 'xy-parser';
|
|
11
|
+
|
|
12
|
+
import { describeSource } from '../../error/core/index.ts';
|
|
13
|
+
|
|
14
|
+
import { ascendingTrace } from './ascendingTrace.ts';
|
|
15
|
+
import type { LoadedMassSpectrum } from './loadedMassSpectrum.ts';
|
|
16
|
+
|
|
17
|
+
/** How a text file is read. */
|
|
18
|
+
export interface MassTextReadOptions {
|
|
19
|
+
/**
|
|
20
|
+
* The file's name, carried onto the spectrum.
|
|
21
|
+
* @default undefined
|
|
22
|
+
*/
|
|
23
|
+
fileName?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Read the one spectrum two columns of numbers make.
|
|
28
|
+
*
|
|
29
|
+
* Nothing is said about the acquisition, because two columns say nothing: the
|
|
30
|
+
* spectrum comes back with no metadata and no name of its own, and is called
|
|
31
|
+
* after its file.
|
|
32
|
+
* @param data - The file, as bytes or as text.
|
|
33
|
+
* @param options - The file's name.
|
|
34
|
+
* @returns The spectrum, as a list of one, the way every reader answers.
|
|
35
|
+
* @throws {Error} When no line of it holds two numbers.
|
|
36
|
+
*/
|
|
37
|
+
export function fromText(
|
|
38
|
+
data: Uint8Array | string,
|
|
39
|
+
options: MassTextReadOptions = {},
|
|
40
|
+
): LoadedMassSpectrum[] {
|
|
41
|
+
const { fileName } = options;
|
|
42
|
+
const { x, y } = parseXY(data);
|
|
43
|
+
if (x.length === 0) {
|
|
44
|
+
throw new Error(
|
|
45
|
+
`${describeSource(fileName)} holds no two columns of numbers — a spectrum in text is one line per point, the m/z first and the intensity after it.`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
return [
|
|
49
|
+
{
|
|
50
|
+
trace: ascendingTrace(x, y),
|
|
51
|
+
meta: null,
|
|
52
|
+
origin:
|
|
53
|
+
fileName === undefined
|
|
54
|
+
? { format: 'text' }
|
|
55
|
+
: { format: 'text', fileName },
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|