matterviz 0.4.0 → 0.4.2
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 +10 -4
- package/dist/FilePicker.svelte +12 -14
- package/dist/Icon.svelte +7 -4
- package/dist/MillerIndexInput.svelte +2 -2
- package/dist/app.css +53 -0
- package/dist/brillouin/BrillouinZone.svelte +132 -219
- package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
- package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
- package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
- package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
- package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
- package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
- package/dist/brillouin/ReciprocalVectors.svelte +39 -0
- package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
- package/dist/brillouin/compute.d.ts +2 -0
- package/dist/brillouin/compute.js +80 -77
- package/dist/brillouin/geometry.d.ts +8 -0
- package/dist/brillouin/geometry.js +57 -0
- package/dist/brillouin/index.d.ts +2 -0
- package/dist/brillouin/index.js +2 -0
- package/dist/brillouin/types.d.ts +2 -2
- package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
- package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
- package/dist/chempot-diagram/async-compute.svelte.js +1 -1
- package/dist/chempot-diagram/color.d.ts +3 -6
- package/dist/chempot-diagram/color.js +5 -5
- package/dist/chempot-diagram/compute.d.ts +3 -3
- package/dist/chempot-diagram/compute.js +3 -1
- package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
- package/dist/chempot-diagram/controls-state.svelte.js +42 -0
- package/dist/chempot-diagram/export.d.ts +47 -0
- package/dist/chempot-diagram/export.js +133 -0
- package/dist/chempot-diagram/index.d.ts +1 -0
- package/dist/chempot-diagram/index.js +1 -0
- package/dist/chempot-diagram/pointer.d.ts +0 -10
- package/dist/chempot-diagram/pointer.js +4 -4
- package/dist/chempot-diagram/types.d.ts +3 -3
- package/dist/colors/index.d.ts +0 -4
- package/dist/colors/index.js +21 -22
- package/dist/composition/BarChart.svelte +37 -31
- package/dist/composition/BubbleChart.svelte +17 -17
- package/dist/composition/Composition.svelte +7 -11
- package/dist/composition/Formula.svelte +18 -25
- package/dist/composition/FormulaFilter.svelte +96 -98
- package/dist/composition/PieChart.svelte +60 -46
- package/dist/composition/chem-sys.js +3 -2
- package/dist/composition/format.js +4 -3
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/parse.d.ts +2 -3
- package/dist/composition/parse.js +27 -28
- package/dist/constants.js +11 -9
- package/dist/controls.d.ts +1 -0
- package/dist/controls.js +0 -1
- package/dist/convex-hull/ConvexHull.svelte +20 -25
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
- package/dist/convex-hull/ConvexHull2D.svelte +176 -256
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +269 -804
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +236 -755
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
- package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
- package/dist/convex-hull/ConvexHullControls.svelte +128 -49
- package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
- package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
- package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
- package/dist/convex-hull/ConvexHullStats.svelte +210 -351
- package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
- package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
- package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
- package/dist/convex-hull/GasPressureControls.svelte +5 -12
- package/dist/convex-hull/StructurePopup.svelte +17 -21
- package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
- package/dist/convex-hull/TemperatureSlider.svelte +4 -10
- package/dist/convex-hull/barycentric-coords.d.ts +2 -4
- package/dist/convex-hull/barycentric-coords.js +6 -33
- package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
- package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
- package/dist/convex-hull/helpers.d.ts +47 -17
- package/dist/convex-hull/helpers.js +186 -101
- package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
- package/dist/convex-hull/hull-state.svelte.js +124 -0
- package/dist/convex-hull/index.d.ts +9 -7
- package/dist/convex-hull/index.js +7 -2
- package/dist/convex-hull/thermodynamics.js +109 -937
- package/dist/convex-hull/types.d.ts +12 -4
- package/dist/convex-hull/types.js +12 -0
- package/dist/coordination/CoordinationBarPlot.svelte +41 -43
- package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
- package/dist/coordination/calc-coordination.d.ts +1 -1
- package/dist/coordination/calc-coordination.js +28 -25
- package/dist/element/BohrAtom.svelte +6 -8
- package/dist/element/ElementHeading.svelte +4 -1
- package/dist/element/ElementPhoto.svelte +11 -9
- package/dist/element/ElementStats.svelte +12 -10
- package/dist/element/ElementTile.svelte +24 -29
- package/dist/element/ElementTile.svelte.d.ts +1 -1
- package/dist/element/Nucleus.svelte +4 -2
- package/dist/element/data.d.ts +1 -2
- package/dist/element/helpers.d.ts +4 -0
- package/dist/element/helpers.js +18 -0
- package/dist/element/index.d.ts +1 -0
- package/dist/element/index.js +3 -0
- package/dist/feedback/DragOverlay.svelte +5 -3
- package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
- package/dist/feedback/StatusMessage.svelte +20 -7
- package/dist/fermi-surface/FermiSlice.svelte +21 -18
- package/dist/fermi-surface/FermiSurface.svelte +78 -165
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
- package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
- package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
- package/dist/fermi-surface/compute.js +14 -13
- package/dist/fermi-surface/export.js +4 -15
- package/dist/fermi-surface/index.d.ts +0 -1
- package/dist/fermi-surface/index.js +0 -1
- package/dist/fermi-surface/parse.d.ts +1 -1
- package/dist/fermi-surface/parse.js +84 -97
- package/dist/fermi-surface/types.d.ts +2 -2
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
- package/dist/heatmap-matrix/index.d.ts +8 -2
- package/dist/icons.d.ts +4 -0
- package/dist/icons.js +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/io/ExportPane.svelte +170 -0
- package/dist/io/ExportPane.svelte.d.ts +17 -0
- package/dist/io/decompress.d.ts +2 -1
- package/dist/io/decompress.js +22 -36
- package/dist/io/export.d.ts +9 -1
- package/dist/io/export.js +37 -29
- package/dist/io/fetch.d.ts +2 -4
- package/dist/io/fetch.js +0 -11
- package/dist/io/file-drop.d.ts +7 -0
- package/dist/io/file-drop.js +13 -0
- package/dist/io/index.d.ts +1 -0
- package/dist/io/index.js +3 -0
- package/dist/io/is-binary.d.ts +9 -0
- package/dist/io/is-binary.js +45 -1
- package/dist/io/types.d.ts +13 -0
- package/dist/io/url-drop.js +13 -25
- package/dist/isosurface/Isosurface.svelte +17 -23
- package/dist/isosurface/IsosurfaceControls.svelte +37 -42
- package/dist/isosurface/parse-vaspwave.d.ts +3 -0
- package/dist/isosurface/parse-vaspwave.js +138 -0
- package/dist/isosurface/parse.js +50 -48
- package/dist/labels.d.ts +6 -2
- package/dist/labels.js +44 -14
- package/dist/layout/FullscreenButton.svelte +34 -0
- package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
- package/dist/layout/FullscreenToggle.svelte +12 -12
- package/dist/layout/InfoCard.svelte +7 -18
- package/dist/layout/InfoTag.svelte +1 -3
- package/dist/layout/NumberRangeInput.svelte +46 -0
- package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
- package/dist/layout/PropertyFilter.svelte +2 -6
- package/dist/layout/SettingsSection.svelte +21 -17
- package/dist/layout/SubpageGrid.svelte +3 -1
- package/dist/layout/ViewerChrome.svelte +115 -0
- package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
- package/dist/layout/fullscreen.d.ts +4 -0
- package/dist/layout/fullscreen.js +3 -5
- package/dist/layout/fullscreen.svelte.d.ts +8 -0
- package/dist/layout/fullscreen.svelte.js +36 -0
- package/dist/layout/index.d.ts +4 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/json-tree/JsonNode.svelte +8 -11
- package/dist/layout/json-tree/JsonTree.svelte +53 -77
- package/dist/layout/json-tree/JsonValue.svelte +7 -15
- package/dist/layout/json-tree/utils.js +14 -23
- package/dist/math.d.ts +9 -3
- package/dist/math.js +37 -21
- package/dist/overlays/ContextMenu.svelte +4 -2
- package/dist/overlays/CopyButton.svelte +11 -5
- package/dist/overlays/DragControlTab.svelte +6 -1
- package/dist/overlays/DraggablePane.svelte +81 -26
- package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
- package/dist/overlays/GlassChip.svelte +30 -0
- package/dist/overlays/GlassChip.svelte.d.ts +8 -0
- package/dist/overlays/InfoPaneCards.svelte +11 -23
- package/dist/overlays/index.d.ts +11 -0
- package/dist/overlays/index.js +26 -0
- package/dist/overlays/portal.d.ts +2 -0
- package/dist/overlays/portal.js +14 -0
- package/dist/periodic-table/PeriodicTable.svelte +115 -146
- package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
- package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
- package/dist/periodic-table/TableInset.svelte +9 -4
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
- package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
- package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
- package/dist/phase-diagram/build-diagram.js +3 -3
- package/dist/phase-diagram/colors.js +1 -1
- package/dist/phase-diagram/diagram-input.d.ts +1 -2
- package/dist/phase-diagram/parse.d.ts +2 -1
- package/dist/phase-diagram/parse.js +15 -15
- package/dist/phase-diagram/svg-to-diagram.js +21 -15
- package/dist/phase-diagram/utils.js +2 -3
- package/dist/plot/bar/BarPlot.svelte +494 -692
- package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
- package/dist/plot/bar/BarPlotControls.svelte +1 -3
- package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
- package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
- package/dist/plot/bar/data.d.ts +5 -4
- package/dist/plot/bar/data.js +2 -1
- package/dist/plot/box/BoxPlot.svelte +361 -439
- package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
- package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
- package/dist/plot/box/Violin.svelte.d.ts +2 -1
- package/dist/plot/box/box-plot.d.ts +3 -2
- package/dist/plot/box/box-plot.js +6 -3
- package/dist/plot/box/kde.d.ts +2 -1
- package/dist/plot/box/kde.js +4 -4
- package/dist/plot/core/auto-place.d.ts +1 -1
- package/dist/plot/core/auto-place.js +5 -2
- package/dist/plot/core/axis-utils.d.ts +12 -7
- package/dist/plot/core/axis-utils.js +48 -48
- package/dist/plot/core/components/AxisLabel.svelte +82 -20
- package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
- package/dist/plot/core/components/ColorBar.svelte +106 -111
- package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
- package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
- package/dist/plot/core/components/FillArea.svelte +10 -17
- package/dist/plot/core/components/HierarchyControls.svelte +249 -0
- package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
- package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
- package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
- package/dist/plot/core/components/Line.svelte +21 -11
- package/dist/plot/core/components/Line.svelte.d.ts +5 -2
- package/dist/plot/core/components/PlotAxis.svelte +42 -18
- package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
- package/dist/plot/core/components/PlotControls.svelte +65 -41
- package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
- package/dist/plot/core/components/PlotLegend.svelte +31 -35
- package/dist/plot/core/components/PlotMarginals.svelte +616 -0
- package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
- package/dist/plot/core/components/PlotTooltip.svelte +1 -1
- package/dist/plot/core/components/PortalSelect.svelte +4 -8
- package/dist/plot/core/components/ReferenceLine.svelte +27 -24
- package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
- package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
- package/dist/plot/core/components/ReferencePlane.svelte +9 -10
- package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
- package/dist/plot/core/components/ZeroLines.svelte +4 -8
- package/dist/plot/core/components/ZoomRect.svelte +1 -2
- package/dist/plot/core/components/index.d.ts +1 -0
- package/dist/plot/core/components/index.js +1 -0
- package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
- package/dist/plot/core/data-cleaning-signal.js +467 -0
- package/dist/plot/core/data-cleaning.d.ts +2 -42
- package/dist/plot/core/data-cleaning.js +29 -476
- package/dist/plot/core/data-transform.js +9 -5
- package/dist/plot/core/fill-utils.d.ts +7 -4
- package/dist/plot/core/fill-utils.js +34 -9
- package/dist/plot/core/index.d.ts +1 -0
- package/dist/plot/core/index.js +1 -0
- package/dist/plot/core/interactions.d.ts +5 -1
- package/dist/plot/core/interactions.js +14 -2
- package/dist/plot/core/layout.d.ts +3 -1
- package/dist/plot/core/layout.js +22 -13
- package/dist/plot/core/marginals.d.ts +170 -0
- package/dist/plot/core/marginals.js +436 -0
- package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
- package/dist/plot/core/pan-zoom.svelte.js +221 -0
- package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
- package/dist/plot/core/placed-tween.svelte.js +68 -0
- package/dist/plot/core/reference-line.d.ts +10 -10
- package/dist/plot/core/reference-line.js +7 -7
- package/dist/plot/core/scales.d.ts +40 -25
- package/dist/plot/core/scales.js +49 -21
- package/dist/plot/core/svg.d.ts +2 -1
- package/dist/plot/core/types/fills.d.ts +101 -0
- package/dist/plot/core/types/fills.js +15 -0
- package/dist/plot/core/types/plot-3d.d.ts +87 -0
- package/dist/plot/core/types/plot-3d.js +4 -0
- package/dist/plot/core/types/reference-lines.d.ts +140 -0
- package/dist/plot/core/types/reference-lines.js +9 -0
- package/dist/plot/core/types.d.ts +47 -331
- package/dist/plot/core/types.js +23 -20
- package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
- package/dist/plot/core/utils/hierarchy-chart.js +179 -0
- package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
- package/dist/plot/core/utils/hierarchy-labels.js +99 -0
- package/dist/plot/core/utils/label-placement.d.ts +1 -1
- package/dist/plot/core/utils/label-placement.js +5 -5
- package/dist/plot/core/utils.d.ts +2 -1
- package/dist/plot/histogram/Histogram.svelte +373 -631
- package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
- package/dist/plot/histogram/HistogramControls.svelte +30 -28
- package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
- package/dist/plot/histogram/histogram.d.ts +31 -0
- package/dist/plot/histogram/histogram.js +70 -0
- package/dist/plot/histogram/index.d.ts +1 -0
- package/dist/plot/histogram/index.js +1 -0
- package/dist/plot/index.d.ts +1 -0
- package/dist/plot/index.js +1 -0
- package/dist/plot/sankey/Sankey.svelte +79 -73
- package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
- package/dist/plot/sankey/SankeyControls.svelte +22 -16
- package/dist/plot/sankey/sankey.js +3 -1
- package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
- package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
- package/dist/plot/scatter/ElementScatter.svelte +4 -1
- package/dist/plot/scatter/ScatterPlot.svelte +623 -821
- package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
- package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
- package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
- package/dist/plot/scatter/ScatterPoint.svelte +16 -9
- package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
- package/dist/plot/scatter/binned-scatter-types.js +6 -1
- package/dist/plot/scatter/index.d.ts +1 -1
- package/dist/plot/scatter/scatter-data.d.ts +1 -1
- package/dist/plot/scatter/scatter-data.js +8 -7
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
- package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
- package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
- package/dist/plot/sunburst/Sunburst.svelte +256 -338
- package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
- package/dist/plot/sunburst/index.d.ts +1 -1
- package/dist/plot/sunburst/index.js +2 -1
- package/dist/plot/sunburst/render.d.ts +2 -2
- package/dist/plot/sunburst/render.js +47 -22
- package/dist/plot/sunburst/sunburst.d.ts +5 -1
- package/dist/plot/sunburst/sunburst.js +14 -4
- package/dist/plot/treemap/Treemap.svelte +907 -0
- package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
- package/dist/plot/treemap/index.d.ts +3 -0
- package/dist/plot/treemap/index.js +4 -0
- package/dist/plot/treemap/treemap.d.ts +26 -0
- package/dist/plot/treemap/treemap.js +99 -0
- package/dist/rdf/RdfPlot.svelte +22 -26
- package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
- package/dist/rdf/calc-rdf.js +4 -8
- package/dist/sanitize.js +14 -3
- package/dist/scene/SceneCamera.svelte +62 -0
- package/dist/scene/SceneCamera.svelte.d.ts +19 -0
- package/dist/scene/bind-renderer.svelte.d.ts +2 -0
- package/dist/scene/bind-renderer.svelte.js +22 -0
- package/dist/scene/index.d.ts +4 -0
- package/dist/scene/index.js +5 -0
- package/dist/scene/props.js +52 -0
- package/dist/scene/types.d.ts +26 -0
- package/dist/scene/types.js +1 -0
- package/dist/settings.d.ts +33 -11
- package/dist/settings.js +136 -51
- package/dist/spectral/Bands.svelte +231 -237
- package/dist/spectral/Bands.svelte.d.ts +3 -2
- package/dist/spectral/BandsAndDos.svelte +29 -29
- package/dist/spectral/BrillouinBandsDos.svelte +21 -29
- package/dist/spectral/Dos.svelte +75 -77
- package/dist/spectral/Dos.svelte.d.ts +2 -1
- package/dist/spectral/helpers.d.ts +9 -9
- package/dist/spectral/helpers.js +66 -70
- package/dist/state.svelte.d.ts +0 -7
- package/dist/state.svelte.js +5 -24
- package/dist/structure/Arrow.svelte +6 -21
- package/dist/structure/ArrowInstances.svelte +160 -0
- package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
- package/dist/structure/AtomLegend.svelte +115 -75
- package/dist/structure/AtomLegend.svelte.d.ts +1 -1
- package/dist/structure/Bond.svelte +31 -23
- package/dist/structure/CanvasTooltip.svelte +16 -3
- package/dist/structure/CellSelect.svelte +22 -29
- package/dist/structure/CellSelect.svelte.d.ts +2 -1
- package/dist/structure/Cylinder.svelte +24 -40
- package/dist/structure/InstancedAtoms.svelte +114 -0
- package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
- package/dist/structure/Lattice.svelte +85 -149
- package/dist/structure/SiteLabels.svelte +122 -0
- package/dist/structure/SiteLabels.svelte.d.ts +18 -0
- package/dist/structure/Structure.svelte +725 -735
- package/dist/structure/Structure.svelte.d.ts +8 -16
- package/dist/structure/StructureCarousel.svelte +630 -0
- package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
- package/dist/structure/StructureControls.svelte +298 -325
- package/dist/structure/StructureControls.svelte.d.ts +5 -3
- package/dist/structure/StructureExportPane.svelte +62 -168
- package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
- package/dist/structure/StructureInfoPane.svelte +77 -69
- package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
- package/dist/structure/StructureScene.svelte +758 -600
- package/dist/structure/StructureScene.svelte.d.ts +24 -20
- package/dist/structure/StructureViewport.svelte +386 -0
- package/dist/structure/StructureViewport.svelte.d.ts +63 -0
- package/dist/structure/atom-label-placement.d.ts +18 -0
- package/dist/structure/atom-label-placement.js +115 -0
- package/dist/structure/atom-properties.d.ts +3 -1
- package/dist/structure/atom-properties.js +115 -54
- package/dist/structure/bond-order-perception.js +2 -4
- package/dist/structure/bonding.d.ts +12 -2
- package/dist/structure/bonding.js +172 -73
- package/dist/structure/edit-history.d.ts +6 -0
- package/dist/structure/edit-history.js +27 -0
- package/dist/structure/export.d.ts +25 -4
- package/dist/structure/export.js +103 -153
- package/dist/structure/format-detect.d.ts +1 -0
- package/dist/structure/format-detect.js +22 -0
- package/dist/structure/geometry.d.ts +9 -0
- package/dist/structure/geometry.js +27 -0
- package/dist/structure/index.d.ts +18 -1
- package/dist/structure/index.js +15 -2
- package/dist/structure/measure.d.ts +1 -1
- package/dist/structure/measure.js +6 -12
- package/dist/structure/parse.d.ts +5 -3
- package/dist/structure/parse.js +551 -567
- package/dist/structure/partial-occupancy.d.ts +0 -1
- package/dist/structure/partial-occupancy.js +5 -3
- package/dist/structure/pbc.d.ts +1 -1
- package/dist/structure/pbc.js +204 -51
- package/dist/structure/polyhedra.d.ts +40 -0
- package/dist/structure/polyhedra.js +587 -0
- package/dist/structure/site.d.ts +4 -0
- package/dist/structure/site.js +1 -0
- package/dist/structure/supercell.d.ts +1 -2
- package/dist/structure/supercell.js +10 -15
- package/dist/structure/validation.js +5 -6
- package/dist/symmetry/SymmetryElementControls.svelte +69 -0
- package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
- package/dist/symmetry/SymmetryElements.svelte +350 -0
- package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
- package/dist/symmetry/SymmetryStats.svelte +142 -49
- package/dist/symmetry/WyckoffTable.svelte +58 -16
- package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
- package/dist/symmetry/cell-transform.js +8 -14
- package/dist/symmetry/index.d.ts +15 -4
- package/dist/symmetry/index.js +308 -81
- package/dist/symmetry/spacegroups.d.ts +5 -1
- package/dist/symmetry/spacegroups.js +18 -3
- package/dist/symmetry/symmetry-elements.d.ts +33 -0
- package/dist/symmetry/symmetry-elements.js +521 -0
- package/dist/symmetry/wyckoff-db.d.ts +9 -0
- package/dist/symmetry/wyckoff-db.js +87 -0
- package/dist/table/HeatmapTable.svelte +1104 -378
- package/dist/table/HeatmapTable.svelte.d.ts +12 -2
- package/dist/table/ToggleMenu.svelte +5 -12
- package/dist/table/index.d.ts +21 -6
- package/dist/table/index.js +34 -21
- package/dist/theme/ThemeControl.svelte +16 -8
- package/dist/theme/index.d.ts +1 -5
- package/dist/theme/index.js +4 -10
- package/dist/theme/themes.mjs +14 -7
- package/dist/tooltip/KCoords.svelte +4 -1
- package/dist/tooltip/TooltipContent.svelte +2 -5
- package/dist/trajectory/Trajectory.svelte +556 -352
- package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
- package/dist/trajectory/TrajectoryError.svelte +11 -8
- package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
- package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
- package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
- package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
- package/dist/trajectory/constants.js +6 -2
- package/dist/trajectory/extract.js +73 -71
- package/dist/trajectory/format-detect.d.ts +0 -1
- package/dist/trajectory/format-detect.js +13 -17
- package/dist/trajectory/frame-reader.d.ts +2 -1
- package/dist/trajectory/frame-reader.js +74 -136
- package/dist/trajectory/helpers.d.ts +12 -2
- package/dist/trajectory/helpers.js +68 -37
- package/dist/trajectory/index.d.ts +1 -0
- package/dist/trajectory/index.js +3 -0
- package/dist/trajectory/parse/ase.d.ts +9 -1
- package/dist/trajectory/parse/ase.js +47 -32
- package/dist/trajectory/parse/diagnostics.d.ts +3 -0
- package/dist/trajectory/parse/diagnostics.js +14 -0
- package/dist/trajectory/parse/h5-utils.d.ts +13 -0
- package/dist/trajectory/parse/h5-utils.js +109 -0
- package/dist/trajectory/parse/hdf5.d.ts +1 -1
- package/dist/trajectory/parse/hdf5.js +116 -106
- package/dist/trajectory/parse/index.d.ts +3 -4
- package/dist/trajectory/parse/index.js +68 -119
- package/dist/trajectory/parse/lammps.d.ts +0 -2
- package/dist/trajectory/parse/lammps.js +14 -16
- package/dist/trajectory/parse/pymatgen.d.ts +2 -0
- package/dist/trajectory/parse/pymatgen.js +74 -0
- package/dist/trajectory/parse/vasp.js +13 -9
- package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
- package/dist/trajectory/parse/vaspout-electronic.js +207 -0
- package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
- package/dist/trajectory/parse/vaspout-h5.js +284 -0
- package/dist/trajectory/parse/xyz.d.ts +9 -21
- package/dist/trajectory/parse/xyz.js +38 -39
- package/dist/trajectory/plotting.d.ts +8 -10
- package/dist/trajectory/plotting.js +102 -127
- package/dist/utils.d.ts +4 -0
- package/dist/utils.js +8 -1
- package/dist/xrd/XrdPlot.svelte +56 -85
- package/dist/xrd/broadening.d.ts +2 -1
- package/dist/xrd/broadening.js +2 -1
- package/dist/xrd/calc-xrd.js +8 -15
- package/dist/xrd/index.d.ts +2 -2
- package/dist/xrd/parse.d.ts +0 -1
- package/dist/xrd/parse.js +56 -73
- package/package.json +77 -36
- package/dist/api/mp.d.ts +0 -6
- package/dist/api/mp.js +0 -22
- package/dist/element/data.json +0 -11864
- package/dist/fermi-surface/marching-cubes.d.ts +0 -2
- package/dist/fermi-surface/marching-cubes.js +0 -2
- package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
- package/dist/plot/core/hover-lock.svelte.js +0 -45
- package/dist/plot/sunburst/SunburstControls.svelte +0 -200
- package/dist/structure/label-placement.d.ts +0 -14
- package/dist/structure/label-placement.js +0 -72
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Data extraction functions for trajectory analysis and plotting
|
|
2
2
|
import { get_density } from '../structure/index';
|
|
3
|
+
import { calc_force_stats, copy_numeric_fields } from './helpers';
|
|
3
4
|
// Common data extractor that extracts energy and structural properties
|
|
4
5
|
export const energy_data_extractor = (frame) => {
|
|
5
6
|
const data = {
|
|
@@ -7,18 +8,13 @@ export const energy_data_extractor = (frame) => {
|
|
|
7
8
|
};
|
|
8
9
|
if (frame.metadata) {
|
|
9
10
|
// Extract energy-related properties
|
|
10
|
-
|
|
11
|
+
copy_numeric_fields(data, frame.metadata, [
|
|
11
12
|
`energy`,
|
|
12
13
|
`energy_per_atom`,
|
|
13
14
|
`potential_energy`,
|
|
14
15
|
`kinetic_energy`,
|
|
15
16
|
`total_energy`,
|
|
16
|
-
];
|
|
17
|
-
for (const field of energy_fields) {
|
|
18
|
-
if (field in frame.metadata && typeof frame.metadata[field] === `number`) {
|
|
19
|
-
data[field] = frame.metadata[field];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
17
|
+
]);
|
|
22
18
|
}
|
|
23
19
|
return data;
|
|
24
20
|
};
|
|
@@ -30,13 +26,8 @@ export const force_stress_data_extractor = (frame) => {
|
|
|
30
26
|
if (frame.metadata) {
|
|
31
27
|
// Calculate force properties from forces array if available (preferred)
|
|
32
28
|
if (frame.metadata.forces && Array.isArray(frame.metadata.forces)) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const force_magnitudes = forces.map((force) => Math.hypot(...force));
|
|
36
|
-
data.force_max = Math.max(...force_magnitudes);
|
|
37
|
-
// Calculate RMS (root mean square) of force magnitudes
|
|
38
|
-
data.force_norm = Math.sqrt(force_magnitudes.reduce((sum, f) => sum + f ** 2, 0) / force_magnitudes.length);
|
|
39
|
-
}
|
|
29
|
+
// Object.assign ignores the null calc_force_stats returns for empty forces
|
|
30
|
+
Object.assign(data, calc_force_stats(frame.metadata.forces));
|
|
40
31
|
}
|
|
41
32
|
else {
|
|
42
33
|
// Fallback to metadata values if forces array not available
|
|
@@ -52,12 +43,29 @@ export const force_stress_data_extractor = (frame) => {
|
|
|
52
43
|
}
|
|
53
44
|
}
|
|
54
45
|
// Extract other stress and pressure properties (no duplicates expected)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
46
|
+
copy_numeric_fields(data, frame.metadata, [
|
|
47
|
+
`stress_max`,
|
|
48
|
+
`stress_frobenius`,
|
|
49
|
+
`stress_trace`,
|
|
50
|
+
`pressure`,
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
return data;
|
|
54
|
+
};
|
|
55
|
+
// Data extractor for SCF/electronic-convergence properties. Parsers emit these
|
|
56
|
+
// per frame (per ionic step, or per SCF step for static single-point runs) —
|
|
57
|
+
// e.g. the vaspout.h5 parser fills them from VASP's OSZICAR data.
|
|
58
|
+
const scf_data_extractor = (frame) => {
|
|
59
|
+
const data = {
|
|
60
|
+
Step: frame.step,
|
|
61
|
+
};
|
|
62
|
+
if (frame.metadata) {
|
|
63
|
+
copy_numeric_fields(data, frame.metadata, [
|
|
64
|
+
`n_scf_steps`,
|
|
65
|
+
`scf_energy_delta`,
|
|
66
|
+
`scf_rms`,
|
|
67
|
+
`scf_charge_rms`,
|
|
68
|
+
]);
|
|
61
69
|
}
|
|
62
70
|
return data;
|
|
63
71
|
};
|
|
@@ -79,31 +87,20 @@ export const structural_data_extractor = (frame) => {
|
|
|
79
87
|
}
|
|
80
88
|
if (frame.metadata) {
|
|
81
89
|
// Extract other structural properties, avoiding volume duplicate
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// Handle density separately - prefer metadata, but calculate if not available
|
|
88
|
-
if (frame.metadata.density && typeof frame.metadata.density === `number`) {
|
|
90
|
+
copy_numeric_fields(data, frame.metadata, [`temperature`]);
|
|
91
|
+
// Prefer metadata density (fall back to calculating from structure below).
|
|
92
|
+
// Finite-number check (not truthiness) so a legitimate density of 0 is kept.
|
|
93
|
+
if (typeof frame.metadata.density === `number` &&
|
|
94
|
+
Number.isFinite(frame.metadata.density)) {
|
|
89
95
|
data.density = frame.metadata.density;
|
|
90
96
|
}
|
|
91
|
-
else if (`lattice` in frame.structure) {
|
|
92
|
-
try {
|
|
93
|
-
data.density = get_density(frame.structure);
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
console.warn(`Failed to calculate density for frame ${frame.step}:`, error);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
97
|
// Only use metadata volume if lattice volume is not available
|
|
100
98
|
if (!data.volume && frame.metadata.volume && typeof frame.metadata.volume === `number`) {
|
|
101
99
|
data.volume = frame.metadata.volume;
|
|
102
100
|
}
|
|
103
101
|
// Note: pressure is handled by force_stress_data_extractor to avoid duplication
|
|
104
102
|
}
|
|
105
|
-
|
|
106
|
-
// Calculate density even when no metadata is available
|
|
103
|
+
if (data.density === undefined && `lattice` in frame.structure) {
|
|
107
104
|
try {
|
|
108
105
|
data.density = get_density(frame.structure);
|
|
109
106
|
}
|
|
@@ -113,50 +110,55 @@ export const structural_data_extractor = (frame) => {
|
|
|
113
110
|
}
|
|
114
111
|
return data;
|
|
115
112
|
};
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
113
|
+
const LATTICE_PARAMS = [`a`, `b`, `c`, `alpha`, `beta`, `gamma`];
|
|
114
|
+
// Cache per trajectory: full_data_extractor runs once per frame, so without this it
|
|
115
|
+
// rescans all frames on every call (O(n²)). WeakMap → GC'd with the trajectory.
|
|
116
|
+
const constant_params_cache = new WeakMap();
|
|
117
|
+
// Lattice params constant across the trajectory, in a single pass (prefer lattice value,
|
|
118
|
+
// else metadata; tol 1e-10). A param must be observed in ≥1 frame to count as constant;
|
|
119
|
+
// params absent from every frame are excluded (not silently treated as "constant").
|
|
120
|
+
function get_constant_lattice_params(trajectory) {
|
|
121
|
+
const cached = constant_params_cache.get(trajectory);
|
|
122
|
+
if (cached)
|
|
123
|
+
return cached;
|
|
124
|
+
const tolerance = 1e-10;
|
|
125
|
+
const first_values = new Map();
|
|
126
|
+
const varies = new Set();
|
|
121
127
|
for (const frame of trajectory.frames) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if (typeof
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
const lattice = `lattice` in frame.structure
|
|
129
|
+
? frame.structure.lattice
|
|
130
|
+
: null;
|
|
131
|
+
for (const param of LATTICE_PARAMS) {
|
|
132
|
+
if (varies.has(param))
|
|
133
|
+
continue; // already known to vary, skip
|
|
134
|
+
const lattice_value = lattice?.[param];
|
|
135
|
+
const value = typeof lattice_value === `number` ? lattice_value : frame.metadata?.[param];
|
|
136
|
+
// Number.isFinite: NaN is typeof `number` but Math.abs(next-NaN)=NaN → false constant
|
|
137
|
+
if (typeof value !== `number` || !Number.isFinite(value))
|
|
138
|
+
continue;
|
|
139
|
+
const first = first_values.get(param);
|
|
140
|
+
if (first === undefined)
|
|
141
|
+
first_values.set(param, value);
|
|
142
|
+
else if (Math.abs(value - first) > tolerance)
|
|
143
|
+
varies.add(param);
|
|
137
144
|
}
|
|
138
145
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
return
|
|
146
|
+
// only params observed in ≥1 frame; a never-present param is not "constant"
|
|
147
|
+
const constant = new Set([...first_values.keys()].filter((param) => !varies.has(param)));
|
|
148
|
+
constant_params_cache.set(trajectory, constant);
|
|
149
|
+
return constant;
|
|
143
150
|
}
|
|
144
151
|
// Combined data extractor that extracts all common properties
|
|
145
152
|
export const full_data_extractor = (frame, trajectory) => {
|
|
146
|
-
const
|
|
153
|
+
const result = {
|
|
147
154
|
...energy_data_extractor(frame, trajectory),
|
|
148
155
|
...force_stress_data_extractor(frame, trajectory),
|
|
156
|
+
...scf_data_extractor(frame, trajectory),
|
|
149
157
|
...structural_data_extractor(frame, trajectory),
|
|
150
158
|
};
|
|
151
|
-
//
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
// Add metadata to specify which properties don't vary
|
|
155
|
-
for (const param of lattice_params) {
|
|
156
|
-
if (!property_varies(trajectory, param)) {
|
|
157
|
-
// Mark individual lattice parameters as constant
|
|
158
|
-
result[`constant_${param}`] = 1;
|
|
159
|
-
}
|
|
159
|
+
// Mark individual lattice parameters that don't vary across the trajectory
|
|
160
|
+
for (const param of get_constant_lattice_params(trajectory)) {
|
|
161
|
+
result[`constant_${param}`] = 1;
|
|
160
162
|
}
|
|
161
163
|
return result;
|
|
162
164
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export declare function strip_compression_extensions(filename: string): string;
|
|
2
1
|
export declare function ext_hint(filename: string | undefined, ext_regex: RegExp): boolean | null;
|
|
3
2
|
export declare const FORMAT_PATTERNS: {
|
|
4
3
|
readonly ase: (data: unknown, filename?: string) => boolean;
|
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
// Format detection for trajectory files
|
|
2
|
-
import {
|
|
2
|
+
import { CONFIG_DIRS_REGEX, MD_SIM_EXCLUDE_REGEX, TRAJ_EXTENSIONS_REGEX, TRAJ_FALLBACK_EXTENSIONS_REGEX, TRAJ_KEYWORDS_SIMPLE_REGEX, XDATCAR_REGEX, } from '../constants';
|
|
3
|
+
import { strip_compression_extensions } from '../io/decompress';
|
|
4
|
+
import { parse_leading_num } from '../utils';
|
|
3
5
|
import { count_xyz_frames } from './helpers';
|
|
4
|
-
export function strip_compression_extensions(filename) {
|
|
5
|
-
let base_name = filename.toLowerCase();
|
|
6
|
-
while (COMPRESSION_EXTENSIONS_REGEX.test(base_name)) {
|
|
7
|
-
base_name = base_name.replace(COMPRESSION_EXTENSIONS_REGEX, ``);
|
|
8
|
-
}
|
|
9
|
-
return base_name;
|
|
10
|
-
}
|
|
11
6
|
// Extensions that explicitly identify a format — when present, format detection trusts
|
|
12
7
|
// the extension instead of sniffing content
|
|
13
|
-
const KNOWN_FORMAT_EXT_REGEX = /\.(xyz|extxyz|traj|h5|hdf5|lammpstrj|json|cif|poscar|vasp|yaml|yml|xml|csv)$/;
|
|
8
|
+
const KNOWN_FORMAT_EXT_REGEX = /\.(?:xyz|extxyz|traj|h5|hdf5|lammpstrj|json|cif|poscar|vasp|yaml|yml|xml|csv)$/;
|
|
14
9
|
// Classify the filename hint for a format whose extensions match ext_regex:
|
|
15
10
|
// true = filename matches, false = filename names a different known format,
|
|
16
11
|
// null = no usable hint (missing filename or unrecognized extension, e.g. the UUID
|
|
@@ -35,12 +30,12 @@ export const FORMAT_PATTERNS = {
|
|
|
35
30
|
return [0x2d, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x6c, 0x6d].every((byte, idx) => view[idx] === byte);
|
|
36
31
|
},
|
|
37
32
|
hdf5: (data, filename) => {
|
|
38
|
-
if (ext_hint(filename, /\.(h5|hdf5)$/) === false)
|
|
33
|
+
if (ext_hint(filename, /\.(?:h5|hdf5)$/) === false)
|
|
39
34
|
return false;
|
|
40
35
|
if (!(data instanceof ArrayBuffer) || data.byteLength < 8)
|
|
41
36
|
return false;
|
|
42
37
|
const signature = new Uint8Array(data.slice(0, 8));
|
|
43
|
-
return [0x89, 0x48, 0x44, 0x46, 0x0d, 0x0a, 0x1a, 0x0a].every((
|
|
38
|
+
return [0x89, 0x48, 0x44, 0x46, 0x0d, 0x0a, 0x1a, 0x0a].every((byte, idx) => signature[idx] === byte);
|
|
44
39
|
},
|
|
45
40
|
vasp: (data, filename) => {
|
|
46
41
|
const basename = filename?.toLowerCase().split(`/`).pop() ?? ``;
|
|
@@ -49,11 +44,11 @@ export const FORMAT_PATTERNS = {
|
|
|
49
44
|
const lines = data.trim().split(/\r?\n/);
|
|
50
45
|
return (lines.length >= 10 &&
|
|
51
46
|
lines.some((line) => line.includes(`Direct configuration=`)) &&
|
|
52
|
-
!isNaN(
|
|
47
|
+
!isNaN(parse_leading_num(lines[1])) &&
|
|
53
48
|
lines.slice(2, 5).every((line) => line.trim().split(/\s+/).length === 3));
|
|
54
49
|
},
|
|
55
50
|
xyz_multi: (data, filename) => {
|
|
56
|
-
if (ext_hint(filename, /\.(xyz|extxyz)$/) === false)
|
|
51
|
+
if (ext_hint(filename, /\.(?:xyz|extxyz)$/) === false)
|
|
57
52
|
return false;
|
|
58
53
|
return count_xyz_frames(data) >= 2;
|
|
59
54
|
},
|
|
@@ -69,7 +64,7 @@ export function is_trajectory_file(filename, content) {
|
|
|
69
64
|
return false;
|
|
70
65
|
const base_name = strip_compression_extensions(filename);
|
|
71
66
|
// For xyz/extxyz files, use content-based detection if available
|
|
72
|
-
if (/\.(xyz|extxyz)$/i.test(base_name)) {
|
|
67
|
+
if (/\.(?:xyz|extxyz)$/i.test(base_name)) {
|
|
73
68
|
if (content)
|
|
74
69
|
return count_xyz_frames(content) >= 2;
|
|
75
70
|
return TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name);
|
|
@@ -80,9 +75,10 @@ export function is_trajectory_file(filename, content) {
|
|
|
80
75
|
// Special exclusion for generic md_simulation pattern with certain extensions
|
|
81
76
|
if (MD_SIM_EXCLUDE_REGEX.test(base_name))
|
|
82
77
|
return false;
|
|
83
|
-
// For .h5/.hdf5 files, require trajectory keywords
|
|
84
|
-
|
|
85
|
-
|
|
78
|
+
// For .h5/.hdf5 files, require trajectory keywords. vaspout.h5 (VASP's
|
|
79
|
+
// HDF5 output) is always trajectory-shaped regardless of keywords.
|
|
80
|
+
if (/\.(?:h5|hdf5)$/i.test(base_name)) {
|
|
81
|
+
return /vaspout/i.test(base_name) || TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name);
|
|
86
82
|
}
|
|
87
83
|
// For other extensions, require both keywords and specific extensions
|
|
88
84
|
return (TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name) &&
|
|
@@ -2,6 +2,7 @@ import type { FrameIndex, FrameLoader, ParseProgress, TrajectoryFrame, Trajector
|
|
|
2
2
|
export declare class TrajFrameReader implements FrameLoader {
|
|
3
3
|
private readonly format;
|
|
4
4
|
private global_numbers?;
|
|
5
|
+
private xyz_cache?;
|
|
5
6
|
constructor(filename: string);
|
|
6
7
|
get_total_frames(data: string | ArrayBuffer): Promise<number>;
|
|
7
8
|
build_frame_index(data: string | ArrayBuffer, sample_rate: number, on_progress?: (progress: ParseProgress) => void): Promise<FrameIndex[]>;
|
|
@@ -10,8 +11,8 @@ export declare class TrajFrameReader implements FrameLoader {
|
|
|
10
11
|
sample_rate?: number;
|
|
11
12
|
properties?: string[];
|
|
12
13
|
}, on_progress?: (progress: ParseProgress) => void): Promise<TrajectoryMetadata[]>;
|
|
14
|
+
private get_xyz_cache;
|
|
13
15
|
private load_xyz_frame;
|
|
14
16
|
private load_ase_frame;
|
|
15
|
-
private parse_xyz_metadata;
|
|
16
17
|
private parse_ase_metadata;
|
|
17
18
|
}
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
// Unified frame loader for XYZ and ASE trajectories (large file indexing)
|
|
2
2
|
import * as math from '../math';
|
|
3
3
|
import { MAX_METADATA_SIZE } from './constants';
|
|
4
|
-
import {
|
|
5
|
-
import { strip_compression_extensions } from '
|
|
6
|
-
import {
|
|
4
|
+
import { copy_numeric_fields, count_xyz_frames, iter_xyz_frames, validate_3x3_matrix, } from './helpers';
|
|
5
|
+
import { strip_compression_extensions } from '../io/decompress';
|
|
6
|
+
import { decode_ase_frame, read_ase_header } from './parse/ase';
|
|
7
|
+
import { build_xyz_frame, parse_xyz_comment_metadata } from './parse/xyz';
|
|
8
|
+
// Restrict frame metadata to the requested property keys (no-op when unset)
|
|
9
|
+
const filter_properties = (metadata, properties) => {
|
|
10
|
+
if (!properties)
|
|
11
|
+
return;
|
|
12
|
+
metadata.properties = Object.fromEntries(Object.entries(metadata.properties).filter(([key]) => properties.includes(key)));
|
|
13
|
+
};
|
|
7
14
|
export class TrajFrameReader {
|
|
8
15
|
format;
|
|
9
16
|
global_numbers;
|
|
17
|
+
// Split lines + per-frame start indices for the last XYZ payload, so repeat seeks are
|
|
18
|
+
// O(1) lookup instead of re-splitting + rescanning from line 0 (was O(n²) over playback)
|
|
19
|
+
xyz_cache;
|
|
10
20
|
constructor(filename) {
|
|
11
21
|
const base_filename = strip_compression_extensions(filename);
|
|
12
22
|
this.format = base_filename.endsWith(`.traj`) ? `ase` : `xyz`;
|
|
@@ -19,8 +29,7 @@ export class TrajFrameReader {
|
|
|
19
29
|
}
|
|
20
30
|
if (!(data instanceof ArrayBuffer))
|
|
21
31
|
throw new Error(`ASE loader requires binary data`);
|
|
22
|
-
|
|
23
|
-
return Number(view.getBigInt64(32, true));
|
|
32
|
+
return read_ase_header(new DataView(data)).n_items;
|
|
24
33
|
}
|
|
25
34
|
async build_frame_index(data, sample_rate, on_progress) {
|
|
26
35
|
const total_frames = await this.get_total_frames(data);
|
|
@@ -31,35 +40,25 @@ export class TrajFrameReader {
|
|
|
31
40
|
const encoder = new TextEncoder();
|
|
32
41
|
const newline_sequence = data_str.includes(`\r\n`) ? `\r\n` : `\n`;
|
|
33
42
|
const newline_byte_len = encoder.encode(newline_sequence).length;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
43
|
+
const line_bytes = (idx) => encoder.encode(lines[idx]).length + newline_byte_len;
|
|
44
|
+
// cursor = next line whose bytes haven't been added to byte_offset yet
|
|
45
|
+
let [current_frame, cursor, byte_offset] = [0, 0, 0];
|
|
46
|
+
for (const { start, num_atoms } of iter_xyz_frames(lines)) {
|
|
47
|
+
if (current_frame >= total_frames)
|
|
48
|
+
break;
|
|
49
|
+
// Accumulate bytes of blank/invalid lines skipped before this frame
|
|
50
|
+
for (; cursor < start; cursor++)
|
|
51
|
+
byte_offset += line_bytes(cursor);
|
|
52
|
+
let frame_size = 0;
|
|
53
|
+
for (; cursor < start + num_atoms + 2; cursor++)
|
|
54
|
+
frame_size += line_bytes(cursor);
|
|
47
55
|
if (current_frame % sample_rate === 0) {
|
|
48
56
|
frame_index.push({
|
|
49
57
|
frame_number: current_frame,
|
|
50
58
|
byte_offset,
|
|
51
|
-
estimated_size:
|
|
59
|
+
estimated_size: frame_size,
|
|
52
60
|
});
|
|
53
61
|
}
|
|
54
|
-
const frame_start = line_idx;
|
|
55
|
-
line_idx += 2 + num_atoms;
|
|
56
|
-
let frame_size = 0;
|
|
57
|
-
for (let idx = frame_start; idx < line_idx; idx++) {
|
|
58
|
-
frame_size += encoder.encode(lines[idx]).length + newline_byte_len;
|
|
59
|
-
}
|
|
60
|
-
if (current_frame % sample_rate === 0) {
|
|
61
|
-
frame_index[frame_index.length - 1].estimated_size = frame_size;
|
|
62
|
-
}
|
|
63
62
|
byte_offset += frame_size;
|
|
64
63
|
current_frame++;
|
|
65
64
|
if (on_progress && current_frame % 1000 === 0) {
|
|
@@ -73,7 +72,7 @@ export class TrajFrameReader {
|
|
|
73
72
|
}
|
|
74
73
|
else {
|
|
75
74
|
const view = new DataView(data);
|
|
76
|
-
const offsets_pos =
|
|
75
|
+
const { offsets_pos } = read_ase_header(view);
|
|
77
76
|
for (let idx = 0; idx < total_frames; idx += sample_rate) {
|
|
78
77
|
const frame_offset = Number(view.getBigInt64(offsets_pos + idx * 8, true));
|
|
79
78
|
frame_index.push({
|
|
@@ -111,34 +110,21 @@ export class TrajFrameReader {
|
|
|
111
110
|
const total_frames = await this.get_total_frames(data);
|
|
112
111
|
if (this.format === `xyz`) {
|
|
113
112
|
const lines = data.trim().split(/\r?\n/);
|
|
114
|
-
let
|
|
115
|
-
|
|
116
|
-
if (
|
|
117
|
-
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
const num_atoms = parseInt(lines[line_idx].trim(), 10);
|
|
121
|
-
if (isNaN(num_atoms) || num_atoms <= 0 || line_idx + num_atoms + 1 >= lines.length) {
|
|
122
|
-
line_idx++;
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
113
|
+
let current_frame = 0;
|
|
114
|
+
for (const { comment } of iter_xyz_frames(lines)) {
|
|
115
|
+
if (current_frame >= total_frames)
|
|
116
|
+
break;
|
|
125
117
|
if (current_frame % sample_rate === 0) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const filtered = Object.fromEntries(Object.entries(frame_metadata.properties).filter(([key]) => properties.includes(key)));
|
|
136
|
-
frame_metadata.properties = filtered;
|
|
137
|
-
}
|
|
138
|
-
if (frame_metadata)
|
|
139
|
-
metadata_list.push(frame_metadata);
|
|
118
|
+
// parse_xyz_comment_metadata is pure regex/parseFloat and never throws
|
|
119
|
+
const { step, properties: props } = parse_xyz_comment_metadata(comment);
|
|
120
|
+
const frame_metadata = {
|
|
121
|
+
frame_number: current_frame,
|
|
122
|
+
step: step ?? current_frame,
|
|
123
|
+
properties: props,
|
|
124
|
+
};
|
|
125
|
+
filter_properties(frame_metadata, properties);
|
|
126
|
+
metadata_list.push(frame_metadata);
|
|
140
127
|
}
|
|
141
|
-
line_idx += 2 + num_atoms;
|
|
142
128
|
current_frame++;
|
|
143
129
|
if (on_progress && current_frame % 5000 === 0) {
|
|
144
130
|
on_progress({
|
|
@@ -151,8 +137,7 @@ export class TrajFrameReader {
|
|
|
151
137
|
}
|
|
152
138
|
else if (this.format === `ase`) {
|
|
153
139
|
const view = new DataView(data);
|
|
154
|
-
const n_items =
|
|
155
|
-
const offsets_pos = Number(view.getBigInt64(40, true));
|
|
140
|
+
const { n_items, offsets_pos } = read_ase_header(view);
|
|
156
141
|
for (let idx = 0; idx < n_items; idx += sample_rate) {
|
|
157
142
|
try {
|
|
158
143
|
const frame_offset = Number(view.getBigInt64(offsets_pos + idx * 8, true));
|
|
@@ -163,10 +148,7 @@ export class TrajFrameReader {
|
|
|
163
148
|
}
|
|
164
149
|
const frame_data = JSON.parse(new TextDecoder().decode(new Uint8Array(data, frame_offset + 8, json_length)));
|
|
165
150
|
const frame_metadata = this.parse_ase_metadata(frame_data, idx);
|
|
166
|
-
|
|
167
|
-
const filtered = Object.fromEntries(Object.entries(frame_metadata.properties).filter(([key]) => properties.includes(key)));
|
|
168
|
-
frame_metadata.properties = filtered;
|
|
169
|
-
}
|
|
151
|
+
filter_properties(frame_metadata, properties);
|
|
170
152
|
metadata_list.push(frame_metadata);
|
|
171
153
|
if (on_progress && idx % 5000 === 0) {
|
|
172
154
|
on_progress({
|
|
@@ -183,107 +165,63 @@ export class TrajFrameReader {
|
|
|
183
165
|
}
|
|
184
166
|
return metadata_list;
|
|
185
167
|
}
|
|
186
|
-
|
|
168
|
+
// Build + cache the line array and per-frame start indices once per payload
|
|
169
|
+
get_xyz_cache(data) {
|
|
170
|
+
if (this.xyz_cache?.data === data)
|
|
171
|
+
return this.xyz_cache;
|
|
187
172
|
const lines = data.trim().split(/\r?\n/);
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const comment = lines[line_idx + 1] || ``;
|
|
204
|
-
const lattice_matrix = parse_extxyz_lattice(comment);
|
|
205
|
-
const { elements, positions, force_stats } = parse_xyz_atom_lines(lines, line_idx + 2, num_atoms, comment, `indexed frame ${frame_number}`);
|
|
206
|
-
const { step, properties } = this.parse_xyz_metadata(comment, frame_number);
|
|
207
|
-
const metadata = { ...properties, ...force_stats };
|
|
208
|
-
// Derive volume from the lattice (parity with the eager parse_xyz_trajectory parser)
|
|
209
|
-
if (lattice_matrix)
|
|
210
|
-
metadata.volume = math.calc_lattice_params(lattice_matrix).volume;
|
|
211
|
-
return create_trajectory_frame(positions, elements, lattice_matrix, lattice_matrix ? [true, true, true] : undefined, step, metadata);
|
|
173
|
+
const frame_starts = Array.from(iter_xyz_frames(lines), ({ start }) => start);
|
|
174
|
+
this.xyz_cache = { data, lines, frame_starts };
|
|
175
|
+
return this.xyz_cache;
|
|
176
|
+
}
|
|
177
|
+
load_xyz_frame(data, frame_number) {
|
|
178
|
+
const { lines, frame_starts } = this.get_xyz_cache(data);
|
|
179
|
+
const start = frame_starts[frame_number];
|
|
180
|
+
if (start === undefined)
|
|
181
|
+
return null; // out-of-range frame
|
|
182
|
+
const num_atoms = Math.trunc(Number(lines[start]?.trim()));
|
|
183
|
+
const comment = lines[start + 1] ?? ``;
|
|
184
|
+
return build_xyz_frame(lines, { start, num_atoms, comment }, {
|
|
185
|
+
frame_label: `indexed frame ${frame_number}`,
|
|
186
|
+
default_step: frame_number,
|
|
187
|
+
});
|
|
212
188
|
}
|
|
213
189
|
load_ase_frame(data, frame_number) {
|
|
214
190
|
try {
|
|
215
191
|
const view = new DataView(data);
|
|
216
|
-
const n_items =
|
|
217
|
-
const offsets_pos = Number(view.getBigInt64(40, true));
|
|
192
|
+
const { n_items, offsets_pos } = read_ase_header(view);
|
|
218
193
|
if (frame_number >= n_items)
|
|
219
194
|
return null;
|
|
220
195
|
const frame_offset = Number(view.getBigInt64(offsets_pos + frame_number * 8, true));
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const positions = positions_ref?.ndarray
|
|
225
|
-
? read_ndarray_from_view(view, positions_ref)
|
|
226
|
-
: positions_ref;
|
|
227
|
-
const numbers_ref = frame_data[`numbers.`] ?? frame_data.numbers ?? this.global_numbers;
|
|
228
|
-
const numbers = numbers_ref?.ndarray
|
|
229
|
-
? read_ndarray_from_view(view, numbers_ref).flat()
|
|
230
|
-
: numbers_ref;
|
|
231
|
-
if (numbers)
|
|
232
|
-
this.global_numbers = numbers;
|
|
233
|
-
if (!numbers || !positions)
|
|
234
|
-
throw new Error(`Missing atomic numbers or positions`);
|
|
235
|
-
const cell = frame_data.cell ? validate_3x3_matrix(frame_data.cell) : undefined;
|
|
236
|
-
const metadata = {
|
|
237
|
-
step: frame_number,
|
|
238
|
-
...frame_data.calculator,
|
|
239
|
-
...frame_data.info,
|
|
240
|
-
};
|
|
241
|
-
if (cell) {
|
|
242
|
-
try {
|
|
243
|
-
metadata.volume = Math.abs(math.det_3x3(cell));
|
|
244
|
-
}
|
|
245
|
-
catch (error) {
|
|
246
|
-
console.warn(`Failed to calculate volume for frame ${frame_number}:`, error);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
return create_trajectory_frame(positions, convert_atomic_numbers(numbers), cell, frame_data.pbc ?? [true, true, true], frame_number, metadata);
|
|
196
|
+
const { frame, numbers } = decode_ase_frame(view, data, frame_offset, frame_number, this.global_numbers);
|
|
197
|
+
this.global_numbers = numbers;
|
|
198
|
+
return frame;
|
|
250
199
|
}
|
|
251
200
|
catch (error) {
|
|
252
201
|
console.warn(`Failed to load ASE frame ${frame_number}:`, error);
|
|
253
202
|
return null;
|
|
254
203
|
}
|
|
255
204
|
}
|
|
256
|
-
parse_xyz_metadata(comment, frame_number) {
|
|
257
|
-
const { step, properties } = parse_xyz_comment_metadata(comment);
|
|
258
|
-
return { frame_number, step: step ?? frame_number, properties };
|
|
259
|
-
}
|
|
260
205
|
parse_ase_metadata(frame_data, frame_number) {
|
|
261
206
|
const properties = {};
|
|
262
207
|
const step = frame_number;
|
|
263
208
|
if (frame_data.calculator && typeof frame_data.calculator === `object`) {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
209
|
+
copy_numeric_fields(properties, frame_data.calculator, [
|
|
210
|
+
`energy`,
|
|
211
|
+
`potential_energy`,
|
|
212
|
+
`kinetic_energy`,
|
|
213
|
+
`total_energy`,
|
|
214
|
+
]);
|
|
271
215
|
}
|
|
272
216
|
if (frame_data.info && typeof frame_data.info === `object`) {
|
|
273
|
-
|
|
274
|
-
const info_properties = [
|
|
217
|
+
copy_numeric_fields(properties, frame_data.info, [
|
|
275
218
|
`force_max`,
|
|
276
219
|
`force_norm`,
|
|
277
220
|
`stress_max`,
|
|
278
221
|
`stress_frobenius`,
|
|
279
222
|
`pressure`,
|
|
280
223
|
`temperature`,
|
|
281
|
-
];
|
|
282
|
-
for (const prop of info_properties) {
|
|
283
|
-
if (prop in info && typeof info[prop] === `number`) {
|
|
284
|
-
properties[prop] = info[prop];
|
|
285
|
-
}
|
|
286
|
-
}
|
|
224
|
+
]);
|
|
287
225
|
}
|
|
288
226
|
if (frame_data.cell && Array.isArray(frame_data.cell)) {
|
|
289
227
|
try {
|
|
@@ -3,13 +3,23 @@ import * as math from '../math';
|
|
|
3
3
|
import type { AnyStructure } from '../structure/index';
|
|
4
4
|
import type { Pbc } from '../structure/pbc';
|
|
5
5
|
import type { TrajectoryFrame } from './index';
|
|
6
|
-
export declare const is_valid_element_symbol: (symbol: string) => symbol is ElementSymbol;
|
|
7
|
-
export declare const coerce_element_symbol: (symbol: string) => ElementSymbol | undefined;
|
|
8
6
|
export declare function validate_3x3_matrix(data: unknown): math.Matrix3x3;
|
|
9
7
|
export declare const convert_atomic_numbers: (numbers: number[]) => ElementSymbol[];
|
|
8
|
+
export declare const count_elements: (elements: readonly string[]) => Record<string, number>;
|
|
10
9
|
export declare const create_structure: (positions: number[][], elements: ElementSymbol[], lattice_matrix?: math.Matrix3x3, pbc?: Pbc, force_data?: number[][]) => AnyStructure;
|
|
11
10
|
export declare const create_trajectory_frame: (positions: number[][], elements: ElementSymbol[], lattice_matrix: math.Matrix3x3 | undefined, pbc: Pbc | undefined, step: number, metadata?: Record<string, unknown>) => TrajectoryFrame;
|
|
12
11
|
export declare const read_ndarray_from_view: (view: DataView, ref: {
|
|
13
12
|
ndarray: unknown[];
|
|
14
13
|
}) => number[][];
|
|
14
|
+
export declare const copy_numeric_fields: (target: Record<string, number>, source: Record<string, unknown>, fields: readonly string[]) => void;
|
|
15
|
+
export declare function calc_force_stats(forces: number[][]): {
|
|
16
|
+
force_max: number;
|
|
17
|
+
force_norm: number;
|
|
18
|
+
} | null;
|
|
19
|
+
export declare const is_xyz_atom_line: (parts: string[] | undefined) => boolean;
|
|
20
|
+
export declare function iter_xyz_frames(lines: string[]): Generator<{
|
|
21
|
+
start: number;
|
|
22
|
+
num_atoms: number;
|
|
23
|
+
comment: string;
|
|
24
|
+
}>;
|
|
15
25
|
export declare function count_xyz_frames(data: string): number;
|