hoa-tools 1.0__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.

Potentially problematic release.


This version of hoa-tools might be problematic. Click here for more details.

Files changed (198) hide show
  1. hoa_tools/__init__.py +5 -0
  2. hoa_tools/_n5.py +10 -0
  3. hoa_tools/_version.py +21 -0
  4. hoa_tools/data/metadata/metadata/A186_lung_right_VOI-3_4.26um_bm18.json +275 -0
  5. hoa_tools/data/metadata/metadata/A186_lung_right_complete-organ_24.132um_bm18.json +269 -0
  6. hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_complete-organ_26.38um_bm05.json +208 -0
  7. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01.2_2.22um_bm05.json +210 -0
  8. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01.2b_2.22um_bm05.json +210 -0
  9. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01_6.24um_bm05.json +214 -0
  10. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-02.2_2.22um_bm05.json +210 -0
  11. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-02_6.24um_bm05.json +214 -0
  12. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03.2_2.22um_bm05.json +210 -0
  13. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03_6.24um_bm05.json +214 -0
  14. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03b-bis_2.2um_bm05.json +205 -0
  15. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04-bis_6.5um_bm05.json +205 -0
  16. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04.2_2.22um_bm05.json +210 -0
  17. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04_6.24um_bm05.json +214 -0
  18. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-05.2_2.22um_bm05.json +210 -0
  19. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-05_6.24um_bm05.json +214 -0
  20. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-08.2_2.22um_bm05.json +210 -0
  21. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-09.2_2.22um_bm05.json +210 -0
  22. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-10.2_2.22um_bm05.json +210 -0
  23. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-aa-bis_2.2um_bm05.json +205 -0
  24. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-aa_0.65um_bm05.json +199 -0
  25. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-sx20_6.24um_bm05.json +214 -0
  26. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_complete-upper-lobe-bis_25.25um_bm05.json +199 -0
  27. hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_complete-upper-lobe_26.38um_bm05.json +208 -0
  28. hoa_tools/data/metadata/metadata/FO-20-129_lung_right_upper_lobe_core-biopsy_2.25um_bm05.json +204 -0
  29. hoa_tools/data/metadata/metadata/GLR-163_lung_right_lower_lobe_core-biopsy_2.45um_bm05.json +204 -0
  30. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_L-vent-muscle_2.22um_bm05.json +210 -0
  31. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_LR-vent-muscles-ramus-interventricularis-anterior_6.05um_bm05.json +210 -0
  32. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-01_6.5um_bm18.json +272 -0
  33. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-02_6.5um_bm18.json +272 -0
  34. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-03_6.5um_bm18.json +272 -0
  35. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_complete-organ_19.89um_bm18.json +252 -0
  36. hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_complete-organ_25.08um_bm05.json +204 -0
  37. hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_central-column_1.29um_bm05.json +210 -0
  38. hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_central-column_6.05um_bm05.json +210 -0
  39. hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_complete-organ_25.08um_bm05.json +204 -0
  40. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_2.51um_bm05.json +199 -0
  41. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_25.25um_bm05.json +205 -0
  42. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_6.5um_bm05.json +199 -0
  43. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_2.51um_bm05.json +199 -0
  44. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_25.25um_bm05.json +205 -0
  45. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_6.5um_bm05.json +199 -0
  46. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_2.45um_bm05.json +210 -0
  47. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_2.5um_bm05.json +205 -0
  48. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_6.05um_bm05.json +210 -0
  49. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_6.5um_bm05.json +205 -0
  50. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02-lower-lobe-basal_2.45um_bm05.json +210 -0
  51. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02-lower-lobe-basal_6.05um_bm05.json +210 -0
  52. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02b-upper-lobe-apical_2.5um_bm05.json +205 -0
  53. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02b-upper-lobe-medial_6.5um_bm05.json +205 -0
  54. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03-upper-lobe-apical_2.5um_bm05.json +205 -0
  55. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03_6.5um_bm05.json +205 -0
  56. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03b-interlobular-fissure_6.5um_bm05.json +205 -0
  57. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-04-upper-lobe-medial_2.5um_bm05.json +205 -0
  58. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-04b-lower-lobe-basal-medial_6.5um_bm05.json +205 -0
  59. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-05-lower-lobe-basal_2.5um_bm05.json +205 -0
  60. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-05-upper-lobe-apical_6.5um_bm05.json +205 -0
  61. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-06-lower-lobe-basal_2.45um_bm05.json +210 -0
  62. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-06-lower-lobe-basal_6.05um_bm05.json +210 -0
  63. hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_complete-organ_25.08um_bm05.json +204 -0
  64. hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_central-column_1.29um_bm05.json +210 -0
  65. hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_central-column_6.05um_bm05.json +210 -0
  66. hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_complete-organ_25.08um_bm05.json +204 -0
  67. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_cerebellum-occipital_6.05um_bm05.json +210 -0
  68. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_cerebellum_2.45um_bm05.json +210 -0
  69. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_complete-organ_25.08um_bm05.json +204 -0
  70. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_frontal_2.45um_bm05.json +210 -0
  71. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_hippocampus_2.45um_bm05.json +210 -0
  72. hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_hippocampus_6.05um_bm05.json +210 -0
  73. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-01_6.36um_bm18.json +246 -0
  74. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-01_6.5um_bm05.json +205 -0
  75. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-02_6.36um_bm18.json +246 -0
  76. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-02_6.5um_bm05.json +205 -0
  77. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-03_6.36um_bm18.json +246 -0
  78. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-03_6.5um_bm05.json +205 -0
  79. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-04_6.5um_bm05.json +205 -0
  80. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-05_6.36um_bm18.json +246 -0
  81. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-06_6.36um_bm18.json +246 -0
  82. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-07_6.36um_bm18.json +246 -0
  83. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_complete-organ_19.89um_bm18.json +252 -0
  84. hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_complete-organ_25.17um_bm05.json +199 -0
  85. hoa_tools/data/metadata/metadata/LADAF-2020-31_kidney_complete-organ_25.0um_bm05.json +199 -0
  86. hoa_tools/data/metadata/metadata/LADAF-2020-31_kidney_lateral-transect_2.5um_bm05.json +211 -0
  87. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-02_6.54um_bm18.json +258 -0
  88. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-03_6.54um_bm18.json +252 -0
  89. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-13_6.36um_bm18.json +246 -0
  90. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-02.1_2.256um_bm18.json +272 -0
  91. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-03.2_2.256um_bm18.json +266 -0
  92. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-13.1_2.256um_bm18.json +272 -0
  93. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_complete-organ_23.42um_bm18.json +266 -0
  94. hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_complete-organ_25.25um_bm05.json +218 -0
  95. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-01_6.36um_bm18.json +246 -0
  96. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-01_6.5um_bm05.json +265 -0
  97. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-02_6.36um_bm18.json +246 -0
  98. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-02_6.5um_bm05.json +265 -0
  99. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-03_6.36um_bm18.json +246 -0
  100. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-03_6.5um_bm05.json +265 -0
  101. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-04_6.36um_bm18.json +246 -0
  102. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-05_6.36um_bm18.json +246 -0
  103. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-06_6.36um_bm18.json +246 -0
  104. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-07_6.36um_bm18.json +246 -0
  105. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-1.1_2.256um_bm18.json +272 -0
  106. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-1.2_2.256um_bm18.json +272 -0
  107. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-3.1_2.256um_bm18.json +272 -0
  108. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.1_2.256um_bm18.json +272 -0
  109. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.2_2.256um_bm18.json +272 -0
  110. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.3_2.256um_bm18.json +272 -0
  111. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-5.1_2.256um_bm18.json +272 -0
  112. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-7.1_2.256um_bm18.json +272 -0
  113. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_complete-organ_19.85um_bm18.json +240 -0
  114. hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_complete-organ_25.08um_bm05.json +240 -0
  115. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-01.1_2.6um_bm05.json +258 -0
  116. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-01_6.49um_bm05.json +258 -0
  117. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-02.1_2.6um_bm05.json +258 -0
  118. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-02_6.49um_bm05.json +258 -0
  119. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_complete-organ_25.14um_bm05.json +252 -0
  120. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-01.1_2.6um_bm05.json +258 -0
  121. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-01_6.5um_bm05.json +258 -0
  122. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-02.1_2.6um_bm05.json +258 -0
  123. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-02_6.5um_bm05.json +258 -0
  124. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-03.1_2.6um_bm05.json +252 -0
  125. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-03_6.5um_bm05.json +252 -0
  126. hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_complete-organ_25.0um_bm05.json +218 -0
  127. hoa_tools/data/metadata/metadata/LADAF-2021-17_spleen_complete-organ_25.0um_bm05.json +199 -0
  128. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-01_6.51um_bm18.json +246 -0
  129. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-02_6.51um_bm18.json +246 -0
  130. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-04_6.51um_bm18.json +246 -0
  131. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-05_6.51um_bm18.json +246 -0
  132. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-06_6.51um_bm18.json +246 -0
  133. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-07_6.51um_bm18.json +246 -0
  134. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-1.1_2.26um_bm18.json +272 -0
  135. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-1.2_2.26um_bm18.json +272 -0
  136. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-3.1_2.26um_bm18.json +272 -0
  137. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-4.1_2.26um_bm18.json +272 -0
  138. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-4.2_2.26um_bm18.json +272 -0
  139. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-5.1_2.26um_bm18.json +272 -0
  140. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-6.1_2.26um_bm18.json +272 -0
  141. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-7.1_2.26um_bm18.json +272 -0
  142. hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_complete-organ_19.89um_bm18.json +252 -0
  143. hoa_tools/data/metadata/metadata/LADAF-2022-13_kidney_2_complete-organ_15.77um_bm18.json +266 -0
  144. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-01_6.51um_bm18.json +246 -0
  145. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-02_6.51um_bm18.json +246 -0
  146. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-03_6.51um_bm18.json +246 -0
  147. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-04_6.51um_bm18.json +246 -0
  148. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-05_6.51um_bm18.json +246 -0
  149. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-06_6.51um_bm18.json +246 -0
  150. hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-08_6.51um_bm18.json +246 -0
  151. hoa_tools/data/metadata/metadata/S-20-28_heart_complete-organ_19.85um_bm18.json +240 -0
  152. hoa_tools/data/metadata/metadata/S-20-28_heart_complete-organ_25.27um_bm05.json +199 -0
  153. hoa_tools/data/metadata/metadata/S-20-28_kidney_complete-organ_25.0um_bm05.json +199 -0
  154. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01_2.5um_bm05.json +224 -0
  155. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01_6.5um_bm05.json +218 -0
  156. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01b_6.5um_bm05.json +224 -0
  157. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-02_2.5um_bm05.json +224 -0
  158. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-02_6.5um_bm05.json +224 -0
  159. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-03_2.5um_bm05.json +224 -0
  160. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-03_6.5um_bm05.json +224 -0
  161. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-04_2.5um_bm05.json +224 -0
  162. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-04_6.5um_bm05.json +224 -0
  163. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-05_2.5um_bm05.json +224 -0
  164. hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-05_6.5um_bm05.json +224 -0
  165. hoa_tools/data/metadata/metadata/S-20-29_brain_complete-organ_19.57um_bm18.json +240 -0
  166. hoa_tools/data/metadata/metadata/S-20-29_brain_complete-organ_25.33um_bm05.json +199 -0
  167. hoa_tools/data/metadata/metadata/S-20-29_heart_ROI-03_6.5um_bm05.json +205 -0
  168. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-01_2.5um_bm05.json +205 -0
  169. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-02_2.5um_bm05.json +199 -0
  170. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-04_6.5um_bm05.json +205 -0
  171. hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-05b_6.5um_bm05.json +205 -0
  172. hoa_tools/data/metadata/metadata/S-20-29_heart_complete-organ_19.89um_bm18.json +252 -0
  173. hoa_tools/data/metadata/metadata/S-20-29_heart_complete-organ_25.25um_bm05.json +199 -0
  174. hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-01_1.4um_bm05.json +205 -0
  175. hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-01_6.5um_bm05.json +205 -0
  176. hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-02_6.5um_bm05.json +205 -0
  177. hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-03_6.5um_bm05.json +205 -0
  178. hoa_tools/data/metadata/metadata/S-20-29_kidney_complete-organ_25.38um_bm05.json +199 -0
  179. hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-2.1_2.256um_bm18.json +266 -0
  180. hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-3.1_2.256um_bm18.json +272 -0
  181. hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-5.3_2.256um_bm18.json +272 -0
  182. hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-01_6.5um_bm05.json +205 -0
  183. hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-02_6.5um_bm05.json +205 -0
  184. hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-04_6.5um_bm05.json +205 -0
  185. hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-05_6.5um_bm05.json +205 -0
  186. hoa_tools/data/metadata/metadata/S-20-29_lung_left_complete-organ_25.31um_bm05.json +199 -0
  187. hoa_tools/dataset.py +229 -0
  188. hoa_tools/inventory.py +30 -0
  189. hoa_tools/metadata.py +765 -0
  190. hoa_tools/py.typed +0 -0
  191. hoa_tools/registration.py +112 -0
  192. hoa_tools/types.py +59 -0
  193. hoa_tools/voi.py +230 -0
  194. hoa_tools-1.0.dist-info/METADATA +106 -0
  195. hoa_tools-1.0.dist-info/RECORD +198 -0
  196. hoa_tools-1.0.dist-info/WHEEL +5 -0
  197. hoa_tools-1.0.dist-info/licenses/LICENSE.md +27 -0
  198. hoa_tools-1.0.dist-info/top_level.txt +1 -0
