Reshape what came back — filter, join, aggregate, pivot, build a network.
Attach Attributesneuron.attachAttributes
Geometry, Table → Geometryruns live
Join a table’s columns onto skeletons, meshes or points. A carried column replaces a same-named one and keeps its place, rather than being suffixed.
Joins a table onto the attributes that skeletons, meshes or points carry, matched on a column you pick, so what a graph computes (a Cut Tree cluster, a Reduce Matrix statistic, an uploaded CSV) can colour or split a scene. With no columns picked it carries every column; an item the table does not mention keeps its geometry and carries nulls.
Open Attach Attributes in a workflow
Build Networknet.build
Edges, Node attrs? → Networkruns live
Turn an edge table into a network of nodes and links. The columns you pick are renamed: links carry `source`, `target`, `weight` and `edges`, and nodes carry `id`, `degreeIn`, `degreeOut`, `weightIn` and `weightOut` — those are the names downstream pickers see.
Turn an edge table into a network: nodes, links plus associated properties including derived ones such as in and out degree/weight. Both halves carry an ordinary attribute table, so colouring by cell type is a column picker.
Open Build Network in a workflow
Clean Meshesneuron.cleanMeshes
Meshes → Meshesruns on Run
Strip internal membrane, cap holes, decimate and smooth mesh surfaces.
Four repairs an EM mesh usually wants, in the order they compose: strip the invaginated membrane folded into the cell, cap what is left open, decimate to a fraction of the faces, and smooth. Stripping internals is the one that changes a number rather than a picture — a raw segmentation mesh has far more surface inside it than around it, so any area or volume measured from one is wrong until this has run. It is also by far the slowest, being a ray cast per face.
Open Clean Meshes in a workflow
Clean Skeletonsneuron.cleanSkeletons
Skeletons → Skeletonsruns on Run
Heal, smooth and re-sample skeletons before measuring or comparing them.
Four repairs a traced skeleton usually wants, in the one order they compose: reconnect its fragments, smooth the tracing jitter out, then either re-sample it to an even node spacing or keep every Nth node. Re-sampling is what most morphometrics want in front of them, since anything averaged per node is otherwise weighted by how finely each neurite was traced. Distances are micrometres, and the node count changes while the neuron count never does.
Open Clean Skeletons in a workflow
Clusters to Neuronscluster.clustersToNeurons
Clusters, Neurons? → Neuronsruns live
Put cluster numbers back onto the neurons they belong to. `cluster`, `order` and `size` ride along, and a column whose name the neuron table already uses is suffixed `_c`.
Cut Tree gives cluster numbers for leaf names, not neurons. This maps those clusters back onto the neurons they came from, so Neuroglancer can colour by cluster, Filter can isolate a group, or Group By can count. Wire the original neuron table and set "Match on" to what NBLAST used for "Label by".
Open Clusters to Neurons in a workflow
Combine Columnscore.combineColumns
Table → Tableruns live
Make one column out of several — the first with a value wins. The result takes the name in `Into` (`type` by default), backfilling that column in place when it is one of the picked ones and suffixing any other column of that name `_2`.
Make one column out of several. The columns are tried in the order you pick them and the first one holding a value wins, so cell_type then hemibrain_type means "the hemibrain type where there is no cell type". Null and blank count as the same absence. Naming the result after one of the columns you picked backfills it in place; any other name adds a column. The default name is type, which is what Coda reads a cell type from — so this is how an annotation file whose types are spread over several columns becomes one a dataset can use.
Open Combine Columns in a workflow
Compare Connectivitycompare.connectivity
Edges 1, Labels 1, Edges 2, Labels 2 → Comparison, Countsruns live
Put the same type-to-type connection side by side across two or more connectomes. Columns are `preLabel`, `postLabel`, then `weight_<name>` and `present_<name>` for each dataset, named by its `Name` param.
Takes each dataset’s edge list plus its labels from Match Cell Types, rewrites both ends into the shared label space and sums per type pair, so one row reads “LC4 to DNp01 is 30 synapses here and 6 there”. Read the present columns before the weights: 0 is a real absence, empty means the type is missing there.
Open Compare Connectivity in a workflow
Cut Treecluster.cut
Tree → Clusters, Treeruns live
Take groups out of a merge tree, by count or by distance. The Clusters table is `label`, `cluster`, `order` and `size`.
Cut a tree into groups by count (exactly N clusters), by distance threshold, or — for two connectomes clustered together — wherever a group is lopsided, so every group draws from both brains. Cheap, just union-find and no Python, so you can retry it while looking at the dendrogram. Clusters joins back onto neurons; Tree carries the cut for Dendrogram to colour branches by group.
Open Cut Tree in a workflow
Deduplicatecore.dedupe
Table → Tableruns live
Drop repeated rows, comparing on the chosen columns.
Drop rows that repeat. Name the columns to compare on, or leave empty to compare whole rows for exact duplicates. Keep decides which row survives: first, last, or none at all—only rows nobody disagrees about. Keeps whole rows unchanged; unlike Group By, nothing is aggregated.
Open Deduplicate in a workflow
Distance betweenneuron.distance
Query, Target? → Matrixruns on Run
Measure how far apart neurons are in space, or how much of one lies close to the other, as a matrix.
Measures how far apart neurons are: the closest approach, the mean or median separation, the distance between centroids, or how much cable or surface of one lies within a given distance of the other. Wire one set of skeletons or meshes for an all-by-all, or a second for one group against another. The averages are weighted by cable or by surface, so resampling upstream does not move them.
Open Distance between in a workflow
Edit Tablecore.editTable
Table → Tableruns live
Overwrite values in the rows a rule matches.
Override values in a table. Each rule names the rows to change — an Explore query like type==LC4 status==Traced, or blank for all of them — then the column to write and what to put in it; naming a column the table does not have creates it. A filter it cannot resolve switches its own rule off rather than editing more rows than you meant.
Open Edit Table in a workflow
Embeddingcore.embed
Matrix?, Features?, Neighbours?, Annotations? → Embeddingruns on Run
Lay out a similarity matrix or feature table in 2D with UMAP.
UMAP in the browser: a score matrix, a table of feature vectors or a table of nearest neighbours becomes two coordinates per neuron, ready for a Scatter Plot. It preserves who is near whom, so distance between clusters means nothing, and it is stochastic — the Seed is part of the picture. Wire Neighbours from NBLAST k-NN to skip the all-by-all matrix.
Open Embedding in a workflow
Filter Networknet.filter
Network, Seed? → Networkruns live
Cut out the part of a network around a selection.
Picks a set of nodes and keeps what is near them: the selection itself, everything within a number of hops, or the whole connected component it sits in. Built for reading Match Cell Types’ Network port, where the graph is thousands of nodes and the unit worth looking at is one component — that is what the matcher decides on, so a component is the answer to both “why did these correspond?” and “why did those not?”. Name the nodes with a condition on any node column, or wire a table of ids, or both; the two are unioned. Every link with both ends in the result is kept. Build Network’s degree and weight columns are recomputed against the surviving links, so a size encoding describes the picture; a column some other producer derived — the neuron counts on Match Cell Types’ label nodes — is carried through unchanged and still describes the whole graph.
Open Filter Network in a workflow
Filter Tablecore.filterTable
Table → Tableruns live
Keep rows matching a condition on one column.
Keep the rows matching one condition. The operator list follows the column’s type — pick a number and you get ≥, ≤, between; pick text and you get contains and matches — which is schema propagation doing something visible. It is cheap, so the result re-computes as you type a threshold, with nothing waiting for Run.
Open Filter Table in a workflow
Group Bycore.groupBy
Table → Tableruns live
Collapse rows into groups and aggregate one or more value columns. The result carries the group columns, a row count named `n`, and one aggregate per value column renamed `<agg>_<column>` — so summing `weight` gives `sum_weight`, not `weight`.
Collapse rows into groups and aggregate — synapses per cell type, mean size per class. Pick several value columns and you get one aggregate each, sum_pre beside sum_post; the aggregation itself is one choice for all of them. The output schema is computed rather than copied, so switching sum to mean renames every aggregate and downstream pickers follow before anything re-runs. n rides along.
Open Group By in a workflow
Joincore.join
Left, Right → Tableruns live
Annotate the left table with matching rows from the right table. A right-hand column colliding with a left-hand name is suffixed, `_r` by default.
Annotate the left table with matching rows from the right. Join type decides which rows survive: left keeps every left row, inner only matches, outer all rows, right every right row. Right-hand columns that collide get a suffix rather than being dropped. Chain for more tables.
Open Join in a workflow
Landmark Transformcore.landmarkTransform
Landmarks → Transformruns live
Build a spatial transform from a table of matched landmark coordinates.
Turns a six-column table — three coordinates before, three after — into a transform that Transform Neurons and Mirror Neurons can use in place of the registrations Coda ships. Pair it with Upload Table or Table from URL to bring in your own registration, or one from navis-flybrains that this build predates.
Open Landmark Transform in a workflow
Linkagecluster.linkage
Matrix → Tree, Orderedruns on Run
Cluster a score matrix into a merge tree.
Perform hierarchical/agglomerative clustering on a distance or similarty matrix. This is the usual next step after NBLAST, and works on any square matrix over one population. Can be wired into a Dendrogram, Cut Tree, or Heatmap node to see the groups and their scores.
Open Linkage in a workflow
Match Cell Typescompare.matchTypes
Dataset 1, Dataset 2, Pass Through? → Labels 1, Labels 2, Report, Networkruns on Run
Work out which cell types correspond between two or more connectomes.
Builds the type-to-type correspondence needed for cross-brain comparison: which cell types in one connectome are the same cells as which in another.
Open Match Cell Types in a workflow
Mirror Neuronsneuron.mirror
Neurons, Warp? → Mirroredruns on Run
Flip skeletons, meshes or points to the other side of the brain. The attribute table gains a `mirrored` column.
Reflect neurons across the midline of the space they were fetched in, so a left neuron can be compared with a right one — by eye or by NBLAST, neither of which can see past the fact that the two are simply in different places. The space is read off the geometry, so there is nothing to configure.
Open Mirror Neurons in a workflow
NBLASTneuron.nblast
Query, Target? → Scoresruns on Run
Score how alike neurons are in shape, as a matrix.
Compare neurons by shape rather than by connectivity, scoring every pair on how well one neuron’s arbor lies along the other’s. Wire one set of Skeletons for an all-by-all — the usual way in — or a second set to score one group against another. The result is a matrix, ready for a Heatmap or a clustering.
Open NBLAST in a workflow
NBLAST k-NNneuron.nblastKnn
Query, Target? → Matchesruns on Run
Find each neuron’s most similar neurons, as a table of matches. Columns are `queryId`, `targetId`, `rank` and `score`.
A version of NBLAST that gives you the top-k matches for each query neuron. Each row is one match — neuron, neighbour, rank and score — so Build Network turns it straight into a similarity graph. The shortlist that makes this cheap is approximate; the scores are exact. With a Target wired, a neuron in both sets matches itself at 1.00 and spends one of its k places doing so.
Open NBLAST k-NN in a workflow
NBLAST Matchesneuron.nblastMatches
Matrix → Matchesruns on Run
Pull each neuron’s best matches out of a score matrix, as a table. Columns are `query`, `target`, `rank` and `score`, or `query` and `matches` when counting — note that NBLAST k-NN calls the same pair `queryId` and `targetId`.
Turns a score matrix into the long table every other node wants: one row per match, with the neuron, its match, the rank and the score. Take the top N per neuron, everything above a cutoff, or just the counts so you can pick a cutoff first. Works on any matrix, not only NBLAST’s — and note that the “within %” cutoff is a band around each neuron’s own best match rather than the top few percent overall.
Open NBLAST Matches in a workflow
Network Centralitynet.centrality
Network → Network, Node stats, Summaryruns on Run
Betweenness, closeness, PageRank and communities for a network’s nodes. Each measure switched on adds its own column: `betweenness`, `closeness`, `pagerank`, `eigenvector`, `community`.
Adds centrality columns to a network’s nodes: betweenness and harmonic closeness from a shortest-path sweep, PageRank, eigenvector centrality and Louvain communities. Expensive by nature — the sweep walks every link once per source node — so it runs only on Run, and Sample trades an exact answer for a much faster one. The network passes through carrying the new columns.
Open Network Centrality in a workflow
Normalizecore.normalize
Matrix → Matrixruns live
Rescale matrix values by row, column, global max, or log.
Rescale a matrix by row, by column, against the global maximum, or logarithmically. Raw synapse counts are dominated by whichever cell type happens to be numerous, so row fraction is usually what turns an unreadable connectivity matrix into a picture — each row then reads as “where does this type send its output”, which is the question being asked.
Open Normalize in a workflow
Partner Vectorsneuron.partnerVectors
Connections, Neurons?, Labels? → Vectorsruns live
Turn a connectivity edge list into one feature vector per query neuron, ready to compare.
Reshapes a Connectivity result into the long form Similarity Matrix reads: one row per neuron and partner, with upstream and downstream kept apart as separate features. It aggregates as it goes, so no Group By and no Pivot in between. Wire Labels from Match Cell Types to compare across brains.
Open Partner Vectors in a workflow
Pivotcore.pivot
Table → Matrix, Tableruns live
Reshape a long table into a matrix of rows × columns, as a matrix and a wide table. The wide table's columns are the distinct values found in the Columns field, so nothing can name them until it has run.
Reshape a long table into rows × columns — the step between a connectivity result and a heatmap. Emits both shapes of the same pivot: a Matrix for heatmaps and normalization, the same thing wide as a Table for sorting, filtering, and export — they never disagree.
Open Pivot in a workflow
Points in Volumesneuron.pointsInVolumes
Points, Volumes → Inside, Outsideruns on Run
Split a point cloud by the meshes enclosing it, adding a `roi` column naming each point’s volume — written over a same-named column rather than beside it.
Tests every point of a cloud against a set of meshes and hands back both halves — the points inside some volume, and the rest — with a column naming which volume each one landed in. It is the only route from a synapse cloud to the region a synapse is in: neuPrint, CAVE and CATMAID all publish synapse coordinates with no region attached. The volumes need not be neuropils; a set of neuron meshes on the same socket asks which synapses lie inside another cell. Where volumes overlap the first on the wire wins, and the node says how many points that decided.
Open Points in Volumes in a workflow
Qualify Idscore.qualifyIds
Table → Tableruns live
Tag a neuron id with the dataset it came from, or take that tag off again. A tagged id reads `dataset:id` and its column becomes text, so filters, joins and lookups downstream have to match that form.
Rewrites an id column to dataset:id, which is what lets two connectomes share one table without neuron 12345 in one being mistaken for neuron 12345 in the other — the shape co-clustering needs before Stack Tables. Strip it again on the way back out. The tagged value is deliberately no longer a valid neuron id, so anything that would query it refuses loudly instead of fetching the wrong neuron; only qualify where two datasets actually meet.
Open Qualify Ids in a workflow
Reduce Matrixcore.reduceMatrix
Matrix → Tableruns live
Aggregate a matrix’s rows or columns into one table row each. The result is `label` and one column per statistic you tick — a second tick adds a column — and `Prefix` renames them all, so `zap` gives `zap_mean`.
Turns a matrix into a table with one row per matrix row, or per column, carrying the statistics you tick: mean, median, sd, min, max, sum, n. It is the way from a trace or similarity matrix to a per-neuron number you can sort, join or colour a scene by. Non-finite cells are skipped, so an all-NaN row comes out null rather than zero.
Open Reduce Matrix in a workflow
Relabelcore.relabel
Table, Mapping → Tableruns live
Rewrite a column through a two-column mapping table. The result takes the name in `Into`, or rewrites the column in place when that is empty; any other column already holding the name is suffixed `_2`.
Rewrite one column by looking each value up in a mapping table: pick the column to rewrite, then the mapping's key and value columns. Leave Result empty to rewrite in place, or name a column to add one beside it. Unmatched is the setting to think about — it defaults to leaving an uncovered value empty, so unmapped values cannot pass for mapped ones.
Open Relabel in a workflow
Rename Columnscore.rename
Table → Tableruns live
Give one or more columns a different name. A column that merely already held a target name is suffixed `_2` rather than overwritten.
Give one or more columns a different name, leaving their values, dtypes and units alone. Mostly for making somebody else’s table speak Coda’s vocabulary: the id column has to be called neuronId before a table can meet a Neurons socket, and the cell typing has to be called type before connectivity rows, Explore Dataset chips and Neuron Profile roll-ups can read it — which is why renaming a column onto neuronId promotes the table to Neurons, and renaming neuronId away demotes it. Nothing here refuses: a row naming a column the table does not have renames nothing and says so, and two rows aiming at one name suffix the second rather than dropping a column.
Open Rename Columns in a workflow
Samplecore.sample
Table → Tableruns live
Keep a subset of the rows: the top, the bottom, every Nth, or a random draw.
Cut a table down to a manageable size: the top, the bottom, every Nth row, or a random draw. The random mode takes a seed and the draw is reproducible from it, so a figure made from a sample can be remade — which is the whole reason the seed is a visible parameter rather than a hidden one. The other three modes ignore the seed entirely and cost nothing when it changes.
Open Sample in a workflow
Select Columnscore.select
Table → Tableruns live
Keep only the chosen columns, in the chosen order.
Keep only the columns you name, in the order you name them. Mostly for tidying a table before export or before a chart, where forty columns of neuPrint metadata get in the way of the four that matter. An empty selection means every column, so an unconfigured node passes its input through rather than emitting nothing.
Open Select Columns in a workflow
Select Neuronsneuron.selectNeurons
Geometry, Neurons → Geometryruns live
Keep only the skeletons or meshes whose ids appear in a neuron table. Columns are untouched — the geometry arrives with the attributes it already had.
Takes a collection of skeletons or meshes and a table of neurons, and keeps the geometry whose ids the table names — so a Cut Tree cluster, an NBLAST shortlist or a Connectivity result can pick what a 3D View draws without re-fetching anything. Filtering the neuron table before the Skeletons or Meshes node is cheaper where that is still possible; this is for geometry that has no table left in front of it, or a subset chosen from something measured off the geometry itself. Ids the collection has no geometry for are counted and reported, never refused.
Open Select Neurons in a workflow
Select Onecore.selectOne
Items → Itemruns live
Step through a table, skeletons or meshes and emit one element at a time.
Step through a collection one element at a time — the manual For each. Explore Dataset → Select One → Skeletons → 3D View. Stepping is free (arrows move the card), Use this commits (re-runs downstream). Live mode couples browsing and committing.
Open Select One in a workflow
Selected to Neuronscluster.selectedToNeurons
Selected, Neurons? → Neuronsruns live
Turn a Dendrogram selection into neurons. The selection’s columns ride along, and one whose name the neuron table already uses is suffixed `_c`.
A Dendrogram selects branch names, not neurons. This turns those names back into the clustered neurons, ready for Neuroglancer, a 3D view, or Skeletons. Wire the original neuron table and set "Match on" to what NBLAST used for "Label by"; if it was neuron id (the default), leave Neurons unwired.
Open Selected to Neurons in a workflow
Similarity Matrixcore.similarity
Features → Matrixruns on Run
Compare every observation with every other over its features, as a similarity or distance matrix.
Turns a table of features, calculates similarities or distances between them and returns it as a square similarity matrix for e.g. Linkage or Heatmap takes.
Open Similarity Matrix in a workflow
Sortcore.sort
Table → Tableruns live
Order rows by a column, optionally keeping only the top N.
Order rows by a column, and optionally keep only the first N of them. Top N is what turns a sort into “the twenty strongest partners”, which is most of what a sort is used for here. Nulls sort last whichever direction you choose, so a missing value never displaces a real one at the top of the list.
Open Sort in a workflow
Split Neuronsneuron.splitNeurons
Neurons → Matching, Restruns live
Split skeletons or meshes in two by their attributes: the matches, and the rest.
Stack Neurons run backwards: it asks the attribute table a question and hands back both answers, so one row on the stack’s own source column takes a scene apart again. Reach for it instead of filtering twice with opposite conditions — the negation of several ANDed rows is not one condition. With no filters nothing matches.
Open Split Neurons in a workflow
Stack Neuronsneuron.stack
Input 1, Input 2 → Neuronsruns live
Combine several sets of skeletons, meshes or points into one collection.
The geometry counterpart of Stack Tables: several collections end to end, with their attribute tables stacked alongside. This is how neurons from two or more datasets reach one 3D View — transform each into a shared space first, then stack them and colour by the source column. Every input must be the same kind, in the same units and the same space.
Open Stack Neurons in a workflow
Stack Tablescore.stack
Input 1, Input 2 → Tableruns live
Combine two tables vertically, keeping every column either of them has.
The vertical counterpart of Join: where that one widens a table with columns, this lengthens it with rows. Every column survives — a column only one side has is null-filled for the other. But a column the two sides genuinely disagree on (number vs text) is refused by name rather than reconciled.
Open Stack Tables in a workflow
Synapses to Edgesneuron.synapseEdges
Points → Edgesruns live
Count a synapse point cloud into a connectivity edge list — `preId`, `postId` and a `weight` that is the number of synapses, under the same column names Connectivity emits. Needs a cloud carrying a partner column, which Synapses Between has and a plain Synapses cloud on neuPrint or CATMAID does not.
Counts a synapse cloud into an edge list: one row per connected pair, with weight the number of synapses between them. It is what turns "here is where they connect" back into "how strongly" — so a cloud narrowed by Points in Volumes gives connectivity restricted to one neuropil, which no backend answers directly. Split by takes extra columns, so splitting on the region column gives one row per pair per region in a single card. The control to read before running is Orientation: a Synapses Between cloud is already oriented, while a plain Synapses cloud says which end its neuron is in a polarity column, and counting that one without flipping merges a neuron’s inputs and outputs.
Open Synapses to Edges in a workflow
syNBLASTneuron.synblast
Query, Target? → Scoresruns on Run
Score how alike neurons are by where their synapses sit, as a matrix.
Compare neurons by their synapses rather than by their shape: for each connector, how far away the nearest connector of the same polarity on the other neuron is. Wire one set of Synapses for an all-by-all, or two to score one group against another. Two cells with the same arbor that talk to different partners score low here and high on NBLAST, which is the reason to run both.
Open syNBLAST in a workflow
Transform Neuronsneuron.xform
Neurons, Transform? → Transformedruns on Run
Move skeletons, meshes or points into JRC2018U, the shared template space.
Put neurons from different brains into one coordinate system, so they can be drawn together or compared by NBLAST — neither of which works while two reconstructions sit in unrelated spaces. One landmark transform per dataset, straight into JRC2018U. Mirror before transforming, not after.
Open Transform Neurons in a workflow
Unpivotcore.unpivot
Table → Tableruns live
Fold wide columns into one name column and one value column. The two are named by `Name into` and `Value into` — `name` and `value` unless you say otherwise.
Fold a wide table into a long one: pick the columns to fold and each becomes rows, with the column name in one new column and the cell in another. This is the direction Pivot does not go, and it is what makes an already-pivoted CSV usable — Group By, Filter Table and every chart that colours by a category want the value in one column. The columns you do not fold are repeated on every row it produces, so leaving Keep empty keeps the rest of the table as it is. Note that it does not undo a Pivot: a pivot aggregated several rows into each cell, and unfolding gives one row back rather than the several.
Open Unpivot in a workflow
Update root IDscave.updateRootIds
Table, Dataset → Tableruns on Run
Repoint stale CAVE root ids at a materialization, using their supervoxel ids.
Root ids drift when proofreading touches a segment, leaving annotation tables out of sync with the materialization. This node repairs them by looking up what each stale id’s supervoxel became and rewriting only stale entries. Unedited tables cost one staleness check and no further lookups.
Open Update root IDs in a workflow