Troubleshooting (highlighting and selection)#
Use this page when selection/highlighting does not match your expectation.
Format: Symptom → likely causes → how to confirm → fix → prevention.
Quick triage (start here)#
These checks solve most “it’s broken” reports in under a minute:
Read the line under the Tool buttons. A gesture the app consumed but could not turn into a step explains itself there, in words; the tool’s own gesture, or what it needs first, is the first line of the Selection (i). See What the app tells you below before assuming a tool is broken.
Filters: are you filtering out the cells you expect to see?
Active page: are you on the highlight page you think you are on?
Switching pages changes what is highlighted.
Group enabled: is the group checkbox enabled?
Disabled groups do not contribute to highlighting.
Visible vs total: does the highlight count say “X of Y visible”?
That usually means highlights exist, but are hidden by filters or LOD.
View panel: are you selecting in the right panel (live vs snapshot)?
Modifier keys: are you holding
Altto start a selection gesture?Shift+Alt= add;Ctrl/Cmd+Alt= subtract.On a touch screen there is no
Alt: is Select mode on (its switch, in the Highlighting panel or on the selection bar at the bottom of the plot)? See Select mode (touch screens, or no Alt key).
Tool mode: are you in the tool you think you are in (Lasso vs Proximity vs KNN vs Annotation)?
Annotation additionally needs a coloured field. With none, the panel replaces its
Alt+clickinvitation with the sentence that asks for one; the other three tools never read the active field.
Where you released: did the mouse come up over the plot, or over the sidebar / a notification? A release off the plot abandons the gesture on purpose.
If these do not resolve it, jump to the symptom that matches what you see.
What the app tells you#
Selection tools write one short line under the Tool buttons in the Highlighting panel. That is the only place these messages appear — they are not toasts and there is no message history, because every tool reuses the same one-line slot. Repeating a gesture that fails the same way repaints an identical line rather than stacking a second one.
Two rules hold for every message in the table below:
A gesture that produced no step is not a step. It does not advance the step counter and it does not consume an undo.
Your standing selection survives. The preview highlight is repainted from the candidate set you already had, even though the drag preview wiped it while you were gesturing. The readout above the message tells you which case you are in:
Step N: … current selectionif the gesture interrupted a selection that still stands, or nothing above it if nothing was in progress.
What you see |
What happened |
What to do |
|---|---|---|
“That click did not land on a cell, so there is nothing to select. Zoom in or raise Point size to make cells easier to hit: only the cells the viewer is currently drawing can be clicked.” |
|
Zoom in or raise Point size, then click again. A click hits the dot drawn under the pointer, at the size it is drawn, so a bigger dot is a bigger target. |
“That gesture ended outside the view, so nothing was selected.” |
You released the mouse somewhere other than the plot. The gesture was abandoned deliberately — see the symptom below. |
Repeat the gesture and release over the plot. |
“That gesture was interrupted before it ended, by a second finger or by the browser, so nothing was selected.” |
Select mode: a second finger landed while a one-finger selection was still being drawn (two fingers always zoom and pan), or the browser took the touch over. |
Draw with one finger only, and lift it before pinching or panning. |
“That cell has no value on that panel’s field, so there is nothing to select.” |
Annotation: the clicked cell is missing a value on the field of the panel you pressed, so the rule resolves to no cells. |
Click a cell that has a value, or color that panel by a field that covers it. |
“That panel is not colored by a field, so there is nothing to select.” |
Annotation: the panel you pressed is colored by no field, whatever the focused view is colored by. The gesture is read on the panel you press. |
Color that panel by a field, or select in a panel that has one. |
“That gesture did not change the selection.” |
The gesture resolved to exactly the set you already had. |
Nothing is wrong. Draw elsewhere, or change the modifier key. |
“Color by a field first (Coloring & filtering), then Alt+click a cell.” (first line of the Selection (i)) |
Annotation is selected but no panel on screen is colored by a field, so no press can select anything. |
Choose a categorical or continuous field first. |
Where to look. The pointer was pressed in empty space above the embedding; the explanation appears on the left, under the Tool buttons, where a step readout would otherwise be.#
Which tools report which:
“did not land on a cell” comes from Annotation, KNN drag, and Proximity drag — the tools that need a cell under the pointer to begin. Lasso does not need one, so it never reports this. Proximity reports it only when it cannot place a centre at all; with a candidate set already standing it places one anyway (see the proximity symptom below).
“ended outside the view” comes from all four tools, Lasso included.
Note
These lines are not cleared. A notice stays on screen until some later gesture replaces it, so a line you are reading may describe a gesture from a minute ago. Repeat the gesture you are actually debugging before you trust the line.
Symptom: “Nothing highlights (I created a group but can’t see it)”#
Likely causes (ordered)#
The highlighted cells are filtered out (visibility = 0).
You are on the wrong highlight page.
The group exists but is disabled.
The group exists, but LOD/downsampling makes it hard to see at the current zoom.
You created the group on a different dataset (session/dataset mismatch) and it never restored.
How to confirm#
Look at the highlight count:
if it says “0 of N visible”, the group exists but is not visible right now.
Temporarily disable filters:
if the highlight appears, it was a visibility problem, not a highlight problem.
Switch pages and watch the group list:
if the group list changes, you were on the wrong page.
Check the group checkbox state:
disabled groups appear “inactive”.
Fix#
Disable/relax filters first.
Ensure you are on the intended page tab.
Re-enable the group checkbox.
Zoom in (and/or increase point size, if available) to make the highlight halo easier to see.
Prevention#
Name pages clearly (e.g.,
Control,Treated,Hypothesis A).Save a session after creating important highlights (Session Saving, Restoring, and Sharing).
When selecting, avoid having “surprise filters” active (especially if using categorical selection).
Symptom: “The highlight count says cells are highlighted, but the plot looks unhighlighted”#
Likely causes (ordered)#
Highlight style is subtle relative to your color-by/background/point size.
Only a small fraction of points are highlighted and you are zoomed out.
The highlighted cells are mostly filtered out (so only a few are visible).
How to confirm#
Switch to a simple color-by (or a plain-looking field) temporarily.
Zoom in until points are larger on screen.
Check whether the count says “X of Y visible”.
Fix#
Zoom in; highlights are easiest to see when points are not subpixel-sized.
Adjust display settings (point size/background) if your build exposes them.
Temporarily simplify filters to increase visible highlighted cells.
Prevention#
When validating a selection, use a plain or high-contrast coloring.
Capture “before/after” screenshots when documenting a workflow (Verified highlighting captures).
Symptom: “Lasso selects the wrong cells”#
Likely causes (ordered)#
3D projection ambiguity: lasso selects by screen projection; depth is ambiguous.
You started the lasso in the wrong multi-view panel (grid).
Filters changed between steps; visible set differs.
You intended union/subtract but used intersect (or vice versa) due to modifier keys.
How to confirm#
If you are in 3D: rotate the camera and repeat the same lasso. If the selected set changes a lot, you are seeing projection ambiguity.
If you are in multi-view grid: start the lasso clearly inside the intended panel (not near borders).
Check the step label (it often indicates whether you are intersecting/adding/subtracting).
Watch the preview while you draw. The lasso preview shows the set the release would commit under the modifier you are holding, not the raw contents of the polygon. Drawing with
Shift+Altshows your existing selection plus what the polygon adds; drawing withCtrl/Cmd+Altshows what would be left after the removal. If the preview does not look like the outcome you want, you are holding the wrong modifier — release outside the plot to throw the gesture away rather than committing it.
Fix#
In 3D, use the intended workflow:
lasso once,
rotate substantially,
lasso again with
Altto intersect.
If you need a true “local region” in 3D, try Proximity drag instead of lasso.
In grid multi-view, switch to “Edit selected view” temporarily to reduce panel ambiguity.
Prevention#
Treat lasso in 3D as “projected selection”, not volumetric selection.
Use multi-step intersection for 3D.
Keep lasso gestures fully inside one panel in grid view.
Symptom: “In Select mode I can’t deselect or clear”#
Tapping empty plot never clears anything in Select mode: it selects nothing, changes nothing, and the selection bar says “No cell there. Nothing changed”. What removes a selection depends on whether it is still in progress or saved:
In progress (the selection bar reads “N cells selected” beside Undo, Cancel and Confirm): Cancel discards it, Undo steps back once.
Esccancels it too.Saved to the page (the bar reads “N cells highlighted”): Clear on the bar, or Clear under the page tabs in the Highlighting panel, removes this page’s highlights. Other pages are not touched. To remove one group, use its × in the panel’s list.
Leaving Select mode keeps both: turn either switch off, or press
Escwith nothing in progress.
Symptom: “I can’t start lasso / nothing happens when I draw”#
Likely causes (ordered)#
You are not holding
Alt(lasso mode requiresAlt, or Select mode on a touch screen).You are not in Lasso mode (toolbelt mismatch).
You are in a navigation interaction state (dragging/rotating) and never entered lasso.
Browser/OS intercepts
Altin your environment (rare but possible).
How to confirm#
Look under the Tool buttons first. If the app consumed the gesture and threw it away, it says so there in words. No message at all means the gesture never started, which is a different problem — one of the causes above.
Click the Lasso mode button again.
Hold
Altand look for the cursor change (crosshair) or lasso overlay.Verify in a clean/private window with extensions disabled.
Fix#
Use
Alt+drag(not plain drag).On a touch screen, turn on Select mode (in the Highlighting panel or on the selection bar at the bottom of the plot) and draw with one finger.
If
Alt/Optionis captured, disable the extension or operating-system shortcut that owns the gesture, then activate Lasso and useAlt/Option+drag again.
Prevention#
Learn the mental split:
drag = navigation,
Alt+drag(or a drag with Select mode on) = selection tool.
Symptom: “I drew a lasso, let go, and nothing was selected”#
You released the mouse somewhere other than the plot — over the floating sidebar, over a notification toast that appeared mid-drag, or outside the browser window. The message under the Tool buttons reads:
That gesture ended outside the view, so nothing was selected.
This is deliberate, not a bug#
The render canvas fills the window and the controls float on top of it, so a drag that wanders onto the sidebar keeps appending points to the polygon behind the panel. Committing that release would select cells the sidebar was covering — cells you never saw, let alone enclosed. Cellucid therefore treats the release as belonging to whatever you released over, abandons the gesture, and says so.
The same rule applies to Proximity drag, KNN drag, and Annotation based selection, not only Lasso.
What survives#
Your existing candidate set, exactly as it was: no step was recorded, no undo was spent, and the preview highlight is repainted from it.
The readout above the message:
Step N: … current selectionwhen the gesture interrupted a selection that still stands, or nothing above it when nothing was in progress.
Fix#
Repeat the gesture and make sure the mouse button comes up over the plot.
If a toast keeps landing where you draw, wait for it to clear (or draw in a different part of the plot) before starting the gesture.
Prevention#
Start and finish selection gestures well inside the plot area, away from the sidebar edge and away from where notifications appear.
Symptom: “Proximity selection selects nothing / selects the wrong region”#
Likely causes (ordered)#
You clicked empty space with no candidate set standing, so there was no valid centre and the gesture never started. The app says so: “That click did not land on a cell, so there is nothing to select…”
You clicked empty space with a candidate set standing, so the tool placed a centre anyway — and it is not where you expected. See below.
Your radius is too small (tiny drag) or too large (huge drag).
Filters are hiding nearby cells; selection only considers visible cells.
The camera is far out with Visualization → Performance → Level of detail (LOD) enabled. The seed
Alt+clickpicks the cell under the pointer, and it can only land on a cell the view is actually drawing — so a zoomed-out camera can refuse a click over a region that does have cells in it. Only the seed click is affected; the drag that follows still evaluates every unfiltered cell (Highlight mental model).You expected screen-space selection; proximity is embedding-space distance.
How to confirm#
Read the line under the Tool buttons: a refused click names itself; a click that places a centre anyway does not.
Start by
Alt+clickdirectly on a clearly visible cell (zoom in).Drag slowly and watch the overlay radius.
Temporarily disable filters and try again.
If a click is refused only when zoomed out, zoom in and seed again — or turn Level of detail (LOD) off for the seed click.
Clicking empty space (what the centre actually is)#
When you Alt+click empty space and a candidate set already exists, the centre
is not the centroid of that selection. It is the point where your click ray
crosses the plane that passes through the centroid facing the camera — in
effect, where you clicked, at the selection’s depth. That is what makes
“grow/shrink around the current selection” work in 3D without picking a cell
first, and it is why the resulting blob is centred on your pointer rather than
on the selection.
Fix#
Zoom in and click on a cell to set a stable center.
Use small drags first; increase radius gradually.
If you need geometric control in screen space, use lasso; if you need embedding-space locality, use proximity.
Prevention#
Use proximity for “local blob around a seed”, not for “draw around this shape”.
Avoid selecting with proximity when the view is heavily filtered unless that is your intention.
Symptom: “KNN drag says no neighbor graph is available (or does nothing)”#
Likely causes (ordered)#
Your dataset holds no neighbour graph (
obsp).Edges exist but are not loaded yet (often loaded when you enable “Show edges”).
You are using a data loading mode that doesn’t provide connectivities.
How to confirm#
Look for an edges/graph toggle (e.g., “Show edges”) and enable it.
If there is an edges overlay, confirm you can see edges.
If you cannot enable edges, assume connectivities are missing.
If the line under the Tool buttons instead reads “That click did not land on a cell…”, the graph is not the problem: your
Alt+clickmissed every point. Zoom in and seed the drag again.
Fix#
Write your dataset again including connectivities (
obsp['connectivities']), if you control how it is written.Use lasso/proximity/annotation-based selection if you cannot load a graph.
Prevention#
For KNN workflows, treat “connectivities present” as a prerequisite and document it explicitly.
Symptom: “Annotation selection selects nothing / too many / too few cells”#
Likely causes (ordered)#
No panel on screen is colored by a field, so the tool has nothing to read. The panel says so in place of the usual invitation, and a press selects nothing.
Filters are hiding part of the category/range (selection only considers visible cells).
You are selecting on a different field than you think. In a grid of views the gesture reads the field of the panel you press, not the focused view’s.
The field has missing values or extreme distribution (continuous).
You expected “Alt = intersect” but on categorical fields it behaves like “replace”.
How to confirm#
Confirm the field of the view you click in (its legend; focus that view to see it in the field selector).
Temporarily disable filters and repeat the selection.
Try a known categorical field with obvious labels (e.g.,
cell_type) to validate semantics.If nothing at all is selected, read the line under the Tool buttons and the first line of the Selection (i). Three states are reported and they mean different things:
“Color by a field first…” (in the (i)) replaces the usual
Alt+clickline whenever no panel on screen is colored by a field. No press can select anything in that state, so there is nothing to debug beyond choosing a field.“That panel is not colored by a field…” means the panel you pressed has no field, though another panel on screen does. Press in that one, or color this one.
“That cell has no value on that panel’s field, so there is nothing to select.” means the field is fine but the cell you clicked is missing a value on it. Click a different cell.
Fix#
If the panel is asking for a field, choose a Categorical obs or Continuous obs entry under Coloring & filtering;
Alt+clickworks from that moment on.For categorical:
use
Altto replace,Shift+Altto add,Ctrl/Cmd+Altto subtract.
For continuous:
use
Alt+dragto tune the range,intersect with lasso/proximity if you need geometry constraints.
Prevention#
Don’t do annotation-based selection while actively changing color-by/fields; treat the active field as part of the selection “spec”.
Symptom: “Selection is delayed / laggy”#
Likely causes (ordered)#
You are selecting on a very large dataset (CPU-heavy selection preview).
You are in multi-view with many panels (more rendering/overhead).
You have huge highlight groups already; toggling/recomputing is expensive.
Browser/GPU constraints (integrated GPU, low memory, heavy background tabs).
How to confirm#
Does lag correlate with dragging (lasso/proximity/KNN preview) rather than simple clicks?
Does lag disappear if you disable filters and reduce to one view panel?
Does lag correlate with enabling/disabling groups?
Fix (safe first)#
Reduce the visible set with filters (counterintuitive but effective): fewer visible cells → fewer selectable candidates.
Use fewer snapshot panels (temporarily).
Prefer tools that do less repeated preview scanning:
use shorter gestures,
confirm sooner,
avoid long “slow drags”.
Reload the page and restore a session if needed.
Prevention#
For very large datasets, plan for performance:
avoid “live preview while dragging for 10 seconds” workflows,
keep highlight groups coarse and few,
save sessions at milestones.
Symptom: “Highlights disappear when switching views/pages (or after reload)”#
Likely causes (ordered)#
You switched highlight pages (different groups).
You are looking at a snapshot view with different filters (highlights exist but are not visible there).
You reloaded without restoring a session (highlights are not auto-persisted in URLs).
You restored a session on the wrong dataset and the complete operation was rejected.
How to confirm#
Check the active page tab and group list.
Check whether the highlight count says “X of Y visible”.
If you restored a session, check whether it reached terminal Session fully restored.
Fix#
Switch to the intended highlight page.
Disable/relax filters in the view you are looking at.
Restore the correct session on the correct dataset.
Prevention#
Treat highlights as part of the session artifact: save sessions intentionally.
Use clear page names and avoid “Page 1 / Page 2” once you have real work.
Symptom: “My highlights didn’t restore from a session”#
Likely causes (ordered)#
Dataset identity or exact-format validation rejected and rolled back the complete restore.
Session progress is still active; lazy highlight memberships are inside the same awaited operation.
The exact current session was saved without those highlights.
How to confirm#
Require terminal Session fully restored, not merely an eager visual change.
If progress remains active, let it finish or press Cancel.
Read any identity, format, or chunk error; no partial result is committed.
Fix#
Load the session on the dataset it was created from.
Write a fresh session file with Share… if exact-format validation fails.
To redo the work on a changed dataset, replay the old file’s steps by name (Load… › Replay a session file here…); steps that name cells by position are flagged, not applied.
If you must change the dataset, you must recreate highlights (indices won’t match).
Prevention#
Keep dataset IDs stable and avoid reordering cells between versions of a dataset if you rely on highlights.
Save “milestone sessions” before heavy editing.
Symptom: “Python highlight doesn’t show in the UI” (Jupyter integration)#
Likely causes (ordered)#
The page is not a viewer opened by Python (no viewer channel active).
The viewer channel is not open: Python no longer knows this viewer (it was stopped, or the kernel restarted), or — for a browser-tab viewer — a proxy between the page and the server does not pass WebSockets (
/_cellucid/ws). The viewer shows a Viewer stopped or Viewer disconnected notification.Dataset/index mismatch (Python indices refer to different cells than the viewer).
How to confirm#
Confirm you are using the viewer workflow: a notebook widget (
show_anndata), or a browser tab opened at the viewer’s own URL (viewer.viewer_url, with?viewer=true&viewerId=…&viewerToken=…in its address).Run
viewer.debug_connection()in a new cell and checkchannel_connected.Try a simple action and collect its answer (e.g.,
request = viewer.color_by(field=...), thenrequest.result()in a later cell) to validate communication.Follow the connection checks in Troubleshooting (hooks).
Fix#
Run the cell that shows the viewer again (or, for a browser tab, use the viewer URL the server printed), and make any proxy in between pass WebSockets.
Ensure the dataset order in Python matches the dataset loaded in the viewer.
Prevention#
When using Python control, treat “cell index = identity” and keep ordering stable.
Prefer a dataset file with a stable id (
prepare(dataset_id=...)) for reproducibility.
When to file a bug report#
If you believe you hit a real bug (not one of the expected edge cases), include:
The exact text of the line under the Tool buttons at the moment it went wrong — or “no message at all”, which is itself a useful report
Browser + OS (and whether you’re on a laptop with integrated GPU)
Dataset format and rough size (
n_cells,n_genes, whether connectivities exist)Whether multi-view snapshots are enabled (and how many)
Exact selection tool used + exact modifier keys held
Whether filters were active
A minimal reproduction recipe (click-by-click)
Screenshots with callouts:
use Verified highlighting captures for capture specs