matterviz 0.3.2 → 0.3.3
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 -2
- package/dist/FilePicker.svelte +123 -82
- package/dist/Icon.svelte +18 -12
- package/dist/MillerIndexInput.svelte +27 -21
- package/dist/api/optimade.js +6 -6
- package/dist/app.css +216 -207
- package/dist/brillouin/BrillouinZone.svelte +292 -149
- package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
- package/dist/brillouin/BrillouinZoneExportPane.svelte +69 -42
- package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
- package/dist/brillouin/BrillouinZoneScene.svelte +275 -163
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
- package/dist/brillouin/compute.js +11 -6
- package/dist/chempot-diagram/ChemPotDiagram.svelte +162 -27
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +451 -281
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +2148 -1642
- package/dist/chempot-diagram/ChemPotScene3D.svelte +8 -5
- package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
- package/dist/chempot-diagram/async-compute.svelte.js +77 -0
- package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
- package/dist/chempot-diagram/chempot-worker.js +11 -0
- package/dist/chempot-diagram/color.js +1 -2
- package/dist/chempot-diagram/compute.d.ts +10 -0
- package/dist/chempot-diagram/compute.js +250 -88
- package/dist/chempot-diagram/index.d.ts +2 -1
- package/dist/chempot-diagram/index.js +2 -1
- package/dist/chempot-diagram/temperature.js +8 -9
- package/dist/chempot-diagram/types.d.ts +3 -0
- package/dist/chempot-diagram/types.js +1 -0
- package/dist/colors/index.d.ts +1 -1
- package/dist/colors/index.js +5 -3
- package/dist/composition/BarChart.svelte +128 -55
- package/dist/composition/BubbleChart.svelte +102 -49
- package/dist/composition/Composition.svelte +100 -79
- package/dist/composition/Formula.svelte +108 -62
- package/dist/composition/FormulaFilter.svelte +665 -537
- package/dist/composition/PieChart.svelte +183 -108
- package/dist/composition/format.d.ts +5 -0
- package/dist/composition/format.js +20 -3
- package/dist/composition/parse.js +14 -9
- package/dist/convex-hull/ConvexHull.svelte +93 -40
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull2D.svelte +549 -360
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +1296 -827
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +1004 -688
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullControls.svelte +115 -28
- package/dist/convex-hull/ConvexHullControls.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
- package/dist/convex-hull/ConvexHullStats.svelte +425 -328
- package/dist/convex-hull/ConvexHullTooltip.svelte +40 -16
- package/dist/convex-hull/GasPressureControls.svelte +104 -61
- package/dist/convex-hull/StructurePopup.svelte +25 -4
- package/dist/convex-hull/TemperatureSlider.svelte +45 -25
- package/dist/convex-hull/barycentric-coords.js +13 -7
- package/dist/convex-hull/demo-temperature.js +8 -4
- package/dist/convex-hull/gas-thermodynamics.js +17 -12
- package/dist/convex-hull/helpers.d.ts +9 -0
- package/dist/convex-hull/helpers.js +77 -34
- package/dist/convex-hull/thermodynamics.js +61 -56
- package/dist/convex-hull/types.d.ts +9 -14
- package/dist/convex-hull/types.js +0 -17
- package/dist/coordination/CoordinationBarPlot.svelte +227 -154
- package/dist/element/BohrAtom.svelte +55 -12
- package/dist/element/ElementHeading.svelte +7 -2
- package/dist/element/ElementPhoto.svelte +15 -9
- package/dist/element/ElementStats.svelte +10 -4
- package/dist/element/ElementTile.svelte +137 -73
- package/dist/element/Nucleus.svelte +39 -11
- package/dist/feedback/ClickFeedback.svelte +16 -5
- package/dist/feedback/DragOverlay.svelte +10 -2
- package/dist/feedback/Spinner.svelte +4 -2
- package/dist/feedback/StatusMessage.svelte +8 -2
- package/dist/fermi-surface/FermiSlice.svelte +118 -88
- package/dist/fermi-surface/FermiSurface.svelte +328 -187
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
- package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceScene.svelte +535 -342
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
- package/dist/fermi-surface/compute.js +16 -20
- package/dist/fermi-surface/parse.js +24 -14
- package/dist/fermi-surface/symmetry.js +2 -7
- package/dist/fermi-surface/types.d.ts +3 -5
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +1019 -765
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +1 -1
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +76 -22
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +2 -3
- package/dist/icons.js +47 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/io/decompress.js +1 -1
- package/dist/io/export.d.ts +3 -0
- package/dist/io/export.js +129 -143
- package/dist/io/is-binary.js +2 -3
- package/dist/io/url-drop.js +1 -2
- package/dist/isosurface/Isosurface.svelte +202 -148
- package/dist/isosurface/IsosurfaceControls.svelte +46 -28
- package/dist/isosurface/parse.js +34 -29
- package/dist/isosurface/slice.js +5 -10
- package/dist/isosurface/types.d.ts +2 -1
- package/dist/isosurface/types.js +61 -12
- package/dist/labels.js +11 -8
- package/dist/layout/FullscreenToggle.svelte +11 -2
- package/dist/layout/InfoCard.svelte +38 -6
- package/dist/layout/InfoTag.svelte +63 -32
- package/dist/layout/PropertyFilter.svelte +82 -37
- package/dist/layout/SettingsSection.svelte +85 -55
- package/dist/layout/SubpageGrid.svelte +10 -2
- package/dist/layout/json-tree/JsonNode.svelte +183 -138
- package/dist/layout/json-tree/JsonTree.svelte +499 -413
- package/dist/layout/json-tree/JsonValue.svelte +127 -99
- package/dist/layout/json-tree/utils.js +4 -2
- package/dist/marching-cubes.js +25 -2
- package/dist/math.d.ts +13 -17
- package/dist/math.js +133 -67
- package/dist/overlays/ContextMenu.svelte +65 -40
- package/dist/overlays/DraggablePane.svelte +211 -139
- package/dist/periodic-table/PeriodicTable.svelte +278 -145
- package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
- package/dist/periodic-table/PropertySelect.svelte +25 -7
- package/dist/periodic-table/TableInset.svelte +8 -3
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +446 -309
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramControls.svelte +102 -43
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +63 -40
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +71 -28
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +158 -101
- package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
- package/dist/phase-diagram/build-diagram.js +9 -9
- package/dist/phase-diagram/colors.js +1 -3
- package/dist/phase-diagram/parse.js +10 -9
- package/dist/phase-diagram/svg-to-diagram.js +53 -49
- package/dist/phase-diagram/utils.d.ts +1 -0
- package/dist/phase-diagram/utils.js +80 -25
- package/dist/plot/AxisLabel.svelte +28 -3
- package/dist/plot/BarPlot.svelte +1182 -734
- package/dist/plot/BarPlot.svelte.d.ts +2 -2
- package/dist/plot/BarPlotControls.svelte +31 -5
- package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
- package/dist/plot/ColorBar.svelte +479 -329
- package/dist/plot/ColorScaleSelect.svelte +27 -6
- package/dist/plot/ElementScatter.svelte +36 -15
- package/dist/plot/FillArea.svelte +152 -95
- package/dist/plot/Histogram.svelte +934 -571
- package/dist/plot/Histogram.svelte.d.ts +1 -1
- package/dist/plot/HistogramControls.svelte +53 -9
- package/dist/plot/HistogramControls.svelte.d.ts +1 -1
- package/dist/plot/InteractiveAxisLabel.svelte +34 -11
- package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
- package/dist/plot/Line.svelte +63 -28
- package/dist/plot/PlotControls.svelte +157 -114
- package/dist/plot/PlotControls.svelte.d.ts +1 -1
- package/dist/plot/PlotLegend.svelte +174 -91
- package/dist/plot/PlotTooltip.svelte +45 -6
- package/dist/plot/PortalSelect.svelte +175 -147
- package/dist/plot/ReferenceLine.svelte +76 -22
- package/dist/plot/ReferenceLine3D.svelte +132 -107
- package/dist/plot/ReferencePlane.svelte +146 -121
- package/dist/plot/ScatterPlot.svelte +1681 -1091
- package/dist/plot/ScatterPlot.svelte.d.ts +2 -2
- package/dist/plot/ScatterPlot3D.svelte +256 -131
- package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
- package/dist/plot/ScatterPlot3DControls.svelte +113 -63
- package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
- package/dist/plot/ScatterPlot3DScene.svelte +608 -403
- package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
- package/dist/plot/ScatterPlotControls.svelte +65 -25
- package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
- package/dist/plot/ScatterPoint.svelte +98 -26
- package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
- package/dist/plot/SpacegroupBarPlot.svelte +142 -85
- package/dist/plot/Surface3D.svelte +159 -108
- package/dist/plot/ZeroLines.svelte +55 -3
- package/dist/plot/ZoomRect.svelte +4 -2
- package/dist/plot/axis-utils.js +1 -3
- package/dist/plot/data-cleaning.js +12 -28
- package/dist/plot/data-transform.js +2 -1
- package/dist/plot/fill-utils.js +2 -0
- package/dist/plot/layout.d.ts +4 -1
- package/dist/plot/layout.js +33 -14
- package/dist/plot/reference-line.d.ts +2 -2
- package/dist/plot/reference-line.js +7 -5
- package/dist/plot/scales.js +24 -36
- package/dist/plot/types.d.ts +11 -23
- package/dist/plot/types.js +6 -11
- package/dist/plot/utils/label-placement.d.ts +32 -15
- package/dist/plot/utils/label-placement.js +227 -66
- package/dist/plot/utils/series-visibility.js +2 -3
- package/dist/rdf/RdfPlot.svelte +143 -91
- package/dist/rdf/calc-rdf.js +4 -5
- package/dist/sanitize.d.ts +4 -0
- package/dist/sanitize.js +107 -0
- package/dist/settings.d.ts +18 -6
- package/dist/settings.js +46 -16
- package/dist/spectral/Bands.svelte +632 -453
- package/dist/spectral/BandsAndDos.svelte +90 -49
- package/dist/spectral/BrillouinBandsDos.svelte +151 -93
- package/dist/spectral/Dos.svelte +389 -258
- package/dist/spectral/helpers.js +55 -43
- package/dist/state.svelte.d.ts +1 -1
- package/dist/state.svelte.js +3 -2
- package/dist/structure/Arrow.svelte +59 -20
- package/dist/structure/AtomLegend.svelte +215 -134
- package/dist/structure/Bond.svelte +73 -47
- package/dist/structure/CanvasTooltip.svelte +10 -2
- package/dist/structure/CellSelect.svelte +72 -45
- package/dist/structure/Cylinder.svelte +33 -17
- package/dist/structure/Lattice.svelte +88 -33
- package/dist/structure/Structure.svelte +1063 -797
- package/dist/structure/Structure.svelte.d.ts +1 -1
- package/dist/structure/StructureControls.svelte +349 -118
- package/dist/structure/StructureExportPane.svelte +124 -89
- package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
- package/dist/structure/StructureInfoPane.svelte +304 -237
- package/dist/structure/StructureScene.svelte +879 -443
- package/dist/structure/StructureScene.svelte.d.ts +15 -7
- package/dist/structure/atom-properties.js +8 -8
- package/dist/structure/bonding.js +6 -7
- package/dist/structure/export.js +14 -29
- package/dist/structure/ferrox-wasm.js +1 -1
- package/dist/structure/index.d.ts +13 -3
- package/dist/structure/index.js +83 -23
- package/dist/structure/measure.d.ts +2 -2
- package/dist/structure/measure.js +4 -44
- package/dist/structure/parse.js +113 -141
- package/dist/structure/partial-occupancy.js +7 -10
- package/dist/structure/pbc.d.ts +1 -0
- package/dist/structure/pbc.js +16 -6
- package/dist/structure/supercell.d.ts +2 -2
- package/dist/structure/supercell.js +12 -22
- package/dist/structure/validation.js +1 -2
- package/dist/symmetry/SymmetryStats.svelte +84 -41
- package/dist/symmetry/WyckoffTable.svelte +26 -6
- package/dist/symmetry/cell-transform.js +5 -3
- package/dist/symmetry/index.js +8 -7
- package/dist/symmetry/spacegroups.js +148 -148
- package/dist/table/HeatmapTable.svelte +790 -554
- package/dist/table/HeatmapTable.svelte.d.ts +1 -1
- package/dist/table/ToggleMenu.svelte +125 -92
- package/dist/table/index.js +2 -4
- package/dist/theme/ThemeControl.svelte +21 -12
- package/dist/time.js +4 -1
- package/dist/tooltip/TooltipContent.svelte +33 -8
- package/dist/trajectory/Trajectory.svelte +758 -558
- package/dist/trajectory/TrajectoryError.svelte +14 -3
- package/dist/trajectory/TrajectoryExportPane.svelte +137 -83
- package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
- package/dist/trajectory/extract.js +10 -26
- package/dist/trajectory/format-detect.js +5 -5
- package/dist/trajectory/frame-reader.d.ts +1 -1
- package/dist/trajectory/frame-reader.js +5 -12
- package/dist/trajectory/helpers.d.ts +0 -1
- package/dist/trajectory/helpers.js +2 -17
- package/dist/trajectory/index.js +14 -12
- package/dist/trajectory/parse/ase.js +5 -4
- package/dist/trajectory/parse/hdf5.js +26 -18
- package/dist/trajectory/parse/index.js +13 -18
- package/dist/trajectory/parse/lammps.js +17 -7
- package/dist/trajectory/parse/vasp.js +5 -2
- package/dist/trajectory/parse/xyz.js +8 -7
- package/dist/trajectory/plotting.js +13 -8
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +13 -0
- package/dist/xrd/XrdPlot.svelte +337 -247
- package/dist/xrd/broadening.js +14 -9
- package/dist/xrd/calc-xrd.js +12 -18
- package/dist/xrd/parse.d.ts +1 -1
- package/dist/xrd/parse.js +17 -17
- package/package.json +99 -103
- package/readme.md +1 -1
- /package/dist/theme/{themes.js → themes.mjs} +0 -0
|
@@ -1,175 +1,304 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { InfoItem } from '../layout'
|
|
3
|
+
import Icon from '../Icon.svelte'
|
|
4
|
+
import { format_num } from '../labels'
|
|
5
|
+
import { sanitize_html } from '../sanitize'
|
|
6
|
+
import DraggablePane from '../overlays/DraggablePane.svelte'
|
|
7
|
+
import { get_electro_neg_formula } from '../composition'
|
|
8
|
+
import { SETTINGS_CONFIG } from '../settings'
|
|
9
|
+
import { type AnyStructure } from '../structure'
|
|
10
|
+
import type { ComponentProps } from 'svelte'
|
|
11
|
+
import { tooltip as create_tooltip } from 'svelte-multiselect/attachments'
|
|
12
|
+
import { SvelteSet } from 'svelte/reactivity'
|
|
13
|
+
import type { TrajectoryType } from './index'
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
trajectory,
|
|
17
|
+
current_step_idx,
|
|
18
|
+
current_filename,
|
|
19
|
+
current_file_path,
|
|
20
|
+
file_size,
|
|
21
|
+
file_object,
|
|
22
|
+
pane_open = $bindable(false),
|
|
23
|
+
toggle_props,
|
|
24
|
+
pane_props,
|
|
25
|
+
...rest
|
|
26
|
+
}: Omit<ComponentProps<typeof DraggablePane>, `children`> & {
|
|
27
|
+
trajectory: TrajectoryType
|
|
28
|
+
current_step_idx: number
|
|
29
|
+
current_filename?: string | null
|
|
30
|
+
current_file_path?: string | null
|
|
31
|
+
file_size?: number | null
|
|
32
|
+
file_object?: File | null
|
|
33
|
+
pane_open?: boolean
|
|
34
|
+
toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
|
|
35
|
+
pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`]
|
|
36
|
+
} = $props()
|
|
37
|
+
|
|
38
|
+
let copied_items = new SvelteSet<string>()
|
|
39
|
+
|
|
40
|
+
async function copy_item(label: string, value: string | number, key: string) {
|
|
12
41
|
try {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
42
|
+
await navigator.clipboard.writeText(`${label}: ${value}`)
|
|
43
|
+
copied_items.add(key)
|
|
44
|
+
setTimeout(() => {
|
|
45
|
+
copied_items.delete(key)
|
|
46
|
+
}, 1000)
|
|
47
|
+
} catch (error) {
|
|
48
|
+
console.error(`Failed to copy to clipboard:`, error)
|
|
18
49
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const is_valid_number = (val)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Helper functions
|
|
53
|
+
const format_size = (bytes: number) =>
|
|
54
|
+
bytes > 1024 * 1024
|
|
55
|
+
? `${format_num(bytes / (1024 * 1024), `.2~f`)} MB`
|
|
56
|
+
: `${format_num(bytes / 1024, `.2~f`)} KB`
|
|
57
|
+
|
|
58
|
+
const is_valid_number = (val: unknown): val is number =>
|
|
59
|
+
typeof val === `number` && isFinite(val)
|
|
60
|
+
|
|
61
|
+
const extract_numeric_array = (frames: typeof trajectory.frames, prop: string) =>
|
|
62
|
+
frames.map((frame) => frame.metadata?.[prop]).filter(is_valid_number)
|
|
63
|
+
|
|
64
|
+
const format_range = (values: number[], unit = ``, decimals = `.2~f`) => {
|
|
65
|
+
if (!values.length) return null
|
|
32
66
|
if (values.length === 1) {
|
|
33
|
-
|
|
67
|
+
return `${format_num(values[0], decimals)} ${unit}`.trim()
|
|
34
68
|
}
|
|
35
|
-
const [min, max] = [Math.min(...values), Math.max(...values)]
|
|
69
|
+
const [min, max] = [Math.min(...values), Math.max(...values)]
|
|
36
70
|
return `${format_num(min, decimals)} - ${format_num(max, decimals)} ${unit}`
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
71
|
+
.trim()
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const safe_item = (
|
|
75
|
+
label: string,
|
|
76
|
+
value: string | null,
|
|
77
|
+
key?: string,
|
|
78
|
+
tooltip?: string,
|
|
79
|
+
): InfoItem | null => value ? { label, value, key, tooltip } : null
|
|
80
|
+
|
|
81
|
+
const is_info_item = (item: unknown): item is InfoItem => Boolean(item)
|
|
82
|
+
|
|
83
|
+
const safe_formula = (structure: AnyStructure) => {
|
|
42
84
|
try {
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return null;
|
|
85
|
+
return get_electro_neg_formula(structure)
|
|
86
|
+
} catch {
|
|
87
|
+
return null
|
|
47
88
|
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Get trajectory info organized by sections
|
|
92
|
+
let info_pane_data = $derived.by(() => {
|
|
93
|
+
if (
|
|
94
|
+
(!trajectory?.frames?.length && !trajectory?.total_frames) ||
|
|
95
|
+
current_step_idx < 0 ||
|
|
96
|
+
current_step_idx >= (trajectory.total_frames ?? trajectory.frames?.length ?? 0)
|
|
97
|
+
) return []
|
|
98
|
+
|
|
55
99
|
// For indexed trajectories, we might not have the current frame loaded
|
|
56
|
-
const current_frame = trajectory.frames?.[current_step_idx]
|
|
57
|
-
const total_frames = trajectory.total_frames ?? trajectory.frames?.length ?? 0
|
|
58
|
-
|
|
100
|
+
const current_frame = trajectory.frames?.[current_step_idx]
|
|
101
|
+
const total_frames = trajectory.total_frames ?? trajectory.frames?.length ?? 0
|
|
102
|
+
|
|
103
|
+
const sections: { title: string; items: InfoItem[] }[] = []
|
|
104
|
+
|
|
59
105
|
// File info section
|
|
60
106
|
const file_items = [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
107
|
+
current_filename &&
|
|
108
|
+
safe_item(
|
|
109
|
+
`Name`,
|
|
110
|
+
current_filename,
|
|
111
|
+
`file-name`,
|
|
112
|
+
current_file_path || undefined,
|
|
113
|
+
),
|
|
114
|
+
file_size && file_size > 0 &&
|
|
115
|
+
safe_item(`File Size`, format_size(file_size), `file-size`),
|
|
116
|
+
file_object?.lastModified &&
|
|
117
|
+
safe_item(
|
|
118
|
+
`Modified`,
|
|
119
|
+
new Date(file_object.lastModified).toLocaleString(),
|
|
120
|
+
`file-modified`,
|
|
121
|
+
),
|
|
122
|
+
trajectory.metadata?.source_format &&
|
|
123
|
+
safe_item(`Format`, String(trajectory.metadata.source_format), `file-format`),
|
|
124
|
+
].filter(is_info_item)
|
|
125
|
+
|
|
70
126
|
if (file_items.length > 0) {
|
|
71
|
-
|
|
127
|
+
sections.push({ title: `File`, items: file_items })
|
|
72
128
|
}
|
|
129
|
+
|
|
73
130
|
// Trajectory info section (always show this)
|
|
74
131
|
const traj_items = [
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
132
|
+
safe_item(
|
|
133
|
+
`Total Frames`,
|
|
134
|
+
`${format_num(total_frames, `.3~s`)} (current: ${
|
|
135
|
+
format_num(current_step_idx + 1, `.3~s`)
|
|
136
|
+
})`,
|
|
137
|
+
`total-frames`,
|
|
138
|
+
),
|
|
139
|
+
trajectory.is_indexed &&
|
|
140
|
+
safe_item(
|
|
141
|
+
`Indexed`,
|
|
142
|
+
`Yes`,
|
|
143
|
+
`indexed-mode`,
|
|
144
|
+
SETTINGS_CONFIG.trajectory.use_indexing.description,
|
|
145
|
+
),
|
|
146
|
+
trajectory.indexed_frames &&
|
|
147
|
+
safe_item(
|
|
148
|
+
`Index Points`,
|
|
149
|
+
`${trajectory.indexed_frames.length}`,
|
|
150
|
+
`index-points`,
|
|
151
|
+
`Number of frames indexed for fast seeking`,
|
|
152
|
+
),
|
|
153
|
+
trajectory.plot_metadata &&
|
|
154
|
+
safe_item(
|
|
155
|
+
`Plot Metadata`,
|
|
156
|
+
`${trajectory.plot_metadata.length} frames`,
|
|
157
|
+
`plot-metadata`,
|
|
158
|
+
`Pre-extracted metadata for plotting`,
|
|
159
|
+
),
|
|
160
|
+
].filter(is_info_item)
|
|
161
|
+
|
|
83
162
|
if (traj_items.length > 0) {
|
|
84
|
-
|
|
163
|
+
sections.push({ title: `Trajectory`, items: traj_items })
|
|
85
164
|
}
|
|
165
|
+
|
|
86
166
|
// Structure info section (only if we have the current frame)
|
|
87
167
|
if (current_frame?.structure?.sites) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
].
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
168
|
+
const { structure } = current_frame
|
|
169
|
+
const lattice = `lattice` in structure ? structure.lattice : null
|
|
170
|
+
const { volume, a, b, c, alpha, beta, gamma } = lattice || {}
|
|
171
|
+
const formula = safe_formula(structure)
|
|
172
|
+
|
|
173
|
+
const structure_items = [
|
|
174
|
+
safe_item(`Atoms`, `${structure.sites.length}`, `atoms`),
|
|
175
|
+
formula && safe_item(`Formula`, String(formula), `formula`),
|
|
176
|
+
is_valid_number(volume) && volume > 0 &&
|
|
177
|
+
safe_item(`Volume`, `${format_num(volume, `.3~s`)} ų`, `volume`),
|
|
178
|
+
is_valid_number(volume) && volume > 0 && structure.sites.length > 0 &&
|
|
179
|
+
safe_item(
|
|
180
|
+
`Density`,
|
|
181
|
+
`${format_num(structure.sites.length / volume, `.4~s`)} atoms/ų`,
|
|
182
|
+
`density`,
|
|
183
|
+
),
|
|
184
|
+
[a, b, c].every(is_valid_number) &&
|
|
185
|
+
safe_item(
|
|
186
|
+
`Cell Lengths`,
|
|
187
|
+
`${format_num(a as number, `.3~f`)}, ${format_num(b as number, `.3~f`)}, ${
|
|
188
|
+
format_num(c as number, `.3~f`)
|
|
189
|
+
} Å`,
|
|
190
|
+
`cell-lengths`,
|
|
191
|
+
),
|
|
192
|
+
[alpha, beta, gamma].every(is_valid_number) &&
|
|
193
|
+
safe_item(
|
|
194
|
+
`Cell Angles`,
|
|
195
|
+
`${format_num(alpha as number, `.2~f`)}°, ${
|
|
196
|
+
format_num(beta as number, `.2~f`)
|
|
197
|
+
}°, ${format_num(gamma as number, `.2~f`)}°`,
|
|
198
|
+
`cell-angles`,
|
|
199
|
+
),
|
|
200
|
+
].filter(is_info_item)
|
|
201
|
+
|
|
202
|
+
if (structure_items.length > 0) {
|
|
203
|
+
sections.push({ title: `Structure`, items: structure_items })
|
|
204
|
+
}
|
|
205
|
+
} else if (trajectory.is_indexed) {
|
|
206
|
+
// For indexed trajectories, show a note that frame data is loaded on demand
|
|
207
|
+
const structure_items = [
|
|
208
|
+
safe_item(
|
|
209
|
+
`Frame Loading`,
|
|
210
|
+
`On-demand`,
|
|
211
|
+
`frame-loading`,
|
|
212
|
+
`Structure data loaded when frame is accessed`,
|
|
213
|
+
),
|
|
214
|
+
].filter(is_info_item)
|
|
215
|
+
|
|
216
|
+
if (structure_items.length > 0) {
|
|
217
|
+
sections.push({ title: `Structure`, items: structure_items })
|
|
218
|
+
}
|
|
116
219
|
}
|
|
220
|
+
|
|
117
221
|
// Energy section (only for regular trajectories with multiple frames)
|
|
118
222
|
if (!trajectory.is_indexed && trajectory.frames.length > 1) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
223
|
+
const energies = extract_numeric_array(trajectory.frames, `energy`)
|
|
224
|
+
if (energies.length > 1) {
|
|
225
|
+
const current_energy = current_frame?.metadata?.energy
|
|
226
|
+
const energy_range = format_range(energies, `eV`, `.3~s`)
|
|
227
|
+
|
|
228
|
+
const energy_items = [
|
|
229
|
+
is_valid_number(current_energy) &&
|
|
230
|
+
safe_item(
|
|
231
|
+
`Current Energy`,
|
|
232
|
+
`${format_num(current_energy, `.3~s`)} eV`,
|
|
233
|
+
`energy-current`,
|
|
234
|
+
),
|
|
235
|
+
energy_range && safe_item(`Energy Range`, energy_range, `energy-range`),
|
|
236
|
+
].filter(is_info_item)
|
|
237
|
+
|
|
238
|
+
if (energy_items.length > 0) {
|
|
239
|
+
sections.push({ title: `Energy`, items: energy_items })
|
|
131
240
|
}
|
|
241
|
+
}
|
|
132
242
|
}
|
|
243
|
+
|
|
133
244
|
// Forces section (only for regular trajectories with multiple frames)
|
|
134
245
|
if (!trajectory.is_indexed && trajectory.frames.length > 1) {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
246
|
+
const forces = extract_numeric_array(trajectory.frames, `force_max`)
|
|
247
|
+
if (forces.length > 1) {
|
|
248
|
+
const current_force = current_frame?.metadata?.force_max
|
|
249
|
+
const force_range = format_range(forces, `eV/Å`, `.3~s`)
|
|
250
|
+
|
|
251
|
+
const force_items = [
|
|
252
|
+
is_valid_number(current_force) &&
|
|
253
|
+
safe_item(
|
|
254
|
+
`Max Force`,
|
|
255
|
+
`${format_num(current_force, `.3~s`)} eV/Å`,
|
|
256
|
+
`force-current`,
|
|
257
|
+
),
|
|
258
|
+
force_range && safe_item(`Force Range`, force_range, `force-range`),
|
|
259
|
+
].filter(is_info_item)
|
|
260
|
+
|
|
261
|
+
if (force_items.length > 0) {
|
|
262
|
+
sections.push({ title: `Forces`, items: force_items })
|
|
147
263
|
}
|
|
264
|
+
}
|
|
148
265
|
}
|
|
266
|
+
|
|
149
267
|
// Volume change section (only for regular trajectories)
|
|
150
|
-
if (
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
268
|
+
if (
|
|
269
|
+
!trajectory.is_indexed && current_frame?.structure &&
|
|
270
|
+
trajectory.frames.length > 1
|
|
271
|
+
) {
|
|
272
|
+
const lattice = `lattice` in current_frame.structure
|
|
273
|
+
? current_frame.structure.lattice
|
|
274
|
+
: null
|
|
275
|
+
if (lattice) {
|
|
276
|
+
const volumes = trajectory.frames.map((
|
|
277
|
+
{ structure },
|
|
278
|
+
) => (`lattice` in structure && structure.lattice?.volume))
|
|
279
|
+
.filter(is_valid_number)
|
|
280
|
+
.filter((v) => v > 0)
|
|
281
|
+
|
|
282
|
+
if (volumes.length > 1) {
|
|
283
|
+
const vol_change = (Math.max(...volumes) - Math.min(...volumes)) /
|
|
284
|
+
Math.min(...volumes)
|
|
285
|
+
if (Math.abs(vol_change) > 0.1 && is_valid_number(vol_change)) {
|
|
286
|
+
const vol_items = [safe_item(
|
|
287
|
+
`Volume Change`,
|
|
288
|
+
`${format_num(vol_change, `.2~%`)}`,
|
|
289
|
+
`vol-change`,
|
|
290
|
+
)].filter(is_info_item)
|
|
291
|
+
|
|
292
|
+
if (vol_items.length > 0) {
|
|
293
|
+
sections.push({ title: `Volume`, items: vol_items })
|
|
168
294
|
}
|
|
295
|
+
}
|
|
169
296
|
}
|
|
297
|
+
}
|
|
170
298
|
}
|
|
171
|
-
|
|
172
|
-
|
|
299
|
+
|
|
300
|
+
return sections
|
|
301
|
+
})
|
|
173
302
|
</script>
|
|
174
303
|
|
|
175
304
|
<DraggablePane
|
|
@@ -207,8 +336,8 @@ let info_pane_data = $derived.by(() => {
|
|
|
207
336
|
}
|
|
208
337
|
}}
|
|
209
338
|
>
|
|
210
|
-
<span>{@html label}</span>
|
|
211
|
-
<span title={tooltip} {@attach create_tooltip()}>{@html value}</span>
|
|
339
|
+
<span>{@html sanitize_html(label)}</span>
|
|
340
|
+
<span title={tooltip} {@attach create_tooltip()}>{@html sanitize_html(value)}</span>
|
|
212
341
|
{#if copied_items.has(key ?? label)}
|
|
213
342
|
<Icon
|
|
214
343
|
icon="Check"
|
|
@@ -15,8 +15,7 @@ export const energy_data_extractor = (frame, _trajectory) => {
|
|
|
15
15
|
`total_energy`,
|
|
16
16
|
];
|
|
17
17
|
for (const field of energy_fields) {
|
|
18
|
-
if (field in frame.metadata &&
|
|
19
|
-
typeof frame.metadata[field] === `number`) {
|
|
18
|
+
if (field in frame.metadata && typeof frame.metadata[field] === `number`) {
|
|
20
19
|
data[field] = frame.metadata[field];
|
|
21
20
|
}
|
|
22
21
|
}
|
|
@@ -36,36 +35,26 @@ export const force_stress_data_extractor = (frame, _trajectory) => {
|
|
|
36
35
|
const force_magnitudes = forces.map((force) => Math.hypot(...force));
|
|
37
36
|
data.force_max = Math.max(...force_magnitudes);
|
|
38
37
|
// Calculate RMS (root mean square) of force magnitudes
|
|
39
|
-
data.force_norm = Math.sqrt(force_magnitudes.reduce((sum, f) => sum + f ** 2, 0) /
|
|
40
|
-
force_magnitudes.length);
|
|
38
|
+
data.force_norm = Math.sqrt(force_magnitudes.reduce((sum, f) => sum + f ** 2, 0) / force_magnitudes.length);
|
|
41
39
|
}
|
|
42
40
|
}
|
|
43
41
|
else {
|
|
44
42
|
// Fallback to metadata values if forces array not available
|
|
45
|
-
if (frame.metadata.force_max &&
|
|
46
|
-
typeof frame.metadata.force_max === `number`) {
|
|
43
|
+
if (frame.metadata.force_max && typeof frame.metadata.force_max === `number`) {
|
|
47
44
|
data.force_max = frame.metadata.force_max;
|
|
48
45
|
}
|
|
49
46
|
// Prefer force_norm if available, fall back to force_rms
|
|
50
|
-
if (frame.metadata.force_norm &&
|
|
51
|
-
typeof frame.metadata.force_norm === `number`) {
|
|
47
|
+
if (frame.metadata.force_norm && typeof frame.metadata.force_norm === `number`) {
|
|
52
48
|
data.force_norm = frame.metadata.force_norm;
|
|
53
49
|
}
|
|
54
|
-
else if (frame.metadata.force_rms &&
|
|
55
|
-
typeof frame.metadata.force_rms === `number`) {
|
|
50
|
+
else if (frame.metadata.force_rms && typeof frame.metadata.force_rms === `number`) {
|
|
56
51
|
data.force_norm = frame.metadata.force_rms; // Use force_rms as fallback
|
|
57
52
|
}
|
|
58
53
|
}
|
|
59
54
|
// Extract other stress and pressure properties (no duplicates expected)
|
|
60
|
-
const other_stress_fields = [
|
|
61
|
-
`stress_max`,
|
|
62
|
-
`stress_frobenius`,
|
|
63
|
-
`stress_trace`,
|
|
64
|
-
`pressure`,
|
|
65
|
-
];
|
|
55
|
+
const other_stress_fields = [`stress_max`, `stress_frobenius`, `stress_trace`, `pressure`];
|
|
66
56
|
for (const field of other_stress_fields) {
|
|
67
|
-
if (field in frame.metadata &&
|
|
68
|
-
typeof frame.metadata[field] === `number`) {
|
|
57
|
+
if (field in frame.metadata && typeof frame.metadata[field] === `number`) {
|
|
69
58
|
data[field] = frame.metadata[field];
|
|
70
59
|
}
|
|
71
60
|
}
|
|
@@ -92,8 +81,7 @@ export const structural_data_extractor = (frame, _trajectory) => {
|
|
|
92
81
|
// Extract other structural properties, avoiding volume duplicate
|
|
93
82
|
const structural_fields = [`temperature`];
|
|
94
83
|
for (const field of structural_fields) {
|
|
95
|
-
if (field in frame.metadata &&
|
|
96
|
-
typeof frame.metadata[field] === `number`)
|
|
84
|
+
if (field in frame.metadata && typeof frame.metadata[field] === `number`)
|
|
97
85
|
data[field] = frame.metadata[field];
|
|
98
86
|
}
|
|
99
87
|
// Handle density separately - prefer metadata, but calculate if not available
|
|
@@ -109,9 +97,7 @@ export const structural_data_extractor = (frame, _trajectory) => {
|
|
|
109
97
|
}
|
|
110
98
|
}
|
|
111
99
|
// Only use metadata volume if lattice volume is not available
|
|
112
|
-
if (!data.volume &&
|
|
113
|
-
frame.metadata.volume &&
|
|
114
|
-
typeof frame.metadata.volume === `number`) {
|
|
100
|
+
if (!data.volume && frame.metadata.volume && typeof frame.metadata.volume === `number`) {
|
|
115
101
|
data.volume = frame.metadata.volume;
|
|
116
102
|
}
|
|
117
103
|
// Note: pressure is handled by force_stress_data_extractor to avoid duplication
|
|
@@ -140,9 +126,7 @@ function property_varies(trajectory, property_key, tolerance = 1e-10) {
|
|
|
140
126
|
if (typeof lattice_value === `number`)
|
|
141
127
|
value = lattice_value;
|
|
142
128
|
}
|
|
143
|
-
if (value === undefined &&
|
|
144
|
-
frame.metadata &&
|
|
145
|
-
property_key in frame.metadata) {
|
|
129
|
+
if (value === undefined && frame.metadata && property_key in frame.metadata) {
|
|
146
130
|
const metadata_value = frame.metadata[property_key];
|
|
147
131
|
if (typeof metadata_value === `number`) {
|
|
148
132
|
value = metadata_value;
|
|
@@ -31,10 +31,10 @@ export const FORMAT_PATTERNS = {
|
|
|
31
31
|
if (basename === `xdatcar` || basename.startsWith(`xdatcar`))
|
|
32
32
|
return true;
|
|
33
33
|
const lines = data.trim().split(/\r?\n/);
|
|
34
|
-
return lines.length >= 10 &&
|
|
34
|
+
return (lines.length >= 10 &&
|
|
35
35
|
lines.some((line) => line.includes(`Direct configuration=`)) &&
|
|
36
36
|
!isNaN(parseFloat(lines[1])) &&
|
|
37
|
-
lines.slice(2, 5).every((line) => line.trim().split(/\s+/).length === 3);
|
|
37
|
+
lines.slice(2, 5).every((line) => line.trim().split(/\s+/).length === 3));
|
|
38
38
|
},
|
|
39
39
|
xyz_multi: (data, filename) => {
|
|
40
40
|
const base = filename ? strip_compression_extensions(filename) : ``;
|
|
@@ -44,7 +44,7 @@ export const FORMAT_PATTERNS = {
|
|
|
44
44
|
},
|
|
45
45
|
lammpstrj: (data, filename) => {
|
|
46
46
|
const base = filename ? strip_compression_extensions(filename) : ``;
|
|
47
|
-
if (
|
|
47
|
+
if (!base.endsWith(`.lammpstrj`))
|
|
48
48
|
return false;
|
|
49
49
|
return data.includes(`ITEM: TIMESTEP`) && data.includes(`ITEM: ATOMS`);
|
|
50
50
|
},
|
|
@@ -71,6 +71,6 @@ export function is_trajectory_file(filename, content) {
|
|
|
71
71
|
return TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name);
|
|
72
72
|
}
|
|
73
73
|
// For other extensions, require both keywords and specific extensions
|
|
74
|
-
return TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name) &&
|
|
75
|
-
TRAJ_FALLBACK_EXTENSIONS_REGEX.test(base_name);
|
|
74
|
+
return (TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name) &&
|
|
75
|
+
TRAJ_FALLBACK_EXTENSIONS_REGEX.test(base_name));
|
|
76
76
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FrameIndex, FrameLoader, ParseProgress, TrajectoryFrame, TrajectoryMetadata } from './index';
|
|
2
2
|
export declare class TrajFrameReader implements FrameLoader {
|
|
3
|
-
private format;
|
|
3
|
+
private readonly format;
|
|
4
4
|
private global_numbers?;
|
|
5
5
|
constructor(filename: string);
|
|
6
6
|
get_total_frames(data: string | ArrayBuffer): Promise<number>;
|
|
@@ -9,7 +9,6 @@ export class TrajFrameReader {
|
|
|
9
9
|
const base_filename = strip_compression_extensions(filename);
|
|
10
10
|
this.format = base_filename.endsWith(`.traj`) ? `ase` : `xyz`;
|
|
11
11
|
}
|
|
12
|
-
// deno-lint-ignore require-await
|
|
13
12
|
async get_total_frames(data) {
|
|
14
13
|
if (this.format === `xyz`) {
|
|
15
14
|
if (data instanceof ArrayBuffer)
|
|
@@ -91,7 +90,6 @@ export class TrajFrameReader {
|
|
|
91
90
|
}
|
|
92
91
|
return frame_index;
|
|
93
92
|
}
|
|
94
|
-
// deno-lint-ignore require-await
|
|
95
93
|
async load_frame(data, frame_number) {
|
|
96
94
|
const actual_data_type = data instanceof ArrayBuffer ? `ArrayBuffer` : typeof data;
|
|
97
95
|
if (this.format === `xyz`) {
|
|
@@ -213,7 +211,8 @@ export class TrajFrameReader {
|
|
|
213
211
|
const x_coord = parseFloat(parts[1]);
|
|
214
212
|
const y_coord = parseFloat(parts[2]);
|
|
215
213
|
const z_coord = parseFloat(parts[3]);
|
|
216
|
-
if (!Number.isFinite(x_coord) ||
|
|
214
|
+
if (!Number.isFinite(x_coord) ||
|
|
215
|
+
!Number.isFinite(y_coord) ||
|
|
217
216
|
!Number.isFinite(z_coord)) {
|
|
218
217
|
console.warn(`Skipping XYZ atom with invalid coordinates in indexed frame ${frame_number} at line ${line_idx + 2 + idx}`);
|
|
219
218
|
continue;
|
|
@@ -245,8 +244,7 @@ export class TrajFrameReader {
|
|
|
245
244
|
const positions = positions_ref?.ndarray
|
|
246
245
|
? read_ndarray_from_view(view, positions_ref)
|
|
247
246
|
: positions_ref;
|
|
248
|
-
const numbers_ref = frame_data[`numbers.`] || frame_data.numbers ||
|
|
249
|
-
this.global_numbers;
|
|
247
|
+
const numbers_ref = frame_data[`numbers.`] || frame_data.numbers || this.global_numbers;
|
|
250
248
|
const numbers = numbers_ref?.ndarray
|
|
251
249
|
? read_ndarray_from_view(view, numbers_ref).flat()
|
|
252
250
|
: numbers_ref;
|
|
@@ -288,7 +286,7 @@ export class TrajFrameReader {
|
|
|
288
286
|
if (match)
|
|
289
287
|
properties[key] = parseFloat(match[1]);
|
|
290
288
|
});
|
|
291
|
-
const step_match =
|
|
289
|
+
const step_match = /(?:step|frame)\s*[=:]?\s*(\d+)/i.exec(comment);
|
|
292
290
|
const step = step_match ? parseInt(step_match[1]) : frame_number;
|
|
293
291
|
return { frame_number, step, properties };
|
|
294
292
|
}
|
|
@@ -297,12 +295,7 @@ export class TrajFrameReader {
|
|
|
297
295
|
const step = frame_number;
|
|
298
296
|
if (frame_data.calculator && typeof frame_data.calculator === `object`) {
|
|
299
297
|
const calculator = frame_data.calculator;
|
|
300
|
-
const calc_properties = [
|
|
301
|
-
`energy`,
|
|
302
|
-
`potential_energy`,
|
|
303
|
-
`kinetic_energy`,
|
|
304
|
-
`total_energy`,
|
|
305
|
-
];
|
|
298
|
+
const calc_properties = [`energy`, `potential_energy`, `kinetic_energy`, `total_energy`];
|
|
306
299
|
for (const prop of calc_properties) {
|
|
307
300
|
if (prop in calculator && typeof calculator[prop] === `number`) {
|
|
308
301
|
properties[prop] = calculator[prop];
|
|
@@ -6,7 +6,6 @@ export declare function is_valid_element_symbol(symbol: string): symbol is Eleme
|
|
|
6
6
|
export declare function coerce_element_symbol(symbol: string): ElementSymbol | undefined;
|
|
7
7
|
export declare function validate_3x3_matrix(data: unknown): math.Matrix3x3;
|
|
8
8
|
export declare const convert_atomic_numbers: (numbers: number[]) => ElementSymbol[];
|
|
9
|
-
export declare const get_inverse_matrix: (matrix: math.Matrix3x3) => math.Matrix3x3;
|
|
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: {
|