Results¶
GET /analysis-jobs/{job_id}/result/ returns a completed job's outputs:
Everything scientific is in metrics.solution. Its keys depend on the analysis. This page lists them all, with the headline the app shows for each and what's common to every result. The Scientific reference defines the quantities.
Common to every solution¶
| Key | Meaning |
|---|---|
voxel_size_um |
The image's voxel size the result is expressed in, or null (voxel units). |
units |
The unit of each kind of quantity in this result: length, area, volume, pressure. For example {"length": "µm", "area": "µm²", "volume": "µm³", "pressure": "Pa"}, or voxels, voxel² and N/m per voxel without a voxel size. |
tables |
The same numbers as display tables, the ones the app and PDF reports show: a list of {title, columns, rows}, with values as formatted strings. Handy for printing, but read the numeric keys for computation. |
Values are converted to the image's current voxel size every time you fetch the result. See Units and voxel size.
Example: pore size distribution¶
A real result, for the 120³ synthetic sample used in the figures on these pages, with a voxel size of 5.345 µm (tables trimmed):
{
"job_id": "1b7e5c2a-8d4f-4e1b-9a3c-6f2d8e0b4a7c",
"metrics": {
"solution": {
"R": [5.345, 10.69, 16.035, 21.38, 26.725, 32.07, 37.415, 42.76],
"pdf": [0.027333, 0.014392, 0.041666, 0.044111, 0.043736, 0.011283, 0.004251, 0.000319],
"cdf": [1.0, 0.85391, 0.77698, 0.55428, 0.3185, 0.084736, 0.024426, 0.0017038],
"satn": [0.14609, 0.076928, 0.2227, 0.23577, 0.23377, 0.06031, 0.022722, 0.0017038],
"bin_centers": [5.345, 10.69, 16.035, 21.38, 26.725, 32.07, 37.415, 42.76],
"bin_edges": [2.6725, 8.0175, 13.362, 18.707, 24.052, 29.397, 34.742, 40.087, 45.432],
"bin_widths": [5.345, 5.345, 5.345, 5.345, 5.345, 5.345, 5.345, 5.345],
"sizes": 8,
"steps": 25,
"voxel_size": 5.345,
"voxel_size_um": 5.345,
"units": {"length": "µm", "area": "µm²", "volume": "µm³", "pressure": "Pa"},
"tables": [{"title": "Pore Size Distribution", "columns": ["R (µm)", "pdf", "cdf", "…"], "rows": ["…"]}]
}
}
}
The median pore radius, where cdf crosses 0.5, is about 22.6 µm.
Keys by analysis¶
Lengths are in µm, areas in µm², volumes in µm³ and pressures in Pa once the image has a voxel size, and in voxels, voxel², voxel³ and N/m per voxel otherwise. The headline is the one number the app, job lists and reports show first; where it isn't a key of its own, its line says how to read it from the keys.
permeability¶
Headline: k_mD, or k_voxel2 when the image has no voxel size.
| Key | Type | Meaning |
|---|---|---|
k_m2 |
number | null | Permeability, m², at the current voxel size. null without a voxel size. |
k_mD |
number | null | Permeability, millidarcy (\(k_{\text{m}^2} / 9.869233\times10^{-16}\)), at the current voxel size. null without a voxel size. |
k_voxel2 |
number | Permeability, voxel² (\(k\) with a voxel edge of 1). Independent of the voxel size. |
u_darcy, u_pore |
number | Superficial and mean pore velocity, lattice units (waLBerla, Kabs). |
porosity |
number | Total porosity (Kabs). |
converged |
boolean | Every convergence criterion passed. |
iterations_completed, max_iterations |
integer | Iterations run, and the cap \(n_\text{max}\). |
velocity_criterion, velocity_tolerance |
number | Last \(r_u\) and its threshold \(\delta_u\). |
permeability_criterion, permeability_tolerance |
number | Last \(r_k\) and its threshold \(\delta_k\). |
flux_profile_criterion, flux_profile_tolerance |
number | Last \(r_Q\) and its threshold \(\delta_Q\) (waLBerla). See convergence. |
consecutive_passes |
integer | How many checks in a row, up to the last one, every criterion passed. A failing check resets the count to 0, and the run stops when it reaches 2, so a converged run reports 2 and an unconverged one 0 or 1 (waLBerla, Kabs). |
convergence_every |
integer | The check interval, in iterations. |
Palabos returns the permeability keys, converged, iterations_completed and max_iterations only.
Some solvers also name the permeability permeability [m^2] and permeability [mD]. They're the same values as k_m2 and k_mD, and like them follow the image's current voxel size.
diffusivity¶
Headline: tortuosity, the tortuosity factor \(\tau\).
| Key | Type | Meaning |
|---|---|---|
effective_diffusivity |
number | \(D_\text{eff}/D_0\), dimensionless, porosity included |
tortuosity |
number | Tortuosity factor \(\tau = \varphi/(D_\text{eff}/D_0)\). 0 means no through-path. |
converged, solver_converged, flux_converged |
boolean | Overall and per-criterion convergence. converged is true only if target_relative_error was met. |
final_relative_flux_error |
number | Flux balance error on the final field, the spread of the plane fluxes |
final_relative_residual |
number | Solver residual when the solver stopped (Tortuosity.jl) |
iterations |
integer | Solver iterations, including any accuracy-tightening rounds |
tightening |
object | What Tortuosity.jl did after its first solve: base_flux_error (the flux balance error after the first solve), extra_iterations, one entry per round in rounds, and stop_reason: not_needed, target_met, rounds, no_progress, budget (its extra solving allowance used up) or failed |
direction, flux_tolerance, solver_tolerance |
Echoes of the request. flux_tolerance is the target_relative_error you asked for. |
|
summary_tables |
array | The result table the app shows, as {title, columns, rows} with formatted values, rebuilt each time you read the result. |
Porosity isn't returned separately, but \(\varphi = \tau \cdot D_\text{eff}/D_0\) recovers it, and ingestion records it on the image. The formation factor \(F = D_0/D_\text{eff}\) isn't a key of its own either: it's 1 / effective_diffusivity, and summary_tables carries it as the row Formation factor (F = D_0/D_eff), left out when effective_diffusivity is 0.
conductivity¶
Headline: effective_conductivity, the relative conductivity \(\sigma_\text{eff}/\sigma_s\).
| Key | Type | Meaning |
|---|---|---|
effective_conductivity |
number | Relative conductivity \(\sigma_\text{eff}/\sigma_s\), solid volume fraction included |
solid_volume_fraction |
number | Solid volume fraction \(\varphi_s = 1 - \varphi\) |
tortuosity |
number | Solid tortuosity factor \(\tau_s = \varphi_s/(\sigma_\text{eff}/\sigma_s)\) |
phase |
string | solid |
Plus the convergence keys of diffusivity. Everything is dimensionless, so the voxel size doesn't affect the result, and there's no formation factor row.
poresize¶
Headline: the median pore radius \(r_{50}\), where cdf crosses 0.5, read against R.
| Key | Meaning | Units |
|---|---|---|
R |
Bin centres \(r_i\): pore radius | length |
pdf |
\(f(r_i)\), volume fraction per unit radius | 1/length |
cdf |
\(F(r_i)\), fraction of pore volume with radius ≥ \(r_i\) | — |
satn |
\(s_i\), fraction of pore volume in each bin | — |
bin_edges, bin_widths, bin_centers |
Histogram geometry, one bin per voxel of radius, up to 200 bins | length |
sizes, steps |
Number of bins, and the steps requested |
— |
hg_porosimetry¶
Headline: \(P_{c50}\), where snwp_intrusion crosses 0.5, read against pc_intrusion.
| Key | Meaning | Units |
|---|---|---|
pc_intrusion, snwp_intrusion |
Intrusion curve: capillary pressure \(P_c\) and non-wetting saturation \(S_\text{nwp}\) | pressure, — |
pc_extrusion, snwp_extrusion |
Extrusion curve | pressure, — |
steps |
Pressure steps per curve | — |
The curves are padded at their ends to reach full saturation (intrusion) and the trapped saturation (extrusion). The padded end pressures are infinite and appear as null.
radial_density¶
Headline: \(r_{50}\), the median distance to solid (to pore, for the solid phase), where cdf crosses 0.5, read against R.
| Key | Meaning | Units |
|---|---|---|
R (= bin_centers) |
Distance to solid, \(r_i\) (to pore, for the solid phase) | length |
pdf |
Probability density \(P(r_i)\) | 1/length |
cdf |
\(F(r_i)\), the fraction of the phase farther from the other phase than \(r_i\) | — |
bin_edges, bin_widths |
Histogram geometry, binned like poresize |
length |
bins, log, phase |
Number of bins (chosen for you), false, and the phase measured |
— |
chord_length_distribution¶
Headline: the median chord length \(\ell_{50}\) along x, where distributions.x.cdf crosses 0.5, read against distributions.x.L.
phase (the phase measured), axis, bins and ndim, and distributions.x, distributions.y and distributions.z, each with:
| Key | Meaning | Units |
|---|---|---|
L (= bin_centers) |
Chord length \(\ell_i\) | length |
pdf |
\(p(\ell_i)\), number-weighted density | 1/length |
cdf |
\(F(\ell_i)\), the fraction of chords at least \(\ell_i\) long | — |
relfreq |
Fraction of chords in each bin | — |
bin_edges, bin_widths |
Histogram geometry | length |
An axis with no complete chords, for example because the image is too thin along it, comes back with empty lists.
porosity_profile¶
Headline: the mean porosity \(\bar\varphi\), the mean of every value in profiles.{x,y,z}.profile.
axis, ndim, and profiles.x, profiles.y, profiles.z (whichever were requested), each with coords (slice midpoint positions, length) and profile (slice porosity).
porosity_connectivity¶
Headline: none; read total_porosity and any_direction.percolating_porosity.
total_porosity, closed_porosity, blind_porosity; axes.{x,y,z} and any_direction, each with percolating_porosity, nonpercolating_porosity and percolating_cluster_count; solid with the solid-connectivity keys; plus connectivity ("min", face connectivity), fraction_basis ("bulk_volume") and phases. Every fraction is of the bulk volume, between 0 and 1, and nothing depends on the voxel size. See Connectivity analysis.
rev_porosity¶
Headline: the porosity of the largest regions, the mean of porosity over the 10% of cubes with the largest volume.
| Key | Meaning | Units |
|---|---|---|
volume |
Region volume, one per cube | volume |
porosity |
Porosity of each cube | — |
n |
Number of cubes (1000) | — |
interfacial_surface_area¶
Headline: none; read final_area, and the last entry of specific_area.
| Key | Meaning | Units |
|---|---|---|
area |
\(A_0 \dots A_{10}\), one per smoothing iteration | area |
specific_area |
Area / bulk volume, \(A_i / V_\text{bulk}\) | 1/length |
relative_change |
\(A_i/A_0 - 1\), a fraction | — |
raw_area, final_area |
Raw area \(A_0\) and final smoothed area \(A_{10}\) | area |
bulk_volume |
Voxels in the image | volume |
iterations, smoothing_passes |
Iteration index (one Taubin pair each) and pass count | — |
mesh |
Triangle, vertex and pinned-vertex counts, and in mesh.contact_constraints the edge and corner contacts frozen or pinned |
— |
warnings |
Topology warnings, if any | — |
original_raw_area |
Voxel-face area before isolated voxel cleanup, when cleanup_singletons was set |
area |
cleanup |
Isolated voxels filled (pore_voxels_filled) and removed (solid_voxels_removed), their total and share of the image, when cleanup_singletons was set |
— |
method |
Full description of the method and package versions | — |
network_extraction¶
Headline: pore_count, the number of pores in the network.
pore_count, throat_count, method, and the diameter properties available, pore_diameter_keys and throat_diameter_keys. The network itself is stored with the job in voxel units; it can be downloaded in the app, but not through the API yet. Use the job ID as network_job in a network_validation job.
network_validation¶
Headline: k_mD, or k_voxel2 when the image has no voxel size.
| Key | Meaning | Units |
|---|---|---|
k_m2, k_mD, k_voxel2 |
Network permeability, following the image's current voxel size like permeability's |
m², mD, voxel² |
permeability |
Network permeability; its unit is permeability_unit |
µm², or voxel² without a voxel size |
effective_diffusivity |
Network \(D_\text{eff}/D_0\) | — |
pore_count, throat_count |
Pores and throats after trim | — |
direction, shape_model, pore_diameter_key, throat_diameter_key |
Echoes of the request | — |
Network extraction and validation are available to PoreStore staff only for now. Results of network jobs you already ran stay readable.
sem_view, xray_view¶
Headline: none. sem_fields_written or xray_fields_written lists the fields written to the image.
Fields¶
Some analyses also save 3D fields with the image. They're shown in the app's slice viewer and can be downloaded from the app's Export, but downloads aren't in the API yet: it returns a result's numbers only. Deleting the image deletes its fields; the numbers in solution stay.
| Analysis | Field | What it holds |
|---|---|---|
permeability |
pressure and the three velocity components | On the image grid, in lattice units. waLBerla stores gauge pressure \(c_s^2(\rho - 1)\) with solid set to NaN; Kabs and Palabos store the lattice density as a pressure proxy. |
diffusivity |
concentration__<axis> |
The steady concentration, 1 at the inlet, 0 at the outlet, NaN in solid, in float32 (about 4–5 significant digits). |
conductivity |
potential__<axis> |
The normalised potential through the solid, 1 at the inlet face and 0 at the outlet face, NaN in pore. |
poresize |
local_thickness |
The local thickness of every voxel, in voxels whatever the image's voxel size, 0 in solid. |
hg_porosimetry |
invasion_sequence |
The intrusion step at which mercury first entered each voxel; −1 in pore it never reaches, 0 in solid. |
hg_porosimetry |
invasion_pressure |
The capillary pressure at which mercury entered each voxel, in N/m per voxel whatever the voxel size (divide by the voxel edge in metres for Pa); NaN in pore never invaded, 0 in solid. |
sem_view, xray_view |
sem_x, sem_y, sem_z or xray_x, xray_y, xray_z |
Stored with the image rather than the job, for the viewer. |