hoa-tools 1.0.10__py3-none-any.whl

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 (313) hide show
  1. hoa_tools/__init__.py +5 -0
  2. hoa_tools/_n5.py +10 -0
  3. hoa_tools/_version.py +34 -0
  4. hoa_tools/data/metadata/metadata/A129_lung_VOI-02_2.0um_bm18.json +286 -0
  5. hoa_tools/data/metadata/metadata/A186_lung_right_VOI-3_4.26um_bm18.json +275 -0
  6. hoa_tools/data/metadata/metadata/A186_lung_right_complete-organ_24.132um_bm18.json +269 -0
  7. hoa_tools/data/metadata/metadata/AUMC-005_uterus_complete-organ_20.026um_bm18.json +331 -0
  8. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-01_2.5um_bm05.json +211 -0
  9. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-01_6.5um_bm05.json +217 -0
  10. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-02_2.5um_bm05.json +211 -0
  11. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-02_6.5um_bm05.json +217 -0
  12. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-03_2.5um_bm05.json +211 -0
  13. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-03_6.5um_bm05.json +217 -0
  14. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-04_6.5um_bm05.json +211 -0
  15. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-07_2.5um_bm05.json +211 -0
  16. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-08_2.5um_bm05.json +211 -0
  17. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_central-column_6.24um_bm05.json +214 -0
  18. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_complete-organ_26.38um_bm05.json +208 -0
  19. hoa_tools/data/metadata/metadata/FO-20-125_lung_complete-organ_26.38um_bm05.json +208 -0
  20. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01.2_2.22um_bm05.json +210 -0
  21. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01.2b_2.22um_bm05.json +210 -0
  22. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01_6.24um_bm05.json +214 -0
  23. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-02.2_2.22um_bm05.json +210 -0
  24. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-02_6.24um_bm05.json +214 -0
  25. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03.2_2.22um_bm05.json +210 -0
  26. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03_6.24um_bm05.json +214 -0
  27. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03b-bis_2.2um_bm05.json +210 -0
  28. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04-bis_6.5um_bm05.json +210 -0
  29. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04.2_2.22um_bm05.json +210 -0
  30. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04_6.24um_bm05.json +214 -0
  31. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-05.2_2.22um_bm05.json +210 -0
  32. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-05_6.24um_bm05.json +214 -0
  33. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-08.2_2.22um_bm05.json +210 -0
  34. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-09.2_2.22um_bm05.json +210 -0
  35. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-10.2_2.22um_bm05.json +210 -0
  36. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-aa-bis_2.2um_bm05.json +210 -0
  37. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-aa_0.65um_bm05.json +199 -0
  38. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-sx20_6.24um_bm05.json +214 -0
  39. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_complete-upper-lobe-bis_25.25um_bm05.json +204 -0
  40. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_complete-upper-lobe_26.38um_bm05.json +208 -0
  41. hoa_tools/data/metadata/metadata/FO-20-129_lung_right_upper_lobe_core-biopsy_2.25um_bm05.json +204 -0
  42. hoa_tools/data/metadata/metadata/FO-20-135_lung_complete-organ_25.25um_bm05.json +204 -0
  43. hoa_tools/data/metadata/metadata/FO-20-153_lung_complete-organ_25.25um_bm05.json +204 -0
  44. hoa_tools/data/metadata/metadata/FO-20-154_lung_col1_2.5um_bm05.json +204 -0
  45. hoa_tools/data/metadata/metadata/FO-20-154_lung_col1_6.5um_bm05.json +210 -0
  46. hoa_tools/data/metadata/metadata/FO-20-154_lung_col2_2.5um_bm05.json +204 -0
  47. hoa_tools/data/metadata/metadata/FO-20-154_lung_col2_6.5um_bm05.json +210 -0
  48. hoa_tools/data/metadata/metadata/FO-20-154_lung_col3_2.5um_bm05.json +204 -0
  49. hoa_tools/data/metadata/metadata/FO-20-154_lung_col4_2.5um_bm05.json +204 -0
  50. hoa_tools/data/metadata/metadata/FO-20-154_lung_col5_2.5um_bm05.json +204 -0
  51. hoa_tools/data/metadata/metadata/FO-20-154_lung_col6_2.5um_bm05.json +204 -0
  52. hoa_tools/data/metadata/metadata/FO-20-154_lung_col7_2.5um_bm05.json +204 -0
  53. hoa_tools/data/metadata/metadata/FO-20-154_lung_complete-organ_25.25um_bm05.json +204 -0
  54. hoa_tools/data/metadata/metadata/FO-20-155_lung_col1_2.5um_bm05.json +204 -0
  55. hoa_tools/data/metadata/metadata/FO-20-155_lung_col1_6.5um_bm05.json +210 -0
  56. hoa_tools/data/metadata/metadata/FO-20-155_lung_col2_2.5um_bm05.json +204 -0
  57. hoa_tools/data/metadata/metadata/FO-20-155_lung_col2_6.5um_bm05.json +210 -0
  58. hoa_tools/data/metadata/metadata/FO-20-155_lung_col3_2.5um_bm05.json +204 -0
  59. hoa_tools/data/metadata/metadata/FO-20-155_lung_col3_6.5um_bm05.json +210 -0
  60. hoa_tools/data/metadata/metadata/FO-20-155_lung_col4_6.5um_bm05.json +210 -0
  61. hoa_tools/data/metadata/metadata/FO-20-155_lung_col6_2.5um_bm05.json +210 -0
  62. hoa_tools/data/metadata/metadata/FO-20-155_lung_complete-organ_25.28um_bm05.json +199 -0
  63. hoa_tools/data/metadata/metadata/FO-20-160_lung_complete-organ_25.0um_bm05.json +199 -0
  64. hoa_tools/data/metadata/metadata/GLR-163_lung_right_lower_lobe_core-biopsy_2.45um_bm05.json +204 -0
  65. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_L-vent-muscle_2.22um_bm05.json +210 -0
  66. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_LR-vent-muscles-ramus-interventricularis-anterior_6.05um_bm05.json +210 -0
  67. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-01_6.5um_bm18.json +272 -0
  68. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-02_6.5um_bm18.json +272 -0
  69. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-03_6.5um_bm18.json +272 -0
  70. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_complete-organ_19.89um_bm18.json +252 -0
  71. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_complete-organ_25.08um_bm05.json +204 -0
  72. hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_central-column_1.29um_bm05.json +210 -0
  73. hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_central-column_6.05um_bm05.json +210 -0
  74. hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_complete-organ_25.08um_bm05.json +204 -0
  75. hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_right_complete-organ_25.0um_bm05.json +204 -0
  76. hoa_tools/data/metadata/metadata/LADAF-2020-27_liver_complete-organ_19.61um_bm18.json +266 -0
  77. hoa_tools/data/metadata/metadata/LADAF-2020-27_liver_complete-organ_25.25um_bm05.json +204 -0
  78. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_2.51um_bm05.json +199 -0
  79. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_25.25um_bm05.json +205 -0
  80. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_6.5um_bm05.json +199 -0
  81. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_2.51um_bm05.json +199 -0
  82. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_25.25um_bm05.json +205 -0
  83. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_6.5um_bm05.json +199 -0
  84. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_2.45um_bm05.json +210 -0
  85. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_2.5um_bm05.json +210 -0
  86. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_6.05um_bm05.json +210 -0
  87. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_6.5um_bm05.json +205 -0
  88. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02-lower-lobe-basal_2.45um_bm05.json +210 -0
  89. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02-lower-lobe-basal_6.05um_bm05.json +210 -0
  90. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02b-upper-lobe-apical_2.5um_bm05.json +210 -0
  91. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02b-upper-lobe-medial_6.5um_bm05.json +205 -0
  92. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03-upper-lobe-apical_2.5um_bm05.json +210 -0
  93. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03_6.5um_bm05.json +205 -0
  94. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03b-interlobular-fissure_6.5um_bm05.json +205 -0
  95. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-04-upper-lobe-medial_2.5um_bm05.json +210 -0
  96. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-04b-lower-lobe-basal-medial_6.5um_bm05.json +205 -0
  97. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-05-lower-lobe-basal_2.5um_bm05.json +210 -0
  98. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-05-upper-lobe-apical_6.5um_bm05.json +205 -0
  99. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-06-lower-lobe-basal_2.45um_bm05.json +210 -0
  100. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-06-lower-lobe-basal_6.05um_bm05.json +210 -0
  101. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_complete-organ_25.08um_bm05.json +204 -0
  102. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_right_complete-organ_19.61um_bm18.json +266 -0
  103. hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_central-column_1.29um_bm05.json +210 -0
  104. hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_central-column_6.05um_bm05.json +210 -0
  105. hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_complete-organ_25.08um_bm05.json +204 -0
  106. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_cerebellum-occipital_6.05um_bm05.json +210 -0
  107. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_cerebellum_2.45um_bm05.json +210 -0
  108. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_complete-organ_25.08um_bm05.json +204 -0
  109. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_frontal_2.45um_bm05.json +210 -0
  110. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_hippocampus_2.45um_bm05.json +204 -0
  111. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_hippocampus_6.05um_bm05.json +210 -0
  112. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-01_6.36um_bm18.json +246 -0
  113. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-01_6.5um_bm05.json +205 -0
  114. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-02_6.36um_bm18.json +246 -0
  115. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-02_6.5um_bm05.json +205 -0
  116. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-03_6.36um_bm18.json +246 -0
  117. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-03_6.5um_bm05.json +205 -0
  118. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-04_6.5um_bm05.json +205 -0
  119. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-05_6.36um_bm18.json +246 -0
  120. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-06_6.36um_bm18.json +246 -0
  121. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-07_6.36um_bm18.json +246 -0
  122. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_complete-organ_19.89um_bm18.json +252 -0
  123. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_complete-organ_25.17um_bm05.json +204 -0
  124. hoa_tools/data/metadata/metadata/LADAF-2020-31_kidney_complete-organ_25.0um_bm05.json +204 -0
  125. hoa_tools/data/metadata/metadata/LADAF-2020-31_kidney_lateral-transect_2.5um_bm05.json +211 -0
  126. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-01_6.54um_bm18.json +258 -0
  127. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-02_6.54um_bm18.json +258 -0
  128. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-03_6.54um_bm18.json +258 -0
  129. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-04_6.54um_bm18.json +258 -0
  130. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-05_6.54um_bm18.json +258 -0
  131. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-06_6.54um_bm18.json +258 -0
  132. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-07_6.54um_bm18.json +258 -0
  133. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-08_6.54um_bm18.json +258 -0
  134. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-09_6.54um_bm18.json +258 -0
  135. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-10_6.54um_bm18.json +258 -0
  136. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-11_6.36um_bm18.json +246 -0
  137. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-12_6.36um_bm18.json +246 -0
  138. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-13_6.36um_bm18.json +246 -0
  139. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-14_6.36um_bm18.json +246 -0
  140. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-15_6.36um_bm18.json +246 -0
  141. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-02.1_2.256um_bm18.json +272 -0
  142. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-03.2_2.256um_bm18.json +272 -0
  143. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-13.1_2.256um_bm18.json +272 -0
  144. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_complete-organ_23.42um_bm18.json +266 -0
  145. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_complete-organ_25.25um_bm05.json +218 -0
  146. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_complete-organ_7.72um_bm18.json +240 -0
  147. hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_VOI-01_1.444um_bm05.json +255 -0
  148. hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_VOI-01_4.502um_bm18.json +261 -0
  149. hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_VOI-07_1.444um_bm05.json +255 -0
  150. hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_VOI-11_4.502um_bm18.json +261 -0
  151. hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_complete-organ_20.025um_bm18.json +260 -0
  152. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-01_6.36um_bm18.json +246 -0
  153. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-01_6.5um_bm05.json +265 -0
  154. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-02_6.36um_bm18.json +246 -0
  155. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-02_6.5um_bm05.json +265 -0
  156. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-03_6.36um_bm18.json +246 -0
  157. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-03_6.5um_bm05.json +265 -0
  158. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-04_6.36um_bm18.json +246 -0
  159. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-05_6.36um_bm18.json +246 -0
  160. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-06_6.36um_bm18.json +246 -0
  161. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-07_6.36um_bm18.json +246 -0
  162. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-1.1_2.256um_bm18.json +272 -0
  163. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-1.2_2.256um_bm18.json +272 -0
  164. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-3.1_2.256um_bm18.json +272 -0
  165. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.1_2.256um_bm18.json +272 -0
  166. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.2_2.256um_bm18.json +272 -0
  167. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.3_2.256um_bm18.json +272 -0
  168. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-5.1_2.256um_bm18.json +272 -0
  169. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-7.1_2.256um_bm18.json +272 -0
  170. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_complete-organ_19.85um_bm18.json +240 -0
  171. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_complete-organ_25.08um_bm05.json +252 -0
  172. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-01.1_2.6um_bm05.json +258 -0
  173. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-01_6.49um_bm05.json +258 -0
  174. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-02.1_2.6um_bm05.json +258 -0
  175. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-02_6.49um_bm05.json +258 -0
  176. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_complete-organ_25.14um_bm05.json +252 -0
  177. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-01.1_2.6um_bm05.json +258 -0
  178. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-01_6.5um_bm05.json +258 -0
  179. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-02.1_2.6um_bm05.json +258 -0
  180. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-02_6.5um_bm05.json +258 -0
  181. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-03.1_2.6um_bm05.json +258 -0
  182. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-03_6.5um_bm05.json +258 -0
  183. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_complete-organ_25.0um_bm05.json +218 -0
  184. hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_VOI-01_4.14um_bm18.json +233 -0
  185. hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_VOI-02_4.14um_bm18.json +233 -0
  186. hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_VOI-03_4.14um_bm18.json +233 -0
  187. hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_VOI-08_4.14um_bm18.json +233 -0
  188. hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_complete-organ_22.56um_bm18.json +240 -0
  189. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_left_complete-organ_22.56um_bm18.json +240 -0
  190. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-01_5.05um_bm18.json +246 -0
  191. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-03_5.05um_bm18.json +246 -0
  192. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-04_5.05um_bm18.json +246 -0
  193. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-05_5.05um_bm18.json +246 -0
  194. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-06_5.05um_bm18.json +246 -0
  195. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-07_5.05um_bm18.json +246 -0
  196. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-08_5.05um_bm18.json +240 -0
  197. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-09_5.05um_bm18.json +240 -0
  198. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-10_5.05um_bm18.json +240 -0
  199. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-11_5.05um_bm18.json +246 -0
  200. hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_complete-organ_21.64um_bm18.json +280 -0
  201. hoa_tools/data/metadata/metadata/LADAF-2021-17_prostate_complete-scan_23.42um_bm18.json +266 -0
  202. hoa_tools/data/metadata/metadata/LADAF-2021-17_spleen_complete-organ_25.0um_bm05.json +218 -0
  203. hoa_tools/data/metadata/metadata/LADAF-2021-17_testis_1_VOI-01_2.02um_bm18.json +233 -0
  204. hoa_tools/data/metadata/metadata/LADAF-2021-17_testis_1_complete-organ_9.595um_bm18.json +227 -0
  205. hoa_tools/data/metadata/metadata/LADAF-2021-17_testis_2_VOI-02_2.02um_bm18.json +233 -0
  206. hoa_tools/data/metadata/metadata/LADAF-2021-17_testis_2_complete-organ_9.595um_bm18.json +227 -0
  207. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-01_6.51um_bm18.json +246 -0
  208. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-02_6.51um_bm18.json +246 -0
  209. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-04_6.51um_bm18.json +246 -0
  210. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-05_6.51um_bm18.json +246 -0
  211. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-06_6.51um_bm18.json +246 -0
  212. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-07_6.51um_bm18.json +246 -0
  213. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-1.1_2.26um_bm18.json +272 -0
  214. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-1.2_2.26um_bm18.json +272 -0
  215. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-3.1_2.26um_bm18.json +272 -0
  216. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-4.1_2.26um_bm18.json +272 -0
  217. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-4.2_2.26um_bm18.json +272 -0
  218. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-5.1_2.26um_bm18.json +272 -0
  219. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-6.1_2.26um_bm18.json +272 -0
  220. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-7.1_2.26um_bm18.json +272 -0
  221. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_complete-organ_19.89um_bm18.json +252 -0
  222. hoa_tools/data/metadata/metadata/LADAF-2022-13_kidney_1_complete-organ_15.77um_bm18.json +266 -0
  223. hoa_tools/data/metadata/metadata/LADAF-2022-13_kidney_2_complete-organ_15.77um_bm18.json +266 -0
  224. hoa_tools/data/metadata/metadata/LADAF-2022-13_prostate_complete-organ_14.72um_bm18.json +244 -0
  225. hoa_tools/data/metadata/metadata/LADAF-2022-16_prostate_complete-organ_15.75um_bm18.json +266 -0
  226. hoa_tools/data/metadata/metadata/LADAF-2022-16_spleen_complete-organ_15.75um_bm18.json +266 -0
  227. hoa_tools/data/metadata/metadata/LADAF-2022-27_kidney_bottom_complete-organ_15.75um_bm18.json +266 -0
  228. hoa_tools/data/metadata/metadata/LADAF-2022-27_kidney_top_complete-organ_15.75um_bm18.json +266 -0
  229. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-01-tricuspid-valve_12.02um_bm05.json +258 -0
  230. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-01_6.51um_bm18.json +246 -0
  231. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-02_6.51um_bm18.json +246 -0
  232. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-03_6.51um_bm18.json +246 -0
  233. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-04_6.51um_bm18.json +246 -0
  234. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-05_6.51um_bm18.json +246 -0
  235. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-06_6.51um_bm18.json +246 -0
  236. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-08_6.51um_bm18.json +246 -0
  237. hoa_tools/data/metadata/metadata/S-20-28_heart_complete-organ_19.85um_bm18.json +240 -0
  238. hoa_tools/data/metadata/metadata/S-20-28_heart_complete-organ_25.27um_bm05.json +204 -0
  239. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-01_2.5um_bm05.json +224 -0
  240. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-01_6.51um_bm05.json +210 -0
  241. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-02_2.5um_bm05.json +224 -0
  242. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-02_6.51um_bm05.json +210 -0
  243. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-03_2.5um_bm05.json +224 -0
  244. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-04_2.5um_bm05.json +224 -0
  245. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-05_2.5um_bm05.json +224 -0
  246. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-06_2.5um_bm05.json +218 -0
  247. hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-07_2.5um_bm05.json +224 -0
  248. hoa_tools/data/metadata/metadata/S-20-28_kidney_complete-organ_25.0um_bm05.json +204 -0
  249. hoa_tools/data/metadata/metadata/S-20-28_lung_right_lower_lobe_overview_19.89um_bm18.json +252 -0
  250. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01_2.5um_bm05.json +224 -0
  251. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01_6.54um_bm18.json +258 -0
  252. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01_6.5um_bm05.json +224 -0
  253. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01b_6.5um_bm05.json +224 -0
  254. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-02_2.5um_bm05.json +224 -0
  255. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-02_6.54um_bm18.json +258 -0
  256. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-02_6.5um_bm05.json +224 -0
  257. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-03_2.5um_bm05.json +224 -0
  258. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-03_6.54um_bm18.json +258 -0
  259. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-03_6.5um_bm05.json +224 -0
  260. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-04_2.5um_bm05.json +224 -0
  261. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-04_6.54um_bm18.json +258 -0
  262. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-04_6.5um_bm05.json +224 -0
  263. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-05_2.5um_bm05.json +224 -0
  264. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-05_6.54um_bm18.json +258 -0
  265. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-05_6.5um_bm05.json +224 -0
  266. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-06_6.54um_bm18.json +258 -0
  267. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-07_6.54um_bm18.json +258 -0
  268. hoa_tools/data/metadata/metadata/S-20-29_brain_complete-organ_19.57um_bm18.json +240 -0
  269. hoa_tools/data/metadata/metadata/S-20-29_brain_complete-organ_25.33um_bm05.json +199 -0
  270. hoa_tools/data/metadata/metadata/S-20-29_heart_ROI-03_6.5um_bm05.json +210 -0
  271. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-01_2.5um_bm05.json +210 -0
  272. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-01_6.51um_bm18.json +246 -0
  273. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-01_6.5um_bm05.json +210 -0
  274. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-02_2.5um_bm05.json +210 -0
  275. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-02_6.51um_bm18.json +246 -0
  276. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-02_6.5um_bm05.json +210 -0
  277. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-03_6.51um_bm18.json +246 -0
  278. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-04_6.51um_bm18.json +246 -0
  279. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-04_6.5um_bm05.json +210 -0
  280. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-05_6.51um_bm18.json +246 -0
  281. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-05b_6.5um_bm05.json +210 -0
  282. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-06_6.51um_bm18.json +246 -0
  283. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-07_6.51um_bm18.json +246 -0
  284. hoa_tools/data/metadata/metadata/S-20-29_heart_complete-organ_19.89um_bm18.json +252 -0
  285. hoa_tools/data/metadata/metadata/S-20-29_heart_complete-organ_25.25um_bm05.json +199 -0
  286. hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-01_1.4um_bm05.json +204 -0
  287. hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-01_6.5um_bm05.json +210 -0
  288. hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-02_6.5um_bm05.json +210 -0
  289. hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-03_6.5um_bm05.json +210 -0
  290. hoa_tools/data/metadata/metadata/S-20-29_kidney_complete-organ_25.38um_bm05.json +204 -0
  291. hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-2.1_2.256um_bm18.json +266 -0
  292. hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-3.1_2.256um_bm18.json +272 -0
  293. hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-5.3_2.256um_bm18.json +272 -0
  294. hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-01_6.5um_bm05.json +210 -0
  295. hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-02_6.5um_bm05.json +210 -0
  296. hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-04_6.5um_bm05.json +210 -0
  297. hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-05_6.5um_bm05.json +210 -0
  298. hoa_tools/data/metadata/metadata/S-20-29_lung_left_complete-organ_25.31um_bm05.json +199 -0
  299. hoa_tools/data/metadata/metadata/S-21-33_brain_complete-organ_19.57um_bm18.json +240 -0
  300. hoa_tools/data/metadata/metadata/S-21-46_brain_complete-organ_19.57um_bm18.json +240 -0
  301. hoa_tools/data/metadata/metadata/S-22-16_brain_complete-organ_19.59um_bm18.json +266 -0
  302. hoa_tools/dataset.py +295 -0
  303. hoa_tools/inventory.py +30 -0
  304. hoa_tools/metadata.py +772 -0
  305. hoa_tools/py.typed +0 -0
  306. hoa_tools/registration.py +125 -0
  307. hoa_tools/types.py +59 -0
  308. hoa_tools/voi.py +230 -0
  309. hoa_tools-1.0.10.dist-info/METADATA +108 -0
  310. hoa_tools-1.0.10.dist-info/RECORD +313 -0
  311. hoa_tools-1.0.10.dist-info/WHEEL +5 -0
  312. hoa_tools-1.0.10.dist-info/licenses/LICENSE.md +27 -0
  313. hoa_tools-1.0.10.dist-info/top_level.txt +1 -0
