diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2b017eaa..16a90a11 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,24 @@ its best to adhere to `Semantic Versioning List entries are sorted in descending chronological order. Contributors to each release were listed in alphabetical order by first name until version 0.7.0. +0.8.6 (2023-05-29) +================== + +Changed +------- +- Use memory mapping (``numpy.memmap()``) instead of reading into memory + (``numpy.fromfile()``) for non-lazy reading of EBSD patterns from EDAX binary .up1/2 + files. (`#641 `_) + +Fixed +----- +- EBSD patterns from some EDAX binary .up1/2 files were incorrectly read due to an + incorrect file offset, making the patterns appear shifted horizontally. + (`#641 `_) +- Reading of EBSD patterns from H5OINA files with the "Camera Binning Mode" dataset not + containing the detector binning. + (`#641 `_) + 0.8.5 (2023-05-21) ================== diff --git a/doc/reference/index.rst b/doc/reference/index.rst index ec38e80a..ba3c4cd4 100644 --- a/doc/reference/index.rst +++ b/doc/reference/index.rst @@ -27,7 +27,7 @@ this: >>> import kikuchipy as kp >>> s = kp.data.nickel_ebsd_small() >>> s - + .. currentmodule:: kikuchipy diff --git a/doc/tutorials/feature_maps.ipynb b/doc/tutorials/feature_maps.ipynb index 69f2e6cc..f1e0c28f 100644 --- a/doc/tutorials/feature_maps.ipynb +++ b/doc/tutorials/feature_maps.ipynb @@ -398,13 +398,15 @@ "metadata": {}, "outputs": [], "source": [ - "s.xmap.plot(\n", + "fig = s.xmap.plot(\n", " adp3.ravel(),\n", " cmap=\"gray\",\n", " colorbar=True,\n", " colorbar_label=\"Average dot product\",\n", " remove_padding=True,\n", - ")" + " return_figure=True\n", + ")\n", + "fig.axes[0].scatter(x, y, c=\"r\");" ] } ], @@ -424,7 +426,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.10.11" } }, "nbformat": 4, diff --git a/doc/tutorials/load_save_data.ipynb b/doc/tutorials/load_save_data.ipynb index 9d633611..ef02135f 100644 --- a/doc/tutorials/load_save_data.ipynb +++ b/doc/tutorials/load_save_data.ipynb @@ -493,21 +493,21 @@ "\n", "Currently, kikuchipy has readers and writers for the following formats:\n", "\n", - "| Format | Read | Write |\n", - "| ------------------------------------------------------------------------| ---- | ----- |\n", - "| [EMsoft simulated EBSD HDF5](#EMsoft-simulated-EBSD-HDF5) | Yes | No |\n", - "| [EMsoft EBSD master pattern HDF5](#EMsoft-EBSD-master-pattern-HDF5) | Yes | No |\n", - "| [EMsoft ECP master pattern HDF5](#EMsoft-ECP-master-pattern-HDF5) | Yes | No |\n", - "| [EMsoft TKD master pattern HDF5](#EMsoft-TKD-master-pattern-HDF5) | Yes | No |\n", - "| [kikuchipy h5ebsd](#kikuchipy-h5ebsd) | Yes | Yes |\n", - "| [Bruker h5ebsd](#Bruker-h5ebsd) | Yes | No |\n", - "| [EDAX h5ebsd](#EDAX-h5ebsd) | Yes | No |\n", - "| [EDAX binary](#EDAX-binary) | Yes | No |\n", - "| [NORDIF binary](#NORDIF-binary) | Yes | Yes |\n", - "| [NORDIF calibration patterns](#NORDIF-calibration-patterns) | Yes | No |\n", - "| [Oxford Instruments binary](#Oxford-Instruments-binary) | Yes | No |\n", - "| [Oxford Instruments h5ebsd (H5OINA)](#Oxford-Instruments-h5ebsd-H5OINA) | Yes | No |\n", - "| [Directory of EBSD patterns](#Directory-of-EBSD-patterns) | Yes | No |\n", + "| Format | Read | Write |\n", + "| ------------------------------------------------------------------------- | ---- | ----- |\n", + "| [EMsoft simulated EBSD HDF5](#EMsoft-simulated-EBSD-HDF5) | Yes | No |\n", + "| [EMsoft EBSD master pattern HDF5](#EMsoft-EBSD-master-pattern-HDF5) | Yes | No |\n", + "| [EMsoft ECP master pattern HDF5](#EMsoft-ECP-master-pattern-HDF5) | Yes | No |\n", + "| [EMsoft TKD master pattern HDF5](#EMsoft-TKD-master-pattern-HDF5) | Yes | No |\n", + "| [kikuchipy h5ebsd](#kikuchipy-h5ebsd) | Yes | Yes |\n", + "| [Bruker h5ebsd](#Bruker-h5ebsd) | Yes | No |\n", + "| [EDAX h5ebsd](#EDAX-h5ebsd) | Yes | No |\n", + "| [EDAX binary](#EDAX-binary) | Yes | No |\n", + "| [NORDIF binary](#NORDIF-binary) | Yes | Yes |\n", + "| [NORDIF calibration patterns](#NORDIF-calibration-patterns) | Yes | No |\n", + "| [Oxford Instruments binary](#Oxford-Instruments-binary) | Yes | No |\n", + "| [Oxford Instruments h5ebsd (H5OINA)](#Oxford-Instruments-h5ebsd-(H5OINA)) | Yes | No |\n", + "| [Directory of EBSD patterns](#Directory-of-EBSD-patterns) | Yes | No |\n", "\n", "
\n", "\n", @@ -1251,7 +1251,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.10.11" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/doc/user/applications.rst b/doc/user/applications.rst index 2e0f46b5..e09b09dc 100644 --- a/doc/user/applications.rst +++ b/doc/user/applications.rst @@ -14,6 +14,14 @@ Most of these works are also listed when searching for ``"kikuchipy"`` `on Googl 2023 ==== +- A. V. Bugten, L. Michels, R. B. Brurok, C. Hartung, E. Ott, L. Vines, Y. Li, + L. Arnberg and M. Di Sabatino, "The Role of Boron in Low Copper Spheroidal Graphite + Irons," *Metallurgical and Materials Transactions A* (2023). + https://doi.org/10.1007/s11661-023-07014-y. +- O. W. Sandvik, A. M. Müller, H. W. Ånes, M. Zahn, J. He, M. Fiebig, T. Lottermoser, + Th. Rojac, D. Meier and J. Schultheiß, "Pressure-control of non-ferroelastic + ferroelectric domains in ErMnO3," *arXiv* (2023). + https://doi.org/10.48550/arXiv.2304.08423. - H. W. Ånes, A. T. J. van Helvoort and K. Marthinsen, "Orientation dependent pinning of (sub)grains by dispersoids during recovery and recrystallization in an Al-Mn alloy," *Acta Materialia* **248** (2023). diff --git a/doc/user/related_projects.rst b/doc/user/related_projects.rst index 1767f17c..0c0d7c5c 100644 --- a/doc/user/related_projects.rst +++ b/doc/user/related_projects.rst @@ -6,18 +6,23 @@ This is a non-exhaustive list of related, open-source projects for analysis of EBSD data that users of kikuchipy might find useful: - :doc:`HyperSpy `: Python library with tools for multi-dimensional data - analysis, which kikuchipy builds upon. + analysis. kikuchipy extends this library for EBSD analysis. - `EMsoft `__: Series of Fortran programs which, among numerous other tasks, can dynamically simulate EBSD, Electron Channeling Pattern (ECP) and Transmission Kikuchi Diffraction (TKD) master patterns. - :doc:`orix `: Python library for handling crystal orientation mapping data. - kikuchipy depends on orix for all operations with vectors, rotations and crystal - symmetry. + kikuchipy depends on this library for all operations with vectors, rotations and + crystal symmetry. - :doc:`diffsims `: Python library for simulating diffraction. - kikuchipy depends on diffsims for handling of reciprocal lattice vectors. + kikuchipy depends on this library for handling of reciprocal lattice vectors. - :doc:`pyxem `: Python library for multi-dimensional diffraction microscopy. +- :doc:`PyEBSDIndex `: Python library for Hough/Radon based EBSD + indexing. + kikuchipy depends on this library for Hough indexing. +- `OpenECCI `__: GUI-based software for controlled + Electron Channelling Contrast Imaging (ECCI) analysis of crystal defects in an SEM. - `MTEX `__: Matlab toolbox for analyzing and modeling crystallographic textures by means of EBSD or pole figure data. - `AstroEBSD `__: Matlab package with diff --git a/kikuchipy/data/_data.py b/kikuchipy/data/_data.py index 77eb8a22..ab11197d 100644 --- a/kikuchipy/data/_data.py +++ b/kikuchipy/data/_data.py @@ -644,7 +644,7 @@ def ebsd_master_pattern( See Also -------- - nickel_ebsd_master_pattern_small, si_ebsd_master_pattern + nickel_ebsd_master_pattern_small, ebsd_master_pattern Notes ----- diff --git a/kikuchipy/data/edax_binary/create_dummy_edax_binary_file.py b/kikuchipy/data/edax_binary/create_dummy_edax_binary_file.py index 47228825..227f0c77 100644 --- a/kikuchipy/data/edax_binary/create_dummy_edax_binary_file.py +++ b/kikuchipy/data/edax_binary/create_dummy_edax_binary_file.py @@ -19,7 +19,6 @@ in the documentation. """ -import os from pathlib import Path import numpy as np @@ -35,11 +34,11 @@ n_patterns = ny * nx step_size = s.axes_manager["x"].scale -dir_data = Path(os.path.dirname(__file__)) +DIR_DATA = Path(__file__).parent # UP1, version 1 # -------------- -with open(dir_data / "edax_binary.up1", mode="w") as file1: +with open(DIR_DATA / "edax_binary.up1", mode="w") as file1: # File header: 16 bytes # 4 bytes with the file version np.array([1], "uint32").tofile(file1) @@ -57,7 +56,7 @@ # x x x x # # x x x # # ------- # -with open(dir_data / "edax_binary.up2", mode="w") as file2: +with open(DIR_DATA / "edax_binary.up2", mode="w") as file2: # File header: 42 bytes # 4 bytes with the file version np.array([3], "uint32").tofile(file2) diff --git a/kikuchipy/data/oxford_h5ebsd/create_oxford_h5ebsd_file.py b/kikuchipy/data/oxford_h5ebsd/create_oxford_h5ebsd_file.py index bc595960..201a7a6b 100644 --- a/kikuchipy/data/oxford_h5ebsd/create_oxford_h5ebsd_file.py +++ b/kikuchipy/data/oxford_h5ebsd/create_oxford_h5ebsd_file.py @@ -21,7 +21,7 @@ Only the groups and datasets read in the reader are included. """ -import os +from pathlib import Path from h5py import File import numpy as np @@ -42,10 +42,10 @@ sy, sx = s._signal_shape_rc dx = s.axes_manager["x"].scale -dir_data = os.path.abspath(os.path.dirname(__file__)) +dir_data = Path(__file__).parent -f = File(os.path.join(dir_data, "patterns.h5oina"), mode="w") +f = File(dir_data / "patterns.h5oina", mode="w") # Top group f.create_dataset("Format Version", data=b"5.0") diff --git a/kikuchipy/io/plugins/_h5ebsd.py b/kikuchipy/io/plugins/_h5ebsd.py index b5a0f816..d3358be5 100644 --- a/kikuchipy/io/plugins/_h5ebsd.py +++ b/kikuchipy/io/plugins/_h5ebsd.py @@ -45,8 +45,7 @@ def _hdf5group2dict( dictionary To fill dataset values into. recursive - Whether to add subgroups to ``dictionary`` (default is - ``False``). + Whether to add subgroups to ``dictionary`` (default is False). data_dset_names List of names of HDF5 data sets with data to not read. @@ -171,10 +170,10 @@ def check_file(self): ------ IOError If there are no datasets in the top group named - ``"manufacturer"`` and ``"version"``, or if there are no - groups in the top group containing the datasets - ``"EBSD/Data"`` and ``"EBSD/Header"``, or if there is no - reader for the file ``"manufacturer"``. + "manufacturer" and "version", or if there are no groups in + the top group containing the datasets + "EBSD/Data" and "EBSD/Header", or if there is no reader for + the file "manufacturer". """ error = None if self.manufacturer is None or self.version is None: @@ -291,7 +290,7 @@ def get_data( Output shape of pattern array, (ny, nx, sy, sx) = ( map rows, map columns, pattern rows, pattern columns). lazy - Whether to read dataset lazily (default is ``False``). + Whether to read dataset lazily (default is False). indices Mapping from pattern entry in the file to the 2D map, only used in the Bruker Nano reader. @@ -361,10 +360,10 @@ def get_axes_list(data_shape: tuple, data_scale: tuple) -> List[dict]: Parameters ---------- data_shape - 4D shape of pattern array, ``(ny, nx, sy, sx)`` = ( - map rows, map columns, pattern rows, pattern columns). + 4D shape of pattern array, (ny, nx, sy, sx) = ( map rows, + map columns, pattern rows, pattern columns). data_scale - Map scale and detector pixel size, ``(dy, dx, px_size)``. + Map scale and detector pixel size, (dy, dx, px_size). Returns ------- @@ -454,15 +453,15 @@ def read( Name or a list of names of the desired top HDF5 group(s). If not given, the first scan group is returned. lazy - Read dataset lazily (default is ``False``). If ``False``, - the file is closed after reading. + Read dataset lazily (default is False). If False, the file + is closed after reading. Returns ------- scan_list - List of dictionaries with keys ``"axes"``, ``"data"``, - ``"metadata"``, ``"original_metadata"``, ``"detector"``, - (possibly) ``"static_background"``, and ``"xmap"``. + List of dictionaries with keys "axes", "data", "metadata", + "original_metadata", "detector", (possibly) + "static_background", and "xmap". """ scan_dict_list = [] for scan in self.get_desired_scan_groups(group_names): @@ -482,15 +481,14 @@ def scan2dict(self, group: h5py.Group, lazy: bool = False) -> dict: group HDF5 group with patterns. lazy - Read dataset lazily (default is ``False``). + Read dataset lazily (default is False). Returns ------- scan_dict - Dictionary with keys ``"axes"``, ``"data"``, ``"metadata"``, - ``"original_metadata"``, ``"detector"``, - ``"static_background"``, and ``"xmap"``. This dictionary can - be passed as keyword arguments to create an - :class:`~kikuchipy.signals.EBSD` signal. + Dictionary with keys "axes", "data", "metadata", + "original_metadata", "detector", "static_background", and + "xmap". This dictionary can be passed as keyword arguments + to create an :class:`~kikuchipy.signals.EBSD` signal. """ return NotImplemented # pragma: no cover diff --git a/kikuchipy/io/plugins/edax_binary.py b/kikuchipy/io/plugins/edax_binary.py index beeb710d..a3486a60 100644 --- a/kikuchipy/io/plugins/edax_binary.py +++ b/kikuchipy/io/plugins/edax_binary.py @@ -20,7 +20,6 @@ The reader is adapted from the EDAX UP1/2 reader in PyEBSDIndex. """ -import os from pathlib import Path from typing import BinaryIO, Dict, List, Optional, Tuple, Union import warnings @@ -39,9 +38,8 @@ format_name = "EDAX binary" description = ( "Read support for electron backscatter diffraction patterns stored " - "in a binary file formatted in EDAX TSL's UP1/UP2 format with file " - "extension '.up1' or '.up2'. The reader is adapted from the EDAX " - "UP1/2 reader in PyEBSDIndex." + "in a binary EDAX TSL's UP1/UP2 file extension '.up1' or '.up2'. " + "The reader is adapted from the EDAX UP1/2 reader in PyEBSDIndex." ) full_support = False # Recognised file extension @@ -75,7 +73,7 @@ def file_reader( parameter's value. lazy Read the data lazily without actually reading the data from disk - until required. Default is ``False``. + until required. Default is False. Returns ------- @@ -103,7 +101,7 @@ def file_reader( """ with open(filename, mode="rb") as f: reader = EDAXBinaryFileReader(f) - scan = reader.read_scan(nav_shape=nav_shape, lazy=lazy) + scan = reader.read_scan(nav_shape, lazy) return [scan] @@ -118,9 +116,9 @@ class EDAXBinaryFileReader: def __init__(self, file: BinaryIO): """Prepare to read EBSD patterns from an open EDAX UP1/2 file.""" - self.file = file # Already open file + self.file = file - ext = os.path.splitext(file.name)[1][1:].lower() + ext = Path(file.name).suffix[1:].lower() self.dtype = {"up1": np.uint8, "up2": np.uint16}[ext] file.seek(0) @@ -140,27 +138,28 @@ def read_header(self) -> Dict[str, int]: file_size = Path(self.file.name).stat().st_size if self.version == 1: - n_patterns = int( - (file_size - pattern_offset) / (sx * sy * self.dtype(0).nbytes) - ) + n_patterns = (file_size - pattern_offset) / (sx * sy * self.dtype(0).nbytes) + n_patterns = int(n_patterns) nx, ny = n_patterns, 1 dx, dy = 1, 1 is_hex = False else: # Version >= 3 nx, ny = np.fromfile(self.file, "uint32", 2, offset=1) - is_hex = bool(np.fromfile(self.file, "uint8", 1)[0]) + is_hex = np.fromfile(self.file, "uint8", 1)[0] + is_hex = bool(is_hex) if is_hex: warnings.warn( "Returned signal has one navigation dimension since an hexagonal " "grid is not supported" ) - n_patterns = int( - (file_size - pattern_offset) / (sx * sy * self.dtype(0).nbytes) + n_patterns = (file_size - pattern_offset) / ( + sx * sy * self.dtype(0).nbytes ) + n_patterns = int(n_patterns) nx, ny = n_patterns, 1 else: - n_patterns = int(nx * ny) + n_patterns = nx * ny dx, dy = np.fromfile(self.file, "float64", 2) @@ -185,9 +184,9 @@ def read_scan( ---------- nav_shape Navigation shape, as (n map rows, n map columns). Default is - ``None``. + None. lazy - Whether to reader patterns lazily. Default is ``False``. + Whether to reader patterns lazily. Default is False. Returns ------- @@ -206,7 +205,6 @@ def read_scan( ) else: ny, nx = header["ny"], header["nx"] - n_patterns = header["n_patterns"] sy, sx = header["sy"], header["sx"] data_shape = (ny, nx, sy, sx) @@ -215,22 +213,20 @@ def read_scan( ndim = len(data_shape) nav_dim = ndim - 2 + data = np.memmap( + self.file.name, + dtype=self.dtype, + shape=data_shape, + mode="c", + offset=header["pattern_offset"], + ) + if lazy: - data = np.memmap( - self.file, - dtype=self.dtype, - shape=data_shape, - mode="r", - offset=header["pattern_offset"], - ) data = da.from_array(data) chunks = get_chunking( data_shape=data_shape, nav_dim=nav_dim, sig_dim=2, dtype=self.dtype ) data = data.rechunk(chunks) - else: - data = np.fromfile(self.file, self.dtype, n_patterns * sy * sx) - data = data.reshape(data_shape) units = ["um"] * ndim scales = [header["dy"], header["dx"]] + [1, 1][:nav_dim] @@ -247,18 +243,14 @@ def read_scan( for i in range(ndim) ] fname = self.file.name - metadata = dict( - General=dict( - original_filename=fname, - title=os.path.splitext(os.path.split(fname)[1])[0], - ), - Signal=dict(signal_type="EBSD", record_by="image"), - ) + metadata = { + "General": { + "original_filename": fname, + "title": Path(fname).stem, + }, + "Signal": {"signal_type": "EBSD", "record_by": "image"}, + } - scan = dict( - axes=axes, - data=data, - metadata=metadata, - ) + scan = {"axes": axes, "data": data, "metadata": metadata} return scan diff --git a/kikuchipy/io/plugins/oxford_h5ebsd.py b/kikuchipy/io/plugins/oxford_h5ebsd.py index 8cb064af..793cb4c2 100644 --- a/kikuchipy/io/plugins/oxford_h5ebsd.py +++ b/kikuchipy/io/plugins/oxford_h5ebsd.py @@ -80,16 +80,15 @@ def scan2dict(self, group: h5py.Group, lazy: bool = False) -> dict: group Group with patterns. lazy - Whether to read dataset lazily (default is ``False``). + Whether to read dataset lazily (default is False). Returns ------- scan_dict - Dictionary with keys ``"axes"``, ``"data"``, ``"metadata"``, - ``"original_metadata"``, ``"detector"``, - ``"static_background"``, and ``"xmap"``. This dictionary can - be passed as keyword arguments to create an - :class:`~kikuchipy.signals.EBSD` signal. + Dictionary with keys "axes", "data", "metadata", + "original_metadata", "detector", "static_background", and + "xmap". This dictionary can be passed as keyword arguments + to create an :class:`~kikuchipy.signals.EBSD` signal. Raises ------ @@ -160,14 +159,14 @@ def scan2dict(self, group: h5py.Group, lazy: bool = False) -> dict: convention="oxford", ) detector_tilt_euler = hd.get("Detector Orientation Euler") - binning_str = hd.get("Camera Binning Mode") try: detector_kw["tilt"] = np.rad2deg(detector_tilt_euler[1]) - 90 except (IndexError, TypeError): # pragma: no cover _logger.debug("Could not read detector tilt") + binning_str = hd.get("Camera Binning Mode") try: detector_kw["binning"] = int(binning_str.split("x")[0]) - except IndexError: # pragma: no cover + except (IndexError, ValueError): # pragma: no cover _logger.debug("Could not read detector binning") scan_dict["detector"] = EBSDDetector(**detector_kw) @@ -197,16 +196,15 @@ def file_reader( lazy Open the data lazily without actually reading the data from disk until required. Allows opening arbitrary sized datasets. Default - is ``False``. + is False. **kwargs Keyword arguments passed to :class:`h5py.File`. Returns ------- scan_dict_list - List of one or more dictionaries with the keys ``"axes"``, - ``"data"``, ``"metadata"``, ``"original_metadata"``, - ``"detector"``, and ``"xmap"``. This + List of one or more dictionaries with the keys "axes", "data", + "metadata", "original_metadata", "detector", and "xmap". This dictionary can be passed as keyword arguments to create an :class:`~kikuchipy.signals.EBSD` signal. """ diff --git a/kikuchipy/io/plugins/tests/test_edax_binary.py b/kikuchipy/io/plugins/tests/test_edax_binary.py index f851d80c..2b9ed1d0 100644 --- a/kikuchipy/io/plugins/tests/test_edax_binary.py +++ b/kikuchipy/io/plugins/tests/test_edax_binary.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU General Public License # along with kikuchipy. If not, see . -import os +from pathlib import Path import dask.array as da import numpy as np @@ -24,10 +24,9 @@ import kikuchipy as kp -DIR_PATH = os.path.dirname(__file__) -EDAX_PATH = os.path.join(DIR_PATH, "../../../data/edax_binary") -FILE_UP1 = os.path.join(EDAX_PATH, "edax_binary.up1") -FILE_UP2 = os.path.join(EDAX_PATH, "edax_binary.up2") +EDAX_PATH = Path(__file__).parent / "../../../data/edax_binary" +FILE_UP1 = EDAX_PATH / "edax_binary.up1" +FILE_UP2 = EDAX_PATH / "edax_binary.up2" class TestEDAXBinaryReader: diff --git a/kikuchipy/io/plugins/tests/test_oxford_h5ebsd.py b/kikuchipy/io/plugins/tests/test_oxford_h5ebsd.py index 6337435e..9192044f 100644 --- a/kikuchipy/io/plugins/tests/test_oxford_h5ebsd.py +++ b/kikuchipy/io/plugins/tests/test_oxford_h5ebsd.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU General Public License # along with kikuchipy. If not, see . -import os +from pathlib import Path import numpy as np @@ -23,9 +23,7 @@ from kikuchipy.conftest import assert_dictionary -DIR_PATH = os.path.dirname(__file__) -DATA_PATH = os.path.join(DIR_PATH, "../../../data") -OXFORD_FILE = os.path.join(DATA_PATH, "oxford_h5ebsd/patterns.h5oina") +OXFORD_FILE = Path(__file__).parent / "../../../data/oxford_h5ebsd/patterns.h5oina" class TestOxfordH5EBSD: diff --git a/kikuchipy/release.py b/kikuchipy/release.py index 35ff78dc..c2e2f45b 100644 --- a/kikuchipy/release.py +++ b/kikuchipy/release.py @@ -37,4 +37,4 @@ name = "kikuchipy" platforms = ["Linux", "MacOS X", "Windows"] status = "Development" -version = "0.8.5" +version = "0.8.6"