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,100 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { MF } from 'react-mf';
|
|
4
|
+
import { Toolbar } from 'react-science/ui';
|
|
5
|
+
import { labelStyle, panelBodyStyle, panelEmptyStyle, panelStyle, panelToolbarStyle, } from "../../panel/core/panelStyles.js";
|
|
6
|
+
import { spectrumMetaRows, spectrumResolutionRows, } from "../core/massSummary.js";
|
|
7
|
+
import { useMassEditorState } from "./massStateContext.js";
|
|
8
|
+
/**
|
|
9
|
+
* The acquisition panel of the viewer, about whichever spectrum is selected.
|
|
10
|
+
* @returns The panel.
|
|
11
|
+
*/
|
|
12
|
+
export function MetadataPanel() {
|
|
13
|
+
const { selectedSpectrum, mzDecimals } = useMassEditorState();
|
|
14
|
+
return _jsx(MassMetadata, { spectrum: selectedSpectrum, mzDecimals: mzDecimals });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* How a spectrum was acquired, as the file stated it, and what the viewer
|
|
18
|
+
* found out about it — for any viewer, whatever state it keeps the spectrum in.
|
|
19
|
+
*
|
|
20
|
+
* Every row the file wrote is a fact it actually wrote: the reader leaves out
|
|
21
|
+
* whatever was blank rather than showing it as a dash, so a short table means a
|
|
22
|
+
* terse file and not a bug. The order is the reader's — source, instrument,
|
|
23
|
+
* analyser, ionization, polarity, energy, and on down to who ran it — because
|
|
24
|
+
* that is the order a method is read in. A file that wrote nothing gets the
|
|
25
|
+
* facts true of every spectrum instead, a pasted one included: which file and
|
|
26
|
+
* format it came from, how many peaks it holds and between which masses.
|
|
27
|
+
*
|
|
28
|
+
* Under either comes whether it is a high-resolution measurement, with how that
|
|
29
|
+
* was decided, since a verdict read off the decimals of a peak table is a
|
|
30
|
+
* weaker claim than one measured on the widths of its peaks.
|
|
31
|
+
* @param props - Component props.
|
|
32
|
+
* @returns The panel.
|
|
33
|
+
*/
|
|
34
|
+
export function MassMetadata(props) {
|
|
35
|
+
const { spectrum: selectedSpectrum, mzDecimals } = props;
|
|
36
|
+
const [showConditions, setShowConditions] = useState(false);
|
|
37
|
+
const meta = selectedSpectrum?.meta ?? null;
|
|
38
|
+
const conditions = meta?.conditions ?? null;
|
|
39
|
+
const title = meta?.title ?? null;
|
|
40
|
+
const molecularFormula = meta?.molecularFormula ?? null;
|
|
41
|
+
// The whole viewer re-renders on every drag of the chart, and the rows only
|
|
42
|
+
// change when the selected spectrum does.
|
|
43
|
+
const rows = useMemo(() => selectedSpectrum === null
|
|
44
|
+
? []
|
|
45
|
+
: [
|
|
46
|
+
...spectrumMetaRows(selectedSpectrum, mzDecimals),
|
|
47
|
+
...spectrumResolutionRows(selectedSpectrum),
|
|
48
|
+
], [selectedSpectrum, mzDecimals]);
|
|
49
|
+
return (_jsxs("div", { style: panelStyle, children: [_jsx("div", { style: panelToolbarStyle, children: _jsx(Toolbar, { "aria-label": "Acquisition", children: _jsx(Toolbar.Item, { icon: "align-left", active: showConditions, disabled: conditions === null, tooltip: conditions === null
|
|
50
|
+
? 'This file carried no scan description of its own'
|
|
51
|
+
: "Show the instrument's own scan description, as it was written", "aria-label": "Show the scan description", onClick: () => setShowConditions(!showConditions) }) }) }), _jsx("div", { style: panelBodyStyle, children: selectedSpectrum === null ? (_jsx("p", { style: panelEmptyStyle, children: "No spectrum is selected. Click one in the Spectra panel and what its file said about the acquisition appears here." })) : (_jsxs(_Fragment, { children: [title === null ? null : _jsx("div", { style: titleStyle, children: title }), meta === null ? (_jsx("p", { style: panelEmptyStyle, children: "This file carried no acquisition metadata, so this is what the viewer knows about it." })) : null, _jsx("table", { style: tableStyle, children: _jsxs("tbody", { children: [molecularFormula === null ? null : (_jsxs("tr", { children: [_jsx("th", { scope: "row", style: rowLabelStyle, children: "Formula" }), _jsx("td", { style: rowValueStyle, children: _jsx(MF, { mf: molecularFormula }) })] })), rows.map((row) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", style: rowLabelStyle, children: row.label }), _jsx("td", { style: rowValueStyle, children: row.value })] }, row.label)))] }) }), conditions === null || !showConditions ? null : (_jsxs("div", { children: [_jsx("div", { style: labelStyle, children: "Scan description" }), _jsx("pre", { style: conditionsStyle, children: conditions })] }))] })) })] }));
|
|
52
|
+
}
|
|
53
|
+
/** What the file calls the spectrum, which is rarely what the list calls it. */
|
|
54
|
+
const titleStyle = {
|
|
55
|
+
fontSize: 12,
|
|
56
|
+
fontWeight: 600,
|
|
57
|
+
lineHeight: 1.3,
|
|
58
|
+
wordBreak: 'break-word',
|
|
59
|
+
};
|
|
60
|
+
const tableStyle = {
|
|
61
|
+
width: '100%',
|
|
62
|
+
fontSize: 12,
|
|
63
|
+
borderCollapse: 'collapse',
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* The label column is as narrow as it can be and the value takes the rest: the
|
|
67
|
+
* labels are short and known, and it is the values a file surprises you with.
|
|
68
|
+
*/
|
|
69
|
+
const rowLabelStyle = {
|
|
70
|
+
width: '1%',
|
|
71
|
+
padding: '2px 8px 2px 0',
|
|
72
|
+
textAlign: 'left',
|
|
73
|
+
fontWeight: 600,
|
|
74
|
+
whiteSpace: 'nowrap',
|
|
75
|
+
verticalAlign: 'top',
|
|
76
|
+
opacity: 0.7,
|
|
77
|
+
};
|
|
78
|
+
const rowValueStyle = {
|
|
79
|
+
padding: '2px 0',
|
|
80
|
+
verticalAlign: 'top',
|
|
81
|
+
wordBreak: 'break-word',
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Kept verbatim, wrapping rather than scrolling sideways: a Thermo scan filter
|
|
85
|
+
* is one long line that says more about the acquisition than the structured
|
|
86
|
+
* records do, and half of it off the edge of a panel is half a method.
|
|
87
|
+
*/
|
|
88
|
+
const conditionsStyle = {
|
|
89
|
+
margin: 0,
|
|
90
|
+
padding: 6,
|
|
91
|
+
borderRadius: 3,
|
|
92
|
+
background: 'rgba(17, 20, 24, 0.06)',
|
|
93
|
+
fontFamily: 'monospace',
|
|
94
|
+
fontSize: 11,
|
|
95
|
+
lineHeight: 1.35,
|
|
96
|
+
whiteSpace: 'pre-wrap',
|
|
97
|
+
wordBreak: 'break-word',
|
|
98
|
+
userSelect: 'all',
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=MetadataPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetadataPanel.js","sourceRoot":"","sources":["../../../src/mass/ui/MetadataPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { MzDecimalsSetting } from '../core/mzDecimalsSetting.ts';
|
|
3
|
+
export interface MzDecimalsMenuProps {
|
|
4
|
+
/** What is chosen, `'auto'` while nothing is. */
|
|
5
|
+
setting: MzDecimalsSetting;
|
|
6
|
+
/**
|
|
7
|
+
* How many decimals `'auto'` comes to for the spectra in view, which the
|
|
8
|
+
* entry for it says, so choosing nothing is not a choice made blind.
|
|
9
|
+
*/
|
|
10
|
+
autoDecimals: number;
|
|
11
|
+
/** Called with what was picked. */
|
|
12
|
+
onChange: (setting: MzDecimalsSetting) => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* How many decimals the masses are written with, picked from a panel toolbar.
|
|
16
|
+
*
|
|
17
|
+
* The first entry leaves it to the spectra — high-resolution masses or nominal
|
|
18
|
+
* ones, as each spectrum's resolution says — and the rest fix a number for
|
|
19
|
+
* every mass on screen at once: chart, crosshair, tables. A list rather than a
|
|
20
|
+
* stepper, because the useful answers are few and a reader picking one wants
|
|
21
|
+
* to see them side by side; the button is lit while a number overrides the
|
|
22
|
+
* spectra, so a chart written to fewer decimals than it resolves never looks
|
|
23
|
+
* like one that resolves no more.
|
|
24
|
+
* @param props - Component props.
|
|
25
|
+
* @returns The toolbar item and its menu.
|
|
26
|
+
*/
|
|
27
|
+
export declare function MzDecimalsMenu(props: MzDecimalsMenuProps): ReactElement;
|
|
28
|
+
//# sourceMappingURL=MzDecimalsMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MzDecimalsMenu.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/MzDecimalsMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,OAAO,EAAE,iBAAiB,CAAC;IAC3B;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAChD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CAoCvE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Menu, MenuItem } from '@blueprintjs/core';
|
|
3
|
+
import { Toolbar } from 'react-science/ui';
|
|
4
|
+
import { MAXIMUM_MZ_DECIMALS } from "../core/mzDecimalsSetting.js";
|
|
5
|
+
/**
|
|
6
|
+
* How many decimals the masses are written with, picked from a panel toolbar.
|
|
7
|
+
*
|
|
8
|
+
* The first entry leaves it to the spectra — high-resolution masses or nominal
|
|
9
|
+
* ones, as each spectrum's resolution says — and the rest fix a number for
|
|
10
|
+
* every mass on screen at once: chart, crosshair, tables. A list rather than a
|
|
11
|
+
* stepper, because the useful answers are few and a reader picking one wants
|
|
12
|
+
* to see them side by side; the button is lit while a number overrides the
|
|
13
|
+
* spectra, so a chart written to fewer decimals than it resolves never looks
|
|
14
|
+
* like one that resolves no more.
|
|
15
|
+
* @param props - Component props.
|
|
16
|
+
* @returns The toolbar item and its menu.
|
|
17
|
+
*/
|
|
18
|
+
export function MzDecimalsMenu(props) {
|
|
19
|
+
const { setting, autoDecimals, onChange } = props;
|
|
20
|
+
return (_jsx(Toolbar.PopoverItem, { itemProps: {
|
|
21
|
+
icon: 'floating-point',
|
|
22
|
+
tooltip: LABEL,
|
|
23
|
+
'aria-label': LABEL,
|
|
24
|
+
active: setting !== 'auto',
|
|
25
|
+
}, content: _jsxs(Menu, { "aria-label": LABEL, children: [_jsx(MenuItem, { roleStructure: "listoption", selected: setting === 'auto', text: `Automatic — by resolution (now ${decimalsText(autoDecimals)})`, onClick: () => onChange('auto') }), CHOICES.map((decimals) => (_jsx(MenuItem, { roleStructure: "listoption", selected: setting === decimals, text: decimals === 0
|
|
26
|
+
? 'Nominal mass (0 decimals)'
|
|
27
|
+
: decimalsText(decimals), onClick: () => onChange(decimals) }, decimals)))] }) }));
|
|
28
|
+
}
|
|
29
|
+
const LABEL = 'Decimals of the masses';
|
|
30
|
+
/** Every number that can be chosen, from the nominal mass up. */
|
|
31
|
+
const CHOICES = Array.from({ length: MAXIMUM_MZ_DECIMALS + 1 }, (_, decimals) => decimals);
|
|
32
|
+
/**
|
|
33
|
+
* A number of decimals, as the menu says it.
|
|
34
|
+
* @param decimals - How many.
|
|
35
|
+
* @returns `1 decimal`, or `n decimals`.
|
|
36
|
+
*/
|
|
37
|
+
function decimalsText(decimals) {
|
|
38
|
+
return decimals === 1 ? '1 decimal' : `${decimals} decimals`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=MzDecimalsMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MzDecimalsMenu.js","sourceRoot":"","sources":["../../../src/mass/ui/MzDecimalsMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAcnE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAElD,OAAO,CACL,KAAC,OAAO,CAAC,WAAW,IAClB,SAAS,EAAE;YACT,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,OAAO,KAAK,MAAM;SAC3B,EACD,OAAO,EACL,MAAC,IAAI,kBAAa,KAAK,aACrB,KAAC,QAAQ,IACP,aAAa,EAAC,YAAY,EAC1B,QAAQ,EAAE,OAAO,KAAK,MAAM,EAC5B,IAAI,EAAE,kCAAkC,YAAY,CAAC,YAAY,CAAC,GAAG,EACrE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAC/B,EACD,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CACzB,KAAC,QAAQ,IAEP,aAAa,EAAC,YAAY,EAC1B,QAAQ,EAAE,OAAO,KAAK,QAAQ,EAC9B,IAAI,EACF,QAAQ,KAAK,CAAC;wBACZ,CAAC,CAAC,2BAA2B;wBAC7B,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAE5B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAR5B,QAAQ,CASb,CACH,CAAC,IACG,GAET,CACH,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAG,wBAAwB,CAAC;AAEvC,iEAAiE;AACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,EAAE,EACnC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAC1B,CAAC;AAEF;;;;GAIG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,QAAQ,WAAW,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { PlotRect } from '../../chart/core/chartGeometry.ts';
|
|
3
|
+
import type { ChartScale } from '../../chart/core/chartScale.ts';
|
|
4
|
+
import type { HoveredPeak } from '../core/labelStackBox.ts';
|
|
5
|
+
import type { MassSpectrum } from '../core/massSpectrum.ts';
|
|
6
|
+
export interface PeakLabelsProps {
|
|
7
|
+
/**
|
|
8
|
+
* The spectrum whose peaks are labelled. Hand it the same one that was drawn:
|
|
9
|
+
* a mirrored half is drawn normalised, and labels computed from the spectrum
|
|
10
|
+
* as measured would float above sticks of another height.
|
|
11
|
+
*/
|
|
12
|
+
spectrum: MassSpectrum;
|
|
13
|
+
/** Where the plot sits, which is what a stack may not be pushed out of. */
|
|
14
|
+
plot: PlotRect;
|
|
15
|
+
/** The m/z axis as it is currently zoomed. */
|
|
16
|
+
xScale: ChartScale;
|
|
17
|
+
/**
|
|
18
|
+
* The intensity axis as it is currently zoomed. Reflect it and the labels
|
|
19
|
+
* follow the sticks downwards — together with `below`, which turns the stacks
|
|
20
|
+
* over.
|
|
21
|
+
*/
|
|
22
|
+
yScale: ChartScale;
|
|
23
|
+
/**
|
|
24
|
+
* How many peaks are labelled at most, the most intense first.
|
|
25
|
+
* @default DEFAULT_LABEL_LIMIT
|
|
26
|
+
*/
|
|
27
|
+
limit?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Whether a peak whose charge was established says so.
|
|
30
|
+
* @default false
|
|
31
|
+
*/
|
|
32
|
+
showCharges?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* How many decimals the masses on screen are written with.
|
|
35
|
+
* @default 4
|
|
36
|
+
*/
|
|
37
|
+
mzDecimals?: number;
|
|
38
|
+
/**
|
|
39
|
+
* What explains each peak, keyed as `peakKey` keys it — the name a host
|
|
40
|
+
* writes on top of a stack.
|
|
41
|
+
* @default undefined
|
|
42
|
+
*/
|
|
43
|
+
annotationLabels?: ReadonlyMap<string, string>;
|
|
44
|
+
/**
|
|
45
|
+
* Whether the stacks hang under the sticks rather than standing over them,
|
|
46
|
+
* which is what the lower half of a mirrored pair wants.
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
below?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* The ink the stacks are written in — worth passing the spectrum's own colour
|
|
52
|
+
* on a chart holding several, where an unattributed m/z belongs to any of them.
|
|
53
|
+
* @default the theme's label colour
|
|
54
|
+
*/
|
|
55
|
+
color?: string;
|
|
56
|
+
/**
|
|
57
|
+
* What one unit of the measured intensity is written as.
|
|
58
|
+
* @default 1
|
|
59
|
+
*/
|
|
60
|
+
intensityScale?: number;
|
|
61
|
+
/**
|
|
62
|
+
* Called with the peak whose stack the pointer is resting on, `null` when it
|
|
63
|
+
* leaves. Without it the stacks answer no pointer at all.
|
|
64
|
+
* @default undefined
|
|
65
|
+
*/
|
|
66
|
+
onHover?: (peak: HoveredPeak | null) => void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The tops of the best peaks of one spectrum, and what each of them reads.
|
|
70
|
+
*
|
|
71
|
+
* Two things drawn together because they are one claim: a short mark on the tip
|
|
72
|
+
* of the picked peak, and the numbers written over it. The mark is the half that
|
|
73
|
+
* matters when the continuous trace is the one on screen — the centroid is then
|
|
74
|
+
* not drawn at all, and a stack of numbers floating over a peak shape says which
|
|
75
|
+
* region was picked but never which point of it, which is the number the stack
|
|
76
|
+
* is quoting. With the mark on the tip the two agree by construction.
|
|
77
|
+
*
|
|
78
|
+
* Which peaks are labelled is `planPeakLabels`'s to decide, and it follows the
|
|
79
|
+
* zoom: a survey of the whole spectrum labels its base peak and a few others,
|
|
80
|
+
* and the same spectrum zoomed onto one cluster labels every line in it. Every
|
|
81
|
+
* line is haloed and none of them is boxed: a number over a peak is written
|
|
82
|
+
* over whatever the plot has there, and the halo clears a hairline of chart from
|
|
83
|
+
* around each glyph, where a filled box would hide the very data it is about.
|
|
84
|
+
*
|
|
85
|
+
* The numbers take no pointer event; the room they occupy does, as one
|
|
86
|
+
* transparent rectangle per stack, and only when somebody asked for it — so a
|
|
87
|
+
* stack can be interrogated without becoming a control, while the crosshair
|
|
88
|
+
* underneath goes on following the pointer.
|
|
89
|
+
* @param props - Component props.
|
|
90
|
+
* @returns The marks and the labels, as SVG.
|
|
91
|
+
*/
|
|
92
|
+
export declare function PeakLabels(props: PeakLabelsProps): ReactElement;
|
|
93
|
+
//# sourceMappingURL=PeakLabels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeakLabels.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/PeakLabels.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAQjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAI5D,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB,2EAA2E;IAC3E,IAAI,EAAE,QAAQ,CAAC;IACf,8CAA8C;IAC9C,MAAM,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAwH/D"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { CHART_COLORS, CHART_FONT, LABEL_HALO, LABEL_QUIET, PEAK_LABEL, } from "../../chart/core/chartTheme.js";
|
|
4
|
+
import { planPeakLabels } from "../core/peakLabelPlan.js";
|
|
5
|
+
/**
|
|
6
|
+
* The tops of the best peaks of one spectrum, and what each of them reads.
|
|
7
|
+
*
|
|
8
|
+
* Two things drawn together because they are one claim: a short mark on the tip
|
|
9
|
+
* of the picked peak, and the numbers written over it. The mark is the half that
|
|
10
|
+
* matters when the continuous trace is the one on screen — the centroid is then
|
|
11
|
+
* not drawn at all, and a stack of numbers floating over a peak shape says which
|
|
12
|
+
* region was picked but never which point of it, which is the number the stack
|
|
13
|
+
* is quoting. With the mark on the tip the two agree by construction.
|
|
14
|
+
*
|
|
15
|
+
* Which peaks are labelled is `planPeakLabels`'s to decide, and it follows the
|
|
16
|
+
* zoom: a survey of the whole spectrum labels its base peak and a few others,
|
|
17
|
+
* and the same spectrum zoomed onto one cluster labels every line in it. Every
|
|
18
|
+
* line is haloed and none of them is boxed: a number over a peak is written
|
|
19
|
+
* over whatever the plot has there, and the halo clears a hairline of chart from
|
|
20
|
+
* around each glyph, where a filled box would hide the very data it is about.
|
|
21
|
+
*
|
|
22
|
+
* The numbers take no pointer event; the room they occupy does, as one
|
|
23
|
+
* transparent rectangle per stack, and only when somebody asked for it — so a
|
|
24
|
+
* stack can be interrogated without becoming a control, while the crosshair
|
|
25
|
+
* underneath goes on following the pointer.
|
|
26
|
+
* @param props - Component props.
|
|
27
|
+
* @returns The marks and the labels, as SVG.
|
|
28
|
+
*/
|
|
29
|
+
export function PeakLabels(props) {
|
|
30
|
+
const { spectrum, plot, xScale, yScale, limit, showCharges = false, mzDecimals, annotationLabels, below = false, color = CHART_COLORS.labelText, intensityScale = 1, onHover, } = props;
|
|
31
|
+
const plans = useMemo(() => planPeakLabels({
|
|
32
|
+
spectrum,
|
|
33
|
+
plot,
|
|
34
|
+
xScale,
|
|
35
|
+
yScale,
|
|
36
|
+
showCharges,
|
|
37
|
+
below,
|
|
38
|
+
intensityScale,
|
|
39
|
+
...(limit === undefined ? {} : { limit }),
|
|
40
|
+
...(mzDecimals === undefined ? {} : { mzDecimals }),
|
|
41
|
+
...(annotationLabels === undefined ? {} : { annotationLabels }),
|
|
42
|
+
}), [
|
|
43
|
+
spectrum,
|
|
44
|
+
plot,
|
|
45
|
+
xScale,
|
|
46
|
+
yScale,
|
|
47
|
+
limit,
|
|
48
|
+
showCharges,
|
|
49
|
+
mzDecimals,
|
|
50
|
+
annotationLabels,
|
|
51
|
+
below,
|
|
52
|
+
intensityScale,
|
|
53
|
+
]);
|
|
54
|
+
// Every picked peak is marked; only the ones that kept their room are
|
|
55
|
+
// written, since a stack over a peak whose neighbour took the room would be
|
|
56
|
+
// written across that neighbour's.
|
|
57
|
+
const written = useMemo(() => plans.filter((plan) => Number.isFinite(plan.labelX)), [plans]);
|
|
58
|
+
const stackStyle = useMemo(() => ({ fill: color, fontSize: CHART_FONT.label, ...LABEL_HALO }), [color]);
|
|
59
|
+
const markStyle = useMemo(() => ({ stroke: color }), [color]);
|
|
60
|
+
return (_jsxs("g", { children: [_jsx("g", { pointerEvents: "none", style: markStyle, children: plans.map((plan) => (_jsx("line", { x1: plan.tipX, y1: plan.tipY, x2: plan.tipX, y2: below
|
|
61
|
+
? plan.tipY - PEAK_LABEL.topMark
|
|
62
|
+
: plan.tipY + PEAK_LABEL.topMark }, plan.key))) }), _jsx("g", { pointerEvents: "none", style: stackStyle, children: written.map((plan) => (_jsx("text", { textAnchor: "middle", children: plan.lines.map((line, index) => (_jsx("tspan", { x: plan.labelX, y: plan.baselines[index], style: LINE_STYLES[line.kind], children: line.text }, line.kind))) }, plan.key))) }), onHover === undefined
|
|
63
|
+
? null
|
|
64
|
+
: written.map((plan) => (_jsx("rect", { x: plan.box.x, y: plan.box.y, width: plan.box.width, height: plan.box.height, fill: "transparent", onPointerEnter: () => onHover({
|
|
65
|
+
key: plan.key,
|
|
66
|
+
mz: plan.peak.x,
|
|
67
|
+
intensity: plan.peak.y,
|
|
68
|
+
charge: plan.peak.charge,
|
|
69
|
+
x: plan.labelX,
|
|
70
|
+
// A card hangs off the edge of the stack facing away from the
|
|
71
|
+
// stick, so it never covers the peak it is about.
|
|
72
|
+
y: below ? plan.box.y + plan.box.height : plan.box.y,
|
|
73
|
+
}), onPointerLeave: () => onHover(null) }, plan.key)))] }));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* How each line of a stack is set.
|
|
77
|
+
*
|
|
78
|
+
* Four numbers in one ink and one weight are four things said at once, and the
|
|
79
|
+
* eye has to read all of them to find the one it came for. So the stack is
|
|
80
|
+
* graded instead: the name of what the peak is carries the weight, because it is
|
|
81
|
+
* the only line that is an answer rather than a measurement; the m/z is written
|
|
82
|
+
* plain, which is what a chemist is nearly always reading; and the charge and
|
|
83
|
+
* the intensity are let back towards the paper.
|
|
84
|
+
*/
|
|
85
|
+
const LINE_STYLES = {
|
|
86
|
+
annotation: { fontWeight: 600 },
|
|
87
|
+
charge: { fillOpacity: LABEL_QUIET },
|
|
88
|
+
mz: {},
|
|
89
|
+
intensity: { fillOpacity: LABEL_QUIET },
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=PeakLabels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeakLabels.js","sourceRoot":"","sources":["../../../src/mass/ui/PeakLabels.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { MassPeakObject } from '../core/centroidPeaks.ts';
|
|
2
|
+
/** Which column the rows are read in the order of. */
|
|
3
|
+
export type PeakSortKey = 'mz' | 'intensity';
|
|
4
|
+
export interface PeakTableProps {
|
|
5
|
+
/** The peaks to list, in increasing m/z. */
|
|
6
|
+
peaks: readonly MassPeakObject[];
|
|
7
|
+
/** How many decimals the masses are written with. */
|
|
8
|
+
mzDecimals: number;
|
|
9
|
+
/**
|
|
10
|
+
* Which column the rows are in the order of: m/z ascending, which is how a
|
|
11
|
+
* spectrum is read, or intensity descending, which is how its base peak and
|
|
12
|
+
* its neighbours are found.
|
|
13
|
+
*/
|
|
14
|
+
sortKey: PeakSortKey;
|
|
15
|
+
/** Order the rows by a column. */
|
|
16
|
+
onSort: (key: PeakSortKey) => void;
|
|
17
|
+
/** The m/z of the peak the pointer is resting on, `null` for none. */
|
|
18
|
+
highlightMz: number | null;
|
|
19
|
+
/** Told which peak a row the pointer rests on is, `null` when it leaves. */
|
|
20
|
+
onHighlight: (mz: number | null) => void;
|
|
21
|
+
/** Frame a peak on the chart. */
|
|
22
|
+
onPick: (mz: number) => void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The peaks, one row each, under a header that sorts them.
|
|
26
|
+
*
|
|
27
|
+
* Only the rows in view are drawn: a table opened onto a whole Orbitrap scan is
|
|
28
|
+
* a thousand rows, and every one of them would otherwise be laid out again on
|
|
29
|
+
* every hover of the chart beside it.
|
|
30
|
+
* @param props - Component props.
|
|
31
|
+
* @returns The table.
|
|
32
|
+
*/
|
|
33
|
+
export declare function PeakTable(props: PeakTableProps): import("react").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=PeakTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeakTable.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/PeakTable.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,sDAAsD;AACtD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,WAAW,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,EAAE,WAAW,CAAC;IACrB,kCAAkC;IAClC,MAAM,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACnC,sEAAsE;IACtE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,4EAA4E;IAC5E,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,iCAAiC;IACjC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BA8E9C"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useMemo, useRef } from 'react';
|
|
3
|
+
import { panelCellStyle, panelColumnButtonStyle, panelNumberCellStyle, panelScrollAreaStyle, panelStickyHeaderStyle, panelTableStyle, } from "../../panel/core/panelStyles.js";
|
|
4
|
+
import { useVirtualRows } from "../../panel/ui/useVirtualRows.js";
|
|
5
|
+
import { formatIntensity, formatMz } from "../core/massFormat.js";
|
|
6
|
+
/**
|
|
7
|
+
* The peaks, one row each, under a header that sorts them.
|
|
8
|
+
*
|
|
9
|
+
* Only the rows in view are drawn: a table opened onto a whole Orbitrap scan is
|
|
10
|
+
* a thousand rows, and every one of them would otherwise be laid out again on
|
|
11
|
+
* every hover of the chart beside it.
|
|
12
|
+
* @param props - Component props.
|
|
13
|
+
* @returns The table.
|
|
14
|
+
*/
|
|
15
|
+
export function PeakTable(props) {
|
|
16
|
+
const { peaks, mzDecimals, sortKey, onSort, highlightMz, onHighlight, onPick, } = props;
|
|
17
|
+
const scrollRef = useRef(null);
|
|
18
|
+
const ordered = useMemo(() => sortKey === 'mz'
|
|
19
|
+
? peaks
|
|
20
|
+
: peaks.toSorted((first, second) => second.y - first.y), [peaks, sortKey]);
|
|
21
|
+
const rows = useVirtualRows(scrollRef, ordered.length, ROW_HEIGHT);
|
|
22
|
+
const showsCharge = useMemo(() => peaks.some((peak) => peak.charge !== 0), [peaks]);
|
|
23
|
+
return (_jsx("div", { ref: scrollRef, style: panelScrollAreaStyle, children: _jsxs("table", { style: panelTableStyle, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { style: panelStickyHeaderStyle, children: _jsxs("button", { type: "button", style: panelColumnButtonStyle, onClick: () => onSort('mz'), children: ["m/z", sortKey === 'mz' ? ' ▲' : ''] }) }), _jsx("th", { style: panelStickyHeaderStyle, children: _jsxs("button", { type: "button", style: panelColumnButtonStyle, onClick: () => onSort('intensity'), children: ["intensity", sortKey === 'intensity' ? ' ▼' : ''] }) }), showsCharge ? (_jsx("th", { style: panelStickyHeaderStyle, children: _jsx("span", { style: panelColumnButtonStyle, children: "z" }) })) : null] }) }), _jsxs("tbody", { onPointerLeave: () => onHighlight(null), children: [rows.before > 0 ? _jsx("tr", { style: { height: rows.before } }) : null, rows.indices.map((index) => {
|
|
24
|
+
const peak = ordered[index];
|
|
25
|
+
return (_jsx(PeakRow, { index: index, peak: peak, mzDecimals: mzDecimals, showsCharge: showsCharge, isHighlighted: peak.x === highlightMz, measure: rows.measure, onHighlight: onHighlight, onPick: onPick }, peak.x));
|
|
26
|
+
}), rows.after > 0 ? _jsx("tr", { style: { height: rows.after } }) : null] })] }) }));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* One peak. Memoised, because a hover on the chart moves the highlight and only
|
|
30
|
+
* the row it left and the row it reached have anything new to draw.
|
|
31
|
+
*/
|
|
32
|
+
const PeakRow = memo(function PeakRow(props) {
|
|
33
|
+
const { index, peak, mzDecimals, showsCharge, isHighlighted, measure, onHighlight, onPick, } = props;
|
|
34
|
+
return (_jsxs("tr", { ref: measure, "data-index": index, style: isHighlighted ? highlightedRowStyle : rowStyle, title: "Click to frame this peak on the chart",
|
|
35
|
+
// Reachable by Tab as well as by the pointer: framing a peak is the one
|
|
36
|
+
// thing a row does, and a keyboard has to be able to ask for it.
|
|
37
|
+
tabIndex: 0, onPointerEnter: () => onHighlight(peak.x), onFocus: () => onHighlight(peak.x), onClick: () => onPick(peak.x), onKeyDown: (event) => {
|
|
38
|
+
if (event.key !== 'Enter' && event.key !== ' ')
|
|
39
|
+
return;
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
onPick(peak.x);
|
|
42
|
+
}, children: [_jsx("td", { style: panelCellStyle, children: formatMz(peak.x, mzDecimals) }), _jsx("td", { style: panelNumberCellStyle, children: formatIntensity(peak.y, mzDecimals) }), showsCharge ? (_jsx("td", { style: panelNumberCellStyle, children: peak.charge === 0 ? '' : peak.charge })) : null] }));
|
|
43
|
+
});
|
|
44
|
+
/** What one row is worth before one has been measured. */
|
|
45
|
+
const ROW_HEIGHT = 18;
|
|
46
|
+
const rowStyle = { cursor: 'pointer' };
|
|
47
|
+
/** The row of the peak being looked at, wherever it was pointed at. */
|
|
48
|
+
const highlightedRowStyle = { ...rowStyle, background: '#e8f1fb' };
|
|
49
|
+
//# sourceMappingURL=PeakTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeakTable.js","sourceRoot":"","sources":["../../../src/mass/ui/PeakTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface PeaksPanelProps {
|
|
2
|
+
/**
|
|
3
|
+
* The m/z of the peak the pointer is resting on, wherever it was hovered.
|
|
4
|
+
* @default null
|
|
5
|
+
*/
|
|
6
|
+
highlightMz?: number | null;
|
|
7
|
+
/**
|
|
8
|
+
* Told which peak a row the pointer rests on is, `null` when it leaves.
|
|
9
|
+
* @default undefined
|
|
10
|
+
*/
|
|
11
|
+
onHighlight?: (mz: number | null) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* What is actually in the selected spectrum, peak by peak.
|
|
15
|
+
*
|
|
16
|
+
* The centroid rather than the profile, because the centroid is what every
|
|
17
|
+
* number downstream is computed from — a profile lists the dozens of points one
|
|
18
|
+
* ion's peak shape covers, and none of them is the ion. For a profile these are
|
|
19
|
+
* the peaks the picking found in it.
|
|
20
|
+
*
|
|
21
|
+
* The window is the chart's by default: zoom into a cluster and the question
|
|
22
|
+
* becomes what is in *that* cluster, and a table that went on listing every row
|
|
23
|
+
* would have to be searched for the answer the chart is already pointing at. A
|
|
24
|
+
* floor of a hundredth of the base peak leaves the baseline out, and both are a
|
|
25
|
+
* toggle away. Resting on a row lights the peak on the chart, and clicking one
|
|
26
|
+
* frames it there.
|
|
27
|
+
* @param props - Component props.
|
|
28
|
+
* @returns The panel.
|
|
29
|
+
*/
|
|
30
|
+
export declare function PeaksPanel(props: PeaksPanelProps): import("react").JSX.Element;
|
|
31
|
+
//# sourceMappingURL=PeaksPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeaksPanel.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/PeaksPanel.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,+BA4HhD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import { SelectedTotal, Toolbar } from 'react-science/ui';
|
|
4
|
+
import { useCopyToClipboard } from "../../clipboard/ui/useCopyToClipboard.js";
|
|
5
|
+
import { panelBodyStyle, panelEmptyStyle, panelStyle, panelToolbarCountStyle, panelToolbarStyle, } from "../../panel/core/panelStyles.js";
|
|
6
|
+
import { mzFrame } from "../core/massDomain.js";
|
|
7
|
+
import { PEAK_TABLE_LIMIT, PEAK_TABLE_THRESHOLD, peakTableRows, peakTableToTsv, } from "../core/peakTable.js";
|
|
8
|
+
import { MzDecimalsMenu } from "./MzDecimalsMenu.js";
|
|
9
|
+
import { PeakTable } from "./PeakTable.js";
|
|
10
|
+
import { useMassCommandProps } from "./massCommandContext.js";
|
|
11
|
+
import { useMassActions, useMassEditorState } from "./massStateContext.js";
|
|
12
|
+
/**
|
|
13
|
+
* What is actually in the selected spectrum, peak by peak.
|
|
14
|
+
*
|
|
15
|
+
* The centroid rather than the profile, because the centroid is what every
|
|
16
|
+
* number downstream is computed from — a profile lists the dozens of points one
|
|
17
|
+
* ion's peak shape covers, and none of them is the ion. For a profile these are
|
|
18
|
+
* the peaks the picking found in it.
|
|
19
|
+
*
|
|
20
|
+
* The window is the chart's by default: zoom into a cluster and the question
|
|
21
|
+
* becomes what is in *that* cluster, and a table that went on listing every row
|
|
22
|
+
* would have to be searched for the answer the chart is already pointing at. A
|
|
23
|
+
* floor of a hundredth of the base peak leaves the baseline out, and both are a
|
|
24
|
+
* toggle away. Resting on a row lights the peak on the chart, and clicking one
|
|
25
|
+
* frames it there.
|
|
26
|
+
* @param props - Component props.
|
|
27
|
+
* @returns The panel.
|
|
28
|
+
*/
|
|
29
|
+
export function PeaksPanel(props) {
|
|
30
|
+
const { highlightMz = null, onHighlight } = props;
|
|
31
|
+
const { state, visibleSpectra, selectedSpectrum, mzDecimals, autoMzDecimals, } = useMassEditorState();
|
|
32
|
+
const actions = useMassActions();
|
|
33
|
+
const command = useMassCommandProps();
|
|
34
|
+
const { domain } = state.view;
|
|
35
|
+
const { showLabels, showCharges } = state.settings;
|
|
36
|
+
const [inWindow, setInWindow] = useState(true);
|
|
37
|
+
const [withFloor, setWithFloor] = useState(true);
|
|
38
|
+
const [sortKey, setSortKey] = useState('mz');
|
|
39
|
+
const { copied, copy } = useCopyToClipboard();
|
|
40
|
+
const peaks = useMemo(() => selectedSpectrum === null
|
|
41
|
+
? []
|
|
42
|
+
: peakTableRows(selectedSpectrum, {
|
|
43
|
+
domain: inWindow ? domain : null,
|
|
44
|
+
threshold: withFloor ? PEAK_TABLE_THRESHOLD : 0,
|
|
45
|
+
}), [selectedSpectrum, inWindow, domain, withFloor]);
|
|
46
|
+
// Stable across a pointer move, so the memoised rows survive one.
|
|
47
|
+
const onPick = useCallback((mz) => actions.setDomain(mzFrame(mz, visibleSpectra, domain)), [actions, visibleSpectra, domain]);
|
|
48
|
+
const highlight = useCallback((mz) => onHighlight?.(mz), [onHighlight]);
|
|
49
|
+
const total = selectedSpectrum?.centroid.x.length ?? 0;
|
|
50
|
+
return (_jsxs("div", { style: panelStyle, children: [_jsxs("div", { style: panelToolbarStyle, children: [_jsxs(Toolbar, { "aria-label": "Peaks", children: [_jsx(Toolbar.Item, { icon: "zoom-to-fit", active: inWindow, tooltip: "Only the peaks the chart is showing", "aria-label": "Only the peaks the chart is showing", onClick: () => setInWindow(!inWindow) }), _jsx(Toolbar.Item, { icon: "filter", active: withFloor, tooltip: "Leave out the peaks under 1 % of the base peak", "aria-label": "Leave out the peaks under 1 % of the base peak", onClick: () => setWithFloor(!withFloor) }), _jsx(Toolbar.Item, { icon: "label", active: showLabels, ...command('toggleLabels') }), _jsx(Toolbar.Item, { icon: "numerical", active: showCharges, ...command('toggleCharges') }), _jsx(MzDecimalsMenu, { setting: state.settings.mzDecimals, autoDecimals: autoMzDecimals, onChange: (setting) => actions.setSettings({ mzDecimals: setting }) }), _jsx(Toolbar.Item, { icon: copied ? 'tick' : 'duplicate', tooltip: "Copy the rows as tab-separated text", "aria-label": "Copy the rows as tab-separated text", disabled: peaks.length === 0, onClick: () => void copy(peakTableToTsv(peaks, mzDecimals)) })] }), _jsx("div", { style: panelToolbarCountStyle, title: `${peaks.length} of the ${total} peaks of this spectrum listed`, children: _jsx(SelectedTotal, { count: peaks.length, total: total }) })] }), _jsx("div", { style: panelBodyStyle, children: selectedSpectrum === null ? (_jsx("p", { style: panelEmptyStyle, children: "No spectrum is selected. Click one in the Spectra panel and its peaks are listed here." })) : peaks.length === 0 ? (_jsx("p", { style: panelEmptyStyle, children: "No peak stands in the window above the floor. Zoom out, or switch the window or the floor off in the toolbar." })) : (_jsxs(_Fragment, { children: [peaks.length === PEAK_TABLE_LIMIT ? (_jsxs("p", { style: noteStyle, children: ["The ", PEAK_TABLE_LIMIT, " most intense peaks are listed. Zoom in to list the rest."] })) : null, _jsx(PeakTable, { peaks: peaks, mzDecimals: mzDecimals, sortKey: sortKey, onSort: setSortKey, highlightMz: highlightMz, onHighlight: highlight, onPick: onPick })] })) })] }));
|
|
51
|
+
}
|
|
52
|
+
const noteStyle = { margin: 0, fontSize: 11, opacity: 0.7 };
|
|
53
|
+
//# sourceMappingURL=PeaksPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeaksPanel.js","sourceRoot":"","sources":["../../../src/mass/ui/PeaksPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What is loaded: one row per spectrum, in the order the files gave them.
|
|
3
|
+
*
|
|
4
|
+
* The list is the viewer's selection as well as its legend. Whichever row is
|
|
5
|
+
* selected is the spectrum the acquisition table describes, the peak table holds
|
|
6
|
+
* and the chart writes its labels on, so a row is not a checkbox with a colour
|
|
7
|
+
* beside it — it is the control that decides what the other panels are about.
|
|
8
|
+
* That is also why the arrow keys walk it: a GC/MS export gives a page per scan,
|
|
9
|
+
* and finding the interesting one means stepping down them watching the chart.
|
|
10
|
+
*
|
|
11
|
+
* What acts on the list rather than on one row — opening more, drawing every
|
|
12
|
+
* trace again, handing the whole list over as a file, closing every one — is a
|
|
13
|
+
* toolbar under the header, where a panel's own actions belong.
|
|
14
|
+
* @returns The panel.
|
|
15
|
+
*/
|
|
16
|
+
export declare function SpectraPanel(): import("react").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=SpectraPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpectraPanel.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/SpectraPanel.tsx"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,gCA2G3B"}
|