CHANGELOG
=========

0.9.4: unreleased
-----------------

0.9.3: 2022/12/02
-----------------
* fix plot axes in grainPlotWidget, zSumWidget and rockingCurvesWidget
  when an axes transformation is involved
* handle NaNs in datasets

0.9.2: 2022/10/18
-----------------
* opencv-python==4.3.0.36 is not on pypi so make it opencv-python>=4.3.0.36

0.9.1: 2022/10/18
-----------------
* proper project structure
* fix orangecontrib namespace package
* ewoks lower version bounds

0.9.0: 2022/06/10
-----------------
* Core:
    * `mapping.py`:
        - Add binning function (MR !174)
        - Add RSM Histogram function based on Mads Carlsen scripts (MR !176)
        - Improve calculation of RSM to take into account angle tilt  (use eta insatead of chi) (MR !176)
    * `dataset.py`:
        - Add `apply_binning` method (MR !174)
        - Add `apply_mask_removal` method and MASK operation (MR !179)
        - Add `compute_rsm` method (MR !176)
        - Append "fake" values to metadata when data is HDF5 (MR !182)
        - Mosaicity: Add third motor parameter and option to choose dimensions to use(MR !177)
        - Project: Allow 2D projection (MR !177)
        - Metadata: Allow for empty rows by setting them to 0 (MR !180)
        - Find dimensions: Return False if dataset is H5 (no dimensions in this case) (MR !182)
    * `dimensions.py`: Sort items of dictionary (MR !181) and return empty dict if no dims when converting to dictionary (MR !182)
    * `imageOperations.py`: Add `mask_removal` function (MR !179)
    * `process.py`: Add mask parameter in `NoiseRemoval` (MR !179) and add `RSMHistogram` function (MR !176)

* GUI:
    * Create widget for binning (MR !174)
    * Add RSMHistogramWidget (MR !176)
    * `noiseRemovalWidget.py`: Add mask property (MR !179)
    * `utils.pt`: Add `values` and `_filter` attributes in `ChooseDimensionWidget` (MR !177)
    * `grainPlotWidget.py`:
        - Add option to choose motors in ori dist and mosaicity maps for 3D datasets(MR !177)
        - Save origine attribute when exporting ori dist and remove minimum size for window (MR !181)
        - Show error message if there are no dimensions defined (MR !182)
    * `projectionWidget.py`: Use `ChooseDimensionWidget` to choose dimensions to project (MR !177)
    * `dimensionsWidget.py`: Show error message when trying to find dimensions in H5 dataset (MR !182)

* examples: Add binning example (MR !174) and rsmHistogram example (MR !176). Fix typo with keys in `plot_ori_dist` (MR !181)
* orangecontrib: Add binning widget and its icon (MR !174) and rsmHistogram widget (MR !176)


0.8.0: 2022/04/12
-----------------
* Change needed opencv-python version to fix bug (4.3.0.36) (MR !155)

* Core:
    * `process.py`: Add optional_input_names missing as input parameters (MR !162) and add Projection class (MR !155)
    * `dataset.py`:
        - Dataset:
            * Remove temporary directories (MR !166)
            * Fit: Remove loop along dimensions and return fitted parameters (MR !170)
            * Add title attribute (MR !154)
            * Add `project_data` method to return a new Dataset with the projected data (MR !155)
            * Partition: Add option to filter by top bin (MR !173)
            * Projection: Only add projected image if exists and fix typo with metadata values (MR !169)
            * Shift: Use h5py copy function to avoid loading dataset on memory (MR !169)
            * Orientation distribution: Compute for more than 1 dimensions dataset using first two dimensions (MR !169)
            * PCA: Temporarily set a fixed number of chunks to avoid memory errors on big datasets (MR !169)
        - Data:
            * Save: Use indices to not copy all data if not needed (MR !175) and filter by indices after flattening (MR !171)

    * `dimension.py` (MR 169):
        * Add `unique_values` in `Dimension` `__init__`
        * Convert axis to `int` before converting dictionary to `Dimension`
    * `mapping.py`:
        - Return fitted parameters with rocking curves (MR !170)
        - Add multi_gaussian method (MR !155)
        - Add 2D rocking curve fit and 2D data fit (MR !155)
        - Return FWHM value instead of std both in moments and rocking methods (MR !172)
        - Add indices in generator and use them for 2D fit (MR !169)
        - Make sure bounds are feasible when fiting rocking curves and set lower bound of std to 0 (MR !171)
    * `utils.py`:
        - Create function to create NXdata in dict form (MR !172)
    * `test`:
        * `partition.py`: Computer partition using range (MR !173)
        * `dimension.py`: Add 2D fit test method (MR !169)

