Skip to content

Releases

GateLabR 1.6.5

Choose a tag to compare

@david-priest david-priest released this 13 Nov 03:02
2419bf6

GateLabR 1.6.5

Embedded core

  • GateLab 0.11.0 (GateLab-dev 41448da6), up from 0.10.1. The Plotting tab draws a channel per cell as violins, boxes, split violins or ridgelines and a channel statistic per sample as boxes, bars or points, with Kruskal-Wallis, pairwise Wilcoxon (Holm) and signed-rank tests, several named charts saved with the workspace, shelves for rows, columns and pages, and the table behind a chart. Layout is a page editor: copy and paste between sheets, panel letters, shapes, formatted text, rulers and guides, placed images and a written legend; the legend of a chart block is a key, and its frame holds the chart at the text sizes of the sheet. Illustration overlays chosen populations and puts chart panels in the figure grid. A population has one colour in every tab, set in the population tree, and the workspace one figure style. New Workspace and Open Workspace ask before unsaved changes are replaced.
  • The file reading, writing and gate evaluation of the core carry 76 corrections from an audit, each with a regression test. Among them: a workspace holding strategy, derived-channel or image settings can be reopened; a file with no $TOT opens; control characters are left out of written Gating-ML names; a GatingSet or Cytobank-model population that excludes a population of another branch is left out by name, where it was imported with the wrong events; a Gating-ML rectangle with min above max is empty, and a population cycle refuses the file. Gate evaluation is otherwise unchanged.
  • Gating-ML export keeps representable empty quadrant regions and their dependent populations. Changing the transform of one channel keeps the chosen range of the other. Illustration and Layout keep unrelated gate outlines out of an empty branch. Plotting tables use sample headings in R without renaming user metadata columns.

R package

  • gatelabSync() refuses an object whose cells are not those of the app, sample by sample and in order. It compared the cell count and the column names only, and CATALYST::prepData() builds an object without column names, so an object whose events were reordered within a sample passed, and the next Save to SCE or colData write placed the values of each sample on other cells. Without unique column names the order is proven by the event ids of the last save, or by an assay both objects hold being equal on the channels both hold.
  • The package logo and the header of the embedded app use the blue GateLabR branding and the wordmark alone.

Compatibility

  • GateLabR 1.6.4 refuses a workspace saved into an object by 1.6.5, with a message, when it is saved with a compensation profile and also holds named charts or an edited figure style. Other workspaces open in both.

Tested

  • testthat: 333 tests, 2,809 expectations, 0 failed. R CMD check: 0 errors, 0 warnings, 3 notes (installed size, future timestamps, assignments to the global environment).
  • Host parity check on the served package: 23 of 23.

GateLabR 1.6.4

Choose a tag to compare

@david-priest david-priest released this 26 Oct 10:42
aced1fc

GateLabR 1.6.4

Embedded core

  • GateLab 0.10.1 (GateLab-dev 161a0a07), up from 0.10.0. Export → MIFlowCyt report, from the instrument and parameter keywords the data carry; Export → Export event memberships; File list ⋯ → Tailored gates, with a reason saved for each; Display → Control, another sample drawn in grey beneath the plot, display only; Populations ⋯ → Mark siblings that share events; Statistics → Minimum events; the Gating-ML export naming the gates it writes other than as drawn; the FACSChorus export keeping each matched gate's own axis scale. Gate definitions and gate evaluation are unchanged.

R host

  • gatelabStrategyPlot() draws a workspace as the app showed it: through the saved display transforms, with each tailored sample's own outline, inclusion rule and parent count, and each sample's saved compensated layer.
  • A saved Hyperlog transform is rebuilt with flowCore's own Hyperlog; a GatingSet's legacy and Gating-ML 2 logicle channels are read in the object's own coordinates.
  • Compensation: Apply works in a live session on SCE and GatingSet hosts; a compensated GatingSet no longer has its matrix applied a second time; a read-only GatingSet, a compensated assay and an identity matrix on a GatingSet are refused before anything is recorded; metadata(sce)$spillover is offered on mass cytometry data only.

Compatibility

  • GateLabR 1.6.3 refuses a workspace saved by 1.6.4, with a message, when it is saved with a compensation profile and also holds a minimum event count, tailoring reasons or MIFlowCyt author items. Other workspaces open in both.

