Skip to content

GateLab 0.8.0

Choose a tag to compare

@david-priest david-priest released this 16 Sep 06:23
· 10 commits to master since this release
80e97e1

The workspace model is settled: one population tree per workspace, followed by every file and tailored per file or per group where a file needs its own coordinates. FlowJo workspaces travel in both directions, and a strategy drawn in GateLab reaches a BD FACSDiscover S8 through FACSChorus. Compensation, the Illustration and Plotting tabs, and the FCS reader each gained what the 0.7 releases had set up.

One tree per workspace, tailored per file or per group

  • A workspace holds one population tree. Every file follows it, so the structure is the same for every file, always. A different tree belongs in a different workspace. Workspaces saved with several trees still open; Delete brings them down to one.
  • A file can tailor a gate's coordinates. Choose "{file} only" as the edit target, move the gate, and that file keeps its own coordinates for that gate until it is reverted. The file's row shows how many gates it tailors, with the names on hover; on the tree a gate reads "tailored in N files".
  • Groups: a named set of files with gate coordinates of their own, between the tree and the files, which is FlowJo's group level. Files in a group follow the group's coordinates; a file can still tailor within its group. The Groups menu in the file list makes a group from the selected files, adds or removes files, renames and deletes; a grouped file carries a tag in the group's colour.
  • Coordinates move up as well as down. Apply to tree on a gate and Use for the tree on a file push a file's or a group's coordinates into the tree; Revert gate, Revert this file, Revert N selected files and Revert all files sit behind one Revert menu with one confirmation.
  • The edit target ("the tree · all files" or "{file} only") holds from file to file, through an undo and after an import, until changed. Viewing a file never makes a copy and never adds an undo entry.
  • A per-file import, whether a FlowJo workspace with a tree per sample, a FACSChorus experiment's recordings or the S8's per-file recordings, becomes one tree tailored per file. Files whose structure differs from the tree are reported by name, with the gates dropped and the gates kept. A single-tree import asks which files it is for: all files, the selected files or the viewed file alone.
  • Clear gates and populations starts gating again on the same files, one undo away. Populations move with a plain drag; Option-drag copies them to another parent with their gates shared, which is how the same quadrant is gated under several parents. Branches fold behind a triangle, and the tree's connector lines join.

FlowJo workspaces

  • Import reads every gate kind FlowJo writes. Ellipsoid gates are converted from FlowJo's display channel space, so they land where FlowJo evaluates them. Curly quadrants import with their bend fitted against FlowJo's own counts, since FlowJo writes the bend nowhere; on the deposits with a retrieved file the largest count difference fell from 22.8% to 6.9%.
  • Boolean populations import. An AND population becomes an intersection, nested ANDs flattened; a NOT population becomes an excluded reference, read from the population it names rather than the stale copy FlowJo stores beside it. OR is reported and skipped with its subtree, and the warning names the population.
  • Opening a workspace imports every strategy by default, one tree per file, tailored. Files the workspace names but does not gate load as data, unchecked. The spillover question is asked in the open dialog, and only when the workspace's matrix differs from the file's. Files already open are not loaded again, Import waits until the matrix comparison has settled, and cancelling the strategy question undoes the open. "Use the workspace's folder" finds the FCS files the workspace names, and the folder is remembered.
  • Channel names resolve exactly for flow, with the laser prefix respected, so a violet-laser gate is never evaluated on the blue laser's detector behind the same filter. The metal-name normaliser now runs for mass cytometry only, and an ambiguous match is refused with the channel named rather than guessed.
  • Every file a per-file import assigns a tree to is compensated under the decision the import made, not the primary file alone.
  • Export FlowJo workspace writes what FlowJo 10.10 writes: one sample per loaded file with the tree it is gated under and its count on every node, every parameter declared in FlowJo's vocabulary, vertices raw with a polygon traced on the declared display where its edges would otherwise bow, quadrants as FlowJo's four polygons, NOT, AND and OR populations as FlowJo's nodes, the active spillover matrix, and each GateLab group as a FlowJo group. FlowJo opens it, and FACSChorus reads sort gates from it.
  • Against the counts FlowJo itself recorded in 267 public FlowRepository workspaces, GateLab's count was within 1% of FlowJo's for 2,495 of 3,099 populations and identical for 660.

