imagedata 3.8.14__tar.gz → 3.9.0.dev3__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.
Files changed (307) hide show
  1. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/CHANGELOG.md +54 -0
  2. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/LICENSE.txt +1 -1
  3. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/PKG-INFO +3 -2
  4. imagedata-3.9.0.dev3/VERSION.txt +1 -0
  5. imagedata-3.9.0.dev3/data/nifti/ep2d_RSI_b0_500_1500_6dir_20241202111754_3.nii.gz +0 -0
  6. imagedata-3.9.0.dev3/docs/Anonymization.rst +16 -0
  7. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Sorting.rst +22 -1
  8. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/UserGuide.rst +1 -0
  9. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/conf.py +1 -1
  10. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/pyproject.toml +1 -0
  11. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/__init__.py +9 -9
  12. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/archives/__init__.py +3 -18
  13. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/axis.py +5 -1
  14. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/collection.py +85 -4
  15. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/__init__.py +3 -1
  16. imagedata-3.9.0.dev3/src/imagedata/formats/dicomlib/__init__.py +17 -0
  17. imagedata-3.9.0.dev3/src/imagedata/formats/dicomlib/datatypes.py +269 -0
  18. imagedata-3.9.0.dev3/src/imagedata/formats/dicomlib/instance.py +352 -0
  19. imagedata-3.9.0.dev3/src/imagedata/formats/dicomlib/sorting.py +443 -0
  20. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/dicomplugin.py +348 -1139
  21. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/matplugin.py +1 -1
  22. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/header.py +43 -1
  23. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/image_data.py +20 -1
  24. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/readdata.py +40 -25
  25. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/series.py +49 -18
  26. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/__init__.py +10 -2
  27. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/filetransport.py +0 -3
  28. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/viewer.py +17 -4
  29. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/PKG-INFO +3 -2
  30. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/SOURCES.txt +5 -0
  31. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/requires.txt +1 -0
  32. {imagedata-3.8.14/src/imagedata/formats/dicomlib → imagedata-3.9.0.dev3/tests}/__init__.py +0 -0
  33. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_collections.py +43 -0
  34. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_dicom.py +99 -34
  35. imagedata-3.9.0.dev3/tests/test_formats_dicom_duplicate.py +156 -0
  36. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_series.py +39 -9
  37. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_series_ufunc.py +10 -0
  38. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tox.ini +2 -2
  39. imagedata-3.8.14/VERSION.txt +0 -1
  40. imagedata-3.8.14/src/imagedata/formats/dicomlib/instance.py +0 -27
  41. imagedata-3.8.14/tests/__init__.py +0 -0
  42. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/.readthedocs.yaml +0 -0
  43. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/.travis.yml +0 -0
  44. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/CONTRIBUTING.rst +0 -0
  45. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/MANIFEST.in +0 -0
  46. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/Makefile +0 -0
  47. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/README.rst +0 -0
  48. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/5D.zip +0 -0
  49. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/6D_TE_TIME_FA.zip +0 -0
  50. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/RSI_6D.zip +0 -0
  51. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0021.0001.2021.06.08.10.04.29.806302.203193459.IMA +0 -0
  52. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0022.0001.2021.06.08.10.04.29.806302.203195509.IMA +0 -0
  53. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0023.0001.2021.06.08.10.04.29.806302.203197559.IMA +0 -0
  54. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0024.0001.2021.06.08.10.04.29.806302.203199609.IMA +0 -0
  55. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0025.0001.2021.06.08.10.04.29.806302.203201659.IMA +0 -0
  56. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/cohort.zip +0 -0
  57. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/cor_hf.zip +0 -0
  58. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/cor_oblique.zip +0 -0
  59. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/cor_rl.zip +0 -0
  60. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0001.2019.02.07.14.42.45.461288.172175570.IMA +0 -0
  61. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0002.2019.02.07.14.42.45.461288.172174503.IMA +0 -0
  62. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0003.2019.02.07.14.42.45.461288.172175624.IMA +0 -0
  63. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0004.2019.02.07.14.42.45.461288.172174557.IMA +0 -0
  64. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0005.2019.02.07.14.42.45.461288.172175678.IMA +0 -0
  65. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0006.2019.02.07.14.42.45.461288.172174611.IMA +0 -0
  66. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0007.2019.02.07.14.42.45.461288.172175732.IMA +0 -0
  67. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0008.2019.02.07.14.42.45.461288.172174665.IMA +0 -0
  68. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0009.2019.02.07.14.42.45.461288.172175786.IMA +0 -0
  69. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0010.2019.02.07.14.42.45.461288.172174719.IMA +0 -0
  70. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0011.2019.02.07.14.42.45.461288.172175840.IMA +0 -0
  71. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0012.2019.02.07.14.42.45.461288.172174773.IMA +0 -0
  72. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0013.2019.02.07.14.42.45.461288.172175894.IMA +0 -0
  73. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0014.2019.02.07.14.42.45.461288.172174827.IMA +0 -0
  74. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0015.2019.02.07.14.42.45.461288.172175948.IMA +0 -0
  75. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0016.2019.02.07.14.42.45.461288.172174881.IMA +0 -0
  76. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0017.2019.02.07.14.42.45.461288.172176002.IMA +0 -0
  77. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0018.2019.02.07.14.42.45.461288.172174935.IMA +0 -0
  78. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0019.2019.02.07.14.42.45.461288.172176056.IMA +0 -0
  79. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0020.2019.02.07.14.42.45.461288.172174989.IMA +0 -0
  80. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0021.2019.02.07.14.42.45.461288.172176110.IMA +0 -0
  81. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0022.2019.02.07.14.42.45.461288.172175043.IMA +0 -0
  82. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0023.2019.02.07.14.42.45.461288.172176164.IMA +0 -0
  83. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0024.2019.02.07.14.42.45.461288.172175097.IMA +0 -0
  84. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0025.2019.02.07.14.42.45.461288.172176218.IMA +0 -0
  85. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0026.2019.02.07.14.42.45.461288.172175151.IMA +0 -0
  86. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0027.2019.02.07.14.42.45.461288.172176272.IMA +0 -0
  87. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0028.2019.02.07.14.42.45.461288.172175205.IMA +0 -0
  88. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0029.2019.02.07.14.42.45.461288.172176326.IMA +0 -0
  89. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0030.2019.02.07.14.42.45.461288.172175516.IMA +0 -0
  90. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0031.2019.02.07.14.42.45.461288.172175588.IMA +0 -0
  91. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0032.2019.02.07.14.42.45.461288.172174521.IMA +0 -0
  92. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0033.2019.02.07.14.42.45.461288.172175642.IMA +0 -0
  93. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0034.2019.02.07.14.42.45.461288.172174575.IMA +0 -0
  94. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0035.2019.02.07.14.42.45.461288.172175696.IMA +0 -0
  95. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0036.2019.02.07.14.42.45.461288.172174629.IMA +0 -0
  96. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0037.2019.02.07.14.42.45.461288.172175750.IMA +0 -0
  97. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0038.2019.02.07.14.42.45.461288.172174683.IMA +0 -0
  98. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0039.2019.02.07.14.42.45.461288.172175804.IMA +0 -0
  99. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0040.2019.02.07.14.42.45.461288.172174737.IMA +0 -0
  100. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0041.2019.02.07.14.42.45.461288.172175858.IMA +0 -0
  101. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0042.2019.02.07.14.42.45.461288.172174791.IMA +0 -0
  102. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0043.2019.02.07.14.42.45.461288.172175912.IMA +0 -0
  103. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0044.2019.02.07.14.42.45.461288.172174845.IMA +0 -0
  104. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0045.2019.02.07.14.42.45.461288.172175966.IMA +0 -0
  105. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0046.2019.02.07.14.42.45.461288.172174899.IMA +0 -0
  106. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0047.2019.02.07.14.42.45.461288.172176020.IMA +0 -0
  107. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0048.2019.02.07.14.42.45.461288.172174953.IMA +0 -0
  108. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0049.2019.02.07.14.42.45.461288.172176074.IMA +0 -0
  109. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0050.2019.02.07.14.42.45.461288.172175007.IMA +0 -0
  110. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0051.2019.02.07.14.42.45.461288.172176128.IMA +0 -0
  111. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0052.2019.02.07.14.42.45.461288.172175061.IMA +0 -0
  112. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0053.2019.02.07.14.42.45.461288.172176182.IMA +0 -0
  113. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0054.2019.02.07.14.42.45.461288.172175115.IMA +0 -0
  114. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0055.2019.02.07.14.42.45.461288.172176236.IMA +0 -0
  115. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0056.2019.02.07.14.42.45.461288.172175169.IMA +0 -0
  116. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0057.2019.02.07.14.42.45.461288.172176290.IMA +0 -0
  117. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0058.2019.02.07.14.42.45.461288.172175480.IMA +0 -0
  118. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0059.2019.02.07.14.42.45.461288.172176344.IMA +0 -0
  119. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0060.2019.02.07.14.42.45.461288.172175534.IMA +0 -0
  120. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0061.2019.02.07.14.42.45.461288.172175606.IMA +0 -0
  121. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0062.2019.02.07.14.42.45.461288.172174539.IMA +0 -0
  122. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0063.2019.02.07.14.42.45.461288.172175660.IMA +0 -0
  123. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0064.2019.02.07.14.42.45.461288.172174593.IMA +0 -0
  124. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0065.2019.02.07.14.42.45.461288.172175714.IMA +0 -0
  125. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0066.2019.02.07.14.42.45.461288.172174647.IMA +0 -0
  126. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0067.2019.02.07.14.42.45.461288.172175768.IMA +0 -0
  127. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0068.2019.02.07.14.42.45.461288.172174701.IMA +0 -0
  128. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0069.2019.02.07.14.42.45.461288.172175822.IMA +0 -0
  129. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0070.2019.02.07.14.42.45.461288.172174755.IMA +0 -0
  130. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0071.2019.02.07.14.42.45.461288.172175876.IMA +0 -0
  131. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0072.2019.02.07.14.42.45.461288.172174809.IMA +0 -0
  132. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0073.2019.02.07.14.42.45.461288.172175930.IMA +0 -0
  133. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0074.2019.02.07.14.42.45.461288.172174863.IMA +0 -0
  134. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0075.2019.02.07.14.42.45.461288.172175984.IMA +0 -0
  135. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0076.2019.02.07.14.42.45.461288.172174917.IMA +0 -0
  136. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0077.2019.02.07.14.42.45.461288.172176038.IMA +0 -0
  137. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0078.2019.02.07.14.42.45.461288.172174971.IMA +0 -0
  138. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0079.2019.02.07.14.42.45.461288.172176092.IMA +0 -0
  139. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0080.2019.02.07.14.42.45.461288.172175025.IMA +0 -0
  140. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0081.2019.02.07.14.42.45.461288.172176146.IMA +0 -0
  141. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0082.2019.02.07.14.42.45.461288.172175079.IMA +0 -0
  142. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0083.2019.02.07.14.42.45.461288.172176200.IMA +0 -0
  143. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0084.2019.02.07.14.42.45.461288.172175133.IMA +0 -0
  144. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0085.2019.02.07.14.42.45.461288.172176254.IMA +0 -0
  145. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0086.2019.02.07.14.42.45.461288.172175187.IMA +0 -0
  146. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0087.2019.02.07.14.42.45.461288.172176308.IMA +0 -0
  147. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0088.2019.02.07.14.42.45.461288.172175498.IMA +0 -0
  148. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0089.2019.02.07.14.42.45.461288.172176362.IMA +0 -0
  149. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0090.2019.02.07.14.42.45.461288.172175552.IMA +0 -0
  150. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/ep2d_RSI_b0_500_1500_6dir.zip +0 -0
  151. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/lena_color.dcm +0 -0
  152. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/sag_ap.zip +0 -0
  153. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/sag_hf.zip +0 -0
  154. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/sag_oblique.zip +0 -0
  155. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/srdoc103.zip +0 -0
  156. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time00/Image_00019.dcm +0 -0
  157. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time00/Image_00020.dcm +0 -0
  158. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time00/Image_00021.dcm +0 -0
  159. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time01/Image_00019.dcm +0 -0
  160. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time01/Image_00020.dcm +0 -0
  161. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time01/Image_00021.dcm +0 -0
  162. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time02/Image_00019.dcm +0 -0
  163. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time02/Image_00020.dcm +0 -0
  164. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time02/Image_00021.dcm +0 -0
  165. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time.zip +0 -0
  166. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00000.dcm +0 -0
  167. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00001.dcm +0 -0
  168. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00002.dcm +0 -0
  169. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00003.dcm +0 -0
  170. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00004.dcm +0 -0
  171. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00005.dcm +0 -0
  172. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00006.dcm +0 -0
  173. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00007.dcm +0 -0
  174. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00008.dcm +0 -0
  175. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/tra_oblique.zip +0 -0
  176. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/tra_rl.zip +0 -0
  177. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/itk/time/Image_00000.mha +0 -0
  178. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/itk/time/Image_00001.mha +0 -0
  179. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/itk/time/Image_00002.mha +0 -0
  180. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/itk/time.zip +0 -0
  181. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/lena_color.gif +0 -0
  182. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/lena_color.jpg +0 -0
  183. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/mat/time/Image_00000.mat +0 -0
  184. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/mat/time.zip +0 -0
  185. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/cor_hf.nii.gz +0 -0
  186. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/cor_oblique.nii.gz +0 -0
  187. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/cor_rl.nii.gz +0 -0
  188. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/sag_ap.nii.gz +0 -0
  189. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/sag_hf.nii.gz +0 -0
  190. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/sag_oblique.nii.gz +0 -0
  191. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time/time_all_fl3d_dynamic_20190207140517_14.json +0 -0
  192. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time/time_all_fl3d_dynamic_20190207140517_14.nii.gz +0 -0
  193. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time_all/time_all_fl3d_dynamic_20190207140517_14.json +0 -0
  194. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time_all/time_all_fl3d_dynamic_20190207140517_14.nii.gz +0 -0
  195. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time_all.zip +0 -0
  196. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/tra_oblique.nii.gz +0 -0
  197. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/tra_rl.nii.gz +0 -0
  198. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/A_Lovers_Complaint.pdf +0 -0
  199. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_1.pdf +0 -0
  200. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_2.pdf +0 -0
  201. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_3.pdf +0 -0
  202. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_4.pdf +0 -0
  203. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_5.pdf +0 -0
  204. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_6.pdf +0 -0
  205. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/text.txt +0 -0
  206. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/tree/file0 +0 -0
  207. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/tree/file1 +0 -0
  208. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/tree/file2 +0 -0
  209. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/vertices/vertices2d.pickle +0 -0
  210. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/vertices/vertices3d.pickle +0 -0
  211. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/vertices/vertices4d.pickle +0 -0
  212. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReference.rst +0 -0
  213. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceApps.rst +0 -0
  214. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceAppsDiffusion.rst +0 -0
  215. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceArchives.rst +0 -0
  216. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceCollections.rst +0 -0
  217. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceFormats.rst +0 -0
  218. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceImagedata.rst +0 -0
  219. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceSeries.rst +0 -0
  220. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceTransports.rst +0 -0
  221. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceViewer.rst +0 -0
  222. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Collections.rst +0 -0
  223. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Colors.rst +0 -0
  224. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/CommandLine.rst +0 -0
  225. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/DICOMAttributes.rst +0 -0
  226. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/DeveloperDocumentation.rst +0 -0
  227. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Examples.rst +0 -0
  228. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Figure_Architecture.png +0 -0
  229. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Input_output.rst +0 -0
  230. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Installation.rst +0 -0
  231. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Introduction.rst +0 -0
  232. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Makefile +0 -0
  233. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Non_image_dicom_objects.rst +0 -0
  234. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Notebook.rst +0 -0
  235. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Options.rst +0 -0
  236. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Plugin_Architecture.docx +0 -0
  237. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Plugin_Architecture.png +0 -0
  238. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Plugins.rst +0 -0
  239. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/README +0 -0
  240. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Segmentation.rst +0 -0
  241. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Tutorial.rst +0 -0
  242. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Viewing.rst +0 -0
  243. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/fuse_mask_blend.png +0 -0
  244. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/index.rst +0 -0
  245. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/make.bat +0 -0
  246. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/requirements.txt +0 -0
  247. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/modules.rst +0 -0
  248. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/setup.rst +0 -0
  249. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.apps.Siemens.rst +0 -0
  250. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.apps.rst +0 -0
  251. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.archives.rst +0 -0
  252. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.formats.dicomlib.rst +0 -0
  253. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.formats.rst +0 -0
  254. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.rst +0 -0
  255. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.transports.rst +0 -0
  256. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.rst +0 -0
  257. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/tests.rst +0 -0
  258. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/transformation.tex +0 -0
  259. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/paper.bib +0 -0
  260. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/paper.md +0 -0
  261. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/pylintrc +0 -0
  262. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/setup.cfg +0 -0
  263. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/__init__.py +0 -0
  264. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/ROI.py +0 -0
  265. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/__init__.py +0 -0
  266. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/draw_antialiased.py +0 -0
  267. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/evidence2mask.py +0 -0
  268. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/evidence_main.py +0 -0
  269. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/__init__.py +0 -0
  270. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/diffusion.py +0 -0
  271. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/archives/abstractarchive.py +0 -0
  272. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/archives/filesystemarchive.py +0 -0
  273. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/archives/zipfilearchive.py +0 -0
  274. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/cmdline.py +0 -0
  275. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/abstractplugin.py +0 -0
  276. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/dicomlib/uid.py +0 -0
  277. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/itkplugin.py +0 -0
  278. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/niftiplugin.py +0 -0
  279. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/list_plugins.py +0 -0
  280. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/abstracttransport.py +0 -0
  281. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/dicomtransport.py +0 -0
  282. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/xnattransport.py +0 -0
  283. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/dependency_links.txt +0 -0
  284. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/entry_points.txt +0 -0
  285. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/top_level.txt +0 -0
  286. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/techstack.md +0 -0
  287. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/techstack.yml +0 -0
  288. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/compare_headers.py +0 -0
  289. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_archive_file.py +0 -0
  290. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_archive_zip.py +0 -0
  291. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_axis.py +0 -0
  292. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_dicom_color.py +0 -0
  293. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_dicom_template.py +0 -0
  294. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_dicom_zip.py +0 -0
  295. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_itk.py +0 -0
  296. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_itk_template.py +0 -0
  297. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_itk_zip.py +0 -0
  298. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_mat.py +0 -0
  299. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_mat_zip.py +0 -0
  300. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_nifti.py +0 -0
  301. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_nifti_zip.py +0 -0
  302. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_image_data.py +0 -0
  303. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_transport_dicomtransport.py +0 -0
  304. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_transport_filetransport.py +0 -0
  305. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_transport_xnattransport.py +0 -0
  306. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_version.py +0 -0
  307. {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_viewer.py +0 -0
@@ -6,6 +6,60 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  <!--next-version-placeholder-->
9
+ ## [v3.9.0-dev3] - 2026-05-21
10
+ ### Fixed
11
+ * Series.__getitem__(): Slice the tags even when there is no tag axis.
12
+ * DICOMPLUGIN._join_axes(): Only accept tag axes of length > 1.
13
+
14
+ ## [v3.9.0-dev2] - 2026-05-20
15
+ * Support for python 3.14
16
+
17
+ ## [v3.9.0-rc1] - 2026-05-20
18
+ ### Added
19
+ * VariableAxis: Accept list of tuples as values.
20
+ * DICOMPlugin: Implement setting DTI tuple (b, bvector).
21
+ ### Fixed
22
+ * Sorting av duplicate tags fixed.
23
+
24
+ ## [v3.9.0-rc0] - 2026-05-19
25
+ ### Added
26
+ * DICOMPlugin: Sort DTI series where tags are (b, bvector) tuple.
27
+ ### Changed
28
+ * DICOMPlugin: Refactored sorting of n-dimensional datasets.
29
+
30
+ ## [v3.8.16-dev0] - 2026-05-15
31
+ ### Changed
32
+ * DICOMPlugin: Refactored sorting of n-dimensional datasets.
33
+
34
+ ## [v3.8.15] - 2026-05-15
35
+
36
+ ## [v3.8.15-dev4] - 2026-05-15
37
+ ### Fixed
38
+ * Viewer.connect_draw(): Traversing image tags is done using np.ndindex.
39
+ * Viewer.connect_draw(): Accept legacy ROI where tag is number.
40
+ * Viewer.disconnect_draw(): Traversing image tags is done using np.ndindex.
41
+
42
+ ## [v3.8.15-dev3] - 2026-04-21
43
+ ### Added
44
+ * DICOMPlugin: Document data types and processes.
45
+
46
+ ## [v3.8.15-dev2] - 2026-04-14
47
+ ### Fixed
48
+ * DICOMPlugin: Corrected writing dtype np.bool_
49
+ * DICOMPlugin.write_slice(): Drop `enforce_file_format` argument to pydicom.save_as().
50
+
51
+ ## [v3.8.15-dev1] - 2026-03-18
52
+ ### Added
53
+ * anonymize() methods on Series, Study, Patient and Cohort levels.
54
+ * DICOMPlugin.write_slice(): properly encode date and time data elements when given as string.
55
+
56
+ ## [v3.8.15-dev0] - 2026-03-16
57
+ ### Fixed
58
+ * Fixed parsing windows drive letter
59
+ * Header.__set_axes_from_template: Catch missing axes property.
60
+
61
+ ## [v3.8.15-dev0] - 2026-04-14
62
+ * Series ufunc: Fixed problem with np.mean().
9
63
 
10
64
  ## [v3.8.14] - 2025-11-27
11
65
  * Release 3.8.14
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2013-2025 Erling Andersen, Haukeland University Hospital, Bergen, Norway
3
+ Copyright (c) 2013-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: imagedata
3
- Version: 3.8.14
3
+ Version: 3.9.0.dev3
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>
7
7
  License: MIT License
8
8
 
9
- Copyright (c) 2013-2025 Erling Andersen, Haukeland University Hospital, Bergen, Norway
9
+ Copyright (c) 2013-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
10
10
 
11
11
  Permission is hereby granted, free of charge, to any person obtaining a copy
12
12
  of this software and associated documentation files (the "Software"), to deal
@@ -63,6 +63,7 @@ Requires-Dist: imageio
63
63
  Requires-Dist: pillow>=10.0.0
64
64
  Requires-Dist: xnat<0.7
65
65
  Requires-Dist: matplotlib>=3.8.0
66
+ Requires-Dist: dicom-anonymizer
66
67
  Requires-Dist: opencv-python-headless
67
68
  Dynamic: license-file
68
69
 
@@ -0,0 +1 @@
1
+ 3.9.0-dev3
@@ -0,0 +1,16 @@
1
+ .. _Anonymization:
2
+
3
+ Anonymization
4
+ ===============
5
+
6
+ DICOM data can be anonymized on the Series, Study, Patient or Cohort level.
7
+ Each object class provides an anonymize() method.
8
+
9
+ Common parameters include:
10
+
11
+ +---------------+------------------------------------------------------------+
12
+ |uid_table |Translation table for UIDs |
13
+ +---------------+------------------------------------------------------------+
14
+ |kwargs |dict or parameters giving mapping rules for specific |
15
+ | |DICOM attributes |
16
+ +---------------+------------------------------------------------------------+
@@ -36,6 +36,7 @@ Several sort criteria are predefined:
36
36
  * triggertime: Sort on Trigger Time
37
37
  * b: Sort on MR diffusion b-value
38
38
  * bvector: Sort on MR diffusion b vector
39
+ * dti: Sort on MR DTI (b, b vector) tuple
39
40
  * fa: Sort on MR Flip Angle
40
41
  * te: Sort on MR Echo Time
41
42
 
@@ -103,6 +104,25 @@ Trigger Time is the sorting criteria:
103
104
  trigger=get_TriggerTime)