Tested

  • testthat 2,791 expectations, 0 failed. R CMD check 0 errors, 0 warnings, 3 notes. Host parity 23 of 23.

GateLabR 1.6.3

Choose a tag to compare

@david-priest david-priest released this 23 Oct 12:37
4af4d85

GateLabR 1.6.3

Embedded core

  • GateLab 0.10.0 (GateLab-dev 822e42b), up from 0.9.3. Spider quadrants, FlowJo 11 workbenches (.flowjo) read and written, a histogram view with Range and Bisector tools, a file's own version of a gate, the gate list and population tree selected by highlighted rows, gates drawn black unless Coloured gates is on, a width slider on a biexponential axis, a Matrices list for compensation, and the restyled interface.

Compatibility

  • Workspaces saved by 1.6.2 open, with gates drawn black unless Coloured gates is turned on.
  • GateLabR 1.6.2 refuses a workspace saved by 1.6.3, with a message, when it holds a spider quadrant, a Hyperlog axis, a gate on FlowJo 11's grid, a named or active compensation matrix, or a biexponential axis shown at other than its recorded parameters. Other workspaces open in both.
  • "Save to GatingSet" and gatelabGatingSet() write spider quadrants, and gates in a Hyperlog space or on FlowJo 11's grid, as exact per-sample memberships.
  • gatelabStrategyPlot() draws a spider or curly quadrant as a straight crosshair; a quadrant no population was made for is counted on that crosshair.

Tested

  • testthat 2,220 passed, 1 error in a test's own setup (test-gatingset.R:1359), also on 1.6.2. Host parity 22 of 23 on the served build: three buttons in Strategy's pooled file list are unstyled, as in GateLab 0.10.0.

GateLabR 1.6.2

Choose a tag to compare

@david-priest david-priest released this 15 Oct 09:25
8bfaf09

GateLabR 1.6.2

GatingSet

  • A GatingSet whose gates differ between samples opens with each sample's own gates. 1.6.1 read the hierarchy from the first sample only, so the app gated every sample with the first sample's gates and "Save to GatingSet" wrote them over every sample's own.
  • "Save to GatingSet" writes in place: an unchanged node is left as it was, a changed gate is set only on the samples whose gate changed, a renamed population renames its node, and a new population is added with each sample's own gate. 1.6.1 removed every node and wrote the app's tree back. gatelabGatingSet() writes the same way.
  • Nodes the app never held (an OR, a node on a FlowJo calibration-table channel, a NOT of an AND, a node of fixed indices, a node added in R since launch) survive a save unchanged and are named in the save report. 1.6.1 removed them.
  • A workspace a 1.6.1 session saved on a GatingSet with tailored gates holds the first sample's gates; the launch note names the affected nodes and how to reopen from the object's own gates.

Embedded core

  • GateLab 0.9.3 (GateLab-dev ec0c0c6). The agent link now connects only to a relay on this computer (127.0.0.1, localhost or [::1]). The 0.9.0 to 0.9.2 cores, embedded since 1.6.0, connected on load to a relay on any host named by ?agent= in the page address, and that relay could read the tab's data and change its gates. launchGatingApp(agent = TRUE) connects as before.

Tested

  • testthat 2,225 expectations, 0 failures; host parity 23 of 23 on the served build.
  • A GatingSet parsed from FlowRepository FR-FCM-Z2V4 (three samples): app counts equal flowWorkspace's on 114 of 114 node-sample pairs before the save, none changed by the save, 117 of 117 after it. On 1.6.1 the same save changed 21 of 114.

GateLabR 1.6.1

Choose a tag to compare

@david-priest david-priest released this 13 Oct 12:56
9c992d0

GateLabR 1.6.1

GatingSet

  • launchGatingApp(gs) opens the app on a flowWorkspace GatingSet, from the object itself. The hierarchy it holds opens as the app's gates, evaluated in the transformed space the object evaluates them in, with the same counts; the axes take the object's transforms (logicle, arcsinh, FlowJo's biexponential, built from cytolib's table); the applied spillover is shown; pData columns are the sample metadata.
  • "Save to GatingSet" writes the populations back into the hierarchy in place: a rectangle as a rectangleGate under any transforms, a polygon or ellipse as its gate when the space is the object's, anything else as its exact per-sample membership. Every gate written is recomputed by flowWorkspace and replaced by the membership if it selects other events. save_gs() keeps the result and the GateLab record (a keyword on every sample).
  • A matrix applied in the app is applied with compensate() in place on a writable, uncompensated, untransformed object; otherwise it is refused with the reason.
  • gatelabPopulations(), gatelabHierarchy(), gatelabLeafPopulation() and gatelabTransforms() read either object; gatelabPopulations(by = "path") names columns by node path.