* Decomposition (MR !169):
    * `base.py`: Use indices when computing error

* GUI:
    * Add optional title into plots (MR !154)
    * `dataSelectionWidget.py`: Add option to enter workflow title (MR !154)
    * `magnificationWidget.py`: Add Orientation Enum class to define orientations (MR !160)
    * `shiftCorrectionWidget.py`: Fix error when filtering data after data partition (MR !167)
    * `rockingCurvesWidget.py`:
        - Add `Background` map replace `Integrated intensity` for `Amplitude` (MR !170)
        - Use fitted parameters to show the maps (MR !170)
        - Remove "filter by dimension" option (MR !170)
        - Change `Method` class to `Maps` and add `Maps_2D` class to enumerate the maps when having 2D data (MR !155)
        - Show label with parameters for each rocking curve (MR !155)
        - Apply transformation if any (MR !155)
        - Show image with fitted contours instead of rocking curve with 2D datasets (MR !155)
        - Export 2D maps (MR !155) and use NXdata for each (MR !172)
        - Add residuals property (MR! 172)
        - Use plotRockingCurves method when changing stackview frame and put zeros in unused indices (MR !169)
    * `grainPlotWidget.py`:
        - Add option to center the axes or use motor values in orientation distribution (MR !155)
        - Create property for mosaicity (MR !172)
        - Export maps: create NXdata for each map, and add transformation axes if necessary
    * `dataPartitionWidget.py`: Compute partition using range (MR !173)
    * `noiseRemovalWidget.py`: Add DATA_TYPES Enum (MR !173)
    * `utils.py`: Add `vertical` parameter in `ChooseDimensionWidget` to set orientation of widget (MR !169)
    * `displayComponentsWidget.py`:
        - Use `ChooseDimensionWidget` to filter by dimension and add corresponding methods to filter and unfilter (MR !169)
        - Use `indices` when applying threshold (MR !175)
    * `linkComponentsWidget.py`: Convert dimensions to `AcquisitionDims` (MR !169)
    * Create new widget "ProjectionWidget" to reduce the number of data in a 2D dataset by projecting one of the dimensions (MR !155)

* IO:
    `utils.py`: Modify read and write compontents functions to save/read to/from dimensions dictionary and to save dimensions values(MR !169)

* examples: Add projection example (MR !155)

* orangecontrib: Add `projection.py` widget (MR !155)

* gitlab-ci: Add continous deployment and tests for win32 (MR !163)

0.7.3: 2022/02/04
-----------------

* Core:
    * `mapping.py`: Convert list to numpy array to allow calculate ptp() (MR !152)
    * `dataset.py`:
        * Dataset:
            - Append url to urls list to avoid error when not fitting (MR !152)
            - bs/hp/tr: Create temporary hdf5 file to save the new data in case of data partition(MR !159)
        * Data: Modify save() method to reshape modified urls to previous shape (MR !159)
    * `test`:
        * Dataset: Add tests that use hdf5 as input (MR !159)
* GUI:
    * `rockingCurvesWidget.py`: Add export maps option (MR !152)
    * `roiSelectionWidget.py`: Fix bug when ROI is None (MR !157)
    * `dimensionsWidget.py`: Fix typo when computing unique values with more than two dimensions (MR !158)
    * `displayComponentsWidget.py`: Create MixingPlotsWidget (MR !158)
    * `linkComponentsWidget.py`: Only show scatter if number of dimensions is 2 (MR !158)

* io:
    * `utils.py`: Write components with shape parameter (MR !158)


0.7.2: 2021/12/16
-----------------

* Core (!MR 156):
    * `dataset.py`: Remove unused `treated` property.
    * `data_selection.py`: Fix typo when creatintg treated directory. Dark treated files are now saved under `treated/dark`.


