imagedata 3.7.2.dev1__tar.gz → 3.8.0rc0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/CHANGELOG.md +44 -1
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/PKG-INFO +3 -2
- imagedata-3.8.0rc0/VERSION.txt +1 -0
- imagedata-3.8.0rc0/data/dicom/5D.zip +0 -0
- imagedata-3.8.0rc0/data/dicom/ep2d_RSI_b0_500_1500_6dir.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/evidence2mask.py +25 -3
- imagedata-3.8.0rc0/src/imagedata/apps/diffusion.py +341 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/archives/zipfilearchive.py +8 -2
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/axis.py +5 -1
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/cmdline.py +2 -2
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/collection.py +3 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/__init__.py +4 -58
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/dicomplugin.py +348 -191
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/itkplugin.py +8 -9
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/matplugin.py +8 -10
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/niftiplugin.py +9 -10
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/header.py +78 -40
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/image_data.py +3 -3
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/readdata.py +7 -3
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/series.py +59 -53
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/xnattransport.py +4 -1
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/viewer.py +4 -1
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/PKG-INFO +3 -2
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/SOURCES.txt +2 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/compare_headers.py +31 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_dicom.py +146 -10
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_dicom_color.py +1 -1
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_dicom_template.py +12 -7
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_series.py +25 -3
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_series_ufunc.py +4 -1
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_transport_filetransport.py +1 -1
- imagedata-3.7.2.dev1/VERSION.txt +0 -1
- imagedata-3.7.2.dev1/src/imagedata/apps/diffusion.py +0 -161
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/.readthedocs.yaml +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/.travis.yml +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/CONTRIBUTING.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/LICENSE.txt +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/MANIFEST.in +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/Makefile +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/README.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/TI/TI_1.MR.0021.0001.2021.06.08.10.04.29.806302.203193459.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/TI/TI_1.MR.0022.0001.2021.06.08.10.04.29.806302.203195509.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/TI/TI_1.MR.0023.0001.2021.06.08.10.04.29.806302.203197559.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/TI/TI_1.MR.0024.0001.2021.06.08.10.04.29.806302.203199609.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/TI/TI_1.MR.0025.0001.2021.06.08.10.04.29.806302.203201659.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/cohort.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/cor_hf.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/cor_oblique.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/cor_rl.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0001.2019.02.07.14.42.45.461288.172175570.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0002.2019.02.07.14.42.45.461288.172174503.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0003.2019.02.07.14.42.45.461288.172175624.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0004.2019.02.07.14.42.45.461288.172174557.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0005.2019.02.07.14.42.45.461288.172175678.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0006.2019.02.07.14.42.45.461288.172174611.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0007.2019.02.07.14.42.45.461288.172175732.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0008.2019.02.07.14.42.45.461288.172174665.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0009.2019.02.07.14.42.45.461288.172175786.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0010.2019.02.07.14.42.45.461288.172174719.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0011.2019.02.07.14.42.45.461288.172175840.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0012.2019.02.07.14.42.45.461288.172174773.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0013.2019.02.07.14.42.45.461288.172175894.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0014.2019.02.07.14.42.45.461288.172174827.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0015.2019.02.07.14.42.45.461288.172175948.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0016.2019.02.07.14.42.45.461288.172174881.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0017.2019.02.07.14.42.45.461288.172176002.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0018.2019.02.07.14.42.45.461288.172174935.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0019.2019.02.07.14.42.45.461288.172176056.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0020.2019.02.07.14.42.45.461288.172174989.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0021.2019.02.07.14.42.45.461288.172176110.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0022.2019.02.07.14.42.45.461288.172175043.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0023.2019.02.07.14.42.45.461288.172176164.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0024.2019.02.07.14.42.45.461288.172175097.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0025.2019.02.07.14.42.45.461288.172176218.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0026.2019.02.07.14.42.45.461288.172175151.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0027.2019.02.07.14.42.45.461288.172176272.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0028.2019.02.07.14.42.45.461288.172175205.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0029.2019.02.07.14.42.45.461288.172176326.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0030.2019.02.07.14.42.45.461288.172175516.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0031.2019.02.07.14.42.45.461288.172175588.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0032.2019.02.07.14.42.45.461288.172174521.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0033.2019.02.07.14.42.45.461288.172175642.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0034.2019.02.07.14.42.45.461288.172174575.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0035.2019.02.07.14.42.45.461288.172175696.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0036.2019.02.07.14.42.45.461288.172174629.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0037.2019.02.07.14.42.45.461288.172175750.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0038.2019.02.07.14.42.45.461288.172174683.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0039.2019.02.07.14.42.45.461288.172175804.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0040.2019.02.07.14.42.45.461288.172174737.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0041.2019.02.07.14.42.45.461288.172175858.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0042.2019.02.07.14.42.45.461288.172174791.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0043.2019.02.07.14.42.45.461288.172175912.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0044.2019.02.07.14.42.45.461288.172174845.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0045.2019.02.07.14.42.45.461288.172175966.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0046.2019.02.07.14.42.45.461288.172174899.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0047.2019.02.07.14.42.45.461288.172176020.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0048.2019.02.07.14.42.45.461288.172174953.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0049.2019.02.07.14.42.45.461288.172176074.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0050.2019.02.07.14.42.45.461288.172175007.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0051.2019.02.07.14.42.45.461288.172176128.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0052.2019.02.07.14.42.45.461288.172175061.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0053.2019.02.07.14.42.45.461288.172176182.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0054.2019.02.07.14.42.45.461288.172175115.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0055.2019.02.07.14.42.45.461288.172176236.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0056.2019.02.07.14.42.45.461288.172175169.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0057.2019.02.07.14.42.45.461288.172176290.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0058.2019.02.07.14.42.45.461288.172175480.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0059.2019.02.07.14.42.45.461288.172176344.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0060.2019.02.07.14.42.45.461288.172175534.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0061.2019.02.07.14.42.45.461288.172175606.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0062.2019.02.07.14.42.45.461288.172174539.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0063.2019.02.07.14.42.45.461288.172175660.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0064.2019.02.07.14.42.45.461288.172174593.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0065.2019.02.07.14.42.45.461288.172175714.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0066.2019.02.07.14.42.45.461288.172174647.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0067.2019.02.07.14.42.45.461288.172175768.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0068.2019.02.07.14.42.45.461288.172174701.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0069.2019.02.07.14.42.45.461288.172175822.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0070.2019.02.07.14.42.45.461288.172174755.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0071.2019.02.07.14.42.45.461288.172175876.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0072.2019.02.07.14.42.45.461288.172174809.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0073.2019.02.07.14.42.45.461288.172175930.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0074.2019.02.07.14.42.45.461288.172174863.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0075.2019.02.07.14.42.45.461288.172175984.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0076.2019.02.07.14.42.45.461288.172174917.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0077.2019.02.07.14.42.45.461288.172176038.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0078.2019.02.07.14.42.45.461288.172174971.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0079.2019.02.07.14.42.45.461288.172176092.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0080.2019.02.07.14.42.45.461288.172175025.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0081.2019.02.07.14.42.45.461288.172176146.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0082.2019.02.07.14.42.45.461288.172175079.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0083.2019.02.07.14.42.45.461288.172176200.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0084.2019.02.07.14.42.45.461288.172175133.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0085.2019.02.07.14.42.45.461288.172176254.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0086.2019.02.07.14.42.45.461288.172175187.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0087.2019.02.07.14.42.45.461288.172176308.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0088.2019.02.07.14.42.45.461288.172175498.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0089.2019.02.07.14.42.45.461288.172176362.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0090.2019.02.07.14.42.45.461288.172175552.IMA +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/lena_color.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/sag_ap.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/sag_hf.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/sag_oblique.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/srdoc103.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time00/Image_00019.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time00/Image_00020.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time00/Image_00021.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time01/Image_00019.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time01/Image_00020.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time01/Image_00021.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time02/Image_00019.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time02/Image_00020.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time02/Image_00021.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00000.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00001.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00002.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00003.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00004.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00005.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00006.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00007.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00008.dcm +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/tra_oblique.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/tra_rl.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/itk/time/Image_00000.mha +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/itk/time/Image_00001.mha +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/itk/time/Image_00002.mha +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/itk/time.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/lena_color.gif +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/lena_color.jpg +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/mat/time/Image_00000.mat +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/mat/time.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/cor_hf.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/cor_oblique.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/cor_rl.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/sag_ap.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/sag_hf.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/sag_oblique.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time/time_all_fl3d_dynamic_20190207140517_14.json +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time/time_all_fl3d_dynamic_20190207140517_14.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time_all/time_all_fl3d_dynamic_20190207140517_14.json +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time_all/time_all_fl3d_dynamic_20190207140517_14.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time_all.zip +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/tra_oblique.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/tra_rl.nii.gz +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/A_Lovers_Complaint.pdf +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_1.pdf +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_2.pdf +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_3.pdf +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_4.pdf +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_5.pdf +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_6.pdf +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/text.txt +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/tree/file0 +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/tree/file1 +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/tree/file2 +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/vertices/vertices2d.pickle +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/vertices/vertices3d.pickle +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/vertices/vertices4d.pickle +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReference.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceApps.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceAppsDiffusion.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceArchives.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceCollections.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceFormats.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceImagedata.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceSeries.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceTransports.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceViewer.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Collections.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Colors.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/CommandLine.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/DICOMAttributes.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/DeveloperDocumentation.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Examples.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Figure_Architecture.png +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Input_output.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Installation.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Introduction.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Makefile +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Non_image_dicom_objects.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Notebook.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Options.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Plugin_Architecture.docx +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Plugin_Architecture.png +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Plugins.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/README +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Sorting.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Tutorial.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/UserGuide.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Viewing.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/conf.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/fuse_mask_blend.png +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/index.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/make.bat +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/requirements.txt +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/modules.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/setup.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.apps.Siemens.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.apps.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.archives.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.formats.dicomlib.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.formats.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.transports.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/tests.rst +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/transformation.tex +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/paper.bib +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/paper.md +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/pylintrc +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/pyproject.toml +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/setup.cfg +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/__init__.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/__init__.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/ROI.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/__init__.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/draw_antialiased.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/evidence_main.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/__init__.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/archives/__init__.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/archives/abstractarchive.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/archives/filesystemarchive.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/abstractplugin.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/dicomlib/__init__.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/dicomlib/uid.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/list_plugins.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/__init__.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/abstracttransport.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/dicomtransport.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/filetransport.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/dependency_links.txt +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/entry_points.txt +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/requires.txt +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/top_level.txt +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/techstack.md +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/techstack.yml +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/__init__.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/context.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_archive_file.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_archive_zip.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_axis.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_collections.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_dicom_zip.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_itk.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_itk_template.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_itk_zip.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_mat.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_mat_zip.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_nifti.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_nifti_zip.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_transport_dicomtransport.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_transport_xnattransport.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_version.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_viewer.py +0 -0
- {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tox.ini +0 -0
|
@@ -7,7 +7,50 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!--next-version-placeholder-->
|
|
9
9
|
|
|
10
|
-
## [v3.
|
|
10
|
+
## [v3.8.0-rc0] - 2025-03-25
|
|
11
|
+
* Implemented n-dimensional Series data, axes and tags.
|
|
12
|
+
|
|
13
|
+
## [v3.7.3-dev8] - 2025-03-07
|
|
14
|
+
* Corrected parsing windows UNC path names with leading double slash.
|
|
15
|
+
|
|
16
|
+
## [v3.7.3-dev7] - 2025-03-07
|
|
17
|
+
* ZipFileArchive: Windows: Do not complain when temporary local file cannot be removed.
|
|
18
|
+
* Improved some test suites to run better on Windows.
|
|
19
|
+
|
|
20
|
+
## [v3.7.3-rc0] - 2025-01-06
|
|
21
|
+
* Release candidate 3.7.3-rc0
|
|
22
|
+
|
|
23
|
+
## [v3.7.3-dev6] - 2024-12-13
|
|
24
|
+
* Series.__getitem__(): Accept tuple slicing specification, like ((2,),(2,),(2,)).
|
|
25
|
+
|
|
26
|
+
## [v3.7.3-dev5] - 2024-12-12
|
|
27
|
+
* Patient class: Limit the strict check of patient attributes to
|
|
28
|
+
patientName, patientID, patientBirthDate
|
|
29
|
+
and patientSex.
|
|
30
|
+
|
|
31
|
+
## [v3.7.3-dev4] - 2024-12-04
|
|
32
|
+
* evidence2roi: Do not raise exception for unknown roi type. Log a warning instead.
|
|
33
|
+
|
|
34
|
+
## [v3.7.3-dev3] - 2024-11-26
|
|
35
|
+
* Working on n-dimensional sorting.
|
|
36
|
+
* Added code to sort series on diffusion gradient direction (b-vector),
|
|
37
|
+
and specifically diffusion RSI data.
|
|
38
|
+
|
|
39
|
+
## [v3.7.3-dev2] - 2024-11-25
|
|
40
|
+
* diffusion.py: Added code to get diffusion b value from Siemens E11 format.
|
|
41
|
+
|
|
42
|
+
## [v3.7.3-dev1] - 2024-11-06
|
|
43
|
+
* Viewer.viewport_set(): Fixed error where the viewport did not include the last image.
|
|
44
|
+
|
|
45
|
+
## [v3.7.3-dev0] - 2024-11-04
|
|
46
|
+
* XnatTransport.open(): Corrected scan search to search for series description,
|
|
47
|
+
not series number.
|
|
48
|
+
|
|
49
|
+
## [v3.7.2] - 2024-10-28
|
|
50
|
+
* Fixed viewing in jupyter notebook using backend `widget`.
|
|
51
|
+
* Renamed collections.py to collection.py.
|
|
52
|
+
*
|
|
53
|
+
## [v3.7.2-dev2] - 2024-10-25
|
|
11
54
|
* Fixed viewing in jupyter notebook using backend `widget`.
|
|
12
55
|
|
|
13
56
|
## [v3.7.2-dev0] - 2024-10-10
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: imagedata
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.8.0rc0
|
|
4
4
|
Summary: Read/write medical image data
|
|
5
5
|
Author-email: Erling Andersen <Erling.Andersen@Helse-Bergen.NO>
|
|
6
6
|
Maintainer-email: Erling Andersen <Erling.Andersen@Helse-Bergen.NO>
|
|
@@ -63,6 +63,7 @@ Requires-Dist: pillow>=10.0.0
|
|
|
63
63
|
Requires-Dist: xnat
|
|
64
64
|
Requires-Dist: matplotlib>=3.8.0
|
|
65
65
|
Requires-Dist: opencv-python-headless
|
|
66
|
+
Dynamic: license-file
|
|
66
67
|
|
|
67
68
|
#########
|
|
68
69
|
imagedata
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.8.0-rc0
|
|
Binary file
|
|
Binary file
|
|
@@ -135,8 +135,28 @@ def evidence2roi(im, uid_table=None, content=None):
|
|
|
135
135
|
roi_name = finding[(0x0029, 0x1030)].value
|
|
136
136
|
except KeyError:
|
|
137
137
|
roi_name = 'NONAME'
|
|
138
|
+
if roi_type_value not in (
|
|
139
|
+
'PolygonApplication3D', 'FreehandApplication3D',
|
|
140
|
+
'MarkerApplication3D', 'EllipseApplication3D',
|
|
141
|
+
'StandaloneTextApplication3D', 'DistanceLineApplication3D'
|
|
142
|
+
):
|
|
143
|
+
# Attempt to find roi type in advanced presentation sequence (0029,1091)
|
|
144
|
+
try:
|
|
145
|
+
adv_pres_seq = finding[(0x0029, 0x1091)][0]
|
|
146
|
+
try:
|
|
147
|
+
roi_type_value = adv_pres_seq[(0x0029, 0x108e)].value.decode()
|
|
148
|
+
roi_name = finding[(0x0029, 0x1032)].value.decode()
|
|
149
|
+
except AttributeError:
|
|
150
|
+
roi_type_value = adv_pres_seq[(0x0029, 0x108e)].value
|
|
151
|
+
roi_name = finding[(0x0029, 0x1032)].value
|
|
152
|
+
except KeyError:
|
|
153
|
+
pass
|
|
138
154
|
logger.info("Finding: {} {} {}".format(content['creator'], roi_name, roi_type_value))
|
|
139
|
-
if roi_type_value
|
|
155
|
+
if roi_type_value in ('PolygonApplication3D', 'FreehandApplication3D', 'ROI2D'):
|
|
156
|
+
polygon = _get_measurement_points(finding[(0x0029, 0x1096)], zyx=True)
|
|
157
|
+
rois.append(PolygonROI(polygon, roi_name, stu_ins_uid, ser_ins_uid, sop_ins_uid))
|
|
158
|
+
logger.debug('ROI {}: {} points'.format(meas_appl_number, len(polygon) // 3))
|
|
159
|
+
elif roi_type_value == 'ROI2D':
|
|
140
160
|
polygon = _get_measurement_points(finding[(0x0029, 0x1096)], zyx=True)
|
|
141
161
|
rois.append(PolygonROI(polygon, roi_name, stu_ins_uid, ser_ins_uid, sop_ins_uid))
|
|
142
162
|
logger.debug('ROI {}: {} points'.format(meas_appl_number, len(polygon) // 3))
|
|
@@ -159,7 +179,9 @@ def evidence2roi(im, uid_table=None, content=None):
|
|
|
159
179
|
logger.warning("DistanceLineApplication3D ROI not implemented.")
|
|
160
180
|
pass
|
|
161
181
|
else:
|
|
162
|
-
|
|
163
|
-
|
|
182
|
+
logging.warning(
|
|
183
|
+
"ROI type {} ({}) not implemented.".format(
|
|
184
|
+
roi_type_value, type(roi_type_value))
|
|
185
|
+
)
|
|
164
186
|
|
|
165
187
|
return rois, content
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"""Extract diffusion MRI parameters.
|
|
2
|
+
"""
|
|
3
|
+
# Copyright (c) 2013-2024 Erling Andersen, Haukeland University Hospital, Bergen, Norway
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import struct
|
|
7
|
+
import warnings
|
|
8
|
+
import pandas as pd
|
|
9
|
+
from pydicom import Dataset
|
|
10
|
+
from typing import SupportsFloat
|
|
11
|
+
from ..series import Series
|
|
12
|
+
from ..formats import NotImageError, CannotSort
|
|
13
|
+
|
|
14
|
+
Number = type[SupportsFloat]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_g_vectors(img):
|
|
18
|
+
"""Get diffusion gradient vectors
|
|
19
|
+
|
|
20
|
+
Extracting diffusion gradient vectors has been tested on MRI data from some major vendors.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
img (imagedata.Series): Series object.
|
|
24
|
+
Returns:
|
|
25
|
+
pd.DataFrame: Diffusion gradient vectors, columns b, z, y, x.
|
|
26
|
+
Raises:
|
|
27
|
+
IndexError: when no gradient vector is present in dataset.
|
|
28
|
+
Examples:
|
|
29
|
+
>>> from imagedata import Series
|
|
30
|
+
>>> from imagedata.apps.diffusion import get_g_vectors
|
|
31
|
+
>>> im = Series('data', 'b', opts={'accept_duplicate_tag': 'True'})
|
|
32
|
+
>>> g = get_g_vectors(im)
|
|
33
|
+
>>> print(g)
|
|
34
|
+
b z y x
|
|
35
|
+
0 0 NaN NaN NaN
|
|
36
|
+
1 500 -0.706399 0.000000 0.707814
|
|
37
|
+
2 500 -0.706399 0.000000 -0.707814
|
|
38
|
+
3 500 -0.706399 -0.707814 0.000000
|
|
39
|
+
4 500 0.707814 -0.706399 0.000000
|
|
40
|
+
5 500 0.000000 -0.707107 0.707107
|
|
41
|
+
6 500 0.000000 -0.707107 -0.707107
|
|
42
|
+
7 1000 -0.706752 0.000000 0.707461
|
|
43
|
+
8 1000 -0.706752 0.000000 -0.707461
|
|
44
|
+
9 1000 -0.706753 -0.707460 0.000000
|
|
45
|
+
10 1000 0.707460 -0.706754 0.000000
|
|
46
|
+
11 1000 0.001414 -0.707106 0.707106
|
|
47
|
+
12 1000 0.001414 -0.707106 -0.707106
|
|
48
|
+
13 2500 -0.706824 0.000000 0.707390
|
|
49
|
+
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def get_DICOM_g_vector(ds):
|
|
53
|
+
# Attempt to address standard DICOM attributes
|
|
54
|
+
return ds['DiffusionGradientOrientation'].value
|
|
55
|
+
|
|
56
|
+
def get_Siemens_g_vector(ds):
|
|
57
|
+
block = ds.private_block(0x0019, 'SIEMENS MR HEADER')
|
|
58
|
+
return block[0x0e].value
|
|
59
|
+
|
|
60
|
+
def get_GEMS_g_vector(ds):
|
|
61
|
+
block = ds.private_block(0x0019, 'GEMS_ACQU_01')
|
|
62
|
+
return [block[0xbb].value, block[0xbc].value, block[0xbd].value]
|
|
63
|
+
|
|
64
|
+
_v = []
|
|
65
|
+
# Extract pydicom dataset for first slice and each tag
|
|
66
|
+
_dwi_weighted = False
|
|
67
|
+
for tag in range(img.shape[0]):
|
|
68
|
+
_b = get_b_value(img, tag)
|
|
69
|
+
_dwi_weighted = _dwi_weighted or not np.isnan(_b)
|
|
70
|
+
_G = [np.nan, np.nan, np.nan]
|
|
71
|
+
_ds: Dataset = img.dicomTemplate
|
|
72
|
+
|
|
73
|
+
for _method in [get_DICOM_g_vector, get_Siemens_g_vector, get_GEMS_g_vector]:
|
|
74
|
+
try:
|
|
75
|
+
_G = _method(_ds)
|
|
76
|
+
break
|
|
77
|
+
except KeyError:
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
_v.append({'b': _b, 'z': _G[2], 'y': _G[1], 'x': _G[0]})
|
|
81
|
+
if _dwi_weighted:
|
|
82
|
+
return pd.DataFrame(_v)
|
|
83
|
+
else:
|
|
84
|
+
raise IndexError('No b values found in dataset')
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def get_b_value(img: Series) -> float:
|
|
88
|
+
"""Get diffusion b value
|
|
89
|
+
|
|
90
|
+
Extracting diffusion b value has been tested on MRI data from some major vendors.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
img (imagedata.Series): Series object.
|
|
94
|
+
Returns:
|
|
95
|
+
float: b value. Returns NaN when no b value is present in dataset.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
# Extract pydicom dataset for given slice and tag
|
|
99
|
+
_ds: Dataset = img.dicomTemplate
|
|
100
|
+
|
|
101
|
+
return get_ds_b_value(_ds)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def get_ds_b_vectors(ds: Dataset) -> np.ndarray:
|
|
105
|
+
"""Get diffusion b vector from Dataset
|
|
106
|
+
|
|
107
|
+
Getting diffusion b vector has been tested on MRI data from some major vendors.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
ds: Input dataset
|
|
111
|
+
Returns:
|
|
112
|
+
b vector
|
|
113
|
+
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
def get_DICOM_b_vector(_ds):
|
|
117
|
+
# Attempt to address standard DICOM attribute
|
|
118
|
+
raise NotImplementedError('get_DICOM_b_vector not implemented')
|
|
119
|
+
return _ds['DiffusionBValue'].value
|
|
120
|
+
|
|
121
|
+
def get_Siemens_b_vector(_ds):
|
|
122
|
+
raise NotImplementedError('get_Siemens_b_vector not implemented')
|
|
123
|
+
block = _ds.private_block(0x0019, 'SIEMENS MR HEADER')
|
|
124
|
+
return block[0x0c].value
|
|
125
|
+
|
|
126
|
+
def get_Siemens_CSA_b_vector(_ds):
|
|
127
|
+
with warnings.catch_warnings():
|
|
128
|
+
warnings.simplefilter("ignore", category=UserWarning)
|
|
129
|
+
import nibabel.nicom.csareader as csa
|
|
130
|
+
try:
|
|
131
|
+
csa_head = csa.get_csa_header(_ds)
|
|
132
|
+
except csa.CSAReadError:
|
|
133
|
+
raise CannotSort("Unable to extract b value from header.")
|
|
134
|
+
if 'tags' in csa_head and 'DiffusionGradientDirection' in csa_head['tags']:
|
|
135
|
+
bvec = csa_head['tags']['DiffusionGradientDirection']['items']
|
|
136
|
+
return np.array(bvec)
|
|
137
|
+
raise CannotSort("Unable to extract b value from header.")
|
|
138
|
+
|
|
139
|
+
def get_Siemens_E11_b_vector(_ds):
|
|
140
|
+
try:
|
|
141
|
+
block = _ds.private_block(0x0029, 'SIEMENS CSA HEADER')
|
|
142
|
+
im_info = block[0x10].value
|
|
143
|
+
# se_info = block[0x20].value
|
|
144
|
+
if im_info[:4] == b'SV10':
|
|
145
|
+
_h = _get_CSA2_header(im_info)
|
|
146
|
+
else:
|
|
147
|
+
_h = _get_CSA1_header(im_info)
|
|
148
|
+
return np.array(_h['DiffusionGradientDirection'])
|
|
149
|
+
except Exception:
|
|
150
|
+
raise IndexError('Cannot get b vector')
|
|
151
|
+
|
|
152
|
+
def get_GEMS_b_vector(_ds):
|
|
153
|
+
raise NotImplementedError('get_GEMS_b_vector not implemented')
|
|
154
|
+
block = _ds.private_block(0x0043, 'GEMS_PARM_01')
|
|
155
|
+
return block[0x39].value
|
|
156
|
+
|
|
157
|
+
errmsg = ""
|
|
158
|
+
for _method in [get_DICOM_b_vector,
|
|
159
|
+
get_Siemens_b_vector, get_Siemens_CSA_b_vector,
|
|
160
|
+
get_Siemens_E11_b_vector,
|
|
161
|
+
get_GEMS_b_vector]:
|
|
162
|
+
try:
|
|
163
|
+
return _method(ds)
|
|
164
|
+
except (KeyError, IndexError) as e:
|
|
165
|
+
errmsg = '{}'.format(e)
|
|
166
|
+
pass
|
|
167
|
+
except NotImplementedError:
|
|
168
|
+
pass
|
|
169
|
+
raise IndexError('Cannot get b vector: {}'.format(errmsg))
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def get_ds_b_value(ds: Dataset) -> float:
|
|
173
|
+
"""Get diffusion b value from Dataset
|
|
174
|
+
|
|
175
|
+
Setting diffusion b value has been tested on MRI data from some major vendors.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
ds: Input dataset
|
|
179
|
+
Returns:
|
|
180
|
+
b value
|
|
181
|
+
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
def get_DICOM_b_value(_ds):
|
|
185
|
+
# Attempt to address standard DICOM attribute
|
|
186
|
+
return _ds['DiffusionBValue'].value
|
|
187
|
+
|
|
188
|
+
def get_Siemens_b_value(_ds):
|
|
189
|
+
block = _ds.private_block(0x0019, 'SIEMENS MR HEADER')
|
|
190
|
+
return block[0x0c].value
|
|
191
|
+
|
|
192
|
+
def get_Siemens_CSA_b_value(_ds):
|
|
193
|
+
with warnings.catch_warnings():
|
|
194
|
+
warnings.simplefilter("ignore", category=UserWarning)
|
|
195
|
+
import nibabel.nicom.csareader as csa
|
|
196
|
+
try:
|
|
197
|
+
csa_head = csa.get_csa_header(_ds)
|
|
198
|
+
except csa.CSAReadError:
|
|
199
|
+
raise CannotSort("Unable to extract b value from header.")
|
|
200
|
+
if csa_head is None:
|
|
201
|
+
raise CannotSort("Unable to extract b value from header.")
|
|
202
|
+
try:
|
|
203
|
+
value = csa.get_b_value(csa_head)
|
|
204
|
+
except TypeError:
|
|
205
|
+
raise CannotSort("Unable to extract b value from header.")
|
|
206
|
+
return value
|
|
207
|
+
|
|
208
|
+
def get_Siemens_E11_b_value(_ds):
|
|
209
|
+
try:
|
|
210
|
+
block = _ds.private_block(0x0029, 'SIEMENS CSA HEADER')
|
|
211
|
+
im_info = block[0x10].value
|
|
212
|
+
# se_info = block[0x20].value
|
|
213
|
+
if im_info[:4] == b'SV10':
|
|
214
|
+
_h = _get_CSA2_header(im_info)
|
|
215
|
+
else:
|
|
216
|
+
_h = _get_CSA1_header(im_info)
|
|
217
|
+
return float(_h['B_value'][0])
|
|
218
|
+
except Exception:
|
|
219
|
+
raise IndexError('Cannot get b value')
|
|
220
|
+
|
|
221
|
+
def get_GEMS_b_value(_ds):
|
|
222
|
+
block = _ds.private_block(0x0043, 'GEMS_PARM_01')
|
|
223
|
+
return block[0x39].value
|
|
224
|
+
|
|
225
|
+
errmsg = ""
|
|
226
|
+
for _method in [get_DICOM_b_value,
|
|
227
|
+
get_Siemens_b_value, get_Siemens_CSA_b_value,
|
|
228
|
+
get_Siemens_E11_b_value,
|
|
229
|
+
get_GEMS_b_value]:
|
|
230
|
+
try:
|
|
231
|
+
return float(_method(ds))
|
|
232
|
+
except (KeyError, IndexError) as e:
|
|
233
|
+
errmsg = '{}'.format(e)
|
|
234
|
+
pass
|
|
235
|
+
raise IndexError('Cannot get b value: {}'.format(errmsg))
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def set_ds_b_value(ds: Dataset, value: Number):
|
|
239
|
+
"""Set diffusion b value
|
|
240
|
+
|
|
241
|
+
Setting diffusion b value has been tested on MRI data from some major vendors.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
ds (pydicom.Dataset): Dataset
|
|
245
|
+
value: b value
|
|
246
|
+
"""
|
|
247
|
+
|
|
248
|
+
def set_DICOM_b_value(_ds, _value):
|
|
249
|
+
# Attempt to address standard DICOM attribute
|
|
250
|
+
_ds.DiffusionBValue = _value
|
|
251
|
+
|
|
252
|
+
def set_Siemens_b_value(_ds, _value):
|
|
253
|
+
block = _ds.private_block(0x0019, 'SIEMENS MR HEADER')
|
|
254
|
+
block[0x0c].value = _value
|
|
255
|
+
|
|
256
|
+
def set_GEMS_b_value(_ds, _value):
|
|
257
|
+
block = _ds.private_block(0x0043, 'GEMS_PARM_01')
|
|
258
|
+
block[0x39].value = _value
|
|
259
|
+
|
|
260
|
+
for _method in [set_DICOM_b_value, set_Siemens_b_value, set_GEMS_b_value]:
|
|
261
|
+
try:
|
|
262
|
+
_method(ds, value)
|
|
263
|
+
return
|
|
264
|
+
except (KeyError, IndexError):
|
|
265
|
+
pass
|
|
266
|
+
raise IndexError('Cannot set b value')
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def _get_CSA1_header(data):
|
|
270
|
+
values = {}
|
|
271
|
+
try:
|
|
272
|
+
(n_tags, unused2) = struct.unpack('<ii', data[:8])
|
|
273
|
+
except struct.error as e:
|
|
274
|
+
raise NotImageError('{}'.format(e))
|
|
275
|
+
except Exception as e:
|
|
276
|
+
# logging.debug('{}: exception\n{}'.format(_name, e))
|
|
277
|
+
raise NotImageError('{}'.format(e))
|
|
278
|
+
pos = 8
|
|
279
|
+
for t in range(n_tags):
|
|
280
|
+
try:
|
|
281
|
+
(name, vm, vr, syngodt, nitems, xx
|
|
282
|
+
) = struct.unpack('<64si4s3i', data[pos:pos+84])
|
|
283
|
+
pos += 84
|
|
284
|
+
i = name.find(b'\0')
|
|
285
|
+
name = name[:i]
|
|
286
|
+
name = name.decode("utf-8")
|
|
287
|
+
values[name] = []
|
|
288
|
+
for _item in range(nitems):
|
|
289
|
+
(item_len, xx1, xx2, xx3
|
|
290
|
+
) = struct.unpack('<4i', data[pos:pos+16])
|
|
291
|
+
pos += 16
|
|
292
|
+
if item_len > 0:
|
|
293
|
+
value = data[pos:pos+item_len]
|
|
294
|
+
value = value.decode("utf-8").split('\0')[0].strip()
|
|
295
|
+
pos += (item_len // 4) * 4
|
|
296
|
+
if item_len % 4 > 0:
|
|
297
|
+
pos += 4
|
|
298
|
+
values[name].append(value)
|
|
299
|
+
except struct.error as e:
|
|
300
|
+
raise NotImageError('{}'.format(e))
|
|
301
|
+
except Exception as e:
|
|
302
|
+
raise
|
|
303
|
+
return values
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _get_CSA2_header(data):
|
|
307
|
+
values = {}
|
|
308
|
+
try:
|
|
309
|
+
(hdr_id, unused1,
|
|
310
|
+
n_tags, unused2) = struct.unpack('<4siii', data[:16])
|
|
311
|
+
except struct.error as e:
|
|
312
|
+
raise NotImageError('{}'.format(e))
|
|
313
|
+
except Exception as e:
|
|
314
|
+
# logging.debug('{}: exception\n{}'.format(_name, e))
|
|
315
|
+
raise NotImageError('{}'.format(e))
|
|
316
|
+
pos = 16
|
|
317
|
+
for t in range(n_tags):
|
|
318
|
+
try:
|
|
319
|
+
(name, vm, vr, syngodt, nitems, xx
|
|
320
|
+
) = struct.unpack('<64si4s3i', data[pos:pos+84])
|
|
321
|
+
pos += 84
|
|
322
|
+
i = name.find(b'\0')
|
|
323
|
+
name = name[:i]
|
|
324
|
+
name = name.decode("utf-8")
|
|
325
|
+
values[name] = []
|
|
326
|
+
for _item in range(nitems):
|
|
327
|
+
(item_len, xx1, xx2, xx3
|
|
328
|
+
) = struct.unpack('<4i', data[pos:pos+16])
|
|
329
|
+
pos += 16
|
|
330
|
+
if item_len > 0:
|
|
331
|
+
value = data[pos:pos+item_len]
|
|
332
|
+
value = value.decode("utf-8").split('\0')[0].strip()
|
|
333
|
+
pos += (item_len // 4) * 4
|
|
334
|
+
if item_len % 4 > 0:
|
|
335
|
+
pos += 4
|
|
336
|
+
values[name].append(value)
|
|
337
|
+
except struct.error as e:
|
|
338
|
+
raise NotImageError('{}'.format(e))
|
|
339
|
+
except Exception as e:
|
|
340
|
+
raise
|
|
341
|
+
return values
|
|
@@ -64,7 +64,10 @@ class WriteFileIO(io.FileIO):
|
|
|
64
64
|
ret = super(WriteFileIO, self).close()
|
|
65
65
|
if isinstance(self.__local_file, str):
|
|
66
66
|
self.__archive.write(self.__local_file, self.__filename)
|
|
67
|
-
|
|
67
|
+
try:
|
|
68
|
+
os.remove(self.__local_file)
|
|
69
|
+
except PermissionError:
|
|
70
|
+
pass
|
|
68
71
|
else:
|
|
69
72
|
self.__local_file.close()
|
|
70
73
|
logger.debug("{}: zip {} as {}".format(
|
|
@@ -74,7 +77,10 @@ class WriteFileIO(io.FileIO):
|
|
|
74
77
|
logger.debug("{}: remove {}".format(
|
|
75
78
|
_name, self.__local_file.name)
|
|
76
79
|
)
|
|
77
|
-
|
|
80
|
+
try:
|
|
81
|
+
os.remove(self.__local_file.name)
|
|
82
|
+
except PermissionError:
|
|
83
|
+
pass
|
|
78
84
|
return ret
|
|
79
85
|
|
|
80
86
|
def __enter__(self):
|
|
@@ -279,7 +279,11 @@ class VariableAxis(Axis):
|
|
|
279
279
|
"""Return a copy of the axis, where the length n can be different."""
|
|
280
280
|
name = self.name if name is None else name
|
|
281
281
|
n = len(self._values) if n is None else n
|
|
282
|
-
|
|
282
|
+
_values = self._values.tolist()
|
|
283
|
+
while len(_values) < n:
|
|
284
|
+
delta = _values[-1] - _values[-2] if len(_values) >= 2 else 1
|
|
285
|
+
_values.append(_values[-1] + delta)
|
|
286
|
+
return VariableAxis(name, _values[:n])
|
|
283
287
|
|
|
284
288
|
@overload
|
|
285
289
|
def __getitem__(self, index: int) -> Number:
|
|
@@ -8,7 +8,7 @@ import ast
|
|
|
8
8
|
import copy
|
|
9
9
|
import logging
|
|
10
10
|
from . import __version__
|
|
11
|
-
from .formats import str_to_sort_on,
|
|
11
|
+
from .formats import str_to_sort_on, str_to_dtype
|
|
12
12
|
from .formats import SORT_ON_SLICE
|
|
13
13
|
from .formats import INPUT_ORDER_AUTO
|
|
14
14
|
|
|
@@ -80,7 +80,7 @@ class InputOrderAction(argparse.Action):
|
|
|
80
80
|
|
|
81
81
|
def __call__(self, _parser, namespace, values, option_string=None):
|
|
82
82
|
# print('%r %r %r' % (namespace, values, option_string))
|
|
83
|
-
input_order =
|
|
83
|
+
input_order = values
|
|
84
84
|
setattr(namespace, self.dest, input_order)
|
|
85
85
|
|
|
86
86
|
|
|
@@ -425,6 +425,8 @@ class Patient(IndexedDict):
|
|
|
425
425
|
'patientIdentityRemoved', 'deidentificationMethod'
|
|
426
426
|
]
|
|
427
427
|
|
|
428
|
+
_strict_attributes = ['patientName', 'patientID', 'patientBirthDate', 'patientSex']
|
|
429
|
+
|
|
428
430
|
def __init__(self, data, opts=None, **kwargs):
|
|
429
431
|
|
|
430
432
|
super(Patient, self).__init__()
|
|
@@ -478,6 +480,7 @@ class Patient(IndexedDict):
|
|
|
478
480
|
if getattr(self, _attr, None) is None:
|
|
479
481
|
setattr(self, _attr, _value)
|
|
480
482
|
elif _strict_values and \
|
|
483
|
+
_attr in self._strict_attributes and \
|
|
481
484
|
getattr(self, _attr, None) != _value:
|
|
482
485
|
# Patient attributes differ, should be considered an exception.
|
|
483
486
|
raise ValueError('Patient attribute "{}" differ ("{}" vs. "{}")'.format(
|
|
@@ -20,10 +20,13 @@ INPUT_ORDER_AUTO = 'auto'
|
|
|
20
20
|
INPUT_ORDER_NONE = 'none'
|
|
21
21
|
INPUT_ORDER_TIME = 'time'
|
|
22
22
|
INPUT_ORDER_B = 'b'
|
|
23
|
+
INPUT_ORDER_BVECTOR = 'bvector'
|
|
24
|
+
INPUT_ORDER_RSI = 'rsi'
|
|
23
25
|
INPUT_ORDER_FA = 'fa'
|
|
24
26
|
INPUT_ORDER_TE = 'te'
|
|
25
27
|
INPUT_ORDER_FAULTY = 'faulty'
|
|
26
|
-
input_order_set = {INPUT_ORDER_NONE, INPUT_ORDER_TIME, INPUT_ORDER_B,
|
|
28
|
+
input_order_set = {INPUT_ORDER_NONE, INPUT_ORDER_TIME, INPUT_ORDER_B, INPUT_ORDER_BVECTOR,
|
|
29
|
+
INPUT_ORDER_RSI, INPUT_ORDER_FA,
|
|
27
30
|
INPUT_ORDER_TE, INPUT_ORDER_FAULTY}
|
|
28
31
|
|
|
29
32
|
|
|
@@ -104,63 +107,6 @@ def str_to_dtype(s):
|
|
|
104
107
|
raise (ValueError("Output data type {} not implemented.".format(s)))
|
|
105
108
|
|
|
106
109
|
|
|
107
|
-
def input_order_to_str(input_order):
|
|
108
|
-
if input_order == INPUT_ORDER_NONE:
|
|
109
|
-
return "INPUT_ORDER_NONE"
|
|
110
|
-
elif input_order == INPUT_ORDER_TIME:
|
|
111
|
-
return "INPUT_ORDER_TIME"
|
|
112
|
-
elif input_order == INPUT_ORDER_B:
|
|
113
|
-
return "INPUT_ORDER_B"
|
|
114
|
-
elif input_order == INPUT_ORDER_FA:
|
|
115
|
-
return "INPUT_ORDER_FA"
|
|
116
|
-
elif input_order == INPUT_ORDER_TE:
|
|
117
|
-
return "INPUT_ORDER_TE"
|
|
118
|
-
elif input_order == INPUT_ORDER_FAULTY:
|
|
119
|
-
return "INPUT_ORDER_FAULTY"
|
|
120
|
-
elif issubclass(type(input_order), str):
|
|
121
|
-
return input_order
|
|
122
|
-
else:
|
|
123
|
-
raise (UnknownTag("Unknown numerical input_order {:d}.".format(input_order)))
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def input_order_to_dirname_str(input_order):
|
|
127
|
-
if input_order == INPUT_ORDER_NONE:
|
|
128
|
-
return "none"
|
|
129
|
-
elif input_order == INPUT_ORDER_TIME:
|
|
130
|
-
return "time"
|
|
131
|
-
elif input_order == INPUT_ORDER_B:
|
|
132
|
-
return "b"
|
|
133
|
-
elif input_order == INPUT_ORDER_FA:
|
|
134
|
-
return "fa"
|
|
135
|
-
elif input_order == INPUT_ORDER_TE:
|
|
136
|
-
return "te"
|
|
137
|
-
elif input_order == INPUT_ORDER_FAULTY:
|
|
138
|
-
return "faulty"
|
|
139
|
-
elif issubclass(type(input_order), str):
|
|
140
|
-
keepcharacters = ('-', '_', '.', ' ')
|
|
141
|
-
return ''.join([c for c in input_order if c.isalnum() or c in keepcharacters]).rstrip()
|
|
142
|
-
else:
|
|
143
|
-
raise (UnknownTag("Unknown numerical input_order {:d}.".format(input_order)))
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
def str_to_input_order(s):
|
|
147
|
-
if s == "none":
|
|
148
|
-
return INPUT_ORDER_NONE
|
|
149
|
-
elif s == "time":
|
|
150
|
-
return INPUT_ORDER_TIME
|
|
151
|
-
elif s == "b":
|
|
152
|
-
return INPUT_ORDER_B
|
|
153
|
-
elif s == "fa":
|
|
154
|
-
return INPUT_ORDER_FA
|
|
155
|
-
elif s == "te":
|
|
156
|
-
return INPUT_ORDER_TE
|
|
157
|
-
elif s == "faulty":
|
|
158
|
-
return INPUT_ORDER_FAULTY
|
|
159
|
-
else:
|
|
160
|
-
# raise (UnknownTag("Unknown input order {}.".format(s)))
|
|
161
|
-
return s
|
|
162
|
-
|
|
163
|
-
|
|
164
110
|
def shape_to_str(shape):
|
|
165
111
|
"""Convert numpy image shape to printable string
|
|
166
112
|
|