                 Changes in version 0.2.1 (2023-09-13)                  

Work on FCS

  - handle FCS3.2 files and notably the new behaviour arising from the
    use of $PnDATATYPE. However, add words on 64bits unsigned integers
    that could be used according FCS specifications but are not
    supported in R.

  - Only apply gain $PnG for integers as specified by FCS3.2

  - fix bug with SUPP text

  - skip scaling when PnG <= 0 + add warning in such case in with
    text_check = TRUE

  - handle at as convenient extra argument passed to ... in readFCS

  - create writeFCS (yet not exported) as a more generic FCS file writer
    and use it in IFC_data specialized ExportToFCS function

  - fix bug / handle keywords with "" value

  - add include.pops = TRUE argument in ExportToFCS to tweak whether
    pops should be added or not to exported data

  - improve doc

  - add segment argument to readFCSText to improve identification of
    segment being processed

  - fix warning about delimiter [0x7E] in readFCSdelimiter

Work on ExtractToFuns

  - hot fix following CRAN submission, when info was provided as input
    [formal argument "info" matched by multiple actual arguments]

  - fix issue with display_progress which was not honored

  - add new ExtractImages_toMulti/ExtractMasks_toMulti functions

  - DRY code: create internal dotsParam notably to retrieve objectParam
    input arguments from callers

  - DRY code: create internal fromXML2_graphs, fromXML2_regions, and
    fromXML2_pops to avoid repeating same lines in ExtractFromDAF,
    ExtractFromXIF, and readGatingStrategy

  - allow to pass arguments of getInfo

  - [BREAKING] drop dependency on tiff package and use internal
    functions instead

  - add software version + names + date (msk or img ids) in metadata in
    exported files

  - add internal functions to handle OME specifications in ome.R

Work on Graphs

  - typo preventing setting par for y in plotGraph

  - handle NULL or "" in title, xlab and ylab to allow automatic naming;
    make use of " " (with a space) to show empty labels

  - [BREAKING] plotGraph returned object has changed; f1 and f2 are
    returned. A "graph" attribute being the input graph also appeared.
    Additional message element is provided in case of error. Erroneous
    or empty graphs are now flagged and should produce a graph when
    error text displayed.

  - plotGraph will return an object of class errorif a region missing in
    'obj' but present in 'graph'. This is important for returning an
    object of class error that could be used afterwards by adjustGraph
    to determine if "drawable" or not

  - fix erroneous stats report in plotGraph (plot_stats) in histogram

  - modify label positioning in graphs pos=4 -> adj=c(0.5,0.5)

  - correct line location in histogram when on the edge

  - better handle device opening/closing

  - better handle of par/theme

  - fix adjust_graph behaviour in data_rm functions

  - fix density color computation when there are points outside plots
    limits

  - allow feature-based or function transformation for density color
    computation for raster backend

  - allow region stats computation in graphs even if corresponding pop
    does not exist

  - fix density plot drawing with 0 length value

  - use default values for density colors when graph values are set to
    ""

  - fix empty or error plot drawing error with axis computation

  - fix undesired color produced by providing clipping limits (xlim or
    ylim) with pntsonedge = FALSE in rasterplot. Now returned coords in
    hpp_coord_to_px has gained a subset attribute to allow col and/or
    rgba subsetting.

  - fix use full data rather displayed points for stats computation

  - wip allow to pass arguments to ... in plotGraph (e.g. maxpoints)

  - enh handle alpha in rasterplot (previously not used)

  - fix generate error on 0-length x and when x and y lengths differ in
    rasterplot

  - fix generate error when number of rgba columns does not equal x
    length in rasterplot

  - fix set default pch, size and col when NULL is provided in
    rasterplot

  - fix axis tick labels for LinLog transformations

  - fix axis tick range computation

  - add pre-support for biexp and logicle transformations in axis
    construction

  - add more sub ticks in linear region during axis construction

  - always show +/- hyper on axis if in lim range

  - enh allow control over graph limits for each axis separately through
    viewport

  - enh test if drawable with only very few points

  - export relayout function

Work on ExportToGallery

  - [BREAKING] modify returned object. When export is "file", exported
    path is invisibly returned. An "object_id" attribute is now attached
    to returned value.

  - add new grid and byrow arguments to allow grid gallery export

  - modify add_lines to handle 2 scalars to fit with new grid behaviour

  - change main default value "" to character(0) to allow "" to produce
    an empty banner and character(0) no banner

  - allow export to pdf (if mode is not "base64")

  - correct scale bar sizing and use pix argument instead of res which
    is now removed. set default scale value to 7 and handle simple use
    of TRUE

  - DRY code: call ExtractToFuns functions

