Outputs¶
EXESS produces JSON outputs for all calculations, and optional HDF5 outputs when exports are requested. In the Rush Python client, outputs are returned as object store paths; use save_*_outputs helpers to download them locally.
Rush output objects¶
Rush returns outputs as objects with a path, size, and format:
{
"path": "UUID_OBJECT_STORE_PATH",
"size": 0,
"format": "json"
}
For EXESS energy calculations, the first output is the JSON result. If any exports are requested, a second output is an HDF5 file containing the exported data.
In the rush-py tutorial, the size field is currently informational only (often 0) but is intended to carry the output size in bytes in future revisions.
In rush-py, exess.save_energy_outputs downloads these objects to the local workspace. For export-heavy runs, the second output is stored as a compressed archive in the object store; the helper decompresses it and extracts the HDF5 file automatically. Pass to_json=True to convert the exported HDF5 data into JSON for easier inspection when the data volume is small (for example, descriptor grids).
save_energy_outputs returns either a single JSON path (no exports) or a tuple of (json_path, hdf5_path) when exports are present. With to_json=True, the second path points to a JSON file instead of HDF5.
The helper uses the object store path as the filename and applies a .hdf5 or .json extension as appropriate.
Tools such as h5py, h5glance, h5ls, and h5dump are useful for exploring the HDF5 exports directly.
JSON output structure¶
High-level structure:
Output
|-- schema_version
|-- calculation_time
|-- qmmbe
|-- trajectory
`-- trajectory_qmmbes
QMMBE
|-- schema_version
|-- num_iters
|-- method
|-- distance_metric
|-- distance_method
|-- nmers
|-- reference_fragment
|-- expanded_hf_energy
|-- classical_water_energy
|-- expanded_mp2_ss_correction
|-- expanded_mp2_os_correction
|-- expanded_ccsd_correction
|-- expanded_density
|-- expanded_hf_gradients
`-- expanded_mp2_gradients
Nmer
|-- schema_version
|-- fragments
|-- density
|-- fock
|-- overlap
|-- h_core
|-- coeffs_initial
|-- coeffs_final
|-- molecular_orbital_energies
|-- hf_gradients
|-- mp2_gradients
|-- hf_energy
|-- mp2_ss_correction
|-- mp2_os_correction
|-- delta_hf_energy
|-- delta_mp2_ss_correction
|-- delta_mp2_os_correction
|-- s_squared_eigenvalue
|-- mulliken_charges
|-- chelpg_charges
|-- fragment_distance
|-- bond_orders
|-- h_caps
|-- num_iters
`-- num_basis_fns
Trajectory
`-- frames
Frame
|-- parent
|-- step
|-- simulation_time
|-- time_delta
|-- kinetic_energy
|-- estimated_temperature
|-- positions
|-- velocities
|-- forces
`-- changeset
Changeset
|-- sub
`-- add
For batched inputs (topologies length > 1), EXESS returns one Output object per topology.
Output¶
Name |
Type |
Brief |
|---|---|---|
|
string |
Output schema version. |
|
double |
Total calculation time (seconds). |
|
optional QMMBE |
QM output for a single topology. Not present for |
|
optional Trajectory |
Present for |
|
optional array of QMMBE |
QM outputs for each frame in a trajectory. |
QMMBE¶
Name |
Type |
Brief |
|---|---|---|
|
string |
QMMBE schema version. |
|
string |
Level of theory. |
|
optional string |
Distance metric (if fragmented). |
|
optional string |
Distance method (centroid vs closest-pair). |
|
array of array of Nmer |
|
|
optional int |
Reference fragment for interaction energy. |
|
optional double |
Total HF or interaction energy. |
|
optional double |
Energy contribution from classical waters (if present). |
|
optional double |
MP2 same-spin correction (total or interaction). |
|
optional double |
MP2 opposite-spin correction (total or interaction). |
|
optional double |
CCSD correction (total or interaction). |
|
optional Tensor64 |
Full-system density matrix (square or packed). |
|
optional array of double |
Full-system HF gradients, ordered by topology atom order. |
|
optional array of double |
Full-system MP2 gradients, ordered by topology atom order. |
|
int |
Total SCF iterations. |
If reference_fragment is present, the expanded energies should be interpreted as interaction energies for that fragment. In that mode, expanded_density and gradients are omitted. If expanded_hf_gradients is present, expanded_mp2_gradients is absent (and vice versa).
Nmer¶
Name |
Type |
Brief |
|---|---|---|
|
string |
N-mer schema version. |
|
array[int] |
Fragment IDs in this n-mer. |
|
optional Tensor64 |
Density matrix for the n-mer (square or packed). |
|
optional Tensor64 |
Fock matrix (square or packed). |
|
optional Tensor64 |
Overlap matrix (square or packed). |
|
optional Tensor64 |
Core Hamiltonian (square or packed). |
|
optional Tensor64 |
Initial coefficient matrix. |
|
optional Tensor64 |
Final coefficient matrix. |
|
optional array[double] |
MO energies; one entry per basis function. |
|
optional array[double] |
HF gradients, ordered by fragment then atom. |
|
optional array[double] |
MP2 gradients, ordered by fragment then atom. |
|
optional double |
HF energy for the n-mer. |
|
optional double |
MP2 same-spin correction. |
|
optional double |
MP2 opposite-spin correction. |
|
optional double |
CCSD correction. |
|
optional double |
HF delta energy (e.g., dimer interaction). |
|
optional double |
MP2 same-spin delta correction. |
|
optional double |
MP2 opposite-spin delta correction. |
|
optional double |
Spin contamination metric for unrestricted calculations. |
|
optional array[double] |
Mulliken charges. |
|
optional array[double] |
CHELPG charges. |
|
optional double |
Dimer distance (only for dimers). |
|
optional array[array[double]] |
Bond order adjacency matrix. |
|
optional array[int] |
Indices of hydrogen caps in this fragment (local to the fragment). |
|
int |
SCF iterations to converge. |
|
int |
Number of basis functions. |
N-mer gradients are ordered by fragment, then by atom order within each fragment. If hf_gradients is present then mp2_gradients is absent (and vice versa). Hydrogen cap indices are local to the fragment, not to the full-system atom ordering, and are present whenever matrices such as density or fock are exported.
Trajectory¶
Name |
Type |
Brief |
|---|---|---|
|
array[Frame] |
Frame tree for the trajectory. |
Frames are stored as a tree of divergent paths; frames with smaller step values appear before larger steps.
Frame¶
Name |
Type |
Brief |
|---|---|---|
|
optional int |
Parent frame index. |
|
int |
Logical step in simulation. |
|
double |
Physical simulation time. |
|
double |
Time since previous frame. |
|
double |
Total kinetic energy. |
|
double |
Estimated instantaneous temperature. |
|
optional array[double] |
Atom positions after changeset. |
|
optional array[double] |
Atom velocities after changeset. |
|
optional array[double] |
Atom forces after changeset. |
|
optional Changeset |
Changes applied to prior frame. |
Positions/velocities/forces are stored after applying each frame’s changeset.
Changeset¶
Name |
Type |
Brief |
|---|---|---|
|
optional array[int] |
Atom indices to remove from previous topology. |
|
optional Topology |
Topology to merge into previous frame. |
Changesets are applied in order: remove (sub) atoms first, then merge (add) the new topology.
HDF5 output structure¶
HDF5 exports are organized by topology and fragment level:
|-- topology_0
| |-- dimers
| | |-- 0:1
| | | |-- density
| | | |-- relaxed_mp2_density_correction
| | | |-- fock
| | | |-- final_coefficients
| | | |-- gradient
| | | |-- initial_coefficients
| | | |-- mo_energies
| | | |-- overlap
| | | |-- core_hamiltonian
| | | |-- mulliken_charges
| | | |-- bond_orders
| | | |-- hydrogen_caps_vector
| | | |-- descriptor_grid
| | | |-- density_descriptors
| | | `-- esp_descriptors
| | `-- ...
| |-- trimers
| |-- ...
| `-- fragmentation
| |-- mbe_expanded_density
| `-- mbe_expanded_gradient
|-- topology_1
`-- ...
File naming¶
For multi-team runs without concatenation, EXESS produces multiple HDF5 files:
<calculation_name>.hdf5
<calculation_name>_export_0.hdf5
<calculation_name>_export_1.hdf5
...
If concatenate_hdf5_files is enabled, the _export_N files are merged into <calculation_name>.hdf5.
Exported matrices¶
mbe_expanded matrices are full-system matrices formed by combining fragment matrices with MBE coefficients.
Name |
Dimensions |
Brief |
|---|---|---|
|
|
Converged fragment density (square or packed). |
|
|
MP2 relaxed density correction. |
|
|
Converged fragment Fock matrix. |
|
|
Final coefficient matrix. |
|
|
Fragment gradients. |
|
|
Initial coefficient matrix. |
|
|
MO energies. |
|
|
Overlap matrix. |
|
|
Core Hamiltonian. |
|
|
Mulliken charges. |
|
|
CHELPG charges. |
|
|
Bond order adjacency matrix. |
|
|
0/1 vector for hydrogen caps. |
|
|
Full-system density. |
|
|
Full-system gradients. |
|
|
Grid points (x, y, z). |
|
|
Grid weights (Lebedev grids only). |
|
|
Density values at grid points. |
|
|
ESP values at grid points. |
For descriptor grids exported as JSON, the grid coordinates are transposed: the first array contains the x coordinates, the second the y coordinates, and the third the z coordinates. Grid weights are also exported (often as 1.0 values).
Descriptor grids (rush-py exports)¶
Descriptor exports (export_density_descriptors, export_esp_descriptors) require a descriptor_grid. Upstream rush-py guidance recommends avoiding fragmentation for descriptor grids, since fragment-level descriptors complicate interpretation.
Example (regular grid with three points):
from rush import exess
from rush.client import RunOpts, RunSpec
res = exess.energy(
"input_topology.json",
frag_keywords=None,
export_keywords=exess.ExportKeywords(
export_density_descriptors=True,
export_esp_descriptors=True,
descriptor_grid=exess.RegularDescriptorGrid(
min=[0.0, 0.0, 0.0],
max=[2.0, 2.0, 2.0],
spacing=[2.0, 2.0, 2.0],
),
),
run_spec=RunSpec(storage=1000, gpus=1),
run_opts=RunOpts(
name="Rush-Py Tutorial: EXESS Exports 2",
tags=["rush-py", "test", "1kuw", "electron density", "ESP"],
),
collect=True,
)
When to_json=True is passed to save_energy_outputs, the exported HDF5 is converted to JSON. Example JSON structure:
{
"density_descriptors": [
0.019335589097924273,
0.03332198726559439,
0.0001262822899485241
],
"esp_descriptors": [
-14.73877477683919,
-11.399947425592524,
-6.359468034195182
],
"descriptor_grid": [
[0.0, 1.0, 2.0],
[0.0, 1.0, 2.0],
[0.0, 1.0, 2.0]
],
"descriptor_grid_weights": [
1.0,
1.0,
1.0
]
}
Notes from the rush-py tutorial:
export_expanded_esp_descriptorscurrently triggers an OOM error; avoid enabling it.When fragmentation is enabled, descriptor values are stored per n-mer in HDF5. When converted to JSON, each descriptor type becomes its own top-level key.
CustomDescriptorGridtakes a flat list of coordinates[x1, y1, z1, x2, y2, z2, ...].StandardDescriptorGridacceptsSG1orSG2. These appear to be very fine grids with many points (behavior still being documented).DescriptorGridusespoints_per_shell,order("One"or"Two"), andscale(construction details still being documented).The EXESS validation tests include other grid construction styles; support and documentation are still pending.
Post-processing¶
The EXESS GitHub repository includes a Julia-based Ovito exporter for iterative trajectories:
cd tools/export
julia ovito_exporter.jl -s [PATH_TO_HDF5_OUTPUT]
The output is written to tools/export/output.xyz by default, with an optional -d destination flag.