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.
- hoa_tools/__init__.py +5 -0
- hoa_tools/_n5.py +10 -0
- hoa_tools/_version.py +21 -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/FO-20-124_lung_upper_lobe_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 +205 -0
- hoa_tools/data/metadata/metadata/FO-20-129_lung_left_upper_lobe_VOI-04-bis_6.5um_bm05.json +205 -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 +205 -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 +199 -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/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_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 +205 -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 +205 -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 +205 -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 +205 -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 +205 -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_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 +210 -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 +199 -0
- hoa_tools/data/metadata/metadata/LADAF-2020-31_kidney_complete-organ_25.0um_bm05.json +199 -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-02_6.54um_bm18.json +258 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_brain_ROI-03_6.54um_bm18.json +252 -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_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 +266 -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_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 +240 -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 +252 -0
- hoa_tools/data/metadata/metadata/LADAF-2021-17_kidney_right_VOI-03_6.5um_bm05.json +252 -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_spleen_complete-organ_25.0um_bm05.json +199 -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_2_complete-organ_15.77um_bm18.json +266 -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 +199 -0
- hoa_tools/data/metadata/metadata/S-20-28_kidney_complete-organ_25.0um_bm05.json +199 -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.5um_bm05.json +218 -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.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.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.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.5um_bm05.json +224 -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 +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-01_2.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-02_2.5um_bm05.json +199 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-04_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_heart_VOI-05b_6.5um_bm05.json +205 -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 +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-01_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-02_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_VOI-03_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_kidney_complete-organ_25.38um_bm05.json +199 -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 +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-02_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-04_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_VOI-05_6.5um_bm05.json +205 -0
- hoa_tools/data/metadata/metadata/S-20-29_lung_left_complete-organ_25.31um_bm05.json +199 -0
- hoa_tools/dataset.py +229 -0
- hoa_tools/inventory.py +30 -0
- hoa_tools/metadata.py +765 -0
- hoa_tools/py.typed +0 -0
- hoa_tools/registration.py +112 -0
- hoa_tools/types.py +59 -0
- hoa_tools/voi.py +230 -0
- hoa_tools-1.0.dist-info/METADATA +106 -0
- hoa_tools-1.0.dist-info/RECORD +198 -0
- hoa_tools-1.0.dist-info/WHEEL +5 -0
- hoa_tools-1.0.dist-info/licenses/LICENSE.md +27 -0
- hoa_tools-1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "S-20-29_lung_left_VOI-05_6.5um_bm05",
|
|
3
|
+
"dataset_type": "zoom",
|
|
4
|
+
"voi": "VOI-05",
|
|
5
|
+
"data": {
|
|
6
|
+
"shape": [3833, 3833, 20077],
|
|
7
|
+
"voxel_size_um": 6.5,
|
|
8
|
+
"gcs_url": "n5://gs://ucl-hip-ct-35a68e99feaae8932b1d44da0358940b/S-20-29/lung-left/6.5um_VOI-05_bm05/"
|
|
9
|
+
},
|
|
10
|
+
"sample": {
|
|
11
|
+
"organ": "lung",
|
|
12
|
+
"organ_context": "left",
|
|
13
|
+
"post_mortem_interval_hours": null,
|
|
14
|
+
"fixation_method": null,
|
|
15
|
+
"fixation_medium": null,
|
|
16
|
+
"organ_infilled": null,
|
|
17
|
+
"stabilisation_medium": null,
|
|
18
|
+
"degassing_method": null,
|
|
19
|
+
"scan_solvent": null,
|
|
20
|
+
"scan_solvent_concentration": null,
|
|
21
|
+
"scan_temperature": "room temperature"
|
|
22
|
+
},
|
|
23
|
+
"donor": {
|
|
24
|
+
"id": "S-20-29",
|
|
25
|
+
"age": 80,
|
|
26
|
+
"sex": "M",
|
|
27
|
+
"weight": 170.0,
|
|
28
|
+
"height": 90.0,
|
|
29
|
+
"cause_of_death": "Acute right heart failure with extensive Pulmonary artery thrombembolism, diffuse alveolar damage, shock kidneys bilateral with acute kidney failure, and acute liver failure COVID-19 disease",
|
|
30
|
+
"date_of_death": null,
|
|
31
|
+
"medical_history": "Kidney failure, arterial hypertension, Z.n. Spondylodesis LWK 2 and sacral vertebra 2, SARS-CoV2 infection, symptoms of memory loss and predementia, Dandy-Walker syndrome variant, post-mortem diagnostic.",
|
|
32
|
+
"diabetes": "Type 2",
|
|
33
|
+
"hypertension": null,
|
|
34
|
+
"smoker": null
|
|
35
|
+
},
|
|
36
|
+
"scan": {
|
|
37
|
+
"date": "2020-11-07",
|
|
38
|
+
"beamline": "BM05",
|
|
39
|
+
"energy": 95.0,
|
|
40
|
+
"current_start": 192.033,
|
|
41
|
+
"filling_mode": null,
|
|
42
|
+
"n_frames": 6000,
|
|
43
|
+
"n_ref": 3,
|
|
44
|
+
"n_dark": 0,
|
|
45
|
+
"latency_time": 0.0015,
|
|
46
|
+
"exposure_time": 0.015,
|
|
47
|
+
"subframe_time": null,
|
|
48
|
+
"n_subframes": 4,
|
|
49
|
+
"scan_type": "zseries",
|
|
50
|
+
"scan_range": 360.0,
|
|
51
|
+
"n_scans": 59,
|
|
52
|
+
"acquisition": "half",
|
|
53
|
+
"z_step": null,
|
|
54
|
+
"scan_time": 420.0,
|
|
55
|
+
"filters": ["Mo 0.1mm", "SiO2 50mm rods 10x5mm"],
|
|
56
|
+
"scintillator": "LuAG:Ce 1000um",
|
|
57
|
+
"optic": "Zoom",
|
|
58
|
+
"optic_magnification": 0.941,
|
|
59
|
+
"distance_source_sample": null,
|
|
60
|
+
"distance_sample_detector": 500.0,
|
|
61
|
+
"sensor_name": "PCO edge 4.2 CLHS",
|
|
62
|
+
"sensor_mode": "rolling shutter",
|
|
63
|
+
"sensor_roi_x_size": 2043,
|
|
64
|
+
"sensor_roi_y_size": 20077,
|
|
65
|
+
"sensor_binning": null,
|
|
66
|
+
"pixel_size": 6.5,
|
|
67
|
+
"xray_magnification": null,
|
|
68
|
+
"technique": "Hierarchical Phase-Contrast Tomography (HiP-CT)",
|
|
69
|
+
"experiment_type": "Tomography"
|
|
70
|
+
},
|
|
71
|
+
"proposal": {
|
|
72
|
+
"proposal_number": "md1252",
|
|
73
|
+
"title": "Multiscale Quantification of Covid-19's impact on lung vasculature from whole lobe to alveolar/microvascular scales",
|
|
74
|
+
"proposers": [
|
|
75
|
+
"Peter Lee",
|
|
76
|
+
"Paul Tafforeau",
|
|
77
|
+
"Danny Jonigk",
|
|
78
|
+
"Maximilian Ackermann",
|
|
79
|
+
"Mark P. Kuhnel",
|
|
80
|
+
"Elodie Boller",
|
|
81
|
+
"Willi Wagner"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"registration": {
|
|
85
|
+
"source_dataset": "S-20-29_lung_left_VOI-05_6.5um_bm05",
|
|
86
|
+
"target_dataset": "S-20-29_lung_left_complete-organ_25.31um_bm05",
|
|
87
|
+
"translation": [1257.7257673685622, 1005.485226013251, 789.8548884643609],
|
|
88
|
+
"rotation": -5.299835000447964,
|
|
89
|
+
"scale": 0.2568154947103331
|
|
90
|
+
},
|
|
91
|
+
"citation": {
|
|
92
|
+
"title": "Zoom (VOI-05) at 6.5um of the lung of donor S-20-29, scanned at ESRF on beamline BM05.",
|
|
93
|
+
"contributors": [
|
|
94
|
+
{
|
|
95
|
+
"first_name": "The",
|
|
96
|
+
"last_name": "Human Organ Atlas Collaboration",
|
|
97
|
+
"orcid": null,
|
|
98
|
+
"roles": []
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"first_name": "Claire",
|
|
102
|
+
"last_name": "Walsh",
|
|
103
|
+
"orcid": "0000-0003-3769-3392",
|
|
104
|
+
"roles": ["Conceptualization", "Funding acquisition"]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"first_name": "Danny",
|
|
108
|
+
"last_name": "Jonigk",
|
|
109
|
+
"orcid": "0000-0002-5251-2281",
|
|
110
|
+
"roles": ["Funding acquisition"]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"first_name": "David",
|
|
114
|
+
"last_name": "Stansby",
|
|
115
|
+
"orcid": "0000-0002-1365-1908",
|
|
116
|
+
"roles": ["Data curation", "Software"]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"first_name": "Elodie",
|
|
120
|
+
"last_name": "Boller",
|
|
121
|
+
"orcid": null,
|
|
122
|
+
"roles": ["Funding acquisition"]
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"first_name": "Guillaume",
|
|
126
|
+
"last_name": "Gaisne",
|
|
127
|
+
"orcid": "0000-0002-3401-7930",
|
|
128
|
+
"roles": ["Data curation", "Software"]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"first_name": "Hector",
|
|
132
|
+
"last_name": "Dejea I Velardo",
|
|
133
|
+
"orcid": "0000-0003-2584-9812",
|
|
134
|
+
"roles": ["Data curation", "Investigation"]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"first_name": "Joanna",
|
|
138
|
+
"last_name": "Purzycka",
|
|
139
|
+
"orcid": "0000-0001-8742-5279",
|
|
140
|
+
"roles": ["Data curation"]
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"first_name": "Joseph",
|
|
144
|
+
"last_name": "Brunet",
|
|
145
|
+
"orcid": "0000-0002-8424-9510",
|
|
146
|
+
"roles": ["Data curation", "Investigation", "Software"]
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"first_name": "Mark",
|
|
150
|
+
"last_name": "P. Kuhnel",
|
|
151
|
+
"orcid": null,
|
|
152
|
+
"roles": ["Funding acquisition"]
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"first_name": "Maximilian",
|
|
156
|
+
"last_name": "Ackermann",
|
|
157
|
+
"orcid": "0000-0001-9996-2477",
|
|
158
|
+
"roles": ["Funding acquisition"]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"first_name": "Paul",
|
|
162
|
+
"last_name": "Tafforeau",
|
|
163
|
+
"orcid": "0000-0002-5962-1683",
|
|
164
|
+
"roles": ["Conceptualization", "Data curation", "Funding acquisition"]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"first_name": "Peter",
|
|
168
|
+
"last_name": "Lee",
|
|
169
|
+
"orcid": "0000-0002-3898-8881",
|
|
170
|
+
"roles": ["Conceptualization", "Funding acquisition"]
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"first_name": "Theresa",
|
|
174
|
+
"last_name": "Urban",
|
|
175
|
+
"orcid": "0000-0002-0352-8180",
|
|
176
|
+
"roles": ["Data curation", "Investigation", "Software"]
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"first_name": "Willi",
|
|
180
|
+
"last_name": "Wagner",
|
|
181
|
+
"orcid": null,
|
|
182
|
+
"roles": ["Funding acquisition"]
|
|
183
|
+
}
|
|
184
|
+
],
|
|
185
|
+
"doi": "10.15151/ESRF-DC-1773964041",
|
|
186
|
+
"author_list": [
|
|
187
|
+
"The Human Organ Atlas Collaboration",
|
|
188
|
+
"Claire Walsh",
|
|
189
|
+
"Danny Jonigk",
|
|
190
|
+
"David Stansby",
|
|
191
|
+
"Elodie Boller",
|
|
192
|
+
"Guillaume Gaisne",
|
|
193
|
+
"Hector Dejea I Velardo",
|
|
194
|
+
"Joanna Purzycka",
|
|
195
|
+
"Joseph Brunet",
|
|
196
|
+
"Mark P. Kuhnel",
|
|
197
|
+
"Maximilian Ackermann",
|
|
198
|
+
"Paul Tafforeau",
|
|
199
|
+
"Peter Lee",
|
|
200
|
+
"Theresa Urban",
|
|
201
|
+
"Willi Wagner"
|
|
202
|
+
]
|
|
203
|
+
},
|
|
204
|
+
"metadata_version": "0.9"
|
|
205
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "S-20-29_lung_left_complete-organ_25.31um_bm05",
|
|
3
|
+
"dataset_type": "overview",
|
|
4
|
+
"voi": "complete-organ",
|
|
5
|
+
"data": {
|
|
6
|
+
"shape": [3814, 5350, 6391],
|
|
7
|
+
"voxel_size_um": 25.31,
|
|
8
|
+
"gcs_url": "n5://gs://ucl-hip-ct-35a68e99feaae8932b1d44da0358940b/S-20-29/lung-left/25.31um_complete-organ_bm05/"
|
|
9
|
+
},
|
|
10
|
+
"sample": {
|
|
11
|
+
"organ": "lung",
|
|
12
|
+
"organ_context": "left",
|
|
13
|
+
"post_mortem_interval_hours": null,
|
|
14
|
+
"fixation_method": null,
|
|
15
|
+
"fixation_medium": null,
|
|
16
|
+
"organ_infilled": null,
|
|
17
|
+
"stabilisation_medium": null,
|
|
18
|
+
"degassing_method": null,
|
|
19
|
+
"scan_solvent": null,
|
|
20
|
+
"scan_solvent_concentration": null,
|
|
21
|
+
"scan_temperature": "room temperature"
|
|
22
|
+
},
|
|
23
|
+
"donor": {
|
|
24
|
+
"id": "S-20-29",
|
|
25
|
+
"age": 80,
|
|
26
|
+
"sex": "M",
|
|
27
|
+
"weight": 170.0,
|
|
28
|
+
"height": 90.0,
|
|
29
|
+
"cause_of_death": "Acute right heart failure with extensive Pulmonary artery thrombembolism, diffuse alveolar damage, shock kidneys bilateral with acute kidney failure, and acute liver failure COVID-19 disease",
|
|
30
|
+
"date_of_death": null,
|
|
31
|
+
"medical_history": "Kidney failure, arterial hypertension, Z.n. Spondylodesis LWK 2 and sacral vertebra 2, SARS-CoV2 infection, symptoms of memory loss and predementia, Dandy-Walker syndrome variant, post-mortem diagnostic.",
|
|
32
|
+
"diabetes": "Type 2",
|
|
33
|
+
"hypertension": null,
|
|
34
|
+
"smoker": null
|
|
35
|
+
},
|
|
36
|
+
"scan": {
|
|
37
|
+
"date": "2020-10-27",
|
|
38
|
+
"beamline": "BM05",
|
|
39
|
+
"energy": 96.0,
|
|
40
|
+
"current_start": 190.786,
|
|
41
|
+
"filling_mode": null,
|
|
42
|
+
"n_frames": 9990,
|
|
43
|
+
"n_ref": 3,
|
|
44
|
+
"n_dark": 0,
|
|
45
|
+
"latency_time": 0.0007,
|
|
46
|
+
"exposure_time": 0.007,
|
|
47
|
+
"subframe_time": null,
|
|
48
|
+
"n_subframes": 4,
|
|
49
|
+
"scan_type": "zseries",
|
|
50
|
+
"scan_range": 360.0,
|
|
51
|
+
"n_scans": null,
|
|
52
|
+
"acquisition": "quarter",
|
|
53
|
+
"z_step": null,
|
|
54
|
+
"scan_time": 330.0,
|
|
55
|
+
"filters": ["Mo 0.1mm", "SiO2 50mm rods 10x5mm"],
|
|
56
|
+
"scintillator": "LuAG:Ce 1000um",
|
|
57
|
+
"optic": "Zoom",
|
|
58
|
+
"optic_magnification": 2.154,
|
|
59
|
+
"distance_source_sample": null,
|
|
60
|
+
"distance_sample_detector": 3650.0,
|
|
61
|
+
"sensor_name": "PCO edge 4.2 CLHS",
|
|
62
|
+
"sensor_mode": "rolling shutter",
|
|
63
|
+
"sensor_roi_x_size": null,
|
|
64
|
+
"sensor_roi_y_size": null,
|
|
65
|
+
"sensor_binning": null,
|
|
66
|
+
"pixel_size": 25.31,
|
|
67
|
+
"xray_magnification": null,
|
|
68
|
+
"technique": "Hierarchical Phase-Contrast Tomography (HiP-CT)",
|
|
69
|
+
"experiment_type": "Tomography"
|
|
70
|
+
},
|
|
71
|
+
"proposal": {
|
|
72
|
+
"proposal_number": "md1252",
|
|
73
|
+
"title": "Multiscale Quantification of Covid-19's impact on lung vasculature from whole lobe to alveolar/microvascular scales",
|
|
74
|
+
"proposers": [
|
|
75
|
+
"Peter Lee",
|
|
76
|
+
"Paul Tafforeau",
|
|
77
|
+
"Danny Jonigk",
|
|
78
|
+
"Maximilian Ackermann",
|
|
79
|
+
"Mark P. Kuhnel",
|
|
80
|
+
"Elodie Boller",
|
|
81
|
+
"Willi Wagner"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"registration": null,
|
|
85
|
+
"citation": {
|
|
86
|
+
"title": "Overview at 25.31um of the lung of donor S-20-29, scanned at ESRF on beamline BM05.",
|
|
87
|
+
"contributors": [
|
|
88
|
+
{
|
|
89
|
+
"first_name": "The",
|
|
90
|
+
"last_name": "Human Organ Atlas Collaboration",
|
|
91
|
+
"orcid": null,
|
|
92
|
+
"roles": []
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"first_name": "Claire",
|
|
96
|
+
"last_name": "Walsh",
|
|
97
|
+
"orcid": "0000-0003-3769-3392",
|
|
98
|
+
"roles": ["Conceptualization", "Funding acquisition"]
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"first_name": "Danny",
|
|
102
|
+
"last_name": "Jonigk",
|
|
103
|
+
"orcid": "0000-0002-5251-2281",
|
|
104
|
+
"roles": ["Funding acquisition"]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"first_name": "David",
|
|
108
|
+
"last_name": "Stansby",
|
|
109
|
+
"orcid": "0000-0002-1365-1908",
|
|
110
|
+
"roles": ["Data curation", "Software"]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"first_name": "Elodie",
|
|
114
|
+
"last_name": "Boller",
|
|
115
|
+
"orcid": null,
|
|
116
|
+
"roles": ["Funding acquisition"]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"first_name": "Guillaume",
|
|
120
|
+
"last_name": "Gaisne",
|
|
121
|
+
"orcid": "0000-0002-3401-7930",
|
|
122
|
+
"roles": ["Data curation", "Software"]
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"first_name": "Hector",
|
|
126
|
+
"last_name": "Dejea I Velardo",
|
|
127
|
+
"orcid": "0000-0003-2584-9812",
|
|
128
|
+
"roles": ["Data curation", "Investigation"]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"first_name": "Joanna",
|
|
132
|
+
"last_name": "Purzycka",
|
|
133
|
+
"orcid": "0000-0001-8742-5279",
|
|
134
|
+
"roles": ["Data curation"]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"first_name": "Joseph",
|
|
138
|
+
"last_name": "Brunet",
|
|
139
|
+
"orcid": "0000-0002-8424-9510",
|
|
140
|
+
"roles": ["Data curation", "Investigation", "Software"]
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"first_name": "Mark",
|
|
144
|
+
"last_name": "P. Kuhnel",
|
|
145
|
+
"orcid": null,
|
|
146
|
+
"roles": ["Funding acquisition"]
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"first_name": "Maximilian",
|
|
150
|
+
"last_name": "Ackermann",
|
|
151
|
+
"orcid": "0000-0001-9996-2477",
|
|
152
|
+
"roles": ["Funding acquisition"]
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"first_name": "Paul",
|
|
156
|
+
"last_name": "Tafforeau",
|
|
157
|
+
"orcid": "0000-0002-5962-1683",
|
|
158
|
+
"roles": ["Conceptualization", "Data curation", "Funding acquisition"]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"first_name": "Peter",
|
|
162
|
+
"last_name": "Lee",
|
|
163
|
+
"orcid": "0000-0002-3898-8881",
|
|
164
|
+
"roles": ["Conceptualization", "Funding acquisition"]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"first_name": "Theresa",
|
|
168
|
+
"last_name": "Urban",
|
|
169
|
+
"orcid": "0000-0002-0352-8180",
|
|
170
|
+
"roles": ["Data curation", "Investigation", "Software"]
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"first_name": "Willi",
|
|
174
|
+
"last_name": "Wagner",
|
|
175
|
+
"orcid": null,
|
|
176
|
+
"roles": ["Funding acquisition"]
|
|
177
|
+
}
|
|
178
|
+
],
|
|
179
|
+
"doi": "10.15151/ESRF-DC-1773966447",
|
|
180
|
+
"author_list": [
|
|
181
|
+
"The Human Organ Atlas Collaboration",
|
|
182
|
+
"Claire Walsh",
|
|
183
|
+
"Danny Jonigk",
|
|
184
|
+
"David Stansby",
|
|
185
|
+
"Elodie Boller",
|
|
186
|
+
"Guillaume Gaisne",
|
|
187
|
+
"Hector Dejea I Velardo",
|
|
188
|
+
"Joanna Purzycka",
|
|
189
|
+
"Joseph Brunet",
|
|
190
|
+
"Mark P. Kuhnel",
|
|
191
|
+
"Maximilian Ackermann",
|
|
192
|
+
"Paul Tafforeau",
|
|
193
|
+
"Peter Lee",
|
|
194
|
+
"Theresa Urban",
|
|
195
|
+
"Willi Wagner"
|
|
196
|
+
]
|
|
197
|
+
},
|
|
198
|
+
"metadata_version": "0.9"
|
|
199
|
+
}
|
hoa_tools/dataset.py
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tools for working with individual datasets.
|
|
3
|
+
|
|
4
|
+
The core class representing a single dataset is [`Dataset`][hoa_tools.dataset.Dataset].
|
|
5
|
+
This inherits from [`HOAMetadata`][hoa_tools.metadata.HOAMetadata],
|
|
6
|
+
which stores all the metadata for a given dataset.
|
|
7
|
+
|
|
8
|
+
[`Dataset`][hoa_tools.dataset.Dataset] objects are not designed to be created by users.
|
|
9
|
+
To get a [`Dataset`][hoa_tools.dataset.Dataset], use the
|
|
10
|
+
[`get_dataset`][hoa_tools.dataset.get_dataset] function in this module.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from functools import cached_property
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Literal
|
|
16
|
+
|
|
17
|
+
import dask.array.core
|
|
18
|
+
import gcsfs
|
|
19
|
+
import numpy as np
|
|
20
|
+
import xarray as xr
|
|
21
|
+
import zarr.core
|
|
22
|
+
import zarr.n5
|
|
23
|
+
import zarr.storage
|
|
24
|
+
|
|
25
|
+
from hoa_tools._n5 import N5FSStore
|
|
26
|
+
from hoa_tools.metadata import HOAMetadata
|
|
27
|
+
|
|
28
|
+
__all__ = ["Dataset", "get_dataset"]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Dataset(HOAMetadata):
|
|
32
|
+
"""
|
|
33
|
+
An individual Human Organ Atlas dataset.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __str__(self) -> str:
|
|
37
|
+
return f"Dataset(name={self.name})"
|
|
38
|
+
|
|
39
|
+
def _organ_str(self) -> str:
|
|
40
|
+
"""
|
|
41
|
+
Get name of organ, with organ context appended if present.
|
|
42
|
+
"""
|
|
43
|
+
organ_str = str(self.sample.organ)
|
|
44
|
+
if self.sample.organ_context:
|
|
45
|
+
organ_str += "_" + self.sample.organ_context
|
|
46
|
+
return organ_str
|
|
47
|
+
|
|
48
|
+
def _voxel_size_str(self) -> str:
|
|
49
|
+
# Make sure that voxel size includes a .0 if an integer value.
|
|
50
|
+
return str(float(self.data.voxel_size_um))
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def is_full_organ(self) -> bool:
|
|
54
|
+
"""
|
|
55
|
+
Whether this dataset contains the whole organ or not.
|
|
56
|
+
"""
|
|
57
|
+
return self.voi.startswith("complete")
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def is_zoom(self) -> bool:
|
|
61
|
+
"""
|
|
62
|
+
Whether this dataset is a zoom or not.
|
|
63
|
+
"""
|
|
64
|
+
return not self.is_full_organ
|
|
65
|
+
|
|
66
|
+
def get_children(self) -> list["Dataset"]:
|
|
67
|
+
"""
|
|
68
|
+
Get child dataset(s).
|
|
69
|
+
|
|
70
|
+
Child datasets are high-resolution zooms of a full-organ dataset.
|
|
71
|
+
|
|
72
|
+
Notes
|
|
73
|
+
-----
|
|
74
|
+
For full-organ datasets, this returns an empty list.
|
|
75
|
+
|
|
76
|
+
"""
|
|
77
|
+
children = [
|
|
78
|
+
d
|
|
79
|
+
for d in _DATASETS.values()
|
|
80
|
+
if (
|
|
81
|
+
d.donor.id == self.donor.id
|
|
82
|
+
and d.sample.organ == self.sample.organ
|
|
83
|
+
and d.scan.beamline == self.scan.beamline
|
|
84
|
+
and d.is_zoom
|
|
85
|
+
)
|
|
86
|
+
]
|
|
87
|
+
return sorted(children, key=lambda c: c.name)
|
|
88
|
+
|
|
89
|
+
def get_parents(self) -> list["Dataset"]:
|
|
90
|
+
"""
|
|
91
|
+
Get parent dataset(s).
|
|
92
|
+
|
|
93
|
+
Parent datasets are full-organ datasets from which a zoom dataset is taken from.
|
|
94
|
+
|
|
95
|
+
Notes
|
|
96
|
+
-----
|
|
97
|
+
For zoom datasets, this returns an empty list.
|
|
98
|
+
|
|
99
|
+
"""
|
|
100
|
+
parents = [
|
|
101
|
+
d
|
|
102
|
+
for d in _DATASETS.values()
|
|
103
|
+
if (
|
|
104
|
+
d.donor.id == self.donor.id
|
|
105
|
+
and d.sample.organ == self.sample.organ
|
|
106
|
+
and d.scan.beamline == self.scan.beamline
|
|
107
|
+
and d.is_full_organ
|
|
108
|
+
)
|
|
109
|
+
]
|
|
110
|
+
return sorted(parents, key=lambda c: c.name)
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def _remote_fmt(self) -> Literal["n5", "zarr"]:
|
|
114
|
+
if self.data.gcs_url.startswith("n5://"):
|
|
115
|
+
return "n5"
|
|
116
|
+
if self.data.gcs_url.startswith("zarr://"):
|
|
117
|
+
return "zarr"
|
|
118
|
+
raise RuntimeError("URL must start with n5:// or zarr://")
|
|
119
|
+
|
|
120
|
+
@cached_property
|
|
121
|
+
def _remote_store(self) -> zarr.Group:
|
|
122
|
+
"""
|
|
123
|
+
Remote data store.
|
|
124
|
+
"""
|
|
125
|
+
gcs_url = self.data.gcs_url
|
|
126
|
+
gcs_path = gcs_url.removeprefix("n5://gs://").removeprefix("zarr://gs://")
|
|
127
|
+
|
|
128
|
+
# n5://gs://ucl-hip-ct-35a68e99feaae8932b1d44da0358940b/S-20-29/heart/2.5um_VOI-01_bm05/
|
|
129
|
+
bucket, path = gcs_path.split("/", maxsplit=1)
|
|
130
|
+
fs = gcsfs.GCSFileSystem(project=bucket, token="anon", access="read_only") # noqa: S106
|
|
131
|
+
if self._remote_fmt == "n5":
|
|
132
|
+
store = N5FSStore(url=bucket, fs=fs, mode="r")
|
|
133
|
+
elif self._remote_fmt == "zarr":
|
|
134
|
+
store = zarr.storage.FSStore(url=bucket, fs=fs, mode="r")
|
|
135
|
+
|
|
136
|
+
return zarr.open_group(store, mode="r", path=path)
|
|
137
|
+
|
|
138
|
+
def _remote_array(self, *, downsample_level: int) -> zarr.core.Array:
|
|
139
|
+
"""
|
|
140
|
+
Get an object representing the data array in the remote Google Cloud Store.
|
|
141
|
+
"""
|
|
142
|
+
if not downsample_level >= 0:
|
|
143
|
+
msg = "level must be >= 0"
|
|
144
|
+
raise ValueError(msg)
|
|
145
|
+
|
|
146
|
+
if self._remote_fmt == "n5":
|
|
147
|
+
key = f"s{downsample_level}"
|
|
148
|
+
else:
|
|
149
|
+
key = f"{downsample_level}"
|
|
150
|
+
return self._remote_store[key]
|
|
151
|
+
|
|
152
|
+
def data_array(self, *, downsample_level: int) -> xr.DataArray:
|
|
153
|
+
"""
|
|
154
|
+
Get a DataArray representing the array for this image.
|
|
155
|
+
"""
|
|
156
|
+
remote_array = self._remote_array(downsample_level=downsample_level)
|
|
157
|
+
dask_array = dask.array.core.from_array( # type: ignore[no-untyped-call]
|
|
158
|
+
remote_array, chunks=remote_array.chunks
|
|
159
|
+
)
|
|
160
|
+
if self._remote_fmt == "zarr":
|
|
161
|
+
dask_array = dask_array.T
|
|
162
|
+
|
|
163
|
+
spacing = self.data.voxel_size_um * 2**downsample_level
|
|
164
|
+
return xr.DataArray(
|
|
165
|
+
dask_array,
|
|
166
|
+
name=self.name,
|
|
167
|
+
dims=["z", "y", "x"],
|
|
168
|
+
coords={
|
|
169
|
+
"z": xr.DataArray(
|
|
170
|
+
data=(np.arange(dask_array.shape[0]) * spacing),
|
|
171
|
+
dims=["z"],
|
|
172
|
+
attrs={"units": "μm"},
|
|
173
|
+
),
|
|
174
|
+
"y": xr.DataArray(
|
|
175
|
+
data=(np.arange(dask_array.shape[1]) * spacing),
|
|
176
|
+
dims=["y"],
|
|
177
|
+
attrs={"units": "μm"},
|
|
178
|
+
),
|
|
179
|
+
"x": xr.DataArray(
|
|
180
|
+
data=(np.arange(dask_array.shape[2]) * spacing),
|
|
181
|
+
dims=["x"],
|
|
182
|
+
attrs={"units": "μm"},
|
|
183
|
+
),
|
|
184
|
+
},
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def _get_datasets(data_dir: Path) -> dict[str, Dataset]:
|
|
189
|
+
"""
|
|
190
|
+
Load dataset metadtata files.
|
|
191
|
+
"""
|
|
192
|
+
return {
|
|
193
|
+
f.stem: Dataset.model_validate_json(f.read_text())
|
|
194
|
+
for f in (data_dir).glob("*.json")
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
_META_DIR = Path(__file__).parent / "data" / "metadata" / "metadata"
|
|
199
|
+
_DATASETS = _get_datasets(_META_DIR)
|
|
200
|
+
if len(_DATASETS) == 0:
|
|
201
|
+
raise ImportError(
|
|
202
|
+
"Did not find any dataset metadata files. "
|
|
203
|
+
"This means there is something wrong with the hoa-tools installation. "
|
|
204
|
+
"If you are installing from source, you might need to "
|
|
205
|
+
"initialise and fetch git submodules. "
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def get_dataset(name: str) -> Dataset:
|
|
210
|
+
"""
|
|
211
|
+
Get a dataset from its name.
|
|
212
|
+
|
|
213
|
+
The name of datasets can be looked up using the `hoa_tools.inventory` module.
|
|
214
|
+
"""
|
|
215
|
+
return _DATASETS[name]
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def change_metadata_directory(data_dir: Path) -> None:
|
|
219
|
+
"""
|
|
220
|
+
Update available datasets from another directory of metadata files.
|
|
221
|
+
|
|
222
|
+
Designed for internal project members to load metadata files that aren't yet public.
|
|
223
|
+
"""
|
|
224
|
+
global _DATASETS # noqa: PLW0603
|
|
225
|
+
_DATASETS = _get_datasets(data_dir)
|
|
226
|
+
if len(_DATASETS) == 0:
|
|
227
|
+
raise FileNotFoundError(
|
|
228
|
+
f"Did not find any dataset metadata files at {data_dir}" # noqa: EM102
|
|
229
|
+
)
|
hoa_tools/inventory.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tools for working with the dataset inventory.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import pandas as pd
|
|
6
|
+
|
|
7
|
+
from hoa_tools.dataset import _DATASETS
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load_inventory() -> pd.DataFrame:
|
|
11
|
+
"""
|
|
12
|
+
Load the dataset inventory.
|
|
13
|
+
|
|
14
|
+
Returns
|
|
15
|
+
-------
|
|
16
|
+
inventory :
|
|
17
|
+
Dataset inventory.
|
|
18
|
+
|
|
19
|
+
"""
|
|
20
|
+
data = [
|
|
21
|
+
{
|
|
22
|
+
"donor": d.donor.id,
|
|
23
|
+
"organ": d.sample.organ,
|
|
24
|
+
"organ_context": d.sample.organ_context,
|
|
25
|
+
"voi": d.voi,
|
|
26
|
+
"voxel_size_um": d.data.voxel_size_um,
|
|
27
|
+
}
|
|
28
|
+
for d in _DATASETS.values()
|
|
29
|
+
]
|
|
30
|
+
return pd.DataFrame(data=data, index=list(_DATASETS.keys()))
|