0.7.0: 2021/12/07
-----------------
* Add ewoks support instead of pypushflow and allow for batch processing (MR !143, !149)
* `requirements.txt`: Add ewoksorange and remove Orange3 version (MR !143, !144)
* Core:
    * `dataset.py`:
        * Accept new parameter `isH5` which reads an hdf5 file (MR !140)
    * `dimensions.py`:
        * `Dimension`: Add `_range` attribute (MR !141)
        * Create new method `_values_with_step` that finds the range between a set of values (MR !141)
        * Modify method `_set_unique_values` to use `range` (start/stop/step) as first option for the values, and to use `size` if `step` is 0 or None. (MR !141, !142, !144)
    * `mapping.py`:
        * `fit`: Fix typo: use `int_thresh` parameter instead of fixed value (MR !140)
        * `magnification`: Add parameter to uncenter axes (MR !151)
        * Add function to compute peak position map and add tests (MR !150)
        * Add tests for moments, magnification and rsm (MR !148)
    * `process.py`: Use ewoks instead of pypushflow and update classes as necessary (MR !143, !142)
    * `data_selection.py`: Create new function to load data and create Dataset (MR !143)
    * tests: Use seed for random numbers to avoid failing of tests in image registration(MR !153)
* Decomposition (MR !146):
    * Use chunks to compute norms.
    * Add squared frobenius norm.
    * NMF: Fix update of H and W matrices by chunks. Use `error_step` to check for convergence.
    * tests: Use seed for random numbers to avoid failing of tests in NMF and NICA (MR !153)
* GUI:
    * Pass parent by parameter when setting datasets (to all GUI widgets) and add `_updateDataset` methods to free memory of datasets (MR !140)
    * `datasetSelectionWidget.py`: Add checkbox for hdf5 files, dimension definition is still not controlled for this files (MR !140)
    * `dimensionsWidget.py`:
        * Add `Range` vertical header (MR !141)
        * `_DimensionItem`: Create `_RangeWidget` to accept `start/stop/step` values before using unique values(MR !141)
        * `DimensionWidget`: Improve `fit` method to use `range` and `step` values (MR !141, !144)
    * `grainPlotWidget.py`: Fix typo when showing kurtosis maps (MR !145)
    * `rockingCurvesWidget.py`: Fix bug when computing peak position map and add residuals map (MR !145, !150)
    * `magnificationWidget.py`: Add center axes checkbox (MR !151)
* orangecontrib (MR !147):
    * Add `flash.py` file that contains `FlashWidget`: widget to update previous datasets and free memory
    * Update orange widgets to emit `self` together with the dataset to be able to update previous datasets 


0.6.1: 2021/09/29
-----------------
* Downgrade pypushflow to 0.1.0 for compatibility issues (MR !137)
* Core (MR !137):
    * `dataset.py`:
        * nica_nmf: Set 'init' as 'custom' when initializing NMF to use H and W absoulte values from NICA.
        * Change `cascade` to `waterfall`
        * Mosaicity only computable in two dimensions.
        * `compute_transformation`: Flip axes if rotate is checked (MR !138)
        * Add `Transformation` class (MR !138)
    * `mapping.py` (MR !138):
        * rsm: Convert to degrees and fix computation typo.
        * magnification: Convert to radians before computing sin and cos and add topography option.
* Decomposition (MR !137):
    * `nica.py`: Add epsilon to avoid division by 0.
* GUI:
    * `blindSourceSeparationWidget.py`: Change NNICA to NICA (MR !137)
    * `shiftCorrectionWidget.py`: Convert 'shift' attribute to numpy array after setter (MR !137)
    * `magnificationWidget.py`: Add topography checkbox and orientation axis combobox (MR !138)
    * `grainPlotWidget.py` & `zSumWidget.py`: Rotate image 90 degrees in case of active rotation (rsm), and set label corresponding to the transformation type (if so) (MR !138)
* orangecontrib (MR !137):
    * `shiftcorrection.py`: Fix bug when clearing stack and loading and saving shift.