Work on XIF

  - fix issue with offset correction in large xif files

  - fix binary chunk extraction error [hpp_readchunk: bad read error]

  - fix TIFF tag value extraction in case of endian swap

  - add new internal IFDtype function to retrieve xif type from 1st IFD

  - enhance XIF subsetting/merging

  - fix features extraction in xif files

  - [BREAKING] change returned value of getInfo by addition of
    "Origin_rif" and "XIF_type" and removal of "Merge_cif"

  - enforce UTF8 and fix bug with parsing non UTF8 file names

  - fix help for composite in objectParam

  - fix spatial offset extraction in objectParam

Work on base64

  - create dedicated base64.hpp file

  - add support for url encoding/decoding

  - add base64 decoding function

  - speed gain

Work on Network

  - add flatten parameter to popsNetwork to allow flat hierarchical tree
    extraction

  - add internal popsStyle and popsTree to facilitate printing of
    population hierarchy

  - add fun argument to popsGetLevels

  - enhance documentation

Work on Populations/Regions/GatingML

  - Handle bimodal gate "dual" and quadrant gate "quad". Note that
    points on upper limit(s) will be considered outside. "dual" is a set
    of two "line" regions sharing same 1st "x" coordinates and with same
    'sync' attribute ID in the form line_ID|v v being 1 for left or 2
    for right side "quad" is a set of four "rect" regions sharing
    same 1st "x" and "y" coordinates and with same 'sync' attribute ID
    in the form quad_ID|v v being 1 for upper-left, 2 for upper-right, 3
    bottom-right, and 4 bottom-left quadrant

  - [BREAKING] handle infinity in regions

  - avoid useless recursion(s) in popsOrderNodes

  - add create_pops argument in data_add_regions to facilitate resulting
    population(s) addition

  - fix index error data_add_regions and data_add_pops due to use of 1:n
    rather than seq_along() seq_len() in loops when final export
    is 0-length following duplicated and already existing regions or
    populations removal

  - avoid population(s) renaming with same name(s) in popsRename

  - improve documentation, messages, warnings, and errors in
    data_modify_pops, data_add_regions, data_add_pops and popsRename

  - internal modification of popsWithin and cpp_pnt_in_gate

  - buildRegion now allow infinite values for coordinates. Before all
    non finite values were removed. Now infinite values are kept and an
    error is raised on NA/NaN. An error is raised when 'poly' vertices
    is < 1 rather than < 2 before

  - Import (i.e. reading from file with ExtractFromDAF, ExtractFromXIF,
    readGatingStrategy) of region will remove NAs/NaN vertices issuing a
    warning if any. An error is raised when number of vertices is < 2,
    of < 1 for 'poly'

  - handle "0" when parsing color from files; will be interpreted as
    "Gray82" in R

  - fix internal xml_new_node

  - fix internal boolean parser when writing GatingML file

  - reconstitute boolean pop when reading GatingML file

  - add missing spillover to returned object of readGatingStrategy

  - fix erroneous "perc_tot" stats returned by applyGatingStrategy

  - fix error that may arise from bad typo in GatingML which could have
    prevented correct region extraction

  - handle/improve attributes propagation for pops and regions. Should
    allow future use of regions/pops syncing

  - fix bug when splitting boolean population definition with
    populations names that can match operators e.g. "A" or "N"

Miscellaneous

  - better handle file extension extraction

  - "sync_utils.R" has been created to gather functions used for "dual"
    and "quad" regions

  - internal splits and keep_attributes have been moved from
    "string_utils.R" to "sync_utils.R"

  - fix ExportToDAF that could produce invalid file due to lack of
    character escape during raw xml export

  - renaming of internal close_polygon -> close_poly in gate.hpp

  - fix "removal" attribute propagation during image/mask extraction
    when alignment occurs

  - use R_finite to test finiteness

  - allow progress_bar to be displayed in modules

  - fix geomean computation (it is now computed on finite values only)

  - [BREAKING] modify how locale are changed/restored and use
    en_US.UTF-8 (with English.UTF-8 in between some commits) instead of
    English

  - add prefix argument to random_name

  - fix hpp_NEG_M that was not returning a no_init matrix

  - handle character vector input for color argument of objectDisplay
    allowing color scale display

  - fix popsRetrieveGraph [attempt to select less than one element in
    integerOneIndex] error when retrieving GraphRegion

  - change deprecated @docType in IFC-package.R to "_PACKAGE" following
    roxygen2 update

  - make use of main in BatchReport. Still wip to set fontsize and
    color.

  - don't check color in addText for grayscale images

  - create templated version of hpp_resize and handle negative values
    for resizing

  - create dedicated affine.hpp and align.hpp files for handling spatial
    offset correction and interpolation

  - add new internal compLinLog / inv_compLinLog functions allowing
    control over linear region size

  - fix extra parameters ... not used by BatchReport

  - export StatsReport, getSTATSREPORT, and BatchStatsReport

  - CRAN submission

                 Changes in version 0.2.0 (2023-02-13)                  

