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
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
* The sample is a real one, and so are its quirks: its molfile is V2000 with
|
|
9
9
|
* every atom at the origin, its title is blank so the label is its first name,
|
|
10
10
|
* and its formula travels as a kind no structure input reads.
|
|
11
|
+
*
|
|
12
|
+
* Its infrared spectrum is pinned here before the tool tab sends it: the bands
|
|
13
|
+
* are the sample's own, and the message is the one visualizer-helper's `ir`
|
|
14
|
+
* reader has to write.
|
|
11
15
|
*/
|
|
12
16
|
|
|
13
17
|
import type { LoadRequest } from '../core/protocol.ts';
|
|
@@ -64,3 +68,139 @@ export const SCIPEAKS_ETHYLBENZENE_LOAD: LoadRequest & { accept: string[] } = {
|
|
|
64
68
|
],
|
|
65
69
|
accept: [],
|
|
66
70
|
};
|
|
71
|
+
|
|
72
|
+
/** Where SciPeaks keeps that sample's infrared spectrum: its attachment. */
|
|
73
|
+
export const SCIPEAKS_ETHYLBENZENE_IR_FILENAME =
|
|
74
|
+
'spectra/ir/spectra_ir_100-41-4-IR.jdx';
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The bands SciPeaks keeps for that spectrum, as stored: out of wavenumber
|
|
78
|
+
* order, a transmittance that is a fraction, and the visualizer's `_highlight`.
|
|
79
|
+
*/
|
|
80
|
+
export const SCIPEAKS_ETHYLBENZENE_IR_PEAKS = [
|
|
81
|
+
peak(
|
|
82
|
+
1613.8583376884494,
|
|
83
|
+
0.473660722610156,
|
|
84
|
+
0.33599999999999997,
|
|
85
|
+
'm',
|
|
86
|
+
0.5620600551849647,
|
|
87
|
+
),
|
|
88
|
+
peak(
|
|
89
|
+
1952.5275809045322,
|
|
90
|
+
0.13123804178794973,
|
|
91
|
+
0.7392,
|
|
92
|
+
'w',
|
|
93
|
+
0.5211472441361716,
|
|
94
|
+
),
|
|
95
|
+
peak(
|
|
96
|
+
2872.4947788943773,
|
|
97
|
+
0.4610494379856386,
|
|
98
|
+
0.3459,
|
|
99
|
+
'm',
|
|
100
|
+
0.30496127508514037,
|
|
101
|
+
),
|
|
102
|
+
peak(2887.659073366737, 0.7066374452885544, 0.1965, 'S', 0.6306151483877337),
|
|
103
|
+
peak(2907.878132663217, 0.4962093169428189, 0.319, 'S', 0.7220300834282813),
|
|
104
|
+
peak(2944.9464080400967, 1.0867160982395816, 0.0819, 'S', 0.8391486100817713),
|
|
105
|
+
peak(2978.6448402008964, 1.7958800173440752, 0.016, 'S', 0.6098050482700554),
|
|
106
|
+
peak(3014.028193969736, 0.32975414692587596, 0.468, 'm', 0.39091552830124354),
|
|
107
|
+
peak(3039.302018090336, 1.0969100130080565, 0.08, 'S', 0.502385910408338),
|
|
108
|
+
peak(
|
|
109
|
+
3076.3702934672156,
|
|
110
|
+
0.5831931281770556,
|
|
111
|
+
0.2611,
|
|
112
|
+
'S',
|
|
113
|
+
0.06293920935800923,
|
|
114
|
+
),
|
|
115
|
+
peak(
|
|
116
|
+
3098.2742743717354,
|
|
117
|
+
0.38658105496542694,
|
|
118
|
+
0.4106,
|
|
119
|
+
'm',
|
|
120
|
+
0.4934643842659038,
|
|
121
|
+
),
|
|
122
|
+
peak(
|
|
123
|
+
3118.493333668215,
|
|
124
|
+
0.16557929631846746,
|
|
125
|
+
0.6829999999999999,
|
|
126
|
+
'w',
|
|
127
|
+
0.05290000144269602,
|
|
128
|
+
),
|
|
129
|
+
peak(
|
|
130
|
+
1875.0211869346824,
|
|
131
|
+
0.11935787359571505,
|
|
132
|
+
0.7597,
|
|
133
|
+
'w',
|
|
134
|
+
0.9972320630781272,
|
|
135
|
+
),
|
|
136
|
+
peak(
|
|
137
|
+
1812.6790874371945,
|
|
138
|
+
0.11125903931710739,
|
|
139
|
+
0.774,
|
|
140
|
+
'w',
|
|
141
|
+
0.07102323198933491,
|
|
142
|
+
),
|
|
143
|
+
peak(
|
|
144
|
+
1753.706831155787,
|
|
145
|
+
0.0834934128848443,
|
|
146
|
+
0.8251000000000001,
|
|
147
|
+
'w',
|
|
148
|
+
0.0750629173499594,
|
|
149
|
+
),
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* The `load` the tool tab is to send that sample to a site that reads
|
|
154
|
+
* infrared spectra and hands their bands back, once its `ir` reader and its
|
|
155
|
+
* `save` exist: the structure as it is sent today, one `spectra.ir.jdx` item
|
|
156
|
+
* per spectrum — the attachment's text, its name and its bands, under the
|
|
157
|
+
* attachment's name as `id` — and `accept` naming the kind saved back, as
|
|
158
|
+
* the tool tab's `save` names it.
|
|
159
|
+
* @param jdx - The attachment's text, which SciPeaks serves at its `dUrl`.
|
|
160
|
+
* @returns The request, its bands copied so that reading them cannot strip
|
|
161
|
+
* this module's own.
|
|
162
|
+
*/
|
|
163
|
+
export function sciPeaksEthylbenzeneIrLoad(
|
|
164
|
+
jdx: string,
|
|
165
|
+
): LoadRequest & { accept: string[] } {
|
|
166
|
+
return {
|
|
167
|
+
type: 'load',
|
|
168
|
+
id: 'load-1',
|
|
169
|
+
document: SCIPEAKS_ETHYLBENZENE_LOAD.document,
|
|
170
|
+
items: [
|
|
171
|
+
...SCIPEAKS_ETHYLBENZENE_LOAD.items,
|
|
172
|
+
{
|
|
173
|
+
kind: 'spectra.ir.jdx',
|
|
174
|
+
id: SCIPEAKS_ETHYLBENZENE_IR_FILENAME,
|
|
175
|
+
label: 'spectra_ir_100-41-4-IR.jdx',
|
|
176
|
+
value: {
|
|
177
|
+
jdx,
|
|
178
|
+
filename: SCIPEAKS_ETHYLBENZENE_IR_FILENAME,
|
|
179
|
+
peaks: SCIPEAKS_ETHYLBENZENE_IR_PEAKS.map((stored) => ({
|
|
180
|
+
...stored,
|
|
181
|
+
})),
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
accept: ['spectra.ir.peaks'],
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* One stored band.
|
|
191
|
+
* @param wavenumber - Where it sits, in cm⁻¹.
|
|
192
|
+
* @param absorbance - Its absorbance.
|
|
193
|
+
* @param transmittance - Its transmittance, a fraction.
|
|
194
|
+
* @param kind - Its strength letter.
|
|
195
|
+
* @param highlight - The visualizer's own `_highlight`, stored with it.
|
|
196
|
+
* @returns The band as SciPeaks stores it.
|
|
197
|
+
*/
|
|
198
|
+
function peak(
|
|
199
|
+
wavenumber: number,
|
|
200
|
+
absorbance: number,
|
|
201
|
+
transmittance: number,
|
|
202
|
+
kind: string,
|
|
203
|
+
highlight: number,
|
|
204
|
+
) {
|
|
205
|
+
return { wavenumber, absorbance, transmittance, kind, _highlight: highlight };
|
|
206
|
+
}
|
|
@@ -37,7 +37,7 @@ export interface StandInHost {
|
|
|
37
37
|
export interface StandInHostLog {
|
|
38
38
|
/** The tool's `hello`, or `null` before it came. */
|
|
39
39
|
hello: HelloMessage | null;
|
|
40
|
-
/** Every message the tool sent on the port, in order. */
|
|
40
|
+
/** Every message the tool sent on the port, in order: results and outputs. */
|
|
41
41
|
results: unknown[];
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -46,10 +46,15 @@ export interface StandInHostLog {
|
|
|
46
46
|
* @returns The host; close it when the tests are done.
|
|
47
47
|
*/
|
|
48
48
|
export async function startStandInHost(): Promise<StandInHost> {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
// A setup carrying a spectrum is tens of kilobytes of address, past the
|
|
50
|
+
// 16 KiB Node allows a request's head by default.
|
|
51
|
+
const server: Server = createServer(
|
|
52
|
+
{ maxHeaderSize: MAX_SETUP_BYTES },
|
|
53
|
+
(_request, response) => {
|
|
54
|
+
response.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
|
|
55
|
+
response.end(HOST_PAGE);
|
|
56
|
+
},
|
|
57
|
+
);
|
|
53
58
|
await new Promise<void>((resolve) => {
|
|
54
59
|
server.listen(0, '127.0.0.1', resolve);
|
|
55
60
|
});
|
|
@@ -81,6 +86,24 @@ export function readStandInHostLog(): StandInHostLog {
|
|
|
81
86
|
return (globalThis as unknown as { hostLog: StandInHostLog }).hostLog;
|
|
82
87
|
}
|
|
83
88
|
|
|
89
|
+
/**
|
|
90
|
+
* Send one more request on the port, once the tool has connected — a `get`
|
|
91
|
+
* after the user has worked. Runs in the page, as
|
|
92
|
+
* `page.evaluate(sendStandInHostRequest, request)`.
|
|
93
|
+
* @param request - What to send.
|
|
94
|
+
* @returns Whether there was a port to send it on.
|
|
95
|
+
*/
|
|
96
|
+
export function sendStandInHostRequest(request: unknown): boolean {
|
|
97
|
+
const { hostPort } = globalThis as unknown as {
|
|
98
|
+
hostPort: MessagePort | null;
|
|
99
|
+
};
|
|
100
|
+
hostPort?.postMessage(request);
|
|
101
|
+
return hostPort !== null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** How long the page's address may be, in bytes: Chrome's own limit is 2 MB. */
|
|
105
|
+
const MAX_SETUP_BYTES = 2 * 1024 * 1024;
|
|
106
|
+
|
|
84
107
|
/**
|
|
85
108
|
* The page. Its setup is its own `?setup=`, so one page serves every test, and
|
|
86
109
|
* it listens before it frames, so the tool's `hello` cannot be missed.
|
|
@@ -95,11 +118,13 @@ const { toolUrl, requests } = JSON.parse(new URLSearchParams(location.search).ge
|
|
|
95
118
|
const toolOrigin = new URL(toolUrl).origin;
|
|
96
119
|
const frame = document.querySelector('#tool');
|
|
97
120
|
globalThis.hostLog = { hello: null, results: [] };
|
|
121
|
+
globalThis.hostPort = null;
|
|
98
122
|
globalThis.addEventListener('message', (event) => {
|
|
99
123
|
if (event.source !== frame.contentWindow || event.origin !== toolOrigin) return;
|
|
100
124
|
if (event.data?.type !== 'cheminfo:hello') return;
|
|
101
125
|
globalThis.hostLog.hello = event.data;
|
|
102
126
|
const channel = new MessageChannel();
|
|
127
|
+
globalThis.hostPort = channel.port1;
|
|
103
128
|
channel.port1.onmessage = (answer) => {
|
|
104
129
|
globalThis.hostLog.results.push(answer.data);
|
|
105
130
|
};
|
|
@@ -7,17 +7,25 @@
|
|
|
7
7
|
|
|
8
8
|
import { useEffect, useRef } from 'react';
|
|
9
9
|
|
|
10
|
-
import type {
|
|
10
|
+
import type { HostOutputs } from '../core/hostOutputs.ts';
|
|
11
11
|
import type { ToolInterface } from '../core/protocol.ts';
|
|
12
|
+
import type { LoadedInput } from '../core/selectInputs.ts';
|
|
12
13
|
|
|
13
14
|
/** What a tool does with what its host sends, and what it says about itself. */
|
|
14
15
|
export interface HostHandlers {
|
|
15
16
|
/**
|
|
16
|
-
* Show the inputs of a new document. Throwing means they
|
|
17
|
-
* the error's message goes back to the host, and nothing
|
|
18
|
-
* on screen.
|
|
17
|
+
* Show the inputs of a new document. Throwing, or rejecting, means they
|
|
18
|
+
* could not be read: the error's message goes back to the host, and nothing
|
|
19
|
+
* should have changed on screen.
|
|
19
20
|
*/
|
|
20
|
-
load: (inputs: readonly LoadedInput[]) => void
|
|
21
|
+
load: (inputs: readonly LoadedInput[]) => void | Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Where the values of the tool's outputs are read, and their changes heard.
|
|
24
|
+
* Read once, when the host connects, so it lives as long as the page — a
|
|
25
|
+
* store of signals rather than a value of one render.
|
|
26
|
+
* @default undefined — nothing goes back
|
|
27
|
+
*/
|
|
28
|
+
outputs?: HostOutputs;
|
|
21
29
|
/**
|
|
22
30
|
* The build that is running — `BUILD_INFO` from `react-cheminfo/build-info`
|
|
23
31
|
* — so a host can record which version produced what it stores.
|
|
@@ -67,9 +75,10 @@ export function useHostConnection(
|
|
|
67
75
|
tool,
|
|
68
76
|
origin: globalThis.location.origin,
|
|
69
77
|
build: latest.current.build ?? null,
|
|
70
|
-
load: (inputs) =>
|
|
71
|
-
|
|
72
|
-
|
|
78
|
+
load: (inputs) => latest.current.load(inputs),
|
|
79
|
+
...(latest.current.outputs === undefined
|
|
80
|
+
? {}
|
|
81
|
+
: { outputs: latest.current.outputs }),
|
|
73
82
|
});
|
|
74
83
|
})
|
|
75
84
|
.catch(() => {
|
package/src/host-testing.ts
CHANGED
|
@@ -9,10 +9,14 @@ export type {
|
|
|
9
9
|
} from './host/testing/standInHost.ts';
|
|
10
10
|
export {
|
|
11
11
|
readStandInHostLog,
|
|
12
|
+
sendStandInHostRequest,
|
|
12
13
|
startStandInHost,
|
|
13
14
|
} from './host/testing/standInHost.ts';
|
|
14
15
|
export {
|
|
16
|
+
SCIPEAKS_ETHYLBENZENE_IR_FILENAME,
|
|
17
|
+
SCIPEAKS_ETHYLBENZENE_IR_PEAKS,
|
|
15
18
|
SCIPEAKS_ETHYLBENZENE_LOAD,
|
|
16
19
|
SCIPEAKS_ETHYLBENZENE_MOLFILE,
|
|
17
20
|
SCIPEAKS_HOST_NAME,
|
|
21
|
+
sciPeaksEthylbenzeneIrLoad,
|
|
18
22
|
} from './host/testing/sciPeaks.ts';
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Picking bands by hand.
|
|
3
|
+
*
|
|
4
|
+
* Where a click lands is not where the band is: it is taken to the top of the
|
|
5
|
+
* band it was aimed at, and the band is read off the spectrum there exactly as
|
|
6
|
+
* automatic picking reads one — the same values, and the same strength letter.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { peakPicking } from 'ir-spectrum';
|
|
10
|
+
import {
|
|
11
|
+
xMinMaxValues,
|
|
12
|
+
xyMaxClosestYPoint,
|
|
13
|
+
xyMaxYPoint,
|
|
14
|
+
xyMinYPoint,
|
|
15
|
+
} from 'ml-spectra-processing';
|
|
16
|
+
|
|
17
|
+
import type { IrBand, IrBandStrength } from './irBand.ts';
|
|
18
|
+
import type { IrSpectrum } from './irSpectrum.ts';
|
|
19
|
+
import { infraredMeasurement } from './pickBands.ts';
|
|
20
|
+
import { intensityStrength } from './ramanBands.ts';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* What a click while picking by hand makes of a spectrum's bands: the band it
|
|
24
|
+
* landed on taken away, or else the band under it added.
|
|
25
|
+
* @param spectrum - The spectrum picked on.
|
|
26
|
+
* @param wavenumber - Where the click landed, in cm⁻¹.
|
|
27
|
+
* @param reach - How close to a band counts as on it, and how far either side
|
|
28
|
+
* to look for one, in cm⁻¹: a few pixels' worth at the zoom of the chart.
|
|
29
|
+
* @returns The new bands, or the spectrum's own list when nothing changed.
|
|
30
|
+
*/
|
|
31
|
+
export function editBandsAt(
|
|
32
|
+
spectrum: IrSpectrum,
|
|
33
|
+
wavenumber: number,
|
|
34
|
+
reach: number,
|
|
35
|
+
): IrBand[] {
|
|
36
|
+
const bands = spectrum.bands ?? [];
|
|
37
|
+
let hit: IrBand | null = null;
|
|
38
|
+
let nearest = Math.abs(reach);
|
|
39
|
+
for (const band of bands) {
|
|
40
|
+
const distance = Math.abs(band.wavenumber - wavenumber);
|
|
41
|
+
if (distance <= nearest) {
|
|
42
|
+
nearest = distance;
|
|
43
|
+
hit = band;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (hit !== null) return removeBand(bands, hit.wavenumber);
|
|
47
|
+
const band = pickBandAt(spectrum, wavenumber, reach);
|
|
48
|
+
return band === null ? bands : addBand(bands, band);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The band a click asks for: the top of the band under it.
|
|
53
|
+
*
|
|
54
|
+
* The highest point within reach of the click first, then uphill from there to
|
|
55
|
+
* the top: a click lands on a band's flank as often as on its top, and a flank
|
|
56
|
+
* carries bumps of noise that a climb from the click alone would stop at. A
|
|
57
|
+
* band is a maximum of absorbance, or of intensity for a Raman spectrum,
|
|
58
|
+
* whichever way up the chart is drawn.
|
|
59
|
+
* @param spectrum - The spectrum picked on.
|
|
60
|
+
* @param wavenumber - Where the click landed, in cm⁻¹.
|
|
61
|
+
* @param reach - How far either side of it to look, in cm⁻¹.
|
|
62
|
+
* @returns The band, or `null` when the spectrum carries no axis a band is a
|
|
63
|
+
* maximum of, or is flat within reach.
|
|
64
|
+
*/
|
|
65
|
+
export function pickBandAt(
|
|
66
|
+
spectrum: IrSpectrum,
|
|
67
|
+
wavenumber: number,
|
|
68
|
+
reach: number,
|
|
69
|
+
): IrBand | null {
|
|
70
|
+
const { wavenumber: x, intensity, absorbance } = spectrum;
|
|
71
|
+
const y = intensity ?? absorbance;
|
|
72
|
+
if (y === undefined || x.length < 2 || !Number.isFinite(wavenumber)) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const around = Number.isFinite(reach) ? Math.abs(reach) : 0;
|
|
76
|
+
const within = { from: wavenumber - around, to: wavenumber + around };
|
|
77
|
+
const near = xyMaxYPoint({ x, y }, within);
|
|
78
|
+
// A stretch that does not rise at all has no band to climb to.
|
|
79
|
+
if (around > 0 && near.y <= xyMinYPoint({ x, y }, within).y) return null;
|
|
80
|
+
const top = xyMaxClosestYPoint({ x, y }, { targetIndex: near.index });
|
|
81
|
+
return bandAtIndex(spectrum, top.index);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The band at one sample of a spectrum, read the way automatic picking reads
|
|
86
|
+
* one.
|
|
87
|
+
* @param spectrum - The spectrum.
|
|
88
|
+
* @param index - The sample.
|
|
89
|
+
* @returns The band, or `null` when there is no such sample or no axis to read
|
|
90
|
+
* it on.
|
|
91
|
+
*/
|
|
92
|
+
export function bandAtIndex(
|
|
93
|
+
spectrum: IrSpectrum,
|
|
94
|
+
index: number,
|
|
95
|
+
): IrBand | null {
|
|
96
|
+
const { id, wavenumber, absorbance, transmittance, intensity } = spectrum;
|
|
97
|
+
const at = wavenumber[index];
|
|
98
|
+
if (at === undefined) return null;
|
|
99
|
+
if (intensity !== undefined) {
|
|
100
|
+
const value = intensity[index] ?? Number.NaN;
|
|
101
|
+
const { min, max } = xMinMaxValues(intensity);
|
|
102
|
+
return {
|
|
103
|
+
spectrumId: id,
|
|
104
|
+
wavenumber: at,
|
|
105
|
+
intensity: value,
|
|
106
|
+
strength: intensityStrength(value, min, max),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (absorbance === undefined || transmittance === undefined) return null;
|
|
110
|
+
// `ir-spectrum` reads the sample and works out the letter, as it does for
|
|
111
|
+
// every band it picks itself.
|
|
112
|
+
const peak = peakPicking(
|
|
113
|
+
infraredMeasurement(wavenumber, absorbance, transmittance),
|
|
114
|
+
at,
|
|
115
|
+
{ yVariable: 'a' },
|
|
116
|
+
);
|
|
117
|
+
if (peak === undefined) return null;
|
|
118
|
+
return {
|
|
119
|
+
spectrumId: id,
|
|
120
|
+
wavenumber: at,
|
|
121
|
+
absorbance: peak.absorbance,
|
|
122
|
+
transmittance: peak.transmittance * 100,
|
|
123
|
+
strength: peak.kind as IrBandStrength,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* The bands with one more, in its place.
|
|
129
|
+
* @param bands - The bands, ascending.
|
|
130
|
+
* @param band - The band to add.
|
|
131
|
+
* @returns A new list, or the same one when a band already sits there.
|
|
132
|
+
*/
|
|
133
|
+
export function addBand(bands: IrBand[], band: IrBand): IrBand[] {
|
|
134
|
+
let index = 0;
|
|
135
|
+
while (
|
|
136
|
+
index < bands.length &&
|
|
137
|
+
(bands[index]?.wavenumber ?? 0) < band.wavenumber
|
|
138
|
+
) {
|
|
139
|
+
index++;
|
|
140
|
+
}
|
|
141
|
+
if (bands[index]?.wavenumber === band.wavenumber) return bands;
|
|
142
|
+
return bands.toSpliced(index, 0, band);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* The bands without the one at a wavenumber.
|
|
147
|
+
* @param bands - The bands.
|
|
148
|
+
* @param wavenumber - Where the band to take away sits, exactly.
|
|
149
|
+
* @returns A new list, or the same one when no band sits there.
|
|
150
|
+
*/
|
|
151
|
+
export function removeBand(bands: IrBand[], wavenumber: number): IrBand[] {
|
|
152
|
+
const index = bands.findIndex((band) => band.wavenumber === wavenumber);
|
|
153
|
+
return index === -1 ? bands : bands.toSpliced(index, 1);
|
|
154
|
+
}
|
package/src/ir/core/index.ts
CHANGED
|
@@ -24,6 +24,14 @@ export type { BandLabelPlan, BandLabelPlanOptions } from './bandLabelPlan.ts';
|
|
|
24
24
|
export { planBandLabels } from './bandLabelPlan.ts';
|
|
25
25
|
export { detectIrFormat } from './detectIrFormat.ts';
|
|
26
26
|
export { downloadIrSpectra, downloadIrSpectrum } from './downloadSpectra.ts';
|
|
27
|
+
export {
|
|
28
|
+
addBand,
|
|
29
|
+
bandAtIndex,
|
|
30
|
+
editBandsAt,
|
|
31
|
+
pickBandAt,
|
|
32
|
+
removeBand,
|
|
33
|
+
} from './handPicking.ts';
|
|
34
|
+
export { bandsFromPeaks, peaksFromBands } from './irPeaks.ts';
|
|
27
35
|
export type { IrJcampReadOptions } from './fromJcamp.ts';
|
|
28
36
|
export type { IrSpcReadOptions } from './fromSpc.ts';
|
|
29
37
|
export type { IrBand, IrBandStrength } from './irBand.ts';
|
|
@@ -124,6 +132,12 @@ export { loadIrSpectra } from './loadIrSpectra.ts';
|
|
|
124
132
|
export { BAND_HIT_RADIUS, nearestBandAt } from './nearestBand.ts';
|
|
125
133
|
export type { PickBandsOptions } from './pickBands.ts';
|
|
126
134
|
export { pickBands } from './pickBands.ts';
|
|
135
|
+
export {
|
|
136
|
+
orderedBands,
|
|
137
|
+
repickBands,
|
|
138
|
+
samePicking,
|
|
139
|
+
withBands,
|
|
140
|
+
} from './spectrumBands.ts';
|
|
127
141
|
export {
|
|
128
142
|
DEFAULT_DATA_TYPE,
|
|
129
143
|
JCAMP_EXTENSION,
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The changes of the viewer's state that are about bands: spectra arriving
|
|
3
|
+
* with theirs or without, a list picked by hand, a list found automatically
|
|
4
|
+
* again, and new picking settings, which pick again every list that was found
|
|
5
|
+
* automatically.
|
|
6
|
+
*
|
|
7
|
+
* Apart from the reducer, which routes these actions here; like it, each
|
|
8
|
+
* returns the state itself when it has nothing to do.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { IrBand } from './irBand.ts';
|
|
12
|
+
import type { IrSpectrum } from './irSpectrum.ts';
|
|
13
|
+
import type { IrSettings, IrState, PartialIrState } from './irState.ts';
|
|
14
|
+
import { mergeIrSettings } from './irState.ts';
|
|
15
|
+
import type { PickBandsOptions } from './pickBands.ts';
|
|
16
|
+
import {
|
|
17
|
+
orderedBands,
|
|
18
|
+
repickBands,
|
|
19
|
+
samePicking,
|
|
20
|
+
withBands,
|
|
21
|
+
} from './spectrumBands.ts';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Spectra arriving, each carrying its bands: its own, or picked now.
|
|
25
|
+
* @param state - The state they arrive in.
|
|
26
|
+
* @param spectra - The spectra.
|
|
27
|
+
* @returns A new list.
|
|
28
|
+
*/
|
|
29
|
+
export function arriving(
|
|
30
|
+
state: IrState,
|
|
31
|
+
spectra: readonly IrSpectrum[],
|
|
32
|
+
): IrSpectrum[] {
|
|
33
|
+
const { picking } = state.settings;
|
|
34
|
+
return spectra.map((spectrum) => withBands(spectrum, picking));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Give one spectrum bands picked by hand.
|
|
39
|
+
* @param state - The state in force.
|
|
40
|
+
* @param id - Which spectrum.
|
|
41
|
+
* @param bands - Its bands, in any order.
|
|
42
|
+
* @returns The new state, or the old one when they were its own already.
|
|
43
|
+
*/
|
|
44
|
+
export function setSpectrumBands(
|
|
45
|
+
state: IrState,
|
|
46
|
+
id: string,
|
|
47
|
+
bands: IrBand[],
|
|
48
|
+
): IrState {
|
|
49
|
+
return mapSpectrum(state, id, (spectrum) => {
|
|
50
|
+
const ordered = orderedBands(spectrum.id, bands);
|
|
51
|
+
return ordered === spectrum.bands && spectrum.bandsByHand === true
|
|
52
|
+
? spectrum
|
|
53
|
+
: { ...spectrum, bands: ordered, bandsByHand: true };
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Have one spectrum's bands found automatically again.
|
|
59
|
+
* @param state - The state in force.
|
|
60
|
+
* @param id - Which spectrum.
|
|
61
|
+
* @returns The new state, or the old one when they already were.
|
|
62
|
+
*/
|
|
63
|
+
export function resetSpectrumBands(state: IrState, id: string): IrState {
|
|
64
|
+
const { picking } = state.settings;
|
|
65
|
+
return mapSpectrum(state, id, (spectrum) =>
|
|
66
|
+
spectrum.bandsByHand
|
|
67
|
+
? repickBands({ ...spectrum, bandsByHand: false }, picking)
|
|
68
|
+
: spectrum,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Fold a change into the workspace, and pick again what it changes.
|
|
74
|
+
* @param state - The state in force.
|
|
75
|
+
* @param change - What to change about the workspace.
|
|
76
|
+
* @returns The new state.
|
|
77
|
+
*/
|
|
78
|
+
export function changeSettings(
|
|
79
|
+
state: IrState,
|
|
80
|
+
change: Partial<IrSettings>,
|
|
81
|
+
): IrState {
|
|
82
|
+
const settings = mergeIrSettings(state.settings, change);
|
|
83
|
+
const { spectra } = state.data;
|
|
84
|
+
const picked = pickedAgain(spectra, state.settings.picking, settings.picking);
|
|
85
|
+
return {
|
|
86
|
+
...state,
|
|
87
|
+
data: picked === spectra ? state.data : { spectra: picked },
|
|
88
|
+
settings,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Take a whole state, as a host restoring one supplies it.
|
|
94
|
+
* @param state - The state in force.
|
|
95
|
+
* @param restored - The parts the host supplies.
|
|
96
|
+
* @returns The new state.
|
|
97
|
+
*/
|
|
98
|
+
export function restoreState(
|
|
99
|
+
state: IrState,
|
|
100
|
+
restored: PartialIrState,
|
|
101
|
+
): IrState {
|
|
102
|
+
const { data, view, settings } = restored;
|
|
103
|
+
const merged = mergeIrSettings(state.settings, settings);
|
|
104
|
+
const spectra =
|
|
105
|
+
data === undefined
|
|
106
|
+
? state.data.spectra
|
|
107
|
+
: arriving({ ...state, settings: merged }, data.spectra);
|
|
108
|
+
return {
|
|
109
|
+
data: {
|
|
110
|
+
spectra: pickedAgain(spectra, state.settings.picking, merged.picking),
|
|
111
|
+
},
|
|
112
|
+
view: { ...state.view, ...view },
|
|
113
|
+
settings: merged,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Change one spectrum, leaving the state alone when it did not change.
|
|
119
|
+
* @param state - The state in force.
|
|
120
|
+
* @param id - Which spectrum.
|
|
121
|
+
* @param change - What to make of it; return it unchanged for no change.
|
|
122
|
+
* @returns The new state, or the old one.
|
|
123
|
+
*/
|
|
124
|
+
export function mapSpectrum(
|
|
125
|
+
state: IrState,
|
|
126
|
+
id: string,
|
|
127
|
+
change: (spectrum: IrSpectrum) => IrSpectrum,
|
|
128
|
+
): IrState {
|
|
129
|
+
let changed = false;
|
|
130
|
+
const spectra = state.data.spectra.map((spectrum) => {
|
|
131
|
+
if (spectrum.id !== id) return spectrum;
|
|
132
|
+
const next = change(spectrum);
|
|
133
|
+
if (next !== spectrum) changed = true;
|
|
134
|
+
return next;
|
|
135
|
+
});
|
|
136
|
+
if (!changed) return state;
|
|
137
|
+
return { ...state, data: { spectra }, view: { ...state.view, error: null } };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The spectra under new picking settings: those found automatically picked
|
|
142
|
+
* again.
|
|
143
|
+
* @param spectra - The spectra.
|
|
144
|
+
* @param before - The settings they were picked with.
|
|
145
|
+
* @param after - The settings now in force.
|
|
146
|
+
* @returns The same list when the settings pick as before.
|
|
147
|
+
*/
|
|
148
|
+
function pickedAgain(
|
|
149
|
+
spectra: IrSpectrum[],
|
|
150
|
+
before: PickBandsOptions,
|
|
151
|
+
after: PickBandsOptions,
|
|
152
|
+
): IrSpectrum[] {
|
|
153
|
+
if (samePicking(before, after)) return spectra;
|
|
154
|
+
return spectra.map((spectrum) => repickBands(spectrum, after));
|
|
155
|
+
}
|
|
@@ -86,6 +86,13 @@ export const irCommands = {
|
|
|
86
86
|
'A drag zooms to exactly the rectangle it sweeps out, both axes at once — for looking into a baseline or a shoulder rather than across the spectrum. It is the only drag on percent transmittance.',
|
|
87
87
|
gestures: [{ title: 'Over the chart', shortcuts: ['Drag a rectangle'] }],
|
|
88
88
|
},
|
|
89
|
+
pickTool: {
|
|
90
|
+
title: 'Pick bands by hand',
|
|
91
|
+
shortcut: { keys: ['k'] },
|
|
92
|
+
description:
|
|
93
|
+
'A click adds the band under it to the selected spectrum, at its top; a click on a marked band takes it away. A drag still zooms, and bands picked by hand stay put when the threshold moves.',
|
|
94
|
+
gestures: [{ title: 'Over the chart', shortcuts: ['Click'] }],
|
|
95
|
+
},
|
|
89
96
|
zoomIn: {
|
|
90
97
|
title: 'Zoom in',
|
|
91
98
|
shortcut: { keys: ['+', '='] },
|