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.
Files changed (297) hide show
  1. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/CHANGELOG.md +44 -1
  2. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/PKG-INFO +3 -2
  3. imagedata-3.8.0rc0/VERSION.txt +1 -0
  4. imagedata-3.8.0rc0/data/dicom/5D.zip +0 -0
  5. imagedata-3.8.0rc0/data/dicom/ep2d_RSI_b0_500_1500_6dir.zip +0 -0
  6. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/evidence2mask.py +25 -3
  7. imagedata-3.8.0rc0/src/imagedata/apps/diffusion.py +341 -0
  8. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/archives/zipfilearchive.py +8 -2
  9. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/axis.py +5 -1
  10. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/cmdline.py +2 -2
  11. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/collection.py +3 -0
  12. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/__init__.py +4 -58
  13. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/dicomplugin.py +348 -191
  14. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/itkplugin.py +8 -9
  15. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/matplugin.py +8 -10
  16. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/niftiplugin.py +9 -10
  17. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/header.py +78 -40
  18. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/image_data.py +3 -3
  19. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/readdata.py +7 -3
  20. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/series.py +59 -53
  21. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/xnattransport.py +4 -1
  22. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/viewer.py +4 -1
  23. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/PKG-INFO +3 -2
  24. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/SOURCES.txt +2 -0
  25. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/compare_headers.py +31 -0
  26. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_dicom.py +146 -10
  27. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_dicom_color.py +1 -1
  28. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_dicom_template.py +12 -7
  29. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_series.py +25 -3
  30. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_series_ufunc.py +4 -1
  31. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_transport_filetransport.py +1 -1
  32. imagedata-3.7.2.dev1/VERSION.txt +0 -1
  33. imagedata-3.7.2.dev1/src/imagedata/apps/diffusion.py +0 -161
  34. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/.readthedocs.yaml +0 -0
  35. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/.travis.yml +0 -0
  36. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/CONTRIBUTING.rst +0 -0
  37. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/LICENSE.txt +0 -0
  38. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/MANIFEST.in +0 -0
  39. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/Makefile +0 -0
  40. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/README.rst +0 -0
  41. {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
  42. {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
  43. {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
  44. {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
  45. {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
  46. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/cohort.zip +0 -0
  47. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/cor_hf.zip +0 -0
  48. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/cor_oblique.zip +0 -0
  49. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/cor_rl.zip +0 -0
  50. {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
  51. {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
  52. {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
  53. {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
  54. {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
  55. {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
  56. {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
  57. {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
  58. {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
  59. {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
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {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
  91. {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
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {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
  98. {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
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/lena_color.dcm +0 -0
  141. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/sag_ap.zip +0 -0
  142. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/sag_hf.zip +0 -0
  143. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/sag_oblique.zip +0 -0
  144. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/srdoc103.zip +0 -0
  145. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time00/Image_00019.dcm +0 -0
  146. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time00/Image_00020.dcm +0 -0
  147. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time00/Image_00021.dcm +0 -0
  148. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time01/Image_00019.dcm +0 -0
  149. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time01/Image_00020.dcm +0 -0
  150. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time01/Image_00021.dcm +0 -0
  151. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time02/Image_00019.dcm +0 -0
  152. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time02/Image_00020.dcm +0 -0
  153. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time/time02/Image_00021.dcm +0 -0
  154. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time.zip +0 -0
  155. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00000.dcm +0 -0
  156. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00001.dcm +0 -0
  157. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00002.dcm +0 -0
  158. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00003.dcm +0 -0
  159. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00004.dcm +0 -0
  160. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00005.dcm +0 -0
  161. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00006.dcm +0 -0
  162. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00007.dcm +0 -0
  163. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/time_all/Image_00008.dcm +0 -0
  164. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/tra_oblique.zip +0 -0
  165. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/dicom/tra_rl.zip +0 -0
  166. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/itk/time/Image_00000.mha +0 -0
  167. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/itk/time/Image_00001.mha +0 -0
  168. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/itk/time/Image_00002.mha +0 -0
  169. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/itk/time.zip +0 -0
  170. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/lena_color.gif +0 -0
  171. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/lena_color.jpg +0 -0
  172. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/mat/time/Image_00000.mat +0 -0
  173. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/mat/time.zip +0 -0
  174. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/cor_hf.nii.gz +0 -0
  175. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/cor_oblique.nii.gz +0 -0
  176. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/cor_rl.nii.gz +0 -0
  177. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/sag_ap.nii.gz +0 -0
  178. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/sag_hf.nii.gz +0 -0
  179. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/sag_oblique.nii.gz +0 -0
  180. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time/time_all_fl3d_dynamic_20190207140517_14.json +0 -0
  181. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time/time_all_fl3d_dynamic_20190207140517_14.nii.gz +0 -0
  182. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time_all/time_all_fl3d_dynamic_20190207140517_14.json +0 -0
  183. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time_all/time_all_fl3d_dynamic_20190207140517_14.nii.gz +0 -0
  184. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/time_all.zip +0 -0
  185. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/tra_oblique.nii.gz +0 -0
  186. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/nifti/tra_rl.nii.gz +0 -0
  187. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/A_Lovers_Complaint.pdf +0 -0
  188. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_1.pdf +0 -0
  189. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_2.pdf +0 -0
  190. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_3.pdf +0 -0
  191. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_4.pdf +0 -0
  192. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_5.pdf +0 -0
  193. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/pdf/pages/A_Lovers_Complaint_6.pdf +0 -0
  194. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/text.txt +0 -0
  195. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/tree/file0 +0 -0
  196. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/tree/file1 +0 -0
  197. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/tree/file2 +0 -0
  198. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/vertices/vertices2d.pickle +0 -0
  199. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/vertices/vertices3d.pickle +0 -0
  200. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/data/vertices/vertices4d.pickle +0 -0
  201. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReference.rst +0 -0
  202. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceApps.rst +0 -0
  203. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceAppsDiffusion.rst +0 -0
  204. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceArchives.rst +0 -0
  205. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceCollections.rst +0 -0
  206. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceFormats.rst +0 -0
  207. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceImagedata.rst +0 -0
  208. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceSeries.rst +0 -0
  209. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceTransports.rst +0 -0
  210. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/APIReferenceViewer.rst +0 -0
  211. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Collections.rst +0 -0
  212. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Colors.rst +0 -0
  213. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/CommandLine.rst +0 -0
  214. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/DICOMAttributes.rst +0 -0
  215. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/DeveloperDocumentation.rst +0 -0
  216. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Examples.rst +0 -0
  217. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Figure_Architecture.png +0 -0
  218. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Input_output.rst +0 -0
  219. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Installation.rst +0 -0
  220. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Introduction.rst +0 -0
  221. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Makefile +0 -0
  222. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Non_image_dicom_objects.rst +0 -0
  223. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Notebook.rst +0 -0
  224. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Options.rst +0 -0
  225. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Plugin_Architecture.docx +0 -0
  226. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Plugin_Architecture.png +0 -0
  227. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Plugins.rst +0 -0
  228. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/README +0 -0
  229. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Sorting.rst +0 -0
  230. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Tutorial.rst +0 -0
  231. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/UserGuide.rst +0 -0
  232. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/Viewing.rst +0 -0
  233. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/conf.py +0 -0
  234. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/fuse_mask_blend.png +0 -0
  235. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/index.rst +0 -0
  236. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/make.bat +0 -0
  237. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/requirements.txt +0 -0
  238. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/modules.rst +0 -0
  239. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/setup.rst +0 -0
  240. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.apps.Siemens.rst +0 -0
  241. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.apps.rst +0 -0
  242. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.archives.rst +0 -0
  243. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.formats.dicomlib.rst +0 -0
  244. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.formats.rst +0 -0
  245. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.rst +0 -0
  246. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.imagedata.transports.rst +0 -0
  247. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/src.rst +0 -0
  248. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/source/tests.rst +0 -0
  249. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/docs/transformation.tex +0 -0
  250. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/paper.bib +0 -0
  251. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/paper.md +0 -0
  252. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/pylintrc +0 -0
  253. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/pyproject.toml +0 -0
  254. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/setup.cfg +0 -0
  255. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/__init__.py +0 -0
  256. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/__init__.py +0 -0
  257. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/ROI.py +0 -0
  258. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/__init__.py +0 -0
  259. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/draw_antialiased.py +0 -0
  260. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/Siemens/evidence_main.py +0 -0
  261. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/apps/__init__.py +0 -0
  262. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/archives/__init__.py +0 -0
  263. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/archives/abstractarchive.py +0 -0
  264. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/archives/filesystemarchive.py +0 -0
  265. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/abstractplugin.py +0 -0
  266. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/dicomlib/__init__.py +0 -0
  267. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/formats/dicomlib/uid.py +0 -0
  268. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/list_plugins.py +0 -0
  269. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/__init__.py +0 -0
  270. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/abstracttransport.py +0 -0
  271. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/dicomtransport.py +0 -0
  272. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata/transports/filetransport.py +0 -0
  273. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/dependency_links.txt +0 -0
  274. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/entry_points.txt +0 -0
  275. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/requires.txt +0 -0
  276. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/src/imagedata.egg-info/top_level.txt +0 -0
  277. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/techstack.md +0 -0
  278. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/techstack.yml +0 -0
  279. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/__init__.py +0 -0
  280. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/context.py +0 -0
  281. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_archive_file.py +0 -0
  282. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_archive_zip.py +0 -0
  283. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_axis.py +0 -0
  284. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_collections.py +0 -0
  285. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_dicom_zip.py +0 -0
  286. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_itk.py +0 -0
  287. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_itk_template.py +0 -0
  288. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_itk_zip.py +0 -0
  289. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_mat.py +0 -0
  290. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_mat_zip.py +0 -0
  291. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_nifti.py +0 -0
  292. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_formats_nifti_zip.py +0 -0
  293. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_transport_dicomtransport.py +0 -0
  294. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_transport_xnattransport.py +0 -0
  295. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_version.py +0 -0
  296. {imagedata-3.7.2.dev1 → imagedata-3.8.0rc0}/tests/test_viewer.py +0 -0
  297. {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.7.2-dev1] - 2024-10-23
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
1
+ Metadata-Version: 2.4
2
2
  Name: imagedata
3
- Version: 3.7.2.dev1
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
@@ -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 == 'PolygonApplication3D' or roi_type_value == 'FreehandApplication3D':
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
- raise ValueError("ROI type {} ({}) not implemented.".format(
163
- roi_type_value, type(roi_type_value)))
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
- os.remove(self.__local_file)
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
- os.remove(self.__local_file.name)
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
- return VariableAxis(name, np.array(self._values[:n]))
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, str_to_input_order, str_to_dtype
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 = str_to_input_order(values)
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, INPUT_ORDER_FA,
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