104
105
  )
105
106
 
107
+ MRI DTI sorting
108
+ ---------------
109
+
110
+ MRI diffusion tensor images (DTI) are sorted on diffusion b-value and b-vectors.
111
+ The tags (b, bvector) are tuples.
112
+
113
+ .. code-block:: python
114
+
115
+ img = Series('dti', input_order='dti', input_format='dicom')
116
+ tags = img.tags[0]
117
+ for idx in np.ndindex(tags.shape):
118
+ try:
119
+ b, bvector = tags[idx]
120
+ except TypeError:
121
+ continue
122
+ dti = img[idx]
123
+ print(b, bvector, dti.shape)
124
+
125
+
106
126
  N-dimensional sorting
107
127
  ---------------------
108
128
 
@@ -115,7 +135,8 @@ A dynamic dual-echo MR acquisition can be sorted on time and echo time into a 5D
115
135
 
116
136
  img = Series('dyn_dual_echo', input_order='time,te')
117
137
 
118
- In particular, MR RSI diffusion data can be sorted on `b` value and `b` vector:
138
+ In particular, MR RSI diffusion data can be sorted on `b` value and `b` vector
139
+ (remember that the `dti` sort criteria can be used to sort these data as 4D):
119
140
 
120
141
  .. code-block:: python