BD FACSDiscover S8 and FACSChorus

  • Import gating takes a FACSChorus experiment file (.cef): the gates as they are now, or the snapshot every sort record keeps of the gates it was sorted under, with the colours Chorus drew them in. A .cef can be opened before any FCS, and the matching file is asked for afterwards.
  • Import gates recorded in the loaded files reads the gate tree every S8 FCS carries in its BDCHORUSDATARECORD keyword. Compare with FACSChorus statistics sets Chorus's population counts beside GateLab's, with the reason for every difference.
  • The image-derived features (Size, the moments, Eccentricity, Diffusivity, Centre of Mass, Delta CoM, Correlation, Max and Total Intensity) are kept through the spectral channel filter under their own names, read from $PnFEATURE. The geometry features are shown on a linear axis, arcsinh on request; their names are locked in the Panel tab like scatter and Time; the two intensity features are left out of a spillover matrix.

Gates and the plot

  • Curly quadrants can be drawn and edited: beyond the crosshair the arms bend, a handle part-way along each arm sets the bend, the arms run to the edge of the plot, and the handles follow the crosshair while it is dragged.
  • New quadrant populations are named by their axes and signs ("CD4+ CD8-"), or as DN, DP and SP, chosen when the gate is made; either scheme can be applied to every quadrant gate already in the tree. Each quadrant's label reads "55.7% (n = 747)" and drags like a gate label.
  • A gate label dropped into the empty part of a zoomed-out plot stays where it was put.
  • Colour by a third marker: viridis, magma, plasma, inferno, cividis, turbo, jet or greys, with a colour bar whose labels sit where the events of that value are, and a contrast slider. A click on the row already highlighted in the Colour by picker chooses it.
  • Selecting a gate adds its siblings to the plot and never removes the others.
  • Axis ranges follow each file unless "Lock scales between files" freezes one frame for comparison; a reset under the lock refits the shared frame. Explicit scale choices (linear or arcsinh on scatter, a cofactor, arcsinh in place of logicle, an explicit W) survive applying a compensation matrix and come back the same from a saved workspace whichever assay layer was active.

FCS import and Gating-ML

  • $PnE hardware log amplification is decoded on import for integer data, as flowCore, FlowJo and flowio do, so a FACSCalibur, MoFlo or Influx file reaches the app as the intensities the instrument measured. Values above $PnR wrap to the channel's bit width, and the channel range describes the decoded values.
  • A file is treated as spectral-unmixed only when it carries more than one raw detector, so analysers that name a conjugate in $PnS (CytoFLEX, Xitogen) keep every channel.
  • Gating-ML's log transform is held as a gate space: a log gate imports with its vertices verbatim, its badge reads O, and it exports as flog in both formats. A FlowJo log rectangle whose lower edge sits at FlowJo's floor is written unbounded below, so a strict reader keeps those events. FlowJo's fasinh declaration is read, which makes the mass cytometry round trip exact.

Compensation

  • A flow file with no matrix offers Start from an empty matrix: the identity over the file's detectors, every spillover at zero, editable cell by cell, each change a revision of the baseline.
  • Remove the matrix uninstalls the compensated layer from every file carrying it, drops the profile and returns the assay to Original, with the same gate-recompute acknowledgement Apply asks for.
  • The matrix's row and column labels are sized to the longest channel name instead of being clipped. The pair inspector's Original and Compensated plots have readable axes: 6 px ticks, fonts of 9 to 13 px, and the y title kept clear of the tick labels.
  • The tab takes the same layout as Plotting and Statistics: a left pane with the matrix view, the review scope, the Apply controls and the biplot display, and the matrix and pair inspector in the body.