SingleCellExperiment

  • Every save writes the display transform each channel was drawn on to rowData(sce)$gatelab_transform; the app reopens the object on those transforms, and gatelabTransforms() reads them.
  • gatelabGatingSet(sce) builds a GatingSet from a gated SCE, with the populations as flowWorkspace nodes, for flowWorkspace, openCyto, ggcyto and CytoML.
  • metadata(sce)$spillover is the documented slot for the matrix; the older names are still read.
  • gatelabStrategyPlot() draws the gating strategy of a saved object in R, as the Strategy tab draws it.

Embedded core

  • GateLab 0.9.1 (GateLab-dev 1bf63cd): the FlowJo biexponential axis on a channel that records one, and its parameters in the Transforms panel; a hosted sample's arcsinh and biexponential kept when it joins the workspace's scales.

Tested

  • Headless, through the embedded core: CytoML's public Cytobank GatingSet (12 of 12 node counts equal, 13 populations written back as gates); a GatingSet parsed from a public FlowJo workspace (38 of 38 counts equal on FlowJo's biexponential axes, 39 populations back as gates); an SCE carrying four different row transforms and no workspace (every axis as the row states, the drawn gate's membership equal to flowCore's event by event).
  • flowWorkspace is a suggested package; the GatingSet path needs it installed.

GateLabR 1.6.0

Choose a tag to compare

@david-priest david-priest released this 06 Oct 06:59
921fdb6

The prompt comes back

  • launchGatingApp() returns at once when Shiny 1.14 or later is installed: the prompt is free while the tab is open, and the app is serviced while R is idle (a long computation pauses it until the prompt returns). gatelabStop() stops it; a second launch stops the first. With an older Shiny the launch blocks as before and says so; blocking = TRUE keeps that behaviour, blocking = FALSE insists.
  • A change to the object at the console while the app runs is kept. The app's next save sees that the name no longer holds the object it last wrote, refuses, and names gatelabSync(), which hands the console's object over. Reads such as Colour by never write the object.
  • When the app stops with no population memberships stored, or with memberships older than the workspace, the launcher warns: the readers need an explicit Save to SCE, which autosaves do not replace.

Agents

  • launchGatingApp(sce, agent = TRUE) opens the tab connected to an agent's relay (GateLab's tools/agent-mcp, an MCP server on your computer). The agent reads the gating as you see it and proposes gates, which appear in the tab with a badge and the reason; saving stays yours.

Embedded core

  • GateLab 0.9.0: pooled plots in the Illustration, Layout and Strategy tabs, a Layout sheet drawn once per value of a metadata column, an "All events" switch wherever a plot samples its events, scatter axes that open linear (a saved workspace keeps its scale), key names for the user's keyboard. The browser app's tutorial and demo workspace are not shown under the SCE host.

Compatibility

  • Workspaces saved by 1.5.1 open unchanged. The non-blocking launch needs shiny 1.14.0 (install.packages("shiny")); everything else works on older Shiny.

GateLabR 1.5.1

Choose a tag to compare

@david-priest david-priest released this 01 Oct 06:54
f946ad2

What changes

  • The app's header offers the SCE's assays by name and draws the chosen one. A display-space assay such as exprs is drawn as stored, through the arcsinh its values are in, so a gate drawn on it and one drawn on counts share a space. The app opens on exprs when the object has one.
  • A display assay carries the cofactor of its arcsinh: metadata(sce)$cofactor, else a one-number int_metadata(sce)$cofactor, else 5, said to be assumed. An assay named for its counts (normcounts) is linear; one whose name says nothing is placed by its values. The launch note lists every assay with its space, role and cofactor, in place of the inference that an exprs differing from asinh(counts/cofactor) is "compensated".
  • A workspace whose gate names a channel the SCE lacks is stored and the gate named, instead of every save being refused. Rows renamed since the workspace was saved are recognised at launch and the gates restated.
  • The embedded GateLab core is GateLab master 8b1f206, up from 0.8.4: the pooled view follows the selection and is editable, a mass cytometry SCE opens pooled, the files off the plot are gated in batches between paints, and the composition chart orders sample groups numerically.

