diff --git a/_includes/snt-modes b/_includes/snt-modes new file mode 100644 index 0000000000..20c5e19d3c --- /dev/null +++ b/_includes/snt-modes @@ -0,0 +1,14 @@ +{%- comment -%} +Defines {{ crop }} and {{ stream }}, the inline icons that mark SNT features +restricted to one kind of tracing canvas. Include once, at the top of a page: + + {% include snt-modes %} + +crop: requires an image loaded in memory (classic canvas or a stream-mode crop) +stream: SNT Stream only + +Variables assigned in an include persist in the including page, so they can be +used anywhere below it +{%- endcomment -%} +{%- capture crop -%}{%- endcapture -%} +{%- capture stream -%}{%- endcapture -%} diff --git a/_pages/editing/index.md b/_pages/editing/index.md index 76e0201a89..bdfa07eda4 100644 --- a/_pages/editing/index.md +++ b/_pages/editing/index.md @@ -263,6 +263,7 @@ The following tables list all of this site's general-purpose includes: | [timeline](timelines) | Insert a horizontal timeline | | [tooltip](tooltips) | Add a tooltip appearing on mouseover | | [echo](debugging) | For debugging | +| [snt-modes](/plugins/snt/key-shortcuts) | Define the crop/stream icons of SNT | {:.skinny} #### MARKED FOR REMOVAL diff --git a/_pages/plugins/snt/analysis.md b/_pages/plugins/snt/analysis.md index f31726c2ad..fa871c54d2 100644 --- a/_pages/plugins/snt/analysis.md +++ b/_pages/plugins/snt/analysis.md @@ -270,7 +270,7 @@ The analysis can be performed from the [Analysis menu](/plugins/snt/manual#root- Growth Analysis provides detailed time-lapse analysis of neuronal patterns and requires traced paths to be matched across time frames, as detailed in the [Time-lapse analysis](./walkthroughs#time-lapse-analysis) walkthrough. The Analysis is accessed through the [Path Manager](./manual#path-manager)'s [Time-lapse Utilities](./manual#time-lapses-) menu. {% capture timelapse-demo%} -For parameter validation and configuration comparisons, load the _Hippocampal neuron (DIC timelapse)_ demo dataset ({% include bc path='File|Load Demo Dataset...' %}) +For parameter validation and configuration comparisons, load the _Hippocampal neuron (DIC timelapse)_ demo dataset ({% include bc path='File|Load Demo Dataset/Tutorial...' %}) {% endcapture %} {% include notice icon="info" content=timelapse-demo %} diff --git a/_pages/plugins/snt/auto-tracing.md b/_pages/plugins/snt/auto-tracing.md index aaaab2c3e2..15c7133d47 100644 --- a/_pages/plugins/snt/auto-tracing.md +++ b/_pages/plugins/snt/auto-tracing.md @@ -42,7 +42,7 @@ For technical implementation details and references, see the [SNT technical note {% capture op1-demo%} -You can follow these instructions using {% include bc path='File|Load Demo Dataset...' %} and choosing either 1) the _Drosophila OP neuron_, a Drosophila olfactory projection neuron and respective ground truth reconstruction (single cell); or the _Microglia cells_ dataset, a 2D image with multiple ramified microglia in the mouse retina. +You can follow these instructions using {% include bc path='File|Load Demo Dataset/Tutorial...' %} and choosing either 1) the _Drosophila OP neuron_, a Drosophila olfactory projection neuron and respective ground truth reconstruction (single cell); or the _Microglia cells_ dataset, a 2D image with multiple ramified microglia in the mouse retina. {% endcapture %} {% include notice icon="info" content=op1-demo %} @@ -334,7 +334,7 @@ The algorithm works by first skeletonizing the segmented image to extract its to {% capture ddac-demo%} -You can follow these instructions using {% include bc path='File|Load Demo Dataset...' %} and choosing the _Drosophila ddaC neuron (Autotrace demo)_. It will load a binary (thresholded) image of a Drosophila space-filling neuron (ddaC) displaying autotracing options for automated reconstruction. +You can follow these instructions using {% include bc path='File|Load Demo Dataset/Tutorial...' %} and choosing the _Drosophila ddaC neuron (Autotrace demo)_. It will load a binary (thresholded) image of a Drosophila space-filling neuron (ddaC) displaying autotracing options for automated reconstruction. {% endcapture %} {% include notice icon="info" content=ddac-demo %} diff --git a/_pages/plugins/snt/big-data.md b/_pages/plugins/snt/big-data.md index 8d15cfe4af..6c9a19e20f 100644 --- a/_pages/plugins/snt/big-data.md +++ b/_pages/plugins/snt/big-data.md @@ -17,7 +17,7 @@ tags: snt,tracing,segmentation,neuroanatomy,big-data,snt-stream # Big Data Support SNTv5 implemented _preliminary_ support for big data: images too large to fit in CPU/GPU memory (BDV XML/HDF5, N5, and OME-Zarr/OME-NGFF containers) can be opened virtually and browsed or reconstructed without ever loading the full volume. -Most of this support is provided through [Big Data Viewer](./manual#big-data-viewer) and [Big Volume Viewer](./manual#big-volume-viewer). +Most of this support is provided through [Big Data Viewer](./manual#big-data-viewer) and [Big Volume Viewer](./manual#big-volume-viewer). Tracing on streamed images is handled by [SNT Stream](./snt-stream), which is the page to read once data is loaded. The following operations are currently supported: | Operation | Status | Comments | @@ -28,6 +28,7 @@ The following operations are currently supported: | [Path optimization](./manual#refinefit-) | Supported | | | 3D Visualization: Interactive re-slicing browser | Supported via [BigDataViewer](./manual#big-data-viewer) | | | 3D Visualization: Interactive volume viewer | Supported via [BigVolumeViewer](./manual#big-volume-viewer) and [sciview](./manual#sciview) | Includes [Slab View](#slab-view) for restricting rendering to a thin, adjustable region of the volume | +| Stream-specific workflows | Supported (experimental) | [Materialized crops](./snt-stream#materialized-crops), [channel unmixing](./snt-stream#channel-unmixing), and [Quick Connect](./snt-stream#editing): see [SNT Stream](./snt-stream) | | Multidimensional operations | Limited support | Tracing handles one active channel/frame at a time for performance reasons. Commands that require exposing all channels/frames to be available at once [may not be supported](#limitations-and-idiosyncrasies) | 1For collaborative tracing, please use [HortaCloud](https://hortacloud.org/): This is SNT's development team recommended tool for tracing Terabyte-size datasets in a collaborative environment @@ -39,19 +40,32 @@ The following operations are currently supported: Choose _Big Data..._ from the [Shortcuts Window](./manual#snt-commands). In the prompt you can specify: -- **Main volume**: The local path _or_ remote URL to the primary image volume. Supported files include: standard files, IMS, BDV XML/HDF5, N5, and OME-Zarr/OME-NGFF containers +- **Main volume**: The local path _or_ remote URL to the primary image volume. See [Supported File Formats](#supported-file-formats) for the formats that are directly supported, and for what happens if the volume is not a multi-resolution pyramid -- **Secondary volume**: The local path _or_ remote URL to a second, optional image volume. Useful for loading a processed version of the main volume, or a secondary channel saved as a separated file +- **Secondary volume**: Optional. The local path _or_ remote URL to a second image volume. Useful for loading a processed version of the main volume, or a secondary channel saved as a separate file -- **Reconstruction file(s)**: Optional. Either a single file ([TRACES, SWC, JSON, etc.](./manual#load-tracings-)), or a folder containing multiple reconstruction files. Reconstructions can also be [imported later](./manual#load-tracings-). Remote URLs are also supported. +- **Reconstruction file(s)**: Optional. Either a single file ([TRACES, SWC, JSON, Neurolucida XML](./manual#load-tracings-)), or a folder/.zip archive of several such files. Coordinates are assumed to be properly scaled: use the _Import_ commands if an offset/scaling factor is needed. Reconstructions can also be [imported later](./manual#load-tracings-) when tracing is enabled -- **Markers file**: Optional. A CSV file containing [bookmarked](./manual#bookmarks-tab) locations. Markers can also be imported later on. Remote URLs are also supported. +- **Markers file**: Optional. A CSV file containing [bookmarked](./manual#bookmarks-tab) locations. Markers can also be imported later on -- **Viewer type**: Defines the viewer type. Either: - - **Big Data Viewer (BDV): Interactive reslicing**: Interactive re-slicing browser - - **Big Volume Viewer (BVV): 3D rendering**: Interactive volume viewer, no tracing - - **Big Volume Viewer (BVV): 3D rendering w/ tracing capabilities**: Same as _Big Volume Viewer (BVV): 3D rendering_, but a new SNT instance is initialized as **[SNT Stream](./snt-stream)**, turning the BVV viewer into a functional tracing canvas - - **Big Data Viewer (BDV): Interactive reslicing w/ tracing capabilities**: A fallback option to the previous choice for when no discrete graphics card is available, or SNT is running on hardware without GPU support +- **Seeds file**: Optional. A CSV file with candidate tracing [seeds](./seeds). Requires _Enable tracing (SNT Stream)_ + +- **Viewer type**: Either **Big Data Viewer (BDV)**, an interactive re-slicing browser, or **Big Volume Viewer (BVV)**, a 3D volume renderer. The main differences are: + + | | **Big Volume Viewer (BVV)** | **Big Data Viewer (BDV)** | + |---|---|---| + | **Display** | 3D volume rendering | Interactive reslicing | + | **Hardware** | Discrete graphics card recommended | No GPU needed | + | **[Slab View](#slab-view)** | Available | N/A | + | **[Channel unmixing](./snt-stream#channel-unmixing)** | Computed per slab | Live | + + Choose BVV for sparsely labeled data, modern hardware, and a fast disk or network connection. Choose BDV for dense, feature-rich images, modest hardware, or slow connections. + +- **Enable tracing (SNT Stream)**: If checked, the viewer becomes the main tracing canvas (see [SNT Stream](./snt-stream)). If not, a plain, lightweight viewer is opened with no SNT session attached + +- **Load Remote Demo**: Pre-fills all fields with a remote demo (marmoset neurons, OME-Zarr, with autotracings and soma markers, using BVV with tracing enabled) + +All inputs can be local paths or remote URLs (including http and s3 links). Only _Main volume_ is mandatory. {% include notice icon="info" content="**[SNT Stream](./snt-stream) remains experimental**." %} @@ -71,9 +85,11 @@ Slab View restricts BVV's rendering to a thin, adjustable region of the volume, Also, it may reduce data fetched from remote sources, depending on BVV's internal caching behavior. It is a general rendering feature, available in _Scene Controls_ whenever a BVV canvas is open, even outside active [SNT Stream](./snt-stream) tracing sessions. -- **Controls**: toggle with the _Slab View_ button; a _Position_ slider moves the slab through the volume, and a _Thickness_ spinner controls how much of the volume is included around that position -- **Orientation**: Slab View must be activated from one of the three canonical planes (XY/XZ/ZY), needed to give the slab an initial axis to work from. Once active, the view can be freely rotated; Slab View only turns itself off if the volume genuinely rotates out of the visible slab -- **Slab Paths / Slab Annotations**: optional toggles that restrict rendered reconstructions/markers to the same slab window, so paths outside the slab don't clutter the view. _Slab Paths_' on/off state is remembered as a preference across Slab View activations; _Slab Annotations_ resets each time +1. Align the view to one of the three canonical planes (XY, XZ, or ZY) and toggle **Slab View**. The canonical plane gives the slab an initial axis to work from: once active, the view can be freely rotated +2. Set the slab's **Thickness** with the spinner, and move it through the volume with the **Position** slider (or its spinner). Both are in calibrated units +3. Toggle **Slab Paths** to hide paths outside the slab. This also improves performance on large datasets. Equivalently, **Slab Annotations**, in the toolbar of the Bookmark Manager, restricts the markers to the slab. _Slab Paths_' on/off state is remembered as a preference across Slab View activations; _Slab Annotations_ resets each time + +Slab View switches itself off if the view no longer intersects the slab, and when the view is reset. It is also required by [channel unmixing](./snt-stream#channel-unmixing) of multi-resolution data. ## Supported File Formats @@ -81,3 +97,18 @@ It is a general rendering feature, available in _Scene Controls_ whenever a BVV Imaris (.ims) files are supported via an automatically generated BDV-XML sidecar written next to the original file. For genuinely large datasets, BDV XML/HDF5, N5, and OME-Zarr/OME-NGFF containers are opened virtually: data is streamed from disk in blocks as needed. N5 and Zarr containers are read directly, with no XML sidecar required. Remote data can be also be loaded using URLs. + +### Non-pyramidal and oversized volumes + +BVV's 3D renderer requires a multi-resolution pyramid, and a single GPU texture has size limits. If the _Main volume_ does not satisfy these and BVV is chosen, SNT prompts you for how to proceed: + +- **Non-pyramidal N5/Zarr**: Choose _Build Pyramid_ to have SNT compute the coarser levels on demand (volumes that fit in memory are first copied locally, which may take a while for remote datasets) +- **Image too large for a single GPU texture**: This happens when a dimension exceeds the 3D texture limit of your graphics card, or when the volume has too many voxels per channel. You can choose between: + - _Downsample_: Shrinks the image so that it fits. Opens quickly, but fine detail is lost + - _Load at full resolution_: Loads every voxel into memory as a tiled pyramid. Requires substantial memory, and is a rendering only: it cannot be used for tracing + - _Convert to multi-resolution OME-Zarr_: Writes an OME-Zarr folder next to the original image and opens it. May take several minutes, but the result is streamed from disk, so it opens quickly and needs little memory + +## See Also + +- [SNT Stream](./snt-stream): Tracing on streamed data, differences from in-core tracing, channel unmixing, materialized crops, and editing +- [Key Shortcuts](./key-shortcuts): Shortcuts for both traditional and streamed canvases diff --git a/_pages/plugins/snt/delineations.md b/_pages/plugins/snt/delineations.md index c0a40b781b..45bf148266 100644 --- a/_pages/plugins/snt/delineations.md +++ b/_pages/plugins/snt/delineations.md @@ -29,7 +29,7 @@ Delineations aggregate sections of reconstructions into groups to allow measurin {% capture ml-demo %} You can use the _MouseLight dendrites_ demo dataset to follow the delineation tutorials. While this dataset does not include counterstaining images, it can still be used for both ROI-based and Atlas-based delineations: -1. Open {% include bc path='File|Load Demo Dataset...' %} and choose _MouseLight dendrites (Reconstructions only)_ +1. Open {% include bc path='File|Load Demo Dataset/Tutorial...' %} and choose _MouseLight dendrites (Reconstructions only)_ 2. Right-click on the _Display Canvas_ and choose _Pause SNT_ from the contextual menu 3. Follow the instructions below {% endcapture %} diff --git a/_pages/plugins/snt/key-shortcuts.md b/_pages/plugins/snt/key-shortcuts.md index 4032b7ae9d..47f599b914 100644 --- a/_pages/plugins/snt/key-shortcuts.md +++ b/_pages/plugins/snt/key-shortcuts.md @@ -11,6 +11,7 @@ forum-tag: snt update-site: Neuroanatomy --- +{% include snt-modes %} {% capture version%} **This page was last revised for [version 5.0.13](https://github.com/morphonets/SNT/releases)**. {% endcapture %} @@ -28,35 +29,54 @@ The [Command Palette](manual#command-palette) ({% include key keys='ctlcmd|Shift {% include notice icon="info" content=text %} +{% capture legend %} +Unless marked, shortcuts work in all tracing canvases: the classic XY/ZY/XZ views and [SNT Stream](./snt-stream) (BDV/BVV). Marked shortcuts are limited to one of them: + +| {{ crop }} | Requires an image loaded as an ImagePlus: the classic canvas, or a _materialized crop_ in [Stream Mode](./snt-stream) | +| {{ stream }} |Stream Mode only | + +In Stream Mode, BDV/BVV's own shortcuts are retained unless noted otherwise. The full list of active shortcuts can be accessed from the options drop-down menu of the _Scene Controls_ widget of BDV/BVV. +The [Legacy 3D Viewer](#legacy-3d-viewer) does not support most of the shortcuts listed here. +{% endcapture %} +{% include notice icon="info" content=legend %} + + ### Interactive Prompt -| {% include key key='C' %} | Cancels a path. Note that you can finish a path by pressing {% include key key='N' %} {% include key key='N' %} twice | -| {% include key key='F' %} | Finishes a path. Note that you can finish a path by pressing {% include key key='Y' %} {% include key key='Y' %} twice or using {% include key keys='Double Click' %}| -| {% include key key='N' %} | Discards the current temporary path. *Mnemonic: No* | -| {% include key key='Y' %} | Confirms the current temporary path. *Mnemonic: Yes* | -| {% include key key='Esc' %}| Aborts current operation / Exits current mode | +| {% include key key='C' %} | {{ crop }} Cancels a path. Note that you can finish a path by pressing {% include key key='N' %} {% include key key='N' %} twice | +| {% include key key='F' %} | {{ crop }} Finishes a path. Note that you can finish a path by pressing {% include key key='Y' %} {% include key key='Y' %} twice or using {% include key keys='Double Click' %}| +| {% include key key='N' %} | {{ crop }} Discards the current temporary path. *Mnemonic: No* | +| {% include key key='Y' %} | {{ crop }} Confirms the current temporary path. *Mnemonic: Yes* | +| {% include key key='Enter' %} | {{ stream }} Finishes the temporary path (same as {% include key key='Double Click' %} while tracing; otherwise, a double click centers the view) | +| {% include key key='Esc' %}| Aborts current operation / Discards the temporary path / Exits current mode | +| {% include key key='Z' %} | Undo last segment (temporary paths) | ### Navigation and Zoom -| {% include key key='Shift' %} | Synchronizes XY, ZY, and XZ views while moving the cursor when not using cursor snapping | -| {% include key key='+' %} / {% include key key='-' %} | Zooms in/out (Simultaneously on all views) (IJ default) | -| {% include key key='4' %} | Displays tracing view(s) at original scale (IJ default) | -| {% include key key='5' %} | Displays tracing view(s) at 100% (IJ default) | -| {% include key key='Spacebar' %} | Activates the Pan (Hand) tool (IJ default) | -| {% include key key='>' %} / {% include key key='<' %} | Previous/Next Z-slice, or Previous/Next channel, depending on the *Reverse CZT order of ">" and "<"* choice set in IJ's {% include bc path='Edit|Options|Misc...'%} prompt (IJ default) | -| {% include key key='enter' %} | Shuttles the window focus between the tracing image and the SNT window | -| {% include key key='Ctrl|Tab' %} {% include key key='Ctrl|Shift|Tab' %} | Activates the next/previous tab in the main SNT window | +| {% include key key='Shift' %} | {{ crop }} Synchronizes XY, ZY, and XZ views while moving the cursor when not using cursor snapping | +| {% include key key='+' %} / {% include key key='-' %} | {{ crop }} Zooms in/out (Simultaneously on all views) (IJ default) | +| {% include key key='4' %} | {{ crop }} Displays tracing view(s) at original scale (IJ default) | +| {% include key key='5' %} | {{ crop }} Displays tracing view(s) at 100% (IJ default) | +| {% include key key='Spacebar' %} | {{ crop }} Activates the Pan (Hand) tool (IJ default) | +| {% include key key='>' %} / {% include key key='<' %} | {{ crop }} Previous/Next Z-slice, or Previous/Next channel, depending on the *Reverse CZT order of ">" and "<"* choice set in IJ's {% include bc path='Edit|Options|Misc...'%} prompt (IJ default) | +| {% include key key='Enter' %} | {{ crop }} Shuttles the window focus between the tracing image and the SNT window | +| {% include key key='Ctrl|Tab' %} {% include key key='Ctrl|Shift|Tab' %} | {{ crop }} Activates the next/previous tab in the main SNT window | +| {% include key keys='Ctrl/Cmd|G' %} | {{ stream }} Prompts for a location to fly to | -### Path Handling +### Path Selection and Visibility -| {% include key key='1' %} | Toggles the first visibility filter: Whether all traced paths should be displayed or just selected ones | -| {% include key key='2' %} | Toggles the second visibility filter: Whether all nodes should be displayed across the Z-stack or just those in nearby Z-slices | -| {% include key key='3' %} | Toggles the third visibility filter: Whether paths from all channels/frames should be displayed or just those in the active channel/frame | | {% include key key='G' %} | Grabs the nearest path to the mouse cursor. Holding {% include key keys='Shift|G' %} adds the nearest path to the current selection. Note that Paths can only be edited one at a time, and thus {% include key keys='Shift|G' %} is disabled in *Edit Mode* | +| {% include key keys='Alt|G' %} | Deselects the last selected path (nothing remains selected if only one path was selected) | +| {% include key keys='Shift|Alt|G' %} | Deselects all paths (*Select None*) | | {% include key key='H' %} | Temporarily Hides all paths/annotations while pressed | -| {% include key key='O' %} | Temporarily shows path Orientations (start→end direction) while pressed | +| {% include key key='O' %} | {{ crop }} Temporarily shows path Orientations (start→end direction) while pressed | +| {% include key key='1' %} | {{ crop }} Toggles the first visibility filter: Whether all traced paths should be displayed or just selected ones | +| {% include key key='2' %} | {{ crop }} Toggles the second visibility filter: Whether all nodes should be displayed across the Z-stack or just those in nearby Z-slices | +| {% include key key='3' %} | {{ crop }} Toggles the third visibility filter: Whether paths from all channels/frames should be displayed or just those in the active channel/frame | + +Path (de)selection shortcuts are disabled in *Edit Mode*, in which a single path is always selected. ### Tracing @@ -64,35 +84,51 @@ The [Command Palette](manual#command-palette) ({% include key keys='ctlcmd|Shift These shortcuts are available when running SNT in *Tracing Mode*: | {% include key key='L' %} | Toggles Tracing/Filling on Secondary Layer (filtered image) | -| {% include key key='V' %} | Finds the brightest Voxel above and below the current x,y position and automatically clicks on it. If multiple maxima exist, their average positioning is used. Note that this feature assumes that neurites are brighter than the background | -| {% include key key='S' %} | Toggles cursor Snapping: If enabled, the plugin will automatically move the cursor to the brightest voxel within the specified x,y,z snapping window1. When set correctly, this facilitates accurate [positioning of path points](/plugins/snt/walkthroughs#accurate-point-placement) | -| {% include key key='Z' %} | Undo last segment (temporary paths) | -| {% include key keys='Ctrl|Mouse Wheel' %} | Change diameter of path being traced | +| {% include key key='V' %} | {{ crop }} Finds the brightest Voxel above and below the current x,y position and automatically clicks on it. If multiple maxima exist, their average positioning is used. Note that this feature assumes that neurites are brighter than the background | +| {% include key key='S' %} | {{ crop }} Toggles cursor Snapping: If enabled, the plugin will automatically move the cursor to the brightest voxel within the specified x,y,z snapping window. When set correctly, this facilitates accurate [positioning of path points](/plugins/snt/walkthroughs#accurate-point-placement) | +| {% include key key='P' %} | {{ stream }} Picks the structure under the cursor as a representative structure (e.g., for the _Pick Sigma(s)_ palette) | +| {% include key key='Spacebar' %} | {{ stream }} A quick tap toggles tracing on/off; holding it disables tracing for as long as it is pressed | +| {% include key keys='Ctrl|Mouse Wheel' %} | {{ crop }} Change diameter of path being traced | | {% include key keys='Alt|Shift|Left Click' %} | Selects a point along the active path to be used as forking point (See [step-by-step instructions](/plugins/snt/walkthroughs#branching-start-a-path-on-an-existing-path) for more details on joining and branching). This shortcut can be [simplified](/plugins/snt/manual#temporary-paths) | -| {% include key keys='Shift|B' %} | Bookmarks cursor location | | {% include key keys='Shift|E' %} | Activates *Edit Mode* (Editing of selected Path) | -| {% include key keys='Shift|P' %} | Pauses tracing operations | -| {% include key keys='Ctrl|S' %} / {% include key keys='Command|S' %} | Save tracings | -| {% include key key='Ctrl|Shift|S' %} / {% include key keys='Command|Shift|S' %} | Backup tracings | -| {% include key key='Ctrl|Shift|O' %} / {% include key keys='Command|Shift|O' %} | Save tracings & Open Next Image | -| {% include key key='Ctrl|Alt|O' %} / {% include key keys='Command|Alt|O' %} | Save tracings & Open Previous Image | +| {% include key keys='Shift|P' %} | {{ crop }} Pauses tracing operations | +| {% include key keys='Ctrl|S' %} / {% include key keys='Command|S' %} | {{ crop }} Save tracings | +| {% include key key='Ctrl|Shift|S' %} / {% include key keys='Command|Shift|S' %} | {{ crop }} Backup tracings | +| {% include key key='Ctrl|Shift|O' %} / {% include key keys='Command|Shift|O' %} | {{ crop }} Save tracings & Open Next Image | +| {% include key key='Ctrl|Alt|O' %} / {% include key keys='Command|Alt|O' %} | {{ crop }} Save tracings & Open Previous Image | + + +### Bookmarks and Analysis + +| {% include key keys='Shift|B' %} | {{ crop }} Bookmarks cursor location. Not used in Stream Mode because it collides with BDV/BVV native bookmark support | +| {% include key key='M' %} | {{ stream }} Marks cursor location | +| {% include key keys='Shift|Alt|A' %} | Sholl analysis at nearest node | +| {% include key key='K' %} | {{ stream }} Records a Key frame ({% include key keys='Shift|K' %} clears the frames recorded so far) | +| {% include key keys='Shift|S' %} | {{ stream }} Saves a Screenshot (BVV only) | +| {% include key keys='Ctrl|Shift|P' %} / {% include key keys='Command|Shift|P' %} | Toggle Command Palette | + ### Path Editing -These shortcuts become available in *Edit Mode*, activated through the contextual menu (displayed with {% include key keys='Right Click' %} on a tracing canvas), or by pressing {% include key keys='Shift|E' %}: +These shortcuts become available in *Edit Mode*, activated through the contextual menu (displayed with {% include key keys='Right Click' %} on a tracing canvas), or by pressing {% include key keys='Shift|E' %}. When active, tracing is suspended and the node under the cursor is the active node: -| {% include key key='B' %} | Brings active node to current Z-plane | +| {% include key key='B' %} | {{ crop }} Brings active node to current Z-plane | | {% include key key='C' %} | Connects highlighted nodes (see *Connect to Help...* in contextual menu) | +| {% include key key='Shift|C' %} | {{ stream }} Quick Connects nodes (see *Connect to Help...* in contextual menu) | | {% include key key='D' %} | Deletes the active node | | {% include key key='I' %} | Inserts a new node at cursor position | | {% include key key='L' %} | Locks active node to prevent accidental editing | | {% include key key='M' %} | Moves active node to cursor position | -| {% include key key='P' %} | Toggle Paint Mode for brush editing | +| {% include key key='P' %} | {{ crop }} Toggle Paint Mode for brush editing | | {% include key key='R' %} | Changes the Radius of active node | +| {% include key key='T' %} | Tags the active node (assigns it a unique color) | | {% include key key='X' %} | Splits tree at active node, re-rooting the selected structure at the active node | | {% include key key='Z' %} | Undo last operation | -| {% include key keys='Ctrl|Mouse Wheel' %} | Adjust node radius / brush size (Paint Mode) | -| {% include key keys='Alt|Drag' %} | Move node / blend radii (Paint Mode) | +| {% include key key='Esc' %} | Exits *Edit Mode* | +| {% include key keys='Ctrl|Mouse Wheel' %} | {{ crop }} Adjust node radius / brush size (Paint Mode) | +| {% include key keys='Alt|Drag' %} | {{ crop }} Move node / blend radii (Paint Mode) | + +Commands without an equivalent in Stream Mode (e.g., paint mode) are disabled in its contextual menu. ### Reconstruction Viewer @@ -115,22 +151,6 @@ These shortcuts become available in *Edit Mode*, activated through the contextua | {% include key keys='Shift|S' %} | Toggle Status Bar | | {% include key keys='Ctrl|Shift|P' %} / {% include key keys='Command|Shift|P' %}| Toggle Command Palette | -### SNT Stream - -[SNT Stream](./snt-stream) maintains the defaul shortcuts of [BDV](/plugins/bdv/)/BVV. In addition, the following are available1: - -| {% include key key='H' %} | Temporarily Hides all paths/annotations while pressed | -| {% include key key='K' %} | Record Key frame | -| {% include key key='M' %} | Mark cursor location2 | -| {% include key key='Z' %} | Undo last segment (temporary paths) | -| {% include key key="Enter" %} | Finish temporary path (same as {% include key key='Double Click' %}) | -| {% include key key="Double Click" %} | Finish temporary path when tracing (same as {% include key key='Enter' %}), otherwise centers view | -| {% include key key="Esc" %} | Discard temporary path | - -1 The full list of active shortcuts can be accessed from the options drop-down menu of the _Scene Controls_ widget of BDV/BVV - -2 The {% include key keys='Shift|B' %} key combination (used with traditional images) is not used because it collides with BDV/BVV native bookmark support - ### sciview | {% include key key="Left Drag" %} | Move around | @@ -159,4 +179,4 @@ In addition, _most_ shortcuts that are not specific to tracing canvases (XY, ZY ### Other -There are other key and mouse combinations used in e.g., [Sholl Analysis (by Focal Point)](/plugins/snt/analysis#sholl-analysis), and [Branching and Joining Paths](/plugins/snt/walkthroughs#branching-start-a-path-on-an-existing-path), that are listed in the contextual menu, displayed when right-clicking a tracing canvas. +There are other key and mouse combinations used in e.g., [Sholl Analysis (by Focal Point)](/plugins/snt/analysis#sholl-analysis), and [Branching and Joining Paths](/plugins/snt/walkthroughs#branching-start-a-path-on-an-existing-path), that are listed in the contextual menu, displayed when right-clicking a tracing canvas. In Stream Mode, right-click without dragging (since right-drag pans the view) to bring up the same menu. It also includes _Continue Extending Path_, which replaces the toolbar button used by earlier versions of Stream Mode. diff --git a/_pages/plugins/snt/manual.md b/_pages/plugins/snt/manual.md index a46afef55b..2f4eeae34f 100644 --- a/_pages/plugins/snt/manual.md +++ b/_pages/plugins/snt/manual.md @@ -672,6 +672,12 @@ Selects ("Groups") the path closest to the mouse cursor. ### Add Nearest Path to Selection {% include key key='Shift|G' %} Keeps appending the closest path to the existing path selection. +### Deselect Last Path {% include key key='Alt|G' %} +Removes the most recently selected path from the selection (leaving nothing selected if only one path was selected). + +### Select None {% include key key='Shift|Alt|G' %} +Clears the path selection. + ### Lasso Select Paths A convenience utility to select path(s) quickly. One the command is run, it is possible to draw an area ROI around the paths of interest, so that path(s) intersecting ROI boundaries can be selected. The shape of the ROI (rectangle, oval, freehand, etc.) is determined by the area ROI tool currently selected in ImageJ's main toolbar diff --git a/_pages/plugins/snt/seeds.md b/_pages/plugins/snt/seeds.md index af18b007fd..98aa06a788 100644 --- a/_pages/plugins/snt/seeds.md +++ b/_pages/plugins/snt/seeds.md @@ -23,7 +23,7 @@ Seeded Tracing allows for anchoring/constraining tracing algorithms around key l - **ROIs** e.g., generated from ImageJ routines (area and line ROIs are reduced to representative points) - **Tabular data** (CSV) exported from external tools or scripts - + # Seeded Tracing Assistant {% include img src="/media/plugins/snt/snt-seeded-tracing-assistant.png" align="right" width="350px" %} diff --git a/_pages/plugins/snt/snt-stream.md b/_pages/plugins/snt/snt-stream.md index ddcf44eb2b..894eea3dc2 100644 --- a/_pages/plugins/snt/snt-stream.md +++ b/_pages/plugins/snt/snt-stream.md @@ -10,22 +10,134 @@ update-site: Neuroanatomy tags: snt,tracing,segmentation,neuroanatomy,big-data,snt-stream --- +{% include snt-modes %} {% include notice icon="snt-stream" content="**SNT Stream remains experimental. This page may describe preliminary features**." %} **SNT Stream** is a suite of modifications that allows SNT to trace directly against a streamed dataset rendered in [Big Volume Viewer](./manual#big-volume-viewer) or [Big Data Viewer](./manual#big-data-viewer) -without materializing the volume in memory. It allows SNT to handle [TB-sized images](./big-data): Datasets are virtually-streamed, so you never need to downsample or crop a large volume just to get it into a tracing-capable window - +without materializing the volume in memory. It allows SNT to handle [TB-sized images](./big-data): Datasets are virtually-streamed, so you never need to downsample or crop a large volume just to get it into a tracing-capable window. ## Getting Started -1. Choose _Big Data..._ from the [Shortcuts Window](./manual#snt-commands) and select **Big Volume Viewer (BVV): 3D rendering w/ tracing capabilities** as the viewer type -2. Once the BVV window opens, trace as you would in any other SNT canvas: Click to place nodes for manual tracing, or use [semi-automated tracing](/plugins/snt/walkthroughs#semi-automated-tracing) the same way you would with an in-core image -3. Press **Enter** to finish the current path, or **Esc** to discard it -4. Press **Z**, or use the **Undo Last Segment** button on the toolbar, to step back one click at a time along the path currently being traced -5. Switch the active channel/frame from the toolbar as needed; only one is streamed for tracing at a time (see [big data limitations](./big-data#limitations-and-idiosyncrasies)) -6. Finished paths land in the Path Manager exactly as they would from any other SNT session: save, curate, and analyze them as usual -7. If tracing manually, use [Re-trace With A*](manual#re-trace-with-a) asynchronously to refine the curvature of traced paths +Choose _Big Data..._ from the [Shortcuts Window](./manual#snt-commands), specify the volume to be traced, choose a viewer type (BVV or BDV), and check _Enable tracing (SNT Stream)_. All inputs of the prompt, the [supported file formats](./big-data#supported-file-formats), and the differences between [BVV and BDV](./big-data#getting-started) are described in [Big Data](./big-data). To try Stream mode without loading your own data, use the _Load Remote Demo_ option of the prompt. + +{% include notice icon="info" content="All inputs can be local paths or remote URLs. To try Stream mode without loading your own data, use the _Load Remote Demo_ option: It pre-fills all fields with a remote demo (marmoset neurons, OME-Zarr, with autotracings and soma markers, using BVV)." %} + +#### Tracing +Tracing, editing, and shortcuts work the same way in both viewers. + +1. Once the viewer window opens, trace as you would in any other SNT canvas: Click to place nodes for manual tracing, or use [semi-automated tracing](./walkthroughs#semi-automated-tracing) the same way you would with an in-core image. +2. Press {% include key key='Enter' %} to finish the current path, or {% include key key='Esc' %} to discard it. +3. Press {% include key key='Z' %}, or use the **Undo Last Segment** button on the toolbar, to step back one click at a time along the path currently being traced. +4. Switch the active channel/frame from the toolbar as needed; only one is streamed for tracing at a time (see [big data limitations](./big-data#limitations-and-idiosyncrasies)). +5. Finished paths land in the Path Manager exactly as they would from any other SNT session: save, curate, and analyze them as usual. +6. If tracing manually, use [Re-trace With A*](./manual#re-trace-with-a) asynchronously to refine the curvature of traced paths. + +## What Differs From In-Core Tracing + +Most of SNT works the same way in a streamed scene and in an image loaded in memory: the same [shortcuts](./key-shortcuts) and [contextual menu](./manual#image-contextual-menu) apply, and paths are handled by the same Path Manager. The differences are summarized below. + +> Throughout the documentation, {{ crop }} flags features that require an image loaded in memory (a regular image, or a [materialized crop](#materialized-crops) of a stream), and {{ stream }} flags features that only exist in SNT Stream. + + +| | {{ stream }} SNT Stream | {{ crop }} Image in Memory | +|---|---|---| +| **Image data** | Streamed and tiled. Only the displayed region/resolution is loaded | Fully loaded in memory | +| **Tracing algorithm** | A* only (currently). See [limitations](./big-data#limitations-and-idiosyncrasies) | A*, NBA*, Fast Marching | +| **Filters, widgets requiring entire images, and ImageJ-specific workflows (ROIs, etc.)** | Materialized crops only | Available | +| **Lasso selection, path orientation, brightest-voxel click, paint mode** | Materialized crops only | Available | +| **[Spacebar behavior](#tracing-and-navigation)** | Panning and tracing toggle | Panning | +| **Unique workflows** | [Channel unmixing](#channel-unmixing), [slab controls](#slab-view) | Orthogonal views | + +## Tracing and Navigation + +Press {% include key key='Spacebar' %} to toggle between tracing and navigation (panning). Hold it down to switch to navigation temporarily: Release it to resume tracing. A message in the viewer confirms the current mode. This avoids a trip to the toolbar every time the scene needs to be repositioned. + + +## Showing and Hiding Annotations + +The eye icon in the toolbar controls which SNT annotations are overlaid on the image: + +- **Show/Hide All Annotations** toggles everything. +- **Hide Paths**, **Hide Seeds**, and **Hide Markers** toggle each layer independently, in any combination. + +Hold {% include key key='H' %} to hide paths and annotations temporarily while it is pressed. + + +## Scene Controls + +### Slab View +_BVV only._ + +Restricts the visible scene to a thin section of the volume, which is handy for inspecting (and tracing through) dense data. Toggle it from the _Scene Controls_ card. Thickness, position, and the options to restrict paths and markers to the slab are described in [Big Data](./big-data#slab-view). Slab View is also required by [channel unmixing](#channel-unmixing) of multi-resolution data. + +### Source Label and Scale Bar + +The toolbar of the _Scene Controls_ card has toggles for the source name overlay and for a scale bar: + +- **Text Overlay**: Right-click to choose the position of the source name (_Top center_ or _Top right_). +- **Scale Bar**: Off by default. Right-click to override the spatial calibration (voxel size and unit), and to set the foreground and background colors of the bar. + +{% include notice icon="info" content="Changing the calibration through the scale bar dialog also overrides it in SNT. If the dataset stores a different calibration (e.g., OME-Zarr), SNT offers to save the new one so that it is used next time." %} + + +## Channel Unmixing + +Autofluorescence and bleed-through often make a structure of interest show up in more than one channel. For multichannel datasets, the _Channel Unmixing_ card (above _Scene Controls_ in the viewer) subtracts a weighted _background_ channel from a _signal_ channel: + +> result = signal − w × background + +with the display ranges (black/white levels) of both channels used to normalize the subtraction. The result is 16-bit and the unmixed channel replaces the original channels in the scene. Tracing proceeds against it. + +1. Choose the **Signal** channel (the one to keep) and the **Background** channel. +2. Adjust the brightness and contrast of both channels so that an autofluorescent feature looks equally bright in both. The unmixed result depends on these ranges, so any later change recomputes it. +3. Toggle **Enable** and raise the weight **w** (0 to 1) until the bleed-through disappears. Higher weights may clip signal. +4. The reset button restores the original channels. + +In BDV the result updates live. In BVV, it is computed when the slider is released, and only for the current slab, so activate a thin [slab](#slab-view) first (this is required for multi-resolution data). The result is single-resolution: SNT lets you know which resolution level was used. + +### Unmixing the Whole Volume + +The unmixing above is a preview of what the current slab would look like. To apply it to the entire dataset, choose **Unmix Full Volume...** from the **Options** menu of the card. SNT generates a Groovy script, pre-filled with the current channels, weight and display ranges, so that the offline result matches what you see in the viewer. Run it from Fiji's Script Editor (_Language ▷ Groovy_). + +The script writes a multi-resolution OME-Zarr next to the input dataset. Existing files are never overwritten (a numeric suffix is added instead). Level 0 is computed one slab at a time, so volumes larger than the available memory are fine, and the result can be streamed back into BVV/BDV as any other dataset. + +Note that: + +- The command is only available for datasets loaded from a file (BDV XML, IMS, N5, or OME-Zarr), not for images already open in Fiji. +- All timepoints are exported, with the time stored as the last axis of the OME-Zarr. +- The script aborts if the channel count of the dataset differs from the one in the viewer. + + +## Materialized Crops + +Some [features](#what-differs-from-in-core-tracing) need pixel data in memory. A _materialized crop_ is a region of the streamed volume that is copied into memory as a regular image, so these features become available for that region. + +1. Choose **Materialize Region...** in the _Options_ tab of the main SNT window (it replaces the _Create Canvas_ button of in-core tracing). +2. Choose what to crop: the image being traced (or its secondary layer) and the bounding box: around all paths, around selected paths, one of several presets (e.g., 1024×1024×512 px), or custom dimensions. The box is centered on the scene by default, or on custom coordinates, and is padded by the specified amount (10 calibrated units, by default). +3. Check the estimated size shown at the bottom of the dialog. The region must fit in 80% of the memory still available to Fiji. Regions of 500 MB or more take a while to assemble. +4. Click **Materialize**. The region opens as the SNT canvas (_Materialized Region_), and {{ crop }} features are enabled. + +While a region is materialized, tracing is scoped to its bounds. Note that: + +- Only path geometry is retained. Pixel edits made on the crop are not saved. +- A* and automated tracing started after materializing are limited to the region, until another region is materialized. +- Only the channel and timepoint currently traced are copied. To crop another one, make it the one being traced and open the dialog again. +- If the voxel size of the dataset could not be read, SNT warns about it: Please verify that the calibration is correct, since a wrong calibration would crop the wrong location. + + +## Editing + +Edit Mode ({% include key keys='Shift|E' %}) works as in any SNT canvas. In addition to _Connect To..._ ({% include key key='C' %}), Stream offers **Quick Connect** ({% include key keys='Shift|C' %}), which does not require a secondary path: + +1. Press {% include key keys='Shift|C' %} (or choose _Quick Connect..._ from the contextual menu) with the cursor near the node of the edited path that should be connected. +2. Move the cursor over the node to connect to: the cursor snaps to the closest node of any other path (within 150 pixels), a dotted line shows the link, and the status message reports the gap. +3. Click, press {% include key key='Enter' %}, or press {% include key keys='Shift|C' %} again to connect. Press {% include key key='Esc' %} to cancel. + +The edited path becomes the child of the target. Branches of the edited path are dimmed, since connecting to them would create a loop. + +## See Also -{% include notice icon="info" content="If you don't have a discrete graphics card, ore are running SNT on underpowered hardware, you could repeat the steps above choosing _Big Data Viewer (BDV): Interactive reslicing w/ tracing capabilities_ as viwer type." %} +- [Big Data](./big-data): Loading data, supported file formats, BVV vs BDV, Slab View, and current limitations +- [Key Shortcuts](./key-shortcuts): Shortcuts for both traditional and streamed canvases diff --git a/_pages/plugins/snt/spines-varicosities.md b/_pages/plugins/snt/spines-varicosities.md index a7132f5dad..9c68e599fc 100644 --- a/_pages/plugins/snt/spines-varicosities.md +++ b/_pages/plugins/snt/spines-varicosities.md @@ -30,7 +30,7 @@ Currently, SNT supports detection, annotation, and density analysis of bright pu SNT can automatically detect intensity maxima (spines, varicosities, synaptic puncta) in the vicinity of traced paths using the **Peripath Detector**. At each path node, a perpendicular cross-section is sampled from the image, masked to an annular region around the neurite, and analyzed for local maxima via prominence filtering. Detections from adjacent cross-sections are deduplicated automatically. The detection algorithm is the same used by ImageJ's {% include bc path='Process|Find Maxima...' %} {% capture maxima-demo%} -You can follow these instructions using {% include bc path='File|Load Demo Dataset...' %} and choosing _Hippocampal neuron (Neuronal receptors)_ or _Hippocampal neuron (Synaptic labeling)_ datasets: +You can follow these instructions using {% include bc path='File|Load Demo Dataset/Tutorial...' %} and choosing _Hippocampal neuron (Neuronal receptors)_ or _Hippocampal neuron (Synaptic labeling)_ datasets: 1. Choose a neurite of interest. Adjust cursor size to the neurite thickness using {% include key keys='Ctrl|Mouse Wheel' %} 2. Trace a small path (finish it by {% include key keys='Double Click' %}) @@ -133,7 +133,7 @@ Label proximity detection is complementary to [Delineation Analysis](/plugins/sn This approach uses manually placed multi-Point ROIs along paths as markers for neurite features. Currently only counts and densities are supported. A typical workflow proceeds as follows: {% capture spines-demo%} -You can follow these instructions using {% include bc path='File|Load Demo Dataset...' %} and choosing the _L-systems fractal (Toy neuron)_ dataset. +You can follow these instructions using {% include bc path='File|Load Demo Dataset/Tutorial...' %} and choosing the _L-systems fractal (Toy neuron)_ dataset. {% endcapture %} {% include notice icon="tip" content=spines-demo %} diff --git a/_pages/plugins/snt/walkthroughs.md b/_pages/plugins/snt/walkthroughs.md index 25e7266c85..b8fe8e177d 100644 --- a/_pages/plugins/snt/walkthroughs.md +++ b/_pages/plugins/snt/walkthroughs.md @@ -11,14 +11,20 @@ tags: snt,reconstruction,tracing,arbor,neuron,morphometry,dendrite,axon,neuroana --- {% capture version%} -**This page was last revised for [version 5.0.5](https://github.com/morphonets/SNT/releases)**.
+**This page was last revised for [version 5.0.19](https://github.com/morphonets/SNT/releases)**.
Please help us to keep these walkthroughs up-to-date by [editing](https://github.com/imagej/imagej.github.io/edit/main/_pages/plugins/snt/walkthroughs.md) this page directly to fill in any documentation gap. Do [reach out](https://forum.image.sc/tag/snt) if you need assistance! {% endcapture %} {% include notice icon="snt" content=version %} # Semi-automated Tracing + +{% capture tutorial %} +**In a rush?** Run {% include bc path='File|Load Demo Dataset/Tutorial...|Guided Tracing (Interactive)' %} for a 1-minute interactive tutorial. It runs completely offline. +{% endcapture %} +{% include notice icon="info" content=tutorial %} + {% capture op1-demo-incomplete%} -You can follow these instructions using {% include bc path='File|Load Demo Dataset...' %} and choosing the _Drosophila OP neuron (Complete 3D reconstruction)_ dataset. All the neuronal processes are traced in this dataset, so you may want to delete some of the existing paths beforehand. +You can follow these instructions using {% include bc path='File|Load Demo Dataset/Tutorial...' %} and choosing the _Drosophila OP neuron (Complete 3D reconstruction)_ dataset. All the neuronal processes are traced in this dataset, so you may want to delete some of the existing paths beforehand. {% endcapture %} {% include notice icon="info" content=op1-demo-incomplete %} @@ -242,7 +248,7 @@ Described in [Delineation Analysis](/plugins/snt/delineations). # Time-lapse Analysis {% capture timelapse-demo%} -You can use one of two demo datasets ({% include bc path='File|Load Demo Dataset...' %}) to follow these instructions: +You can use one of two demo datasets ({% include bc path='File|Load Demo Dataset/Tutorial...' %}) to follow these instructions: - _Hippocampal neuron (DIC timelapse)_ dataset: A timelapse video of a cultured neuron in which neurites have been pre-traced across time - _Segmented video (2D timelapse)_ dataset: A small, thresholded video of a cultured neuron processed by a script that automates tracing at each frame {% endcapture %} @@ -264,7 +270,7 @@ Once undesired motion has been mitigated: - Duplicate the path(s) of interest using Path Manager's {% include bc path='Edit|[Duplicate...](/plugins/snt/manual#duplicate)' %} This will allow you to copy a path (and its children) to a new frame (or channel). If a neurite is retracting, you can duplicate the subsection of the path that better matches the retracted neurite: e.g., by restricting the duplication to a fraction of the path's total length, or up to a branch-point - - Use a script to attempt segmentation at each frame, as in the _Segmented video (2D timelapse)_ demo ({% include bc path='File|Load Demo Dataset...' %}) + - Use a script to attempt segmentation at each frame, as in the _Segmented video (2D timelapse)_ demo ({% include bc path='File|Load Demo Dataset/Tutorial...' %}) 4. At this point, there are two types of analyses you can do using [Path Manager](./manual#path-manager)'s {% include bc path='Analyze|Time-lapses|' %} commands: @@ -317,7 +323,7 @@ Once paths have been matched to their neurites across the time-lapse sequence, s # Filling {% capture op1-demo-full%} -You can follow these instructions using {% include bc path='File|Load Demo Dataset...' %} and choosing the _Drosophila OP neuron (Complete 3D reconstruction)_ dataset. +You can follow these instructions using {% include bc path='File|Load Demo Dataset/Tutorial...' %} and choosing the _Drosophila OP neuron (Complete 3D reconstruction)_ dataset. {% endcapture %} {% include notice icon="info" content=op1-demo-full %} Fill Manager (v4.2.0). @@ -417,7 +423,7 @@ Currently, only the output images/CSV summary of fills are exported. TRACES file # Tracing in Multichannel (Brainbow) Images {% capture brainbow-demo%} -You can follow these instructions using {% include bc path='File|Load Demo Dataset...' %} and choosing the _Brainbow zebrafish larva_ dataset. This is a 2D, 3-channel confocal image in which individual neurons are distinguished by their unique combination of fluorescent proteins. +You can follow these instructions using {% include bc path='File|Load Demo Dataset/Tutorial...' %} and choosing the _Brainbow zebrafish larva_ dataset. This is a 2D, 3-channel confocal image in which individual neurons are distinguished by their unique combination of fluorescent proteins. {% endcapture %} {% include notice icon="info" content=brainbow-demo %}