hoa_tools/py.typed ADDED
File without changes
@@ -0,0 +1,112 @@
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 numpy as np
12
+ import SimpleITK as sitk
13
+
14
+ from hoa_tools.dataset import _DATASETS, Dataset
15
+ from hoa_tools.types import PhysicalCoordinate
16
+
17
+
18
+ class RegistrationInventory:
19
+ """
20
+ Inventory of transforms between datasets.
21
+
22
+ Transforms are defined as acting on the zyx axes in that order. Note that this
23
+ is different from the order in which the SimpleITK API defines axes in its function
24
+ signatures.
25
+ """
26
+
27
+ def __init__(self) -> None:
28
+ """
29
+ Create registration inventory.
30
+ """
31
+ self._registrations: dict[tuple[str, str], sitk.Transform] = {}
32
+
33
+ def __contains__(self, item: tuple[Dataset, Dataset]) -> bool:
34
+ """
35
+ Check for existence of registration between two datasets.
36
+ """
37
+ return (item[0].name, item[1].name) in self._registrations
38
+
39
+ def get_registration(
40
+ self, *, source_dataset: Dataset, target_dataset: Dataset
41
+ ) -> sitk.Transform:
42
+ """
43
+ Get a registration.
44
+ """
45
+ return self._registrations[(source_dataset.name, target_dataset.name)]
46
+
47
+ def add_registration(
48
+ self,
49
+ *,
50
+ source_dataset: Dataset,
51
+ target_dataset: Dataset,
52
+ transform: sitk.Transform,
53
+ ) -> None:
54
+ """
55
+ Add a new transform to the inventory.
56
+
57
+ Notes
58
+ -----
59
+ This will override any already defined transforms for these two datasets.
60
+
61
+ """
62
+ self._registrations[(source_dataset.name, target_dataset.name)] = transform
63
+ self._registrations[(target_dataset.name, source_dataset.name)] = (
64
+ transform.GetInverse() # type: ignore[no-untyped-call]
65
+ )
66
+
67
+
68
+ def build_transform(
69
+ *, translation: PhysicalCoordinate, rotation_deg: float, scale: float
70
+ ) -> sitk.Similarity3DTransform:
71
+ """
72
+ Build a transform from a translation, scale, and rotation.
73
+ """
74
+ axis = (1, 0, 0)
75
+ center = (0, 0, 0)
76
+ return sitk.Similarity3DTransform( # type: ignore[no-untyped-call]
77
+ scale,
78
+ axis,
79
+ np.deg2rad(rotation_deg),
80
+ (translation.z, translation.y, translation.x),
81
+ center,
82
+ )
83
+
84
+
85
+ Inventory = RegistrationInventory()
86
+
87
+
88
+ def _populate_registrations_from_metadata(inventory: RegistrationInventory) -> None:
89
+ for dataset_name in _DATASETS:
90
+ dataset = _DATASETS[dataset_name]
91
+ if (registration := dataset.registration) is not None:
92
+ source_dataset = _DATASETS[registration.source_dataset]
93
+ target_dataset = _DATASETS[registration.target_dataset]
94
+ transform = build_transform(
95
+ translation=PhysicalCoordinate(
96
+ x=registration.translation[0] * target_dataset.data.voxel_size_um,
97
+ y=registration.translation[1] * target_dataset.data.voxel_size_um,
98
+ z=registration.translation[2] * target_dataset.data.voxel_size_um,
99
+ ),
100
+ rotation_deg=registration.rotation,
101
+ scale=registration.scale
102
+ * target_dataset.data.voxel_size_um
103
+ / source_dataset.data.voxel_size_um,
104
+ )
105
+ Inventory.add_registration(
106
+ source_dataset=_DATASETS[registration.source_dataset],
107
+ target_dataset=_DATASETS[registration.target_dataset],
108
+ transform=transform,
109
+ )
110
+
111
+
112
+ _populate_registrations_from_metadata(Inventory)
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,106 @@
1
+ Metadata-Version: 2.4
2
+ Name: hoa-tools
3
+ Version: 1.0
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: pandas>=2
48
+ Requires-Dist: pydantic>=2
49
+ Requires-Dist: simpleitk
50
+ Requires-Dist: xarray
51
+ Requires-Dist: zarr<3,>2.16
52
+ Provides-Extra: dev
53
+ Requires-Dist: build; extra == "dev"
54
+ Requires-Dist: mypy; extra == "dev"
55
+ Requires-Dist: pre-commit; extra == "dev"
56
+ Requires-Dist: ruff; extra == "dev"
57
+ Requires-Dist: jupyterlab; extra == "dev"
58
+ Requires-Dist: jupytext; extra == "dev"
59
+ Requires-Dist: pandas-stubs; extra == "dev"
60
+ Requires-Dist: datamodel-code-generator; extra == "dev"
61
+ Provides-Extra: docs
62
+ Requires-Dist: mkdocs; extra == "docs"
63
+ Requires-Dist: mkdocstrings-python; extra == "docs"
64
+ Requires-Dist: mkdocs-material; extra == "docs"
65
+ Requires-Dist: mkdocs-jupyter; extra == "docs"
66
+ Requires-Dist: griffe-pydantic; extra == "docs"
67
+ Requires-Dist: matplotlib; extra == "docs"
68
+ Requires-Dist: numpydoc; extra == "docs"
69
+ Requires-Dist: scikit-image; extra == "docs"
70
+ Provides-Extra: test
71
+ Requires-Dist: matplotlib; extra == "test"
72
+ Requires-Dist: pytest; extra == "test"
73
+ Requires-Dist: pytest-accept; extra == "test"
74
+ Requires-Dist: pytest-cov; extra == "test"
75
+ Requires-Dist: pytest-doctestplus; extra == "test"
76
+ Requires-Dist: pytest-vcr; extra == "test"
77
+ Requires-Dist: scikit-image; extra == "test"
78
+ Dynamic: license-file
79
+
80
+ # HOA Tools
81
+
82
+ [![Tests status][tests-badge]][tests-link]
83
+ [![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)
84
+ [![Documentation Status](https://readthedocs.org/projects/hoa-tools/badge/?version=latest)](https://hoa-tools.readthedocs.io/en/latest/?badge=latest)
85
+
86
+ [![License][license-badge]](./LICENSE.md)
87
+
88
+ <!--
89
+ [![PyPI version][pypi-version]][pypi-link]
90
+ [![Conda-Forge][conda-badge]][conda-link]
91
+ [![PyPI platforms][pypi-platforms]][pypi-link]
92
+ -->
93
+
94
+ <!-- prettier-ignore-start -->
95
+ [tests-badge]: https://github.com/HumanOrganAtlas/hoa-tools/actions/workflows/tests.yml/badge.svg
96
+ [tests-link]: https://github.com/HumanOrganAtlas/hoa-tools/actions/workflows/tests.yml
97
+ [conda-badge]: https://img.shields.io/conda/vn/conda-forge/hoa-tools
98
+ [conda-link]: https://github.com/conda-forge/hoa-tools-feedstock
99
+ [pypi-link]: https://pypi.org/project/hoa-tools/
100
+ [pypi-platforms]: https://img.shields.io/pypi/pyversions/hoa-tools
101
+ [pypi-version]: https://img.shields.io/pypi/v/hoa-tools
102
+ [license-badge]: https://img.shields.io/badge/License-BSD_3--Clause-blue.svg
103
+ <!-- prettier-ignore-end -->
104
+
105
+ Tools for working with data from the [Human Organ Atlas](https://human-organ-atlas.esrf.eu/).
106
+ Documentation at https://hoa-tools.readthedocs.io.