react-cheminfo 0.27.0 → 0.29.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 +38 -25
- package/lib/chart/core/axisLabels.d.ts +82 -0
- package/lib/chart/core/axisLabels.d.ts.map +1 -0
- package/lib/chart/core/axisLabels.js +111 -0
- package/lib/chart/core/axisLabels.js.map +1 -0
- package/lib/chart/core/boxLayout.d.ts +53 -0
- package/lib/chart/core/boxLayout.d.ts.map +1 -0
- package/lib/chart/core/boxLayout.js +112 -0
- package/lib/chart/core/boxLayout.js.map +1 -0
- package/lib/chart/core/chartAxisScale.d.ts +23 -2
- package/lib/chart/core/chartAxisScale.d.ts.map +1 -1
- package/lib/chart/core/chartAxisScale.js +64 -13
- package/lib/chart/core/chartAxisScale.js.map +1 -1
- package/lib/chart/core/chartDomain.d.ts +160 -0
- package/lib/chart/core/chartDomain.d.ts.map +1 -0
- package/lib/chart/core/chartDomain.js +46 -0
- package/lib/chart/core/chartDomain.js.map +1 -0
- package/lib/chart/core/chartGeometry.d.ts +131 -0
- package/lib/chart/core/chartGeometry.d.ts.map +1 -0
- package/lib/chart/core/chartGeometry.js +101 -0
- package/lib/chart/core/chartGeometry.js.map +1 -0
- package/lib/chart/core/chartPane.d.ts +11 -0
- package/lib/chart/core/chartPane.d.ts.map +1 -0
- package/lib/chart/core/chartPane.js +11 -0
- package/lib/chart/core/chartPane.js.map +1 -0
- package/lib/chart/core/chartScale.d.ts +4 -1
- package/lib/chart/core/chartScale.d.ts.map +1 -1
- package/lib/chart/core/chartScale.js +8 -4
- package/lib/chart/core/chartScale.js.map +1 -1
- package/lib/chart/core/chartTheme.d.ts +156 -0
- package/lib/chart/core/chartTheme.d.ts.map +1 -0
- package/lib/chart/core/chartTheme.js +156 -0
- package/lib/chart/core/chartTheme.js.map +1 -0
- package/lib/chart/core/chartViewport.d.ts +32 -5
- package/lib/chart/core/chartViewport.d.ts.map +1 -1
- package/lib/chart/core/chartViewport.js +40 -11
- package/lib/chart/core/chartViewport.js.map +1 -1
- package/lib/chart/core/guidePlacement.d.ts +52 -0
- package/lib/chart/core/guidePlacement.d.ts.map +1 -0
- package/lib/chart/core/guidePlacement.js +52 -0
- package/lib/chart/core/guidePlacement.js.map +1 -0
- package/lib/chart/core/index.d.ts +29 -2
- package/lib/chart/core/index.d.ts.map +1 -1
- package/lib/chart/core/index.js +19 -2
- package/lib/chart/core/index.js.map +1 -1
- package/lib/chart/core/labelStack.d.ts +27 -0
- package/lib/chart/core/labelStack.d.ts.map +1 -0
- package/lib/chart/core/labelStack.js +62 -0
- package/lib/chart/core/labelStack.js.map +1 -0
- package/lib/chart/core/legendBox.d.ts +152 -0
- package/lib/chart/core/legendBox.d.ts.map +1 -0
- package/lib/chart/core/legendBox.js +169 -0
- package/lib/chart/core/legendBox.js.map +1 -0
- package/lib/chart/core/selectionGeometry.d.ts +45 -0
- package/lib/chart/core/selectionGeometry.d.ts.map +1 -0
- package/lib/chart/core/selectionGeometry.js +49 -0
- package/lib/chart/core/selectionGeometry.js.map +1 -0
- package/lib/chart/core/spectrumColor.d.ts +80 -0
- package/lib/chart/core/spectrumColor.d.ts.map +1 -0
- package/lib/chart/core/spectrumColor.js +120 -0
- package/lib/chart/core/spectrumColor.js.map +1 -0
- package/lib/chart/core/stackCapacity.d.ts +136 -0
- package/lib/chart/core/stackCapacity.d.ts.map +1 -0
- package/lib/chart/core/stackCapacity.js +153 -0
- package/lib/chart/core/stackCapacity.js.map +1 -0
- package/lib/chart/core/svgPoint.d.ts +62 -0
- package/lib/chart/core/svgPoint.d.ts.map +1 -0
- package/lib/chart/core/svgPoint.js +43 -0
- package/lib/chart/core/svgPoint.js.map +1 -0
- package/lib/chart/core/tracePath.d.ts +94 -0
- package/lib/chart/core/tracePath.d.ts.map +1 -0
- package/lib/chart/core/tracePath.js +191 -0
- package/lib/chart/core/tracePath.js.map +1 -0
- package/lib/chart/core/trackerReadout.d.ts +55 -0
- package/lib/chart/core/trackerReadout.d.ts.map +1 -0
- package/lib/chart/core/trackerReadout.js +53 -0
- package/lib/chart/core/trackerReadout.js.map +1 -0
- package/lib/chart/core/viewTransform.d.ts +167 -0
- package/lib/chart/core/viewTransform.d.ts.map +1 -0
- package/lib/chart/core/viewTransform.js +188 -0
- package/lib/chart/core/viewTransform.js.map +1 -0
- package/lib/chart/core/zoomDomain.d.ts +127 -0
- package/lib/chart/core/zoomDomain.d.ts.map +1 -0
- package/lib/chart/core/zoomDomain.js +175 -0
- package/lib/chart/core/zoomDomain.js.map +1 -0
- package/lib/chart/ui/Axes.d.ts +104 -0
- package/lib/chart/ui/Axes.d.ts.map +1 -0
- package/lib/chart/ui/Axes.js +155 -0
- package/lib/chart/ui/Axes.js.map +1 -0
- package/lib/chart/ui/AxisGuide.d.ts +60 -0
- package/lib/chart/ui/AxisGuide.d.ts.map +1 -0
- package/lib/chart/ui/AxisGuide.js +111 -0
- package/lib/chart/ui/AxisGuide.js.map +1 -0
- package/lib/chart/ui/ChartStack.d.ts +81 -0
- package/lib/chart/ui/ChartStack.d.ts.map +1 -0
- package/lib/chart/ui/ChartStack.js +42 -0
- package/lib/chart/ui/ChartStack.js.map +1 -0
- package/lib/chart/ui/ChartTracker.d.ts +36 -0
- package/lib/chart/ui/ChartTracker.d.ts.map +1 -0
- package/lib/chart/ui/ChartTracker.js +27 -0
- package/lib/chart/ui/ChartTracker.js.map +1 -0
- package/lib/chart/ui/PlotCaption.d.ts +44 -0
- package/lib/chart/ui/PlotCaption.d.ts.map +1 -0
- package/lib/chart/ui/PlotCaption.js +68 -0
- package/lib/chart/ui/PlotCaption.js.map +1 -0
- package/lib/chart/ui/SelectionRect.d.ts +27 -0
- package/lib/chart/ui/SelectionRect.d.ts.map +1 -0
- package/lib/chart/ui/SelectionRect.js +31 -0
- package/lib/chart/ui/SelectionRect.js.map +1 -0
- package/lib/chart/ui/TraceLegend.d.ts +99 -0
- package/lib/chart/ui/TraceLegend.d.ts.map +1 -0
- package/lib/chart/ui/TraceLegend.js +45 -0
- package/lib/chart/ui/TraceLegend.js.map +1 -0
- package/lib/chart/ui/chartGestures.d.ts +158 -0
- package/lib/chart/ui/chartGestures.d.ts.map +1 -0
- package/lib/chart/ui/chartGestures.js +145 -0
- package/lib/chart/ui/chartGestures.js.map +1 -0
- package/lib/chart/ui/chartStackLevel.d.ts +115 -0
- package/lib/chart/ui/chartStackLevel.d.ts.map +1 -0
- package/lib/chart/ui/chartStackLevel.js +96 -0
- package/lib/chart/ui/chartStackLevel.js.map +1 -0
- package/lib/chart/ui/chartSurface.d.ts +35 -0
- package/lib/chart/ui/chartSurface.d.ts.map +1 -0
- package/lib/chart/ui/chartSurface.js +58 -0
- package/lib/chart/ui/chartSurface.js.map +1 -0
- package/lib/chart/ui/index.d.ts +24 -0
- package/lib/chart/ui/index.d.ts.map +1 -1
- package/lib/chart/ui/index.js +13 -0
- package/lib/chart/ui/index.js.map +1 -1
- package/lib/chart/ui/useChartPointer.d.ts +124 -0
- package/lib/chart/ui/useChartPointer.d.ts.map +1 -0
- package/lib/chart/ui/useChartPointer.js +152 -0
- package/lib/chart/ui/useChartPointer.js.map +1 -0
- package/lib/chart/ui/useChartSize.d.ts +49 -0
- package/lib/chart/ui/useChartSize.d.ts.map +1 -0
- package/lib/chart/ui/useChartSize.js +91 -0
- package/lib/chart/ui/useChartSize.js.map +1 -0
- package/lib/chart/ui/useChartWindow.d.ts +147 -0
- package/lib/chart/ui/useChartWindow.d.ts.map +1 -0
- package/lib/chart/ui/useChartWindow.js +135 -0
- package/lib/chart/ui/useChartWindow.js.map +1 -0
- package/lib/chart/ui/useChartZoom.d.ts +88 -0
- package/lib/chart/ui/useChartZoom.d.ts.map +1 -0
- package/lib/chart/ui/useChartZoom.js +142 -0
- package/lib/chart/ui/useChartZoom.js.map +1 -0
- package/lib/chart/ui/useWheelListener.d.ts +30 -0
- package/lib/chart/ui/useWheelListener.d.ts.map +1 -0
- package/lib/chart/ui/useWheelListener.js +57 -0
- package/lib/chart/ui/useWheelListener.js.map +1 -0
- package/lib/clipboard/core/copyPng.d.ts +13 -0
- package/lib/clipboard/core/copyPng.d.ts.map +1 -0
- package/lib/clipboard/core/copyPng.js +19 -0
- package/lib/clipboard/core/copyPng.js.map +1 -0
- package/lib/clipboard/core/index.d.ts +1 -0
- package/lib/clipboard/core/index.d.ts.map +1 -1
- package/lib/clipboard/core/index.js +1 -0
- package/lib/clipboard/core/index.js.map +1 -1
- package/lib/clipboard/ui/CopyableValue.d.ts +12 -9
- package/lib/clipboard/ui/CopyableValue.d.ts.map +1 -1
- package/lib/clipboard/ui/CopyableValue.js +11 -15
- package/lib/clipboard/ui/CopyableValue.js.map +1 -1
- package/lib/core.d.ts +1 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +1 -0
- package/lib/core.js.map +1 -1
- package/lib/download/core/exportStyles.d.ts +22 -0
- package/lib/download/core/exportStyles.d.ts.map +1 -0
- package/lib/download/core/exportStyles.js +19 -0
- package/lib/download/core/exportStyles.js.map +1 -0
- package/lib/download/core/imageResolution.d.ts +88 -0
- package/lib/download/core/imageResolution.d.ts.map +1 -0
- package/lib/download/core/imageResolution.js +77 -0
- package/lib/download/core/imageResolution.js.map +1 -0
- package/lib/download/core/index.d.ts +13 -0
- package/lib/download/core/index.d.ts.map +1 -1
- package/lib/download/core/index.js +8 -0
- package/lib/download/core/index.js.map +1 -1
- package/lib/download/core/pictureExport.d.ts +93 -0
- package/lib/download/core/pictureExport.d.ts.map +1 -0
- package/lib/download/core/pictureExport.js +116 -0
- package/lib/download/core/pictureExport.js.map +1 -0
- package/lib/download/core/stackedDrawing.d.ts +36 -0
- package/lib/download/core/stackedDrawing.d.ts.map +1 -0
- package/lib/download/core/stackedDrawing.js +98 -0
- package/lib/download/core/stackedDrawing.js.map +1 -0
- package/lib/download/core/svgBounds.d.ts +44 -0
- package/lib/download/core/svgBounds.d.ts.map +1 -0
- package/lib/download/core/svgBounds.js +69 -0
- package/lib/download/core/svgBounds.js.map +1 -0
- package/lib/download/core/svgNamespace.d.ts +9 -0
- package/lib/download/core/svgNamespace.d.ts.map +1 -0
- package/lib/download/core/svgNamespace.js +10 -0
- package/lib/download/core/svgNamespace.js.map +1 -0
- package/lib/download/core/svgToPng.d.ts +43 -0
- package/lib/download/core/svgToPng.d.ts.map +1 -0
- package/lib/download/core/svgToPng.js +79 -0
- package/lib/download/core/svgToPng.js.map +1 -0
- package/lib/download/core/svgToString.d.ts +45 -0
- package/lib/download/core/svgToString.d.ts.map +1 -0
- package/lib/download/core/svgToString.js +58 -0
- package/lib/download/core/svgToString.js.map +1 -0
- package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
- package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
- package/lib/download/ui/ExportDialogFrame.js +24 -0
- package/lib/download/ui/ExportDialogFrame.js.map +1 -0
- package/lib/download/ui/ExportImageDialog.d.ts +47 -0
- package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
- package/lib/download/ui/ExportImageDialog.js +25 -0
- package/lib/download/ui/ExportImageDialog.js.map +1 -0
- package/lib/download/ui/ExportNameField.d.ts +29 -0
- package/lib/download/ui/ExportNameField.d.ts.map +1 -0
- package/lib/download/ui/ExportNameField.js +99 -0
- package/lib/download/ui/ExportNameField.js.map +1 -0
- package/lib/download/ui/ExportPictureSection.d.ts +38 -0
- package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
- package/lib/download/ui/ExportPictureSection.js +48 -0
- package/lib/download/ui/ExportPictureSection.js.map +1 -0
- package/lib/download/ui/index.d.ts +10 -0
- package/lib/download/ui/index.d.ts.map +1 -1
- package/lib/download/ui/index.js +5 -0
- package/lib/download/ui/index.js.map +1 -1
- package/lib/download/ui/useDrawingBox.d.ts +23 -0
- package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
- package/lib/download/ui/useDrawingBox.js +21 -0
- package/lib/download/ui/useDrawingBox.js.map +1 -0
- package/lib/error/core/describeSource.d.ts +17 -0
- package/lib/error/core/describeSource.d.ts.map +1 -0
- package/lib/error/core/describeSource.js +19 -0
- package/lib/error/core/describeSource.js.map +1 -0
- package/lib/error/core/index.d.ts +1 -0
- package/lib/error/core/index.d.ts.map +1 -1
- package/lib/error/core/index.js +1 -0
- package/lib/error/core/index.js.map +1 -1
- package/lib/help/ui/HelpBody.d.ts +10 -1
- package/lib/help/ui/HelpBody.d.ts.map +1 -1
- package/lib/help/ui/HelpBody.js +24 -1
- package/lib/help/ui/HelpBody.js.map +1 -1
- package/lib/help/ui/index.d.ts +1 -1
- package/lib/help/ui/index.d.ts.map +1 -1
- package/lib/help/ui/index.js.map +1 -1
- package/lib/ir/core/analysisSpectra.d.ts +46 -0
- package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
- package/lib/ir/core/analysisSpectra.js +187 -0
- package/lib/ir/core/analysisSpectra.js.map +1 -0
- package/lib/ir/core/assignBands.d.ts +83 -0
- package/lib/ir/core/assignBands.d.ts.map +1 -0
- package/lib/ir/core/assignBands.js +83 -0
- package/lib/ir/core/assignBands.js.map +1 -0
- package/lib/ir/core/bandAssignments.d.ts +47 -0
- package/lib/ir/core/bandAssignments.d.ts.map +1 -0
- package/lib/ir/core/bandAssignments.js +305 -0
- package/lib/ir/core/bandAssignments.js.map +1 -0
- package/lib/ir/core/bandLabelPlan.d.ts +93 -0
- package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
- package/lib/ir/core/bandLabelPlan.js +104 -0
- package/lib/ir/core/bandLabelPlan.js.map +1 -0
- package/lib/ir/core/detectIrFormat.d.ts +23 -0
- package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
- package/lib/ir/core/detectIrFormat.js +133 -0
- package/lib/ir/core/detectIrFormat.js.map +1 -0
- package/lib/ir/core/downloadSpectra.d.ts +26 -0
- package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
- package/lib/ir/core/downloadSpectra.js +37 -0
- package/lib/ir/core/downloadSpectra.js.map +1 -0
- package/lib/ir/core/fromJcamp.d.ts +35 -0
- package/lib/ir/core/fromJcamp.d.ts.map +1 -0
- package/lib/ir/core/fromJcamp.js +48 -0
- package/lib/ir/core/fromJcamp.js.map +1 -0
- package/lib/ir/core/fromSpc.d.ts +30 -0
- package/lib/ir/core/fromSpc.d.ts.map +1 -0
- package/lib/ir/core/fromSpc.js +40 -0
- package/lib/ir/core/fromSpc.js.map +1 -0
- package/lib/ir/core/index.d.ts +51 -0
- package/lib/ir/core/index.d.ts.map +1 -0
- package/lib/ir/core/index.js +35 -0
- package/lib/ir/core/index.js.map +1 -0
- package/lib/ir/core/irBand.d.ts +45 -0
- package/lib/ir/core/irBand.d.ts.map +1 -0
- package/lib/ir/core/irBand.js +30 -0
- package/lib/ir/core/irBand.js.map +1 -0
- package/lib/ir/core/irCommands.d.ts +168 -0
- package/lib/ir/core/irCommands.d.ts.map +1 -0
- package/lib/ir/core/irCommands.js +94 -0
- package/lib/ir/core/irCommands.js.map +1 -0
- package/lib/ir/core/irDomain.d.ts +63 -0
- package/lib/ir/core/irDomain.d.ts.map +1 -0
- package/lib/ir/core/irDomain.js +136 -0
- package/lib/ir/core/irDomain.js.map +1 -0
- package/lib/ir/core/irEditorApi.d.ts +42 -0
- package/lib/ir/core/irEditorApi.d.ts.map +1 -0
- package/lib/ir/core/irEditorApi.js +10 -0
- package/lib/ir/core/irEditorApi.js.map +1 -0
- package/lib/ir/core/irFormat.d.ts +42 -0
- package/lib/ir/core/irFormat.d.ts.map +1 -0
- package/lib/ir/core/irFormat.js +51 -0
- package/lib/ir/core/irFormat.js.map +1 -0
- package/lib/ir/core/irMode.d.ts +160 -0
- package/lib/ir/core/irMode.d.ts.map +1 -0
- package/lib/ir/core/irMode.js +175 -0
- package/lib/ir/core/irMode.js.map +1 -0
- package/lib/ir/core/irReducer.d.ts +101 -0
- package/lib/ir/core/irReducer.d.ts.map +1 -0
- package/lib/ir/core/irReducer.js +207 -0
- package/lib/ir/core/irReducer.js.map +1 -0
- package/lib/ir/core/irSidePanels.d.ts +22 -0
- package/lib/ir/core/irSidePanels.d.ts.map +1 -0
- package/lib/ir/core/irSidePanels.js +12 -0
- package/lib/ir/core/irSidePanels.js.map +1 -0
- package/lib/ir/core/irSpectrum.d.ts +140 -0
- package/lib/ir/core/irSpectrum.d.ts.map +1 -0
- package/lib/ir/core/irSpectrum.js +34 -0
- package/lib/ir/core/irSpectrum.js.map +1 -0
- package/lib/ir/core/irState.d.ts +119 -0
- package/lib/ir/core/irState.d.ts.map +1 -0
- package/lib/ir/core/irState.js +92 -0
- package/lib/ir/core/irState.js.map +1 -0
- package/lib/ir/core/loadIrSpectra.d.ts +36 -0
- package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
- package/lib/ir/core/loadIrSpectra.js +44 -0
- package/lib/ir/core/loadIrSpectra.js.map +1 -0
- package/lib/ir/core/nearestBand.d.ts +35 -0
- package/lib/ir/core/nearestBand.d.ts.map +1 -0
- package/lib/ir/core/nearestBand.js +47 -0
- package/lib/ir/core/nearestBand.js.map +1 -0
- package/lib/ir/core/pickBands.d.ts +70 -0
- package/lib/ir/core/pickBands.d.ts.map +1 -0
- package/lib/ir/core/pickBands.js +125 -0
- package/lib/ir/core/pickBands.js.map +1 -0
- package/lib/ir/core/spectrumJcamp.d.ts +58 -0
- package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
- package/lib/ir/core/spectrumJcamp.js +156 -0
- package/lib/ir/core/spectrumJcamp.js.map +1 -0
- package/lib/ir/core/toIrSpectrum.d.ts +59 -0
- package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
- package/lib/ir/core/toIrSpectrum.js +56 -0
- package/lib/ir/core/toIrSpectrum.js.map +1 -0
- package/lib/ir/ui/BandMarks.d.ts +52 -0
- package/lib/ir/ui/BandMarks.d.ts.map +1 -0
- package/lib/ir/ui/BandMarks.js +71 -0
- package/lib/ir/ui/BandMarks.js.map +1 -0
- package/lib/ir/ui/BandsPanel.d.ts +31 -0
- package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
- package/lib/ir/ui/BandsPanel.js +94 -0
- package/lib/ir/ui/BandsPanel.js.map +1 -0
- package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
- package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
- package/lib/ir/ui/IrAboutDialog.js +32 -0
- package/lib/ir/ui/IrAboutDialog.js.map +1 -0
- package/lib/ir/ui/IrCanvas.d.ts +38 -0
- package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
- package/lib/ir/ui/IrCanvas.js +41 -0
- package/lib/ir/ui/IrCanvas.js.map +1 -0
- package/lib/ir/ui/IrChart.d.ts +28 -0
- package/lib/ir/ui/IrChart.d.ts.map +1 -0
- package/lib/ir/ui/IrChart.js +114 -0
- package/lib/ir/ui/IrChart.js.map +1 -0
- package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
- package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
- package/lib/ir/ui/IrCommandProvider.js +14 -0
- package/lib/ir/ui/IrCommandProvider.js.map +1 -0
- package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
- package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
- package/lib/ir/ui/IrCommandTooltip.js +22 -0
- package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
- package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
- package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
- package/lib/ir/ui/IrDocumentationDialog.js +68 -0
- package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
- package/lib/ir/ui/IrEditor.d.ts +60 -0
- package/lib/ir/ui/IrEditor.d.ts.map +1 -0
- package/lib/ir/ui/IrEditor.js +42 -0
- package/lib/ir/ui/IrEditor.js.map +1 -0
- package/lib/ir/ui/IrHeader.d.ts +13 -0
- package/lib/ir/ui/IrHeader.d.ts.map +1 -0
- package/lib/ir/ui/IrHeader.js +21 -0
- package/lib/ir/ui/IrHeader.js.map +1 -0
- package/lib/ir/ui/IrLogo.d.ts +20 -0
- package/lib/ir/ui/IrLogo.d.ts.map +1 -0
- package/lib/ir/ui/IrLogo.js +17 -0
- package/lib/ir/ui/IrLogo.js.map +1 -0
- package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
- package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
- package/lib/ir/ui/IrPointerTracker.js +47 -0
- package/lib/ir/ui/IrPointerTracker.js.map +1 -0
- package/lib/ir/ui/IrShell.d.ts +25 -0
- package/lib/ir/ui/IrShell.d.ts.map +1 -0
- package/lib/ir/ui/IrShell.js +178 -0
- package/lib/ir/ui/IrShell.js.map +1 -0
- package/lib/ir/ui/IrSidePanel.d.ts +26 -0
- package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
- package/lib/ir/ui/IrSidePanel.js +39 -0
- package/lib/ir/ui/IrSidePanel.js.map +1 -0
- package/lib/ir/ui/IrStateProvider.d.ts +19 -0
- package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
- package/lib/ir/ui/IrStateProvider.js +16 -0
- package/lib/ir/ui/IrStateProvider.js.map +1 -0
- package/lib/ir/ui/IrStatusBar.d.ts +14 -0
- package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
- package/lib/ir/ui/IrStatusBar.js +48 -0
- package/lib/ir/ui/IrStatusBar.js.map +1 -0
- package/lib/ir/ui/IrToolbar.d.ts +18 -0
- package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
- package/lib/ir/ui/IrToolbar.js +32 -0
- package/lib/ir/ui/IrToolbar.js.map +1 -0
- package/lib/ir/ui/IrTraces.d.ts +63 -0
- package/lib/ir/ui/IrTraces.d.ts.map +1 -0
- package/lib/ir/ui/IrTraces.js +72 -0
- package/lib/ir/ui/IrTraces.js.map +1 -0
- package/lib/ir/ui/MetadataPanel.d.ts +15 -0
- package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
- package/lib/ir/ui/MetadataPanel.js +49 -0
- package/lib/ir/ui/MetadataPanel.js.map +1 -0
- package/lib/ir/ui/SpectraPanel.d.ts +20 -0
- package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
- package/lib/ir/ui/SpectraPanel.js +42 -0
- package/lib/ir/ui/SpectraPanel.js.map +1 -0
- package/lib/ir/ui/SpectrumRow.d.ts +26 -0
- package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
- package/lib/ir/ui/SpectrumRow.js +41 -0
- package/lib/ir/ui/SpectrumRow.js.map +1 -0
- package/lib/ir/ui/index.d.ts +56 -0
- package/lib/ir/ui/index.d.ts.map +1 -0
- package/lib/ir/ui/index.js +36 -0
- package/lib/ir/ui/index.js.map +1 -0
- package/lib/ir/ui/irActions.d.ts +52 -0
- package/lib/ir/ui/irActions.d.ts.map +1 -0
- package/lib/ir/ui/irActions.js +62 -0
- package/lib/ir/ui/irActions.js.map +1 -0
- package/lib/ir/ui/irChartProps.d.ts +116 -0
- package/lib/ir/ui/irChartProps.d.ts.map +1 -0
- package/lib/ir/ui/irChartProps.js +14 -0
- package/lib/ir/ui/irChartProps.js.map +1 -0
- package/lib/ir/ui/irCommandContext.d.ts +35 -0
- package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
- package/lib/ir/ui/irCommandContext.js +44 -0
- package/lib/ir/ui/irCommandContext.js.map +1 -0
- package/lib/ir/ui/irStateContext.d.ts +26 -0
- package/lib/ir/ui/irStateContext.d.ts.map +1 -0
- package/lib/ir/ui/irStateContext.js +37 -0
- package/lib/ir/ui/irStateContext.js.map +1 -0
- package/lib/ir/ui/useIrEditor.d.ts +51 -0
- package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
- package/lib/ir/ui/useIrEditor.js +88 -0
- package/lib/ir/ui/useIrEditor.js.map +1 -0
- package/lib/ir/ui/useIrPointer.d.ts +66 -0
- package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
- package/lib/ir/ui/useIrPointer.js +53 -0
- package/lib/ir/ui/useIrPointer.js.map +1 -0
- package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
- package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
- package/lib/ir/ui/useIrShortcuts.js +73 -0
- package/lib/ir/ui/useIrShortcuts.js.map +1 -0
- package/lib/ir/ui/useIrZoom.d.ts +51 -0
- package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
- package/lib/ir/ui/useIrZoom.js +46 -0
- package/lib/ir/ui/useIrZoom.js.map +1 -0
- package/lib/ir.d.ts +13 -0
- package/lib/ir.d.ts.map +1 -0
- package/lib/ir.js +13 -0
- package/lib/ir.js.map +1 -0
- package/lib/panel/core/dialogStyles.d.ts +13 -0
- package/lib/panel/core/dialogStyles.d.ts.map +1 -0
- package/lib/panel/core/dialogStyles.js +11 -0
- package/lib/panel/core/dialogStyles.js.map +1 -0
- package/lib/panel/core/index.d.ts +19 -0
- package/lib/panel/core/index.d.ts.map +1 -0
- package/lib/panel/core/index.js +18 -0
- package/lib/panel/core/index.js.map +1 -0
- package/lib/panel/core/isEditingField.d.ts +17 -0
- package/lib/panel/core/isEditingField.d.ts.map +1 -0
- package/lib/panel/core/isEditingField.js +25 -0
- package/lib/panel/core/isEditingField.js.map +1 -0
- package/lib/panel/core/panelStyles.d.ts +242 -0
- package/lib/panel/core/panelStyles.d.ts.map +1 -0
- package/lib/panel/core/panelStyles.js +228 -0
- package/lib/panel/core/panelStyles.js.map +1 -0
- package/lib/panel/core/rowSpacers.d.ts +38 -0
- package/lib/panel/core/rowSpacers.d.ts.map +1 -0
- package/lib/panel/core/rowSpacers.js +31 -0
- package/lib/panel/core/rowSpacers.js.map +1 -0
- package/lib/panel/core/statusBar.d.ts +44 -0
- package/lib/panel/core/statusBar.d.ts.map +1 -0
- package/lib/panel/core/statusBar.js +40 -0
- package/lib/panel/core/statusBar.js.map +1 -0
- package/lib/panel/core/textFilter.d.ts +22 -0
- package/lib/panel/core/textFilter.d.ts.map +1 -0
- package/lib/panel/core/textFilter.js +32 -0
- package/lib/panel/core/textFilter.js.map +1 -0
- package/lib/panel/core/yieldToPainting.d.ts +17 -0
- package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
- package/lib/panel/core/yieldToPainting.js +21 -0
- package/lib/panel/core/yieldToPainting.js.map +1 -0
- package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
- package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
- package/lib/panel/ui/AboutDialogFrame.js +43 -0
- package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
- package/lib/panel/ui/ClearButton.d.ts +28 -0
- package/lib/panel/ui/ClearButton.d.ts.map +1 -0
- package/lib/panel/ui/ClearButton.js +23 -0
- package/lib/panel/ui/ClearButton.js.map +1 -0
- package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
- package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
- package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
- package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
- package/lib/panel/ui/FilterInput.d.ts +31 -0
- package/lib/panel/ui/FilterInput.d.ts.map +1 -0
- package/lib/panel/ui/FilterInput.js +23 -0
- package/lib/panel/ui/FilterInput.js.map +1 -0
- package/lib/panel/ui/HelpLabel.d.ts +24 -0
- package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
- package/lib/panel/ui/HelpLabel.js +23 -0
- package/lib/panel/ui/HelpLabel.js.map +1 -0
- package/lib/panel/ui/PanelMessage.d.ts +41 -0
- package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
- package/lib/panel/ui/PanelMessage.js +30 -0
- package/lib/panel/ui/PanelMessage.js.map +1 -0
- package/lib/panel/ui/PanelRail.d.ts +41 -0
- package/lib/panel/ui/PanelRail.d.ts.map +1 -0
- package/lib/panel/ui/PanelRail.js +12 -0
- package/lib/panel/ui/PanelRail.js.map +1 -0
- package/lib/panel/ui/Section.d.ts +25 -0
- package/lib/panel/ui/Section.d.ts.map +1 -0
- package/lib/panel/ui/Section.js +41 -0
- package/lib/panel/ui/Section.js.map +1 -0
- package/lib/panel/ui/SidePanelStack.d.ts +62 -0
- package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
- package/lib/panel/ui/SidePanelStack.js +40 -0
- package/lib/panel/ui/SidePanelStack.js.map +1 -0
- package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
- package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
- package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
- package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
- package/lib/panel/ui/index.d.ts +37 -0
- package/lib/panel/ui/index.d.ts.map +1 -0
- package/lib/panel/ui/index.js +24 -0
- package/lib/panel/ui/index.js.map +1 -0
- package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
- package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
- package/lib/panel/ui/useConfirmOnEnter.js +64 -0
- package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
- package/lib/panel/ui/useFilterBox.d.ts +23 -0
- package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
- package/lib/panel/ui/useFilterBox.js +22 -0
- package/lib/panel/ui/useFilterBox.js.map +1 -0
- package/lib/panel/ui/useVirtualRows.d.ts +46 -0
- package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
- package/lib/panel/ui/useVirtualRows.js +56 -0
- package/lib/panel/ui/useVirtualRows.js.map +1 -0
- package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
- package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
- package/lib/panel/ui/useVirtualWindowRows.js +65 -0
- package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
- package/lib/ui.d.ts +1 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +1 -0
- package/lib/ui.js.map +1 -1
- package/package.json +8 -1
- package/src/chart/core/axisLabels.ts +117 -0
- package/src/chart/core/boxLayout.ts +126 -0
- package/src/chart/core/chartAxisScale.ts +92 -10
- package/src/chart/core/chartDomain.ts +185 -0
- package/src/chart/core/chartGeometry.ts +159 -0
- package/src/chart/core/chartPane.ts +10 -0
- package/src/chart/core/chartScale.ts +7 -4
- package/src/chart/core/chartTheme.ts +161 -0
- package/src/chart/core/chartViewport.ts +40 -13
- package/src/chart/core/guidePlacement.ts +66 -0
- package/src/chart/core/index.ts +121 -2
- package/src/chart/core/labelStack.ts +72 -0
- package/src/chart/core/legendBox.ts +263 -0
- package/src/chart/core/selectionGeometry.ts +68 -0
- package/src/chart/core/spectrumColor.ts +129 -0
- package/src/chart/core/stackCapacity.ts +162 -0
- package/src/chart/core/svgPoint.ts +77 -0
- package/src/chart/core/tracePath.ts +228 -0
- package/src/chart/core/trackerReadout.ts +78 -0
- package/src/chart/core/viewTransform.ts +287 -0
- package/src/chart/core/zoomDomain.ts +235 -0
- package/src/chart/ui/Axes.tsx +361 -0
- package/src/chart/ui/AxisGuide.tsx +187 -0
- package/src/chart/ui/ChartStack.tsx +130 -0
- package/src/chart/ui/ChartTracker.tsx +101 -0
- package/src/chart/ui/PlotCaption.tsx +108 -0
- package/src/chart/ui/SelectionRect.tsx +52 -0
- package/src/chart/ui/TraceLegend.tsx +193 -0
- package/src/chart/ui/chartGestures.ts +270 -0
- package/src/chart/ui/chartStackLevel.tsx +210 -0
- package/src/chart/ui/chartSurface.ts +66 -0
- package/src/chart/ui/index.ts +35 -0
- package/src/chart/ui/useChartPointer.ts +223 -0
- package/src/chart/ui/useChartSize.ts +115 -0
- package/src/chart/ui/useChartWindow.ts +240 -0
- package/src/chart/ui/useChartZoom.ts +255 -0
- package/src/chart/ui/useWheelListener.ts +62 -0
- package/src/clipboard/core/copyPng.ts +20 -0
- package/src/clipboard/core/index.ts +1 -0
- package/src/clipboard/ui/CopyableValue.tsx +22 -35
- package/src/core.ts +1 -0
- package/src/download/core/exportStyles.ts +20 -0
- package/src/download/core/imageResolution.ts +118 -0
- package/src/download/core/index.ts +34 -0
- package/src/download/core/pictureExport.ts +207 -0
- package/src/download/core/stackedDrawing.ts +108 -0
- package/src/download/core/svgBounds.ts +80 -0
- package/src/download/core/svgNamespace.ts +9 -0
- package/src/download/core/svgToPng.ts +121 -0
- package/src/download/core/svgToString.ts +95 -0
- package/src/download/ui/ExportDialogFrame.tsx +86 -0
- package/src/download/ui/ExportImageDialog.tsx +91 -0
- package/src/download/ui/ExportNameField.tsx +148 -0
- package/src/download/ui/ExportPictureSection.tsx +142 -0
- package/src/download/ui/index.ts +11 -0
- package/src/download/ui/useDrawingBox.ts +37 -0
- package/src/error/core/describeSource.ts +18 -0
- package/src/error/core/index.ts +1 -0
- package/src/help/ui/HelpBody.tsx +41 -2
- package/src/help/ui/index.ts +6 -1
- package/src/ir/core/analysisSpectra.ts +231 -0
- package/src/ir/core/assignBands.ts +144 -0
- package/src/ir/core/bandAssignments.ts +329 -0
- package/src/ir/core/bandLabelPlan.ts +194 -0
- package/src/ir/core/detectIrFormat.ts +139 -0
- package/src/ir/core/downloadSpectra.ts +57 -0
- package/src/ir/core/fromJcamp.ts +70 -0
- package/src/ir/core/fromSpc.ts +61 -0
- package/src/ir/core/index.ts +113 -0
- package/src/ir/core/irBand.ts +57 -0
- package/src/ir/core/irCommands.ts +154 -0
- package/src/ir/core/irDomain.ts +163 -0
- package/src/ir/core/irEditorApi.ts +44 -0
- package/src/ir/core/irFormat.ts +57 -0
- package/src/ir/core/irMode.ts +203 -0
- package/src/ir/core/irReducer.ts +273 -0
- package/src/ir/core/irSidePanels.ts +20 -0
- package/src/ir/core/irSpectrum.ts +155 -0
- package/src/ir/core/irState.ts +173 -0
- package/src/ir/core/loadIrSpectra.ts +79 -0
- package/src/ir/core/nearestBand.ts +57 -0
- package/src/ir/core/pickBands.ts +181 -0
- package/src/ir/core/spectrumJcamp.ts +178 -0
- package/src/ir/core/toIrSpectrum.ts +102 -0
- package/src/ir/ui/BandMarks.tsx +166 -0
- package/src/ir/ui/BandsPanel.tsx +271 -0
- package/src/ir/ui/IrAboutDialog.tsx +121 -0
- package/src/ir/ui/IrCanvas.tsx +91 -0
- package/src/ir/ui/IrChart.tsx +215 -0
- package/src/ir/ui/IrCommandProvider.tsx +32 -0
- package/src/ir/ui/IrCommandTooltip.tsx +36 -0
- package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
- package/src/ir/ui/IrEditor.tsx +99 -0
- package/src/ir/ui/IrHeader.tsx +39 -0
- package/src/ir/ui/IrLogo.tsx +49 -0
- package/src/ir/ui/IrPointerTracker.tsx +102 -0
- package/src/ir/ui/IrShell.tsx +285 -0
- package/src/ir/ui/IrSidePanel.tsx +78 -0
- package/src/ir/ui/IrStateProvider.tsx +32 -0
- package/src/ir/ui/IrStatusBar.tsx +97 -0
- package/src/ir/ui/IrToolbar.tsx +102 -0
- package/src/ir/ui/IrTraces.tsx +134 -0
- package/src/ir/ui/MetadataPanel.tsx +88 -0
- package/src/ir/ui/SpectraPanel.tsx +114 -0
- package/src/ir/ui/SpectrumRow.tsx +127 -0
- package/src/ir/ui/index.ts +56 -0
- package/src/ir/ui/irActions.ts +103 -0
- package/src/ir/ui/irChartProps.ts +118 -0
- package/src/ir/ui/irCommandContext.tsx +62 -0
- package/src/ir/ui/irStateContext.ts +48 -0
- package/src/ir/ui/useIrEditor.ts +139 -0
- package/src/ir/ui/useIrPointer.ts +109 -0
- package/src/ir/ui/useIrShortcuts.ts +95 -0
- package/src/ir/ui/useIrZoom.ts +86 -0
- package/src/ir.ts +13 -0
- package/src/panel/core/dialogStyles.ts +11 -0
- package/src/panel/core/index.ts +47 -0
- package/src/panel/core/isEditingField.ts +23 -0
- package/src/panel/core/panelStyles.ts +248 -0
- package/src/panel/core/rowSpacers.ts +50 -0
- package/src/panel/core/statusBar.ts +48 -0
- package/src/panel/core/textFilter.ts +33 -0
- package/src/panel/core/yieldToPainting.ts +20 -0
- package/src/panel/ui/AboutDialogFrame.tsx +100 -0
- package/src/panel/ui/ClearButton.tsx +42 -0
- package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
- package/src/panel/ui/FilterInput.tsx +60 -0
- package/src/panel/ui/HelpLabel.tsx +43 -0
- package/src/panel/ui/PanelMessage.tsx +64 -0
- package/src/panel/ui/PanelRail.tsx +64 -0
- package/src/panel/ui/Section.tsx +66 -0
- package/src/panel/ui/SidePanelStack.tsx +109 -0
- package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
- package/src/panel/ui/index.ts +47 -0
- package/src/panel/ui/useConfirmOnEnter.ts +68 -0
- package/src/panel/ui/useFilterBox.ts +35 -0
- package/src/panel/ui/useVirtualRows.ts +82 -0
- package/src/panel/ui/useVirtualWindowRows.ts +86 -0
- package/src/ui.ts +1 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The step every reader shares: an `ir-spectrum` `Analysis` becomes spectra.
|
|
3
|
+
*
|
|
4
|
+
* All three readers hand back the same `Analysis`, and `ir-spectrum` has already
|
|
5
|
+
* done the part that needs to know what the file's y axis meant — it puts an `a`
|
|
6
|
+
* and a `t` variable on every spectrum whichever of the two was written. So what
|
|
7
|
+
* is left here is bookkeeping: order the points, type the arrays, read the
|
|
8
|
+
* records, and say which axis the file itself carried.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { DoubleArray, MeasurementXY } from 'cheminfo-types';
|
|
12
|
+
import type { Analysis } from 'ir-spectrum';
|
|
13
|
+
import { xySortX } from 'ml-spectra-processing';
|
|
14
|
+
|
|
15
|
+
import type { IrMeta, IrMode, IrOrigin } from './irSpectrum.ts';
|
|
16
|
+
|
|
17
|
+
/** One spectrum as a reader produced it, before it is named and coloured. */
|
|
18
|
+
export interface LoadedIrSpectrum {
|
|
19
|
+
/** The wavenumbers, ascending. */
|
|
20
|
+
wavenumber: Float64Array;
|
|
21
|
+
/** Absorbance at each. */
|
|
22
|
+
absorbance: Float64Array;
|
|
23
|
+
/** Percent transmittance at each. */
|
|
24
|
+
transmittance: Float64Array;
|
|
25
|
+
/** What the file said about the acquisition, `null` when it said nothing. */
|
|
26
|
+
meta: IrMeta | null;
|
|
27
|
+
/** Where it came from. */
|
|
28
|
+
origin: IrOrigin;
|
|
29
|
+
/**
|
|
30
|
+
* What the file called it, absent when it carried no title.
|
|
31
|
+
* @default undefined
|
|
32
|
+
*/
|
|
33
|
+
name?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Turn every spectrum an analysis holds into one loaded spectrum.
|
|
38
|
+
*
|
|
39
|
+
* All of them, never the first: a JCAMP is a container, and an instrument
|
|
40
|
+
* exporting a background beside a sample writes both as blocks of one file.
|
|
41
|
+
* Taking only the first would quietly drop what the chemist exported the file
|
|
42
|
+
* for, and would do it without an error.
|
|
43
|
+
*
|
|
44
|
+
* A block carrying fewer than two points is skipped rather than kept as a
|
|
45
|
+
* degenerate trace — a JCAMP link block, or a header block an instrument wrote
|
|
46
|
+
* with no data under it, is not a spectrum.
|
|
47
|
+
* @param analysis - What the reader built.
|
|
48
|
+
* @param origin - Where it came from: the format and the file.
|
|
49
|
+
* @returns One entry per readable block, in the order the file wrote them.
|
|
50
|
+
*/
|
|
51
|
+
export function analysisSpectra(
|
|
52
|
+
analysis: Analysis,
|
|
53
|
+
origin: IrOrigin,
|
|
54
|
+
): LoadedIrSpectrum[] {
|
|
55
|
+
const blocks = analysis.spectra;
|
|
56
|
+
const spectra: LoadedIrSpectrum[] = [];
|
|
57
|
+
|
|
58
|
+
for (let index = 0; index < blocks.length; index++) {
|
|
59
|
+
const block = blocks[index];
|
|
60
|
+
if (block === undefined) continue;
|
|
61
|
+
if (!isInfrared(block)) continue;
|
|
62
|
+
const wavenumbers = block.variables.x?.data;
|
|
63
|
+
const absorbances = block.variables.a?.data;
|
|
64
|
+
const transmittances = block.variables.t?.data;
|
|
65
|
+
if (
|
|
66
|
+
wavenumbers === undefined ||
|
|
67
|
+
absorbances === undefined ||
|
|
68
|
+
transmittances === undefined ||
|
|
69
|
+
wavenumbers.length < 2
|
|
70
|
+
) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const blockOrigin: IrOrigin = { ...origin };
|
|
75
|
+
// A file holding one spectrum has no index worth showing; calling it block 0
|
|
76
|
+
// in the list would suggest there is a block 1 somewhere.
|
|
77
|
+
if (blocks.length > 1) blockOrigin.blockIndex = index;
|
|
78
|
+
const recorded = recordedMode(block);
|
|
79
|
+
if (recorded !== undefined) blockOrigin.recorded = recorded;
|
|
80
|
+
|
|
81
|
+
const spectrum: LoadedIrSpectrum = {
|
|
82
|
+
// Sorted once, on the axis both value arrays are indexed by, and the same
|
|
83
|
+
// permutation applied to each — sorting them independently would pair an
|
|
84
|
+
// absorbance with another wavenumber's transmittance.
|
|
85
|
+
...sortedByWavenumber(wavenumbers, absorbances, transmittances),
|
|
86
|
+
meta: blockMeta(block),
|
|
87
|
+
origin: blockOrigin,
|
|
88
|
+
};
|
|
89
|
+
const title = blockTitle(block);
|
|
90
|
+
// An absent name is an absent key, never a key holding `undefined`: the two
|
|
91
|
+
// read the same in a debugger and differently in every structural comparison.
|
|
92
|
+
if (title) spectrum.name = title;
|
|
93
|
+
spectra.push(spectrum);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return spectra;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** The three arrays of one spectrum, in ascending wavenumber. */
|
|
100
|
+
type SortedTraces = Pick<
|
|
101
|
+
LoadedIrSpectrum,
|
|
102
|
+
'wavenumber' | 'absorbance' | 'transmittance'
|
|
103
|
+
>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Put the points in ascending wavenumber, carrying both value axes along.
|
|
107
|
+
*
|
|
108
|
+
* `xySortX` is asked twice with the same x, which sorts it twice — but it is the
|
|
109
|
+
* one sort in the ecosystem that both orders and types an `xy` pair, and an
|
|
110
|
+
* infrared spectrum is a few thousand points. Writing a bespoke permutation to
|
|
111
|
+
* save one pass over four thousand numbers would be a second sort to keep
|
|
112
|
+
* correct for no measurable gain.
|
|
113
|
+
* @param wavenumbers - The wavenumbers, in whatever order the file wrote them.
|
|
114
|
+
* @param absorbances - Absorbance at each.
|
|
115
|
+
* @param transmittances - Percent transmittance at each.
|
|
116
|
+
* @returns The three arrays, ascending and typed.
|
|
117
|
+
*/
|
|
118
|
+
function sortedByWavenumber(
|
|
119
|
+
wavenumbers: DoubleArray,
|
|
120
|
+
absorbances: DoubleArray,
|
|
121
|
+
transmittances: DoubleArray,
|
|
122
|
+
): SortedTraces {
|
|
123
|
+
const byAbsorbance = xySortX({ x: wavenumbers, y: absorbances });
|
|
124
|
+
const byTransmittance = xySortX({ x: wavenumbers, y: transmittances });
|
|
125
|
+
return {
|
|
126
|
+
wavenumber: Float64Array.from(byAbsorbance.x),
|
|
127
|
+
absorbance: Float64Array.from(byAbsorbance.y),
|
|
128
|
+
transmittance: Float64Array.from(byTransmittance.y),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* What the block calls itself, with the file's own commentary taken off.
|
|
134
|
+
*
|
|
135
|
+
* `$$` opens a comment that runs to the end of the line in JCAMP, and a real
|
|
136
|
+
* `##TITLE` often carries one: the JSpecView collection is full of
|
|
137
|
+
* `urea $$ Begin of the data block`. Left in, the comment becomes the name of
|
|
138
|
+
* the spectrum in the list and the heading of its metadata panel.
|
|
139
|
+
* @param block - One spectrum of the analysis.
|
|
140
|
+
* @returns The title, or `undefined` when the block carries none worth showing.
|
|
141
|
+
*/
|
|
142
|
+
function blockTitle(block: MeasurementXY): string | undefined {
|
|
143
|
+
const written = block.title?.split('$$', 1)[0]?.trim();
|
|
144
|
+
return written === undefined || written === '' ? undefined : written;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Whether a block is an infrared spectrum rather than something else entirely.
|
|
149
|
+
*
|
|
150
|
+
* A JCAMP `LINK` block is a container, and the real ones in the wild put a Raman
|
|
151
|
+
* spectrum of the same sample in beside the infrared — `DCE.jdx` from the
|
|
152
|
+
* JSpecView collection holds two of each. A Raman shift is not a wavenumber
|
|
153
|
+
* absorbed, so loading one as infrared would draw a spectrum whose axis means
|
|
154
|
+
* something else and offer functional groups for its bands.
|
|
155
|
+
*
|
|
156
|
+
* Read off the block's own data type, and a block that states none is **kept**:
|
|
157
|
+
* plenty of instruments write no `##DATA TYPE` at all, and the file was opened
|
|
158
|
+
* by an infrared reader, so infrared is the right assumption where the file is
|
|
159
|
+
* silent. What is dropped is only a block that says it is something else.
|
|
160
|
+
* @param block - One spectrum of the analysis.
|
|
161
|
+
* @returns Whether to read it as infrared.
|
|
162
|
+
*/
|
|
163
|
+
function isInfrared(block: MeasurementXY): boolean {
|
|
164
|
+
const dataType = block.dataType?.toUpperCase();
|
|
165
|
+
if (dataType === undefined || dataType === '') return true;
|
|
166
|
+
if (dataType.includes('LINK')) return true;
|
|
167
|
+
for (const other of NOT_INFRARED) {
|
|
168
|
+
if (dataType.includes(other)) return false;
|
|
169
|
+
}
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* The data types that are certainly not an infrared spectrum.
|
|
175
|
+
*
|
|
176
|
+
* Named rather than matching `INFRARED` positively, so a file typed
|
|
177
|
+
* `IR SPECTRUM`, `FTIR` or `INFRARED SPECTRUM` — all three occur — is read
|
|
178
|
+
* without the list having to anticipate every spelling.
|
|
179
|
+
*/
|
|
180
|
+
const NOT_INFRARED = [
|
|
181
|
+
'RAMAN',
|
|
182
|
+
'NMR',
|
|
183
|
+
'MASS',
|
|
184
|
+
'UV',
|
|
185
|
+
'VISIBLE',
|
|
186
|
+
'CHROMATOGRAM',
|
|
187
|
+
'XRD',
|
|
188
|
+
'FLUORESCENCE',
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Which value axis the file itself carried.
|
|
193
|
+
*
|
|
194
|
+
* Read off the original `y` variable's label rather than off `a` or `t`, which
|
|
195
|
+
* `ir-spectrum` adds to every spectrum and so say nothing about the source. A
|
|
196
|
+
* file whose label names neither is left unanswered rather than guessed at.
|
|
197
|
+
* @param block - One spectrum of the analysis.
|
|
198
|
+
* @returns The mode the file was written in, or `undefined` when it is unclear.
|
|
199
|
+
*/
|
|
200
|
+
function recordedMode(block: MeasurementXY): IrMode | undefined {
|
|
201
|
+
const label = `${block.variables.y?.label ?? ''} ${
|
|
202
|
+
block.variables.y?.units ?? ''
|
|
203
|
+
}`.toLowerCase();
|
|
204
|
+
if (label.includes('transmit')) return 'transmittance';
|
|
205
|
+
if (label.includes('absorb')) return 'absorbance';
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* The acquisition table, as the file's own records state it.
|
|
211
|
+
* @param block - One spectrum of the analysis.
|
|
212
|
+
* @returns The table, `null` when the file carried neither a title nor a record.
|
|
213
|
+
*/
|
|
214
|
+
function blockMeta(block: MeasurementXY): IrMeta | null {
|
|
215
|
+
const title = blockTitle(block);
|
|
216
|
+
const fields: IrMetaField[] = [];
|
|
217
|
+
|
|
218
|
+
for (const [label, value] of Object.entries(block.meta ?? {})) {
|
|
219
|
+
const written = typeof value === 'string' ? value.trim() : String(value);
|
|
220
|
+
if (written !== '') fields.push({ label, value: written });
|
|
221
|
+
}
|
|
222
|
+
if (block.dataType) {
|
|
223
|
+
fields.unshift({ label: 'Technique', value: block.dataType });
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (fields.length === 0 && !title) return null;
|
|
227
|
+
return { title: title ?? null, fields };
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** One row of the acquisition table, as `IrMeta` spells it. */
|
|
231
|
+
type IrMetaField = IrMeta['fields'][number];
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matching picked bands against the correlation table.
|
|
3
|
+
*
|
|
4
|
+
* Every assignment whose range contains the band is kept, and that is the whole
|
|
5
|
+
* design: infrared assignment is not a lookup with one answer, and a viewer that
|
|
6
|
+
* showed only the best-fitting vibration would be asserting a structure the
|
|
7
|
+
* spectrum does not determine. A band at 1715 cm⁻¹ comes back as four
|
|
8
|
+
* candidates, ordered so the most specific claim reads first, and choosing
|
|
9
|
+
* between them is the chemist's job — which is what the `note` on each is for.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { BandAssignment } from './bandAssignments.ts';
|
|
13
|
+
import { BAND_ASSIGNMENTS } from './bandAssignments.ts';
|
|
14
|
+
import type { IrBand } from './irBand.ts';
|
|
15
|
+
|
|
16
|
+
/** One band, with everything it might be. */
|
|
17
|
+
export interface AssignedBand {
|
|
18
|
+
/** The band that was picked. */
|
|
19
|
+
band: IrBand;
|
|
20
|
+
/**
|
|
21
|
+
* Every vibration whose range contains it, narrowest range first.
|
|
22
|
+
*
|
|
23
|
+
* Narrowest first because a narrow range is a more specific claim: at
|
|
24
|
+
* 1745 cm⁻¹ the ester's fifteen-wavenumber window says more than the
|
|
25
|
+
* anhydride's ninety, so it is the one worth reading first. Empty for a band
|
|
26
|
+
* in a region the table says nothing about, which is most of the fingerprint.
|
|
27
|
+
*/
|
|
28
|
+
candidates: BandAssignment[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** How bands are assigned. */
|
|
32
|
+
export interface AssignBandsOptions {
|
|
33
|
+
/**
|
|
34
|
+
* The table to match against.
|
|
35
|
+
* @default BAND_ASSIGNMENTS
|
|
36
|
+
*/
|
|
37
|
+
assignments?: readonly BandAssignment[];
|
|
38
|
+
/**
|
|
39
|
+
* How far outside a range a band may still fall, in cm⁻¹.
|
|
40
|
+
*
|
|
41
|
+
* The ranges are conventional values rounded to tens, and a real band sits a
|
|
42
|
+
* few wavenumbers either side of where a table puts it — a ketone at 1703 is
|
|
43
|
+
* a ketone. Widening every range by a little is honest about that, where
|
|
44
|
+
* matching exactly would leave the strongest band in the spectrum unassigned
|
|
45
|
+
* for being two wavenumbers low.
|
|
46
|
+
* @default 5
|
|
47
|
+
*/
|
|
48
|
+
tolerance?: number;
|
|
49
|
+
/**
|
|
50
|
+
* Whether a band whose strength disagrees with the table is still offered.
|
|
51
|
+
*
|
|
52
|
+
* It is, by default. A weak band where the table expects a strong one is
|
|
53
|
+
* evidence about concentration or about the assignment being wrong, and either
|
|
54
|
+
* way it is evidence the reader should see rather than have filtered away.
|
|
55
|
+
* @default true
|
|
56
|
+
*/
|
|
57
|
+
keepStrengthMismatch?: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Assign every band, keeping every candidate.
|
|
62
|
+
* @param bands - The bands that were picked.
|
|
63
|
+
* @param options - The table, and how tightly to match it.
|
|
64
|
+
* @returns One entry per band, in the order the bands were given.
|
|
65
|
+
*/
|
|
66
|
+
export function assignBands(
|
|
67
|
+
bands: readonly IrBand[],
|
|
68
|
+
options: AssignBandsOptions = {},
|
|
69
|
+
): AssignedBand[] {
|
|
70
|
+
const {
|
|
71
|
+
assignments = BAND_ASSIGNMENTS,
|
|
72
|
+
tolerance = 5,
|
|
73
|
+
keepStrengthMismatch = true,
|
|
74
|
+
} = options;
|
|
75
|
+
|
|
76
|
+
const assigned: AssignedBand[] = new Array<AssignedBand>(bands.length);
|
|
77
|
+
for (let index = 0; index < bands.length; index++) {
|
|
78
|
+
const band = bands[index] as IrBand;
|
|
79
|
+
const candidates: BandAssignment[] = [];
|
|
80
|
+
for (const assignment of assignments) {
|
|
81
|
+
if (
|
|
82
|
+
band.wavenumber < assignment.from - tolerance ||
|
|
83
|
+
band.wavenumber > assignment.to + tolerance
|
|
84
|
+
) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (!keepStrengthMismatch && assignment.strength !== band.strength) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
candidates.push(assignment);
|
|
91
|
+
}
|
|
92
|
+
assigned[index] = {
|
|
93
|
+
band,
|
|
94
|
+
candidates: candidates.toSorted(byNarrowestRange),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return assigned;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* How many of the bands the table had something to say about.
|
|
102
|
+
*
|
|
103
|
+
* Reported as a count rather than a fraction, because the denominator is the
|
|
104
|
+
* number of bands picked and that follows the picking threshold — a coverage
|
|
105
|
+
* percentage would move when somebody adjusted a slider, and read as the
|
|
106
|
+
* assignment having improved.
|
|
107
|
+
* @param assigned - The assigned bands.
|
|
108
|
+
* @returns How many carry at least one candidate.
|
|
109
|
+
*/
|
|
110
|
+
export function countAssigned(assigned: readonly AssignedBand[]): number {
|
|
111
|
+
let count = 0;
|
|
112
|
+
for (const entry of assigned) {
|
|
113
|
+
if (entry.candidates.length > 0) count++;
|
|
114
|
+
}
|
|
115
|
+
return count;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The name to write on a band, when there is room for one line.
|
|
120
|
+
*
|
|
121
|
+
* The narrowest candidate's group and vibration, which is the first of the
|
|
122
|
+
* ranked list — the same order the panel shows, so the chart and the table never
|
|
123
|
+
* disagree about which claim leads.
|
|
124
|
+
* @param entry - One assigned band.
|
|
125
|
+
* @returns The label, or `null` when nothing was assigned.
|
|
126
|
+
*/
|
|
127
|
+
export function bandLabel(entry: AssignedBand): string | null {
|
|
128
|
+
const best = entry.candidates[0];
|
|
129
|
+
if (best === undefined) return null;
|
|
130
|
+
return `${best.group} ${best.vibration}`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Order two assignments by how specific they are, narrowest range first.
|
|
135
|
+
* @param first - One assignment.
|
|
136
|
+
* @param second - The other.
|
|
137
|
+
* @returns The comparison; equal widths keep the table's own order.
|
|
138
|
+
*/
|
|
139
|
+
function byNarrowestRange(
|
|
140
|
+
first: BandAssignment,
|
|
141
|
+
second: BandAssignment,
|
|
142
|
+
): number {
|
|
143
|
+
return first.to - first.from - (second.to - second.from);
|
|
144
|
+
}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The correlation table: which vibration a band at a given wavenumber may be.
|
|
3
|
+
*
|
|
4
|
+
* This is the infrared analogue of a fragment set — what a producer *claims*
|
|
5
|
+
* about a spectrum — with one difference that shapes the whole design: a mass
|
|
6
|
+
* fragment claims one m/z, while a vibration claims a **range**, and the ranges
|
|
7
|
+
* overlap heavily on purpose. A band at 1715 cm⁻¹ is an ester, an aldehyde, a
|
|
8
|
+
* ketone and a carboxylic acid until something else decides between them, and a
|
|
9
|
+
* table that returned one answer there would be inventing chemistry.
|
|
10
|
+
*
|
|
11
|
+
* The ranges are the conventional teaching values, rounded to the tens that a
|
|
12
|
+
* printed table uses. They are deliberately not narrowed to look precise: a
|
|
13
|
+
* conjugated ketone really does absorb below an unconjugated one, and a table
|
|
14
|
+
* that excluded it would read as ruling the ketone out.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { IrBandStrength } from './irBand.ts';
|
|
18
|
+
|
|
19
|
+
/** One vibration a band may be, as a correlation table states it. */
|
|
20
|
+
export interface BandAssignment {
|
|
21
|
+
/** Identity, stable so a selection survives a re-pick. */
|
|
22
|
+
id: string;
|
|
23
|
+
/** The functional group it belongs to, as a chemist names it. */
|
|
24
|
+
group: string;
|
|
25
|
+
/** The motion itself: which bond, and how it moves. */
|
|
26
|
+
vibration: string;
|
|
27
|
+
/** Lowest wavenumber of the range, in cm⁻¹. */
|
|
28
|
+
from: number;
|
|
29
|
+
/** Highest wavenumber of the range, in cm⁻¹. */
|
|
30
|
+
to: number;
|
|
31
|
+
/** How strong the band usually is, in the table's own letters. */
|
|
32
|
+
strength: IrBandStrength;
|
|
33
|
+
/**
|
|
34
|
+
* What tells this assignment apart from the others it overlaps — the shape of
|
|
35
|
+
* the band, a partner band elsewhere, a region it must be absent from.
|
|
36
|
+
* @default undefined
|
|
37
|
+
*/
|
|
38
|
+
note?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The table, in ascending order of the low end of each range.
|
|
43
|
+
*
|
|
44
|
+
* Ordered so that a reader scanning it moves along the axis, and so that the
|
|
45
|
+
* fingerprint region below 1500 cm⁻¹ — where assignments are least decisive —
|
|
46
|
+
* sits together at the top rather than being interleaved with the diagnostic
|
|
47
|
+
* stretches above it.
|
|
48
|
+
*/
|
|
49
|
+
export const BAND_ASSIGNMENTS: readonly BandAssignment[] = [
|
|
50
|
+
{
|
|
51
|
+
id: 'c-br-stretch',
|
|
52
|
+
group: 'alkyl bromide',
|
|
53
|
+
vibration: 'C–Br stretch',
|
|
54
|
+
from: 500,
|
|
55
|
+
to: 600,
|
|
56
|
+
strength: 'S',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'c-cl-stretch',
|
|
60
|
+
group: 'alkyl chloride',
|
|
61
|
+
vibration: 'C–Cl stretch',
|
|
62
|
+
from: 600,
|
|
63
|
+
to: 800,
|
|
64
|
+
strength: 'S',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'aromatic-ch-oop',
|
|
68
|
+
group: 'arene',
|
|
69
|
+
vibration: 'C–H out-of-plane bend',
|
|
70
|
+
from: 690,
|
|
71
|
+
to: 900,
|
|
72
|
+
strength: 'S',
|
|
73
|
+
note: 'How many bands, and where, is what tells a substitution pattern apart',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: 'alkene-ch-oop',
|
|
77
|
+
group: 'alkene',
|
|
78
|
+
vibration: '=C–H out-of-plane bend',
|
|
79
|
+
from: 890,
|
|
80
|
+
to: 990,
|
|
81
|
+
strength: 'S',
|
|
82
|
+
note: 'A terminal vinyl gives two, near 910 and 990',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'c-o-stretch',
|
|
86
|
+
group: 'alcohol, ether, ester',
|
|
87
|
+
vibration: 'C–O stretch',
|
|
88
|
+
from: 1000,
|
|
89
|
+
to: 1300,
|
|
90
|
+
strength: 'S',
|
|
91
|
+
note: 'Strong and broad; an ester shows two, the higher one near 1200',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: 'c-f-stretch',
|
|
95
|
+
group: 'alkyl fluoride',
|
|
96
|
+
vibration: 'C–F stretch',
|
|
97
|
+
from: 1000,
|
|
98
|
+
to: 1400,
|
|
99
|
+
strength: 'S',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: 'c-n-stretch',
|
|
103
|
+
group: 'amine, amide',
|
|
104
|
+
vibration: 'C–N stretch',
|
|
105
|
+
from: 1080,
|
|
106
|
+
to: 1360,
|
|
107
|
+
strength: 'm',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: 'nitro-symmetric',
|
|
111
|
+
group: 'nitro',
|
|
112
|
+
vibration: 'N–O symmetric stretch',
|
|
113
|
+
from: 1300,
|
|
114
|
+
to: 1390,
|
|
115
|
+
strength: 'S',
|
|
116
|
+
note: 'Never alone: the asymmetric partner sits near 1500–1560',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 'oh-bend',
|
|
120
|
+
group: 'alcohol',
|
|
121
|
+
vibration: 'O–H bend',
|
|
122
|
+
from: 1330,
|
|
123
|
+
to: 1430,
|
|
124
|
+
strength: 'm',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: 'alkane-ch-bend',
|
|
128
|
+
group: 'alkane',
|
|
129
|
+
vibration: 'C–H bend',
|
|
130
|
+
from: 1370,
|
|
131
|
+
to: 1470,
|
|
132
|
+
strength: 'm',
|
|
133
|
+
note: 'A gem-dimethyl splits the 1380 band in two',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: 'aromatic-cc-stretch',
|
|
137
|
+
group: 'arene',
|
|
138
|
+
vibration: 'C=C aromatic stretch',
|
|
139
|
+
from: 1450,
|
|
140
|
+
to: 1600,
|
|
141
|
+
strength: 'm',
|
|
142
|
+
note: 'Usually a pair, near 1500 and 1600',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
id: 'nitro-asymmetric',
|
|
146
|
+
group: 'nitro',
|
|
147
|
+
vibration: 'N–O asymmetric stretch',
|
|
148
|
+
from: 1500,
|
|
149
|
+
to: 1560,
|
|
150
|
+
strength: 'S',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: 'nh-bend',
|
|
154
|
+
group: 'amine, amide',
|
|
155
|
+
vibration: 'N–H bend',
|
|
156
|
+
from: 1550,
|
|
157
|
+
to: 1640,
|
|
158
|
+
strength: 'm',
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: 'alkene-cc-stretch',
|
|
162
|
+
group: 'alkene',
|
|
163
|
+
vibration: 'C=C stretch',
|
|
164
|
+
from: 1620,
|
|
165
|
+
to: 1680,
|
|
166
|
+
strength: 'w',
|
|
167
|
+
note: 'Weak, and absent altogether on a symmetric alkene',
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: 'amide-co-stretch',
|
|
171
|
+
group: 'amide',
|
|
172
|
+
vibration: 'C=O stretch',
|
|
173
|
+
from: 1630,
|
|
174
|
+
to: 1690,
|
|
175
|
+
strength: 'S',
|
|
176
|
+
note: 'The lowest carbonyl there is; look for N–H above 3300 to confirm',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
id: 'acid-co-stretch',
|
|
180
|
+
group: 'carboxylic acid',
|
|
181
|
+
vibration: 'C=O stretch',
|
|
182
|
+
from: 1700,
|
|
183
|
+
to: 1725,
|
|
184
|
+
strength: 'S',
|
|
185
|
+
note: 'Confirmed by the very broad O–H between 2500 and 3300',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 'ketone-co-stretch',
|
|
189
|
+
group: 'ketone',
|
|
190
|
+
vibration: 'C=O stretch',
|
|
191
|
+
from: 1705,
|
|
192
|
+
to: 1725,
|
|
193
|
+
strength: 'S',
|
|
194
|
+
note: 'Conjugation drops it by about 30; a strained ring raises it',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: 'aldehyde-co-stretch',
|
|
198
|
+
group: 'aldehyde',
|
|
199
|
+
vibration: 'C=O stretch',
|
|
200
|
+
from: 1720,
|
|
201
|
+
to: 1740,
|
|
202
|
+
strength: 'S',
|
|
203
|
+
note: 'Confirmed by the C–H pair near 2720 and 2820',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'ester-co-stretch',
|
|
207
|
+
group: 'ester',
|
|
208
|
+
vibration: 'C=O stretch',
|
|
209
|
+
from: 1735,
|
|
210
|
+
to: 1750,
|
|
211
|
+
strength: 'S',
|
|
212
|
+
note: 'Confirmed by the strong C–O between 1000 and 1300',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
id: 'acid-chloride-co-stretch',
|
|
216
|
+
group: 'acid chloride',
|
|
217
|
+
vibration: 'C=O stretch',
|
|
218
|
+
from: 1770,
|
|
219
|
+
to: 1815,
|
|
220
|
+
strength: 'S',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 'anhydride-co-stretch',
|
|
224
|
+
group: 'anhydride',
|
|
225
|
+
vibration: 'C=O stretch',
|
|
226
|
+
from: 1740,
|
|
227
|
+
to: 1830,
|
|
228
|
+
strength: 'S',
|
|
229
|
+
note: 'Two bands, about 60 apart, which is what names it',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: 'nitrile-stretch',
|
|
233
|
+
group: 'nitrile',
|
|
234
|
+
vibration: 'C≡N stretch',
|
|
235
|
+
from: 2210,
|
|
236
|
+
to: 2260,
|
|
237
|
+
strength: 'm',
|
|
238
|
+
note: 'Sharp, and in a region almost nothing else occupies',
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
id: 'alkyne-cc-stretch',
|
|
242
|
+
group: 'alkyne',
|
|
243
|
+
vibration: 'C≡C stretch',
|
|
244
|
+
from: 2100,
|
|
245
|
+
to: 2260,
|
|
246
|
+
strength: 'w',
|
|
247
|
+
note: 'Weak, and absent on a symmetric internal alkyne',
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
id: 'aldehyde-ch-stretch',
|
|
251
|
+
group: 'aldehyde',
|
|
252
|
+
vibration: 'C–H stretch',
|
|
253
|
+
from: 2695,
|
|
254
|
+
to: 2830,
|
|
255
|
+
strength: 'm',
|
|
256
|
+
note: 'The diagnostic pair near 2720 and 2820',
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: 'acid-oh-stretch',
|
|
260
|
+
group: 'carboxylic acid',
|
|
261
|
+
vibration: 'O–H stretch',
|
|
262
|
+
from: 2500,
|
|
263
|
+
to: 3300,
|
|
264
|
+
strength: 'S',
|
|
265
|
+
note: 'Very broad — it runs under the C–H bands rather than beside them',
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
id: 'alkane-ch-stretch',
|
|
269
|
+
group: 'alkane',
|
|
270
|
+
vibration: 'C–H stretch',
|
|
271
|
+
from: 2850,
|
|
272
|
+
to: 3000,
|
|
273
|
+
strength: 'S',
|
|
274
|
+
note: 'Below 3000, which is what separates it from an alkene C–H',
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: 'alkene-ch-stretch',
|
|
278
|
+
group: 'alkene',
|
|
279
|
+
vibration: '=C–H stretch',
|
|
280
|
+
from: 3000,
|
|
281
|
+
to: 3100,
|
|
282
|
+
strength: 'm',
|
|
283
|
+
note: 'Above 3000, and never alone: the C=C sits near 1650',
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
id: 'aromatic-ch-stretch',
|
|
287
|
+
group: 'arene',
|
|
288
|
+
vibration: 'C–H stretch',
|
|
289
|
+
from: 3000,
|
|
290
|
+
to: 3100,
|
|
291
|
+
strength: 'm',
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
id: 'alkyne-ch-stretch',
|
|
295
|
+
group: 'alkyne',
|
|
296
|
+
vibration: '≡C–H stretch',
|
|
297
|
+
from: 3260,
|
|
298
|
+
to: 3330,
|
|
299
|
+
strength: 'S',
|
|
300
|
+
note: 'Sharp, where an O–H in the same place is broad',
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
id: 'alcohol-oh-stretch',
|
|
304
|
+
group: 'alcohol',
|
|
305
|
+
vibration: 'O–H stretch',
|
|
306
|
+
from: 3200,
|
|
307
|
+
to: 3600,
|
|
308
|
+
strength: 'S',
|
|
309
|
+
note: 'Broad when hydrogen bonded, which is nearly always',
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
id: 'nh-stretch',
|
|
313
|
+
group: 'amine, amide',
|
|
314
|
+
vibration: 'N–H stretch',
|
|
315
|
+
from: 3300,
|
|
316
|
+
to: 3500,
|
|
317
|
+
strength: 'm',
|
|
318
|
+
note: 'A primary amine gives two bands, a secondary one',
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
id: 'free-oh-stretch',
|
|
322
|
+
group: 'alcohol',
|
|
323
|
+
vibration: 'O–H stretch, not hydrogen bonded',
|
|
324
|
+
from: 3580,
|
|
325
|
+
to: 3650,
|
|
326
|
+
strength: 'm',
|
|
327
|
+
note: 'Sharp, and only in a dilute or gas-phase spectrum',
|
|
328
|
+
},
|
|
329
|
+
];
|