Work on documentation

  - change Luminex(R) -> Cytek(R)

  - improve formatting in several places

  - fix recent CRAN NOTE about "Documented arguments not in \usage in
    documentation" in some internal functions

Work on ExtractImages_to/ExtractMasks_to functions (breaking)

  - fix bug with write_to dirname parsing when export is "matrix"

  - DRY code (create generic internal polyExtractTo) and group
    everything in ExtractToFuns.R file

  - export 2 new functions ExtractMasks_toFile, ExtractMasks_toBase64

  - improve documentation (clarification, formatting)

  - add forgotten (in v0.2.0.xxx) mode parameter description in
    ExtractImages_toBase64/ExtractMasks_toBase64

  - add new base64_id and base64_att arguments to
    ExtractImages_toBase64/ExtractMasks_toBase64

  - add explicit overwrite argument to
    ExtractImages_toFile/ExtractMasks_toFile and limit the use of
    param$write_to to situtations where param$export was already set to
    "file" by user

Work on image extraction at cpp level

  - DRY code, separate file read/decomp

  - add experimental quantile normalization at image extraction time by
    setting input_range within ]0,1[

  - improve documentation (clarification, formatting)

  - remove bits argument from XIFtoTIFF and hpp/cpp functions for decomp
    to raw vector and only use 16 bits gray levels

  - add "none" decompression (=1) logic in decomp.hpp

  - add 1 row in align.hpp

Work on Gating Strategy

  - fix bug in applyGatingStrategy where graphs were wrongly imported
    (fixed by setting simplify = FALSE in sapply)

  - fix behaviour of keep argument

Work on graphs

  - apply fix to contourplot to handle new behaviour of R && and ||
    "with LHS or RHS larger than one"

  - fix bug with axis computation when it is transformed by
    smoothLingLog or smoothAsinh. Then, if viewport is "data" and all
    data is contained within [-hyper,+hyper] range, the axisExtent
    becomes infinite which triggered an error

  - fix device opening/closing, adjustGraph should leave graph device(s)
    as is after testing if graph is drawable

  - use quote() to decrease footprint of large object(s) on trace when
    recovering from errors

  - adjust density to rendering size in plot_raster so as to produce
    graph with (more) similar colors as plot_base base graphics

Miscellaneous

  - remove hard dependency on jpeg, png, and tiff packages

  - expand_list: fix bug in internal expand_list which leads to only
    partial conversion of xml node to list, affecting notably correct
    extraction of ViewingModes in getInfo()

  - trans.hpp: some cycles less (replace () by [], avoid unnecessary
    copies)

  - utils.hpp: hpp_mfpmatch init pat in recommended way

  - utils.hpp: hpp_seqmatch less frequently checkUserInterrupt

  - CRAN submission

                        Changes in version 0.1.9                        

  - citEntry and personList are considered as old-style and should not
    be used anymore

  - CRAN submission (Rejected)

                 Changes in version 0.1.8 (2022-11-29)                  

work on plot:

  - detect if device has been modified during plotting (raster)

  - pass returned value of hpp_coord_to_px from IntegerMatrix to
    NumericMatrix (in order to allow comparison with
    graphics::grconvertX and graphics::grconvertY) (raster)

  - fix some off-by-one in points pixel coords (raster)

  - fix out-of-range indexing in hpp_raster, hpp_shape_rev,
    hpp_shape_combine (raster)

  - compute density colors on points inside xlim and ylim only (base and
    lattice)

  - enhance axis tick labels position (base and raster)

  - restrict plotting region to xlim and ylim with par("xaxs") and
    par("yaxs") (base and raster)

  - fix typo in hpp_coord_to_px that caused x values to be bounded to
    max y limit instead of max x limit

  - drop density estimation for density plots in plot_raster and only
    use raster drawing logic for colorization

work on FCS:

reading

  - enhance coding

add internal functions readFCSdataset and split it into smaller
dedicated ones readFCSheader, readFCSdelimiter, readFCStext, readFCSdata

  - fix bad regex for identification of $PnN

this could have lead to undesired error "mismatch between found vs
expected number of parameters"

  - fix edge case relative to case-insensitivity of keywords in
    specifications

file parsing was performed assuming required keywords were upper case.
now this assumption is removed and parsing is performed whatever the
case.

  - fix dataset extraction when dataset was not NULL or 1

formerly, other values could lead to undesired dataset removal in
returned value. readFCSdataset is now used within readFCS to avoid that.

  - fix data extraction with non usual bytes order or sizes.

  - enh/fix apply PnG scaling and add checks for PnG compliance

  - throw warning on mismatch about data segment offsets read from
    HEADER vs TEXT segments

  - detect, report and correct offsets shifts (off by one) for TEXT and
    DATA segments

  - detect and report standard keywords padding and invite to use
    text_trim

  - add checks for $SPILLOVER compliance

  - provide more informative messages/warnings/errors

changes for inputs:

  - be more permissive with options and construct options with default
    values + user input

before if user wanted to modify options, he had to provide options with
the exact options names. now part of options can be provided and missing
part are reconstructed, in addition extra names does not trigger errors
anymore.

  - a new text_check argument allows user to get more information about
    compliance of text segment towards FCS specifications for required
    keywords .this now helps to more clearly identify missing or invalid
    keywords (e.g. PnE used for scaling)

  - a new text_trim argument allows user to get control on text parsing
    and tweak whitespace trim in keywords name

  - a new text_empty argument is here to try to handle non compliant
    files with empty keyword value + add detection of these potential
    empty values

  - add space in options$header for completeness

changes for outputs

  - add "raw" attribute to returned delimiter

  - add "offset" attribute to returned header

writing

  - enh/fix write PnG to 1

  - fix remove empty keywords on file export

  - fix bad regex for identification of $Pn[N,B,E,R,S]

this could have lead to undesired removal of keywords during FCS export

  - only allow the use of 0x01-0xFE as delimiter for FCS export

  - ensure that exported keywords (names) do contain only printable
    ASCII

this means that to follow FCS3.0 specifications keywords should
be 0x20-0x7E only.

  - enforce "UTF-8" export (FCS3.1 says that $UNICODE is deprecated and
    all keywords values have to be "UTF-8")

  - ensure that delimiter is not the first character of any keyword on
    export

  - fix comma "," replacement to space " " on $PnN

before they were replaced by underscore "_".

  - fix bug in data_modify_regions and data_modify_pops (stats should be
    recomputed)

  - fix CRC that was not written on export despite being mandatory in
    FCS3.0 (add default 00000000 CRC segment)

  - fix writing data_beg/data_end offsets in HEADER segment

when any of them is >= 1e8, then BOTH should be 0 and $BEGINDATA and
$ENDDATA in TEXT segment should report offsets. Before only the one(s)
>= 1e8 was/were set to 0 in HEADER (though, TEXT segment was correct)

  - CRAN submission

                 Changes in version 0.1.7 (2022-10-05)                  

work on TIFF (mainly dedicated to handle large files)

fix bug with offsets being bounded or converted to NA_integer. Offsets
were stored as uint32_t in hpp/cpp and placed in Rcpp::IntegerVector and
then converted with as.integer in R which makes them undesirably bounded
to [-(2^31-1) : -2^31-1], i.e. max 2GB files):

  - In hpp/cpp we now use std::size_t to access files at desired
    position and store offset in Rcpp::NumericVector and in R, we remove
    the as.integer conversions,

  - current IFD offset serves as reference for next computed offsets
    which are supposed to be greater than this reference (except
    for 0x00000000 last one) and next offset (for IFD or eventual extra
    content) are computed accordingly,

  - order of images files export has changed due to the fact that
    current IFD serves as reference for new offset computation.
    Previously, extra content was written before IFD. Now, IFD is
    written first and then content that does not fit within the 4 bytes
    slot for value is written just after the offset pointing to next
    IFD.

