Skip to content

Results

GET /analysis-jobs/{job_id}/result/ returns a completed job's outputs:

{
  "job_id": "…",
  "metrics": {
    "solution": { "…": "…" }
  }
}

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.