diff --git a/related-packages/fileformats-extras/conftest.py b/related-packages/fileformats-extras/conftest.py index c5f2809..7d7f343 100644 --- a/related-packages/fileformats-extras/conftest.py +++ b/related-packages/fileformats-extras/conftest.py @@ -3,7 +3,7 @@ from pathlib import Path import tempfile import pytest -from fileformats.medimage import DicomDir +from fileformats.medimage import DicomDir, Nifti # Set DEBUG logging for unittests @@ -43,3 +43,10 @@ def dummy_dwi_dicom(): import medimages4tests.dummy.dicom.mri.dwi.siemens.skyra.syngo_d13c as module return DicomDir(module.get_image()) + + +@pytest.fixture(scope="session") +def dummy_nifti(): + import medimages4tests.dummy.nifti as module + + return Nifti(module.get_image()) diff --git a/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/converters.py b/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/converters.py index c87918c..7015c6f 100644 --- a/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/converters.py +++ b/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/converters.py @@ -4,6 +4,7 @@ from fileformats.medimage_mrtrix3 import ( ImageFormat as MrtrixImage, ImageHeader as MrtrixImageHeader, + ImageFormatGz as MrtrixImageGz, ) try: @@ -16,6 +17,18 @@ in_out_file_kwargs = {} +@converter( + source_format=MedicalImage, + target_format=MrtrixImageGz, + out_ext=MrtrixImageGz.ext, + **in_out_file_kwargs, +) +@converter( + source_format=MedicalImage, + target_format=MrtrixImageHeader, + out_ext=MrtrixImageHeader.ext, + **in_out_file_kwargs, +) @converter( source_format=MedicalImage, target_format=MrtrixImage, @@ -40,25 +53,25 @@ def mrconvert(name, out_ext: str, **kwargs): return MrConvert(name=name, out_file="out" + out_ext, **kwargs) -@converter( - source_format=MedicalImage, - target_format=MrtrixImageHeader, - out_ext=MrtrixImageHeader.ext, - **in_out_file_kwargs, -) -def mrconvert2(name, out_ext: str, **kwargs): - """Initiate an MRConvert task with the output file extension set +# @converter( +# source_format=MedicalImage, +# target_format=MrtrixImageHeader, +# out_ext=MrtrixImageHeader.ext, +# **in_out_file_kwargs, +# ) +# def mrconvert2(name, out_ext: str, **kwargs): +# """Initiate an MRConvert task with the output file extension set - Parameters - ---------- - name : str - name of the converter task - out_ext : str - extension of the output file, used by MRConvert to determine the desired format +# Parameters +# ---------- +# name : str +# name of the converter task +# out_ext : str +# extension of the output file, used by MRConvert to determine the desired format - Returns - ------- - pydra.ShellCommandTask - the converter task - """ - return MrConvert(name=name, out_file="out" + out_ext, **kwargs) +# Returns +# ------- +# pydra.ShellCommandTask +# the converter task +# """ +# return MrConvert(name=name, out_file="out" + out_ext, **kwargs) diff --git a/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/image.py b/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/image.py index be543ee..d6d29c8 100644 --- a/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/image.py +++ b/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/image.py @@ -1,13 +1,25 @@ import os +import sys from unittest import mock import typing as ty from pathlib import Path import numpy as np +import numpy.typing from medimages4tests.dummy.nifti import get_image as get_dummy_nifti from fileformats.core import FileSet, SampleFileGenerator, extra_implementation from fileformats.medimage import MedicalImage, Nifti1 from fileformats.medimage_mrtrix3 import ImageFormat +if sys.version_info >= (3, 9): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + + +DataArrayType: TypeAlias = ( + "numpy.typing.NDArray[ty.Union[np.floating[ty.Any], np.integer[ty.Any]]]" +) + @extra_implementation(FileSet.generate_sample_data) def generate_mrtrix_sample_data( @@ -21,7 +33,7 @@ def generate_mrtrix_sample_data( @extra_implementation(MedicalImage.read_array) -def mrtrix_read_array(mif: ImageFormat) -> np.ndarray: +def mrtrix_read_array(mif: ImageFormat) -> DataArrayType: raise NotImplementedError( "Need to work out how to use the metadata to read the array in the correct order" ) diff --git a/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/tests/test_converters.py b/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/tests/test_converters.py index cf85377..dd61b72 100644 --- a/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/tests/test_converters.py +++ b/related-packages/fileformats-extras/fileformats/extras/medimage_mrtrix3/tests/test_converters.py @@ -1,5 +1,5 @@ from fileformats.medimage import NiftiBvec -from fileformats.medimage_mrtrix3 import ImageFormat, ImageHeader +from fileformats.medimage_mrtrix3 import ImageFormat, ImageHeader, ImageFormatGz # @pytest.mark.xfail(reason="not sure what the reason is at this stage, might be bug in Pydra") @@ -15,3 +15,9 @@ def test_dicom_to_mrtrix_image(dummy_dwi_dicom): def test_dicom_to_mrtrix_image_header(dummy_dwi_dicom): ImageHeader.convert(dummy_dwi_dicom) + + +def test_mif_to_mifgz(dummy_nifti): + mif = ImageFormat.convert(dummy_nifti) + mif_gz = ImageFormatGz.convert(mif) + ImageFormat.convert(mif_gz) diff --git a/related-packages/fileformats/fileformats/medimage_mrtrix3/__init__.py b/related-packages/fileformats/fileformats/medimage_mrtrix3/__init__.py index abd61f2..1d228ae 100644 --- a/related-packages/fileformats/fileformats/medimage_mrtrix3/__init__.py +++ b/related-packages/fileformats/fileformats/medimage_mrtrix3/__init__.py @@ -13,3 +13,23 @@ ImageHeaderB, ) from .track import Tracks + + +__all__ = [ + "__version__", + "ImageIn", + "ImageOut", + "BFile", + "Tracks", + "NiftiB", + "NiftiGzB", + "NiftiGzXB", + "NiftiXB", + "ImageFormatB", + "ImageFormatGzB", + "ImageHeaderB", + "ImageFormat", + "ImageFormatGz", + "ImageHeader", + "ImageDataFile", +] diff --git a/related-packages/fileformats/fileformats/medimage_mrtrix3/image.py b/related-packages/fileformats/fileformats/medimage_mrtrix3/image.py index 1b4b587..c429a7a 100644 --- a/related-packages/fileformats/fileformats/medimage_mrtrix3/image.py +++ b/related-packages/fileformats/fileformats/medimage_mrtrix3/image.py @@ -2,7 +2,7 @@ import typing as ty from fileformats.core import FileSet, extra_implementation from fileformats.generic import File -from fileformats.application import Gzip +from fileformats.application.archive import BaseGzip from fileformats.core.mixin import WithMagicNumber from fileformats.core.exceptions import FormatMismatchError import fileformats.medimage @@ -61,8 +61,9 @@ def data_file(self): return self -class ImageFormatGz(Gzip[ImageFormat]): +class ImageFormatGz(fileformats.medimage.MedicalImage, BaseGzip): + archived_type = ImageFormat iana_mime = "application/x-mrtrix-image-format-gz" ext = ".mif.gz" diff --git a/related-packages/fileformats/fileformats/medimage_mrtrix3/in_out.py b/related-packages/fileformats/fileformats/medimage_mrtrix3/in_out.py index fd5ab7b..20c77f7 100644 --- a/related-packages/fileformats/fileformats/medimage_mrtrix3/in_out.py +++ b/related-packages/fileformats/fileformats/medimage_mrtrix3/in_out.py @@ -1,3 +1,4 @@ +import sys import typing as ty from fileformats.application import Dicom from fileformats.medimage import ( @@ -10,6 +11,10 @@ Mgh, MghGz, Analyze, + NiftiBvec, + NiftiGzBvec, + NiftiXBvec, + NiftiGzXBvec, ) from .image import ImageFormat, ImageHeader, ImageFormatGz from .dwi import ( @@ -22,8 +27,13 @@ ImageHeaderB, ) +if sys.version_info >= (3, 9): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias -ImageIn = ty.Union[ + +ImageIn: TypeAlias = ty.Union[ ImageFormat, ImageFormatGz, ImageHeader, @@ -37,12 +47,16 @@ NiftiX, Nifti1, Nifti2, + NiftiB, + NiftiGzB, + NiftiGzXB, + NiftiXB, Mgh, MghGz, Analyze, ] -ImageOut = ty.Union[ +ImageOut: TypeAlias = ty.Union[ ImageFormat, ImageFormatGz, ImageHeader, @@ -54,6 +68,14 @@ NiftiX, Nifti1, Nifti2, + NiftiB, + NiftiGzB, + NiftiGzXB, + NiftiXB, + NiftiBvec, + NiftiGzBvec, + NiftiXBvec, + NiftiGzXBvec, Mgh, MghGz, Analyze,