Scope and limits¶
SonoSK is research and teaching software. Its results come from models with the assumptions listed on this page. They are not validated for clinical decisions, for planning the treatment of a patient or for regulatory claims about a device.
What SonoSK is not¶
Not an elastic solver: soft tissue and bone are fluids, so shear waves, mode conversion in bone and elastography are outside version 0.2.
Not a GPU code: everything runs on the CPU with NumPy, which limits full-wave runs in 3-D to small grids.
Not a real-time scanner simulator, and the fast imaging model is 2-D in heterogeneous tissue.
Not a tool for regulatory acoustic output measurements: the output measures are computed from waveforms as defined in the standard, and the limit check is a screening aid.
Assumptions that most affect results¶
Fast imaging model. Echoes follow straight rays: phase aberration from
speed differences is included, ray bending is not. Interface echoes come
from phantom.interface_scatterers, a first-order (Born) model whose
level relative to the speckle is a modelling choice, and the transmission
loss at interfaces is applied with interfaces=True. Diffuse scatterer
amplitudes follow the echo level of each tissue, which is a modelling
choice for every tissue except the reference (breast fat). Plane-wave
compounding with few angles leaves clutter in anechoic regions: in the
breast example the cyst contrast is about -12 dB with 7 angles and about
-17 dB with 21 (-15.4 dB in the final example, which also has interface
echoes). Sound-speed-aware beamforming in the examples uses the
true speed map, so it shows the best case.
Full-wave solver. By default one power-law exponent is used on the
grid and each tissue keeps its own attenuation only at f_ref; on a grid
with y = 1.6 the attenuation of fat (y = 1) is 34 % too low at half of
f_ref and 52 % too high at twice f_ref (see fullwave.exponent_error and the
Benchmarks page). y="tissue" removes this error at
extra cost. Sharp interfaces are staircased on the grid; for a plane
wave on a sharp cylinder the error of the transmitted pressure trace is
8 % at 4 points per wavelength and 3 % at 8, and of the weaker reflected
trace 19 % and 4 %. The statement that 2 to 3 points per
wavelength are enough holds for smooth media and linear propagation, not
for scattering by grid-scale structure or for shocks. In 2-D every
inclusion is an infinite cylinder, which fills cysts with reverberation
in full-wave images; the 2-D full-wave breast example is an aberration
study, not a realistic B-mode image. On a shared heterogeneous case the
solver agrees with k-Wave to 0.2 to 2.6 % in the linear regime and to 4 to
6.5 % in a strongly nonlinear run, where the cause of the difference is
still open.
Hybrid angular spectrum. One-way propagation: reflections, scattering and nonlinearity are neglected. Through a smooth impedance gradient the amplitude converges, as the slices get thinner, to the energy-conserving value sqrt(Z2/Z1); at a sharp step it is the transmission coefficient 2 Z2/(Z1 + Z2).
Thermal model. The heat source uses the attenuation as absorption
unless fraction is given, which overestimates heating where scattering
is large. Thermal properties are constant unless k_coeff and
cp_coeff are given (no default values are shipped). Perfusion shutdown
is immediate and permanent. Boiling and cavitation are not modelled: runs
that pass 100 C give a warning and a note in the result, and their
temperatures, doses and damage are not physical there. The only damage
model shipped is the Henriques-Moritz skin model; for other tissues its
output is a damage index unless tissue-specific Arrhenius coefficients are
passed (arrhenius={material: Arrhenius(...)}). The change of echo and
attenuation of heated tissue uses factors measured after 30 min of
heating, applied by peak temperature.
Tissue values. Every value has a source, but the sources differ in
kind: direct measurements, power-law fits, database averages,
values used in simulation studies, generic soft-tissue values, values
inherited from a similar tissue and modelling choices.
tissues.provenance() gives the kind of every value and
tissues.uncertainty() the spread where one is known. Use
tissues.sample() to repeat a run over the spread of the values (see the
sensitivity example) before reading a single number as a prediction.
Checks that exist and checks still missing¶
The Validation page lists the closed-form and self-consistency tests, and the Benchmarks page the convergence studies and the comparison with k-Wave on a shared case. Not done yet: comparisons with measured fields and temperatures, with Field II or FOCUS for the fast imaging model, and with public imaging data such as PICMUS.