hoa_tools/py.typed ADDED
File without changes
@@ -0,0 +1,125 @@
1
+ """
2
+ Registration inventory and helpers.
3
+
4
+ A registration defines a transform between two datasets.
5
+ The transform is defined in physical space, and in this library data is always
6
+ in units of micro-meters (μm).
7
+
8
+ Transforms are defined using the `SimpleITK` library.
9
+ """
10
+
11
+ import itertools
12
+ from typing import Any
13
+
14
+ import networkx as nx
15
+ import numpy as np
16
+ import SimpleITK as sitk
17
+
18
+ from hoa_tools.dataset import Dataset
19
+ from hoa_tools.types import PhysicalCoordinate
20
+
21
+
22
+ class RegistrationInventory:
23
+ """
24
+ Inventory of transforms between datasets.
25
+
26
+ Transforms are defined as acting on the zyx axes in that order. Note that this
27
+ is different from the order in which the SimpleITK API defines axes in its function
28
+ signatures.
29
+ """
30
+
31
+ def __init__(self) -> None:
32
+ """
33
+ Create registration inventory.
34
+ """
35
+ self._graph: nx.DiGraph[Any] = nx.DiGraph()
36
+
37
+ def __contains__(self, item: tuple[Dataset, Dataset]) -> bool:
38
+ """
39
+ Check for existence of registration between two datasets.
40
+ """
41
+ try:
42
+ nx.shortest_path(self._graph, item[0].name, item[1].name)
43
+ except nx.exception.NetworkXNoPath:
44
+ return False
45
+ else:
46
+ return True
47
+
48
+ def get_registration(
49
+ self, *, source_dataset: Dataset, target_dataset: Dataset
50
+ ) -> sitk.Transform:
51
+ """
52
+ Get a registration.
53
+ """
54
+ try:
55
+ path = nx.shortest_path(
56
+ self._graph, source_dataset.name, target_dataset.name
57
+ )
58
+ except nx.exception.NetworkXNoPath:
59
+ msg = (
60
+ f"No registration path between {source_dataset.name} and "
61
+ f"{target_dataset.name}"
62
+ )
63
+ raise ValueError(msg) from None
64
+
65
+ transforms: list[sitk.Transform] = [
66
+ self._graph[p1][p2]["transform"] for p1, p2 in itertools.pairwise(path)
67
+ ]
68
+ if len(transforms) == 1:
69
+ return transforms[0]
70
+
71
+ ndim = 3
72
+ t = sitk.CompositeTransform(ndim) # type: ignore[no-untyped-call]
73
+ for transform in transforms:
74
+ t.AddTransform(transform) # type: ignore[no-untyped-call]
75
+ return t
76
+
77
+ def add_registration(
78
+ self,
79
+ *,
80
+ source_dataset: Dataset,
81
+ target_dataset: Dataset,
82
+ transform: sitk.Transform,
83
+ ) -> None:
84
+ """
85
+ Add a new transform to the inventory.
86
+
87
+ Notes
88
+ -----
89
+ This will override any already defined transforms for these two datasets.
90
+
91
+ """
92
+ self._graph.add_edge(
93
+ source_dataset.name, target_dataset.name, transform=transform
94
+ )
95
+ self._graph.add_edge(
96
+ target_dataset.name,
97
+ source_dataset.name,
98
+ transform=transform.GetInverse(), # type: ignore[no-untyped-call]
99
+ )
100
+
101
+ def _clear(self) -> None:
102
+ """
103
+ Remove all registrations.
104
+ """
105
+ self._graph = nx.DiGraph()
106
+
107
+
108
+ def build_transform(
109
+ *, translation: PhysicalCoordinate, rotation_deg: float, scale: float
110
+ ) -> sitk.Similarity3DTransform:
111
+ """
112
+ Build a transform from a translation, scale, and rotation.
113
+ """
114
+ axis = (1, 0, 0)
115
+ center = (0, 0, 0)
116
+ return sitk.Similarity3DTransform( # type: ignore[no-untyped-call]
117
+ scale,
118
+ axis,
119
+ np.deg2rad(rotation_deg),
120
+ (translation.z, translation.y, translation.x),
121
+ center,
122
+ )
123
+
124
+
125
+ Inventory = RegistrationInventory()
hoa_tools/types.py ADDED
@@ -0,0 +1,59 @@
1
+ """
2
+ Common types used across the library.
3
+ """
4
+
5
+ from math import floor
6
+ from typing import Self
7
+
8
+ import SimpleITK as sitk
9
+ from pydantic import BaseModel
10
+
11
+
12
+ class PhysicalCoordinate(BaseModel):
13
+ """
14
+ A single coordinate in physical space.
15
+ """
16
+
17
+ x: float
18
+ y: float
19
+ z: float
20
+
21
+ def to_array_coordinate(self, *, voxel_size: float) -> "ArrayCoordinate":
22
+ """
23
+ Given a voxel size, convert this physical coordinate to an array coordinate.
24
+ """
25
+ return ArrayCoordinate(
26
+ x=floor(self.x / voxel_size),
27
+ y=floor(self.y / voxel_size),
28
+ z=floor(self.z / voxel_size),
29
+ )
30
+
31
+ def transform(self, t: sitk.Transform) -> Self:
32
+ """
33
+ Transform this coordinate.
34
+
35
+ Notes
36
+ -----
37
+ The transform is applied in zyx order.
38
+
39
+ """
40
+ new_coord = t.TransformPoint((self.z, self.y, self.x)) # type: ignore[no-untyped-call]
41
+ return self.__class__(z=new_coord[0], y=new_coord[1], x=new_coord[2])
42
+
43
+
44
+ class ArrayCoordinate(BaseModel):
45
+ """
46
+ A single coordinate in array space.
47
+ """
48
+
49
+ x: int
50
+ y: int
51
+ z: int
52
+
53
+ def to_physical_coordinate(self, *, voxel_size: float) -> "PhysicalCoordinate":
54
+ """
55
+ Given a voxel size, convert this array coordinate to a physical coordinate.
56
+ """
57
+ return PhysicalCoordinate(
58
+ x=self.x * voxel_size, y=self.y * voxel_size, z=self.z * voxel_size
59
+ )
hoa_tools/voi.py ADDED
@@ -0,0 +1,230 @@
1
+ """
2
+ Tools for working with volumes of interest (VOIs).
3
+
4
+ A volume of interest is a sub-volume contained within a full dataset.
5
+ It is represented by the [`VOI`][hoa_tools.voi.VOI] class.
6
+
7
+ All coordinates are given in 'array coordinates',
8
+ where 0 is the centre of the first voxel, 1 is the centre of the second voxel etc.
9
+ """
10
+
11
+ import itertools
12
+ from math import ceil, floor
13
+ from typing import Any
14
+
15
+ import SimpleITK as sitk
16
+ import xarray as xr
17
+ from pydantic import BaseModel
18
+
19
+ from hoa_tools.dataset import Dataset
20
+ from hoa_tools.registration import Inventory as RegInventory
21
+ from hoa_tools.types import ArrayCoordinate
22
+
23
+
24
+ class VOI(BaseModel):
25
+ """
26
+ A volume of interest attached to a given dataset.
27
+ """
28
+
29
+ dataset: Dataset
30
+ """Dataset that this VOI is in."""
31
+ downsample_level: int
32
+ """Downsampling level of the dataset that this VOI is defined in."""
33
+ lower_corner: ArrayCoordinate
34
+ """Index of lower corner in array coordinates."""
35
+ size: ArrayCoordinate
36
+ """Size of VOI in array coordinates."""
37
+
38
+ @property
39
+ def voxel_size_um(self) -> float:
40
+ """
41
+ Voxel size in micrometers.
42
+ """
43
+ return float(self.dataset.data.voxel_size_um * 2 ** (self.downsample_level))
44
+
45
+ @property
46
+ def upper_corner(self) -> ArrayCoordinate:
47
+ """
48
+ Upper corner of the VOI.
49
+ """
50
+ return ArrayCoordinate(
51
+ x=self.lower_corner.x + self.size.x,
52
+ y=self.lower_corner.y + self.size.y,
53
+ z=self.lower_corner.z + self.size.z,
54
+ )
55
+
56
+ @property
57
+ def corners(self) -> list[ArrayCoordinate]:
58
+ """
59
+ All 8 corners of the VOI.
60
+ """
61
+ corner_tuples: list[tuple[int, int, int]] = list(
62
+ itertools.product( # type: ignore[arg-type]
63
+ *zip(
64
+ [self.lower_corner.x, self.lower_corner.y, self.lower_corner.z],
65
+ [self.upper_corner.x, self.upper_corner.y, self.upper_corner.z],
66
+ strict=True,
67
+ )
68
+ )
69
+ )
70
+ return [ArrayCoordinate(x=i[0], y=i[1], z=i[2]) for i in corner_tuples]
71
+
72
+ def get_data_array(self) -> xr.DataArray:
73
+ """
74
+ Get data array for this VOI.
75
+ """
76
+ da = self.dataset.data_array(downsample_level=self.downsample_level)
77
+ return da.isel(
78
+ x=slice(self.lower_corner.x, self.upper_corner.x),
79
+ y=slice(self.lower_corner.y, self.upper_corner.y),
80
+ z=slice(self.lower_corner.z, self.upper_corner.z),
81
+ )
82
+
83
+ def get_sitk_image(self) -> sitk.Image:
84
+ """
85
+ Get a SimpleITK image of this VOI.
86
+ """
87
+ data_array = self.get_data_array()
88
+ image = sitk.GetImageFromArray(data_array.transpose("x", "y", "z").values)
89
+ image.SetSpacing((self.voxel_size_um, self.voxel_size_um, self.voxel_size_um)) # type: ignore[no-untyped-call]
90
+ image.SetOrigin( # type: ignore[no-untyped-call]
91
+ (
92
+ float(data_array.coords["z"][0]),
93
+ float(data_array.coords["y"][0]),
94
+ float(data_array.coords["x"][0]),
95
+ )
96
+ )
97
+ return image
98
+
99
+ def get_data_array_on_voi(
100
+ self,
101
+ target_voi: "VOI",
102
+ *,
103
+ interpolator: Any = sitk.sitkLinear,
104
+ transform: sitk.Transform | None = None,
105
+ ) -> xr.DataArray:
106
+ """
107
+ Get data array for this VOI resampled to the grid of another VOI.
108
+
109
+ If the transform isn't given, uses the transform between two datasets in the
110
+ registration inventory.
111
+
112
+ Parameters
113
+ ----------
114
+ target_voi :
115
+ VOI to resample data in this VOI on to.
116
+ interpolator :
117
+ Interpolation method to use.
118
+ See https://simpleitk.org/doxygen/v2_4/html/namespaceitk_1_1simple.html#a7cb1ef8bd02c669c02ea2f9f5aa374e5
119
+ transform :
120
+ If given, transform used to map this VOI on to the target VOI.
121
+ If not given, transform is taken from the registration inventory.
122
+
123
+ """
124
+ if transform is None:
125
+ transform = RegInventory.get_registration(
126
+ source_dataset=self.dataset, target_dataset=target_voi.dataset
127
+ )
128
+ default_value = 0
129
+ new_image = sitk.Resample(
130
+ self.get_sitk_image(),
131
+ target_voi.get_sitk_image(),
132
+ transform.GetInverse(), # type: ignore[no-untyped-call]
133
+ interpolator,
134
+ default_value,
135
+ )
136
+
137
+ new_array = target_voi.get_data_array().copy()
138
+ new_array.values = sitk.GetArrayFromImage(new_image).T
139
+ return new_array
140
+
141
+ def change_downsample_level(self, *, new_downsample_level: int) -> "VOI":
142
+ """
143
+ Return a new VOI at a different downsample level.
144
+ """
145
+ resolution_ratio = (2**self.downsample_level) / (2**new_downsample_level)
146
+ new_lower_corner = ArrayCoordinate(
147
+ x=floor(self.lower_corner.x * resolution_ratio),
148
+ y=floor(self.lower_corner.y * resolution_ratio),
149
+ z=floor(self.lower_corner.z * resolution_ratio),
150
+ )
151
+ new_size = ArrayCoordinate(
152
+ x=ceil(self.size.x * resolution_ratio),
153
+ y=ceil(self.size.y * resolution_ratio),
154
+ z=ceil(self.size.z * resolution_ratio),
155
+ )
156
+ return VOI(
157
+ dataset=self.dataset,
158
+ downsample_level=new_downsample_level,
159
+ lower_corner=new_lower_corner,
160
+ size=new_size,
161
+ )
162
+
163
+ def transform_to(
164
+ self,
165
+ dataset: Dataset,
166
+ *,
167
+ transform: sitk.Transform | None = None,
168
+ ) -> "VOI":
169
+ """
170
+ Transform this VOI to another dataset.
171
+
172
+ The new VOI will completely contain the transformed original VOI.
173
+
174
+ Parameters
175
+ ----------
176
+ dataset :
177
+ Dataset to transform to.
178
+ transform :
179
+ If given, transform used to map this VOI on to the target VOI.
180
+ If not given, transform is taken from the registration inventory.
181
+
182
+ """
183
+ if transform is None:
184
+ if (self.dataset, dataset) not in RegInventory:
185
+ msg = (
186
+ f"Transform between {self.dataset.name} and {dataset.name} "
187
+ "not found in registration inventory."
188
+ )
189
+ raise RuntimeError(msg)
190
+
191
+ transform = RegInventory.get_registration(
192
+ source_dataset=self.dataset, target_dataset=dataset
193
+ )
194
+
195
+ old_voi = self.change_downsample_level(new_downsample_level=0)
196
+
197
+ # Convert to physical space
198
+ physical_corners = [
199
+ c.to_physical_coordinate(voxel_size=self.dataset.data.voxel_size_um)
200
+ for c in old_voi.corners
201
+ ]
202
+ # Transform
203
+ physical_corners_transformed = [
204
+ c.transform(transform) for c in physical_corners
205
+ ]
206
+ # Convert back to array space
207
+ corners_transformed = [
208
+ c.to_array_coordinate(voxel_size=dataset.data.voxel_size_um)
209
+ for c in physical_corners_transformed
210
+ ]
211
+ lower_corner = ArrayCoordinate(
212
+ z=min([c.z for c in corners_transformed]),
213
+ y=min([c.y for c in corners_transformed]),
214
+ x=min([c.x for c in corners_transformed]),
215
+ )
216
+ upper_corner = ArrayCoordinate(
217
+ z=max([c.z for c in corners_transformed]) + 1,
218
+ y=max([c.y for c in corners_transformed]) + 1,
219
+ x=max([c.x for c in corners_transformed]) + 1,
220
+ )
221
+ return VOI(
222
+ dataset=dataset,
223
+ downsample_level=0,
224
+ lower_corner=lower_corner,
225
+ size=ArrayCoordinate(
226
+ x=upper_corner.x - lower_corner.x,
227
+ y=upper_corner.y - lower_corner.y,
228
+ z=upper_corner.z - lower_corner.z,
229
+ ),
230
+ )
@@ -0,0 +1,108 @@
1
+ Metadata-Version: 2.4
2
+ Name: hoa-tools
3
+ Version: 1.0.10
4
+ Summary: Tools for working with the Human Organ Atlas
5
+ Author-email: David Stansby <d.stansby@ucl.ac.uk>
6
+ License: Copyright (c) 2024, David Stansby
7
+ All rights reserved.
8
+
9
+ Redistribution and use in source and binary forms, with or without
10
+ modification, are permitted provided that the following conditions are met:
11
+
12
+ - Redistributions of source code must retain the above copyright notice, this
13
+ list of conditions and the following disclaimer.
14
+
15
+ - Redistributions in binary form must reproduce the above copyright notice,
16
+ this list of conditions and the following disclaimer in the documentation
17
+ and/or other materials provided with the distribution.
18
+
19
+ - Neither the name of HOA Tools nor the names of its
20
+ contributors may be used to endorse or promote products derived from
21
+ this software without specific prior written permission.
22
+
23
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
27
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
+
34
+ Project-URL: homepage, https://github.com/HumanOrganAtlas/hoa-tools
35
+ Classifier: Operating System :: POSIX
36
+ Classifier: Programming Language :: Python :: 3
37
+ Classifier: Programming Language :: Python :: 3 :: Only
38
+ Classifier: Programming Language :: Python :: 3.11
39
+ Classifier: Programming Language :: Python :: 3.12
40
+ Classifier: Programming Language :: Python :: 3.13
41
+ Classifier: Typing :: Typed
42
+ Requires-Python: >=3.11
43
+ Description-Content-Type: text/markdown
44
+ License-File: LICENSE.md
45
+ Requires-Dist: dask[array]
46
+ Requires-Dist: gcsfs>2023
47
+ Requires-Dist: networkx>=3
48
+ Requires-Dist: pandas>=2
49
+ Requires-Dist: pydantic>=2
50
+ Requires-Dist: simpleitk
51
+ Requires-Dist: xarray
52
+ Requires-Dist: zarr<3,>2.16
53
+ Provides-Extra: dev
54
+ Requires-Dist: build; extra == "dev"
55
+ Requires-Dist: mypy; extra == "dev"
56
+ Requires-Dist: pre-commit; extra == "dev"
57
+ Requires-Dist: ruff; extra == "dev"
58
+ Requires-Dist: jupyterlab; extra == "dev"
59
+ Requires-Dist: jupytext; extra == "dev"
60
+ Requires-Dist: types-networkx; extra == "dev"
61
+ Requires-Dist: pandas-stubs; extra == "dev"
62
+ Requires-Dist: datamodel-code-generator; extra == "dev"
63
+ Provides-Extra: docs
64
+ Requires-Dist: mkdocs; extra == "docs"
65
+ Requires-Dist: mkdocstrings-python; extra == "docs"
66
+ Requires-Dist: mkdocs-material; extra == "docs"
67
+ Requires-Dist: mkdocs-jupyter; extra == "docs"
68
+ Requires-Dist: griffe-pydantic; extra == "docs"
69
+ Requires-Dist: matplotlib; extra == "docs"
70
+ Requires-Dist: numpydoc; extra == "docs"
71
+ Requires-Dist: scikit-image; extra == "docs"
72
+ Provides-Extra: test
73
+ Requires-Dist: matplotlib; extra == "test"
74
+ Requires-Dist: pytest; extra == "test"
75
+ Requires-Dist: pytest-accept; extra == "test"
76
+ Requires-Dist: pytest-cov; extra == "test"
77
+ Requires-Dist: pytest-doctestplus; extra == "test"
78
+ Requires-Dist: pytest-vcr; extra == "test"
79
+ Requires-Dist: scikit-image; extra == "test"
80
+ Dynamic: license-file
81
+
82
+ # HOA Tools
83
+
84
+ [![Tests status][tests-badge]][tests-link]
85
+ [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/HumanOrganAtlas/hoa-tools/main.svg)](https://results.pre-commit.ci/latest/github/HumanOrganAtlas/hoa-tools/main)
86
+ [![Documentation Status](https://readthedocs.org/projects/hoa-tools/badge/?version=latest)](https://hoa-tools.readthedocs.io/en/latest/?badge=latest)
87
+
88
+ [![License][license-badge]](./LICENSE.md)
89
+
90
+ <!--
91
+ [![PyPI version][pypi-version]][pypi-link]
92
+ [![Conda-Forge][conda-badge]][conda-link]
93
+ [![PyPI platforms][pypi-platforms]][pypi-link]
94
+ -->
95
+
96
+ <!-- prettier-ignore-start -->
97
+ [tests-badge]: https://github.com/HumanOrganAtlas/hoa-tools/actions/workflows/tests.yml/badge.svg
98
+ [tests-link]: https://github.com/HumanOrganAtlas/hoa-tools/actions/workflows/tests.yml
99
+ [conda-badge]: https://img.shields.io/conda/vn/conda-forge/hoa-tools
100
+ [conda-link]: https://github.com/conda-forge/hoa-tools-feedstock
101
+ [pypi-link]: https://pypi.org/project/hoa-tools/
102
+ [pypi-platforms]: https://img.shields.io/pypi/pyversions/hoa-tools
103
+ [pypi-version]: https://img.shields.io/pypi/v/hoa-tools
104
+ [license-badge]: https://img.shields.io/badge/License-BSD_3--Clause-blue.svg
105
+ <!-- prettier-ignore-end -->
106
+
107
+ Tools for working with data from the [Human Organ Atlas](https://human-organ-atlas.esrf.eu/).
108
+ Documentation at https://hoa-tools.readthedocs.io.