New features:
* Support for Python 3.9
* FlowKit version now available via top-level attribute `__version__`
* GatingStrategy:
* optimized processing order of gates to avoid re-processing
* optional caching of pre-processed events to speed up processing of gates
* Matrix class now has an `inverse` method
* WSPBiexTransform now has an `inverse` method
* Significant speed increase for parsing FlowJo 10 WSP files with lots of bi-ex transforms
* Sample method `plot_contour` now has optional `fill` argument to created filled contours
* Sample now re-applies a transform when Sample is given a new compensation
* Analyzing samples in a Session using multiprocessing will now try to dynamically allocate CPUs based on available memory to avoid out of memory errors
Removed features:
* Anomalous event detection removed from FlowKit, now lives in separate FlowQC project
API changes:
* gates module:
* All gate types now take a pandas DataFrame as input (possible to use gates independently now)
* Sample class:
* `subsample` argument added back to Sample constructor (better to have subsample ready for plot methods)
* Sample plot methods (except histogram and plot channel) now default to `subsample=True`
* The various methods for getting NumPy arrays of events are now encapsulated into the single `get_events` methods that takes a `source` argument (consistent w/ other Sample methods)
* Method `get_channel_data` renamed to `get_channel_events`
* Added option to cache original events, they are no longer stored by default (saves memory)
* Attribute `anomalous_indices` renamed to `flagged_indices`, and now set by user for any purpose using `set_flagged_events` method
* Attribute `channels` changed from a dictionary to a more readable pandas DataFrame
* New plotting method `plot_channel` for plotting channel data with "events" as x-axis (similar to plotting vs Time)
* GatingStrategy class:
* `gate_path` is now always a tuple (not a list)
* Uses of `gate_id` replaced with `gate_name`: a gate ID is a tuple of (gate_name, gate_path)
* Method `get_gate_indices` renamed to `get_gate_membership` (since it returns a boolean array)
* Session class:
* Plotting methods no longer analyze samples, `analyze_samples` method must be called prior
* Method `get_gate_indices` renamed to `get_gate_membership` (since it returns a boolean array)
* Dimension class
* Attribute `label` renamed to `id`
* Method `get_gate` now returns the containing QuadrantGate when a Quadrant ID is given
* Function `calculate_extent` removed from public API (was never intended for external use)
Bug fixes:
* Improved support for Windows
* multiprocessing now working
* fixed issue where parent gate results were not being properly retrieved, causing lots of re-processing
* fixed memory leak in points_in_polygon C extension (used for processing PolygonGate instances)
* fixed issue in C extension code that would sometimes cause mis-allocation of NumPy array sizes
Documentation:
* New & comprehensive tutorial notebook series for new FlowKit users
* New notebook demonstrating how to create a custom Sample gate in a Session
* More docstrings for classes and methods
Dependencies:
* FlowIO requirement updated to 0.9.12 (significantly faster reading of FCS files)
* FlowUtils requirement updated to 0.9.5
* new requirement networkx >= 2.3
* new requirement psutil ~= 5.8.0