0.6.0: 2021/09/14
-----------------
* Core:
    * Dataset:
        * Save data into hdf5 instead of numpy files, all images are saved into a single hdf5 file (MR !128):
            * `Data` class methods `apply_funcs` and `save` are modified to work with h5py and to only replace the necessary rows of the file.
            * `DataUrls` used in `Dataset` are linked to the corresponding image (using data slicing of h5py).
            * Temporary datasets are used to not lose information in case of crash or abortion.
        * Raise error if directory for treated data is read-only (MR !114)
        * Use treated data directory for dark files (MR !114)
        * Add `roi_dir` parameter in `apply_roi` as directory path for the new dataset (MR !122)
        * New treated files in disk automatically replace previous ones except said by parameter (MR !123)
        * Add `get_metadata_value` method to obtain metadata info from a key (MR !124)
        * Add attribute `transformation` with the transformation values and method `compute_transformation` to compute it (MR !125)
        * Modify `find_shift` and `apply_shift` methods parameters to use `steps` instead of `h_step` and `h_max` and use linear shift when applying shifts greater than 1 (MR !127)
        * Add methods `find_shift_along_dimension` and `apply_shift_along_dimension` that find and apply shift, respectively, in a loop along a dimensions values (MR !134)
    * Mapping:
        * Apply median filter to COM and std to remove Nans (MR !117)
        * Add functions `compute_rsm` and `compute_magnification` (MR !125)
    * Image registration:
        * Modify shift detection to work with higher values of shift than 0.5 (MR !127)
    * Process (MR !130):
        * Add new process `_GrainPlot`
        * Add new process `_Transformation`
        * Add step and chunk properties in `_NoiseRemoval` process
    * ROI:
        * Fix typo when computing 2D ROI (MR !130)
* GUI:
    * `grainPlotWidget.py`:
        * Orientation distribution: Increase resolution of hsv key, set coordinate labels as the angles of the motors, add checkbox to center angle values to 0 and fix bugs (MR !116)
        * Add export button that saves maps into Nexus file (MR !132)
        * Stop using opticolor (MR !117)
        * Modify axes if transformation is present and set global attributes origin and scale (MR !125)
    * `rockingCurvesWidget.py`:
        * Add two scatter points at the frame number position in the rocking curves (MR !119)
    * `noiseRemovalWidget.py`:
        * Fix bug when resetting data and applying new operations (MR !115)
        * Only show abort button if abortion is possible (MR !128)
        * Add step and chunks properties (MR !130)
    * `roiWidget.py`:
        * Return bg_dataset in `get_dataset` (MR !122)
        * Use same directory for consecutive roi applies (MR !122)
        * Only show abort button if abortion is possible (MR !128)
    * `displayComponentsWidget.py`: Set X values as motor positions when filtering by dimensions (MR !121)
    * `linkComponentsWidget.py`: Add colormap (orientation distribution maps) from the components (MR !126)
    * Add `rsmWidget.py` for Reciprocal Space Map 1D datasets (MR !124)
    * Add `magnificationWidget.py` for dataset with magnification values (MR !125)
    * `shiftCorrectionWidget.py`:
        * Add `ShiftCorrectionDialog` which includes `ShiftCorrectionWidget` as main widget (MR !127)
        * Add `_filtered_shift` attribute that contains the shift values, if any, along a dimension (MR !134)
        * Use methods for finding and applying shift along a dimension in `Dataset` (MR !134)
        * Modify checkbox to be used when shift should be applied to only selected value (MR !134)
        * Update values of vertical and horizontal shifts to show currently selected dimension value shift (MR !134)
    * Create `zSumWidget` to show plot of zsum (MR !131)
* pffaddon: Add alias for `GrainPlotWidgetOW`, for `TransformationWidgetOW` (MR !130) and for `zSumWidgetOW` (MR !131)
* app: Modify `ows_to_script.py` executable script arguments for Dataset (MR !130)
* orangecontrib:
    * Add `transformation.py` that shows either `magnificationWidget` or `RSMWidget` (MR !125, MR!133)
    * Add step and chunks Settings in `NoiseRemovalWidgetOW` (MR !130)
    * Add local in `shiftCorrectionWidgetOW` to avoid bugs depending on the local computers locale (MR !130)
    * Use `zSumWidget` in `ZSumWidgetOW` (MR !131)