improvement in offset extraction:

  - dry code for hpp/cpp offset extraction,

  - Now offsets are faster to extract, notably when initial number of
    objects is not known thanks to vector pre-allocation (before
    push_back was used),

  - drop RcppProgress dependency. RcppProgress was used to monitor the
    extraction of offset within hpp/cpp. We now call internal
    IFC:::setPB from hpp/cpp function so all progress bars are now
    homogenized within IFC.

speed improvement during file export (ExportToXIF, subsetXIF, mergeXIF,
XIFtoTIFF). Though it still remains long.

work on progress bar

improve logic (better mapping between value and steps).

using value < min in IFC:::setPB now allows for circular progress (i.e.
pb restart at 0 and cycle once again and so on, until function stop).
This way user can see that something is currently happening and not
freezing.

automatically detect shiny for progress bar.

drop dependency on RcppProgress

work on seed (make IFC as transparent as possible to RNG)

this is achieved thanks to new functions R/seed.R

1/ fetch_seed (ensures backward compatibility while allowing new
behaviour).

2/ with_seed (encapsulates expr to allow its evaluation with seed while
permitting RNG state to be reset once done)

  - fully handle set.seed arguments (before only seed was passed and NOT
    kind, normal.kind, sample.kind),

  - restore RNG state once done (before set.seed(NULL) was used
    on.exit),

  - allow no modification at all by using seed = NA_integer_. It does
    nothing (no change, no restore), just R regular behaviour, so
    sequence keep going when a functions needs random generation.

