Reproducibility
Method and sources
How what we found is known, how sure each part is, and how to check it. Everything on this site is generated from the repository by code anyone can run: the compositions from their JSON, the simulations from their scripts, the figures and volumes from the runs that made them. Nothing is edited by hand, and every number carries its source or is marked as assumed.
Three reasons, each checked against something it could have failed, and each with its own limits
Correlating one image’s looks registers little of ground motion
Looks cut from one image share their overlapping spectrum; for whole images their correlation peaks at zero lag exactly, and for patch registration that is a strong pull toward zero, measured rather than proved. For speckle, motion shared by a patch leaves the image’s distribution unchanged.
Checked: the same block motion is recovered in full against a motionless twin, so the motion is in the data; a lone bright point’s envelope follows its motion (100 ± 2%); the real crop’s spectrum reproduces its own coherence to 10−9. Limit: measured for this estimator; others need their own measurement.
In our model, the chamber’s imprint is far below the reach
Static relaxation with the lab’s elastic solver gives the chamber’s imprint on the ground’s motion (6.6 × 10−5 of it); the budget combines it with what P2-03 measured, allowing every advantage.
Checked: intact rock stays exactly still; the result changes 3.5% from a 1 m to a 0.5 m grid and not at all with domain size; Eshelby’s void with Okada’s point sources agrees within 40%; the detection threshold is confirmed by simulation (24 of 24 detected). Limit: one small chamber in uniform rock, quasi-static, at the regional microseism level; not a measurement at Giza during a pass.
The depth axis is a frequency axis
The steering wavenumber grows linearly with slow time, so the published focusing is a Fourier transform over time: 6.76 m of depth per hertz on the real geometry, whatever lies below.
Checked: the pipeline’s own code reproduces the rule to the grid, folds where predicted, and draws identical profiles over a chamber at 15 m, at 30 m and over rock; run whole (P2-07), its sections with and without the chamber differ by 10−8. Limit: the scale depends on the sound wavelength, which rescales it without changing the fit (a calibration ambiguity); the relation makes absolute depth uncalibrated, and does not by itself decide whether horizontal location or shape survive.
Graded claim by claim on the satellite page, which also says what would settle what is open. The full audit, with what is not established and the corrections adopted after an independent review, is METHOD_AUDIT.md; every run’s parameters, code and data are linked from its details panel on the satellite page.
Every figure says whether it is simulated, measured, claimed or planned
Every material property is sourced, derived from a source, or marked assumed
P and S wave speeds in m/s; ′ derived from a source by a stated ratio; * assumed. Densities are assumed throughout until an open source is found.
| Material | P wave | S wave | Source |
|---|---|---|---|
| Air | 343 | 0 | gpg |
| Water | 1,450–1,500 | 0 | gpg |
| Soil | 300–700 | 100–300 | gpg |
| Dry sand and gravel (Giza surface layer) | 500–1,000 | 100–500 | sharafeldin2019 |
| Wet sand | 1,500–2,000 | 400–600 | gpg |
| Saturated clay and shale | 1,100–2,500 | 200–800 | gpg |
| Marl (Maadi Formation) | 2,000–3,000 | 750–1,500 | gpg |
| Fractured, wet limestone and marl (Giza second layer) | 1,200–2,500 | 520–1,090 ′ | sharafeldin2019 |
| Mokattam limestone and dolomite (plateau bedrock) | 2,800–3,800 | 1,550–2,110 ′ | sharafeldin2019 |
| Limestone (textbook) | 3,500–6,000 | 2,000–3,300 | gpg |
| Porous saturated sandstone | 2,000–3,500 | 800–1,800 | gpg |
| Granite | 4,500–6,000 | 2,500–3,300 | gpg |
| Limestone masonry (pyramid core) | 1,500–3,000 * | 700–1,600 * | assumed |
| Rubble fill | 500–1,400 * | 200–700 * | assumed |
sharafeldin2019 Sharafeldin, S. M., Essa, K. S., Youssef, M. A. S., Karsli, H., Diab, Z. E., Sayil, N. (2019). Shallow geophysical techniques to investigate the groundwater table at the Great Pyramids of Giza, Egypt. Geoscientific Instrumentation, Methods and Data Systems 8, 29-43. doi:10.5194/gi-8-29-2019
gpg UBC Geophysical Inversion Facility. Seismic Velocities of Rocks and Various Materials. Geophysics for Practicing Geoscientists (GPG), table_seismic_velocity. link
gamal2024 Gamal, M. A., Abdelfattah, M., Maher, G. (2024). Investigation and monitoring of rotational landslides in El Mokkattam plateau Egypt, using integrated geological and geophysical techniques. Heliyon 10, e36545. doi:10.1016/j.heliyon.2024.e36545
Two communities, one vocabulary
Seismologists and radar engineers rarely read each other. The terms this site uses from each, in plain words; they are underlined where they appear.
- ambient-noise interferometry seismic
- Cross-correlating the background hum recorded at two sensors turns it into the wave that would travel from one to the other, so noise can stand in for a source.
- azimuth radar
- The direction along the satellite’s track, as opposed to range, the direction of the beam.
- coherence radar
- How similar two radar looks of the same ground are, from 0 to 1. Phase can only be compared where coherence is high.
- crosshole seismic
- A survey with sources down one borehole and receivers down another, so rays pass through the ground between them rather than skimming the surface.
- Doppler frequency radar
- The frequency shift of an echo from the satellite’s motion. In a focused image it maps to the time and direction from which a target was seen.
- Doppler tomography radar
- The claimed method: reading ground vibration from the differences between sub-apertures of one image and focusing it into depth. Published 2022, retracted 2026.
- eikonal equation seismic
- The high-frequency limit of the wave equation: it gives the earliest arrival time everywhere, and the rays are its steepest descent.
- first break seismic
- The first arrival of energy on a seismic record. Its timing, picked on every record, is the data of travel-time tomography.
- Fisher information seismic · radar
- How sharply the probability of the data changes with a parameter. Its inverse bounds the variance of any unbiased estimate (the Cramér–Rao bound), and for a small change it sets, to first order, how well any test can tell the two cases apart; for a finite change it bounds that with an explicit remainder.
- full-waveform inversion seismic
- Fitting whole seismic records, not just arrival times, by adjusting a model of the ground; each step is a gradient computed by propagating the misfit backwards in time.
- geophone seismic
- A ground-motion sensor recording velocity; three-component geophones record east, north and up.
- imprint seismic · radar
- The difference a buried chamber makes to how the surface moves as a wave passes: what any passive method would have to detect.
- line of sight radar
- The direction from the satellite to the ground; radar measures motion only along it.
- look radar
- An image formed from part of the Doppler band. In a dwell the band is time, so a look sees the ground as it was during a few seconds, and averages any motion over them.
- microseism seismic
- The ground’s constant hum from ocean swell, strongest between 0.1 and 0.3 Hz, felt everywhere on Earth as surface waves kilometres long.
- P wave seismic
- The compressional wave: the fastest, so the first to arrive. About 3,300 m/s in Giza limestone.
- PML seismic
- Perfectly matched layer: an absorbing boundary that lets simulated waves leave the grid without reflecting.
- points per wavelength seismic
- How many grid cells span the shortest wave simulated; too few and the waves travel at the wrong speed.
- Rayleigh wave seismic
- A wave that rolls along the ground surface, slightly slower than S, carrying most of a hammer blow’s energy. It samples to about a third of its wavelength in depth.
- reverse-time migration seismic
- Imaging by sending recorded waves backwards through a model of the ground and marking where they meet the waves sent forward from the source. It is the first step of full-waveform inversion.
- S wave seismic
- The shear wave: slower than P (about 1,800 m/s in the same rock) and unable to cross air or water.
- SLC radar
- Single-look complex image: a focused radar image that keeps amplitude and phase for every pixel.
- speckle radar
- The grainy texture of radar images of natural ground: many small scatterers in each cell interfering. Each Doppler bin holds an independent speckle pattern.
- Spotlight Dwell radar
- An ICEYE mode that keeps the beam on one scene for tens of seconds, here 24.5 s, far longer than a normal image needs.
- sub-aperture radar
- A part of the synthetic aperture processed on its own: a look from a slightly different direction and time.
- synthetic aperture radar
- The stretch of orbit over which echoes are combined into one image; a long aperture gives fine resolution along the track.
- tomogram seismic · radar
- A three-dimensional image of a property (here, wave speed) reconstructed from measurements taken around it.
- travel-time tomography seismic
- Finding the speed of the ground from how long first arrivals take between many sources and receivers, by tracing their rays and adjusting the speeds until the times fit.
- virtual source seismic
- A sensor made to act as a source: the correlation of its noise record with another sensor’s is the wave a real source there would have sent. Noise sources spread over the ground give it as minus the lag derivative of the correlation.
- X-band radar
- Radar near 9.6 GHz (3.1 cm wavelength). It enters dry limestone by centimetres, not metres.
Three commands rebuild everything
cd sim && uv sync && uv run pytest # the simulation and its checks (~40 s)
uv run python experiments/p2_07_whole_chain.py # any run, e.g. the whole chain (~5 min)
uv run python -m katabasis.export # everything the site reads
cd ../web && npm ci && npm run build # the site, into docs/The lab’s Python package keeps its first name, katabasis. Real-image steps need the ICEYE products, which are not in the repository; their acquisition records are, so everything else reruns anywhere.
One command runs a method over any area of a product and adds the result to the lab
cd sim
uv run --with scikit-image python -m katabasis.lab gated --name khafre --site giza --centre 0,0 --twin 101
uv run python -m katabasis.export # the run appears in the lab, under the satellitegated runs the stricter gated reconstruction, the publicReplication and Verification of the Biondi Protocol (v1.8 standalone package, commit ac6f2500), unchanged but for its input paths, along east–west lines --step metres apart across a square of the site (--half-ew, --half-ns), each line placed through the product’s RPC over the site’s surface (--lines ns lays them north–south). Its fit scores are hung below the surface into a volume, unsmoothed and empty where nothing passed; --twin SEED runs the same raster on a motionless copy of the image, the control every picture needs, and --producttakes another pass, or a synthetic product. In the lab, every place a method was run shows at once, and the pass and the lines become choices: things a real feature should survive. Each run writes sim/results/lab_<name>/: its record (date, commit, the method’s source hash, every parameter) and its volumes, which the export adds to the lab with the record attached. More methods will join it as they are built.
Every picture on this site comes from one of these 55 runs, and each can be made again
The record each run wrote: when, from which commit, how long it took, and the command that repeats it (from sim/). A commit marked + had uncommitted changes to the lab’s code when the run saved (8 of 55); rerunning at that commit may differ in small ways. Runs that read a real ICEYE product need it on disk, and the 18 runs of the gated reconstruction need its public package, whose hash each of those records carries.
| Run | What it does, and the command that repeats it | Date | Commit | Took |
|---|---|---|---|---|
| M1-01 | Ambient ground motion measured near Gizauv run python experiments/m1_01_ambient_levels.py | 2026-09-27 | d341330+ | 3 min |
| P1-01 | The elastic solver against exact solutionsuv run python experiments/p1_01_forward_validation.py | 2026-09-27 | 3468943 | 2 min |
| P1-02 | First-arrival travel-time tomography over one chamberuv run python experiments/p1_02_traveltime.py [--reuse] | 2026-09-27 | 7489f48+ | 1 min |
| P1-03 | The chamber's echo, imaged from the surfaceuv run python experiments/p1_03_scattered.py [--reuse] | 2026-09-27 | 0eff4a5+ | 17 min |
| P1-04 | Ambient noise over one chamberuv run python experiments/p1_04_ambient.py [--reuse] | 2026-09-27 | e563377 | 41 min |
| P1-05 | Full-waveform inversion from a practitioner's startuv run python experiments/p1_05_fwi.py [--reuse] | 2026-09-27 | 37baecd | 2.1 h |
| P2-00 | Ambient motion on the Giza plateau against the radar flooruv run python experiments/p2_00_ambient_giza.py | 2026-09-27 | b6f3f9c | 1.5 s |
| P2-01 | The real dwell as the simulator's geometryuv run python experiments/p2_01_geometry.py | 2026-09-28 | 7583420 | 0.3 s |
| P2-03 | What one dwell can see of the ground's motionuv run python experiments/p2_03_what_a_dwell_sees.py | 2026-09-28 | d9e33c2 | 54 s |
| P2-04 | The chamber's imprint on the ground's own motionuv run python experiments/p2_04_chamber_imprint.py | 2026-09-28 | d9e33c2 | 6 min |
| P2-05 | The smallest imprint one dwell could detectuv run python experiments/p2_05_budget.py | 2026-09-28 | d9e33c2 | 41 s |
| P2-06 | The published depth is the frequency of the ground's motionuv run python experiments/p2_06_depth_is_frequency.py | 2026-09-28 | d9e33c2 | 0.1 s |
| P2-07 | The whole chain: a satellite image of shaking ground over a chamberuv run python experiments/p2_07_whole_chain.py | 2026-09-28 | 7583420 | 5 min |
| P2-08 | How the method draws pillars and boxesuv run python experiments/p2_08_pillars_and_boxes.py | 2026-09-28 | 51697f0 | 51 s |
| P2-09 | A million virtual sensors: can the image act as a dense seismic array?uv run python experiments/p2_09_virtual_sensors.py | 2026-09-28 | b4d6776 | 1 min |
| P2-11 | Every way a buried room could reach a radaruv run python experiments/p2_11_every_way_in.py | 2026-09-28 | a32c15f | 0.1 s |
| P2-12 | The real pass over Giza, laid on the grounduv run python experiments/p2_12_real_pass.py | 2026-09-28 | 02c7253 | 8.8 s |
| P2-13 | Stricter gates: motionless images pass them; a planted vibration is not recovereduv run --with scikit-image python experiments/p2_13_gates.py | 2026-09-28 | cbf806b | 44 min |
| P2-14 | The reconstruction's own lines round Khafre's base, with the same controlsuv run --with scikit-image python experiments/p2_14_own_lines.py | 2026-09-29 | d23f20b | 15 min |
| P2-15 | What the six-second pairs register of a vibration, measured rather than assumeduv run --with scikit-image python experiments/p2_15_pair_response.py | 2026-09-29 | a94ee0f | 5 min |
| P2-16 | The gated reconstruction over the Great Pyramid, in three dimensionsuv run --with scikit-image python experiments/p2_16_khufu_volume.py | 2026-09-29 | d8a0060 | 1.8 sreused |
| P2-17 | The same raster over open plateau: an in-image control for P2-16uv run --with scikit-image python experiments/p2_17_plateau_control.py | 2026-09-29 | 96d5a6a | 16 min |
| P2-18 | The radar simulator, checked against pulsesuv run --with scikit-image python experiments/p2_18_echo_validation.py | 2026-09-29 | 994469d | 6 min |
| P2-19 | A known vibration through the unchanged pipelineuv run --with scikit-image python experiments/p2_19_known_vibration.py | 2026-09-29 | a46ecd7 | 17 min |
| P2-20 | The gated reconstruction over the known benchuv run --with scikit-image python experiments/p2_20_bench_gated.py | 2026-09-29 | 3c68cdf | 38 min |
| P2-21 | What survives a change of pass or of linesuv run python experiments/p2_21_what_survives.py | 2026-09-29 | c232f06 | 0.5 s |
| P2-22 | One shaking: a vibrator beside the bench, with the chamber and without ituv run python experiments/p2_22_one_shaking.py | 2026-09-29 | aeffc33 | 23 min |
| P2-23 | One shaking, read by geophones and by the satelliteuv run --with scikit-image python experiments/p2_23_every_reader.py | 2026-09-29 | 7e1138f | 2 min |
| P2-24 | The gated reconstruction on the one shakinguv run --with scikit-image python experiments/p2_24_gated_on_the_shaking.py | 2026-09-29 | 6e4e32e | 47 min |
| P2-25 | What one image can hold about the chamber, whatever reads ituv run python experiments/p2_25_information_bound.py | 2026-10-01 | 0f67888 | 4 min |
| P2-26 | The chamber's imprint at every frequency, and how long a room ringsuv run python experiments/p2_26_imprint_spectrum.py | 2026-09-30 | 626337c | 52 s |
| P2-27 | What one image would need: the motion a room must add to the grounduv run python experiments/p2_27_requirement.py | 2026-10-01 | 0f67888 | 7.5 s |
| P2-28 | Two depths, hollow and solid: does the published picture follow the room?uv run python experiments/p2_28_two_depths.py | 2026-09-30 | 9e98de7 | 1.5 h |
| P2-29 | The oracle: what an ideal detector could learn, told more than any method knowsuv run python experiments/p2_29_oracle.py | 2026-10-01 | 0f67888 | 0.5 s |
| P2-30 | Finite certificates: the bound on every processor, the common background includeduv run python experiments/p2_30_finite_certificates.py | 2026-10-01 | 0f67888 | 0.1 s |
| P2-31 | The shape test: location and shape, with depth allowed to be wronguv run python experiments/p2_31_shape_test.py | 2026-09-30 | 1bf937d+ | 2.7 h |
| P2-32 | Shape discrimination, boundeduv run python experiments/p2_32_shape_bounds.py | 2026-10-01 | 0f67888 | 2 min |
| P2-33 | Sacsayhuamán: the real pass over megalithic walls, houses and open fieldsuv run python experiments/p2_33_sacsayhuaman.py | 2026-09-30 | d13b0ca | 7.1 s |
| P2-34 | The gated reconstruction's depth scale, pass by passuv run python experiments/p2_34_gated_depth_scale.py | 2026-09-30 | 714f436 | 0.2 s |
| P2-35 | What would give the published pictures their rungs and roomsuv run python experiments/p2_35_rungs_and_rooms.py | 2026-09-30 | e5d8c52 | 1.9 s |
| P2-36 | One auditable comparison: presence, location and shape, bounds beside achieveduv run python experiments/p2_36_benchmark.py | 2026-10-01 | b5fa1ae+ | 2 min |
| P2-37 | The benchmark read: the published method and a detector told the lorryuv run python experiments/p2_37_benchmark_read.py [worker k n] | 2026-10-01 | b5fa1ae+ | 18 s |
| P2-38 | The claim computed: the structures announced under Khafreuv run python experiments/p2_38_claim.py | 2026-10-01 | b5fa1ae+ | 2 min |
| P2-39 | The published Sphinx tomogram, reproduced, and how far it survives a one-pixel nudgeuv run --with scikit-image python experiments/p2_39_sphinx_line.py | 2026-10-02 | 3861feb | 29 s |
| P2-40 | Whether the Sphinx volume's blobs stay put from one pass to the nextuv run python experiments/p2_40_sphinx_passes.py | 2026-10-03 | c849418 | 1.2 s |
| P2-41 | What survives a change of pass across Khufuuv run python experiments/p2_41_khufu_passes.py | 2026-10-03 | f2ed0e0 | 0.2 s |
| lab · khafre | The gated reconstruction across Khafre, from the 2022 imageuv run --with scikit-image python -m katabasis.lab gated --name khafre --site giza --centre 0,0 --half-ew 150 --half-ns 141 --step 3 --supports 1,4 --twin 101 | 2026-09-29 | 4af4a3c | 38 min |
| lab · khafre_2025 | The gated reconstruction across Khafre, from the 2025 imageuv run --with scikit-image python -m katabasis.lab gated --name khafre_2025 --site giza --centre 0,0 --half-ew 150 --half-ns 141 --step 3 --supports 1,4 --twin 101 --product <path to ICEYE_X33_SLC_SLEDF_951562307_20250827T202654.h5> | 2026-09-29 | c232f06 | 1.5 h |
| lab · khafre_ns | The gated reconstruction across Khafre, north-south lines, from the 2022 imageuv run --with scikit-image python -m katabasis.lab gated --name khafre_ns --site giza --centre 0,0 --half-ew 141 --half-ns 150 --step 3 --supports 1,4 --twin 101 --lines ns | 2026-09-29 | c232f06 | 1.4 h |
| lab · khufu_2025 | The gated reconstruction across Khufu, from the 2025 pass, on the lines P2-16 laiduv run --with scikit-image python -m katabasis.lab gated --name khufu_2025 --site giza --centre 324.26,349.19 --half-ew 150 --half-ns 141 --step 3 --supports 1,4 --twin 101 --product <path to ICEYE_X33_SLC_SLEDF_951562307_20250827T202654.h5> | 2026-10-03 | c50a62f+ | 40 min |
| lab · sacsay_fields | The gated reconstruction across the fields north of Sacsayhuamán, from the 2025 passuv run --with scikit-image python -m katabasis.lab gated --name sacsay_fields --site sacsayhuaman --centre -100,525 --half-ew 150 --half-ns 141 --step 3 --supports 1,4 --twin 101 --product <path to ICEYE_X35_SLC_SLEDF_5907293_20250822T152433.h5> | 2026-09-30 | 2e70040 | 40 min |
| lab · sacsay_grid | The gated reconstruction across the city grid houses of Cusco, from the 2025 passuv run --with scikit-image python -m katabasis.lab gated --name sacsay_grid --site sacsayhuaman --centre -250,-1000 --half-ew 150 --half-ns 141 --step 3 --supports 1,4 --twin 101 --product <path to ICEYE_X35_SLC_SLEDF_5907293_20250822T152433.h5> | 2026-09-30 | 2e70040 | 42 min |
| lab · sacsay_walls | The gated reconstruction across the zigzag walls of Sacsayhuamán, from the 2025 passuv run --with scikit-image python -m katabasis.lab gated --name sacsay_walls --site sacsayhuaman --centre 14.6,-92.7 --half-ew 150 --half-ns 141 --step 3 --supports 1,4 --twin 101 --product <path to ICEYE_X35_SLC_SLEDF_5907293_20250822T152433.h5> | 2026-09-30 | 2e70040 | 38 min |
| lab · sphinx | The gated reconstruction across the Sphinx enclosure, from the 2022 pass, with its author's Sphinx settings (Track 7, supports 1 to 3, 0 to 50 m)uv run --with scikit-image python -m katabasis.lab gated --name sphinx --site giza --centre 655.7,-86.8 --half-ew 45 --half-ns 30 --step 0.6 --supports 1,2,3 --twin 101 --lines ns --track 7 --depth-max 50 | 2026-10-02 | 6dccba6 | 52 min |
| lab · sphinx_2025 | The gated reconstruction across the Sphinx enclosure, from the 2025 pass, with the same Sphinx settings (Track 7, supports 1 to 3, 0 to 50 m)uv run --with scikit-image python -m katabasis.lab gated --name sphinx_2025 --site giza --centre 655.7,-86.8 --half-ew 45 --half-ns 30 --step 0.6 --supports 1,2,3 --twin 101 --lines ns --track 7 --depth-max 50 --product <path to ICEYE_X33_SLC_SLEDF_951562307_20250827T202654.h5> | 2026-10-02 | 084207e | 58 min |
One repository, three parts
sites/
The materials library and one composition per site, shared by the simulation and the viewer.
sim/
The Python lab: compositions, the elastic solver, the arrays and inversions, and the first investigation kept intact in sim/legacy/.
web/
This site: Astro and Three.js, hand-drawn figures, no chart library. Source · first investigation