121
142
 
@@ -14,6 +14,7 @@ User Guide
14
14
  Colors
15
15
  Introduction
16
16
  Input_output
17
+ Anonymization
17
18
  Sorting
18
19
  DICOMAttributes
19
20
  Segmentation
@@ -21,7 +21,7 @@ sys.path.insert(0, os.path.join(root, 'src'))
21
21
  # -- Project information -----------------------------------------------------
22
22
 
23
23
  project = 'imagedata'
24
- copyright = '2013-2023, Erling Andersen, Haukeland University Hospital, Bergen, Norway'
24
+ copyright = '2013-2026, Erling Andersen, Haukeland University Hospital, Bergen, Norway'
25
25
  author = 'Erling Andersen'
26
26
 
27
27
 
@@ -44,6 +44,7 @@ dependencies = [
44
44
  "pillow >= 10.0.0",
45
45
  "xnat < 0.7",
46
46
  "matplotlib >= 3.8.0",
47
+ "dicom-anonymizer",
47
48
  "opencv-python-headless"
48
49
  ]
49
50
  classifiers = [
@@ -37,24 +37,24 @@ except TypeError:
37
37
  if len(_plugins) == 0:
38
38
  # Fallback to known built-in plugins
39
39
  try:
40
- from src.imagedata.archives.filesystemarchive import FilesystemArchive
41
- from src.imagedata.archives.zipfilearchive import ZipfileArchive
40
+ from imagedata.archives.filesystemarchive import FilesystemArchive
41
+ from imagedata.archives.zipfilearchive import ZipfileArchive
42
42
  plugins['archive'] = [
43
43
  ('filesystemarchive', FilesystemArchive.name, FilesystemArchive),
44
44
  ('zipfilearchive', ZipfileArchive.name, ZipfileArchive)
45
45
  ]
46
- from src.imagedata.transports.filetransport import FileTransport
47
- from src.imagedata.transports.dicomtransport import DicomTransport
48
- from src.imagedata.transports.xnattransport import XnatTransport
46
+ from imagedata.transports.filetransport import FileTransport
47
+ from imagedata.transports.dicomtransport import DicomTransport
48
+ from imagedata.transports.xnattransport import XnatTransport
49
49
  plugins['transport'] = [
50
50
  ('filetransport', FileTransport.name, FileTransport),
51
51
  ('dicomtransport', DicomTransport.name, DicomTransport),
52
52
  ('xnattransport', XnatTransport.name, XnatTransport)
53
53
  ]
54
- from src.imagedata.formats.dicomplugin import DICOMPlugin
55
- from src.imagedata.formats.itkplugin import ITKPlugin
56
- from src.imagedata.formats.matplugin import MatPlugin
57
- from src.imagedata.formats.niftiplugin import NiftiPlugin
54
+ from imagedata.formats.dicomplugin import DICOMPlugin
55
+ from imagedata.formats.itkplugin import ITKPlugin
56
+ from imagedata.formats.matplugin import MatPlugin
57
+ from imagedata.formats.niftiplugin import NiftiPlugin
58
58
  plugins['format'] = [
59
59
  ('dicomformat', DICOMPlugin.name, DICOMPlugin),
60
60
  ('itkformat', ITKPlugin.name, ITKPlugin),
@@ -3,12 +3,10 @@
3
3
  Standard plugins provide support for local filesystem and zip archives.
4
4
  """
5
5
 
6
- # Copyright (c) 2018-2024 Erling Andersen, Haukeland University Hospital, Bergen, Norway
6
+ # Copyright (c) 2018-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
7
7
 
8
- import os.path
9
8
  import logging
10
9
  import urllib.parse
11
- import fnmatch
12
10
  from ..transports import Transport
13
11
 
14
12
  logger = logging.getLogger(__name__)
@@ -40,19 +38,8 @@ def find_mimetype_plugin(mimetype, url, mode="r", read_directory_only=False, opt
40
38
  if opts is None:
41
39
  opts = {}
42
40
  from .. import plugins
43
- if os.name == 'nt' and \
44
- fnmatch.fnmatch(url, '[A-Za-z]:\\*'):
45
- # Windows: Parse without /x:, then re-attach drive letter
46
- urldict = urllib.parse.urlsplit(url[2:], scheme="file")
47
- # _path = url[:2] + urldict.path
48
- else:
49
- urldict = urllib.parse.urlsplit(url, scheme="file")
50
- # _path = urldict.path if len(urldict.path) > 0 else urldict.netloc
51
- # if urldict.scheme == 'xnat':
52
- # mimetype = 'application/zip'
53
- # if mimetype is None:
54
- # logger.debug("imagedata.archives.find_mimetype_plugin: filesystem")
55
- # return find_plugin('filesystem', url, mode, opts=opts)
41
+ # Windows: Drive letter will be parsed as scheme
42
+ urldict = urllib.parse.urlsplit(url, scheme="file")
56
43
  transport = None
57
44
  if urldict.scheme:
58
45
  transport = Transport(
@@ -74,8 +61,6 @@ def find_mimetype_plugin(mimetype, url, mode="r", read_directory_only=False, opt
74
61
  logger.debug("{}: {}, mode: {}".format(
75
62
  _name, ptype, mode))
76
63
  return pclass(url=url, transport=transport, mode=mode, opts=opts)
77
- # if os.path.isfile(_path):
78
- # if os.path.exists(_path):
79
64
  if urldict.scheme == "file":
80
65
  logger.debug("{}: filesystem".format(_name))
81
66
  try:
@@ -258,7 +258,11 @@ class VariableAxis(Axis):
258
258
 
259
259
  def __init__(self, name: str, values: Sequence) -> None:
260
260
  super(VariableAxis, self).__init__(name)
261
- if issubclass(type(values[0]), Sequence):
261
+ if issubclass(type(values[0]), tuple):
262
+ self._values = np.ndarray(len(values), dtype=tuple)
263
+ for i, value in enumerate(values):
264
+ self._values[i] = value
265
+ elif issubclass(type(values[0]), Sequence):
262
266
  self._values = np.ndarray(len(values), dtype=np.ndarray)
263
267
  for i, value in enumerate(values):
264
268
  self._values[i] = np.array(value)
@@ -8,17 +8,20 @@ The Cohort class is a collection of Patient objects.
8
8
 
9
9
  """
10
10
 
11
- # Copyright (c) 2023-2025 Erling Andersen, Haukeland University Hospital, Bergen, Norway
11
+ # Copyright (c) 2023-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
12
12
 
13
13
  import logging
14
14
  from datetime import datetime, date, time
15
15
  import argparse
16
16
  from pathlib import Path
17
+ from pydicom.uid import UID
17
18
  from typing import Union
19
+ # from dicomanonymizer.dicomfields_selector import dicom_anonymization_database_selector
18
20
 
19
21
  from .series import Series
20
22
  from .readdata import read as r_read
21
- from .formats import UnknownInputError
23
+ from .formats import UnknownInputError, get_uid
24
+ from .formats.dicomlib import anonymization_rules
22
25
 
23
26
  logger = logging.getLogger(__name__)
24
27
 
@@ -309,7 +312,10 @@ class Study(IndexedDict):
309
312
  else:
310
313
  _value = datetime.strptime(_value, "%H%M%S").time()
311
314
  except ValueError:
312
- _value = datetime.time(_value)
315
+ try:
316
+ _value = datetime.time(_value)
317
+ except TypeError:
318
+ pass
313
319
  # Update self property if None from series
314
320
  if getattr(self, _attr, None) is None:
315
321
  # _series = self[_seriesInstanceUID]
@@ -349,6 +355,7 @@ class Study(IndexedDict):
349
355
 
350
356
  def __init__(self, data, opts: dict = None, **kwargs):
351
357
  super(Study, self).__init__()
358
+ self.__uid_generator = get_uid()
352
359
  for _attr in self._attributes:
353
360
  setattr(self, _attr, None)
354
361
 
@@ -374,6 +381,8 @@ class Study(IndexedDict):
374
381
  _series_dict = data
375
382
  elif issubclass(type(data), Study):
376
383
  raise ValueError("Why here?")
384
+ elif data is None:
385
+ _series_dict = {}
377
386
  else:
378
387
  # Assume data is URL
379
388
  try:
@@ -396,7 +405,12 @@ class Study(IndexedDict):
396
405
  return \
397
406
  "Study: {} {}".format(datetime.combine(_date, _time), _descr)
398
407
 
399
- def write(self, url, opts=None, formats=None):
408
+ def new_uid(self) -> UID:
409
+ """Return the next available UID from the UID generator.
410
+ """
411
+ return self.__uid_generator.__next__()
412
+
413
+ def write(self, url, opts=None, formats=None, **kwargs):
400
414
  """Write image data, calling appropriate format plugins
401
415
 
402
416
  Args:
@@ -412,6 +426,13 @@ class Study(IndexedDict):
412
426
  imagedata.formats.WriteNotImplemented: Cannot write this image format.
413
427
  """
414
428
 
429
+ if opts is None:
430
+ opts = {}
431
+ elif issubclass(type(opts), argparse.Namespace):
432
+ opts = vars(opts)
433
+ for key, value in kwargs.items():
434
+ opts[key] = value
435
+
415
436
  _used_urls = []
416
437
  for _seriesUID in self.keys():
417
438
  _series = self[_seriesUID]
@@ -431,6 +452,28 @@ class Study(IndexedDict):
431
452
  except Exception as e:
432
453
  raise Exception(_url) from e
433
454
 
455
+ def anonymize(self, uid_table: dict = {}, actions: dict = {}, **kwargs):
456
+ _actions = {} | actions
457
+ rules = anonymization_rules | kwargs
458
+ if rules['studyTime'] is None:
459
+ rules['studyTime'] = self.studyTime
460
+ _copy = Study(None)
461
+ for _rule in rules:
462
+ try:
463
+ _ = getattr(_copy, _rule)
464
+ setattr(_copy, _rule, rules[_rule])
465
+ except AttributeError:
466
+ pass
467
+ if self.studyInstanceUID is None:
468
+ self.studyInstanceUID = _copy.new_uid()
469
+ if self.studyInstanceUID not in uid_table:
470
+ uid_table[self.studyInstanceUID] = _copy.new_uid()
471
+ _copy.studyInstanceUID = uid_table[self.studyInstanceUID]
472
+ for _seriesUID in self.keys():
473
+ _series = self[_seriesUID].anonymize(uid_table, **rules)
474
+ _copy[_series.seriesInstanceUID] = _series
475
+ return _copy
476
+
434
477
 
435
478
  class Patient(IndexedDict):
436
479
  """Patient -- Read and sort images into a collection of Study objects.
@@ -500,6 +543,9 @@ class Patient(IndexedDict):
500
543
  # _study_dict = data
501
544
  # for _studyInstanceUID in data:
502
545
  # self[_studyInstanceUID] = _study_dict[_studyInstanceUID]
546
+ elif data is None:
547
+ _series_dict = {}
548
+ _study_dict = {}
503
549
  else:
504
550
  _series_dict = _sort_in_series(data, _in_opts)
505
551
  _study_dict = _sort_in_studies(_series_dict, _in_opts)
@@ -618,6 +664,21 @@ class Patient(IndexedDict):
618
664
  except Exception as e:
619
665
  raise Exception(_url) from e
620
666
 
667
+ def anonymize(self, uid_table: dict = {}, actions: dict = {}, **kwargs):
668
+ _actions = {} | actions
669
+ rules = anonymization_rules | kwargs
670
+ _copy = Patient(None)
671
+ for _rule in rules:
672
+ try:
673
+ _ = getattr(_copy, _rule)
674
+ setattr(_copy, _rule, rules[_rule])
675
+ except AttributeError:
676
+ pass
677
+ for _studyUID in self.keys():
678
+ _study = self[_studyUID].anonymize(uid_table, **rules)
679
+ _copy[_study.studyInstanceUID] = _study
680
+ return _copy
681
+
621
682
 
622
683
  class Cohort(IndexedDict):
623
684
  """Cohort -- Read and sort images into a collection of Patient objects.
@@ -687,6 +748,10 @@ class Cohort(IndexedDict):
687
748
  for _patientID in _patient_dict:
688
749
  # self[_patientID] = Patient(_patient_dict[_patientID])
689
750
  self[_patientID] = _patient_dict[_patientID]
751
+ elif data is None:
752
+ _series_dict = {}
753
+ _study_dict = {}
754
+ _patient_dict = {}
690
755
  else:
691
756
  raise ValueError('Unexpected cohort data type {}'.format(type(data)))
692
757
 
@@ -782,3 +847,19 @@ class Cohort(IndexedDict):
782
847
  _series.write(_url, opts=opts, formats=formats)
783
848
  except Exception as e:
784
849
  raise Exception(_url) from e
850
+
851
+ def anonymize(self, uid_table: dict = {}, actions: dict = {}, **kwargs):
852
+ _actions = {} | actions
853
+ rules = anonymization_rules | kwargs
854
+ _copy = Cohort(None)
855
+ for _rule in rules:
856
+ try:
857
+ _ = getattr(_copy, _rule)
858
+ setattr(_copy, _rule, rules[_rule])
859
+ except AttributeError:
860
+ pass
861
+ for _patientID in self.keys():
862
+ _patient = self[_patientID].anonymize(uid_table, **rules)
863
+ _copy[_patientID] = _patient
864
+ return _copy
865
+
@@ -3,7 +3,7 @@
3
3
  Standard plugins provides support for DICOM and Nifti image file formats.
4
4
  """
5
5
 
6
- # Copyright (c) 2013-2024 Erling Andersen, Haukeland University Hospital, Bergen, Norway
6
+ # Copyright (c) 2013-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
7
7
 
8
8
  import os
9
9
  import sys
@@ -23,11 +23,13 @@ INPUT_ORDER_TIME = 'time'
23
23
  INPUT_ORDER_TRIGGERTIME = 'triggertime'
24
24
  INPUT_ORDER_B = 'b'
25
25
  INPUT_ORDER_BVECTOR = 'bvector'
26
+ INPUT_ORDER_DTI = 'dti'
26
27
  INPUT_ORDER_RSI = 'rsi'
27
28
  INPUT_ORDER_FA = 'fa'
28
29
  INPUT_ORDER_TE = 'te'
29
30
  INPUT_ORDER_FAULTY = 'faulty'
30
31
  input_order_set = {INPUT_ORDER_NONE, INPUT_ORDER_TIME, INPUT_ORDER_B, INPUT_ORDER_BVECTOR,
32
+ INPUT_ORDER_DTI,
31
33
  INPUT_ORDER_RSI, INPUT_ORDER_FA, INPUT_ORDER_TRIGGERTIME,
32
34
  INPUT_ORDER_TE, INPUT_ORDER_FAULTY}
33
35
 
@@ -0,0 +1,17 @@
1
+ anonymization_rules = {
2
+ 'patientName': 'ANONYMOUS',
3
+ 'patientID': 'ANONYMOUS',
4
+ 'patientBirthDate': '19000101',
5
+ 'patientSex': 'O',
6
+ 'patientIdentityRemoved': 'YES',
7
+ 'deidentificationMethod': 'imagedata',
8
+ 'studyDate': '19700101',
9
+ 'studyTime': None,
10
+ 'studyDescription': '',
11
+ 'studyID': '1',
12
+ 'referringPhysicianName': '',
13
+ 'instanceCreationDate': '19700101',
14
+ 'seriesDate': '19700101',
15
+ 'acquisitionDate': '19700101',
16
+ 'performedProcedureStepStartDate': '19700101',
17
+ }