For mask/features/regions/pops definition spliting or other internal
stuffs alternative names needs to be generated. These alt names are
created using random generation by gen_altnames that don't need to be
statistically relevant. Consequently, they should not impact current R
seed. IFC package has now been restructured to allow this. Internally,
when gen_altnames is used, we use of "Mersenne-Twister", "Inversion",
"Rounding" by default as it was the one used in old R version (at least
since RNGVersion('1.7.0')).

To allow random and reproducible sampling based on a string, a new
internal pseudo_seed() has been created to compute a seed integer from
string. It is used with:

  - pop or region name to pick its style/color randomly and
    reproducibly,

  - graph dimension(s) to show only a random but reproducible subset of
    points,

  - pop$def to decompose boolean population and create necessary
    intermediates for GatingML.

fix potential bug with writeGatingStrategy where random ids are
generated to enable boolean population decomposition and export to
GatingML (ids may have been duplicated ?).

encapsulate requireNamespace("shiny", quietly = TRUE) within with_seed
(calling requireNamespace("shiny", quietly = TRUE) alters R seed).

make use of rng = false attribute for cpp functions export when
possible.

work on stats

fix stats computation with infinite value.

fix stats in 2D (subset by dimension and not using both dimensions).

simplify internal StatsReport.

handle several edge cases:

  - add specific behaviour for sd(numeric(0)) or sd(numeric(1)),

  - var behaves as sd and improve NaNs count computation,

  - return NaN when pop is of length 0 or when all feature values are NA
    (except for NaN count),

  - return NaN instead of NAs.

allow to display progress bar.

return more statistics in extractStats.

work on graphs

add backend argument to plotGraph, ExportToReport, DisplayReport,
BatchReport to allow to choose which backend will be used for drawing.
Default backend = "lattice", will behave as usual, while backend =
"base" and backend = "raster" now allow user to use base graphics and
further backend = "raster" to produce plots with huge amount of points
very fast. backend = "raster" can also be used to generate reports of
smaller size (which will open and render shortly).

plotGraph returned value plot element does not exist anymore and
par.setting is now part of returned input element.

patch buildGraph to handle histogram plot extracted from rif files. In
rif, population from graphRegion are used in order which is not
compatible with what IFC needs, so order is modified if provided to
remove these population names.

fix population order in legend (plot_base and plot_raster, not exposed
before backend introduction)

adjustGraph (internal) be less permissive, ensure that features,
transformations and types are respected (before only checks for existing
pops and regions was performed). In addition, title should be recomputed
when BasePop has changed. Finally, use it in applyGatingStrategy to
ensure that plot can be produced when strategy is applied.

work on pops

allow propagation of attributes (notably, "reserved" used by IFCshiny).

add checks in popsWithin for recursive definition and for non duplicated
names.

fix popsRename so as to handle graphs title.

allow 'base' modification in data_modify_pops + add needed graphs
adjustments.

bugfix

in autoplot, when drawing a region requires the creation of a
population.

non-finite values when computing combined features should be NaN.

stats computation with infinite feature values and bad subsetting in 2D
graphs (subset by dimension and not using both dimensions).

in *popsRename fix edge cases of renaming pops (e.g. swapping pop1 <->
pop2), fix GraphRegion (if any) which were not correctly computed, and
fix to handle graphs title.

in buildBatch, exported files names computation when input files are not
.rif.

fix bug that prevented file from being released when an error did raise
during reading at hpp/cpp level.

allow for reading large files at hpp/cpp level by using std::size_t
instead of uint32_t for offset positions (in scan.hpp and decomp.hpp, in
addition to tiff.hpp).

potential bug with writeGatingStrategy where random ids are generated to
enable boolean population decomposition and export to GatingML (ids may
have been duplicated ?).

Misc

data_add_pop_sample (internal), don't set new_name automatically if
missing and force user to provide one.

redefine_obj, list only once duplicated names, use new_feat_def for
mapping "to" and obj for "initial".

add (internal) data_modify_regions and data_modify_pops functions.

remove hpp/cpp_fast_cbind_functions which are not used anymore.

data_to_DAF now makes use of toBIN_features and toBIN_images internal
functions.

order of images files export has changed. Previously, extra content was
written before IFD. Now, IFD is written first and then content that does
not fit within the 4 bytes slot for value is written just after the
offset pointing to next IFD (see work on TIFF).

typo, missing param in toBIN_.* functions and UNDIFINED in getIFD.

