CHANGES IN VERSION 1.15.8
-------------------------

    o The vignette reads the survival test from spicyR's topPairs() columns (p_value, hazard_ratio_sd), which
      spicyR 1.99.42 reports for Kontextual and cell-level results; Statial needs spicyR >= 1.99.42.

CHANGES IN VERSION 1.15.7
-------------------------

    o The test that workers get one BLAS thread is skipped when BLAS runs a single thread anyway (R's reference
      BLAS, as on the Bioconductor builders), where it could not set two threads and failed.

CHANGES IN VERSION 1.15.6
-------------------------

    o The vignette is simpler: arguments equal to their defaults are no longer passed (nCores, the plotting
      options of plotStateChanges(), type = "distances"), the survival vector is made in one step, colTest()
      matches rows to it by name (spicyR 1.99.38), the contamination plot is zoomed with coord_cartesian() instead
      of being redrawn, and the unused library(tibble) is gone. The immune hierarchy no longer refers to a missing
      `bcells` element (it was NULL, so the results are unchanged).

CHANGES IN VERSION 1.15.5
-------------------------

    o kontextualTest() now sets labelClustering = FALSE by default, matching kontextualEngine() in
      spicyR 1.99.31. Without the extra label clustering term the p-values are calibrated under
      relabelling of the images; with it they were too small. Set labelClustering = TRUE to keep the term.

CHANGES IN VERSION 1.15.4
-------------------------

    o Parallel loops (Kontextual(), relabelKontextual(), getDistances(), getAbundances(),
      calcStateChanges()) fork their workers once per call; the workers share the data and receive only
      task numbers, and tasks are handed out in about eight chunks per worker. Socket workers are used on
      Windows. BLAS and OpenMP run one thread in each worker during the call (RhpcBLASctl, now imported);
      OpenBLAS otherwise starts one thread per core in every worker. Kontextual() builds each image's point pattern,
      close pairs and edge correction in one pass over the images. Results are unchanged, except for the
      relabelled images of relabelKontextual() (below).

    o relabelKontextual() takes the seed of its random number streams from the session, so set.seed()
      makes the relabelled images reproducible and the same for any number of cores.

CHANGES IN VERSION 1.15.3
-------------------------

    o Concave windows are computed by a C++ port of concaveman, which gives the same polygon as
      concaveman::concaveman(); concaveman is no longer suggested.

CHANGES IN VERSION 1.15.2
-------------------------

    o Fewer dependencies: treekoR, plotly and concaveman move to Suggests (treekoR is used in the vignette,
      plotly for interactive = TRUE, concaveman for concave windows), and spatstat.explore, cluster, purrr,
      tidyselect, magrittr and S4Vectors, which were not used, are no longer imported.

    o makeWindow(window = "concave") works with the default window.length = NULL; it stopped with
      "argument is of length zero".

CHANGES IN VERSION 1.15.1
-------------------------

NEW FEATURES

    o kontextualTest() tests every triple of a parentDf (from parentCombinations()) between
      conditions or against survival, with patients as the units. In each image the Kontextual
      statistic is compared with its exact expectation and variance if the `to` cells were a
      random choice among the parent's cells, so a change in tissue composition does not by
      itself look like a change in the relationship; images are combined by a frailty GEE with
      a CR2 variance. The computation is done by spicyR (>= 1.99.3, now imported); the result
      works with spicyR's topPairs(), signifPlot() and spicyBoxPlot().

    o Faster SpatioMark. getDistances() and getAbundances() find each cell's neighbours with a grid
      search in C++ instead of spatstat's closepairs() and tidyr's pivot_wider() (the same values;
      the columns are in the order the cell types first appear in the data). calcStateChanges()
      fits every marker and every distance (or abundance) column of a group at once by least squares
      (the same coefficients, t statistics and p-values as lmFit; markers that do not vary within a
      group, whose statistics are rounding noise in both, can differ). The negative binomial test
      (test = "nb") and data with missing intensities use the previous code. kerenSCE is re-saved
      with updateObject(), which removes about a second from every reducedDim() assignment.

SIGNIFICANT USER-VISIBLE CHANGES

    o The vignette tests Kontextual relationships against survival with kontextualTest()
      instead of spicy(alternateResult = ), which compares the Kontextual values as they are.

CHANGES IN VERSION 1.8.0
-------------------------

NEW FEATURES

    o Added getParentPhylo() function to extract parent and all children from a 
      treekoR or Phylo object.
    

SIGNIFICANT USER-VISIBLE CHANGES

    o Vingette has been updated with new getParentPhylo() function and survival
      plots.
    