0.5.0: 2020/12/23
-----------------
* Add tqdm package to requirements.txt and setup.py
* Core:
    * Dataset:
        * Update constructor to admit `first_filename` parameter. (MR !106)
        * Fix reshaping: Correct the methodology used for reshaping to be consistent with the way data is obtained in id06 (MR !101)
        * Modify methods that work with dimensions (get_data, apply_shift) so that they work if more than one dimension is fixed (MR !102)
        * Add `running_data` property which contains the data currently being used by any of the operations (if any). This data is stopped in case of `Abort` option called (MR !95)
        * apply_background_subtraction:
            * Use multiprocessing to chunk images (MR !87)
            * Add step option to compute median using only every step image (MR !87)
            * Add tests with step and chunks and add docstring (MR !92)
        * Add `apply_moments` method for computing orientation distribution and colorkey based on the dimensions (for now only works with two dimensions) (MR !96)
        * Add `apply_fit` method for fitting the rocking curves of the data (a curve corresponds to a pixel around the stack), multiprocessing is used to chunk the images (MR !98)
        * Add `apply_threshold` method for thresholding the data (MR !108)
    * Create new file `dimension.py` that contains the classes AcquisitionDims and Dimensions moved from `dataset.py` (MR !105)
    * Create new file `mapping.py` with several functions: fit a rocking curve and computation of moments (MR !98)
    * `process.py`: Add new process `_RockingCurves` (MR !104)
    * Add `test_dimension.py` file that contains the tests that use the Dimension and AcquisitionDim classes (MR !105)
* GUI:
    * Add setters and getters for colormaps in widgets that use them (MR !110)
    * Disable buttons when computing operations (MR !109)
    * `datasetSelectionWidget.py` (MR !106)
        * Add new tab for treated data.
        * Create class `DirSelectionWidget`
    * `noiseRemovalWidget.py`:
        * Add `setDataset` method in `NoiseRemovalDialog` to enable buttons after the dataset is set (MR !100)
        * Add widgets only visible when data in disk, which give option to use step or chunks when computing the median (MR !87, MR!90)
        * Fix bug when showing or not the in disk widget (MR !97)
        * Make methods `toggleChunks` and `toggleInDiskWidget` private (MR !100)
        * Correctly set and get properties (background, method, etc) (MR !104)
        * Add threshold removal option (MR !108)
        * Add signal that emits when method starts or ends computing (MR !109)
        * Fix some typos (MR !111)
    * `shiftCorrectionWidget.py`:
        * Use `skimage.registration.phase_correlation` instead of `register_translation` when finding shift (MR !91)
        * Fix bug when shifting only using first dimension (MR !99)
        * Round shift to 5 decimals (MR !105)
    * `roiSelectionWidget.py`:
        * Run ROI operation in thread and add abort button(MR !95)
    * `blindSourceSeparationWidget.py`:
        * Modify `Method` class so that its values are a description of the method. The keys are used in the `BlindSourceSeparationWidget` as text in the combobox, and the values are its tooltips (MR !100)
        * Remove widgets to set a maximum number of components (MR !105)
    * `pca.py` (MR !105):
        * Add title and labels to plot
        * Automatically compute PCA when creating widget and remove widgets to set a maximum number of components
    * `displayComponentsWidget.py`:
        * Add parameter in `setDimensions` to know the shape of the data, and use it to correctly take values from W (MR !107)
    * `ChooseDimensionWidget`: Add as many dimension widgets as dimensions are (minus 1), so all the dimensions are fixed except for one (MR !102)
    * Create `GrainPlotWidget`:
        * Show different COM, FWHM, Skewness, Kurtosis of the dataset around a certain dimension (MR !96)
        * Add a contours map to show the contours of the orientation distribution on top of the colorkey (MR !96)
        * Add a plot for the mosaicity map (only works with two dimensions) (MR !96)
    * Create `RockingCurvesWidget` (MR !98, MR !111, MR !112):
        * Show the stack of images where the user can click any pixel.
        * Show a 1D plot with the rocking curve of the pixel selected in the stack.
        * A ChooseDimensionWidget allows the data to be filtered by the chosen dimension.
        * A button to fit the data shows a plot with 3 maps computed from the fitted data: Integrated intensity, FWHM and peak position.
        * If data is filtered by dimensions then the data is fitted in chunks, where every chunk is a certain value of the chosen dimension.
    * Create `LineProfileWidget` (MR !103):
        * Upload a `*.npy` image from disk and show intensity curve from a chosen y value of the image.
    * Create `ShowStackWidget` to show stack of data (MR !106)