This leads to the following visible changes for the user

  - See the bugs fix above

  - IFC package has a new dependency to gridGraphics

  - plotGraph, ExportToReport, BatchReport functions now have a new
    backend argument

  - plotGraph returned value plot element does not exist anymore and
    par.setting is now part of returned input element

  - Functions using random_seed will now be used with with_seed (see
    work on seed)

  - Large files can now be used (though, still restricted to 4GB
    on 32bit OS)

  - When exporting XIF files order of extra content and IFD has changed
    (see work on TIFF)

  - RcppProgress is not used anymore and display_progress = TRUE for
    offset extraction now calls the same progress bar system as all the
    other progress bars used within IFC package

  - CRAN submission

                 Changes in version 0.1.6 (2022-08-22)                  

  - Redefine (Internally)

improve and document logic behind switch_channel (used to allow changing
all images/masks/features definition of one channel to another one)

create swap_channel function (which use switch_channel) to operate
channel swap (basically, switch to one channel, switch to other channel,
and merge)

  - Definition Parsing (Internally)

Internally, the framework used for parsing definitions
(features/pops/masks) has been consolidated to enhance accuracy and
security. This is mostly based on splitn (for pops and features) which
split definition into chunks according to allowed names and operators
and ensure 1-to-1 replacement of them with unique random names created
thanks to gen_altnames and random_name

create dedicated gen_altnames function to map allowed names to unique id

adapt splitn to handle features definition, simplify logic, make use of
gen_altnames ancillary function, and avoid unnecessary unique id
creation thanks to new alt_names argument and add scalar and dsplit
arguments

add dedicated split_feat (based on splitn and get_altnames) for features
to avoid repeated splitting loop

  - Features (obj$features, in IFC_data object)

create featureIFC for static features types/names (used to validate
definition and also determine name of a feature)

create gseq/cpp_seqmatch to match string sequence, used by feature_namer

modify feature_namer (used to determine name of a feature)

"combined" features resulted in wrong values when extracted (dedicated
internal get_feat_value and getFeaturesValues are now here to solve
this)

data_rm_features caused the removal of more features than it should (due
to wrong pattern used for features names matching)

  - Populations (obj$pops, in IFC_data object)

fix potential bug with NAs / NaNs values, e.g. when graphically defined
on features containing NAs / NaNs, the resulted event should be 'FALSE'
and not 'NA' to flag that it does NOT belong to the population

limit the scope of evaluation for features and populations computation

adding/exporting "tagged" population containing NAs / NaNs value is not
allowed

warning/error messages are now more informative during population
add/compute/export

  - Stats

improve and dry code for stats extraction / computation

group internal buildStats and statsCompute functions into buildStats

add internal functions to extract and generate Statistics Report

fix bug leading to error (pops reported count was NAs) when features
contained NAs

fix bug in plotGraph, ExportToReport, and BatchReport in feature summary
computation for graphs containing overlay of populations (1D and 2D) for
values of the region(s) drawn

  - Graphs

catch errors in density computation for histogram and send warning
instead but allow graph to be created as far as possible (already
catched in plot_lattice but not with plot_base nor plot_raster)

swap labels and symbols when using plot_lattice to gain in homogeneity
with plot_base and plot_raster

"histogram" legend were ok for plot_lattice but not for plot_base and
plot_raster which were displaying pch instead of lty

'NA' is now an allowed value for adjust_graph argument in data_rm
functions to force graph(s) removal

implement and export new data_add_graphs data_rm_graphs functions

adjustGraphs now internally uses graph as intput rather than indice(s)
of graph(s) from IFC_data object (which is more versatile and allows for
testing any graphs in the context of 'obj')

catch error in adjustGraphs

fix bugs when trying to adjust graph in several places

1 - when testing if drawable which was not working since about
https://github.com/gitdemont/IFC/commit/030df2bfb25680e3159aa4a15bf0d550543d4188

2 - when applied GraphRegion(s) result(s) in not found pop(s)

3 - when trying to applyGatingStrategy which did not actually test if
graph(s) could be produced

fix bug in plotGraph, ExportToReport, and BatchReport in feature summary
computation for graphs containing overlay of populations (1D and 2D) for
values of the region(s) drawn

  - Fix objectExtract

fix the fix
https://github.com/gitdemont/IFC/commit/34f33de1f916673855c2bc69c0c1e686bd608c58
which did not allow to correctly pass extra parameters to dots ...

  - Fix ExportToBatch/buildBatch

absence of predefined report in the analysis file induced error when
building the batch

fix bug when no compensation was provided

  - FCS I/O

replace first_only argument in readFCS by dataset to allow user to
choose which dataset to extract rather than only '1st' or 'All' (default
behavior remains unchanged, however)

allow import/export of keywords

fix potential bug with extra keywords due to wrong regex identification

  - Speed Gain

gray -> rgb color conversion improvement

use Rcpp::no_init when possible

modify internal fastCbind (the underlying hpp/cpp functions induced more
overhead than R cbind)

  - Misc

for progressbar, check if session missing and class rather than if
length is 0

remove gc from fcs functions

allow to pass NULL and NA in texttomatrix / addText (before an error was
thrown)

