Backfill misses¶
Recover the sky/miss points a scan needs for leaf area density — laser pulses that were fired but returned nothing because they passed through the canopy into open sky. See Scans for what misses are and why they matter.
LAD inverts Beer's law on the beams crossing each voxel, and the misses are the transmission denominator: without them there's no way to tell a voxel that stopped every beam from one that let them all through. Some formats record misses directly (E57, structured PLY); others drop them but keep enough to reconstruct them. Backfill Misses does that reconstruction once, up front, and stores the result on the scan so you can see it and reuse it.
When you need it¶
- A scan has no sky/miss points (the "Show misses" toggle is absent in the Scans panel), and
- it has something to rebuild the miss directions from: a per-return
timestampcolumn, scan-gridrow/columnindices, or — for a static (tripod) raster scan with neither — scan parameters that declare its angular raster, and - it has a known scanner position.
The dialog's Reconstructs from column shows which of the three each scan will use: the timestamp first, then the row/column grid, then the raster. On the raster route each return is placed on the scan's declared grid by its direction from the scanner, so the scan parameters (zenith and azimuth ranges, point counts, tilt and heading) must be the scanner's. Phytograph checks the returns against the declared raster before trusting it. A wrong step, extent, tilt or heading fails with a message naming what doesn't match, instead of producing misplaced misses.
If a scan already retains misses, there's nothing to do. If it has no timestamp, no row/column grid and no scan parameters, misses can't be recovered. Set the scan's parameters, or re-import the scan in a format that keeps misses (E57 / structured PLY). A moving-platform scan always needs per-pulse timestamps: its misses are fired from wherever the platform was at each pulse's time.
Timestamps only help if they tell pulses apart. If the GPS time was rounded on export (for example stored as a 32-bit float), several pulses share one time, and a scan pattern rebuilt from them would be wrong. For a static scan, Backfill Misses then ignores the timestamps. It uses the row/column grid if the scan has one, and otherwise places the returns on the declared raster. It tells you it did this. A moving-platform scan with rounded timestamps can't be backfilled. In every case, re-exporting with 64-bit GPS time gives the exact result.
The scanner position is required, not optional
Miss directions are measured from the scanner: each recovered ray is reconstructed as the direction from the scan origin to its return, and the misses are then projected outward from that same apex. Without the true position there is nothing to reconstruct against — the result isn't approximate, it's wrong, and it still looks like a complete miss cloud.
So a scan with the right columns but no recorded position is listed as
ineligible until you set one. Set the scan position (or import scan
parameters / a Helios XML <scan>) first, then run Backfill Misses.
A moving-platform scan is the exception: its per-beam emission origins come from the trajectory, so it doesn't depend on a single static apex.
Where the time column lives
gps_time is a standard LAS dimension, so it exists on every imported
cloud whether or not the source ever recorded per-pulse time — on a plain
x y z r g b intensity file it is present but entirely zero. Backfill
Misses judges a scan by whether the column actually varies, not by
whether it exists, and the Color-by and Filter pickers apply the same
rule: an all-zero time column is hidden, a real one is offered as
Timestamp. A time column imported from ASCII or PLY is stored in that
same LAS field (at full float64 precision — a float32 column would round
GPS-magnitude times to about 32 s), so it shows up as Timestamp in the
pickers, the point picker and exports whatever the source file called it.
Steps¶
- Select the scan(s) in the Scans panel.
- Click Backfill Misses in the Pre-processing group of the toolbar (cloud icon). A setup dialog opens listing the eligible scans, pre-selected from your current selection — like the Triangulation and Leaf Area Density dialogs. Scans that already have misses or can't recover them are noted but excluded.
- Leave Show misses in the viewer after completion on to reveal the recovered points when it finishes (it's disabled automatically when the selected scans have no scanner origin, since misses can't be drawn without one — see the note below).
- Click Backfill Misses. A progress bar shows the per-scan stages (reading the scan, building the cloud, reconstructing misses, storing); it can be canceled. A summary toast reports how many points were recovered.
- When Show misses was on, the "Show misses" toggle on each backfilled scan row turns on automatically and the recovered sky points are drawn (in a distinct color, projected onto the scan's bounding sphere and streamed as a level-of-detail octree, so a dense sky shell stays smooth). Toggle it off once you've confirmed them.
You can also trigger backfill from the Leaf Area Density dialog: when a selected scan has no misses, Compute is disabled and a banner offers a one-click Backfill Misses button. See Estimate leaf area density.
Notes¶
- Backfilling mutates the scan's session in place — it is not an undoable edit. Re-running it simply recomputes the misses.
- The recovered misses are kept in a lightweight side buffer, separate from the scan's points, so a sparse scan that is mostly sky doesn't bloat memory. They aren't exported with the point cloud; they exist to drive (and let you verify) the LAD inversion.
- Cropping a scan after backfilling keeps the recovered misses, and they usually stay exact. LAD feeds cropped-away hits that lie outside the voxel grid back into the inversion, so a crop drawn around the grid — the normal prelude to a per-tree LAD — leaves the beam population untouched and produces no warning. LAD warns when points were deleted from inside the grid (unrepairable — see below), and when the cropped points have left the session altogether. (A crop never deletes sky/miss points themselves; it only removes hits.)
-
Re-running Backfill after a crop does not "recompute against the survivors" — and must not. The reconstruction is a property of the instrument: it rebuilds the scan's angular raster and synthesizes a miss into every cell that has no return. Fed only the survivors of a crop, a pulse whose single return you cropped away would come back as a miss — a fully transmitted beam — when the beam was really extinguished at that deleted hit. If that hit sat in front of the voxel grid, the pulse should not sample the grid at all, whereas a synthesized miss is projected about a kilometer out and rays straight through it. Phytograph therefore restores deleted hits before gap-filling, so a re-run reproduces the scan as measured rather than inventing beams.
This holds while the deleted points are still in the session. Once they are gone — Permanently apply deletions, or a cloud made by split, extract or duplicate — there is nothing left to restore, and gap-filling over what remains recovers the lost pulses as misses instead. That is the one case where re-running Backfill after a crop is the right move, and LAD says so in its warning. - No editing tool ever discards sky/miss points. Crop, erase, filter, segment and split all act on hits alone: a miss sits about a kilometer out along its beam, so it falls outside any region you draw around the canopy, and deleting it on that basis would quietly destroy the transmission denominator LAD depends on. Splitting a cloud keeps the misses with the retained side, and extracting a sub-cloud copies them onto the new cloud, so either result can still be used for LAD. - A very fine scan grid can exceed the gap-fill memory budget. The row/column reconstruction creates one sky point for every empty cell of the scan's angular grid, so the cost is set by the grid resolution — not by how many returns came back. A scan declared at a resolution far finer than its returns actually populate can ask for tens of GB, so Phytograph refuses up front with a message naming the grid size and the estimated memory rather than running the machine out of RAM part-way through. Lower the scan's Ntheta/Nphi to match the data and re-run. - For moving-platform scans, each return's timestamp is joined to the platform trajectory to reconstruct a per-beam emission origin, so the recovered misses follow the flight path rather than fanning from a single static apex. (The row/column grid path doesn't apply to a moving sweep; a per-return timestamp is required.)