* pffaddon: Add alias for rockingCurveWidget (MR !104)
* orangecontrib:
    * Zsum: Use `ChooseDimensionDock` instead of `ChooseDimensionWidget` and fix bug when computing sum in disk (MR !92)
    * Add `GrainPlotWidgetOW` to show a `GrainPlotWidget` (MR !96)
    * Add `RockingCurvesWidgetOW` to show a `RockingCurvesWidget` (MR !98)
    * Add `LineProfileWidgetOW` for `LineProfileWidget` (MR !103)
    * Add properties in `NoiseRemovalWidgetOW` for threshold removal (MR !108)
    * Add colormap as input and output on widgets that use it (MR !110)

0.4.2: 2020/09/15
-----------------
* Use version 4.1.2.30 of opencv to avoid uncompatibility with PyQt5 latest release

0.4.1: 2020/09/14
-----------------
* Modify `setup.py` (MR !82):
    * Add `opencv-python`, `scikit-image` and `silx` in `install_requires`.
    * Add package `full` in `extras` with `matplotlib`, `PyQt5` and `orange`.
    * Add package `test` in `extras` with `pillow`.
* Core:
    * `dataset.py`:
        * Add parameter bins when partitioning data in `Dataset` (MR !67)
        * Create `in_memory` setter in `Dataset` (MR !68)
        * Improve methods `flatten`, `reshape` and `take` in `Data` (MR !67)
        * Add try-except when fitting data in blind source separation methods to close file in case of crash (MR !71)
        * Add methods to convert dimensions to dictionary and viceversa in `AcquisitionDims` (MR !74)
        * Add `to_memory` method in `Dataset` to load only part of the data into memory (MR !77)
        * Add property `ndim` in `Data` (MR !80)
* Decomposition:
    * Fix bug in IPCA with cases where in the last iteration the chunk was smaller than the number of components (omit last iteration) (MR !73)
* GUI:
    * Temporarily register resources directory in when used in `DisplayComponentsWidget` (MR !84)
    * Change colormap default normalization to `log` for better visualization of the data (MR !85)
    * Add widget for bins in `DataPartitionWidget` (MR !67)
    * Add parameter for chunks in `NoiseRemovalWidget` (MR !68)
    * Add abort options in `dataPartitionWidget`, `NoiseRemovalWidget` and `ShiftCorrectionWidget` (MR !68)
    * Get next free axis when removing dimensions in `DimensionsWidget` (MR !86)
    * Fix bug when clearing stack in `RoiSelectionWidget` (MR !67)
    * Fix bug when getting filtered indices in `DataPartitionWidget` (MR !68)
* IO:
    * New file `dataset_io.py` with functions to save and load data into/from json files (MR !74)
* Orangecontrib:
    * Remove progressBar due to bugs in the workflows (MR !84)
    * Fix bug with qthreads when creating and deleting the thread using orange widgets (MR !70)

0.4.0: 2020/05/15
-----------------
* Refactors the project (MR !48)
    * Changes default colormap to cividis.
    * Core:
        * Dataset class stops inheriting from `silx.qt.QObject`
        * The dataset class takes control of all the operations done to the data.
        * Metadata is obtained from the frames using `fabioh5` from silx and then each frame is closed to spare space in memory.
        * Creates new class `Data` that inherits from numpy.ndarray and contains the corresponding urls and metadata of the data.
        * Adds new methods to `Dataset` for image operations, image registration, region of interest, and partition by intensity (filter data), that are applied differently depending on if the data is loaded into memory or is taken from disk in chunks.
        * Data can be saved into an Hdf5 file with images in the rows.
        * Implement in `Data` methods `shape`, `reshape`, `flatten`, `take`, `__getitem__` that work similarly to a numpy.ndarray.
        * Adds and modifies functions in `imageOperations.py` and `imageRegistration.py` to be used when data  is not loaded into memory.
        * Adds class `IPCA` in `blindSourceSeparation.py` that uses IncrementalPCA from scikit-learn to apply PCA in chunks.
        * Implements methods in `Dataset` to apply blind source separation algorithms to the data.
        * PCA and NMF algorithms used from scikit-learn when data is loaded into memory.
    * Decomposition:
        * A new package `decomposition` is created.
        * A base class `Base` is created for decomposition methods.
        * Adds class `NMF` that updates the matrices `H` and `W` using NMF method without having the data in memory.
        * Adds class `NICA` with the already implemented algorithm in `core`.
        * Adds class `PCA` currently not used (substitued for PCA in scikit-learn).
    * GUI:
        * Modifies all widgets to only have `Dataset` objects and call its corresponding methods.