implement internal function data_to_AST to allow the creation of .ast
file from IFC_data object

This leads to the following visible changes for the user

See the bugs fix above

first_only argument is replaced by dataset for FCS reading

IFC_data object returned by ExtracFromFCS has gained an new Keywords
member

new data_add_graphs and data_rm_graphs functions are now exported

  - CRAN submission

                 Changes in version 0.1.5 (2022-05-24)                  

  - File I/O

fix ExportToDAF that exports xml files containing NULL values

  - issue with unexpected file names encoding

encode files names to native before passing them to underlying hpp/cpp
files for reading

  - object extraction

fix error in objectExtract when info argument is provided generated
duplicated arguments

fix cpp_check_range that could lead to error when input can be summarize
to a single value (this could happen when image object has no mask)

fix cpp_resize that did not take into account resizing information for
masks

  - XIF subset/merging

add add_tracking argument to mergeXIF, subsetXIF, XIFtoTIFF, and
ExportToXIF functions to control whether exported file should contain
tracking information

improve tracking of object_ID

improve XIF I/O speed (avoid conversion when building IFD and use raw
instead thanks to new internal collapse_raw function)

  - num to string

improve numeric to string conversion when using objects ids as
names/dimnames (e.g. avoid 1e+05, use 100000 instead)

  - population computation

create popsRename function to simplify population renaming in IFC_data
object

fix bug with popsCompute for type "C" (combined) population computation
when population definition contains repeated occurrence of same
population name

This leads to the following visible changes for the user

mergeXIF, subsetXIF and ExportToXIF functions gain a new add_tracking
argument

a new popsRename function is now exported

  - CRAN release

fix trailing slash NOTE in last CRAN submission

fix cpp_normalize which did not take into account force_range parameter

                        Changes in version 0.1.4                        

  - CRAN submission

                      Changes in version 0.1.3.104                      

  - for CRAN

preparing for CRAN release

use doi instead of url

modify some links that have moved

  - Improvements to graphs

improve drawing speed due to internal do.call that causes subtitute(x)
to cast all x values to character

speed gain thanks to dissociation between IFC_plot object generation
from plot and stats production

create internal plot_stats() dedicated function for stats extraction

create internal plot_lattice() dedicated function for plotting (also
rename convert_to_baseplot to plot_base)

create internal plot_raster() and rasterplot() + cpp/hpp underlying
functions to allow plot rasterization for very fast 2D graph drawing

better legend positioning

additional use of " " to prevent heightDetails potential error

fix bug with plotGraph which was opening a dev to retrieve lattice par
settings

fix bug with grouping and precision = "light" when number of displayed
population was <= 1

transformations (axes + density) should now be provided as character and
are matched against allowed names

  - Improvements to FCS file I/O

add text_only parameter

speed gain thanks creation of internal cpp/hpp functions after code
profiling

better handle files with extra keywords segment

fix fcs import for multiple files merging when no spillover can be
retrieved + when they have exactly same features names

fix large fcs file export

add support to bad-formatted fcs files (with empty data offsets in
header)

warn user on missing additional datasets (i.e. non empty $NEXTDATA)

  - Improvements to DAF / XIF file I/O

fix progress bar bug when extracting images/masks offsets

fix bug with population stats computation when IFC_data object contains
tagged populations whose obj are not logical (i.e. numeric or integer)

fix bug when applying gating strategy with no graphs

better control/coercion on files read/write notably for graphs

  - Misc

internally improve file scan by using raw vector target rather than
string

fix internal whoami() which was erroring on namespaced calls (i.e. with
:: or :::)

improve ExportToReport selection argument to allow graphs to be passed
as a matrix that defines report layout

export new BatchReport function

This leads to the following visible changes for the user

transformations should now be provided as character and will be matched
against allowed names

a new BatchReport function is exported

readFCS gains a new 'text_only' entry in 'options' argument to allow
user to only extract TXT segment

                      Changes in version 0.1.2.100                      

  - allow to pass IFC_data object in writeIFC()

  - now handle levelplot

  - improve .fcs input / output internally

speed gain and better accuracy notably for files stored with DATATYPE
"I"

can handle files with non R standard bits length (i.e. not 1,2,4,8)

fix bug with large PnR e.g. "4294967296" which resulted in NA

  - don't send error on partial mask retrieval

This leads to the following visible changes for the user

buildGraph gains a new 'densitylevel' entry in BasePop controlling
levelplot when 'type' is "density"

when fcs is imported @IFC_date, @IFC_file, @IFC_fileName, @IFC_dataset,
@IFC_version, and @IFC_FCSversion are automatically filled. $FIL is not
filled if found. $CYT is not filled if found except if user requires it.

