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.
- hoa_tools/__init__.py +5 -0
- hoa_tools/_n5.py +10 -0
- hoa_tools/_version.py +34 -0
- hoa_tools/data/metadata/metadata/A129_lung_VOI-02_2.0um_bm18.json +286 -0
- hoa_tools/data/metadata/metadata/A186_lung_right_VOI-3_4.26um_bm18.json +275 -0
- hoa_tools/data/metadata/metadata/A186_lung_right_complete-organ_24.132um_bm18.json +269 -0
- hoa_tools/data/metadata/metadata/AUMC-005_uterus_complete-organ_20.026um_bm18.json +331 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-01_2.5um_bm05.json +211 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-01_6.5um_bm05.json +217 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-02_2.5um_bm05.json +211 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-02_6.5um_bm05.json +217 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-03_2.5um_bm05.json +211 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-03_6.5um_bm05.json +217 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-04_6.5um_bm05.json +211 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-07_2.5um_bm05.json +211 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_VOI-08_2.5um_bm05.json +211 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_central-column_6.24um_bm05.json +214 -0
- hoa_tools/data/metadata/metadata/FO-20-124_lung_upper_lobe_complete-organ_26.38um_bm05.json +208 -0
- hoa_tools/data/metadata/metadata/FO-20-125_lung_complete-organ_26.38um_bm05.json +208 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01.2_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01.2b_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-01_6.24um_bm05.json +214 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-02.2_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-02_6.24um_bm05.json +214 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03.2_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03_6.24um_bm05.json +214 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-03b-bis_2.2um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04-bis_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04.2_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04_6.24um_bm05.json +214 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-05.2_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-05_6.24um_bm05.json +214 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-08.2_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-09.2_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-10.2_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-aa-bis_2.2um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-aa_0.65um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-sx20_6.24um_bm05.json +214 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_complete-upper-lobe-bis_25.25um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_complete-upper-lobe_26.38um_bm05.json +208 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_right_upper_lobe_core-biopsy_2.25um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-135_lung_complete-organ_25.25um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-153_lung_complete-organ_25.25um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col1_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col1_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col2_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col2_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col3_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col4_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col5_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col6_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_col7_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-154_lung_complete-organ_25.25um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_col1_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_col1_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_col2_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_col2_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_col3_2.5um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_col3_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_col4_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_col6_2.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/FO-20-155_lung_complete-organ_25.28um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/FO-20-160_lung_complete-organ_25.0um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/GLR-163_lung_right_lower_lobe_core-biopsy_2.45um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_L-vent-muscle_2.22um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_LR-vent-muscles-ramus-interventricularis-anterior_6.05um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-01_6.5um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-02_6.5um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_ROI-03_6.5um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_complete-organ_19.89um_bm18.json +252 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_heart_complete-organ_25.08um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_central-column_1.29um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_central-column_6.05um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_left_complete-organ_25.08um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_kidney_right_complete-organ_25.0um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_liver_complete-organ_19.61um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_liver_complete-organ_25.25um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_2.51um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_25.25um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-A_6.5um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_2.51um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_25.25um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_FSC-B_6.5um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_2.45um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_2.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_6.05um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-01-upper-lobe-apical_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02-lower-lobe-basal_2.45um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02-lower-lobe-basal_6.05um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02b-upper-lobe-apical_2.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-02b-upper-lobe-medial_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03-upper-lobe-apical_2.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-03b-interlobular-fissure_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-04-upper-lobe-medial_2.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-04b-lower-lobe-basal-medial_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-05-lower-lobe-basal_2.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-05-upper-lobe-apical_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-06-lower-lobe-basal_2.45um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_VOI-06-lower-lobe-basal_6.05um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_left_complete-organ_25.08um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_lung_right_complete-organ_19.61um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_central-column_1.29um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_central-column_6.05um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-27_spleen_complete-organ_25.08um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_cerebellum-occipital_6.05um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_cerebellum_2.45um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_complete-organ_25.08um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_frontal_2.45um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_hippocampus_2.45um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_brain_hippocampus_6.05um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-01_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-01_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-02_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-02_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-03_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-03_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-04_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-05_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-06_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_ROI-07_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_complete-organ_19.89um_bm18.json +252 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_heart_complete-organ_25.17um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_kidney_complete-organ_25.0um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_kidney_lateral-transect_2.5um_bm05.json +211 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-01_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-02_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-03_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-04_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-05_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-06_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-07_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-08_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-09_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-10_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-11_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-12_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-13_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-14_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-15_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-02.1_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-03.2_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_VOI-13.1_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_complete-organ_23.42um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_complete-organ_25.25um_bm05.json +218 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_complete-organ_7.72um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_VOI-01_1.444um_bm05.json +255 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_VOI-01_4.502um_bm18.json +261 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_VOI-07_1.444um_bm05.json +255 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_VOI-11_4.502um_bm18.json +261 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_colon_complete-organ_20.025um_bm18.json +260 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-01_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-01_6.5um_bm05.json +265 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-02_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-02_6.5um_bm05.json +265 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-03_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-03_6.5um_bm05.json +265 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-04_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-05_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-06_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-07_6.36um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-1.1_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-1.2_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-3.1_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.1_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.2_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-4.3_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-5.1_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_ROI-7.1_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_complete-organ_19.85um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_heart_complete-organ_25.08um_bm05.json +252 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-01.1_2.6um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-01_6.49um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-02.1_2.6um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_VOI-02_6.49um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_left_complete-organ_25.14um_bm05.json +252 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-01.1_2.6um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-01_6.5um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-02.1_2.6um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-02_6.5um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-03.1_2.6um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-03_6.5um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_complete-organ_25.0um_bm05.json +218 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_VOI-01_4.14um_bm18.json +233 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_VOI-02_4.14um_bm18.json +233 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_VOI-03_4.14um_bm18.json +233 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_VOI-08_4.14um_bm18.json +233 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_liver_complete-organ_22.56um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_left_complete-organ_22.56um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-01_5.05um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-03_5.05um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-04_5.05um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-05_5.05um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-06_5.05um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-07_5.05um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-08_5.05um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-09_5.05um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-10_5.05um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_VOI-11_5.05um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_lung_right_complete-organ_21.64um_bm18.json +280 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_prostate_complete-scan_23.42um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_spleen_complete-organ_25.0um_bm05.json +218 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_testis_1_VOI-01_2.02um_bm18.json +233 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_testis_1_complete-organ_9.595um_bm18.json +227 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_testis_2_VOI-02_2.02um_bm18.json +233 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_testis_2_complete-organ_9.595um_bm18.json +227 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-01_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-02_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-04_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-05_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-06_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-07_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-1.1_2.26um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-1.2_2.26um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-3.1_2.26um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-4.1_2.26um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-4.2_2.26um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-5.1_2.26um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-6.1_2.26um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_VOI-7.1_2.26um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-64_heart_complete-organ_19.89um_bm18.json +252 -0
- hoa_tools/data/metadata/metadata/LADAF-2022-13_kidney_1_complete-organ_15.77um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2022-13_kidney_2_complete-organ_15.77um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2022-13_prostate_complete-organ_14.72um_bm18.json +244 -0
- hoa_tools/data/metadata/metadata/LADAF-2022-16_prostate_complete-organ_15.75um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2022-16_spleen_complete-organ_15.75um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2022-27_kidney_bottom_complete-organ_15.75um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/LADAF-2022-27_kidney_top_complete-organ_15.75um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-01-tricuspid-valve_12.02um_bm05.json +258 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-01_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-02_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-03_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-04_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-05_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-06_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_VOI-08_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_complete-organ_19.85um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/S-20-28_heart_complete-organ_25.27um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-01_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-01_6.51um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-02_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-02_6.51um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-03_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-04_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-05_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-06_2.5um_bm05.json +218 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_VOI-07_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_complete-organ_25.0um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/S-20-28_lung_right_lower_lobe_overview_19.89um_bm18.json +252 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01_6.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-01b_6.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-02_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-02_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-02_6.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-03_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-03_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-03_6.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-04_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-04_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-04_6.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-05_2.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-05_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-05_6.5um_bm05.json +224 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-06_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_VOI-07_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_complete-organ_19.57um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/S-20-29_brain_complete-organ_25.33um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_ROI-03_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-01_2.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-01_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-01_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-02_2.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-02_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-02_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-03_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-04_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-04_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-05_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-05b_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-06_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-07_6.51um_bm18.json +246 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_complete-organ_19.89um_bm18.json +252 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_complete-organ_25.25um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-01_1.4um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-01_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-02_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-03_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_complete-organ_25.38um_bm05.json +204 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-2.1_2.256um_bm18.json +266 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-3.1_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_ROI-5.3_2.256um_bm18.json +272 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-01_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-02_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-04_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-05_6.5um_bm05.json +210 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_complete-organ_25.31um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/S-21-33_brain_complete-organ_19.57um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/S-21-46_brain_complete-organ_19.57um_bm18.json +240 -0
- hoa_tools/data/metadata/metadata/S-22-16_brain_complete-organ_19.59um_bm18.json +266 -0
- hoa_tools/dataset.py +295 -0
- hoa_tools/inventory.py +30 -0
- hoa_tools/metadata.py +772 -0
- hoa_tools/py.typed +0 -0
- hoa_tools/registration.py +125 -0
- hoa_tools/types.py +59 -0
- hoa_tools/voi.py +230 -0
- hoa_tools-1.0.10.dist-info/METADATA +108 -0
- hoa_tools-1.0.10.dist-info/RECORD +313 -0
- hoa_tools-1.0.10.dist-info/WHEEL +5 -0
- hoa_tools-1.0.10.dist-info/licenses/LICENSE.md +27 -0
- 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
|
+
[](https://results.pre-commit.ci/latest/github/HumanOrganAtlas/hoa-tools/main)
|
|
86
|
+
[](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.
|