Outputs¶
EXESS produces JSON outputs for all calculations, and optional HDF5 outputs when exports are requested. In the Rush Python client, module calls return a RushRun handle; use run.fetch() for in-memory objects or run.save() 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, run.fetch() converts the main EXESS JSON output into Python dataclasses in memory. run.save() downloads the raw output objects to the local workspace and returns an exess.ResultPaths object with calc and optional exports path fields. For export-heavy runs, the second output is stored as a compressed archive in the object store; save() decompresses it and extracts the HDF5 file automatically.
If no exports are present, exports is None. If convert_hdf5_to_json=True was set on the EXESS run, the exported saved 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
run = 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"],
),
)
When convert_hdf5_to_json=True is set on the EXESS run, run.save() saves the exported data as JSON instead of HDF5. 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.