matterviz 0.3.6 → 0.3.7
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/dist/EmptyState.svelte.d.ts +9 -0
- package/dist/FilePicker.svelte +360 -0
- package/dist/FilePicker.svelte.d.ts +17 -0
- package/dist/Icon.svelte.d.ts +13 -0
- package/dist/MillerIndexInput.svelte +66 -0
- package/dist/MillerIndexInput.svelte.d.ts +7 -0
- package/dist/api/mp.d.ts +6 -0
- package/dist/api/mp.js +22 -0
- package/dist/api/optimade.d.ts +45 -0
- package/dist/api/optimade.js +135 -0
- package/dist/brillouin/BrillouinZone.svelte +549 -0
- package/dist/brillouin/BrillouinZone.svelte.d.ts +83 -0
- package/dist/brillouin/BrillouinZoneControls.svelte +144 -0
- package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +17 -0
- package/dist/brillouin/BrillouinZoneExportPane.svelte +146 -0
- package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +15 -0
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +146 -0
- package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +13 -0
- package/dist/brillouin/BrillouinZoneScene.svelte +476 -0
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +48 -0
- package/dist/brillouin/BrillouinZoneTooltip.svelte +92 -0
- package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +8 -0
- package/dist/brillouin/compute.d.ts +17 -0
- package/dist/brillouin/compute.js +426 -0
- package/dist/brillouin/index.d.ts +8 -0
- package/dist/brillouin/index.js +7 -0
- package/dist/brillouin/types.d.ts +43 -0
- package/dist/brillouin/types.js +1 -0
- package/dist/chempot-diagram/ChemPotDiagram.svelte +327 -0
- package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +846 -0
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3193 -0
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
- package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
- package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
- package/dist/chempot-diagram/async-compute.svelte.js +78 -0
- package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
- package/dist/chempot-diagram/chempot-worker.js +11 -0
- package/dist/chempot-diagram/color.d.ts +10 -0
- package/dist/chempot-diagram/color.js +32 -0
- package/dist/chempot-diagram/compute.d.ts +48 -0
- package/dist/chempot-diagram/compute.js +806 -0
- package/dist/chempot-diagram/index.d.ts +6 -0
- package/dist/chempot-diagram/index.js +6 -0
- package/dist/chempot-diagram/pointer.d.ts +16 -0
- package/dist/chempot-diagram/pointer.js +40 -0
- package/dist/chempot-diagram/temperature.d.ts +15 -0
- package/dist/chempot-diagram/temperature.js +34 -0
- package/dist/chempot-diagram/types.d.ts +81 -0
- package/dist/chempot-diagram/types.js +28 -0
- package/dist/colors/index.d.ts +47 -0
- package/dist/colors/index.js +203 -0
- package/dist/composition/BarChart.svelte +297 -0
- package/dist/composition/BarChart.svelte.d.ts +39 -0
- package/dist/composition/BubbleChart.svelte +218 -0
- package/dist/composition/BubbleChart.svelte.d.ts +28 -0
- package/dist/composition/Composition.svelte +165 -0
- package/dist/composition/Composition.svelte.d.ts +15 -0
- package/dist/composition/Formula.svelte +268 -0
- package/dist/composition/Formula.svelte.d.ts +19 -0
- package/dist/composition/FormulaFilter.svelte +1257 -0
- package/dist/composition/FormulaFilter.svelte.d.ts +51 -0
- package/dist/composition/PieChart.svelte +323 -0
- package/dist/composition/PieChart.svelte.d.ts +37 -0
- package/dist/composition/format.d.ts +15 -0
- package/dist/composition/format.js +109 -0
- package/dist/composition/index.d.ts +20 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/parse.d.ts +56 -0
- package/dist/composition/parse.js +474 -0
- package/dist/constants.d.ts +29 -0
- package/dist/constants.js +99 -0
- package/dist/controls.d.ts +14 -0
- package/dist/controls.js +30 -0
- package/dist/convex-hull/ConvexHull.svelte +157 -0
- package/dist/convex-hull/ConvexHull.svelte.d.ts +13 -0
- package/dist/convex-hull/ConvexHull2D.svelte +825 -0
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +11 -0
- package/dist/convex-hull/ConvexHull3D.svelte +1801 -0
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +8 -0
- package/dist/convex-hull/ConvexHull4D.svelte +1398 -0
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +8 -0
- package/dist/convex-hull/ConvexHullControls.svelte +535 -0
- package/dist/convex-hull/ConvexHullControls.svelte.d.ts +48 -0
- package/dist/convex-hull/ConvexHullInfoPane.svelte +125 -0
- package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +20 -0
- package/dist/convex-hull/ConvexHullStats.svelte +929 -0
- package/dist/convex-hull/ConvexHullStats.svelte.d.ts +17 -0
- package/dist/convex-hull/ConvexHullTooltip.svelte +131 -0
- package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +33 -0
- package/dist/convex-hull/GasPressureControls.svelte +247 -0
- package/dist/convex-hull/GasPressureControls.svelte.d.ts +11 -0
- package/dist/convex-hull/StructurePopup.svelte +151 -0
- package/dist/convex-hull/StructurePopup.svelte.d.ts +18 -0
- package/dist/convex-hull/TemperatureSlider.svelte.d.ts +8 -0
- package/dist/convex-hull/barycentric-coords.d.ts +18 -0
- package/dist/convex-hull/barycentric-coords.js +182 -0
- package/dist/convex-hull/demo-temperature.d.ts +6 -0
- package/dist/convex-hull/demo-temperature.js +40 -0
- package/dist/convex-hull/gas-thermodynamics.d.ts +16 -0
- package/dist/convex-hull/gas-thermodynamics.js +314 -0
- package/dist/convex-hull/helpers.d.ts +114 -0
- package/dist/convex-hull/helpers.js +710 -0
- package/dist/convex-hull/index.d.ts +119 -0
- package/dist/convex-hull/index.js +58 -0
- package/dist/convex-hull/thermodynamics.d.ts +67 -0
- package/dist/convex-hull/thermodynamics.js +1752 -0
- package/dist/convex-hull/types.d.ts +162 -0
- package/dist/convex-hull/types.js +36 -0
- package/dist/coordination/CoordinationBarPlot.svelte +311 -0
- package/dist/coordination/CoordinationBarPlot.svelte.d.ts +30 -0
- package/dist/coordination/calc-coordination.d.ts +15 -0
- package/dist/coordination/calc-coordination.js +63 -0
- package/dist/coordination/index.d.ts +8 -0
- package/dist/coordination/index.js +7 -0
- package/dist/effects.svelte.d.ts +12 -0
- package/dist/effects.svelte.js +37 -0
- package/dist/element/BohrAtom.svelte.d.ts +20 -0
- package/dist/element/ElementHeading.svelte +26 -0
- package/dist/element/ElementHeading.svelte.d.ts +8 -0
- package/dist/element/ElementPhoto.svelte +57 -0
- package/dist/element/ElementPhoto.svelte.d.ts +9 -0
- package/dist/element/ElementStats.svelte +80 -0
- package/dist/element/ElementStats.svelte.d.ts +8 -0
- package/dist/element/ElementTile.svelte +484 -0
- package/dist/element/ElementTile.svelte.d.ts +29 -0
- package/dist/element/Nucleus.svelte.d.ts +17 -0
- package/dist/element/data.d.ts +2 -0
- package/dist/element/data.js +2 -0
- package/dist/element/index.d.ts +8 -0
- package/dist/element/index.js +7 -0
- package/dist/element/types.d.ts +57 -0
- package/dist/element/types.js +1 -0
- package/dist/feedback/ClickFeedback.svelte +58 -0
- package/dist/feedback/ClickFeedback.svelte.d.ts +12 -0
- package/dist/feedback/DragOverlay.svelte +42 -0
- package/dist/feedback/DragOverlay.svelte.d.ts +7 -0
- package/dist/feedback/Spinner.svelte.d.ts +7 -0
- package/dist/feedback/StatusMessage.svelte.d.ts +9 -0
- package/dist/feedback/index.d.ts +4 -0
- package/dist/feedback/index.js +4 -0
- package/dist/fermi-surface/FermiSlice.svelte +189 -0
- package/dist/fermi-surface/FermiSlice.svelte.d.ts +24 -0
- package/dist/fermi-surface/FermiSurface.svelte +600 -0
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +83 -0
- package/dist/fermi-surface/FermiSurfaceControls.svelte +448 -0
- package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +35 -0
- package/dist/fermi-surface/FermiSurfaceScene.svelte +794 -0
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +50 -0
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +111 -0
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +8 -0
- package/dist/fermi-surface/compute.d.ts +5 -0
- package/dist/fermi-surface/compute.js +538 -0
- package/dist/fermi-surface/constants.d.ts +9 -0
- package/dist/fermi-surface/constants.js +27 -0
- package/dist/fermi-surface/export.d.ts +5 -0
- package/dist/fermi-surface/export.js +50 -0
- package/dist/fermi-surface/index.d.ts +12 -0
- package/dist/fermi-surface/index.js +13 -0
- package/dist/fermi-surface/marching-cubes.d.ts +2 -0
- package/dist/fermi-surface/marching-cubes.js +2 -0
- package/dist/fermi-surface/parse.d.ts +2 -0
- package/dist/fermi-surface/parse.js +491 -0
- package/dist/fermi-surface/symmetry.d.ts +3 -0
- package/dist/fermi-surface/symmetry.js +46 -0
- package/dist/fermi-surface/types.d.ts +110 -0
- package/dist/fermi-surface/types.js +4 -0
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +1545 -0
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
- package/dist/heatmap-matrix/index.d.ts +53 -0
- package/dist/heatmap-matrix/index.js +100 -0
- package/dist/heatmap-matrix/shared.d.ts +2 -0
- package/dist/heatmap-matrix/shared.js +4 -0
- package/dist/icons.d.ts +569 -0
- package/dist/icons.js +648 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.js +39 -0
- package/dist/io/decompress.d.ts +11 -0
- package/dist/io/decompress.js +74 -0
- package/dist/io/export.d.ts +16 -0
- package/dist/io/export.js +316 -0
- package/dist/io/fetch.d.ts +5 -0
- package/dist/io/fetch.js +39 -0
- package/dist/io/file-drop.d.ts +7 -0
- package/dist/io/file-drop.js +43 -0
- package/dist/io/index.d.ts +7 -0
- package/dist/io/index.js +6 -0
- package/dist/io/is-binary.d.ts +1 -0
- package/dist/io/is-binary.js +20 -0
- package/dist/io/types.d.ts +8 -0
- package/dist/io/types.js +1 -0
- package/dist/io/url-drop.d.ts +2 -0
- package/dist/io/url-drop.js +123 -0
- package/dist/isosurface/Isosurface.svelte +285 -0
- package/dist/isosurface/Isosurface.svelte.d.ts +8 -0
- package/dist/isosurface/IsosurfaceControls.svelte +277 -0
- package/dist/isosurface/IsosurfaceControls.svelte.d.ts +9 -0
- package/dist/isosurface/index.d.ts +5 -0
- package/dist/isosurface/index.js +6 -0
- package/dist/isosurface/parse.d.ts +6 -0
- package/dist/isosurface/parse.js +553 -0
- package/dist/isosurface/slice.d.ts +11 -0
- package/dist/isosurface/slice.js +140 -0
- package/dist/isosurface/types.d.ts +56 -0
- package/dist/isosurface/types.js +227 -0
- package/dist/labels.d.ts +53 -0
- package/dist/labels.js +277 -0
- package/dist/layout/FullscreenToggle.svelte +50 -0
- package/dist/layout/FullscreenToggle.svelte.d.ts +7 -0
- package/dist/layout/InfoCard.svelte +120 -0
- package/dist/layout/InfoCard.svelte.d.ts +21 -0
- package/dist/layout/InfoTag.svelte +185 -0
- package/dist/layout/InfoTag.svelte.d.ts +19 -0
- package/dist/layout/PropertyFilter.svelte +246 -0
- package/dist/layout/PropertyFilter.svelte.d.ts +24 -0
- package/dist/layout/SettingsSection.svelte +148 -0
- package/dist/layout/SettingsSection.svelte.d.ts +17 -0
- package/dist/layout/SubpageGrid.svelte +82 -0
- package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
- package/dist/layout/fullscreen.d.ts +9 -0
- package/dist/layout/fullscreen.js +53 -0
- package/dist/layout/index.d.ts +10 -0
- package/dist/layout/index.js +8 -0
- package/dist/layout/json-tree/JsonNode.svelte +548 -0
- package/dist/layout/json-tree/JsonNode.svelte.d.ts +11 -0
- package/dist/layout/json-tree/JsonTree.svelte +1230 -0
- package/dist/layout/json-tree/JsonTree.svelte.d.ts +6 -0
- package/dist/layout/json-tree/JsonValue.svelte.d.ts +9 -0
- package/dist/layout/json-tree/index.d.ts +3 -0
- package/dist/layout/json-tree/index.js +3 -0
- package/dist/layout/json-tree/types.d.ts +74 -0
- package/dist/layout/json-tree/types.js +2 -0
- package/dist/layout/json-tree/utils.d.ts +29 -0
- package/dist/layout/json-tree/utils.js +641 -0
- package/dist/marching-cubes.d.ts +14 -0
- package/dist/marching-cubes.js +540 -0
- package/dist/math.d.ts +101 -0
- package/dist/math.js +905 -0
- package/dist/overlays/ContextMenu.svelte +162 -0
- package/dist/overlays/ContextMenu.svelte.d.ts +25 -0
- package/dist/overlays/CopyButton.svelte +45 -0
- package/dist/overlays/CopyButton.svelte.d.ts +8 -0
- package/dist/overlays/DragControlTab.svelte +98 -0
- package/dist/overlays/DragControlTab.svelte.d.ts +8 -0
- package/dist/overlays/DraggablePane.svelte +487 -0
- package/dist/overlays/DraggablePane.svelte.d.ts +36 -0
- package/dist/overlays/InfoPaneCards.svelte +149 -0
- package/dist/overlays/InfoPaneCards.svelte.d.ts +22 -0
- package/dist/overlays/index.d.ts +3 -0
- package/dist/overlays/index.js +3 -0
- package/dist/periodic-table/PeriodicTable.svelte +469 -0
- package/dist/periodic-table/PeriodicTable.svelte.d.ts +55 -0
- package/dist/periodic-table/PeriodicTableControls.svelte +557 -0
- package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +24 -0
- package/dist/periodic-table/PropertySelect.svelte +37 -0
- package/dist/periodic-table/PropertySelect.svelte.d.ts +13 -0
- package/dist/periodic-table/TableInset.svelte.d.ts +9 -0
- package/dist/periodic-table/index.d.ts +10 -0
- package/dist/periodic-table/index.js +4 -0
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1086 -0
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +44 -0
- package/dist/phase-diagram/PhaseDiagramControls.svelte +444 -0
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +30 -0
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +19 -0
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +16 -0
- package/dist/phase-diagram/TdbInfoPanel.svelte +203 -0
- package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +12 -0
- package/dist/phase-diagram/build-diagram.d.ts +11 -0
- package/dist/phase-diagram/build-diagram.js +160 -0
- package/dist/phase-diagram/colors.d.ts +35 -0
- package/dist/phase-diagram/colors.js +51 -0
- package/dist/phase-diagram/diagram-input.d.ts +29 -0
- package/dist/phase-diagram/diagram-input.js +3 -0
- package/dist/phase-diagram/index.d.ts +13 -0
- package/dist/phase-diagram/index.js +11 -0
- package/dist/phase-diagram/parse.d.ts +55 -0
- package/dist/phase-diagram/parse.js +272 -0
- package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
- package/dist/phase-diagram/svg-to-diagram.js +867 -0
- package/dist/phase-diagram/types.d.ts +93 -0
- package/dist/phase-diagram/types.js +1 -0
- package/dist/phase-diagram/utils.d.ts +118 -0
- package/dist/phase-diagram/utils.js +604 -0
- package/dist/plot/AxisLabel.svelte +51 -0
- package/dist/plot/AxisLabel.svelte.d.ts +16 -0
- package/dist/plot/BarPlot.svelte +2113 -0
- package/dist/plot/BarPlot.svelte.d.ts +84 -0
- package/dist/plot/BarPlotControls.svelte +66 -0
- package/dist/plot/BarPlotControls.svelte.d.ts +18 -0
- package/dist/plot/BinnedScatterPlot.svelte +1114 -0
- package/dist/plot/BinnedScatterPlot.svelte.d.ts +66 -0
- package/dist/plot/ColorBar.svelte +721 -0
- package/dist/plot/ColorBar.svelte.d.ts +31 -0
- package/dist/plot/ColorScaleSelect.svelte +54 -0
- package/dist/plot/ColorScaleSelect.svelte.d.ts +15 -0
- package/dist/plot/ElementScatter.svelte +63 -0
- package/dist/plot/ElementScatter.svelte.d.ts +14 -0
- package/dist/plot/FillArea.svelte.d.ts +21 -0
- package/dist/plot/Histogram.svelte +1558 -0
- package/dist/plot/Histogram.svelte.d.ts +50 -0
- package/dist/plot/HistogramControls.svelte +212 -0
- package/dist/plot/HistogramControls.svelte.d.ts +22 -0
- package/dist/plot/InteractiveAxisLabel.svelte +96 -0
- package/dist/plot/InteractiveAxisLabel.svelte.d.ts +14 -0
- package/dist/plot/Line.svelte +84 -0
- package/dist/plot/Line.svelte.d.ts +15 -0
- package/dist/plot/PlotAxis.svelte +169 -0
- package/dist/plot/PlotAxis.svelte.d.ts +24 -0
- package/dist/plot/PlotControls.svelte +537 -0
- package/dist/plot/PlotControls.svelte.d.ts +4 -0
- package/dist/plot/PlotLegend.svelte +569 -0
- package/dist/plot/PlotLegend.svelte.d.ts +29 -0
- package/dist/plot/PlotTooltip.svelte +67 -0
- package/dist/plot/PlotTooltip.svelte.d.ts +17 -0
- package/dist/plot/PortalSelect.svelte +253 -0
- package/dist/plot/PortalSelect.svelte.d.ts +16 -0
- package/dist/plot/ReferenceLine.svelte.d.ts +20 -0
- package/dist/plot/ReferenceLine3D.svelte +156 -0
- package/dist/plot/ReferenceLine3D.svelte.d.ts +14 -0
- package/dist/plot/ReferencePlane.svelte +175 -0
- package/dist/plot/ReferencePlane.svelte.d.ts +14 -0
- package/dist/plot/ScatterPlot.svelte +2778 -0
- package/dist/plot/ScatterPlot.svelte.d.ts +96 -0
- package/dist/plot/ScatterPlot3D.svelte +529 -0
- package/dist/plot/ScatterPlot3D.svelte.d.ts +95 -0
- package/dist/plot/ScatterPlot3DControls.svelte +437 -0
- package/dist/plot/ScatterPlot3DControls.svelte.d.ts +20 -0
- package/dist/plot/ScatterPlot3DScene.svelte +912 -0
- package/dist/plot/ScatterPlot3DScene.svelte.d.ts +74 -0
- package/dist/plot/ScatterPlotControls.svelte +306 -0
- package/dist/plot/ScatterPlotControls.svelte.d.ts +17 -0
- package/dist/plot/ScatterPoint.svelte +182 -0
- package/dist/plot/ScatterPoint.svelte.d.ts +22 -0
- package/dist/plot/SpacegroupBarPlot.svelte +293 -0
- package/dist/plot/SpacegroupBarPlot.svelte.d.ts +9 -0
- package/dist/plot/Surface3D.svelte +197 -0
- package/dist/plot/Surface3D.svelte.d.ts +13 -0
- package/dist/plot/ZeroLines.svelte +97 -0
- package/dist/plot/ZeroLines.svelte.d.ts +33 -0
- package/dist/plot/ZoomRect.svelte +23 -0
- package/dist/plot/ZoomRect.svelte.d.ts +8 -0
- package/dist/plot/adaptive-density.d.ts +69 -0
- package/dist/plot/adaptive-density.js +191 -0
- package/dist/plot/auto-place.d.ts +43 -0
- package/dist/plot/auto-place.js +122 -0
- package/dist/plot/axis-utils.d.ts +19 -0
- package/dist/plot/axis-utils.js +78 -0
- package/dist/plot/binned-scatter-types.d.ts +59 -0
- package/dist/plot/binned-scatter-types.js +1 -0
- package/dist/plot/data-cleaning.d.ts +37 -0
- package/dist/plot/data-cleaning.js +855 -0
- package/dist/plot/data-transform.d.ts +16 -0
- package/dist/plot/data-transform.js +45 -0
- package/dist/plot/defaults.d.ts +19 -0
- package/dist/plot/defaults.js +9 -0
- package/dist/plot/fill-utils.d.ts +46 -0
- package/dist/plot/fill-utils.js +322 -0
- package/dist/plot/hover-lock.svelte.d.ts +14 -0
- package/dist/plot/hover-lock.svelte.js +46 -0
- package/dist/plot/index.d.ts +41 -0
- package/dist/plot/index.js +39 -0
- package/dist/plot/interactions.d.ts +12 -0
- package/dist/plot/interactions.js +101 -0
- package/dist/plot/layout.d.ts +78 -0
- package/dist/plot/layout.js +273 -0
- package/dist/plot/reference-line.d.ts +60 -0
- package/dist/plot/reference-line.js +314 -0
- package/dist/plot/scales.d.ts +48 -0
- package/dist/plot/scales.js +481 -0
- package/dist/plot/svg.d.ts +1 -0
- package/dist/plot/svg.js +11 -0
- package/dist/plot/types.d.ts +831 -0
- package/dist/plot/types.js +99 -0
- package/dist/plot/utils/label-placement.d.ts +68 -0
- package/dist/plot/utils/label-placement.js +326 -0
- package/dist/plot/utils/series-visibility.d.ts +15 -0
- package/dist/plot/utils/series-visibility.js +85 -0
- package/dist/plot/utils.d.ts +1 -0
- package/dist/plot/utils.js +14 -0
- package/dist/rdf/RdfPlot.svelte +247 -0
- package/dist/rdf/RdfPlot.svelte.d.ts +27 -0
- package/dist/rdf/calc-rdf.d.ts +4 -0
- package/dist/rdf/calc-rdf.js +111 -0
- package/dist/rdf/index.d.ts +23 -0
- package/dist/rdf/index.js +2 -0
- package/dist/sanitize.d.ts +6 -0
- package/dist/sanitize.js +116 -0
- package/dist/settings.d.ts +255 -0
- package/dist/settings.js +1132 -0
- package/dist/spectral/Bands.svelte +1040 -0
- package/dist/spectral/Bands.svelte.d.ts +40 -0
- package/dist/spectral/BandsAndDos.svelte +134 -0
- package/dist/spectral/BandsAndDos.svelte.d.ts +18 -0
- package/dist/spectral/BrillouinBandsDos.svelte +252 -0
- package/dist/spectral/BrillouinBandsDos.svelte.d.ts +20 -0
- package/dist/spectral/Dos.svelte +697 -0
- package/dist/spectral/Dos.svelte.d.ts +29 -0
- package/dist/spectral/helpers.d.ts +119 -0
- package/dist/spectral/helpers.js +1032 -0
- package/dist/spectral/index.d.ts +6 -0
- package/dist/spectral/index.js +6 -0
- package/dist/spectral/types.d.ts +84 -0
- package/dist/spectral/types.js +2 -0
- package/dist/state.svelte.d.ts +25 -0
- package/dist/state.svelte.js +45 -0
- package/dist/structure/Arrow.svelte +72 -0
- package/dist/structure/Arrow.svelte.d.ts +15 -0
- package/dist/structure/AtomLegend.svelte +815 -0
- package/dist/structure/AtomLegend.svelte.d.ts +35 -0
- package/dist/structure/Bond.svelte +140 -0
- package/dist/structure/Bond.svelte.d.ts +9 -0
- package/dist/structure/CanvasTooltip.svelte +33 -0
- package/dist/structure/CanvasTooltip.svelte.d.ts +12 -0
- package/dist/structure/CellSelect.svelte +349 -0
- package/dist/structure/CellSelect.svelte.d.ts +13 -0
- package/dist/structure/Cylinder.svelte +45 -0
- package/dist/structure/Cylinder.svelte.d.ts +10 -0
- package/dist/structure/Lattice.svelte +196 -0
- package/dist/structure/Lattice.svelte.d.ts +17 -0
- package/dist/structure/Structure.svelte +2248 -0
- package/dist/structure/Structure.svelte.d.ts +89 -0
- package/dist/structure/StructureControls.svelte +1273 -0
- package/dist/structure/StructureControls.svelte.d.ts +31 -0
- package/dist/structure/StructureExportPane.svelte +252 -0
- package/dist/structure/StructureExportPane.svelte.d.ts +17 -0
- package/dist/structure/StructureInfoPane.svelte +737 -0
- package/dist/structure/StructureInfoPane.svelte.d.ts +19 -0
- package/dist/structure/StructureScene.svelte +2255 -0
- package/dist/structure/StructureScene.svelte.d.ts +111 -0
- package/dist/structure/atom-properties.d.ts +37 -0
- package/dist/structure/atom-properties.js +200 -0
- package/dist/structure/bond-order-perception.d.ts +13 -0
- package/dist/structure/bond-order-perception.js +384 -0
- package/dist/structure/bonding.d.ts +68 -0
- package/dist/structure/bonding.js +696 -0
- package/dist/structure/export.d.ts +20 -0
- package/dist/structure/export.js +727 -0
- package/dist/structure/index.d.ts +126 -0
- package/dist/structure/index.js +169 -0
- package/dist/structure/label-placement.d.ts +14 -0
- package/dist/structure/label-placement.js +72 -0
- package/dist/structure/measure.d.ts +6 -0
- package/dist/structure/measure.js +29 -0
- package/dist/structure/parse.d.ts +66 -0
- package/dist/structure/parse.js +1392 -0
- package/dist/structure/partial-occupancy.d.ts +25 -0
- package/dist/structure/partial-occupancy.js +99 -0
- package/dist/structure/pbc.d.ts +9 -0
- package/dist/structure/pbc.js +123 -0
- package/dist/structure/supercell.d.ts +8 -0
- package/dist/structure/supercell.js +170 -0
- package/dist/structure/validation.d.ts +2 -0
- package/dist/structure/validation.js +10 -0
- package/dist/symmetry/SymmetryStats.svelte +226 -0
- package/dist/symmetry/SymmetryStats.svelte.d.ts +21 -0
- package/dist/symmetry/WyckoffTable.svelte +120 -0
- package/dist/symmetry/WyckoffTable.svelte.d.ts +11 -0
- package/dist/symmetry/cell-transform.d.ts +12 -0
- package/dist/symmetry/cell-transform.js +91 -0
- package/dist/symmetry/index.d.ts +43 -0
- package/dist/symmetry/index.js +228 -0
- package/dist/symmetry/spacegroups.d.ts +9 -0
- package/dist/symmetry/spacegroups.js +394 -0
- package/dist/table/HeatmapTable.svelte +1833 -0
- package/dist/table/HeatmapTable.svelte.d.ts +49 -0
- package/dist/table/ToggleMenu.svelte +385 -0
- package/dist/table/ToggleMenu.svelte.d.ts +11 -0
- package/dist/table/index.d.ts +74 -0
- package/dist/table/index.js +38 -0
- package/dist/theme/ThemeControl.svelte +53 -0
- package/dist/theme/ThemeControl.svelte.d.ts +9 -0
- package/dist/theme/index.d.ts +29 -0
- package/dist/theme/index.js +79 -0
- package/dist/time.d.ts +4 -0
- package/dist/time.js +70 -0
- package/dist/tooltip/TooltipContent.svelte +58 -0
- package/dist/tooltip/TooltipContent.svelte.d.ts +31 -0
- package/dist/tooltip/index.d.ts +2 -0
- package/dist/tooltip/index.js +1 -0
- package/dist/tooltip/types.d.ts +8 -0
- package/dist/tooltip/types.js +1 -0
- package/dist/trajectory/Trajectory.svelte +1545 -0
- package/dist/trajectory/Trajectory.svelte.d.ts +77 -0
- package/dist/trajectory/TrajectoryError.svelte +128 -0
- package/dist/trajectory/TrajectoryError.svelte.d.ts +13 -0
- package/dist/trajectory/TrajectoryExportPane.svelte +357 -0
- package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +17 -0
- package/dist/trajectory/TrajectoryInfoPane.svelte +313 -0
- package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +17 -0
- package/dist/trajectory/constants.d.ts +6 -0
- package/dist/trajectory/constants.js +7 -0
- package/dist/trajectory/extract.d.ts +5 -0
- package/dist/trajectory/extract.js +162 -0
- package/dist/trajectory/format-detect.d.ts +9 -0
- package/dist/trajectory/format-detect.js +76 -0
- package/dist/trajectory/frame-reader.d.ts +17 -0
- package/dist/trajectory/frame-reader.js +332 -0
- package/dist/trajectory/helpers.d.ts +15 -0
- package/dist/trajectory/helpers.js +164 -0
- package/dist/trajectory/index.d.ts +63 -0
- package/dist/trajectory/index.js +126 -0
- package/dist/trajectory/parse/ase.d.ts +2 -0
- package/dist/trajectory/parse/ase.js +73 -0
- package/dist/trajectory/parse/hdf5.d.ts +2 -0
- package/dist/trajectory/parse/hdf5.js +127 -0
- package/dist/trajectory/parse/index.d.ts +12 -0
- package/dist/trajectory/parse/index.js +298 -0
- package/dist/trajectory/parse/lammps.d.ts +5 -0
- package/dist/trajectory/parse/lammps.js +179 -0
- package/dist/trajectory/parse/vasp.d.ts +2 -0
- package/dist/trajectory/parse/vasp.js +68 -0
- package/dist/trajectory/parse/xyz.d.ts +2 -0
- package/dist/trajectory/parse/xyz.js +110 -0
- package/dist/trajectory/plotting.d.ts +28 -0
- package/dist/trajectory/plotting.js +423 -0
- package/dist/trajectory/types.d.ts +11 -0
- package/dist/trajectory/types.js +1 -0
- package/dist/utils.d.ts +6 -0
- package/dist/utils.js +45 -0
- package/dist/xrd/XrdPlot.svelte +615 -0
- package/dist/xrd/XrdPlot.svelte.d.ts +28 -0
- package/dist/xrd/broadening.d.ts +20 -0
- package/dist/xrd/broadening.js +97 -0
- package/dist/xrd/calc-xrd.d.ts +37 -0
- package/dist/xrd/calc-xrd.js +336 -0
- package/dist/xrd/index.d.ts +37 -0
- package/dist/xrd/index.js +4 -0
- package/dist/xrd/parse.d.ts +13 -0
- package/dist/xrd/parse.js +749 -0
- package/license +1 -1
- package/package.json +232 -1457
- package/readme.md +98 -171
- package/.vscode/launch.json +0 -13
- package/.vscodeignore +0 -7
- package/dist/assets/STLExporter-BpTH3YHE.js +0 -8
- package/dist/assets/browser-DdDecX_W.js +0 -1
- package/dist/assets/export-qgn-H9y6.js +0 -2
- package/dist/assets/main-DiKYzti2.css +0 -1
- package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
- package/dist/extension.js +0 -31293
- package/dist/src/lib/FilePicker.svelte +0 -360
- package/dist/src/lib/MillerIndexInput.svelte +0 -66
- package/dist/src/lib/api/mp.ts +0 -26
- package/dist/src/lib/api/optimade.ts +0 -204
- package/dist/src/lib/brillouin/BrillouinZone.svelte +0 -549
- package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +0 -144
- package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +0 -146
- package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +0 -146
- package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +0 -476
- package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +0 -92
- package/dist/src/lib/brillouin/compute.ts +0 -529
- package/dist/src/lib/brillouin/index.ts +0 -8
- package/dist/src/lib/brillouin/types.ts +0 -51
- package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +0 -327
- package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +0 -846
- package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +0 -3193
- package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +0 -94
- package/dist/src/lib/chempot-diagram/chempot-worker.ts +0 -11
- package/dist/src/lib/chempot-diagram/color.ts +0 -42
- package/dist/src/lib/chempot-diagram/compute.ts +0 -1014
- package/dist/src/lib/chempot-diagram/index.ts +0 -6
- package/dist/src/lib/chempot-diagram/pointer.ts +0 -56
- package/dist/src/lib/chempot-diagram/temperature.ts +0 -77
- package/dist/src/lib/chempot-diagram/types.ts +0 -130
- package/dist/src/lib/colors/index.ts +0 -249
- package/dist/src/lib/composition/BarChart.svelte +0 -297
- package/dist/src/lib/composition/BubbleChart.svelte +0 -218
- package/dist/src/lib/composition/Composition.svelte +0 -165
- package/dist/src/lib/composition/Formula.svelte +0 -268
- package/dist/src/lib/composition/FormulaFilter.svelte +0 -1257
- package/dist/src/lib/composition/PieChart.svelte +0 -323
- package/dist/src/lib/composition/format.ts +0 -155
- package/dist/src/lib/composition/index.ts +0 -37
- package/dist/src/lib/composition/parse.ts +0 -605
- package/dist/src/lib/constants.ts +0 -134
- package/dist/src/lib/controls.ts +0 -42
- package/dist/src/lib/convex-hull/ConvexHull.svelte +0 -157
- package/dist/src/lib/convex-hull/ConvexHull2D.svelte +0 -825
- package/dist/src/lib/convex-hull/ConvexHull3D.svelte +0 -1801
- package/dist/src/lib/convex-hull/ConvexHull4D.svelte +0 -1398
- package/dist/src/lib/convex-hull/ConvexHullControls.svelte +0 -535
- package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +0 -125
- package/dist/src/lib/convex-hull/ConvexHullStats.svelte +0 -929
- package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +0 -131
- package/dist/src/lib/convex-hull/GasPressureControls.svelte +0 -247
- package/dist/src/lib/convex-hull/StructurePopup.svelte +0 -151
- package/dist/src/lib/convex-hull/barycentric-coords.ts +0 -246
- package/dist/src/lib/convex-hull/demo-temperature.ts +0 -63
- package/dist/src/lib/convex-hull/gas-thermodynamics.ts +0 -405
- package/dist/src/lib/convex-hull/helpers.ts +0 -932
- package/dist/src/lib/convex-hull/index.ts +0 -202
- package/dist/src/lib/convex-hull/thermodynamics.ts +0 -2192
- package/dist/src/lib/convex-hull/types.ts +0 -267
- package/dist/src/lib/coordination/CoordinationBarPlot.svelte +0 -311
- package/dist/src/lib/coordination/calc-coordination.ts +0 -93
- package/dist/src/lib/coordination/index.ts +0 -9
- package/dist/src/lib/effects.svelte.ts +0 -48
- package/dist/src/lib/element/ElementHeading.svelte +0 -26
- package/dist/src/lib/element/ElementPhoto.svelte +0 -57
- package/dist/src/lib/element/ElementStats.svelte +0 -80
- package/dist/src/lib/element/ElementTile.svelte +0 -484
- package/dist/src/lib/element/data.ts +0 -14
- package/dist/src/lib/element/index.ts +0 -8
- package/dist/src/lib/element/types.ts +0 -62
- package/dist/src/lib/feedback/ClickFeedback.svelte +0 -58
- package/dist/src/lib/feedback/DragOverlay.svelte +0 -42
- package/dist/src/lib/feedback/index.ts +0 -4
- package/dist/src/lib/fermi-surface/FermiSlice.svelte +0 -189
- package/dist/src/lib/fermi-surface/FermiSurface.svelte +0 -600
- package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +0 -448
- package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +0 -794
- package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
- package/dist/src/lib/fermi-surface/compute.ts +0 -728
- package/dist/src/lib/fermi-surface/constants.ts +0 -32
- package/dist/src/lib/fermi-surface/export.ts +0 -64
- package/dist/src/lib/fermi-surface/index.ts +0 -14
- package/dist/src/lib/fermi-surface/marching-cubes.ts +0 -3
- package/dist/src/lib/fermi-surface/parse.ts +0 -574
- package/dist/src/lib/fermi-surface/symmetry.ts +0 -56
- package/dist/src/lib/fermi-surface/types.ts +0 -159
- package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +0 -1545
- package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
- package/dist/src/lib/heatmap-matrix/index.ts +0 -167
- package/dist/src/lib/heatmap-matrix/shared.ts +0 -7
- package/dist/src/lib/icons.ts +0 -650
- package/dist/src/lib/index.ts +0 -61
- package/dist/src/lib/io/decompress.ts +0 -92
- package/dist/src/lib/io/export.ts +0 -385
- package/dist/src/lib/io/fetch.ts +0 -46
- package/dist/src/lib/io/file-drop.ts +0 -51
- package/dist/src/lib/io/index.ts +0 -7
- package/dist/src/lib/io/is-binary.ts +0 -24
- package/dist/src/lib/io/types.ts +0 -8
- package/dist/src/lib/io/url-drop.ts +0 -141
- package/dist/src/lib/isosurface/Isosurface.svelte +0 -285
- package/dist/src/lib/isosurface/IsosurfaceControls.svelte +0 -277
- package/dist/src/lib/isosurface/index.ts +0 -7
- package/dist/src/lib/isosurface/parse.ts +0 -656
- package/dist/src/lib/isosurface/slice.ts +0 -175
- package/dist/src/lib/isosurface/types.ts +0 -309
- package/dist/src/lib/labels.ts +0 -320
- package/dist/src/lib/layout/FullscreenToggle.svelte +0 -50
- package/dist/src/lib/layout/InfoCard.svelte +0 -120
- package/dist/src/lib/layout/InfoTag.svelte +0 -185
- package/dist/src/lib/layout/PropertyFilter.svelte +0 -246
- package/dist/src/lib/layout/SettingsSection.svelte +0 -148
- package/dist/src/lib/layout/SubpageGrid.svelte +0 -82
- package/dist/src/lib/layout/fullscreen.ts +0 -65
- package/dist/src/lib/layout/index.ts +0 -11
- package/dist/src/lib/layout/json-tree/JsonNode.svelte +0 -548
- package/dist/src/lib/layout/json-tree/JsonTree.svelte +0 -1230
- package/dist/src/lib/layout/json-tree/index.ts +0 -3
- package/dist/src/lib/layout/json-tree/types.ts +0 -126
- package/dist/src/lib/layout/json-tree/utils.ts +0 -682
- package/dist/src/lib/marching-cubes.ts +0 -614
- package/dist/src/lib/math.ts +0 -1081
- package/dist/src/lib/overlays/ContextMenu.svelte +0 -162
- package/dist/src/lib/overlays/CopyButton.svelte +0 -45
- package/dist/src/lib/overlays/DragControlTab.svelte +0 -98
- package/dist/src/lib/overlays/DraggablePane.svelte +0 -487
- package/dist/src/lib/overlays/InfoPaneCards.svelte +0 -149
- package/dist/src/lib/overlays/index.ts +0 -3
- package/dist/src/lib/periodic-table/PeriodicTable.svelte +0 -469
- package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +0 -557
- package/dist/src/lib/periodic-table/PropertySelect.svelte +0 -37
- package/dist/src/lib/periodic-table/index.ts +0 -12
- package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
- package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +0 -444
- package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
- package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +0 -184
- package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +0 -391
- package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +0 -203
- package/dist/src/lib/phase-diagram/build-diagram.ts +0 -186
- package/dist/src/lib/phase-diagram/colors.ts +0 -58
- package/dist/src/lib/phase-diagram/diagram-input.ts +0 -40
- package/dist/src/lib/phase-diagram/index.ts +0 -13
- package/dist/src/lib/phase-diagram/parse.ts +0 -348
- package/dist/src/lib/phase-diagram/svg-to-diagram.ts +0 -1023
- package/dist/src/lib/phase-diagram/types.ts +0 -144
- package/dist/src/lib/phase-diagram/utils.ts +0 -775
- package/dist/src/lib/plot/AxisLabel.svelte +0 -51
- package/dist/src/lib/plot/BarPlot.svelte +0 -2113
- package/dist/src/lib/plot/BarPlotControls.svelte +0 -66
- package/dist/src/lib/plot/BinnedScatterPlot.svelte +0 -1114
- package/dist/src/lib/plot/ColorBar.svelte +0 -721
- package/dist/src/lib/plot/ColorScaleSelect.svelte +0 -54
- package/dist/src/lib/plot/ElementScatter.svelte +0 -63
- package/dist/src/lib/plot/Histogram.svelte +0 -1558
- package/dist/src/lib/plot/HistogramControls.svelte +0 -212
- package/dist/src/lib/plot/InteractiveAxisLabel.svelte +0 -96
- package/dist/src/lib/plot/Line.svelte +0 -84
- package/dist/src/lib/plot/PlotAxis.svelte +0 -169
- package/dist/src/lib/plot/PlotControls.svelte +0 -537
- package/dist/src/lib/plot/PlotLegend.svelte +0 -569
- package/dist/src/lib/plot/PlotTooltip.svelte +0 -67
- package/dist/src/lib/plot/PortalSelect.svelte +0 -253
- package/dist/src/lib/plot/ReferenceLine3D.svelte +0 -156
- package/dist/src/lib/plot/ReferencePlane.svelte +0 -175
- package/dist/src/lib/plot/ScatterPlot.svelte +0 -2778
- package/dist/src/lib/plot/ScatterPlot3D.svelte +0 -529
- package/dist/src/lib/plot/ScatterPlot3DControls.svelte +0 -437
- package/dist/src/lib/plot/ScatterPlot3DScene.svelte +0 -912
- package/dist/src/lib/plot/ScatterPlotControls.svelte +0 -306
- package/dist/src/lib/plot/ScatterPoint.svelte +0 -182
- package/dist/src/lib/plot/SpacegroupBarPlot.svelte +0 -293
- package/dist/src/lib/plot/Surface3D.svelte +0 -197
- package/dist/src/lib/plot/ZeroLines.svelte +0 -97
- package/dist/src/lib/plot/ZoomRect.svelte +0 -23
- package/dist/src/lib/plot/adaptive-density.ts +0 -316
- package/dist/src/lib/plot/auto-place.ts +0 -184
- package/dist/src/lib/plot/axis-utils.ts +0 -122
- package/dist/src/lib/plot/binned-scatter-types.ts +0 -83
- package/dist/src/lib/plot/data-cleaning.ts +0 -1069
- package/dist/src/lib/plot/data-transform.ts +0 -69
- package/dist/src/lib/plot/defaults.ts +0 -9
- package/dist/src/lib/plot/fill-utils.ts +0 -494
- package/dist/src/lib/plot/hover-lock.svelte.ts +0 -60
- package/dist/src/lib/plot/index.ts +0 -53
- package/dist/src/lib/plot/interactions.ts +0 -119
- package/dist/src/lib/plot/layout.ts +0 -425
- package/dist/src/lib/plot/reference-line.ts +0 -426
- package/dist/src/lib/plot/scales.ts +0 -654
- package/dist/src/lib/plot/svg.ts +0 -23
- package/dist/src/lib/plot/types.ts +0 -1144
- package/dist/src/lib/plot/utils/label-placement.ts +0 -541
- package/dist/src/lib/plot/utils/series-visibility.ts +0 -140
- package/dist/src/lib/plot/utils.ts +0 -11
- package/dist/src/lib/rdf/RdfPlot.svelte +0 -247
- package/dist/src/lib/rdf/calc-rdf.ts +0 -167
- package/dist/src/lib/rdf/index.ts +0 -27
- package/dist/src/lib/sanitize.ts +0 -126
- package/dist/src/lib/settings.ts +0 -1479
- package/dist/src/lib/spectral/Bands.svelte +0 -1040
- package/dist/src/lib/spectral/BandsAndDos.svelte +0 -134
- package/dist/src/lib/spectral/BrillouinBandsDos.svelte +0 -252
- package/dist/src/lib/spectral/Dos.svelte +0 -697
- package/dist/src/lib/spectral/helpers.ts +0 -1381
- package/dist/src/lib/spectral/index.ts +0 -8
- package/dist/src/lib/spectral/types.ts +0 -112
- package/dist/src/lib/state.svelte.ts +0 -64
- package/dist/src/lib/structure/Arrow.svelte +0 -72
- package/dist/src/lib/structure/AtomLegend.svelte +0 -815
- package/dist/src/lib/structure/Bond.svelte +0 -140
- package/dist/src/lib/structure/CanvasTooltip.svelte +0 -33
- package/dist/src/lib/structure/CellSelect.svelte +0 -349
- package/dist/src/lib/structure/Cylinder.svelte +0 -45
- package/dist/src/lib/structure/Lattice.svelte +0 -196
- package/dist/src/lib/structure/Structure.svelte +0 -2248
- package/dist/src/lib/structure/StructureControls.svelte +0 -1273
- package/dist/src/lib/structure/StructureExportPane.svelte +0 -252
- package/dist/src/lib/structure/StructureInfoPane.svelte +0 -737
- package/dist/src/lib/structure/StructureScene.svelte +0 -2255
- package/dist/src/lib/structure/atom-properties.ts +0 -316
- package/dist/src/lib/structure/bond-order-perception.ts +0 -447
- package/dist/src/lib/structure/bonding.ts +0 -944
- package/dist/src/lib/structure/export.ts +0 -861
- package/dist/src/lib/structure/index.ts +0 -291
- package/dist/src/lib/structure/label-placement.ts +0 -130
- package/dist/src/lib/structure/measure.ts +0 -45
- package/dist/src/lib/structure/parse.ts +0 -1705
- package/dist/src/lib/structure/partial-occupancy.ts +0 -183
- package/dist/src/lib/structure/pbc.ts +0 -164
- package/dist/src/lib/structure/supercell.ts +0 -226
- package/dist/src/lib/structure/validation.ts +0 -11
- package/dist/src/lib/symmetry/SymmetryStats.svelte +0 -226
- package/dist/src/lib/symmetry/WyckoffTable.svelte +0 -120
- package/dist/src/lib/symmetry/cell-transform.ts +0 -118
- package/dist/src/lib/symmetry/index.ts +0 -348
- package/dist/src/lib/symmetry/spacegroups.ts +0 -404
- package/dist/src/lib/table/HeatmapTable.svelte +0 -1833
- package/dist/src/lib/table/ToggleMenu.svelte +0 -385
- package/dist/src/lib/table/index.ts +0 -139
- package/dist/src/lib/theme/ThemeControl.svelte +0 -53
- package/dist/src/lib/theme/index.ts +0 -107
- package/dist/src/lib/time.ts +0 -71
- package/dist/src/lib/tooltip/TooltipContent.svelte +0 -58
- package/dist/src/lib/tooltip/index.ts +0 -2
- package/dist/src/lib/tooltip/types.ts +0 -13
- package/dist/src/lib/trajectory/Trajectory.svelte +0 -1545
- package/dist/src/lib/trajectory/TrajectoryError.svelte +0 -128
- package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +0 -357
- package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +0 -313
- package/dist/src/lib/trajectory/constants.ts +0 -7
- package/dist/src/lib/trajectory/extract.ts +0 -196
- package/dist/src/lib/trajectory/format-detect.ts +0 -96
- package/dist/src/lib/trajectory/frame-reader.ts +0 -456
- package/dist/src/lib/trajectory/helpers.ts +0 -217
- package/dist/src/lib/trajectory/index.ts +0 -218
- package/dist/src/lib/trajectory/parse/ase.ts +0 -109
- package/dist/src/lib/trajectory/parse/hdf5.ts +0 -173
- package/dist/src/lib/trajectory/parse/index.ts +0 -411
- package/dist/src/lib/trajectory/parse/lammps.ts +0 -215
- package/dist/src/lib/trajectory/parse/vasp.ts +0 -102
- package/dist/src/lib/trajectory/parse/xyz.ts +0 -143
- package/dist/src/lib/trajectory/plotting.ts +0 -599
- package/dist/src/lib/trajectory/types.ts +0 -13
- package/dist/src/lib/utils.ts +0 -56
- package/dist/src/lib/xrd/XrdPlot.svelte +0 -615
- package/dist/src/lib/xrd/broadening.ts +0 -130
- package/dist/src/lib/xrd/calc-xrd.ts +0 -397
- package/dist/src/lib/xrd/index.ts +0 -38
- package/dist/src/lib/xrd/parse.ts +0 -858
- package/dist/webview.js +0 -29421
- package/icon.png +0 -0
- package/matterviz-0.3.2.vsix +0 -0
- package/matterviz-0.3.4.vsix +0 -0
- package/matterviz-0.3.5.vsix +0 -0
- package/scripts/sync-config.ts +0 -101
- package/src/declarations.d.ts +0 -2
- package/src/extension.ts +0 -972
- package/src/node-io.ts +0 -65
- package/src/types.ts +0 -17
- package/src/webview/JsonBrowser.svelte +0 -1079
- package/src/webview/PlotPanel.svelte +0 -346
- package/src/webview/detect.ts +0 -444
- package/src/webview/main.ts +0 -764
- package/src/webview/plot-utils.ts +0 -250
- package/test-fixtures/all-viz-types.json.gz +0 -0
- package/test-fixtures/plot-demo-data.json.gz +0 -0
- package/tests/detect.test.ts +0 -604
- package/tests/extension.test.ts +0 -2041
- package/tests/node-io.test.ts +0 -39
- package/tests/plot-utils.test.ts +0 -302
- package/tests/vite-plugin-json-gz.test.ts +0 -114
- package/tests/vscode-mock.ts +0 -18
- package/tests/webview.test.ts +0 -231
- package/tsconfig.json +0 -20
- package/vite-plugin-json-gz.ts +0 -29
- package/vite.config.ts +0 -34
- package/vite.extension.config.ts +0 -34
- /package/dist/{src/lib/EmptyState.svelte → EmptyState.svelte} +0 -0
- /package/dist/{src/lib/Icon.svelte → Icon.svelte} +0 -0
- /package/dist/{src/lib/app.css → app.css} +0 -0
- /package/dist/{src/lib/chempot-diagram → chempot-diagram}/ChemPotScene3D.svelte +0 -0
- /package/dist/{src/lib/colors → colors}/alloy-colors.json +0 -0
- /package/dist/{src/lib/colors → colors}/dark-mode-colors.json +0 -0
- /package/dist/{src/lib/colors → colors}/jmol-colors.json +0 -0
- /package/dist/{src/lib/colors → colors}/muted-colors.json +0 -0
- /package/dist/{src/lib/colors → colors}/pastel-colors.json +0 -0
- /package/dist/{src/lib/colors → colors}/vesta-colors.json +0 -0
- /package/dist/{src/lib/convex-hull → convex-hull}/TemperatureSlider.svelte +0 -0
- /package/dist/{src/lib/element → element}/BohrAtom.svelte +0 -0
- /package/dist/{src/lib/element → element}/Nucleus.svelte +0 -0
- /package/dist/{src/lib/element → element}/data.json +0 -0
- /package/dist/{src/lib/element → element}/data.json.gz +0 -0
- /package/dist/{src/lib/element → element}/data.json.gz.d.ts +0 -0
- /package/dist/{src/lib/element → element}/data.schema.json +0 -0
- /package/dist/{src/lib/element-image-urls.json → element-image-urls.json} +0 -0
- /package/dist/{src/lib/feedback → feedback}/Spinner.svelte +0 -0
- /package/dist/{src/lib/feedback → feedback}/StatusMessage.svelte +0 -0
- /package/dist/{src/lib/layout → layout}/json-tree/JsonValue.svelte +0 -0
- /package/dist/{src/lib/periodic-table → periodic-table}/TableInset.svelte +0 -0
- /package/dist/{src/lib/plot → plot}/FillArea.svelte +0 -0
- /package/dist/{src/lib/plot → plot}/ReferenceLine.svelte +0 -0
- /package/dist/{src/lib/theme → theme}/themes.mjs +0 -0
- /package/dist/{src/lib/xrd → xrd}/atomic_scattering_params.json +0 -0
|
@@ -1,858 +0,0 @@
|
|
|
1
|
-
import type { XrdPattern } from './index'
|
|
2
|
-
|
|
3
|
-
// Maximum number of data points to keep after subsampling for performance
|
|
4
|
-
const MAX_POINTS = 1000
|
|
5
|
-
|
|
6
|
-
// Default step size in degrees for XRD scans when not specified in file
|
|
7
|
-
const DEFAULT_STEP_SIZE = 0.02
|
|
8
|
-
|
|
9
|
-
// Generate x values from scan parameters (start angle, step size, point count).
|
|
10
|
-
// Used by formats that store metadata + intensity-only data.
|
|
11
|
-
const generate_x_from_scan = (start: number, step: number, count: number): number[] =>
|
|
12
|
-
Array.from({ length: count }, (_, idx) => start + idx * step)
|
|
13
|
-
|
|
14
|
-
// Create normalized XrdPattern from scan metadata and intensities.
|
|
15
|
-
// Returns null if no intensity data. Used by all parsers as final step.
|
|
16
|
-
function create_pattern(
|
|
17
|
-
start: number,
|
|
18
|
-
step: number,
|
|
19
|
-
intensities: number[],
|
|
20
|
-
): XrdPattern | null {
|
|
21
|
-
if (intensities.length === 0) return null
|
|
22
|
-
const x_values = generate_x_from_scan(start, step, intensities.length)
|
|
23
|
-
const normalized = normalize_and_subsample(x_values, intensities)
|
|
24
|
-
return { x: normalized.x, y: normalized.y }
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Parse whitespace-separated numbers from text. Used by multiple formats.
|
|
28
|
-
const parse_number_list = (text: string): number[] =>
|
|
29
|
-
text
|
|
30
|
-
.trim()
|
|
31
|
-
.split(/\s+/)
|
|
32
|
-
.map(parseFloat)
|
|
33
|
-
.filter((val) => !isNaN(val))
|
|
34
|
-
|
|
35
|
-
// Extract numeric value from header line matching "KEY=VALUE" or "KEY VALUE" pattern.
|
|
36
|
-
// Returns null if not found or not a valid number.
|
|
37
|
-
function extract_header_value(lines: string[], key_pattern: RegExp): number | null {
|
|
38
|
-
for (const line of lines) {
|
|
39
|
-
const match = line.match(key_pattern)
|
|
40
|
-
if (match?.[1]) {
|
|
41
|
-
const val = parseFloat(match[1])
|
|
42
|
-
if (!isNaN(val)) return val
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return null
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Normalize y values to 0-100 range and subsample if too many points.
|
|
49
|
-
// This ensures consistent scaling across different file formats and improves rendering performance.
|
|
50
|
-
function normalize_and_subsample(
|
|
51
|
-
x_values: number[],
|
|
52
|
-
y_values: number[],
|
|
53
|
-
): { x: number[]; y: number[] } {
|
|
54
|
-
if (x_values.length === 0) return { x: [], y: [] }
|
|
55
|
-
|
|
56
|
-
// Normalize y to 0-100
|
|
57
|
-
const max_y = Math.max(...y_values)
|
|
58
|
-
const scale = max_y > 0 ? 100 / max_y : 1
|
|
59
|
-
let norm_y = y_values.map((val) => val * scale)
|
|
60
|
-
let norm_x = x_values
|
|
61
|
-
|
|
62
|
-
// Subsample if too many points using LTTB-like algorithm (preserving peaks)
|
|
63
|
-
if (norm_x.length > MAX_POINTS) {
|
|
64
|
-
const result = subsample_preserve_peaks(norm_x, norm_y, MAX_POINTS)
|
|
65
|
-
norm_x = result.x
|
|
66
|
-
norm_y = result.y
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return { x: norm_x, y: norm_y }
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Subsample data while preserving peaks (local maxima).
|
|
73
|
-
// Uses a combination of uniform sampling and peak preservation.
|
|
74
|
-
function subsample_preserve_peaks(
|
|
75
|
-
x_values: number[],
|
|
76
|
-
y_values: number[],
|
|
77
|
-
target_points: number,
|
|
78
|
-
): { x: number[]; y: number[] } {
|
|
79
|
-
const num_points = x_values.length
|
|
80
|
-
if (num_points <= target_points) return { x: x_values, y: y_values }
|
|
81
|
-
|
|
82
|
-
// Find peaks (local maxima with significant height)
|
|
83
|
-
const peaks: number[] = []
|
|
84
|
-
const threshold = Math.max(...y_values) * 0.05 // 5% of max as significance threshold
|
|
85
|
-
for (let idx = 1; idx < num_points - 1; idx++) {
|
|
86
|
-
if (
|
|
87
|
-
y_values[idx] > y_values[idx - 1] &&
|
|
88
|
-
y_values[idx] > y_values[idx + 1] &&
|
|
89
|
-
y_values[idx] > threshold
|
|
90
|
-
) {
|
|
91
|
-
peaks.push(idx)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Reserve slots for peaks, distribute remaining uniformly
|
|
96
|
-
const peak_slots = Math.min(peaks.length, Math.floor(target_points * 0.3))
|
|
97
|
-
const uniform_slots = target_points - peak_slots
|
|
98
|
-
|
|
99
|
-
// Select top peaks by height
|
|
100
|
-
const top_peaks = peaks
|
|
101
|
-
.map((idx) => ({ idx, y: y_values[idx] }))
|
|
102
|
-
.sort((a, b) => b.y - a.y)
|
|
103
|
-
.slice(0, peak_slots)
|
|
104
|
-
.map((peak) => peak.idx)
|
|
105
|
-
|
|
106
|
-
// Uniform sampling (guard against division by zero)
|
|
107
|
-
const uniform_indices = new Set<number>()
|
|
108
|
-
if (uniform_slots > 1) {
|
|
109
|
-
const step = (num_points - 1) / (uniform_slots - 1)
|
|
110
|
-
for (let idx = 0; idx < uniform_slots; idx++) {
|
|
111
|
-
uniform_indices.add(Math.round(idx * step))
|
|
112
|
-
}
|
|
113
|
-
} else if (uniform_slots === 1) {
|
|
114
|
-
uniform_indices.add(0) // Just include the first point
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Merge and sort all selected indices
|
|
118
|
-
const selected = [...new Set([...uniform_indices, ...top_peaks])].sort((a, b) => a - b)
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
x: selected.map((idx) => x_values[idx]),
|
|
122
|
-
y: selected.map((idx) => y_values[idx]),
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Parse a two-column ASCII file containing XRD data (2θ, intensity).
|
|
127
|
-
// Supports space, tab, or comma delimiters. Ignores comment lines starting with #, ;, or !
|
|
128
|
-
// Also handles .xye (third error column ignored), .csv, .dat, .asc formats.
|
|
129
|
-
export function parse_xy_file(content: string): XrdPattern | null {
|
|
130
|
-
const lines = content.split(/\r?\n/)
|
|
131
|
-
const x_values: number[] = []
|
|
132
|
-
const y_values: number[] = []
|
|
133
|
-
|
|
134
|
-
for (const line of lines) {
|
|
135
|
-
const trimmed = line.trim()
|
|
136
|
-
// Skip empty lines and common comment prefixes
|
|
137
|
-
if (!trimmed || /^[#;!]/.test(trimmed)) continue
|
|
138
|
-
|
|
139
|
-
// Split by whitespace or comma
|
|
140
|
-
const parts = trimmed.split(/[\s,]+/).filter(Boolean)
|
|
141
|
-
if (parts.length < 2) continue
|
|
142
|
-
|
|
143
|
-
const two_theta = parseFloat(parts[0])
|
|
144
|
-
const intensity = parseFloat(parts[1])
|
|
145
|
-
|
|
146
|
-
if (!isNaN(two_theta) && !isNaN(intensity)) {
|
|
147
|
-
x_values.push(two_theta)
|
|
148
|
-
y_values.push(intensity)
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (x_values.length === 0) return null
|
|
153
|
-
|
|
154
|
-
const normalized = normalize_and_subsample(x_values, y_values)
|
|
155
|
-
return { x: normalized.x, y: normalized.y }
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Parse a .xye file containing three-column XRD data (2θ, intensity, error).
|
|
159
|
-
// Same as .xy but with an optional third column for uncertainties (ignored for plotting).
|
|
160
|
-
export function parse_xye_file(content: string): XrdPattern | null {
|
|
161
|
-
// XYE is just XY with an extra error column - reuse parse_xy_file which already
|
|
162
|
-
// handles extra columns by only taking the first two
|
|
163
|
-
return parse_xy_file(content)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Parse a Rigaku .ras file (ASCII format with structured header).
|
|
167
|
-
// Format: *RAS_HEADER_START ... *RAS_HEADER_END followed by *RAS_INT_START ... *RAS_INT_END
|
|
168
|
-
// Data can be single-column (intensity only) or multi-column (2-theta, intensity, [error])
|
|
169
|
-
export function parse_ras_file(content: string): XrdPattern | null {
|
|
170
|
-
const lines = content.split(/\r?\n/)
|
|
171
|
-
|
|
172
|
-
// Extract header values (used as fallback for single-column data)
|
|
173
|
-
const header_start =
|
|
174
|
-
extract_header_value(lines, /\*MEAS_SCAN_START\s*=\s*([\d.+-]+)/i) ??
|
|
175
|
-
extract_header_value(lines, /\*SCAN_START\s*=\s*([\d.+-]+)/i) ??
|
|
176
|
-
0
|
|
177
|
-
const header_step =
|
|
178
|
-
extract_header_value(lines, /\*MEAS_SCAN_STEP\s*=\s*([\d.+-]+)/i) ??
|
|
179
|
-
extract_header_value(lines, /\*SCAN_STEP\s*=\s*([\d.+-]+)/i) ??
|
|
180
|
-
DEFAULT_STEP_SIZE
|
|
181
|
-
|
|
182
|
-
// Find intensity data section between *RAS_INT_START and *RAS_INT_END
|
|
183
|
-
// Also handle older format with *RAS_DATA_START
|
|
184
|
-
let in_data_section = false
|
|
185
|
-
const data_lines: string[] = []
|
|
186
|
-
|
|
187
|
-
for (const line of lines) {
|
|
188
|
-
const trimmed = line.trim()
|
|
189
|
-
if (/^\*RAS_INT_START/i.test(trimmed) || /^\*RAS_DATA_START/i.test(trimmed)) {
|
|
190
|
-
in_data_section = true
|
|
191
|
-
continue
|
|
192
|
-
}
|
|
193
|
-
if (/^\*RAS_INT_END/i.test(trimmed) || /^\*RAS_DATA_END/i.test(trimmed)) break
|
|
194
|
-
if (in_data_section && trimmed) data_lines.push(trimmed)
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Fallback: if no section markers, try parsing all numeric lines after header
|
|
198
|
-
if (data_lines.length === 0) {
|
|
199
|
-
let past_header = false
|
|
200
|
-
for (const line of lines) {
|
|
201
|
-
const trimmed = line.trim()
|
|
202
|
-
if (/^\*RAS_HEADER_END/i.test(trimmed)) {
|
|
203
|
-
past_header = true
|
|
204
|
-
continue
|
|
205
|
-
}
|
|
206
|
-
if (past_header && trimmed && !trimmed.startsWith(`*`)) {
|
|
207
|
-
const values = parse_number_list(trimmed)
|
|
208
|
-
if (values.length > 0) data_lines.push(trimmed)
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (data_lines.length === 0) return null
|
|
214
|
-
|
|
215
|
-
// Multi-column (2-theta, intensity, [error]): reuse parse_xy_file
|
|
216
|
-
// Detect by: 2-3 values per line, multiple rows, first column monotonically increasing
|
|
217
|
-
// (angles increase during a scan, intensities do not follow this pattern)
|
|
218
|
-
const first_values = parse_number_list(data_lines[0])
|
|
219
|
-
const has_column_structure =
|
|
220
|
-
first_values.length >= 2 && first_values.length <= 3 && data_lines.length > 1
|
|
221
|
-
|
|
222
|
-
if (has_column_structure) {
|
|
223
|
-
// Check if first column values are monotonically increasing (characteristic of angle data)
|
|
224
|
-
// Sample a few lines to verify the pattern
|
|
225
|
-
const sample_count = Math.min(5, data_lines.length)
|
|
226
|
-
let [is_monotonic, prev_angle] = [true, first_values[0]]
|
|
227
|
-
|
|
228
|
-
for (let idx = 1; idx < sample_count; idx++) {
|
|
229
|
-
const values = parse_number_list(data_lines[idx])
|
|
230
|
-
if (values.length < 2 || values[0] <= prev_angle) {
|
|
231
|
-
is_monotonic = false
|
|
232
|
-
break
|
|
233
|
-
}
|
|
234
|
-
prev_angle = values[0]
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if (is_monotonic) return parse_xy_file(data_lines.join(`\n`))
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Single-column or many space-separated intensities: use header start/step
|
|
241
|
-
const intensities = data_lines.flatMap(parse_number_list)
|
|
242
|
-
return create_pattern(header_start, header_step, intensities)
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Parse a Siemens/Bruker .uxd file (ASCII format with underscore-prefixed header).
|
|
246
|
-
// Format: _KEY=VALUE or _KEY VALUE header lines, followed by _COUNTS section.
|
|
247
|
-
export function parse_uxd_file(content: string): XrdPattern | null {
|
|
248
|
-
const lines = content.split(/\r?\n/)
|
|
249
|
-
|
|
250
|
-
// Extract header values (underscore-prefixed keys)
|
|
251
|
-
const start =
|
|
252
|
-
extract_header_value(lines, /_2THETA_?START\s*=?\s*([\d.+-]+)/i) ??
|
|
253
|
-
extract_header_value(lines, /_START\s*=?\s*([\d.+-]+)/i) ??
|
|
254
|
-
0
|
|
255
|
-
const step =
|
|
256
|
-
extract_header_value(lines, /_STEP_?SIZE\s*=?\s*([\d.+-]+)/i) ??
|
|
257
|
-
extract_header_value(lines, /_STEPWIDTH\s*=?\s*([\d.+-]+)/i) ??
|
|
258
|
-
DEFAULT_STEP_SIZE
|
|
259
|
-
|
|
260
|
-
// Find intensity data after _COUNTS marker
|
|
261
|
-
let in_data_section = false
|
|
262
|
-
const intensities: number[] = []
|
|
263
|
-
|
|
264
|
-
for (const line of lines) {
|
|
265
|
-
const trimmed = line.trim()
|
|
266
|
-
// Skip comments
|
|
267
|
-
if (trimmed.startsWith(`;`)) continue
|
|
268
|
-
|
|
269
|
-
if (/^_COUNTS/i.test(trimmed)) {
|
|
270
|
-
in_data_section = true
|
|
271
|
-
continue
|
|
272
|
-
}
|
|
273
|
-
// New header section ends data
|
|
274
|
-
if (in_data_section && trimmed.startsWith(`_`)) {
|
|
275
|
-
break
|
|
276
|
-
}
|
|
277
|
-
if (in_data_section && trimmed) {
|
|
278
|
-
const values = parse_number_list(trimmed)
|
|
279
|
-
intensities.push(...values)
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// Fallback: if no _COUNTS marker, try two-column format
|
|
284
|
-
if (intensities.length === 0) return parse_xy_file(content)
|
|
285
|
-
|
|
286
|
-
return create_pattern(start, step, intensities)
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Parse a GSAS powder diffraction file.
|
|
290
|
-
// Handles both STD (constant step) and ESD (explicit positions) formats.
|
|
291
|
-
// BANK header contains metadata: BANK n NPTS NCHAN BINTYPE BCOEF1 BCOEF2 ...
|
|
292
|
-
export function parse_gsas_file(content: string): XrdPattern | null {
|
|
293
|
-
const lines = content.split(/\r?\n/)
|
|
294
|
-
|
|
295
|
-
// Find BANK header line (format varies by GSAS version)
|
|
296
|
-
let start = 0
|
|
297
|
-
let step = DEFAULT_STEP_SIZE
|
|
298
|
-
let bin_type = `CONST` // CONST, RALF, or others
|
|
299
|
-
let found_bank = false
|
|
300
|
-
|
|
301
|
-
for (const line of lines) {
|
|
302
|
-
const bank_match = /BANK\s+\d+\s+(\d+)\s+\d+\s+(\w+)\s+([\d.+-]+)\s+([\d.+-]+)/i.exec(line)
|
|
303
|
-
if (bank_match) {
|
|
304
|
-
bin_type = bank_match[2].toUpperCase()
|
|
305
|
-
// For CONST type: BCOEF1 is start*100 (centidegrees), BCOEF2 is step*100
|
|
306
|
-
if (bin_type === `CONST`) {
|
|
307
|
-
start = parseFloat(bank_match[3]) / 100 // Convert centidegrees to degrees
|
|
308
|
-
step = parseFloat(bank_match[4]) / 100
|
|
309
|
-
} else if (bin_type !== `FXYE`) {
|
|
310
|
-
// Other bin types like RALF (time-of-flight) are not fully supported
|
|
311
|
-
console.warn(
|
|
312
|
-
`GSAS bin type "${bin_type}" not fully supported, treating as constant-step`,
|
|
313
|
-
)
|
|
314
|
-
}
|
|
315
|
-
found_bank = true
|
|
316
|
-
break
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Collect intensity values after BANK header
|
|
321
|
-
const intensities: number[] = []
|
|
322
|
-
const is_fxye = bin_type === `FXYE` // Only use triplet parsing if BANK explicitly says FXYE
|
|
323
|
-
let past_bank = !found_bank // If no BANK header, try parsing all data
|
|
324
|
-
|
|
325
|
-
for (const line of lines) {
|
|
326
|
-
if (line.includes(`BANK`)) {
|
|
327
|
-
past_bank = true
|
|
328
|
-
continue
|
|
329
|
-
}
|
|
330
|
-
// Skip header/title lines
|
|
331
|
-
if (!past_bank || line.startsWith(`#`) || line.startsWith(`!`)) continue
|
|
332
|
-
const trimmed = line.trim()
|
|
333
|
-
if (!trimmed) continue
|
|
334
|
-
|
|
335
|
-
// GSAS uses fixed-width columns or space-separated values
|
|
336
|
-
const values = parse_number_list(trimmed)
|
|
337
|
-
// For FXYE format (x, y, e triplets), extract y values at indices 1, 4, 7, ...
|
|
338
|
-
if (is_fxye && values.length >= 3) {
|
|
339
|
-
for (let idx = 1; idx < values.length; idx += 3) {
|
|
340
|
-
intensities.push(values[idx])
|
|
341
|
-
}
|
|
342
|
-
} else {
|
|
343
|
-
intensities.push(...values)
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
return create_pattern(start, step, intensities)
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
// Bruker RAW V2 header byte offsets (little-endian)
|
|
351
|
-
const RAW_V2_HEADER_SIZE_OFFSET = 4
|
|
352
|
-
const RAW_V2_START_OFFSET = 48
|
|
353
|
-
const RAW_V2_STEP_OFFSET = 56
|
|
354
|
-
const RAW_V2_COUNT_OFFSET = 64
|
|
355
|
-
|
|
356
|
-
// Bruker RAW V4 header byte offsets (little-endian)
|
|
357
|
-
const RAW_V4_HEADER_SIZE_OFFSET = 4
|
|
358
|
-
const RAW_V4_START_OFFSET = 140
|
|
359
|
-
const RAW_V4_STEP_OFFSET = 148
|
|
360
|
-
const RAW_V4_COUNT_OFFSET = 156
|
|
361
|
-
// Alternative V4 offsets for some instrument variants
|
|
362
|
-
const RAW_V4_ALT_START_OFFSET = 76
|
|
363
|
-
const RAW_V4_ALT_STEP_OFFSET = 84
|
|
364
|
-
const RAW_V4_ALT_COUNT_OFFSET = 92
|
|
365
|
-
|
|
366
|
-
// Parse a Bruker binary .raw file.
|
|
367
|
-
// Detects format version from magic bytes and extracts scan parameters + intensities.
|
|
368
|
-
export function parse_bruker_raw_file(data: ArrayBuffer): XrdPattern | null {
|
|
369
|
-
const view = new DataView(data)
|
|
370
|
-
const bytes = new Uint8Array(data)
|
|
371
|
-
|
|
372
|
-
// Check magic bytes to determine version
|
|
373
|
-
const magic = String.fromCharCode(...bytes.slice(0, 4))
|
|
374
|
-
|
|
375
|
-
// RAW1.01 format (older)
|
|
376
|
-
if (magic === `RAW1` || magic === `RAW `) {
|
|
377
|
-
return parse_bruker_raw_v1(view, bytes)
|
|
378
|
-
}
|
|
379
|
-
// RAW2.00 format
|
|
380
|
-
if (magic === `RAW2`) {
|
|
381
|
-
return parse_bruker_raw_v2(view)
|
|
382
|
-
}
|
|
383
|
-
// RAW4 format (newer)
|
|
384
|
-
if (magic === `RAW4`) {
|
|
385
|
-
return parse_bruker_raw_v4(view)
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
// Try Rigaku RAW format (different structure)
|
|
389
|
-
// Rigaku files often start with different magic or have no magic
|
|
390
|
-
return parse_rigaku_raw_file(data)
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// Parse Bruker RAW version 1 format
|
|
394
|
-
function parse_bruker_raw_v1(view: DataView, bytes: Uint8Array): XrdPattern | null {
|
|
395
|
-
try {
|
|
396
|
-
// V1 has ASCII header with scan parameters followed by binary data
|
|
397
|
-
const header_text = String.fromCharCode(...bytes.slice(0, 512))
|
|
398
|
-
|
|
399
|
-
// Try to find scan parameters in ASCII header
|
|
400
|
-
const start_match = /START\s*=\s*([\d.+-]+)/i.exec(header_text)
|
|
401
|
-
const step_match = /STEP\s*=\s*([\d.+-]+)/i.exec(header_text)
|
|
402
|
-
const count_match = /(?:COUNT|POINTS|NPTS)\s*=\s*(\d+)/i.exec(header_text)
|
|
403
|
-
|
|
404
|
-
const start = start_match ? parseFloat(start_match[1]) : 0
|
|
405
|
-
const step = step_match ? parseFloat(step_match[1]) : DEFAULT_STEP_SIZE
|
|
406
|
-
|
|
407
|
-
// Find where binary data starts (after header)
|
|
408
|
-
let data_offset = 512
|
|
409
|
-
if (count_match) {
|
|
410
|
-
const expected_count = parseInt(count_match[1])
|
|
411
|
-
// Binary data is typically 4 bytes per intensity (float32)
|
|
412
|
-
data_offset = bytes.length - expected_count * 4
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
const intensities = read_float32_array(view, data_offset)
|
|
416
|
-
return create_pattern(start, step, intensities)
|
|
417
|
-
} catch {
|
|
418
|
-
return null
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
// Parse Bruker RAW version 2 format
|
|
423
|
-
function parse_bruker_raw_v2(view: DataView): XrdPattern | null {
|
|
424
|
-
try {
|
|
425
|
-
const header_size = view.getUint32(RAW_V2_HEADER_SIZE_OFFSET, true)
|
|
426
|
-
const start = view.getFloat64(RAW_V2_START_OFFSET, true)
|
|
427
|
-
const step = view.getFloat64(RAW_V2_STEP_OFFSET, true)
|
|
428
|
-
const count = view.getUint32(RAW_V2_COUNT_OFFSET, true)
|
|
429
|
-
|
|
430
|
-
if (count === 0 || step <= 0) return null
|
|
431
|
-
|
|
432
|
-
const intensities = read_float32_array(view, header_size, count)
|
|
433
|
-
return create_pattern(start, step, intensities)
|
|
434
|
-
} catch {
|
|
435
|
-
return null
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
// Parse Bruker RAW version 4 format
|
|
440
|
-
function parse_bruker_raw_v4(view: DataView): XrdPattern | null {
|
|
441
|
-
try {
|
|
442
|
-
const header_size = view.getUint32(RAW_V4_HEADER_SIZE_OFFSET, true)
|
|
443
|
-
let start = view.getFloat64(RAW_V4_START_OFFSET, true)
|
|
444
|
-
let step = view.getFloat64(RAW_V4_STEP_OFFSET, true)
|
|
445
|
-
let count = view.getUint32(RAW_V4_COUNT_OFFSET, true)
|
|
446
|
-
|
|
447
|
-
// Try alternative offsets for different V4 variants
|
|
448
|
-
if (count === 0 || step <= 0 || isNaN(start)) {
|
|
449
|
-
start = view.getFloat64(RAW_V4_ALT_START_OFFSET, true)
|
|
450
|
-
step = view.getFloat64(RAW_V4_ALT_STEP_OFFSET, true)
|
|
451
|
-
count = view.getUint32(RAW_V4_ALT_COUNT_OFFSET, true)
|
|
452
|
-
if (count === 0 || step <= 0 || isNaN(start)) return null
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
const intensities = read_float32_array(view, header_size, count)
|
|
456
|
-
return create_pattern(start, step, intensities)
|
|
457
|
-
} catch {
|
|
458
|
-
return null
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// Parse Rigaku binary .raw file format
|
|
463
|
-
function parse_rigaku_raw_file(data: ArrayBuffer): XrdPattern | null {
|
|
464
|
-
try {
|
|
465
|
-
const view = new DataView(data)
|
|
466
|
-
const bytes = new Uint8Array(data)
|
|
467
|
-
|
|
468
|
-
// Try to find ASCII header section with scan parameters
|
|
469
|
-
const header_text = String.fromCharCode(...bytes.slice(0, Math.min(2048, bytes.length)))
|
|
470
|
-
|
|
471
|
-
const start_match = /(?:START|2THETA_START|SCAN_START)\s*[:=]?\s*([\d.+-]+)/i.exec(
|
|
472
|
-
header_text,
|
|
473
|
-
)
|
|
474
|
-
const step_match = /(?:STEP|STEP_SIZE|SCAN_STEP)\s*[:=]?\s*([\d.+-]+)/i.exec(header_text)
|
|
475
|
-
const count_match = /(?:COUNT|POINTS|NPTS|STEPS)\s*[:=]?\s*(\d+)/i.exec(header_text)
|
|
476
|
-
|
|
477
|
-
if (!start_match && !step_match && !count_match) return null // Not a recognizable Rigaku format
|
|
478
|
-
|
|
479
|
-
const start = start_match ? parseFloat(start_match[1]) : 0
|
|
480
|
-
const step = step_match ? parseFloat(step_match[1]) : DEFAULT_STEP_SIZE
|
|
481
|
-
const expected_count = count_match ? parseInt(count_match[1]) : 0
|
|
482
|
-
|
|
483
|
-
// Find binary data section
|
|
484
|
-
// Rigaku typically stores intensities as 32-bit floats or integers
|
|
485
|
-
let data_offset = 0
|
|
486
|
-
for (let offset = 256; offset < Math.min(4096, bytes.length); offset += 4) {
|
|
487
|
-
// Look for start of reasonable intensity values
|
|
488
|
-
const val = view.getFloat32(offset, true)
|
|
489
|
-
if (val >= 0 && val < 1e10 && !isNaN(val)) {
|
|
490
|
-
data_offset = offset
|
|
491
|
-
break
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
const intensities = read_float32_array(view, data_offset, expected_count || undefined)
|
|
496
|
-
return create_pattern(start, step, intensities)
|
|
497
|
-
} catch {
|
|
498
|
-
return null
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// Read array of 32-bit floats from DataView starting at offset.
|
|
503
|
-
// Note: Negative values are allowed since background-subtracted XRD data can
|
|
504
|
-
// legitimately have negative intensities.
|
|
505
|
-
function read_float32_array(view: DataView, offset: number, count?: number): number[] {
|
|
506
|
-
const values: number[] = []
|
|
507
|
-
const max_offset = view.byteLength - 4
|
|
508
|
-
const max_count = count ?? Math.floor((view.byteLength - offset) / 4)
|
|
509
|
-
|
|
510
|
-
// Track invalid values in the first N points to detect wrong offset.
|
|
511
|
-
// Trade-off: This heuristic may reject legitimate data with corrupted initial
|
|
512
|
-
// measurements, but such cases are rare. If >50% of the first 20 values are
|
|
513
|
-
// invalid (NaN/Infinity), we assume the offset is incorrect and return early.
|
|
514
|
-
const EARLY_CHECK_COUNT = 20
|
|
515
|
-
const INVALID_THRESHOLD = 0.5
|
|
516
|
-
let invalid_count = 0
|
|
517
|
-
|
|
518
|
-
for (let idx = 0; idx < max_count && offset + idx * 4 <= max_offset; idx++) {
|
|
519
|
-
const val = view.getFloat32(offset + idx * 4, true) // little-endian
|
|
520
|
-
// Filter out invalid values (NaN, Infinity)
|
|
521
|
-
if (isNaN(val) || !isFinite(val)) {
|
|
522
|
-
if (idx < EARLY_CHECK_COUNT) {
|
|
523
|
-
invalid_count++
|
|
524
|
-
if (invalid_count > EARLY_CHECK_COUNT * INVALID_THRESHOLD) break
|
|
525
|
-
}
|
|
526
|
-
values.push(0) // Replace isolated bad values
|
|
527
|
-
} else values.push(val)
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
return values
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
// Parse a Bruker .brml file (ZIP archive containing XML data).
|
|
534
|
-
// Extracts 2θ and intensity data from the RawData XML within the archive.
|
|
535
|
-
export async function parse_brml_file(data: ArrayBuffer): Promise<XrdPattern | null> {
|
|
536
|
-
try {
|
|
537
|
-
// Lazy import fflate to avoid bundling in SSR
|
|
538
|
-
const { unzipSync } = await import(`fflate`)
|
|
539
|
-
const files = unzipSync(new Uint8Array(data))
|
|
540
|
-
|
|
541
|
-
// Find the RawData XML file (usually named RawData0.xml or similar)
|
|
542
|
-
let raw_data_xml: string | null = null
|
|
543
|
-
for (const [filename, file_data] of Object.entries(files)) {
|
|
544
|
-
if (filename.toLowerCase().includes(`rawdata`) && filename.endsWith(`.xml`)) {
|
|
545
|
-
raw_data_xml = new TextDecoder().decode(file_data)
|
|
546
|
-
break
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
// If no RawData file found, try to find any XML file with intensity data
|
|
551
|
-
if (!raw_data_xml) {
|
|
552
|
-
for (const [filename, file_data] of Object.entries(files)) {
|
|
553
|
-
if (filename.endsWith(`.xml`)) {
|
|
554
|
-
const file_content = new TextDecoder().decode(file_data)
|
|
555
|
-
// Check for various data formats used by different Bruker versions
|
|
556
|
-
if (
|
|
557
|
-
[`<Intensities>`, `<Counts>`, `<Datum>`].some((tag) => file_content.includes(tag))
|
|
558
|
-
) {
|
|
559
|
-
raw_data_xml = file_content
|
|
560
|
-
break
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
if (!raw_data_xml) return null
|
|
567
|
-
|
|
568
|
-
return parse_brml_xml(raw_data_xml)
|
|
569
|
-
} catch (error) {
|
|
570
|
-
console.error(`Failed to parse BRML file:`, error)
|
|
571
|
-
return null
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
// Parse the XML content from a BRML file to extract XRD data.
|
|
576
|
-
// Bruker BRML files contain scan parameters and intensity counts.
|
|
577
|
-
function parse_brml_xml(xml_content: string): XrdPattern | null {
|
|
578
|
-
try {
|
|
579
|
-
const parser = new DOMParser()
|
|
580
|
-
const doc = parser.parseFromString(xml_content, `application/xml`)
|
|
581
|
-
|
|
582
|
-
// Check for parsing errors
|
|
583
|
-
const parse_error = doc.querySelector(`parsererror`)
|
|
584
|
-
if (parse_error) return null
|
|
585
|
-
|
|
586
|
-
// Extract scan parameters - try multiple possible structures
|
|
587
|
-
// Bruker BRML files can have different XML schemas
|
|
588
|
-
const scan_info = extract_scan_parameters_xml(doc)
|
|
589
|
-
if (!scan_info) return null
|
|
590
|
-
|
|
591
|
-
const { start_angle, step_size, intensities } = scan_info
|
|
592
|
-
return create_pattern(start_angle, step_size, intensities)
|
|
593
|
-
} catch (error) {
|
|
594
|
-
console.error(`Failed to parse BRML XML:`, error)
|
|
595
|
-
return null
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
// Extract scan parameters and intensities from BRML XML document.
|
|
600
|
-
// Handles multiple possible XML structures used by different Bruker versions.
|
|
601
|
-
function extract_scan_parameters_xml(
|
|
602
|
-
doc: Document,
|
|
603
|
-
): { start_angle: number; step_size: number; intensities: number[] } | null {
|
|
604
|
-
// Try to find intensity data - multiple possible tag names
|
|
605
|
-
let intensities: number[] | null = null
|
|
606
|
-
let two_theta_values: number[] | null = null
|
|
607
|
-
|
|
608
|
-
// Method 1: <Intensities> tag with space-separated values
|
|
609
|
-
const intensities_el = doc.querySelector(`Intensities`)
|
|
610
|
-
if (intensities_el?.textContent) {
|
|
611
|
-
intensities = parse_number_list(intensities_el.textContent)
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
// Method 2: <Counts> tag
|
|
615
|
-
if (!intensities?.length) {
|
|
616
|
-
const counts_el = doc.querySelector(`Counts`)
|
|
617
|
-
if (counts_el?.textContent) {
|
|
618
|
-
intensities = parse_number_list(counts_el.textContent)
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
// Method 3: Individual <I> or <Count> elements
|
|
623
|
-
if (!intensities?.length) {
|
|
624
|
-
const intensity_elements = doc.querySelectorAll(`I, Count`)
|
|
625
|
-
if (intensity_elements.length > 0) {
|
|
626
|
-
intensities = Array.from(intensity_elements)
|
|
627
|
-
.map((el) => parseFloat(el.textContent || ``))
|
|
628
|
-
.filter((val) => !isNaN(val))
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
// Method 4: <Datum> elements with comma-separated values
|
|
633
|
-
// Bruker uses different formats depending on instrument/software version:
|
|
634
|
-
// - 8-column HRXRD: "1,1,TwoTheta,Omega,...,Intensity" (indices 2 and 7)
|
|
635
|
-
// - 5-column powder: "time,1,TwoTheta,Theta,Intensity" (indices 2 and 4)
|
|
636
|
-
// The intensity is always the LAST column, 2Theta is always index 2
|
|
637
|
-
if (!intensities?.length) {
|
|
638
|
-
const datum_elements = Array.from(doc.querySelectorAll(`Datum`))
|
|
639
|
-
if (datum_elements.length > 0) {
|
|
640
|
-
two_theta_values = []
|
|
641
|
-
intensities = []
|
|
642
|
-
for (const datum of datum_elements) {
|
|
643
|
-
const text = datum.textContent?.trim()
|
|
644
|
-
if (!text) continue
|
|
645
|
-
const parts = text.split(`,`)
|
|
646
|
-
// Need at least 5 columns: time, flag, 2Theta, Theta/Omega, Intensity
|
|
647
|
-
if (parts.length >= 5) {
|
|
648
|
-
const two_theta = parseFloat(parts[2])
|
|
649
|
-
// Intensity is always the last column
|
|
650
|
-
const intensity = parseFloat(parts[parts.length - 1])
|
|
651
|
-
if (!isNaN(two_theta) && !isNaN(intensity)) {
|
|
652
|
-
two_theta_values.push(two_theta)
|
|
653
|
-
intensities.push(intensity)
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
// If we have extracted 2θ values directly, return early with them
|
|
658
|
-
if (two_theta_values.length > 0 && intensities.length > 0) {
|
|
659
|
-
// Calculate step size from actual data (fallback 0.002° typical for HRXRD)
|
|
660
|
-
const step_size =
|
|
661
|
-
two_theta_values.length > 1
|
|
662
|
-
? (two_theta_values[two_theta_values.length - 1] - two_theta_values[0]) /
|
|
663
|
-
(two_theta_values.length - 1)
|
|
664
|
-
: DEFAULT_STEP_SIZE
|
|
665
|
-
return { start_angle: two_theta_values[0], step_size, intensities }
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
if (!intensities?.length) return null
|
|
671
|
-
|
|
672
|
-
// Extract scan range parameters
|
|
673
|
-
let start_angle = 0
|
|
674
|
-
let step_size = DEFAULT_STEP_SIZE
|
|
675
|
-
|
|
676
|
-
// Try to find start angle - multiple possible locations
|
|
677
|
-
const start_candidates = [
|
|
678
|
-
`Start`,
|
|
679
|
-
`TwoThetaStart`,
|
|
680
|
-
`StartPosition`,
|
|
681
|
-
`2ThetaBegin`,
|
|
682
|
-
`ScanAxisBeginPosition`,
|
|
683
|
-
`Begin`,
|
|
684
|
-
]
|
|
685
|
-
for (const tag of start_candidates) {
|
|
686
|
-
const el = doc.querySelector(tag)
|
|
687
|
-
if (el?.textContent) {
|
|
688
|
-
const val = parseFloat(el.textContent)
|
|
689
|
-
if (!isNaN(val)) {
|
|
690
|
-
start_angle = val
|
|
691
|
-
break
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
// Try to find step size - multiple possible locations
|
|
697
|
-
const step_candidates = [
|
|
698
|
-
`Step`,
|
|
699
|
-
`StepSize`,
|
|
700
|
-
`Increment`,
|
|
701
|
-
`2ThetaIncrement`,
|
|
702
|
-
`ScanAxisIncrement`,
|
|
703
|
-
`StepWidth`,
|
|
704
|
-
]
|
|
705
|
-
for (const tag of step_candidates) {
|
|
706
|
-
const el = doc.querySelector(tag)
|
|
707
|
-
if (el?.textContent) {
|
|
708
|
-
const val = parseFloat(el.textContent)
|
|
709
|
-
if (!isNaN(val) && val > 0) {
|
|
710
|
-
step_size = val
|
|
711
|
-
break
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
// Alternative: calculate step from start/end and count
|
|
717
|
-
if (step_size === DEFAULT_STEP_SIZE) {
|
|
718
|
-
const end_candidates = [`Stop`, `TwoThetaEnd`, `EndPosition`, `2ThetaEnd`, `End`]
|
|
719
|
-
for (const tag of end_candidates) {
|
|
720
|
-
const el = doc.querySelector(tag)
|
|
721
|
-
if (el?.textContent) {
|
|
722
|
-
const end_val = parseFloat(el.textContent)
|
|
723
|
-
if (!isNaN(end_val) && end_val > start_angle && intensities.length > 1) {
|
|
724
|
-
step_size = (end_val - start_angle) / (intensities.length - 1)
|
|
725
|
-
break
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
return { start_angle, step_size, intensities }
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
// Parse a PANalytical .xrdml file (XML format).
|
|
735
|
-
// Extracts 2θ range and intensities from the XML structure.
|
|
736
|
-
export function parse_xrdml_file(content: string): XrdPattern | null {
|
|
737
|
-
try {
|
|
738
|
-
const parser = new DOMParser()
|
|
739
|
-
const doc = parser.parseFromString(content, `application/xml`)
|
|
740
|
-
|
|
741
|
-
// Check for parsing errors
|
|
742
|
-
const parse_error = doc.querySelector(`parsererror`)
|
|
743
|
-
if (parse_error) return null
|
|
744
|
-
|
|
745
|
-
// Find dataPoints section
|
|
746
|
-
const data_points = doc.querySelector(`dataPoints`)
|
|
747
|
-
if (!data_points) return null
|
|
748
|
-
|
|
749
|
-
// Extract 2θ positions (start and end)
|
|
750
|
-
const two_theta_positions = data_points.querySelector(`positions[axis="2Theta"]`)
|
|
751
|
-
if (!two_theta_positions) return null
|
|
752
|
-
|
|
753
|
-
const start_el = two_theta_positions.querySelector(`startPosition`)
|
|
754
|
-
const end_el = two_theta_positions.querySelector(`endPosition`)
|
|
755
|
-
if (!start_el?.textContent || !end_el?.textContent) return null
|
|
756
|
-
|
|
757
|
-
const start_angle = parseFloat(start_el.textContent)
|
|
758
|
-
const end_angle = parseFloat(end_el.textContent)
|
|
759
|
-
if (isNaN(start_angle) || isNaN(end_angle)) return null
|
|
760
|
-
|
|
761
|
-
// Extract intensities
|
|
762
|
-
const intensities_el = data_points.querySelector(`intensities`)
|
|
763
|
-
if (!intensities_el?.textContent) return null
|
|
764
|
-
|
|
765
|
-
const intensities = parse_number_list(intensities_el.textContent)
|
|
766
|
-
const step =
|
|
767
|
-
intensities.length > 1
|
|
768
|
-
? (end_angle - start_angle) / (intensities.length - 1)
|
|
769
|
-
: DEFAULT_STEP_SIZE
|
|
770
|
-
return create_pattern(start_angle, step, intensities)
|
|
771
|
-
} catch (error) {
|
|
772
|
-
console.error(`Failed to parse XRDML file:`, error)
|
|
773
|
-
return null
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
// Two-column ASCII format extensions (all use parse_xy_file)
|
|
778
|
-
const ASCII_XY_EXTENSIONS = [`xy`, `xye`, `csv`, `dat`, `asc`, `txt`] as const
|
|
779
|
-
|
|
780
|
-
// Header-based ASCII format extensions
|
|
781
|
-
const GSAS_EXTENSIONS = [`gsas`, `gsa`, `gda`, `fxye`] as const
|
|
782
|
-
const ASCII_HEADER_EXTENSIONS = [`ras`, `uxd`, ...GSAS_EXTENSIONS] as const
|
|
783
|
-
|
|
784
|
-
// XML-based format extensions
|
|
785
|
-
const XML_EXTENSIONS = [`xrdml`] as const
|
|
786
|
-
|
|
787
|
-
// Binary format extensions
|
|
788
|
-
const BINARY_EXTENSIONS = [`brml`, `raw`] as const
|
|
789
|
-
|
|
790
|
-
// All supported XRD data file extensions (base formats, without .gz)
|
|
791
|
-
export const XRD_FILE_EXTENSIONS = [
|
|
792
|
-
...ASCII_XY_EXTENSIONS,
|
|
793
|
-
...ASCII_HEADER_EXTENSIONS,
|
|
794
|
-
...XML_EXTENSIONS,
|
|
795
|
-
...BINARY_EXTENSIONS,
|
|
796
|
-
] as const
|
|
797
|
-
|
|
798
|
-
export type XrdFileExtension = (typeof XRD_FILE_EXTENSIONS)[number]
|
|
799
|
-
|
|
800
|
-
// Main entry point for parsing XRD data files.
|
|
801
|
-
// Detects file type by extension and delegates to appropriate parser.
|
|
802
|
-
// Handles both plain and gzipped filenames (content should already be decompressed)
|
|
803
|
-
export async function parse_xrd_file(
|
|
804
|
-
content: string | ArrayBuffer,
|
|
805
|
-
filename: string,
|
|
806
|
-
): Promise<XrdPattern | null> {
|
|
807
|
-
// Strip .gz suffix if present to get base extension
|
|
808
|
-
const base_name = filename.toLowerCase().replace(/\.gz$/, ``)
|
|
809
|
-
const ext = base_name.split(`.`).pop() as XrdFileExtension | undefined
|
|
810
|
-
|
|
811
|
-
if (!ext) return null
|
|
812
|
-
|
|
813
|
-
// Helper to get text content
|
|
814
|
-
const get_text = (): string =>
|
|
815
|
-
typeof content === `string` ? content : new TextDecoder().decode(content as BufferSource)
|
|
816
|
-
|
|
817
|
-
// Helper to get binary content
|
|
818
|
-
const get_buffer = (): ArrayBuffer => {
|
|
819
|
-
if (typeof content === `string`) {
|
|
820
|
-
const encoded = new TextEncoder().encode(content)
|
|
821
|
-
// Create a new ArrayBuffer and copy the data to avoid SharedArrayBuffer type issues
|
|
822
|
-
const buffer = new ArrayBuffer(encoded.byteLength)
|
|
823
|
-
new Uint8Array(buffer).set(encoded)
|
|
824
|
-
return buffer
|
|
825
|
-
}
|
|
826
|
-
return content
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
// Two-column ASCII formats
|
|
830
|
-
if ((ASCII_XY_EXTENSIONS as readonly string[]).includes(ext)) {
|
|
831
|
-
return parse_xy_file(get_text())
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
// Header-based ASCII formats
|
|
835
|
-
if (ext === `ras`) return parse_ras_file(get_text())
|
|
836
|
-
if (ext === `uxd`) return parse_uxd_file(get_text())
|
|
837
|
-
if ((GSAS_EXTENSIONS as readonly string[]).includes(ext)) {
|
|
838
|
-
return parse_gsas_file(get_text())
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
// XML formats
|
|
842
|
-
if (ext === `xrdml`) return parse_xrdml_file(get_text())
|
|
843
|
-
|
|
844
|
-
// Binary formats
|
|
845
|
-
if (ext === `brml`) return parse_brml_file(get_buffer()) // async due to lazy fflate import
|
|
846
|
-
if (ext === `raw`) return parse_bruker_raw_file(get_buffer())
|
|
847
|
-
|
|
848
|
-
return null
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
// Check if a filename represents a supported XRD data file format.
|
|
852
|
-
// Recognizes both plain and gzipped versions (e.g. .xy and .xy.gz)
|
|
853
|
-
export function is_xrd_data_file(filename: string): boolean {
|
|
854
|
-
// Strip .gz suffix if present to get base extension
|
|
855
|
-
const base_name = filename.toLowerCase().replace(/\.gz$/, ``)
|
|
856
|
-
const ext = base_name.split(`.`).pop()
|
|
857
|
-
return ext !== undefined && (XRD_FILE_EXTENSIONS as readonly string[]).includes(ext)
|
|
858
|
-
}
|