diff --git a/cipher_parse/geometry.py b/cipher_parse/geometry.py index 5b29f22..ed3bf0a 100644 --- a/cipher_parse/geometry.py +++ b/cipher_parse/geometry.py @@ -16,7 +16,7 @@ GeometryVoxelPhaseError, ) from cipher_parse.utilities import generate_interface_energies_plot -from cipher_parse.quats import quat_angle_between +from cipher_parse.quats import compute_misorientation_matrix, quat_angle_between class CIPHERGeometry: @@ -379,7 +379,6 @@ def _check_interface_phase_pairs(self): the specified phases of associated material.""" for i in self.interfaces: - # assign materials as well as phase_types if materials not assigned to # interface: if not i.materials: @@ -522,7 +521,6 @@ def _get_interface_map(self, upper_tri_only=False, quiet=False): ints_by_phase_type_pair[int_def.phase_types].append(int_def) for pt_pair, int_defs in ints_by_phase_type_pair.items(): - names = [i.name for i in int_defs] if len(set(names)) < len(names): raise ValueError( @@ -670,7 +668,6 @@ def get_misorientation_matrix(self, degrees=True, overwrite=False): ) return - misori_matrix = np.zeros((self.num_phases, self.num_phases), dtype=float) all_oris = np.ones((self.num_phases, 4)) * np.nan for i in self.phase_types: all_oris[i.phases] = i.orientations @@ -680,24 +677,7 @@ def get_misorientation_matrix(self, degrees=True, overwrite=False): "Not all orientations are accounted for in the phase type definitions." ) - all_oris = Orientation(all_oris, family="cubic") # TODO: generalise symmetry - - misori_matrix = np.zeros((self.num_phases, self.num_phases), dtype=float) - for idx in range(self.num_phases): - print( - f"Finding misorientation for orientation {idx + 1}/{len(all_oris)}", - flush=True, - ) - ori_i = all_oris[idx : idx + 1] - other_oris = all_oris[idx + 1 :] - if other_oris.size: - disori_i = ori_i.disorientation(other_oris).as_axis_angle()[..., -1] - misori_matrix[idx, idx + 1 :] = disori_i - misori_matrix[idx + 1 :, idx] = disori_i - - if degrees: - misori_matrix = np.rad2deg(misori_matrix) - + misori_matrix = compute_misorientation_matrix(all_oris, degrees) self._misorientation_matrix = misori_matrix self._misorientation_matrix_is_degrees = degrees @@ -728,7 +708,6 @@ def assign_phase_material_randomly( volume_fractions, random_seed=None, ): - print( "Randomly assigning phases to materials according to volume_fractions...", end="", @@ -754,7 +733,6 @@ def from_voronoi( random_seed=None, is_periodic=False, ): - if sum(i is not None for i in (seeds, num_phases)) != 1: raise ValueError(f"Specify exactly one of `seeds` and `num_phases`") @@ -880,7 +858,6 @@ def get_slice( include=None, misorientation_matrix=None, ): - allowed_data = [ "phase", "material", @@ -939,7 +916,6 @@ def show_slice( layout_args=None, **kwargs, ): - if "misorientation_matrix" in kwargs: slice_dat = self.get_slice( slice_index, @@ -996,7 +972,6 @@ def show(self): pl.show() def write_VTK(self, path): - grid = self.get_pyvista_grid() grid.cell_data["interface_idx"] = self.voxel_interface_idx_3D.flatten(order="F") diff --git a/cipher_parse/quats.py b/cipher_parse/quats.py index 946c627..eca7cae 100644 --- a/cipher_parse/quats.py +++ b/cipher_parse/quats.py @@ -1,5 +1,7 @@ import numpy as np +from defdap.quat import Quat + def quat_conjugate(quats_arr): quats_copy = np.copy(quats_arr) @@ -264,3 +266,39 @@ def quat_sample_random(number): ).T return quats + + +def compute_misorientation_matrix(quat_comps, degrees=False, quiet=False): + """Use DefDAP to calculate an N-by-N symmetric matrix of disorientation angles between + an array of N quaternions. + + Parameter + --------- + degrees + If True, return the misorientation array in degrees rather than radians. + + """ + + num_quats = len(quat_comps) + quat_objs = np.empty(num_quats, dtype=Quat) + + for i in range(len(quat_comps)): + quat_objs[i] = Quat(quat_comps[i]) + + quat_comps_sym = Quat.calcSymEqvs(quat_objs, "cubic") + + misori_matrix = np.zeros((num_quats, num_quats)) + for idx, ref_ori in enumerate(quat_objs): + if not quiet and idx % 100 == 0: + print(f"Finding misorientations {idx}/{num_quats}", flush=True) + misori, _ = Quat.calcMisOri(quat_comps_sym, ref_ori) + misori_matrix[:, idx] = 2 * np.arccos(misori) + + # make precisely symmetric + misori_matrix = np.triu(misori_matrix) + misori_matrix = misori_matrix + misori_matrix.T - np.diag(np.diag(misori_matrix)) + + if degrees: + misori_matrix = np.rad2deg(misori_matrix) + + return misori_matrix diff --git a/poetry.lock b/poetry.lock index 47ace93..d30305f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -842,6 +842,32 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "defdap" +version = "0.93.5" +description = "A python library for correlating EBSD and HRDIC data." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "DefDAP-0.93.5-py3-none-any.whl", hash = "sha256:e49572eaba1fd2bc075169e5e3e5df70985123d6f2db6dfa74e55bafb8602926"}, + {file = "DefDAP-0.93.5.tar.gz", hash = "sha256:3f6d2d7cfac8c65aa81c031e23e4e9589beecdc0c646b5395e3610a9679164b7"}, +] + +[package.dependencies] +matplotlib = ">=3.0.0" +matplotlib-scalebar = "*" +networkx = "*" +numpy = "*" +pandas = "*" +peakutils = "*" +scikit-image = "*" +scipy = "*" + +[package.extras] +docs = ["sphinx (==3.2.1)", "sphinx-autodoc-typehints (==1.11.1)", "sphinx-rtd-theme (==0.5.0)"] +testing = ["coverage", "pytest", "pytest-cases", "pytest-cov"] + [[package]] name = "defusedxml" version = "0.7.1" @@ -1260,6 +1286,38 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "imageio" +version = "2.31.1" +description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "imageio-2.31.1-py3-none-any.whl", hash = "sha256:4106fb395ef7f8dc0262d6aa1bb03daba818445c381ca8b7d5dfc7a2089b04df"}, + {file = "imageio-2.31.1.tar.gz", hash = "sha256:f8436a02af02fd63f272dab50f7d623547a38f0e04a4a73e2b02ae1b8b180f27"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=8.3.2" + +[package.extras] +all-plugins = ["astropy", "av", "imageio-ffmpeg", "psutil", "tifffile"] +all-plugins-pypy = ["av", "imageio-ffmpeg", "psutil", "tifffile"] +build = ["wheel"] +dev = ["black", "flake8", "fsspec[github]", "pytest", "pytest-cov"] +docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] +ffmpeg = ["imageio-ffmpeg", "psutil"] +fits = ["astropy"] +full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "itk", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "sphinx (<6)", "tifffile", "wheel"] +gdal = ["gdal"] +itk = ["itk"] +linting = ["black", "flake8"] +pyav = ["av"] +test = ["fsspec[github]", "pytest", "pytest-cov"] +tifffile = ["tifffile"] + [[package]] name = "imagesize" version = "1.4.1" @@ -2226,6 +2284,21 @@ files = [ [package.dependencies] traitlets = "*" +[[package]] +name = "matplotlib-scalebar" +version = "0.8.1" +description = "Artist for matplotlib to display a scale bar" +category = "main" +optional = false +python-versions = "~=3.7" +files = [ + {file = "matplotlib-scalebar-0.8.1.tar.gz", hash = "sha256:14887af1093579c5e6afae51a0a1ecc3f715cdbc5c4d7ef59cdeec76ee6bb15d"}, + {file = "matplotlib_scalebar-0.8.1-py2.py3-none-any.whl", hash = "sha256:a8a2f361d4c2d576d087df3092ed95cac2f708f8b40d5d2bb992bd190e740b3a"}, +] + +[package.dependencies] +matplotlib = "*" + [[package]] name = "mccabe" version = "0.7.0" @@ -2478,6 +2551,25 @@ files = [ {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, ] +[[package]] +name = "networkx" +version = "3.1" +description = "Python package for creating and manipulating graphs and networks" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, + {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, +] + +[package.extras] +default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] + [[package]] name = "nodeenv" version = "1.8.0" @@ -2712,6 +2804,22 @@ files = [ {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] +[[package]] +name = "peakutils" +version = "1.3.4" +description = "Peak detection utilities for 1D data" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "PeakUtils-1.3.4-py3-none-any.whl", hash = "sha256:8fd79ad3bbdaf3ef258c26f8dfa6a748638329c9b8c765960fb14650a155c73d"}, + {file = "PeakUtils-1.3.4.tar.gz", hash = "sha256:8920426a39424ea9f025cd76a0c19150107143670bea47e4935d4435f65e6370"}, +] + +[package.dependencies] +numpy = "*" +scipy = "*" + [[package]] name = "pexpect" version = "4.8.0" @@ -3281,6 +3389,44 @@ io = ["imageio", "meshio (>=5.2)"] jupyter = ["ipyvtklink", "ipywidgets", "jupyter-server-proxy", "nest-asyncio", "panel", "pythreejs", "trame (>=2.2.6)", "trame-client (>=2.4.2)", "trame-server (>=2.8.0)", "trame-vtk (>=2.4.0)"] trame = ["trame (>=2.2.6)", "trame-client (>=2.4.2)", "trame-server (>=2.8.0)", "trame-vtk (>=2.4.0)"] +[[package]] +name = "pywavelets" +version = "1.4.1" +description = "PyWavelets, wavelet transform module" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyWavelets-1.4.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:d854411eb5ee9cb4bc5d0e66e3634aeb8f594210f6a1bed96dbed57ec70f181c"}, + {file = "PyWavelets-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:231b0e0b1cdc1112f4af3c24eea7bf181c418d37922a67670e9bf6cfa2d544d4"}, + {file = "PyWavelets-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:754fa5085768227c4f4a26c1e0c78bc509a266d9ebd0eb69a278be7e3ece943c"}, + {file = "PyWavelets-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da7b9c006171be1f9ddb12cc6e0d3d703b95f7f43cb5e2c6f5f15d3233fcf202"}, + {file = "PyWavelets-1.4.1-cp310-cp310-win32.whl", hash = "sha256:67a0d28a08909f21400cb09ff62ba94c064882ffd9e3a6b27880a111211d59bd"}, + {file = "PyWavelets-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:91d3d393cffa634f0e550d88c0e3f217c96cfb9e32781f2960876f1808d9b45b"}, + {file = "PyWavelets-1.4.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:64c6bac6204327321db30b775060fbe8e8642316e6bff17f06b9f34936f88875"}, + {file = "PyWavelets-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f19327f2129fb7977bc59b966b4974dfd72879c093e44a7287500a7032695de"}, + {file = "PyWavelets-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad987748f60418d5f4138db89d82ba0cb49b086e0cbb8fd5c3ed4a814cfb705e"}, + {file = "PyWavelets-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:875d4d620eee655346e3589a16a73790cf9f8917abba062234439b594e706784"}, + {file = "PyWavelets-1.4.1-cp311-cp311-win32.whl", hash = "sha256:7231461d7a8eb3bdc7aa2d97d9f67ea5a9f8902522818e7e2ead9c2b3408eeb1"}, + {file = "PyWavelets-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:daf0aa79842b571308d7c31a9c43bc99a30b6328e6aea3f50388cd8f69ba7dbc"}, + {file = "PyWavelets-1.4.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:ab7da0a17822cd2f6545626946d3b82d1a8e106afc4b50e3387719ba01c7b966"}, + {file = "PyWavelets-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:578af438a02a86b70f1975b546f68aaaf38f28fb082a61ceb799816049ed18aa"}, + {file = "PyWavelets-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb5ca8d11d3f98e89e65796a2125be98424d22e5ada360a0dbabff659fca0fc"}, + {file = "PyWavelets-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:058b46434eac4c04dd89aeef6fa39e4b6496a951d78c500b6641fd5b2cc2f9f4"}, + {file = "PyWavelets-1.4.1-cp38-cp38-win32.whl", hash = "sha256:de7cd61a88a982edfec01ea755b0740e94766e00a1ceceeafef3ed4c85c605cd"}, + {file = "PyWavelets-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:7ab8d9db0fe549ab2ee0bea61f614e658dd2df419d5b75fba47baa761e95f8f2"}, + {file = "PyWavelets-1.4.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:23bafd60350b2b868076d976bdd92f950b3944f119b4754b1d7ff22b7acbf6c6"}, + {file = "PyWavelets-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0e56cd7a53aed3cceca91a04d62feb3a0aca6725b1912d29546c26f6ea90426"}, + {file = "PyWavelets-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030670a213ee8fefa56f6387b0c8e7d970c7f7ad6850dc048bd7c89364771b9b"}, + {file = "PyWavelets-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71ab30f51ee4470741bb55fc6b197b4a2b612232e30f6ac069106f0156342356"}, + {file = "PyWavelets-1.4.1-cp39-cp39-win32.whl", hash = "sha256:47cac4fa25bed76a45bc781a293c26ac63e8eaae9eb8f9be961758d22b58649c"}, + {file = "PyWavelets-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:88aa5449e109d8f5e7f0adef85f7f73b1ab086102865be64421a3a3d02d277f4"}, + {file = "PyWavelets-1.4.1.tar.gz", hash = "sha256:6437af3ddf083118c26d8f97ab43b0724b956c9f958e9ea788659f6a2834ba93"}, +] + +[package.dependencies] +numpy = ">=1.17.3" + [[package]] name = "pywin32" version = "306" @@ -3593,6 +3739,58 @@ files = [ {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, ] +[[package]] +name = "scikit-image" +version = "0.19.3" +description = "Image processing in Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "scikit-image-0.19.3.tar.gz", hash = "sha256:24b5367de1762da6ee126dd8f30cc4e7efda474e0d7d70685433f0e3aa2ec450"}, + {file = "scikit_image-0.19.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:3a01372ae4bca223873304b0bff79b9d92446ac6d6177f73d89b45561e2d09d8"}, + {file = "scikit_image-0.19.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fdf48d9b1f13af69e4e2c78e05067e322e9c8c97463c315cd0ecb47a94e259fc"}, + {file = "scikit_image-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6a8f98f2ac9bb73706461fd1dec875f6a5141759ed526850a5a49e90003d19"}, + {file = "scikit_image-0.19.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfbb073f23deb48e0e60c47f8741d8089121d89cc78629ea8c5b51096efc5be7"}, + {file = "scikit_image-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:cc24177de3fdceca5d04807ad9c87d665f0bf01032ed94a9055cd1ed2b3f33e9"}, + {file = "scikit_image-0.19.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:fd9dd3994bb6f9f7a35f228323f3c4dc44b3cf2ff15fd72d895216e9333550c6"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad5d8000207a264d1a55681a9276e6a739d3f05cf4429004ad00d61d1892235f"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:84baa3179f3ae983c3a5d81c1e404bc92dcf7daeb41bfe9369badcda3fb22b92"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f9f8a1387afc6c70f2bed007c3854a2d7489f9f7713c242f16f32ee05934bc2"}, + {file = "scikit_image-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:9fb0923a3bfa99457c5e17888f27b3b8a83a3600b4fef317992e7b7234764732"}, + {file = "scikit_image-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:ce3d2207f253b8eb2c824e30d145a9f07a34a14212d57f3beca9f7e03c383cbe"}, + {file = "scikit_image-0.19.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:2a02d1bd0e2b53e36b952bd5fd6118d9ccc3ee51de35705d63d8eb1f2e86adef"}, + {file = "scikit_image-0.19.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:03779a7e1736fdf89d83c0ba67d44110496edd736a3bfce61a2b5177a1c8a099"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19a21a101a20c587a3b611a2cf6f86c35aae9f8d9563279b987e83ee1c9a9790"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f50b923f8099c1045fcde7418d86b206c87e333e43da980f41d8577b9605245"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e207c6ce5ce121d7d9b9d2b61b9adca57d1abed112c902d8ffbfdc20fb42c12b"}, + {file = "scikit_image-0.19.3-cp38-cp38-win32.whl", hash = "sha256:a7c3985c68bfe05f7571167ee021d14f5b8d1a4a250c91f0b13be7fb07e6af34"}, + {file = "scikit_image-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:651de1c2ce1fbee834753b46b8e7d81cb12a5594898babba63ac82b30ddad49d"}, + {file = "scikit_image-0.19.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:8d8917fcf85b987b1f287f823f3a1a7dac38b70aaca759bc0200f3bc292d5ced"}, + {file = "scikit_image-0.19.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0b0a199157ce8487c77de4fde0edc0b42d6d42818881c11f459262351d678b2d"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33dfd463ee6cc509defa279b963829f2230c9e0639ccd3931045be055878eea6"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8714348ddd671f819457a797c97d4c672166f093def66d66c3254cbd1d43f83"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3b1025356508d41f4fe48528e509d95f9e4015e90cf158cd58c56dc63e0ac5"}, + {file = "scikit_image-0.19.3-cp39-cp39-win32.whl", hash = "sha256:9439e5294de3f18d6e82ec8eee2c46590231cf9c690da80545e83a0733b7a69e"}, + {file = "scikit_image-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:32fb88cc36203b99c9672fb972c9ef98635deaa5fc889fe969f3e11c44f22919"}, +] + +[package.dependencies] +imageio = ">=2.4.1" +networkx = ">=2.2" +numpy = ">=1.17.0" +packaging = ">=20.0" +pillow = ">=6.1.0,<7.1.0 || >7.1.0,<7.1.1 || >7.1.1,<8.3.0 || >8.3.0" +PyWavelets = ">=1.1.1" +scipy = ">=1.4.1" +tifffile = ">=2019.7.26" + +[package.extras] +data = ["pooch (>=1.3.0)"] +docs = ["cloudpickle (>=0.2.1)", "dask[array] (>=0.15.0,!=2.17.0)", "ipywidgets", "kaleido", "matplotlib (>=3.3)", "myst-parser", "numpydoc (>=1.0)", "pandas (>=0.23.0)", "plotly (>=4.14.0)", "pooch (>=1.3.0)", "pytest-runner", "scikit-learn", "seaborn (>=0.7.1)", "sphinx (>=1.8)", "sphinx-copybutton", "sphinx-gallery (>=0.10.1)", "tifffile (>=2020.5.30)"] +optional = ["SimpleITK", "astropy (>=3.1.2)", "cloudpickle (>=0.2.1)", "dask[array] (>=1.0.0,!=2.17.0)", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", "pyamg", "qtpy"] +test = ["asv", "codecov", "flake8", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", "pytest (>=5.2.0)", "pytest-cov (>=2.7.0)", "pytest-faulthandler", "pytest-localserver"] + [[package]] name = "scipy" version = "1.10.1" @@ -4042,6 +4240,24 @@ tornado = ">=6.1.0" docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +[[package]] +name = "tifffile" +version = "2023.7.10" +description = "Read and write TIFF files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tifffile-2023.7.10-py3-none-any.whl", hash = "sha256:94dfdec321ace96abbfe872a66cfd824800c099a2db558443453eebc2c11b304"}, + {file = "tifffile-2023.7.10.tar.gz", hash = "sha256:c06ec460926d16796eeee249a560bcdddf243daae36ac62af3c84a953cd60b4a"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +all = ["defusedxml", "fsspec", "imagecodecs (>=2023.1.23)", "lxml", "matplotlib", "zarr"] + [[package]] name = "tinycss2" version = "1.2.1" @@ -4838,4 +5054,4 @@ notebook = ["notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "0d4c85246e567b017ea558ca37d129fc50b2e5c761ade720ad4e21f65ab3bd3c" +content-hash = "abcd7dc42d7dbae62b9047bcbc873c753743224f5ce52c18ba1bab3e9beec12e" diff --git a/pyproject.toml b/pyproject.toml index 4dd8938..6f5305e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ ipywidgets = "<8.0.0" sqlalchemy = {version = "<2.0.0", optional = true} pyvista = "^0.39.0" trame = "^2.4.2" +defdap = "^0.93.5" [tool.poetry.dev-dependencies] pylint = "^2.12.2"