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,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The window a chart opens on, worked out from the spectra it was handed.
|
|
3
|
+
*
|
|
4
|
+
* This is what "zoom to fit" and the first render both call, so it has to be
|
|
5
|
+
* right for a peak table of four rows and for a profile scan of half a million
|
|
6
|
+
* points alike, and it has to answer something usable when it is handed nothing
|
|
7
|
+
* at all — a chart with no data is still mounted, still measured, and still
|
|
8
|
+
* builds its scales.
|
|
9
|
+
*/
|
|
10
|
+
import { xMaxValue } from 'ml-spectra-processing';
|
|
11
|
+
/**
|
|
12
|
+
* How much air is left either side of the outermost peak, as a fraction.
|
|
13
|
+
*
|
|
14
|
+
* A stick drawn exactly on the axis reads as a spectrum that was cut off there;
|
|
15
|
+
* two percent is enough to show that it was not.
|
|
16
|
+
*/
|
|
17
|
+
export const X_DOMAIN_PADDING = 0.02;
|
|
18
|
+
/**
|
|
19
|
+
* How far above the tallest peak the intensity axis runs.
|
|
20
|
+
*
|
|
21
|
+
* The base peak carries the label nobody wants to lose — its m/z and its
|
|
22
|
+
* intensity, on two lines — and it is drawn above the stick. Twenty percent is
|
|
23
|
+
* the room those lines take at the top of a chart of any usual height.
|
|
24
|
+
*/
|
|
25
|
+
export const Y_DOMAIN_HEADROOM = 1.2;
|
|
26
|
+
/**
|
|
27
|
+
* The window that shows everything currently drawn.
|
|
28
|
+
*
|
|
29
|
+
* A spectrum marked `excludeFromDomain` is left out of the extents, because it
|
|
30
|
+
* is a preview rather than data: a predicted pattern that appears and
|
|
31
|
+
* disappears with the pointer would throw away the zoom the user set every
|
|
32
|
+
* time it moved the axes. The exclusion is dropped when it would leave nothing
|
|
33
|
+
* at all — previewing into an empty chart has to show the preview, not an empty
|
|
34
|
+
* axis from 0 to 1.
|
|
35
|
+
*
|
|
36
|
+
* In mirror mode the negative half is the reflection of the positive one rather
|
|
37
|
+
* than its own extent. Two spectra compared head-to-head are only comparable if
|
|
38
|
+
* a peak of the same height means the same intensity in both halves; giving each
|
|
39
|
+
* half its own scale makes the weaker spectrum look as intense as the stronger,
|
|
40
|
+
* which is precisely the comparison the view exists to make.
|
|
41
|
+
* @param spectra - What the chart draws.
|
|
42
|
+
* @param mirror - Whether the chart reflects its spectra about zero. Defaults
|
|
43
|
+
* to `false`.
|
|
44
|
+
* @returns The window, in m/z and in intensity.
|
|
45
|
+
*/
|
|
46
|
+
export function fullDomain(spectra, mirror = false) {
|
|
47
|
+
const extent = traceExtent(spectra, false) ?? traceExtent(spectra, true);
|
|
48
|
+
if (extent === null)
|
|
49
|
+
return { x: [0, 1], y: [0, 1] };
|
|
50
|
+
const { xMinimum, xMaximum, yMaximum } = extent;
|
|
51
|
+
const padding = (xMaximum - xMinimum) * X_DOMAIN_PADDING;
|
|
52
|
+
// A single peak, or several at one m/z, has no width to take a fraction of.
|
|
53
|
+
const x = padding > 0
|
|
54
|
+
? [xMinimum - padding, xMaximum + padding]
|
|
55
|
+
: [xMinimum - 1, xMaximum + 1];
|
|
56
|
+
const top = yMaximum > 0 ? yMaximum * Y_DOMAIN_HEADROOM : 1;
|
|
57
|
+
return { x, y: mirror ? [-top, top] : [0, top] };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* What a fitted window was fitted *to*, as one string two renders can compare.
|
|
61
|
+
*
|
|
62
|
+
* The chart puts its window back to `fullDomain` when it is handed different
|
|
63
|
+
* data, and must not when the same data is merely drawn differently — so
|
|
64
|
+
* something has to tell the two apart. It is the identities that are compared
|
|
65
|
+
* and never the extents: a spectrum switched from its profile to its sticks
|
|
66
|
+
* moves the fitted window by a hair, and refitting on a hair throws away the
|
|
67
|
+
* zoom somebody set, which is the whole reason this exists. Loading a spectrum,
|
|
68
|
+
* closing one and reflecting the chart about zero are the changes that have to
|
|
69
|
+
* be shown, and every one of them shows up here.
|
|
70
|
+
*
|
|
71
|
+
* A spectrum kept out of the automatic domain is kept out of this too, for the
|
|
72
|
+
* reason it is kept out of the extents: a predicted pattern previewed under the
|
|
73
|
+
* pointer comes and goes with the pointer, and refitting on it would throw the
|
|
74
|
+
* zoom away every time a search result is read. The identities are joined by a
|
|
75
|
+
* character no identity holds, so `a b` and `a` then `b` are two fits.
|
|
76
|
+
* @param spectra - What the chart draws.
|
|
77
|
+
* @param mirror - Whether the chart reflects its spectra about zero. Defaults
|
|
78
|
+
* to `false`.
|
|
79
|
+
* @returns A string equal to itself exactly when a fit would be made to the
|
|
80
|
+
* same thing.
|
|
81
|
+
*/
|
|
82
|
+
export function fittedTo(spectra, mirror = false) {
|
|
83
|
+
let key = mirror ? 'mirror' : 'upward';
|
|
84
|
+
for (const spectrum of spectra) {
|
|
85
|
+
if (spectrum.excludeFromDomain)
|
|
86
|
+
continue;
|
|
87
|
+
key += `\u0000${spectrum.id}`;
|
|
88
|
+
}
|
|
89
|
+
return key;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The tallest intensity among the traces a set of spectra currently draws.
|
|
93
|
+
*
|
|
94
|
+
* What "how tall is this chart" comes to, in the units the spectra are in, with
|
|
95
|
+
* the headroom `fullDomain` adds left off — so it answers a question about the
|
|
96
|
+
* measurement rather than about the plot. A preview kept out of the extents is
|
|
97
|
+
* kept out of this too, and a chart holding nothing but a preview is measured
|
|
98
|
+
* by it rather than answering zero.
|
|
99
|
+
* @param spectra - The spectra to measure, drawn or not.
|
|
100
|
+
* @returns The tallest intensity drawn, or `0` when nothing is.
|
|
101
|
+
*/
|
|
102
|
+
export function basePeakOf(spectra) {
|
|
103
|
+
const extent = traceExtent(spectra, false) ?? traceExtent(spectra, true);
|
|
104
|
+
return extent === null ? 0 : extent.yMaximum;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* How much of the axis framing a peak shows, either side of its mass.
|
|
108
|
+
*
|
|
109
|
+
* Wide enough to hold the isotopologue cluster of a singly charged ion, because
|
|
110
|
+
* a peak is read in its cluster and not alone: the M+1 says how much carbon it
|
|
111
|
+
* holds and the spacing says what charge it carries.
|
|
112
|
+
*/
|
|
113
|
+
export const MZ_FRAME_HALF_WIDTH = 2.5;
|
|
114
|
+
/**
|
|
115
|
+
* The window that frames one mass, keeping the intensity axis where it was.
|
|
116
|
+
*
|
|
117
|
+
* The vertical extent is deliberately not recomputed from what falls inside the
|
|
118
|
+
* new window: a click is a request to look somewhere else along the m/z axis,
|
|
119
|
+
* and rescaling the height at the same time makes whatever was just clicked fill
|
|
120
|
+
* the plot, so every peak looks like the base peak and the one number the eye
|
|
121
|
+
* reads off a spectrum stops meaning anything. It is only worked out from the
|
|
122
|
+
* spectra when the chart has no window of its own to keep.
|
|
123
|
+
* @param mz - The mass to frame.
|
|
124
|
+
* @param spectra - What the chart is drawing, for the height it opens on.
|
|
125
|
+
* @param domain - The window the chart is showing, `null` when it is fitting.
|
|
126
|
+
* @param options - How wide a window, and whether the chart is mirrored.
|
|
127
|
+
* @returns The window to show.
|
|
128
|
+
*/
|
|
129
|
+
export function mzFrame(mz, spectra, domain, options = {}) {
|
|
130
|
+
const { halfWidth = MZ_FRAME_HALF_WIDTH, mirror = false } = options;
|
|
131
|
+
const y = domain?.y ?? fullDomain(spectra, mirror).y;
|
|
132
|
+
return { x: [mz - halfWidth, mz + halfWidth], y };
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The extremes over every trace that is currently drawn.
|
|
136
|
+
* @param spectra - What the chart draws.
|
|
137
|
+
* @param includeExcluded - Whether to count the spectra kept out of the domain.
|
|
138
|
+
* @returns The extremes, or `null` when nothing is drawn.
|
|
139
|
+
*/
|
|
140
|
+
function traceExtent(spectra, includeExcluded) {
|
|
141
|
+
let extent = null;
|
|
142
|
+
for (const spectrum of spectra) {
|
|
143
|
+
if (!includeExcluded && spectrum.excludeFromDomain)
|
|
144
|
+
continue;
|
|
145
|
+
if (spectrum.showProfile && spectrum.profile !== null) {
|
|
146
|
+
extent = widen(extent, spectrum.profile);
|
|
147
|
+
}
|
|
148
|
+
if (spectrum.showCentroid)
|
|
149
|
+
extent = widen(extent, spectrum.centroid);
|
|
150
|
+
}
|
|
151
|
+
return extent;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Grow an extent to cover one more trace.
|
|
155
|
+
*
|
|
156
|
+
* The m/z ends are read off the first and last sample rather than searched for:
|
|
157
|
+
* `MassTrace.x` is increasing by construction, so a scan would walk several
|
|
158
|
+
* hundred thousand points of a profile to learn what index zero already says.
|
|
159
|
+
* @param extent - What has been covered so far, `null` for nothing.
|
|
160
|
+
* @param trace - The trace to cover as well.
|
|
161
|
+
* @returns The grown extent, unchanged when the trace holds no point.
|
|
162
|
+
*/
|
|
163
|
+
function widen(extent, trace) {
|
|
164
|
+
const { x, y } = trace;
|
|
165
|
+
if (x.length === 0 || y.length === 0)
|
|
166
|
+
return extent;
|
|
167
|
+
const first = x[0];
|
|
168
|
+
const last = x.at(-1);
|
|
169
|
+
const tallest = xMaxValue(y);
|
|
170
|
+
if (extent === null) {
|
|
171
|
+
return { xMinimum: first, xMaximum: last, yMaximum: tallest };
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
xMinimum: Math.min(extent.xMinimum, first),
|
|
175
|
+
xMaximum: Math.max(extent.xMaximum, last),
|
|
176
|
+
yMaximum: Math.max(extent.yMaximum, tallest),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=massDomain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"massDomain.js","sourceRoot":"","sources":["../../../src/mass/core/massDomain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The handle a host drives the viewer through.
|
|
3
|
+
*
|
|
4
|
+
* A handle rather than props, for the reason NMRium uses one: "frame this peak"
|
|
5
|
+
* and "take these spectra" are *gestures*, and a gesture expressed as a prop has
|
|
6
|
+
* to change to be obeyed — so asking for the same window twice does nothing the
|
|
7
|
+
* second time, and a host ends up inventing a nonce to make it work.
|
|
8
|
+
*/
|
|
9
|
+
import type { MassDomain, MassSpectrum } from './massSpectrum.ts';
|
|
10
|
+
/** How much room to leave either side of a mass a host asks to be framed. */
|
|
11
|
+
export interface ZoomToMzOptions {
|
|
12
|
+
/**
|
|
13
|
+
* How much of the m/z axis to show either side of the mass.
|
|
14
|
+
* @default MZ_FRAME_HALF_WIDTH
|
|
15
|
+
*/
|
|
16
|
+
halfWidth?: number;
|
|
17
|
+
}
|
|
18
|
+
/** What a host can ask of the viewer. */
|
|
19
|
+
export interface MassEditorHandle {
|
|
20
|
+
/** The spectra that are open, in the order they were loaded. */
|
|
21
|
+
getSpectra: () => MassSpectrum[];
|
|
22
|
+
/** Draw these instead of what is open, and refit to them. */
|
|
23
|
+
setSpectra: (spectra: MassSpectrum[]) => void;
|
|
24
|
+
/** Draw these as well as what is open. */
|
|
25
|
+
addSpectra: (spectra: MassSpectrum[]) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Read files the way a drop on the chart reads them, and add what they hold.
|
|
28
|
+
* Resolves once every file has been read; what could not be read is said in
|
|
29
|
+
* the status bar.
|
|
30
|
+
*/
|
|
31
|
+
openFiles: (files: readonly File[]) => Promise<void>;
|
|
32
|
+
/** Close every spectrum. */
|
|
33
|
+
clear: () => void;
|
|
34
|
+
/** Show this window. */
|
|
35
|
+
setDomain: (domain: MassDomain) => void;
|
|
36
|
+
/** Show what fits. */
|
|
37
|
+
resetDomain: () => void;
|
|
38
|
+
/**
|
|
39
|
+
* Frame a mass, keeping the intensity axis as it is.
|
|
40
|
+
*
|
|
41
|
+
* The commonest thing a host wants: a peak named in a table beside the viewer
|
|
42
|
+
* is clicked, and the chart should go there.
|
|
43
|
+
*/
|
|
44
|
+
zoomToMz: (mz: number, options?: ZoomToMzOptions) => void;
|
|
45
|
+
/** Point the panels at one spectrum, or at none. */
|
|
46
|
+
selectSpectrum: (id: string | null) => void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A click on the plot, as the viewer tells its host about it.
|
|
50
|
+
*
|
|
51
|
+
* A click is a press let go over the plot without travelling: the end of a zoom
|
|
52
|
+
* drag is never one, and a click on the axis labels is not reported.
|
|
53
|
+
*/
|
|
54
|
+
export interface MassPlotClick {
|
|
55
|
+
/** Where it landed on the m/z axis. */
|
|
56
|
+
mz: number;
|
|
57
|
+
/**
|
|
58
|
+
* The m/z of the picked peak within reach of the click, `null` when it landed
|
|
59
|
+
* on none — an empty stretch of the plot is not a peak of zero.
|
|
60
|
+
*/
|
|
61
|
+
peakMz: number | null;
|
|
62
|
+
/** Identity of the spectrum selected when it was made, `null` for none. */
|
|
63
|
+
spectrumId: string | null;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=massEditorApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"massEditorApi.d.ts","sourceRoot":"","sources":["../../../src/mass/core/massEditorApi.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,UAAU,EAAE,MAAM,YAAY,EAAE,CAAC;IACjC,6DAA6D;IAC7D,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC9C,0CAA0C;IAC1C,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC9C;;;;OAIG;IACH,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,4BAA4B;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,wBAAwB;IACxB,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,sBAAsB;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,oDAAoD;IACpD,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The handle a host drives the viewer through.
|
|
3
|
+
*
|
|
4
|
+
* A handle rather than props, for the reason NMRium uses one: "frame this peak"
|
|
5
|
+
* and "take these spectra" are *gestures*, and a gesture expressed as a prop has
|
|
6
|
+
* to change to be obeyed — so asking for the same window twice does nothing the
|
|
7
|
+
* second time, and a host ends up inventing a nonce to make it work.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=massEditorApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"massEditorApi.js","sourceRoot":"","sources":["../../../src/mass/core/massEditorApi.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How every number about a mass spectrum is written, wherever it is written.
|
|
3
|
+
*
|
|
4
|
+
* An m/z is written to the decimals the spectra on screen resolve — four for a
|
|
5
|
+
* high-resolution measurement, none for a nominal-mass table, as
|
|
6
|
+
* `mzDecimalsOf` settles it for all of them at once — and an intensity follows
|
|
7
|
+
* it. Settled once here, so a table, an axis label and a tooltip never disagree
|
|
8
|
+
* about how wide one number is.
|
|
9
|
+
*/
|
|
10
|
+
import type { MassResolution } from './massResolution.ts';
|
|
11
|
+
import type { MassFormat } from './massSpectrum.ts';
|
|
12
|
+
/** Decimals an intensity is written with, on the 0–100 scale. */
|
|
13
|
+
export declare const INTENSITY_DECIMALS = 2;
|
|
14
|
+
/**
|
|
15
|
+
* An m/z as every table, axis label and tooltip writes it.
|
|
16
|
+
*
|
|
17
|
+
* Always a fixed number of decimals, never `toPrecision` and never the shortest
|
|
18
|
+
* form that round-trips: a column of masses is read by running an eye down it,
|
|
19
|
+
* and `163` above `162.9871` above `164.1` is unreadable in a way that
|
|
20
|
+
* `163.0000` above `162.9871` above `164.1000` is not.
|
|
21
|
+
* @param mz - The mass-to-charge ratio.
|
|
22
|
+
* @param decimals - How many decimals the spectra on screen resolve, as
|
|
23
|
+
* `mzDecimalsOf` decides. Defaults to the high-resolution four.
|
|
24
|
+
* @returns The number as it is written.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatMz(mz: number, decimals?: number): string;
|
|
27
|
+
/**
|
|
28
|
+
* An intensity as every table and tooltip writes it, on the 0–100 scale.
|
|
29
|
+
*
|
|
30
|
+
* It follows the m/z rather than being decided on its own: a nominal-mass peak
|
|
31
|
+
* table quotes relative intensities as whole percentages too, and one column of
|
|
32
|
+
* the same table rounded and the other not looks like a bug. Past the chart's
|
|
33
|
+
* own `SCIENTIFIC_ABOVE`, and under a hundredth — where two decimals would write
|
|
34
|
+
* a zero that is not one — the intensity is written as a power of ten, which is
|
|
35
|
+
* how the axis beside it spells such numbers too.
|
|
36
|
+
* @param intensity - The intensity, normalised to a base peak of 100, or the
|
|
37
|
+
* counts themselves for a spectrum that kept them.
|
|
38
|
+
* @param mzDecimals - How many decimals the masses beside it are written with.
|
|
39
|
+
* Defaults to the high-resolution four.
|
|
40
|
+
* @returns The number as it is written.
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatIntensity(intensity: number, mzDecimals?: number): string;
|
|
43
|
+
/**
|
|
44
|
+
* A range of masses, low end first, as the list and the table write it.
|
|
45
|
+
* @param masses - The m/z of every peak, ascending.
|
|
46
|
+
* @param decimals - How many decimals to write them with.
|
|
47
|
+
* @returns `43.8490 – 223.6762`, or `''` for a spectrum holding no peak.
|
|
48
|
+
*/
|
|
49
|
+
export declare function formatMzRange(masses: Float64Array, decimals: number): string;
|
|
50
|
+
/**
|
|
51
|
+
* A format as a chemist writes it rather than as the code spells it.
|
|
52
|
+
* @param format - The format the spectrum was read from.
|
|
53
|
+
* @returns Its name; a format this package does not read, as it was given.
|
|
54
|
+
*/
|
|
55
|
+
export declare function massFormatLabel(format: MassFormat): string;
|
|
56
|
+
/**
|
|
57
|
+
* What a resolution verdict is called, in the words a status line uses.
|
|
58
|
+
* @param resolution - The verdict.
|
|
59
|
+
* @returns `high resolution`, `low resolution` or `nominal mass`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function resolutionLabel(resolution: MassResolution): string;
|
|
62
|
+
/**
|
|
63
|
+
* A resolving power as it is quoted: approximately, and to two figures.
|
|
64
|
+
*
|
|
65
|
+
* Two significant figures because that is all a median over a score of peaks
|
|
66
|
+
* can claim, and because `R ≈ 47,000` is how an instrument's resolution is
|
|
67
|
+
* quoted on its data sheet.
|
|
68
|
+
* @param resolvingPower - The resolving power `m / Δm`.
|
|
69
|
+
* @returns `R ≈ 47,000`.
|
|
70
|
+
*/
|
|
71
|
+
export declare function resolvingPowerLabel(resolvingPower: number): string;
|
|
72
|
+
/**
|
|
73
|
+
* How a verdict was reached, said as a reader would want it said.
|
|
74
|
+
* @param resolution - The verdict.
|
|
75
|
+
* @returns The sentence fragment, e.g. `measured on the peak widths`.
|
|
76
|
+
*/
|
|
77
|
+
export declare function resolutionBasisLabel(resolution: MassResolution): string;
|
|
78
|
+
//# sourceMappingURL=massFormat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"massFormat.d.ts","sourceRoot":"","sources":["../../../src/mass/core/massFormat.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,SAAmB,GAAG,MAAM,CAExE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,UAAU,SAAmB,GAC5B,MAAM,CAQR;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAElE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAEvE"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How every number about a mass spectrum is written, wherever it is written.
|
|
3
|
+
*
|
|
4
|
+
* An m/z is written to the decimals the spectra on screen resolve — four for a
|
|
5
|
+
* high-resolution measurement, none for a nominal-mass table, as
|
|
6
|
+
* `mzDecimalsOf` settles it for all of them at once — and an intensity follows
|
|
7
|
+
* it. Settled once here, so a table, an axis label and a tooltip never disagree
|
|
8
|
+
* about how wide one number is.
|
|
9
|
+
*/
|
|
10
|
+
import { SCIENTIFIC_ABOVE, formatScientific, } from "../../chart/core/axisLabels.js";
|
|
11
|
+
import { formatInteger } from "../../format/core/numbers.js";
|
|
12
|
+
import { MZ_DECIMALS } from "./massResolution.js";
|
|
13
|
+
/** Decimals an intensity is written with, on the 0–100 scale. */
|
|
14
|
+
export const INTENSITY_DECIMALS = 2;
|
|
15
|
+
/**
|
|
16
|
+
* An m/z as every table, axis label and tooltip writes it.
|
|
17
|
+
*
|
|
18
|
+
* Always a fixed number of decimals, never `toPrecision` and never the shortest
|
|
19
|
+
* form that round-trips: a column of masses is read by running an eye down it,
|
|
20
|
+
* and `163` above `162.9871` above `164.1` is unreadable in a way that
|
|
21
|
+
* `163.0000` above `162.9871` above `164.1000` is not.
|
|
22
|
+
* @param mz - The mass-to-charge ratio.
|
|
23
|
+
* @param decimals - How many decimals the spectra on screen resolve, as
|
|
24
|
+
* `mzDecimalsOf` decides. Defaults to the high-resolution four.
|
|
25
|
+
* @returns The number as it is written.
|
|
26
|
+
*/
|
|
27
|
+
export function formatMz(mz, decimals = MZ_DECIMALS.high) {
|
|
28
|
+
return mz.toFixed(decimals);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* An intensity as every table and tooltip writes it, on the 0–100 scale.
|
|
32
|
+
*
|
|
33
|
+
* It follows the m/z rather than being decided on its own: a nominal-mass peak
|
|
34
|
+
* table quotes relative intensities as whole percentages too, and one column of
|
|
35
|
+
* the same table rounded and the other not looks like a bug. Past the chart's
|
|
36
|
+
* own `SCIENTIFIC_ABOVE`, and under a hundredth — where two decimals would write
|
|
37
|
+
* a zero that is not one — the intensity is written as a power of ten, which is
|
|
38
|
+
* how the axis beside it spells such numbers too.
|
|
39
|
+
* @param intensity - The intensity, normalised to a base peak of 100, or the
|
|
40
|
+
* counts themselves for a spectrum that kept them.
|
|
41
|
+
* @param mzDecimals - How many decimals the masses beside it are written with.
|
|
42
|
+
* Defaults to the high-resolution four.
|
|
43
|
+
* @returns The number as it is written.
|
|
44
|
+
*/
|
|
45
|
+
export function formatIntensity(intensity, mzDecimals = MZ_DECIMALS.high) {
|
|
46
|
+
const decimals = mzDecimals === 0 ? 0 : INTENSITY_DECIMALS;
|
|
47
|
+
if (intensity === 0)
|
|
48
|
+
return (0).toFixed(decimals);
|
|
49
|
+
const size = Math.abs(intensity);
|
|
50
|
+
if (size >= SCIENTIFIC_ABOVE || size < PLAIN_BELOW) {
|
|
51
|
+
return formatScientific(intensity, INTENSITY_DECIMALS);
|
|
52
|
+
}
|
|
53
|
+
return intensity.toFixed(decimals);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A range of masses, low end first, as the list and the table write it.
|
|
57
|
+
* @param masses - The m/z of every peak, ascending.
|
|
58
|
+
* @param decimals - How many decimals to write them with.
|
|
59
|
+
* @returns `43.8490 – 223.6762`, or `''` for a spectrum holding no peak.
|
|
60
|
+
*/
|
|
61
|
+
export function formatMzRange(masses, decimals) {
|
|
62
|
+
if (masses.length === 0)
|
|
63
|
+
return '';
|
|
64
|
+
const first = masses[0];
|
|
65
|
+
const last = masses.at(-1);
|
|
66
|
+
return `${formatMz(first, decimals)} – ${formatMz(last, decimals)}`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A format as a chemist writes it rather than as the code spells it.
|
|
70
|
+
* @param format - The format the spectrum was read from.
|
|
71
|
+
* @returns Its name; a format this package does not read, as it was given.
|
|
72
|
+
*/
|
|
73
|
+
export function massFormatLabel(format) {
|
|
74
|
+
return FORMAT_LABELS.get(format) ?? format;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* What a resolution verdict is called, in the words a status line uses.
|
|
78
|
+
* @param resolution - The verdict.
|
|
79
|
+
* @returns `high resolution`, `low resolution` or `nominal mass`.
|
|
80
|
+
*/
|
|
81
|
+
export function resolutionLabel(resolution) {
|
|
82
|
+
return RESOLUTION_LABELS[resolution.kind];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* A resolving power as it is quoted: approximately, and to two figures.
|
|
86
|
+
*
|
|
87
|
+
* Two significant figures because that is all a median over a score of peaks
|
|
88
|
+
* can claim, and because `R ≈ 47,000` is how an instrument's resolution is
|
|
89
|
+
* quoted on its data sheet.
|
|
90
|
+
* @param resolvingPower - The resolving power `m / Δm`.
|
|
91
|
+
* @returns `R ≈ 47,000`.
|
|
92
|
+
*/
|
|
93
|
+
export function resolvingPowerLabel(resolvingPower) {
|
|
94
|
+
return `R ≈ ${formatInteger(Number(resolvingPower.toPrecision(2)))}`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* How a verdict was reached, said as a reader would want it said.
|
|
98
|
+
* @param resolution - The verdict.
|
|
99
|
+
* @returns The sentence fragment, e.g. `measured on the peak widths`.
|
|
100
|
+
*/
|
|
101
|
+
export function resolutionBasisLabel(resolution) {
|
|
102
|
+
return BASIS_LABELS[resolution.basis];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The intensity below which two decimals have nothing left to say it in.
|
|
106
|
+
*
|
|
107
|
+
* A hundredth, which is exactly where `INTENSITY_DECIMALS` runs out: `0.01` is
|
|
108
|
+
* the smallest number two decimals can write, and everything under it rounds to
|
|
109
|
+
* a zero that is not one.
|
|
110
|
+
*/
|
|
111
|
+
const PLAIN_BELOW = 1e-2;
|
|
112
|
+
/**
|
|
113
|
+
* How each format is spelled where it is shown: `mzML` and `netCDF` are the
|
|
114
|
+
* names of the standards, capitals and all, and a table that showed `mzml`
|
|
115
|
+
* would read as a typo in a panel whose whole purpose is to quote the file
|
|
116
|
+
* faithfully. Every format a reader of the family hands spectra over in, the
|
|
117
|
+
* vendor ones included, since a host reading them hands the format over too.
|
|
118
|
+
*/
|
|
119
|
+
const FORMAT_LABELS = new Map([
|
|
120
|
+
['jcamp', 'JCAMP-DX'],
|
|
121
|
+
['text', 'Text, two columns'],
|
|
122
|
+
['calculated', 'Calculated'],
|
|
123
|
+
['mzml', 'mzML'],
|
|
124
|
+
['mzxml', 'mzXML'],
|
|
125
|
+
['mzdata', 'mzData'],
|
|
126
|
+
['imzml', 'imzML'],
|
|
127
|
+
['mzmlb', 'mzMLb'],
|
|
128
|
+
['netcdf', 'netCDF'],
|
|
129
|
+
['mgf', 'MGF'],
|
|
130
|
+
['msp', 'MSP library'],
|
|
131
|
+
['msn', 'MS1/MS2 text'],
|
|
132
|
+
['dta', 'Sequest DTA'],
|
|
133
|
+
['pkl', 'Micromass peak list'],
|
|
134
|
+
['asm', 'Allotrope ASM'],
|
|
135
|
+
['thermo', 'Thermo RAW'],
|
|
136
|
+
['uep', 'Waters UNIFI package'],
|
|
137
|
+
['watersraw', 'Waters RAW'],
|
|
138
|
+
['wiff', 'SCIEX WIFF'],
|
|
139
|
+
['wiff2', 'SCIEX WIFF2'],
|
|
140
|
+
['wiffscan', 'SCIEX WIFF scan file'],
|
|
141
|
+
['shimadzu', 'Shimadzu'],
|
|
142
|
+
['chemstationms', 'Agilent ChemStation MS'],
|
|
143
|
+
['chemstationch', 'Agilent ChemStation trace'],
|
|
144
|
+
['chemstationuv', 'Agilent ChemStation UV'],
|
|
145
|
+
['agilentdad', 'Agilent MassHunter device'],
|
|
146
|
+
['masshunter', 'Agilent MassHunter'],
|
|
147
|
+
['brukerflex', 'Bruker flex'],
|
|
148
|
+
['brukertsf', 'Bruker timsTOF (TSF)'],
|
|
149
|
+
['brukertdf', 'Bruker timsTOF (TDF)'],
|
|
150
|
+
['penx', 'PerkinElmer TotalChrom'],
|
|
151
|
+
['varian', 'Varian Saturn'],
|
|
152
|
+
['spc', 'Galactic SPC'],
|
|
153
|
+
['wdf', 'Renishaw WDF'],
|
|
154
|
+
['targetraster', 'AP-MALDI target raster'],
|
|
155
|
+
]);
|
|
156
|
+
/** How each kind of resolution is named. */
|
|
157
|
+
const RESOLUTION_LABELS = {
|
|
158
|
+
high: 'high resolution',
|
|
159
|
+
low: 'low resolution',
|
|
160
|
+
nominal: 'nominal mass',
|
|
161
|
+
};
|
|
162
|
+
/** How each basis of a verdict is said. */
|
|
163
|
+
const BASIS_LABELS = {
|
|
164
|
+
peakWidth: 'measured on the peak widths',
|
|
165
|
+
instrument: 'stated by the file',
|
|
166
|
+
decimals: 'read off the decimals written',
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=massFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"massFormat.js","sourceRoot":"","sources":["../../../src/mass/core/massFormat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the file says about how the spectrum was acquired, made displayable.
|
|
3
|
+
*
|
|
4
|
+
* A JCAMP written by a Thermo instrument carries the answer to every question a
|
|
5
|
+
* chemist asks of a spectrum — which analyser, which polarity, which collision
|
|
6
|
+
* energy — but carries it in whichever of two record bags the exporting
|
|
7
|
+
* software felt like using, and leaves half of them blank. A JCAMP of the older
|
|
8
|
+
* MS dialect states the same facts under standard records of its own,
|
|
9
|
+
* `##.SPECTROMETER TYPE=` and `##.IONIZATION MODE=`. So each field names the
|
|
10
|
+
* records it may live in, in the order they are worth trying, and anything
|
|
11
|
+
* still blank falls back to the instrument's own scan description.
|
|
12
|
+
*
|
|
13
|
+
* A field that is absent or empty is left out entirely rather than shown as a
|
|
14
|
+
* dash, which is what keeps the table short enough to read at a glance: every
|
|
15
|
+
* line in it is a fact the file actually stated.
|
|
16
|
+
*/
|
|
17
|
+
import type { MassMeta } from './massSpectrum.ts';
|
|
18
|
+
/**
|
|
19
|
+
* The two record bags a JCAMP reader offers.
|
|
20
|
+
*
|
|
21
|
+
* `jcampconverter` splits the records in two — `##ORIGIN=` and the other
|
|
22
|
+
* standard labels into `info`, keyed without their spaces, and the
|
|
23
|
+
* `$`-prefixed user-defined ones into `meta` with the `$` stripped — and a
|
|
24
|
+
* record belongs to one bag or the other, never both.
|
|
25
|
+
*/
|
|
26
|
+
export interface MassMetaSource {
|
|
27
|
+
/**
|
|
28
|
+
* The standard records, keyed without their `##` and without spaces.
|
|
29
|
+
* @default undefined
|
|
30
|
+
*/
|
|
31
|
+
info?: Record<string, unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* The `$`-prefixed user-defined records, keyed without their `##$`.
|
|
34
|
+
* @default undefined
|
|
35
|
+
*/
|
|
36
|
+
meta?: Record<string, unknown>;
|
|
37
|
+
/**
|
|
38
|
+
* The title, when the reader kept it apart from the records.
|
|
39
|
+
* @default undefined
|
|
40
|
+
*/
|
|
41
|
+
title?: string;
|
|
42
|
+
}
|
|
43
|
+
/** One record a row of the table can be read from, and written back to. */
|
|
44
|
+
export interface MassMetaRecord {
|
|
45
|
+
/** The record's label as the reader keys it, without its `##` or its `$`. */
|
|
46
|
+
key: string;
|
|
47
|
+
/** Whether it is a standard record rather than a `$`-prefixed one. */
|
|
48
|
+
info: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Read the acquisition metadata a file carries.
|
|
52
|
+
*
|
|
53
|
+
* Returns `null` rather than an empty table when the file said nothing at all,
|
|
54
|
+
* so the panel can leave the section out instead of drawing a heading over
|
|
55
|
+
* nothing — the normal outcome for a pasted peak list.
|
|
56
|
+
* @param source - The record bags the reader recovered.
|
|
57
|
+
* @returns The metadata, or `null` when the file carries none.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildMassMeta(source: MassMetaSource): MassMeta | null;
|
|
60
|
+
/**
|
|
61
|
+
* The record a row of the table is written back to.
|
|
62
|
+
*
|
|
63
|
+
* The inverse of the table below, and it lives beside it for that reason: a
|
|
64
|
+
* writer holding a second list of record names is a writer whose `MSLEVEL`
|
|
65
|
+
* becomes `MS_LEVEL` the day a spelling is added here, and the round trip then
|
|
66
|
+
* loses the field without anything going wrong loudly. Only the first of each
|
|
67
|
+
* row's records is offered — the others exist to read what other exporters
|
|
68
|
+
* wrote, and writing our own file is not the place to imitate them.
|
|
69
|
+
* @param label - The row's label, as the table displays it.
|
|
70
|
+
* @returns The record, or `null` when the label is not one of the table's rows.
|
|
71
|
+
*/
|
|
72
|
+
export declare function metaRecord(label: string): MassMetaRecord | null;
|
|
73
|
+
/**
|
|
74
|
+
* A record's value as a trimmed string, whatever dynamic typing made of it.
|
|
75
|
+
*
|
|
76
|
+
* `jcampconverter` reads `##$SCANS=1` as the number `1` and a record written
|
|
77
|
+
* twice as an array of both values, so a row that is only ever shown has to
|
|
78
|
+
* accept all three shapes. A repeated record shows its first occurrence, which
|
|
79
|
+
* is the one the exporter wrote for the acquisition rather than for a later
|
|
80
|
+
* reprocessing of it.
|
|
81
|
+
* @param value - The record, as dynamic typing left it.
|
|
82
|
+
* @returns The value as text, `''` when there is none.
|
|
83
|
+
*/
|
|
84
|
+
export declare function recordText(value: unknown): string;
|
|
85
|
+
//# sourceMappingURL=massMeta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"massMeta.d.ts","sourceRoot":"","sources":["../../../src/mass/core/massMeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,mBAAmB,CAAC;AAGjE;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,IAAI,CAkBrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAK/D;AAwHD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOjD"}
|