Releases: david-priest/GateLab
Release list
GateLab 0.8.2
The Layout tab is the new part of this release: a page editor where a figure is finished and exported, fed by the Illustration tab, which now works as the place to generate many consistent panels and send them across. Around it, the Gating tab gained the gate-alignment tools that a quadrant gate cannot give, the workspace can be taken back to any earlier state kept in the browser, and a long list of smaller things reported during a day of use were fixed. Version 0.8.1 was tagged in the source but not published as a release, so these notes cover everything since 0.8.0.
The Layout tab
A page editor for the final figure. The Layout tab draws plots on the Gating tab's axes and lets them be arranged on a page: drag by the body, resize by handles or edges, select with a click or a marquee, Shift to add, and move or resize a selection together. Items snap to a grid, to each other's edges and centres and to the page's edges and margins, with the guide lines drawn. Align left, centre, right, top, middle and bottom, spread three or more evenly, lock, bring to front and send to back. The keyboard works on the page: arrows nudge, Delete removes, Cmd-D duplicates, Cmd-Z and Shift-Cmd-Z undo and redo, Escape clears. An Option-drag copies the selection where it is dropped, and a ghost of the original stays in place until then so the copy is seen leaving it. Every button has a tooltip, and number fields commit on Enter or on leaving the field rather than on every keystroke.
A page in millimetres. The page has a size in millimetres with presets (A4, US Letter, journal one-column and two-column), an orientation, margins, and a grid of pages across and down drawn with dashed page breaks. Fit page to content makes a custom page around the items; Fit content to page scales the items into the first page as a whole, each drawn at the size it had and zoomed, so fonts, gates and margins shrink in proportion instead of a smaller plot being drawn. An item dragged past the page's edge overhangs it rather than vanishing; Preview and the export clip to the page. Plots are drawn at the display's resolution times the page zoom, and Option-scroll, Shift-scroll or a pinch zooms about the pointer here and on the Illustration tab.
Export. A sheet exports as PDF, SVG or PNG at a chosen resolution, one page per page of the grid, and every page of an iteration.
Batch mode. Under Iterate, a sheet becomes a template drawn once per file, or once per population of one file, either as one page per unit or as tiles laid rows by columns on each page. Which files: the checked ones, all of them, a group, or the files with a given value in a metadata column. Items that follow the iteration are drawn for each unit in turn; the rest repeat on every page. Text and titles take placeholders filled per unit. A file that follows a tailored or group copy of the tree shows its own population, followed by provenance, and a file without the population says so.
What goes on the page. Plots and histograms of any file and population; a gating-strategy strip that fits its frame, picking the column count that gives the largest plot; a summary chart, one statistic of a population per file grouped by a metadata column with a rank test between the groups; an Illustration figure as one block drawn by the Illustration tab's own machinery; the Plotting tab's chart as one block; and text. The Gating tab's Add to Layout button puts the current plot on the page; the Plotting tab has the same; the Illustration tab adds a panel, a row, a column, a page or the selected panels, keeping the arrangement they had, rows staying rows and columns staying columns however wide the page, with the figure's headings carried along as text that reads each row's or column's first plot.
Plot style per sheet. Point size and opacity, events drawn, contour threshold, levels and smoothing, gate line width, publication style, histogram line and fill, and the tick, axis, title and gate-label fonts are set once per sheet under Style, and any plot or strategy may set its own values under Items, the rest following the sheet.
Plot titles by template. A sheet carries a title template for its plots. By default it is what differs across the page: the population when the page is one file's populations, the file when it is one population's files, both otherwise, which suits a debarcoded mass cytometry workspace of one file and many populations as well as a comparison of many files. Presets cover the common choices, and a builder composes a custom template from the workspace's own fields as chips: the population and its metadata fields, the file, its sample id and its metadata columns, the plot, its channels and its count, with a separator between them and a live preview from the first plot. A plot's own title, typed under Items, still wins for that plot, and a title too long for its plot loses its end at the size set, the whole title as a tooltip.
Text that reads a plot. A text block can be bound to a plot, and its placeholders then say what that plot's file and population say, on every page and tile of an iteration; a heading above a column reads the condition of the file beneath it. Text blocks can be bold.
Right-click menus. On a Layout item, the inspector's actions for it or for the selection it is part of; on the page, the items to add there; on an Illustration panel or the heatmap matrix, the ways to send it across, open it in Gating or remove its population or file from the figure.
The Illustration tab
The summary heatmap is drawn as one matrix of populations by files, in the manner of a marker expression heatmap, with clustering switchable and off by default. The population selector gained Use checked, All, None, Leaves and a find box. Populations and files are ordered by choosing and dragging in the Arrange tab, with sorts by name and by tree order, and populations can be grouped by a field of the Metadata tab's population table. Every channel picker in the app is now the searchable kind. A gate label dragged in a panel repaints that panel rather than rebuilding the figure, and a label's placement is the gate's own: moved on any tab it shows on every tab. The last complete figure stays on screen while a rebuild is pending, so an edit no longer flashes white. Number fields commit on Enter or on leaving, and the preview draws up to a million events per panel. Gate overlays are clipped to a panel's axes, so a gate that lies beyond the range drawn no longer runs over the margins.
The Gating tab
Gates that meet. With Snap to other gates on, a vertex being drawn or dragged lands on another gate's vertex or edge when it comes within a few pixels, and on the plot's edges; a moved gate's nearest vertex lands on a neighbour; Alt places a point freely. Close gaps moves the facing edges of neighbouring gates onto one shared line, so gates partition a plot with neither gap nor overlap where a quadrant gate does not fit. Extend to edges puts a gate's outward sides on the axis limits, or on the first neighbouring gate in the way, pulling back a side that overshoots as well as pushing out one that falls short, and a corner resting on a neighbour's edge slides along it. After a pan or stretch, a gate side that ends within a few pixels of a border lands on it.
Editing polygons. A right-click on a polygon's vertex offers Delete vertex, and on an edge Add vertex here. Shift held while dragging a vertex holds its edge to the previous vertex horizontal, vertical or at 45 degrees. Undo and redo buttons sit beside the draw tools for a vertex moved a little too far.
Moving and stretching the data. A drag in the grey margin around the axes pans, and a Shift-drag there stretches, whatever the gates cover; a stretch from beyond the plot's right edge or above its top now stretches that axis too. In contour mode a pan or stretch is drawn as dots and the contours reform on release, so the gesture can be judged as it happens.
Smaller changes. The gate list folds away behind its heading. The population list's gate badges line up in one column, with the alignment switchable. Lock scales between files holds across the original and compensated views. Gate labels on figures can say the name and percentage, the percentage, the number alone, the name alone, or nothing. The font sizes moved into the Display popover, and the tree bar above the population list reads as two lines: the tree, its file count and Revert; then what edits change. A gate drawn while a group or a file is the edit target goes into the tree for every file rather than being refused. The Compensation tab has a point size slider beside point opacity.
Workspaces and files
Revert workspace. GateLab keeps checkpoints of the open workspace in the browser: as it was opened, every two minutes while it changes, and before anything destructive. Workspace, Revert workspace… lists them with how long ago each was taken and why, the one as opened marked, and goes back to the one chosen, keeping the current state as a checkpoint first, so with autosave writing over the file a change is no longer final. The checkpoint taken after an import now holds the imported gates, which it did not when the import also switched compensation on.
Groups from metadata. The Groups menu makes groups from a metadata column, one per distinct value, showing what it will make first, and its entries are ordered with the ways to make groups first. A workspace whose tree locks its structure without an owner opens again, repaired to the group of the same name or unlocked. In the files list, the arrow keys view the file they land on, leaving the checked selection alone, and double-click renames a population without Shift.
Import and export. The FlowJo export declares a biexponential that reaches every gate vertex, so a polygon below FlowJo's default floor is written whole; a vertex the declared axis still cannot hol...
GateLab 0.8.0
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...
GateLab 0.7.7
Select samples by their metadata, import every FlowJo tree, and assign files to a hierarchy.
Samples panel. A hosted SCE arrives with per-sample metadata already filled in, so the samples panel now shows a row of value chips per metadata column: donor, cell type, stimulation, batch. A chip is a bulk checkbox over the checked set rather than a filter — clicking one checks every sample carrying that value, or unchecks them when they are all checked already, and a partly-checked chip is filled to its fraction. The sample list is never narrowed.
Each row also carries a padlock. Holding one row fixed bounds every later chip click to the samples it holds, so a cell type can be held while the stimulation is switched — which the chips alone cannot express, since a checked set does not record why the other files are out. What is held is written on the row, because the checked set feeds the pooled display, Statistics and Proportions.
A metadata column without a value for every sample is not treated as sample metadata. A gate written back into a hosted object's colData is per-event, so it arrives only for samples whose events were entirely positive or entirely negative; such a column is kept out of the automatic chip rows and, where it is chosen by hand, marked with the number of samples it actually reaches.
Hierarchies. Files can be assigned per hierarchy, marked by a numbered colour badge with an inset white ring. A FlowJo workspace import now brings in every tree rather than the first.
Also fixes unused declarations in the barcode scheme and elsewhere, and restores the hierarchies test suite.
GateLab 0.7.6
Gate labels count what the plot draws
When more than one checked file is plotted, the percentage on a gate label, and the count in the gate list, are now pooled over the same files the cloud is drawn from, and the label says pooled beside the figure; its tooltip gives the file count. Before, both were the blue file's own, so a file with no events in a region read 0.0% beneath a dense cloud drawn from the others. While the other checked files are still being gated in the background the label says blue file only instead. A single plotted file keeps its bare, exact count. Quadrant labels carry the scope too; the Strategy and Illustration tabs keep their per-file counts.
For the R host (GateLabR 1.4.6)
An explicit Save to SCE now also sends every population's membership, for every hierarchy and every sample, so GateLabR can store it beside the workspace and R can read the whole tree back without re-gating. Autosaves send geometry only. The save message reports how many populations and hierarchies went across, or says when the R side stored none.
Colour by gains a colData group listing the SCE's factor, character and logical columns (up to 254 levels), such as a FlowSOM or CATALYST merge level, so cluster composition can be watched while a gate is dragged. A column's values are fetched once, when it is chosen; a palette fixed in the SCE metadata replaces the app's palette so the plot matches the analysis figures.
Neither of these changes the standalone browser build beyond the menu, which shows the colData group only under an R host.
v0.7.5 — a hierarchy you can write by hand: import and save gates and populations as CSV
A hierarchy you can write by hand
The barcode-scheme file has become a general hierarchy file, and the buttons are now Import hierarchy CSV and Save hierarchy CSV. A population is one line, # population: B cells < Live = CD19+, not CD3+: the name, the parent after <, and the gates, with not for a NOT-reference. Leave the parent out and the population nests under the previous line. A gate is one line, # gate: CD3+ | rectangle | CD3 x SSC-A | asinh, linear | x 2..8 | y 0..200000: name, rectangle or polygon, the two channels joined by x, the scale, then the shape as ranges or as (x,y) points. A file of such lines imports as a tree under the population you choose, or into a new hierarchy. Mistakes are reported with their line number rather than guessed at, and a file that Excel has quoted still reads.
For a CyTOF debarcoding scheme the same lines sit above the sample table and describe the QC populations, so the whole strategy is in one file. A gate named without a # gate: line of its own takes its shape from the template, which keeps a hand-written file short: two population lines naming the standard gates are enough. A gate used by two populations is created once and shared, and gates the workspace already has are reused by name and channels.
Saving writes any workspace the same way: every polygon and rectangle gate and every population naming its parent, plus, for a debarcoding strategy, the sample table and the template. Quadrant and ellipse gates cannot be written in this form and are listed at the top of the file. A saved file rebuilds the same gates and populations when imported, with no template needed.
v0.7.4 — several population hierarchies, file dialogs that remember the folder, ellipse handles at the vertices
Several population hierarchies over the same gates
A workspace can now hold more than one population hierarchy. Every hierarchy shares the one gate table, so a gate moved on one is moved on all of them, and only the populations differ. The menu at the top of the populations list switches between hierarchies and can create an empty one, duplicate the current one, rename it or delete it; the gates stay when a hierarchy goes. Undo works across a switch, deleting a gate removes it from every hierarchy, and a workspace saved before this release opens as one hierarchy called Main.
The case this was built for is a multiplexed CyTOF run whose files use two barcoding schemes. The barcode scheme import can now send a scheme straight into a new hierarchy, and it reuses gates the workspace already has, matched by name and channels, rather than creating copies, so both schemes run on identical barcode gates. Exports read the active hierarchy, and the FCS export dialog names it; switch hierarchies to export the rest.
File dialogs start where you last were
Every open, folder and save dialog now starts in the folder of the file you last opened or saved, from whichever button. Before, each button remembered its own folder, because each used its own picker identity in the browser. The buttons that still used a plain file input, such as the Gating-ML and FlowJo import, the barcode scheme and template, the metadata and panel tables and the CyTOF spillover matrix, now go through the same dialog when the browser provides it.
Fixed
The four handles of an ellipse gate now sit at the ellipse's on-screen vertices, the two farthest points from the centre and the two nearest. They were placed at the axis ends in display units, and when the two axes have different pixel scales that mapping rotates the axes, so two handles sat off the drawn shape. A handle drag keeps the handle under the cursor and never swaps it with its partner.
The move-to-parent tool has left the populations toolbar: shift-drag of the highlighted rows does that job.
v0.7.3 — debarcoding from the sample table, moving several populations at once, FlowJo import fixes
Debarcoding from the sample table
A multiplexed CyTOF tube is debarcoded in GateLab by manual gating on the barcode planes: four gates per plane, one per state of the isotope pair, and one population per sample that intersects one gate from each plane. Until now that strategy was drawn from scratch and named by hand. Import barcode scheme builds it from the wet-lab record instead.
The table is a CSV or TSV with one row per sample and one column per barcode channel holding 1 or 0, the header naming the isotope (89Y, 194Pt, or 89 alone). A name column names the population and a file_name column names its FCS export; any other column becomes population metadata. The lab's string form (89+196-113+115-194-195- in a barcode column) is accepted too. A blank state, a duplicate combination, or a channel that cannot be matched stops the import with the row named.
Which channels are drawn together is a separate choice, because it is a drawing decision and it is where the odd-channel case lives. Channels are paired in column order, an odd channel is drawn against the DNA channel as a display-only axis, the dialog lets you re-pair, and # plane: 195Pt x 194Pt lines in the file declare the layout for the record.
The gates come from a template. The built-in one is taken from a real workspace and carries two things: the QC chain above the samples (the Gaussian parameter gates against Time, singlets on event length against DNA, a DNA-positive bead-negative gate, then a live gate), in the same forms they are drawn in, and the four polygons per plane. Every barcode gate is a polygon of seven or eight vertices, so it can be bent as well as resized. A gate whose channel the file lacks is left out and named. Save barcode scheme writes a workspace's existing strategy back out as both files, the scheme table as CSV and the template as JSON, and the written table imports to the same strategy.
Moving several populations at once
In the population tree the blue highlight is now a selection. Shift-click highlights the range from the active population to the clicked row, Cmd or Ctrl-click adds or removes a row, and a shift-drag on a highlighted row moves every highlighted row together, keeping their order and each one's subtree. The checkboxes keep their old job of pooling the display and feeding duplicate, move and delete, and All / None buttons for them sit above the list.
Fixed
Three FlowJo workspace conventions imported wrong without any error, found with a public dataset (Michaelis et al. 2025). FlowJo writes a parameter named LIVE/DEAD Aqua-A as LIVE_DEAD Aqua-A in its keyword table and spillover matrix, so that matrix row was dropped and the other channels were compensated without it; the import now tries that one substitution when nothing else matches. FlowJo stores a Time-axis gate in seconds, raw Time multiplied by $TIMESTEP, so in ticks the root gate selected nothing; Time coordinates are now divided by the file's $TIMESTEP before anything else. Leaf names that recur under several parents (IFNy FITC + under four cytokine gates) collided in counts and exports; such names are qualified with as many parents as they need.
A workspace saved by 0.7.0 or later could not be reopened: the file carried two per-sample scale lists that the reader had not been told about.
v0.7.0 — per-gate coordinate space, arcsinh fluorescence, and a reliable navigate drag
Gates carry the space they were drawn in
Every gate now records its own coordinate space and the transforms it was recorded under, and each is evaluated against its own columns. A workspace can hold gates of both kinds at once, which is what happens as soon as you open a FlowJo workspace alongside your own.
Gates you draw in GateLab are stored in raw channel values, so nothing you do to a display control moves an event in or out of one. FlowJo and Gating-ML 2.0 both treat a polygon as straight lines in whatever space the axis is showing, so under those rules the gate changes when the view does. Neither is wrong, but they differ, and GateLab now says which it is using on every gate rather than leaving you to assume.
New
- Arcsinh as an alternative to logicle on fluorescence channels, with the cofactor on a slider. The cofactor is what makes the axis differ from a log scale: raise it to pack the near-zero noise tighter, lower it to spread it out.
- Two letters on each gate label naming the space of its x and y axes: R raw, A arcsinh, L logicle, B FlowJo biex, N linear. A star means the axis you are looking at is not the one the gate was drawn in.
- FlowJo's biex and log transforms, ported from cytolib and checked against populations FlowJo exported itself, so imported gates land where FlowJo evaluates them.
- Gating-ML export declares the transform each gate's vertices are actually straight in. Import reads
transformation-refthe way the specification means it. - The checked files are the whole selection; the separate active row is gone. Files whose panel differs are refused for pooling rather than narrowed to shared channels.
Fixed
- Shift-drag to stretch was unreliable. Two pan implementations were running on the same drag and disagreeing about what Shift meant; one has been removed. Shift is also read from key events now, so pressing it without moving the mouse works.
- Gate labels could be lost off the plot, and the axis fit followed them there, which shrank whole datasets into a corner. A label that would fall outside now returns to its default position, and no label can drag the axis out to reach it.
- The plot canvas drew at CSS pixel resolution, so on a Retina screen every event was rendered at half the resolution available.
- Arcsinh axis ticks vanished at high cofactors, leaving an axis labelled with a lone zero.
- The exported scales file recorded a cofactor only for scatter, so an arcsinh fluorescence channel went out with nothing a reader could reproduce its axis from.
- The x-axis channel picker opened downward off the bottom of the screen.
- Importing into an empty workspace asked whether to merge or replace, which were the same thing.
- Changing an axis transform flashed a misshapen gate before the plot settled.
- A FlowJo workspace could load its files and no gating hierarchy, with no explanation.
CytoML, a separate implementation by different authors, agrees with GateLab on all eighteen populations of a published workspace with no event differing.
v0.6.0 — gate edge rendering, and the view stays where you put it
Gate edges: three ways to draw them
A polygon's edges are straight in the values the gate is stored in, not in the scale you are looking at. On a log, logicle or arcsinh axis their true shape is a curve, so joining the corners with straight lines draws something that is not quite the gate. On a scatter gate spanning zero the drawn edge can miss the real boundary by a wide margin while the counts follow the real one.
The new Gate edges control offers straight plus true edge (the default, straight edges to work with and a thin grey line showing where the gate actually falls), straight alone, or the true edge alone. A short note appears under the plot when a gate on it actually curves. None of it changes gating: the same events are in the same gates in every mode.
Fixed
- The view no longer snaps back. Panning or stretching changed the view without telling the rest of the app, so the next redraw restored the range the workspace opened with. Contours could also sit at a scale nothing else agreed with.
- Gates no longer flicker the data. Editing, selecting or moving a gate redrew every cell; overlays now update on their own.
- Gate edges follow their handles while you drag, instead of lagging until the drag ends.
- Dragging a gate label no longer pans the plot.
Also
- Ticking a gate in the Gates list shows it on its own biplot even if it defines no population, which is useful for trying a gate out or comparing two candidates.
- Choosing FCS files for a FlowJo workspace opens in the workspace's own folder.
v0.5.0 — open FlowJo workspaces, and choose the compensation matrix
Open a FlowJo workspace (beta)
Open Workspace… now accepts .wsp. A workspace holds gates and the names of the files they were drawn on but no data, so GateLab resolves those names against the files already open plus anything you point it at, and reports the tally. Samples whose FCS never turns up are named and skipped rather than blocking the others.
It asks about three things it cannot decide: which file is which (matched on the recorded path, then the sample node's name, then $FIL, because no one of those is present in every workspace and they frequently disagree), which strategy when a sample holds several, and which compensation.
Beta on purpose. Exercised against a 24-sample BD FACSDiscover S8 export and a published BD FACSDiva sort, both FlowJo 10.9 or 10.10 on macOS. Other vendors, older versions and Windows-authored workspaces are untested. Unreadable gate types are reported and skipped, never dropped silently.
The file's compensation matrix may not be the analysis's
This can change where your fluorescence gates land. A BD FACSDiva export writes the matrix recorded at acquisition into the FCS, while any adjustment the operator made afterwards lives only in the FlowJo workspace. In one published sort, seven of forty-two off-diagonal coefficients had been adjusted by hand, by as much as 0.105.
GateLab used to take the file's matrix without comment, which placed every fluorescence gate slightly wrong while looking healthy. When the two differ you are now shown both with the size of the disagreement and asked which to use, defaulting to the workspace's since that is what was in force when the gates were drawn.
Fixed
- Gates on
Comp-prefixed dimensions resolved onto the uncompensated channel and imported cleanly into the wrong space. Such a strategy is now either compensated properly or refused. - Gate outlines follow the real boundary. On an arcsinh axis spanning zero the drawn edge could miss it by hundreds of pixels, putting events on the visibly wrong side of a line that was gating them correctly. Only the drawing moved; gating, stored gates and exports are unchanged.
- Contour plots no longer freeze while panning or stretching.
- Reading a large workspace is no longer quadratic in its keyword count. A 24-sample workspace went from 25 seconds to 2.5.