matterviz 0.4.1 → 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 +75 -85
- package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
- package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
- package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
- package/dist/brillouin/BrillouinZoneScene.svelte +26 -39
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
- package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +62 -74
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +511 -547
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
- package/dist/chempot-diagram/async-compute.svelte.js +1 -1
- package/dist/chempot-diagram/controls-state.svelte.js +1 -1
- package/dist/colors/index.d.ts +0 -4
- package/dist/colors/index.js +19 -20
- 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 +92 -95
- package/dist/composition/PieChart.svelte +55 -41
- package/dist/composition/format.js +1 -1
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/parse.d.ts +2 -2
- package/dist/composition/parse.js +11 -10
- package/dist/constants.js +11 -9
- package/dist/convex-hull/ConvexHull.svelte +12 -15
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull2D.svelte +93 -92
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +109 -140
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +75 -94
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
- package/dist/convex-hull/ConvexHullControls.svelte +46 -48
- package/dist/convex-hull/ConvexHullStats.svelte +193 -195
- package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
- 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/canvas-interactions.svelte.js +2 -1
- package/dist/convex-hull/helpers.d.ts +8 -10
- package/dist/convex-hull/helpers.js +36 -36
- package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
- package/dist/convex-hull/thermodynamics.js +18 -17
- package/dist/coordination/CoordinationBarPlot.svelte +38 -33
- 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 +5 -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/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 -4
- package/dist/element/index.js +3 -18
- package/dist/feedback/DragOverlay.svelte +5 -5
- package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
- package/dist/feedback/StatusMessage.svelte +7 -4
- package/dist/fermi-surface/FermiSlice.svelte +21 -18
- package/dist/fermi-surface/FermiSurface.svelte +14 -22
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +5 -7
- package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
- package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceScene.svelte +37 -64
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
- package/dist/fermi-surface/compute.js +3 -3
- package/dist/fermi-surface/parse.js +22 -24
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +109 -148
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
- package/dist/heatmap-matrix/index.d.ts +5 -0
- package/dist/icons.d.ts +4 -0
- package/dist/icons.js +4 -0
- package/dist/io/ExportPane.svelte +10 -6
- package/dist/io/decompress.d.ts +2 -1
- package/dist/io/decompress.js +22 -35
- package/dist/io/export.d.ts +4 -0
- package/dist/io/export.js +5 -1
- package/dist/io/fetch.d.ts +0 -3
- package/dist/io/fetch.js +0 -11
- package/dist/io/index.d.ts +0 -1
- package/dist/io/index.js +2 -9
- package/dist/io/is-binary.d.ts +9 -0
- package/dist/io/is-binary.js +45 -1
- 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 +6 -6
- package/dist/labels.d.ts +6 -2
- package/dist/labels.js +43 -13
- package/dist/layout/FullscreenButton.svelte +2 -1
- package/dist/layout/FullscreenToggle.svelte +10 -4
- 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 +9 -10
- package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
- package/dist/layout/fullscreen.js +3 -5
- package/dist/layout/fullscreen.svelte.js +1 -2
- package/dist/layout/index.d.ts +1 -0
- package/dist/layout/index.js +1 -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 +2 -0
- package/dist/math.js +19 -0
- 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 +7 -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 +113 -145
- 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 +70 -94
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
- 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/diagram-input.d.ts +1 -2
- 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 +430 -391
- package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
- package/dist/plot/bar/BarPlotControls.svelte +1 -3
- package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
- package/dist/plot/bar/SpacegroupBarPlot.svelte +29 -36
- package/dist/plot/bar/data.d.ts +5 -4
- package/dist/plot/bar/data.js +2 -1
- package/dist/plot/box/BoxPlot.svelte +301 -209
- package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
- package/dist/plot/box/Violin.svelte.d.ts +1 -0
- package/dist/plot/box/box-plot.js +1 -1
- package/dist/plot/core/auto-place.js +1 -1
- 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 +101 -106
- 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 +18 -9
- package/dist/plot/core/components/Line.svelte.d.ts +2 -0
- package/dist/plot/core/components/PlotAxis.svelte +40 -17
- package/dist/plot/core/components/PlotControls.svelte +65 -41
- 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 +54 -57
- package/dist/plot/core/components/ReferencePlane.svelte +7 -8
- 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 +27 -474
- package/dist/plot/core/data-transform.js +9 -5
- package/dist/plot/core/fill-utils.d.ts +3 -1
- package/dist/plot/core/fill-utils.js +28 -6
- package/dist/plot/core/index.d.ts +1 -0
- package/dist/plot/core/index.js +1 -0
- package/dist/plot/core/interactions.js +0 -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/reference-line.js +1 -1
- package/dist/plot/core/scales.d.ts +23 -0
- package/dist/plot/core/scales.js +39 -13
- 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 +29 -324
- 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.js +2 -2
- package/dist/plot/histogram/Histogram.svelte +304 -325
- package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
- package/dist/plot/histogram/HistogramControls.svelte +30 -28
- 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 +78 -69
- package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
- package/dist/plot/sankey/SankeyControls.svelte +22 -16
- package/dist/plot/scatter/BinnedScatterPlot.svelte +263 -109
- package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
- package/dist/plot/scatter/ElementScatter.svelte +4 -1
- package/dist/plot/scatter/ScatterPlot.svelte +477 -385
- package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
- 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 +3 -2
- package/dist/plot/scatter/binned-scatter-types.js +6 -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 +25 -34
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
- package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
- package/dist/plot/sunburst/Sunburst.svelte +251 -329
- package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
- 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 +10 -3
- 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 +1 -1
- package/dist/scene/bind-renderer.svelte.js +14 -6
- package/dist/settings.d.ts +19 -9
- package/dist/settings.js +77 -50
- package/dist/spectral/Bands.svelte +223 -230
- package/dist/spectral/BandsAndDos.svelte +11 -9
- package/dist/spectral/BrillouinBandsDos.svelte +19 -27
- package/dist/spectral/Dos.svelte +70 -73
- package/dist/spectral/helpers.d.ts +3 -3
- package/dist/spectral/helpers.js +25 -35
- package/dist/state.svelte.js +5 -18
- package/dist/structure/Arrow.svelte +5 -18
- 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 +15 -3
- package/dist/structure/CellSelect.svelte +11 -26
- 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 +473 -419
- package/dist/structure/Structure.svelte.d.ts +4 -2
- package/dist/structure/StructureCarousel.svelte +630 -0
- package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
- package/dist/structure/StructureControls.svelte +157 -399
- package/dist/structure/StructureControls.svelte.d.ts +1 -1
- package/dist/structure/StructureExportPane.svelte +17 -21
- package/dist/structure/StructureInfoPane.svelte +72 -66
- package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
- package/dist/structure/StructureScene.svelte +467 -476
- package/dist/structure/StructureScene.svelte.d.ts +3 -1
- package/dist/structure/StructureViewport.svelte +386 -0
- package/dist/structure/StructureViewport.svelte.d.ts +63 -0
- package/dist/structure/atom-label-placement.d.ts +16 -12
- package/dist/structure/atom-label-placement.js +70 -37
- package/dist/structure/atom-properties.d.ts +2 -0
- package/dist/structure/atom-properties.js +104 -38
- package/dist/structure/bonding.d.ts +10 -3
- package/dist/structure/bonding.js +84 -28
- package/dist/structure/edit-history.d.ts +6 -0
- package/dist/structure/edit-history.js +27 -0
- package/dist/structure/export.d.ts +1 -0
- package/dist/structure/export.js +39 -31
- 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 +16 -1
- package/dist/structure/index.js +13 -2
- package/dist/structure/measure.d.ts +1 -1
- package/dist/structure/measure.js +6 -12
- package/dist/structure/parse.d.ts +2 -1
- package/dist/structure/parse.js +243 -222
- package/dist/structure/partial-occupancy.js +4 -2
- package/dist/structure/pbc.js +78 -98
- package/dist/structure/polyhedra.d.ts +0 -1
- package/dist/structure/polyhedra.js +3 -18
- package/dist/structure/supercell.d.ts +1 -2
- package/dist/structure/supercell.js +7 -13
- package/dist/symmetry/SymmetryElements.svelte +11 -15
- package/dist/symmetry/SymmetryStats.svelte +56 -68
- package/dist/symmetry/WyckoffTable.svelte +5 -24
- package/dist/symmetry/cell-transform.js +1 -0
- package/dist/symmetry/index.d.ts +1 -0
- package/dist/symmetry/index.js +8 -2
- package/dist/symmetry/spacegroups.js +3 -2
- package/dist/table/HeatmapTable.svelte +1102 -365
- 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 +515 -308
- package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
- package/dist/trajectory/TrajectoryError.svelte +11 -8
- package/dist/trajectory/TrajectoryExportPane.svelte +14 -31
- package/dist/trajectory/TrajectoryInfoPane.svelte +85 -97
- package/dist/trajectory/extract.js +56 -34
- package/dist/trajectory/format-detect.js +11 -9
- package/dist/trajectory/frame-reader.d.ts +2 -0
- package/dist/trajectory/frame-reader.js +33 -29
- package/dist/trajectory/helpers.d.ts +2 -0
- package/dist/trajectory/helpers.js +18 -7
- package/dist/trajectory/index.d.ts +1 -0
- package/dist/trajectory/index.js +3 -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 +2 -3
- package/dist/trajectory/parse/index.js +17 -20
- package/dist/trajectory/parse/lammps.js +8 -12
- package/dist/trajectory/parse/vasp.js +10 -7
- 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.js +11 -7
- package/dist/trajectory/plotting.d.ts +8 -9
- package/dist/trajectory/plotting.js +99 -27
- package/dist/utils.d.ts +3 -0
- package/dist/utils.js +7 -0
- package/dist/xrd/XrdPlot.svelte +47 -61
- package/dist/xrd/broadening.js +2 -1
- package/dist/xrd/calc-xrd.js +2 -4
- package/dist/xrd/parse.d.ts +0 -1
- package/dist/xrd/parse.js +56 -73
- package/package.json +61 -33
- package/dist/api/mp.d.ts +0 -6
- package/dist/api/mp.js +0 -22
- package/dist/plot/sunburst/SunburstControls.svelte +0 -200
|
@@ -3,13 +3,13 @@ import { is_binary } from '../../io/is-binary';
|
|
|
3
3
|
import { is_plain_object } from '../../utils';
|
|
4
4
|
import { is_parsed_structure, parse_xyz } from '../../structure/parse';
|
|
5
5
|
import { INDEX_SAMPLE_RATE, LARGE_FILE_THRESHOLD } from '../constants';
|
|
6
|
-
import { strip_compression_extensions } from '../../io';
|
|
7
|
-
import { ext_hint, FORMAT_PATTERNS
|
|
6
|
+
import { strip_compression_extensions } from '../../io/decompress';
|
|
7
|
+
import { ext_hint, FORMAT_PATTERNS } from '../format-detect';
|
|
8
8
|
import { TrajFrameReader } from '../frame-reader';
|
|
9
9
|
import { count_xyz_frames } from '../helpers';
|
|
10
10
|
import { parse_ase_trajectory } from './ase';
|
|
11
11
|
import { get_traj_parse_warnings, reset_traj_parse_warnings, traj_warn } from './diagnostics';
|
|
12
|
-
import {
|
|
12
|
+
import { parse_hdf5_trajectory } from './hdf5';
|
|
13
13
|
import { parse_lammps_trajectory } from './lammps';
|
|
14
14
|
import { parse_pymatgen_trajectory } from './pymatgen';
|
|
15
15
|
import { parse_vasp_xdatcar } from './vasp';
|
|
@@ -23,14 +23,15 @@ const assert_frame_structure = (structure, label) => {
|
|
|
23
23
|
};
|
|
24
24
|
// Re-export constants and types for consumers
|
|
25
25
|
export { LARGE_FILE_THRESHOLD, MAX_BIN_FILE_SIZE, MAX_TEXT_FILE_SIZE, } from '../constants';
|
|
26
|
-
export { is_trajectory_file
|
|
26
|
+
export { is_trajectory_file } from '../format-detect';
|
|
27
|
+
export { TrajFrameReader } from '../frame-reader';
|
|
27
28
|
export async function parse_trajectory_data(data, filename, atom_type_mapping) {
|
|
28
29
|
reset_traj_parse_warnings();
|
|
29
30
|
if (data instanceof ArrayBuffer) {
|
|
30
31
|
if (FORMAT_PATTERNS.ase(data, filename))
|
|
31
32
|
return parse_ase_trajectory(data, filename);
|
|
32
33
|
if (FORMAT_PATTERNS.hdf5(data, filename))
|
|
33
|
-
return
|
|
34
|
+
return parse_hdf5_trajectory(data, filename);
|
|
34
35
|
throw new Error(`Unsupported binary format${filename ? `: ${filename}` : ``}`);
|
|
35
36
|
}
|
|
36
37
|
if (typeof data === `string`) {
|
|
@@ -45,19 +46,15 @@ export async function parse_trajectory_data(data, filename, atom_type_mapping) {
|
|
|
45
46
|
}
|
|
46
47
|
// Single XYZ fallback (content-sniffed when the filename gives no format hint,
|
|
47
48
|
// e.g. blob: object URLs whose basenames are UUIDs)
|
|
48
|
-
const xyz_hint = ext_hint(filename, /\.(xyz|extxyz)$/);
|
|
49
|
+
const xyz_hint = ext_hint(filename, /\.(?:xyz|extxyz)$/);
|
|
49
50
|
if (xyz_hint || (xyz_hint === null && count_xyz_frames(content) === 1)) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Single-frame XYZ parsing failed, continue to JSON parsing.
|
|
51
|
+
// parse_xyz never throws (it returns null); fall through to JSON parsing.
|
|
52
|
+
const structure = parse_xyz(content);
|
|
53
|
+
if (structure) {
|
|
54
|
+
return {
|
|
55
|
+
frames: [{ structure, step: 0, metadata: {} }],
|
|
56
|
+
metadata: { source_format: `single_xyz`, frame_count: 1 },
|
|
57
|
+
};
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
try {
|
|
@@ -158,9 +155,9 @@ export async function parse_trajectory_async(data, filename, on_progress, option
|
|
|
158
155
|
// When the filename gives no format hint (e.g. blob: URLs), sniff a content
|
|
159
156
|
// prefix for XYZ frames so large extensionless files still get indexed.
|
|
160
157
|
const base_filename = strip_compression_extensions(filename);
|
|
161
|
-
const can_index = /\.(xyz|extxyz|traj)$/.test(base_filename) ||
|
|
158
|
+
const can_index = /\.(?:xyz|extxyz|traj)$/.test(base_filename) ||
|
|
162
159
|
(typeof data === `string` &&
|
|
163
|
-
ext_hint(filename, /\.(xyz|extxyz)$/) === null &&
|
|
160
|
+
ext_hint(filename, /\.(?:xyz|extxyz)$/) === null &&
|
|
164
161
|
count_xyz_frames(data.slice(0, 2 ** 20)) >= 1);
|
|
165
162
|
if (should_use_indexing && can_index) {
|
|
166
163
|
return attach_parse_warnings(await parse_with_unified_loader(data, filename, { index_sample_rate, extract_plot_metadata }, on_progress));
|
|
@@ -231,7 +228,7 @@ async function parse_with_unified_loader(data, filename, options, on_progress) {
|
|
|
231
228
|
}
|
|
232
229
|
// Factory function for frame loader (simplified)
|
|
233
230
|
export function create_frame_loader(filename) {
|
|
234
|
-
if (!/\.(xyz|extxyz|traj)$/.
|
|
231
|
+
if (!/\.(?:xyz|extxyz|traj)$/.test(filename.toLowerCase())) {
|
|
235
232
|
throw new Error(`Unsupported format for frame loading: ${filename}`);
|
|
236
233
|
}
|
|
237
234
|
return new TrajFrameReader(filename);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ELEM_SYMBOLS } from '../../labels';
|
|
2
2
|
import * as math from '../../math';
|
|
3
|
-
import { coerce_elem_symbol } from '../../element';
|
|
4
|
-
import { create_trajectory_frame } from '../helpers';
|
|
3
|
+
import { coerce_elem_symbol } from '../../element/helpers';
|
|
4
|
+
import { count_elements, create_trajectory_frame } from '../helpers';
|
|
5
5
|
import { traj_warn } from './diagnostics';
|
|
6
6
|
const is_periodic = (token) => token.toLowerCase().startsWith(`p`);
|
|
7
7
|
// Parse LAMMPS box bounds → lattice matrix. Handles orthogonal and triclinic boxes.
|
|
@@ -60,11 +60,11 @@ export function parse_lammps_trajectory(content, filename, atom_type_mapping) {
|
|
|
60
60
|
if (!skip_to(`ITEM: TIMESTEP`))
|
|
61
61
|
break;
|
|
62
62
|
idx++;
|
|
63
|
-
const timestep =
|
|
63
|
+
const timestep = Math.trunc(Number(read_line())) || 0;
|
|
64
64
|
if (!skip_to(`ITEM: NUMBER OF ATOMS`))
|
|
65
65
|
break;
|
|
66
66
|
idx++;
|
|
67
|
-
const num_atoms =
|
|
67
|
+
const num_atoms = Math.trunc(Number(read_line()));
|
|
68
68
|
if (!num_atoms || num_atoms <= 0)
|
|
69
69
|
continue;
|
|
70
70
|
// BOX BOUNDS: orthogonal="pp pp pp", triclinic="xy xz yz pp pp pp"
|
|
@@ -111,7 +111,7 @@ export function parse_lammps_trajectory(content, filename, atom_type_mapping) {
|
|
|
111
111
|
const frac_to_cart = use_scaled ? math.create_frac_to_cart(lattice_matrix) : null;
|
|
112
112
|
for (let atom = 0; atom < num_atoms && idx < lines.length; atom++) {
|
|
113
113
|
const parts = read_line().split(/\s+/);
|
|
114
|
-
const coords = pos_cols.map((col_idx) =>
|
|
114
|
+
const coords = pos_cols.map((col_idx) => Number(parts[col_idx]));
|
|
115
115
|
if (coords.some(isNaN) || parts.length <= max_col_idx)
|
|
116
116
|
continue;
|
|
117
117
|
// Convert scaled coordinates to Cartesian if needed
|
|
@@ -119,7 +119,7 @@ export function parse_lammps_trajectory(content, filename, atom_type_mapping) {
|
|
|
119
119
|
let element_symbol;
|
|
120
120
|
if (type_col !== undefined) {
|
|
121
121
|
// Map atom type to element using custom mapping or default (type 1 -> H, etc.)
|
|
122
|
-
const atom_type =
|
|
122
|
+
const atom_type = Math.trunc(Number(parts[type_col])) || 1;
|
|
123
123
|
atom_types_found.add(atom_type);
|
|
124
124
|
element_symbol = get_element(atom_type);
|
|
125
125
|
}
|
|
@@ -134,7 +134,7 @@ export function parse_lammps_trajectory(content, filename, atom_type_mapping) {
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
else if (id_col !== undefined) {
|
|
137
|
-
const atom_id =
|
|
137
|
+
const atom_id = Math.trunc(Number(parts[id_col])) || 1;
|
|
138
138
|
atom_types_found.add(atom_id);
|
|
139
139
|
if (!id_fallback_warning_emitted) {
|
|
140
140
|
traj_warn(`LAMMPS parser fallback: mapping atom IDs to elements from ID column; this may be incorrect for large or sequential IDs. Prefer a TYPE column when available.`);
|
|
@@ -159,11 +159,7 @@ export function parse_lammps_trajectory(content, filename, atom_type_mapping) {
|
|
|
159
159
|
throw new Error(`No valid frames found in LAMMPS trajectory`);
|
|
160
160
|
}
|
|
161
161
|
const first_frame = frames[0];
|
|
162
|
-
const element_counts = first_frame.structure.sites.
|
|
163
|
-
const elem = site.species[0].element;
|
|
164
|
-
counts[elem] = (counts[elem] || 0) + 1;
|
|
165
|
-
return counts;
|
|
166
|
-
}, {});
|
|
162
|
+
const element_counts = count_elements(first_frame.structure.sites.map((site) => site.species[0].element));
|
|
167
163
|
return {
|
|
168
164
|
frames,
|
|
169
165
|
metadata: {
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import * as math from '../../math';
|
|
2
|
-
import { is_elem_symbol } from '../../element';
|
|
2
|
+
import { is_elem_symbol } from '../../element/helpers';
|
|
3
3
|
import { create_trajectory_frame, validate_3x3_matrix } from '../helpers';
|
|
4
|
+
import { parse_leading_num } from '../../utils';
|
|
4
5
|
// Parse the 7-line XDATCAR header at lines[start]: title, scale factor, 3 lattice rows
|
|
5
6
|
// (multiplied by scale), element names, element counts
|
|
6
7
|
function parse_xdatcar_header(lines, start) {
|
|
7
|
-
const scale =
|
|
8
|
+
const scale = parse_leading_num(lines[start + 1]);
|
|
8
9
|
const rows = lines.slice(start + 2, start + 5).map((line) => line
|
|
9
10
|
.trim()
|
|
10
11
|
.split(/\s+/)
|
|
11
|
-
.map((val) =>
|
|
12
|
+
.map((val) => Number(val) * scale));
|
|
12
13
|
const names = lines[start + 5].trim().split(/\s+/);
|
|
13
14
|
const counts = lines[start + 6].trim().split(/\s+/).map(Number);
|
|
14
15
|
return { scale, rows, names, counts };
|
|
@@ -31,7 +32,9 @@ export function parse_vasp_xdatcar(content, filename) {
|
|
|
31
32
|
const bad_element = element_names.find((name) => !is_elem_symbol(name));
|
|
32
33
|
if (bad_element)
|
|
33
34
|
throw new Error(`Invalid element symbol in XDATCAR: ${bad_element}`);
|
|
34
|
-
|
|
35
|
+
// "Na Cl" + [2, 2] -> [Na, Na, Cl, Cl]
|
|
36
|
+
const expand_element_counts = (names, counts) => names.flatMap((name, idx) => Array(counts[idx]).fill(name));
|
|
37
|
+
let elements = expand_element_counts(element_names, element_counts);
|
|
35
38
|
const frames = [];
|
|
36
39
|
let line_idx = 7;
|
|
37
40
|
let frac_to_cart = math.create_frac_to_cart(lattice_matrix);
|
|
@@ -49,14 +52,14 @@ export function parse_vasp_xdatcar(content, filename) {
|
|
|
49
52
|
if (hdr.names.length === hdr.counts.length &&
|
|
50
53
|
hdr.names.every(is_elem_symbol) &&
|
|
51
54
|
hdr.counts.every((count) => Number.isInteger(count) && count > 0)) {
|
|
52
|
-
elements = hdr.names
|
|
55
|
+
elements = expand_element_counts(hdr.names, hdr.counts);
|
|
53
56
|
}
|
|
54
57
|
}
|
|
55
58
|
}
|
|
56
59
|
const config_line = lines[config_idx];
|
|
57
60
|
line_idx = config_idx + 1;
|
|
58
|
-
const step_match = /configuration=\s*(
|
|
59
|
-
const step = step_match ?
|
|
61
|
+
const step_match = /configuration=\s*(?<step>\d+)/.exec(config_line);
|
|
62
|
+
const step = step_match ? Math.trunc(Number(step_match[1])) : frames.length + 1;
|
|
60
63
|
const positions = [];
|
|
61
64
|
for (let idx = 0; idx < elements.length && line_idx < lines.length; idx++) {
|
|
62
65
|
const coords = lines[line_idx].trim().split(/\s+/).slice(0, 3).map(Number);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ElectronicBandStructure, ElectronicDos } from '../../spectral';
|
|
2
|
+
import type * as h5wasm from 'h5wasm';
|
|
3
|
+
export interface VaspoutElectronicData {
|
|
4
|
+
dos: ElectronicDos | null;
|
|
5
|
+
bands: ElectronicBandStructure | null;
|
|
6
|
+
}
|
|
7
|
+
export declare const read_vaspout_dos: (h5_file: h5wasm.File) => ElectronicDos | null;
|
|
8
|
+
export declare const line_mode_labels: (labels: string[] | null, per_segment_dataset: number | null, n_kpoints: number) => {
|
|
9
|
+
labels: (string | null)[];
|
|
10
|
+
per_segment: number;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare const read_vaspout_bands: (h5_file: h5wasm.File, dos?: ElectronicDos | null) => ElectronicBandStructure | null;
|
|
13
|
+
export declare const read_vaspout_electronic: (h5_file: h5wasm.File) => VaspoutElectronicData | null;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// Electronic-structure results (DOS + band eigenvalues) from VASP 6.x vaspout.h5.
|
|
2
|
+
//
|
|
3
|
+
// Reads results/electron_dos* into the ElectronicDos shape and
|
|
4
|
+
// results/electron_eigenvalues* (incl. the _kpoints_opt variants written for
|
|
5
|
+
// band paths from KPOINTS_OPT, e.g. by phelel) into the matterviz
|
|
6
|
+
// ElectronicBandStructure shape consumed by the spectral components.
|
|
7
|
+
//
|
|
8
|
+
// Schema reference: ferrox src/io/vasp/hdf5/mod.rs path constants (which follow
|
|
9
|
+
// py4vasp's VASP 6.x schema definitions).
|
|
10
|
+
import { create_frac_to_cart, euclidean_dist, matrix_inverse_3x3, transpose_3x3_matrix, } from '../../math';
|
|
11
|
+
import { pretty_sym_point } from '../../spectral/helpers';
|
|
12
|
+
import { validate_3x3_matrix } from '../helpers';
|
|
13
|
+
import { read_dataset, scale_matrix, to_scalar_number, to_string_array } from './h5-utils';
|
|
14
|
+
const DOS_GROUPS = [`results/electron_dos`, `results/electron_dos_kpoints_opt`];
|
|
15
|
+
const DOS_ENERGY_NAMES = [`energies`, `energy`];
|
|
16
|
+
const DOS_TOTAL_NAMES = [`dos`, `total`];
|
|
17
|
+
const BANDS_GROUPS = [
|
|
18
|
+
`results/electron_eigenvalues`,
|
|
19
|
+
`results/electron_eigenvalues_kpoints_opt`,
|
|
20
|
+
];
|
|
21
|
+
const EIGENVALUE_NAMES = [`eigenvalues`, `eigenvalue`];
|
|
22
|
+
const KPOINT_COORD_NAMES = [`kpoints`, `kpoint_coords`];
|
|
23
|
+
const KPOINT_COORD_FALLBACKS = [`results/kpoints/coordinates`];
|
|
24
|
+
const KPOINT_LABEL_PATHS = [
|
|
25
|
+
`results/kpoints/labels`,
|
|
26
|
+
`input/kpoints_opt/labels_kpoints`,
|
|
27
|
+
`input/kpoints/labels_kpoints`,
|
|
28
|
+
];
|
|
29
|
+
const KPOINTS_PER_SEGMENT_PATHS = [
|
|
30
|
+
`input/kpoints_opt/number_kpoints`,
|
|
31
|
+
`input/kpoints/number_kpoints`,
|
|
32
|
+
];
|
|
33
|
+
const read_first_dataset = (h5_file, paths) => {
|
|
34
|
+
for (const path of paths) {
|
|
35
|
+
const data = read_dataset(h5_file, path);
|
|
36
|
+
if (data !== null)
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
};
|
|
41
|
+
const is_number_array = (data) => Array.isArray(data) && data.every((val) => typeof val === `number`);
|
|
42
|
+
export const read_vaspout_dos = (h5_file) => {
|
|
43
|
+
for (const group of DOS_GROUPS) {
|
|
44
|
+
const energies = read_first_dataset(h5_file, DOS_ENERGY_NAMES.map((name) => `${group}/${name}`));
|
|
45
|
+
const total = read_first_dataset(h5_file, DOS_TOTAL_NAMES.map((name) => `${group}/${name}`));
|
|
46
|
+
if (!is_number_array(energies) || !Array.isArray(total))
|
|
47
|
+
continue;
|
|
48
|
+
// Total DOS is (n_spin, n_energies) in real files but tolerate a flat array
|
|
49
|
+
const spin_channels = is_number_array(total) ? [total] : total;
|
|
50
|
+
const densities = spin_channels[0];
|
|
51
|
+
if (!is_number_array(densities) || densities.length !== energies.length)
|
|
52
|
+
continue;
|
|
53
|
+
const spin_down = spin_channels[1];
|
|
54
|
+
const spin_polarized = is_number_array(spin_down) && spin_down.length === energies.length;
|
|
55
|
+
const efermi = to_scalar_number(read_dataset(h5_file, `${group}/efermi`));
|
|
56
|
+
return {
|
|
57
|
+
type: `electronic`,
|
|
58
|
+
energies,
|
|
59
|
+
densities,
|
|
60
|
+
...(spin_polarized ? { spin_down_densities: spin_down, spin_polarized } : {}),
|
|
61
|
+
...(efermi !== null ? { efermi } : {}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
};
|
|
66
|
+
// Real (row-vector) lattice for k-path distances: prefer the relaxed structure's
|
|
67
|
+
// lattice, fall back to the POSCAR input one (bands-only files keep only the latter)
|
|
68
|
+
const read_lattice = (h5_file) => {
|
|
69
|
+
for (const [lattice_path, scale_path] of [
|
|
70
|
+
[`results/positions/lattice_vectors`, `results/positions/scale`],
|
|
71
|
+
[`input/poscar/lattice_vectors`, `input/poscar/scale`],
|
|
72
|
+
]) {
|
|
73
|
+
const lattice_data = read_dataset(h5_file, lattice_path);
|
|
74
|
+
if (!lattice_data)
|
|
75
|
+
continue;
|
|
76
|
+
try {
|
|
77
|
+
const scale = to_scalar_number(read_dataset(h5_file, scale_path)) ?? 1;
|
|
78
|
+
return scale_matrix(validate_3x3_matrix(lattice_data), scale);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
};
|
|
86
|
+
// B = 2π (A⁻¹)ᵀ for row-vector real lattice A; falls back to 2π·identity so
|
|
87
|
+
// bands-only files without any (invertible) lattice still get monotonic path
|
|
88
|
+
// distances.
|
|
89
|
+
const reciprocal_lattice = (lattice) => {
|
|
90
|
+
let recip = [
|
|
91
|
+
[1, 0, 0],
|
|
92
|
+
[0, 1, 0],
|
|
93
|
+
[0, 0, 1],
|
|
94
|
+
];
|
|
95
|
+
try {
|
|
96
|
+
if (lattice)
|
|
97
|
+
recip = transpose_3x3_matrix(matrix_inverse_3x3(lattice));
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
/* singular lattice: keep identity */
|
|
101
|
+
}
|
|
102
|
+
return recip.map((row) => row.map((val) => val * 2 * Math.PI));
|
|
103
|
+
};
|
|
104
|
+
// VASP line-mode label layout: 2 labels per path segment of `per_segment` points
|
|
105
|
+
// (e.g. 12 labels + 51 points/segment = 306 k-points). Returns per-kpoint labels
|
|
106
|
+
// (null between endpoints) or null when the layout doesn't match. When the
|
|
107
|
+
// input/kpoints*/number_kpoints dataset is absent (not all writers emit it),
|
|
108
|
+
// the segment length is inferred from the label/k-point counts instead.
|
|
109
|
+
export const line_mode_labels = (labels, per_segment_dataset, n_kpoints) => {
|
|
110
|
+
if (!labels || labels.length < 2 || labels.length % 2 !== 0)
|
|
111
|
+
return null;
|
|
112
|
+
const n_segments = labels.length / 2;
|
|
113
|
+
const per_segment = per_segment_dataset ?? n_kpoints / n_segments;
|
|
114
|
+
if (!Number.isInteger(per_segment) || per_segment < 2)
|
|
115
|
+
return null;
|
|
116
|
+
if (n_segments * per_segment !== n_kpoints)
|
|
117
|
+
return null;
|
|
118
|
+
const per_kpoint = Array.from({ length: n_kpoints }, () => null);
|
|
119
|
+
for (let seg = 0; seg < n_segments; seg++) {
|
|
120
|
+
per_kpoint[seg * per_segment] = pretty_sym_point(labels[2 * seg]);
|
|
121
|
+
per_kpoint[seg * per_segment + per_segment - 1] = pretty_sym_point(labels[2 * seg + 1]);
|
|
122
|
+
}
|
|
123
|
+
return { labels: per_kpoint, per_segment };
|
|
124
|
+
};
|
|
125
|
+
export const read_vaspout_bands = (h5_file, dos = read_vaspout_dos(h5_file)) => {
|
|
126
|
+
for (const group of BANDS_GROUPS) {
|
|
127
|
+
const eigenvalues = read_first_dataset(h5_file, EIGENVALUE_NAMES.map((name) => `${group}/${name}`));
|
|
128
|
+
const kpoint_data = read_first_dataset(h5_file, [
|
|
129
|
+
...KPOINT_COORD_NAMES.map((name) => `${group}/${name}`),
|
|
130
|
+
...KPOINT_COORD_FALLBACKS,
|
|
131
|
+
]);
|
|
132
|
+
if (!Array.isArray(eigenvalues) || !Array.isArray(kpoint_data))
|
|
133
|
+
continue;
|
|
134
|
+
// eigenvalues shape: (n_spin, n_kpoints, n_bands)
|
|
135
|
+
const n_kpoints = kpoint_data.length;
|
|
136
|
+
const spin_up = eigenvalues[0];
|
|
137
|
+
if (!Array.isArray(spin_up) || spin_up.length !== n_kpoints || n_kpoints === 0)
|
|
138
|
+
continue;
|
|
139
|
+
const n_bands = spin_up[0]?.length ?? 0;
|
|
140
|
+
if (n_bands === 0)
|
|
141
|
+
continue;
|
|
142
|
+
// [n_kpoints][n_bands] -> [n_bands][n_kpoints] as the spectral components expect
|
|
143
|
+
const transpose = (spin_eigs) => Array.from({ length: n_bands }, (_, band_idx) => spin_eigs.map((kpt_eigs) => kpt_eigs[band_idx]));
|
|
144
|
+
const bands = transpose(spin_up);
|
|
145
|
+
const spin_down = eigenvalues[1];
|
|
146
|
+
const spin_down_bands = Array.isArray(spin_down) && spin_down.length === n_kpoints
|
|
147
|
+
? transpose(spin_down)
|
|
148
|
+
: undefined;
|
|
149
|
+
const recip = reciprocal_lattice(read_lattice(h5_file));
|
|
150
|
+
const line_mode = line_mode_labels(to_string_array(read_first_dataset(h5_file, [`${group}/kpoints_labels`, ...KPOINT_LABEL_PATHS])), to_scalar_number(read_first_dataset(h5_file, KPOINTS_PER_SEGMENT_PATHS)), n_kpoints);
|
|
151
|
+
const labels = line_mode?.labels ?? null;
|
|
152
|
+
const distance = [];
|
|
153
|
+
const qpoints = [];
|
|
154
|
+
let path_length = 0;
|
|
155
|
+
let prev_cart = null;
|
|
156
|
+
const labels_dict = {};
|
|
157
|
+
const frac_to_cart = create_frac_to_cart(recip);
|
|
158
|
+
for (const [kpt_idx, kpt] of kpoint_data.entries()) {
|
|
159
|
+
const frac = [kpt[0] ?? 0, kpt[1] ?? 0, kpt[2] ?? 0];
|
|
160
|
+
const cart = frac_to_cart(frac);
|
|
161
|
+
if (prev_cart)
|
|
162
|
+
path_length += euclidean_dist(cart, prev_cart);
|
|
163
|
+
prev_cart = cart;
|
|
164
|
+
distance.push(path_length);
|
|
165
|
+
const label = labels?.[kpt_idx] ?? null;
|
|
166
|
+
qpoints.push({ label, frac_coords: frac });
|
|
167
|
+
if (label)
|
|
168
|
+
labels_dict[label] = frac;
|
|
169
|
+
}
|
|
170
|
+
// One branch per labeled line-mode segment, else a single whole-path branch
|
|
171
|
+
const per_segment = line_mode?.per_segment ?? 0;
|
|
172
|
+
const branches = [];
|
|
173
|
+
if (labels && Number.isInteger(per_segment) && per_segment >= 2) {
|
|
174
|
+
for (let start = 0; start < n_kpoints; start += per_segment) {
|
|
175
|
+
const end = start + per_segment - 1;
|
|
176
|
+
branches.push({
|
|
177
|
+
start_index: start,
|
|
178
|
+
end_index: end,
|
|
179
|
+
name: `${qpoints[start]?.label ?? `?`}-${qpoints[end]?.label ?? `?`}`,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else
|
|
184
|
+
branches.push({ start_index: 0, end_index: n_kpoints - 1, name: `path` });
|
|
185
|
+
const efermi = dos?.efermi;
|
|
186
|
+
return {
|
|
187
|
+
qpoints,
|
|
188
|
+
branches,
|
|
189
|
+
distance,
|
|
190
|
+
bands,
|
|
191
|
+
...(spin_down_bands ? { spin_down_bands } : {}),
|
|
192
|
+
nb_bands: n_bands,
|
|
193
|
+
labels_dict,
|
|
194
|
+
recip_lattice: { matrix: recip },
|
|
195
|
+
is_spin_polarized: spin_down_bands !== undefined,
|
|
196
|
+
...(efermi !== undefined ? { efermi } : {}),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
};
|
|
201
|
+
// Bundle DOS + bands; null when the file carries neither (so callers can keep
|
|
202
|
+
// their "no structure data" error for files with nothing to show).
|
|
203
|
+
export const read_vaspout_electronic = (h5_file) => {
|
|
204
|
+
const dos = read_vaspout_dos(h5_file);
|
|
205
|
+
const bands = read_vaspout_bands(h5_file, dos);
|
|
206
|
+
return dos || bands ? { dos, bands } : null;
|
|
207
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type * as h5wasm from 'h5wasm';
|
|
2
|
+
import type { TrajectoryType } from '../index';
|
|
3
|
+
export declare const is_vaspout_h5_file: (h5_file: h5wasm.File) => boolean;
|
|
4
|
+
export declare function parse_vaspout_h5_file(h5_file: h5wasm.File): TrajectoryType;
|
|
5
|
+
export declare function parse_vaspout_h5(buffer: ArrayBuffer, filename?: string): Promise<TrajectoryType>;
|