Compatibility

  • Open an SCE saved by this version with GateLabR 1.5.1 or later. A workspace saved by this version records the assay it was drawn from; 1.5.0 ignores that and draws the linear counts assay, and refuses the workspace outright when it holds a compensation profile.
  • A GateLabR 1.5.0 session refuses to save a workspace holding a gate on a channel the SCE lacks; this version stores it.

GateLabR 1.5.0

Choose a tag to compare

@david-priest david-priest released this 29 Sep 08:06
f8f018a

What changes

  • The embedded GateLab core is 0.8.4, up from 0.7.7: one population tree per workspace, tailored per file or per group, the Layout tab, the gate-alignment tools, and 0.8.4's reading and writing of FlowJo, Gating-ML and FCS files.
  • A rectangle drawn in this version is half-open, and FlowJo imports are evaluated on FlowJo's gate grid by default.
  • A population that a file's tree has no counterpart for is stored as NA for that file's events.
  • colData columns take the populations' own names, such as CD4-CD8+ T cells.
  • Memberships follow a reorder or a subset of the SCE.

Compatibility

  • Open an SCE saved by this version with GateLabR 1.5.0 or later. Older versions refuse or misread its gates and memberships; NEWS.md gives the details.
  • Memberships saved by 1.4.6 or 1.4.7 are refused until Save to SCE is pressed again.

Known limitation

  • A compensation matrix supplied by a FlowJo workspace is saved with the SCE but not re-applied when it is reopened.

GateLabR 1.4.7

Choose a tag to compare

@david-priest david-priest released this 08 Sep 09:12
5b9b050
  • The embedded GateLab core is 0.7.7 (GateLab master at 7b99de0), up from the 0.7.6 build. The change that matters for an SCE is that samples can now be selected by their colData. GateLabR already collapsed every column constant within a sample and sent one value per sample; the samples panel now draws those as a row of value chips per column, so a sixty-sample object is picked over by donor, condition or batch rather than by hunting through sixty checkboxes.
  • 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 the fraction that is checked. The sample list itself is never narrowed.
  • Each chip row carries a padlock. Holding one row fixed bounds every later chip click to the samples that row 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 colData column without a value for every sample is not treated as sample metadata. A gate written back into colData is per-event, so it reaches the app only for samples whose events were entirely TRUE or entirely FALSE; 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.
  • Also from the core: files can be assigned per hierarchy, marked by a numbered colour badge, and a FlowJo workspace import now brings in every tree rather than the first.

GateLabR 1.4.6

Choose a tag to compare

@david-priest david-priest released this 07 Sep 05:18
c5e158f

Save to SCE now stores which events every population holds, for every hierarchy, beside the workspace in metadata(sce)$gatelab_workspace$memberships, as one packed bitset per population. Four functions read it back without re-gating in R: gatelabHierarchies(), gatelabHierarchy() (one row per population with parent, depth, path, gates and count), gatelabPopulations() (a logical events-by-populations matrix) and gatelabLeafPopulation() (each event's deepest population as a factor, or "ungated"). The memberships remember the workspace revision they were computed at; after an autosave has moved the workspace on they are refused until the next explicit save, unless allow_stale = TRUE. Reading them on a subset SCE is refused, since the masks assume the original event order. If an explicit save reaches R without memberships, the accessors say the core that served it predates them, and the app's save message says when the R side stored none.

"Colour by" now offers the SCE's categorical colData columns: any factor, character or logical column with at most 254 levels, such as a FlowSOM or CATALYST merge level, so cluster composition can be watched while a gate is drawn. The dataset payload carries only the column names and level counts; a column's values are fetched when it is chosen, once, in the per-sample coded form the categorical export already uses. A named colour vector in metadata(sce)$gatelab_palettes[[column]] fixes the colours so the app matches the analysis figures.

Running from a clone with source("launch.R") now sources every file under R/, so functions added in new files are defined the same way as in the installed package.

The embedded GateLab core is GateLab-dev master at 7883c8a: on top of 0.7.5 it sends the memberships with an explicit save, colours by a hosted colData column, and, when the plot pools several checked files, labels gate counts pooled over the same files.