readFCS gains a new 'force_header' entry in 'options' argument to allow
user to control if data offset(s) should be taken from header only

                 Changes in version 0.1.2 (2021-10-13)                  

  - CRAN release

  - add color-gradient based on 3rd feature in density plot + add
    this 3rd feature as subtitle

  - fix issue with axis tick labels on Solaris (polygon edge not found
    (zero-width or zero-height?))

  - fix issue in internal addText() and hpp_mark() when added text does
    not fit into image.

  - allow stats export with data_to_DAF and daf creation from rif file
    reading

  - make changes to num_to_string to optimize numeric to string
    conversion when exporting file

  - fix bug with rif reading (ExtractFromXIF) that was also extracting
    not acquired channels

  - fix images values retrieval in getImagesValues (only one channel was
    retrieved instead of all)

  - handle "0" color value

  - retrieve "EVmode" information with getInfo

  - add experimental FCS reader / writer

  - improve axes labels positioning

  - modify how transformation instruction is parsed to allow for more
    transformations in the future

  - apply STRICT_R_HEADERS patch for Rcpp and change PI to M_PI

  - fix bug with base64id that was not quoted which could lead id to be
    truncated on space characters

  - modify string_utils to better escape and recognize regions,
    populations and features names, particularly when they contain | or
    when names are constituted of repeated patterns

  - add redefine_ family internal functions to allow images, masks, and
    features renaming and their propagation across upstream dependency

  - add support to more XIF files thanks to new internal testXIF
    function that allow to identify files with no mask

  - allow spatial correction directly from objectExtract thanks to the
    addition of spatial_correction parameter in objectParam

  - new experimental internal function to convert XIF to uncompressed
    TIFF (+ underlying hpp/cpp functions)

  - remove TILE support and only use STRIP in mergeXIF and susbsetXIF
    since it seems to never been used

  - remove hard dependency on object number retrieved from first IFD in
    getIFD allowing to get IFDs from other files than RIF / CIF (i.e.
    TIFF)

  - make decomp.hpp more robust to invalid nbytes, imgWidth, imgHeight,
    nb_channels input fix potential off-by-one issue that could cause
    buffer overrun in code although it should never be reached

  - new function to apply spatial offsets correction on images

  - new function to retrieve ASSIST tests values

  - fix bug in setting Raw Number features definition when using
    ExtractFromXIF

  - add new color in allowed colors palette "Control" now matches
    "Gray81"

  - fix bug that disabled styling edition of population "All"

  - add maxpoints parameter in buildGraph to control the number of cells
    displayed in 2D graphs

  - create experimental read/write/apply GatingStrategy family functions
    to save/retrieve gating strategy (association of regions /
    populations and graphs) with partial support for GatingML

  - better compute graph dependency in data_rm_ family functions

  - add adjust_graph parameter to control if graph should be removed or
    if it should be modified if possible

  - improve getAborted to retrieve file path of aborted elements in
    batch

  - fix bug in shiny progress bar which did not initialize with title /
    detail

  - improve mergeXIF and subsetXIF functions (speed gain + no more
    dependency on seek for reading current position)

This leads to the following visible changes for the user

data_to_DAF now allows to create daf file with statistics table

data_to_DAF now allows to create daf file from an IFC_data object
extracted from a rif file

ExtractFromXIF does not extract channels that were not acquired anymore

getInfo returned object gains an additional evmode value

buildGraph gains a new maxpoints parameter

data_rm_ functions gain a new adjust_graph parameter

subsetOffsets and getOffsets returned object gain an additional test
attribute

getInfo now returns XIF_test value in addition to former elements

objectParam gains a new spatial_correction parameter which when TRUE
adds a 2 new columns, namely spatial_X and spatial_Y, to the returned
data.frame in 'channels'

paletteIFC now maps Control to Gray81

axes display have been slightly changed to show labels at pretty
positions when LinLog transformation is used

                 Changes in version 0.1.1 (2020-12-18)                  

  - CRAN release

                        Changes in version 0.1.0                        

  - fix bug when using verbose in Extract Images/Masks +
    ExportTo/Display Gallery/Numpy family functions

  - fix bug in objectDisplay when image has more than one class

  - fix bug in ExportToNumpy object size was not correctly set

  - pass all cpp functions to header to allow more portability (side
    effect package installation is faster)

  - reintegrate corrected version of num_to_string function using
    format() did not produce desired results

  - add functions family to remove features, regions and / or
    populations from IFC_data object

  - allow to create graph report even if one graph produces an error
    also allow to produce graph with base population with no event
    (change stop to warning) also allow to produce density graph with
    aberrant shown pop filled (change stop to warning)

                 Changes in version 0.0.9 (2020-07-24)                  

  - allow graph conversion from lattice to base

  - modify plotGraph return object to allow to pass it to base plot +
    better handle graphics device

  - fix solaris installation error