Illustration, Plotting and Statistics

  • The Illustration tab is a figure workspace of its own: a Data, Plots, Arrange, Style and Export inspector; independent figure selections with undo, redo and presets; nested rows, columns and pages; grouping by sample metadata; separate files, overlays or event-weighted pooling; histograms, ridgelines and full-event heatmaps; quadrants and size-aware axis labels; DPI-aware PNG and PDF, SVG with vector axes and gates.
  • A figure's axes follow the Gating tab live under "As on the Gating tab", which is the default for a new figure: each channel takes the Gating tab's explicit scale where one is set and the frame the Gating tab would fit otherwise. Fit data + gates fits every channel the figure plots. A Refresh button rebuilds every panel.
  • Gate labels in a figure can be dragged, quadrant labels included, and the figure keeps its own placement without touching the Gating tab's. The gate line width is set in the Style section beside Plain gate labels. The inspector is compact, one line per file and population, and its width drags. Minor log ticks are half the length of the major ones.
  • The Proportions tab is now Plotting. Files are chosen on the left, the chart sits in the middle, and the populations take a pane of their own on the right: one tree in which a row's box ticks the population to show and its name makes it the parent to compose within. A stacked composition is the children of one parent, to 100% with the rest of that parent. Facets by file or metadata, explicit replicate units and saved settings.
  • The Statistics tab takes the same inspector layout, and its file scope follows the active tree, so a workspace with groups no longer reads "No populations yet".
  • The Layout tab is hidden until it gets the work it needs.
  • The Strategy and Illustration grids default to 12 pt, and the Illustration fit considers only the gates on the plots it shows.

Workspace and interface

  • Workspace, Import and Export are header menus; the sidebar keeps the file list, the workspace's name and a Save button that shows a dot while there are unsaved changes.
  • The strip above the gating plot is two rows: the axis labels on the plot choose the channels, the density controls sit behind one Display button that reads what is set, and the Transforms row holds every per-axis transform in a fixed slot per axis.
  • Nothing in the toolbars, rows and side panels moves as you work: text whose width changes sits in a slot of fixed width, controls that apply only sometimes stay mounted and disabled, and the side pane widens in steps and never narrows by itself. The tab strip spans the window beneath the header, so a tab sits at the same place whichever tab is open.
  • Popovers close on a click outside them or Escape. The side panes' widths save with the workspace. Population rows do not select text on Shift-click.
  • The Metadata chips in the file list select samples by their metadata; in the Illustration tab they get a board of their own and fold behind a summary.
  • Workspace files: a saved workspace with a compensation profile, a group or a group-owned tree opens again; scale choices restore by their saved key; each hierarchy's gates are saved with it.

Fixed

  • Duplicate hierarchy lost its gates; a deleted gate pruned the parked trees; "Fit data + gates" in the Illustration and Strategy tabs pushed the data to the top of the plot; the density readout beside the slider read larger than its neighbours; connectors in the population tree stopped short of tall rows; a 4 px slip in the tree reparented a population; the contrast exponent was normalised per event; the active file was pooled twice into the marker colour scale.
  • A workspace with groups failed to open ("Unexpected: groupId", "hierarchy cannot lock structure without a file owner"); a workspace saved with a compensation profile failed to open ("Unexpected: plotting").
  • The Cytobank Gating-ML export declared a log gate as arcsinh; the Cytobank definition JSON for a log dimension said Arcsinh.
  • A barcode scheme imported into a new tree took copies of the gates it reuses, so the new tree owns them (0.7.x behaviour restored under per-tree gates).

For GateLabR

The React tree embedded by GateLabR is the same code, so a GateLabR release carrying this build gets the whole of the above under the R host, except that the compensation matrix cannot be removed from the R side and the Layout tab stays hidden.