* Core:
    * Adds method `in_memory` to Dataset to upload data from disk or remove data from memory (MR !51)
    * Adds method that returns intensity per frame (MR !58)
    * Number of bins can be passed as parameter when partitioning the data by intensity (MR !52)
    * Fix bugs when not closing Hdf5 files (MR !56)
    * Adds methos `zsum` in `Dataset` to sum images when not in memory (MR !57)
    * Fix bugs with `__getitem__` in `Data` (MR !57)

* Decomposition:
    * Adds IPCA to decomposition package (MR !50)
    * NICA implements IPCA for whitening when data is not in memory. Fix bugs when computing IPCA with data in the rows or in the columns (MR !53)
    * Allow matrices H and W in IPCA to be stored in disk using Hdf5 (MR !54)

* GUI:
    * Adds ComboBox in `DatasetSelectionWidget` to use data from disk or load it into memory (MR !57)
    * Adds widget to partition the data by intensity (MR !58)
    * Removes ComboBox in `DatasetSelectionWidget` to filter the data (MR !59)

* Orangecontrib:
    * Add corresponding data partition widget (MR !58)
    * Update example tutorial (MR !64)

0.3.0: 2020/03/03
-----------------
* Adds resources package (MR !29)
* Adds configuration file for default parameters (MR !30)
* Minor fixes (MR !12 !14 !15 !32 !37 !41 !46)
* Use silx backend when available (MR !44)
* Core:
    * Adds tolerance to dimensions that defines the uniqueness of its values (MR !17)
    * Modifies ROI performance (MR !23)
    * Implements blind source separation algorithms (MR !18 !20 !22 !28)
    * Implements algorithms for linking components between datasets: ORB, SIFT, Euclidean distance (MR !36 !44 !45)
* GUI:
    * Creates a unified noise removal widget (MR !21 !24 !25)
    * Adds checkbox to filter the data in `DataSelectionWidget` (MR !19)
    * Improves `DimensionWidget` (MR !16 !17 !33)
    * Improves `roiSelectionWidget` (MR !23 !31 !43)
    * Implements widgets `blindSourceSeparationWidget` and `displayComponentsWidget` to display the components (MR !18 !22 !26 !29 !35)
    * Creates `PCAWidget` to show the eigenvalues of the PCA computation (MR !22)
    * Creates widget `LinkComponentsWidget` that implements the component matching algorithms from two sets of components (MR !36 !38)
* IO:
    * Creates functions for reading and writing the components of the BSS into Nexus files (MR !42)

0.2.0: 2019/10/15
-----------------
* Renames project linkdick06 to darfix
* Refactors project into core, gui, io and test packages
* Adds unittests
* Adds orangecontrib package
* Adds examples package
* Adds continous integration with gitlab-ci
* Adds requirements.txt file with dependencies on numpy, silx, PyQt5, opencv-python, scikit-image
  and orange3 with version 3.22.0
* Core:
    * Dataset class inherits from `silx.qt.QObject`
    * Adds threshold to split data into high intensity images and low intensity images
    * Adds `Dimension` class to save information about how the frames are taken through the dataset
    * Adds roi file that implements region of interest functions
    * Image registration operations moved to new file `imageRegistration.py`
    * Adds shift detection using OpenCV
    * Adds `autofocus.py` to use at the shift detection
    * Adds `geneticShiftDetection` file to improve shift detection using a genetic algorithm
* GUI:
    * Adds `RoiSelectionWidget`
    * Adds `ShiftCorrectionWidget` to apply shift detection and shift correction
    * Adds widgets `BackgroundSubstractionWidget` and `HotPixelRemovalWidget` for noise removal
    * Adds widgets for data selection, metadata, and choosing dimensions
    * Adds a `QThread`, `operationThread`, to run widgets operations in a thread
    * Adds utils to create datasets from scratch
    * Removes `frameInterpretationWidget` and adds `DimensionWidget`
* IO:
    * Adds utils

0.1.0: 2019/07/11
-----------------
* Adds project build, documentation and test structure
* Adds continuous integration set-up for Gitlab
* Adds EDF reader from Fabio
* Adds operations for correction of images in imageOperations
* Adds notebook tutorial