brainles-preprocessing 0.6.0__tar.gz → 0.6.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/PKG-INFO +11 -4
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/README.md +9 -3
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/modality.py +1 -2
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/preprocessor/atlas_centric_preprocessor.py +89 -86
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/preprocessor/native_space_preprocessor.py +75 -73
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/preprocessor/preprocessor.py +25 -19
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/transform.py +2 -4
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/utils/zenodo.py +1 -6
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/pyproject.toml +2 -1
- brainles_preprocessing-0.6.0/brainles_preprocessing/utils/logging_utils.py +0 -131
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/LICENSE +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/brain_extraction/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/brain_extraction/brain_extractor.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/brats/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/brats/t1_centric.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/brats/t1c_centric.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/cli.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/constants.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/defacing/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/defacing/defacer.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/defacing/quickshear/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/defacing/quickshear/nipy_quickshear.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/defacing/quickshear/quickshear.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/n4_bias_correction/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/n4_bias_correction/n4_bias_corrector.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/n4_bias_correction/sitk/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/n4_bias_correction/sitk/sitk_n4_bias_corrector.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/normalization/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/normalization/normalizer_base.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/normalization/percentile_normalizer.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/normalization/windowing_normalizer.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/preprocessor/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/ANTs/ANTs.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/ANTs/TODO_ANTs_parameters.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/ANTs/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/elastix/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/elastix/elastix.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/greedy/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/greedy/greedy.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/groupwise_niftyreg_params.sh +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/groupwise_niftyreg_run.sh +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/reg_aladin +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/reg_average +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/reg_f3d +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/reg_jacobian +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/reg_measure +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/reg_resample +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/reg_tools +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/bin/reg_transform +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/AffineDeformationFieldKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/AladinContent.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/BlockMatchingKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/CPUAffineDeformationFieldKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/CPUBlockMatchingKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/CPUConvolutionKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/CPUKernelFactory.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/CPUOptimiseKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/CPUResampleImageKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/ConvolutionKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/Kernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/KernelFactory.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/OptimiseKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/Platform.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/ResampleImageKernel.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_ReadWriteImage.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_ReadWriteMatrix.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_aladin.cpp +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_aladin.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_aladin_sym.cpp +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_aladin_sym.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_base.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_blockMatching.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_dti.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_f3d.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_f3d2.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_f3d_sym.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_femTrans.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_globalTrans.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_kld.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_lncc.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_localTrans.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_localTrans_jac.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_localTrans_regul.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_macros.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_maths.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_maths_eigen.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_measure.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_mind.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_nmi.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_optimiser.cpp +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_optimiser.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_resampling.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_splineBasis.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_ssd.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_stringFormat.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/_reg_tools.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/nifti1.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/nifti1_io.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/png.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/pngconf.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/pngdebug.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/pnginfo.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/pnglibconf.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/pngpriv.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/pngstruct.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/readpng.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/reg_png.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/zlib.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/znzlib.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/niftyreg_1.5.68/include/zutil.h +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/reg_aladin +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/reg_resample +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/rigid_reg.sh +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/niftyreg/niftyreg_scripts/transform.sh +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/registration/registrator.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/utils/__init__.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/utils/citation_reminder.py +0 -0
- {brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/utils/generic.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: brainles_preprocessing
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.1
|
|
4
4
|
Summary: Tool for preprocessing tasks in biomedical imaging, with a focus on (but not limited to) multi-modal brain MRI
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Keywords: brain tumor,glioma,BraTS,skullstripping,brain extraction
|
|
@@ -23,6 +23,7 @@ Requires-Dist: antspyx (>=0.5.4,<1.0.0)
|
|
|
23
23
|
Requires-Dist: auxiliary (>=0.3.1)
|
|
24
24
|
Requires-Dist: brainles_hd_bet (>=0.0.10,<1.0.0)
|
|
25
25
|
Requires-Dist: itk-elastix (>=0.20.0,<0.21.0) ; extra == "all" or extra == "itk-elastix"
|
|
26
|
+
Requires-Dist: loguru (>=0.7.3,<0.8.0)
|
|
26
27
|
Requires-Dist: nibabel (>=3.2.1)
|
|
27
28
|
Requires-Dist: numpy (>=1.23.0,<2.0.0)
|
|
28
29
|
Requires-Dist: pathlib (>=1.0.1,<2.0.0)
|
|
@@ -176,11 +177,17 @@ We provide a (WIP) documentation. Have a look [here](https://brainles-preprocess
|
|
|
176
177
|
Please credit the authors by citing their work.
|
|
177
178
|
|
|
178
179
|
### Registration
|
|
179
|
-
We currently provide support for [ANTs](https://github.com/ANTsX/ANTs) (default), [Niftyreg](https://github.com/KCL-BMEIS/niftyreg) (Linux).
|
|
180
|
+
We currently provide support for [ANTs](https://github.com/ANTsX/ANTs) (default), [Niftyreg](https://github.com/KCL-BMEIS/niftyreg) (Linux). We also offer basic support for [greedy](https://greedy.readthedocs.io/en/latest/reference.html#greedy-usage) and [elastix](https://pypi.org/project/itk-elastix/0.13.0/).
|
|
180
181
|
|
|
181
182
|
### Atlas Reference
|
|
182
|
-
We provide
|
|
183
|
-
|
|
183
|
+
We provide a range of different atlases, namely:
|
|
184
|
+
- [SRI24](https://www.nitrc.org/frs/download.php/4502/sri24_anatomy_unstripped_nifti.zip) and its [skull-stripped version](https://www.nitrc.org/frs/download.php/4499/sri24_anatomy_nifti.zip)
|
|
185
|
+
- A slightly modified SRI24 atlas as found in the BraTS challenges (also with a skull-stripped version)
|
|
186
|
+
- MNI152: [MNI_ICBM_2009c_Nonlinear_Symmetric](https://nist.mni.mcgill.ca/icbm-152-nonlinear-atlases-2009/)
|
|
187
|
+
- A slightly modified MNI152 atlas as found in the BraTS challenge
|
|
188
|
+
|
|
189
|
+
We also support supplying a custom atlas in NIfTI format
|
|
190
|
+
|
|
184
191
|
|
|
185
192
|
### N4 Bias correction
|
|
186
193
|
We currently provide support for N4 Bias correction based on [SimpleITK](https://simpleitk.org/)
|
|
@@ -138,11 +138,17 @@ We provide a (WIP) documentation. Have a look [here](https://brainles-preprocess
|
|
|
138
138
|
Please credit the authors by citing their work.
|
|
139
139
|
|
|
140
140
|
### Registration
|
|
141
|
-
We currently provide support for [ANTs](https://github.com/ANTsX/ANTs) (default), [Niftyreg](https://github.com/KCL-BMEIS/niftyreg) (Linux).
|
|
141
|
+
We currently provide support for [ANTs](https://github.com/ANTsX/ANTs) (default), [Niftyreg](https://github.com/KCL-BMEIS/niftyreg) (Linux). We also offer basic support for [greedy](https://greedy.readthedocs.io/en/latest/reference.html#greedy-usage) and [elastix](https://pypi.org/project/itk-elastix/0.13.0/).
|
|
142
142
|
|
|
143
143
|
### Atlas Reference
|
|
144
|
-
We provide
|
|
145
|
-
|
|
144
|
+
We provide a range of different atlases, namely:
|
|
145
|
+
- [SRI24](https://www.nitrc.org/frs/download.php/4502/sri24_anatomy_unstripped_nifti.zip) and its [skull-stripped version](https://www.nitrc.org/frs/download.php/4499/sri24_anatomy_nifti.zip)
|
|
146
|
+
- A slightly modified SRI24 atlas as found in the BraTS challenges (also with a skull-stripped version)
|
|
147
|
+
- MNI152: [MNI_ICBM_2009c_Nonlinear_Symmetric](https://nist.mni.mcgill.ca/icbm-152-nonlinear-atlases-2009/)
|
|
148
|
+
- A slightly modified MNI152 atlas as found in the BraTS challenge
|
|
149
|
+
|
|
150
|
+
We also support supplying a custom atlas in NIfTI format
|
|
151
|
+
|
|
146
152
|
|
|
147
153
|
### N4 Bias correction
|
|
148
154
|
We currently provide support for N4 Bias correction based on [SimpleITK](https://simpleitk.org/)
|
{brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/modality.py
RENAMED
|
@@ -5,6 +5,7 @@ from pathlib import Path
|
|
|
5
5
|
from typing import Dict, Optional, Union
|
|
6
6
|
|
|
7
7
|
from auxiliary.io import read_image, write_image
|
|
8
|
+
from loguru import logger
|
|
8
9
|
|
|
9
10
|
from brainles_preprocessing.brain_extraction.brain_extractor import BrainExtractor
|
|
10
11
|
from brainles_preprocessing.constants import Atlas, PreprocessorSteps
|
|
@@ -17,8 +18,6 @@ from brainles_preprocessing.registration import ( # TODO: this will throw warni
|
|
|
17
18
|
from brainles_preprocessing.registration.registrator import Registrator
|
|
18
19
|
from brainles_preprocessing.utils.zenodo import verify_or_download_atlases
|
|
19
20
|
|
|
20
|
-
logger = logging.getLogger(__name__)
|
|
21
|
-
|
|
22
21
|
|
|
23
22
|
class Modality:
|
|
24
23
|
"""
|
|
@@ -2,6 +2,8 @@ import shutil
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import List, Optional, Union
|
|
4
4
|
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
5
7
|
from brainles_preprocessing.brain_extraction.brain_extractor import BrainExtractor
|
|
6
8
|
from brainles_preprocessing.constants import Atlas, PreprocessorSteps
|
|
7
9
|
from brainles_preprocessing.defacing import Defacer, QuickshearDefacer
|
|
@@ -9,12 +11,8 @@ from brainles_preprocessing.modality import CenterModality, Modality
|
|
|
9
11
|
from brainles_preprocessing.n4_bias_correction import N4BiasCorrector
|
|
10
12
|
from brainles_preprocessing.preprocessor.preprocessor import BasePreprocessor
|
|
11
13
|
from brainles_preprocessing.registration.registrator import Registrator
|
|
12
|
-
from brainles_preprocessing.utils.logging_utils import LoggingManager
|
|
13
14
|
from brainles_preprocessing.utils.zenodo import verify_or_download_atlases
|
|
14
15
|
|
|
15
|
-
logging_man = LoggingManager(name=__name__)
|
|
16
|
-
logger = logging_man.get_logger()
|
|
17
|
-
|
|
18
16
|
|
|
19
17
|
class AtlasCentricPreprocessor(BasePreprocessor):
|
|
20
18
|
"""
|
|
@@ -101,97 +99,102 @@ class AtlasCentricPreprocessor(BasePreprocessor):
|
|
|
101
99
|
Results are saved in the specified directories, allowing for modular and configurable output storage.
|
|
102
100
|
"""
|
|
103
101
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
# Co-register moving modalities to center modality
|
|
116
|
-
logger.info(f"{' Starting Coregistration ':-^80}")
|
|
117
|
-
self.run_coregistration(
|
|
118
|
-
save_dir_coregistration=save_dir_coregistration,
|
|
119
|
-
)
|
|
120
|
-
logger.info(
|
|
121
|
-
f"Coregistration complete. Output saved to {save_dir_coregistration}"
|
|
122
|
-
)
|
|
123
|
-
|
|
124
|
-
# Register center modality to atlas
|
|
125
|
-
logger.info(f"{' Starting atlas registration ':-^80}")
|
|
126
|
-
self.run_atlas_registration(
|
|
127
|
-
save_dir_atlas_registration=save_dir_atlas_registration,
|
|
128
|
-
)
|
|
129
|
-
logger.info(
|
|
130
|
-
f"Transformations complete. Output saved to {save_dir_atlas_registration}"
|
|
131
|
-
)
|
|
102
|
+
logger_id = self._add_log_file_handler(log_file)
|
|
103
|
+
try:
|
|
104
|
+
logger.info(f"{' Starting preprocessing ':=^80}")
|
|
105
|
+
modality_names = ", ".join(
|
|
106
|
+
[modality.modality_name for modality in self.moving_modalities]
|
|
107
|
+
)
|
|
108
|
+
logger.info(
|
|
109
|
+
f"Received center modality: {self.center_modality.modality_name} "
|
|
110
|
+
f"and moving modalities: {modality_names}"
|
|
111
|
+
)
|
|
132
112
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
113
|
+
# Co-register moving modalities to center modality
|
|
114
|
+
logger.info(f"{' Starting Coregistration ':-^80}")
|
|
115
|
+
self.run_coregistration(
|
|
116
|
+
save_dir_coregistration=save_dir_coregistration,
|
|
117
|
+
)
|
|
118
|
+
logger.info(
|
|
119
|
+
f"Coregistration complete. Output saved to {save_dir_coregistration}"
|
|
120
|
+
)
|
|
138
121
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
122
|
+
# Register center modality to atlas
|
|
123
|
+
logger.info(f"{' Starting atlas registration ':-^80}")
|
|
124
|
+
self.run_atlas_registration(
|
|
125
|
+
save_dir_atlas_registration=save_dir_atlas_registration,
|
|
126
|
+
)
|
|
127
|
+
logger.info(
|
|
128
|
+
f"Transformations complete. Output saved to {save_dir_atlas_registration}"
|
|
129
|
+
)
|
|
144
130
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
modality.raw_skull_output_path,
|
|
151
|
-
normalization=False,
|
|
152
|
-
)
|
|
153
|
-
if modality.normalized_skull_output_path:
|
|
154
|
-
modality.save_current_image(
|
|
155
|
-
modality.normalized_skull_output_path,
|
|
156
|
-
normalization=True,
|
|
157
|
-
)
|
|
131
|
+
# Optional: additional correction in atlas space
|
|
132
|
+
logger.info(f"{' Checking optional atlas correction ':-^80}")
|
|
133
|
+
self.run_atlas_correction(
|
|
134
|
+
save_dir_atlas_correction=save_dir_atlas_correction,
|
|
135
|
+
)
|
|
158
136
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
137
|
+
# Optional: N4 bias correction
|
|
138
|
+
logger.info(f"{' Checking optional N4 bias correction ':-^80}")
|
|
139
|
+
self.run_n4_bias_correction(
|
|
140
|
+
save_dir_n4_bias_correction=save_dir_n4_bias_correction,
|
|
141
|
+
)
|
|
164
142
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
143
|
+
# Now we save images that are not skullstripped (current image = atlas registered or atlas registered + corrected)
|
|
144
|
+
logger.info("Saving non skull-stripped images...")
|
|
145
|
+
for modality in self.all_modalities:
|
|
146
|
+
if modality.raw_skull_output_path:
|
|
147
|
+
modality.save_current_image(
|
|
148
|
+
modality.raw_skull_output_path,
|
|
149
|
+
normalization=False,
|
|
150
|
+
)
|
|
151
|
+
if modality.normalized_skull_output_path:
|
|
152
|
+
modality.save_current_image(
|
|
153
|
+
modality.normalized_skull_output_path,
|
|
154
|
+
normalization=True,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# Optional: Brain extraction
|
|
158
|
+
logger.info(f"{' Checking optional brain extraction ':-^80}")
|
|
159
|
+
self.run_brain_extraction(
|
|
160
|
+
save_dir_brain_extraction=save_dir_brain_extraction,
|
|
161
|
+
)
|
|
170
162
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
163
|
+
# Defacing
|
|
164
|
+
logger.info(f"{' Checking optional defacing ':-^80}")
|
|
165
|
+
self.run_defacing(
|
|
166
|
+
save_dir_defacing=save_dir_defacing,
|
|
167
|
+
)
|
|
174
168
|
|
|
175
|
-
#
|
|
176
|
-
|
|
177
|
-
|
|
169
|
+
# move to separate method
|
|
170
|
+
if save_dir_transformations:
|
|
171
|
+
save_dir_transformations = Path(save_dir_transformations)
|
|
178
172
|
|
|
179
|
-
|
|
180
|
-
|
|
173
|
+
# Save transformation matrices
|
|
174
|
+
logger.info(
|
|
175
|
+
f"Saving transformation matrices to {save_dir_transformations}"
|
|
181
176
|
)
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
177
|
+
for modality in self.all_modalities:
|
|
178
|
+
|
|
179
|
+
modality_transformations_dir = (
|
|
180
|
+
save_dir_transformations / modality.modality_name
|
|
181
|
+
)
|
|
182
|
+
modality_transformations_dir.mkdir(exist_ok=True, parents=True)
|
|
183
|
+
for step, path in modality.transformation_paths.items():
|
|
184
|
+
if path is not None:
|
|
185
|
+
shutil.copyfile(
|
|
186
|
+
src=str(path.absolute()),
|
|
187
|
+
dst=str(
|
|
188
|
+
modality_transformations_dir
|
|
189
|
+
/ f"{step.value}_{path.name}"
|
|
190
|
+
),
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
# End
|
|
194
|
+
logger.info(f"{' Preprocessing complete ':=^80}")
|
|
195
|
+
finally:
|
|
196
|
+
# Remove log file handler if it was added
|
|
197
|
+
logger.remove(logger_id)
|
|
195
198
|
|
|
196
199
|
def run_atlas_registration(
|
|
197
200
|
self, save_dir_atlas_registration: Optional[Union[str, Path]] = None
|
|
@@ -2,12 +2,10 @@ import shutil
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import Optional, Union
|
|
4
4
|
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
5
7
|
from brainles_preprocessing.defacing import QuickshearDefacer
|
|
6
8
|
from brainles_preprocessing.preprocessor.preprocessor import BasePreprocessor
|
|
7
|
-
from brainles_preprocessing.utils.logging_utils import LoggingManager
|
|
8
|
-
|
|
9
|
-
logging_man = LoggingManager(name=__name__)
|
|
10
|
-
logger = logging_man.get_logger()
|
|
11
9
|
|
|
12
10
|
|
|
13
11
|
class NativeSpacePreprocessor(BasePreprocessor):
|
|
@@ -57,81 +55,85 @@ class NativeSpacePreprocessor(BasePreprocessor):
|
|
|
57
55
|
Results are saved in the specified directories, allowing for modular and configurable output storage.
|
|
58
56
|
"""
|
|
59
57
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
# Co-register moving modalities to center modality
|
|
72
|
-
logger.info(f"{' Starting Coregistration ':-^80}")
|
|
73
|
-
self.run_coregistration(
|
|
74
|
-
save_dir_coregistration=save_dir_coregistration,
|
|
75
|
-
)
|
|
76
|
-
logger.info(
|
|
77
|
-
f"Coregistration complete. Output saved to {save_dir_coregistration}"
|
|
78
|
-
)
|
|
79
|
-
# Optional: N4 bias correction
|
|
80
|
-
logger.info(f"{' Checking optional N4 bias correction ':-^80}")
|
|
81
|
-
self.run_n4_bias_correction(
|
|
82
|
-
save_dir_n4_bias_correction=save_dir_n4_bias_correction,
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
# Now we save images that are not skullstripped (current image = atlas registered or atlas registered + corrected)
|
|
86
|
-
logger.info("Saving non skull-stripped images...")
|
|
87
|
-
for modality in self.all_modalities:
|
|
88
|
-
if modality.raw_skull_output_path:
|
|
89
|
-
modality.save_current_image(
|
|
90
|
-
modality.raw_skull_output_path,
|
|
91
|
-
normalization=False,
|
|
92
|
-
)
|
|
93
|
-
if modality.normalized_skull_output_path:
|
|
94
|
-
modality.save_current_image(
|
|
95
|
-
modality.normalized_skull_output_path,
|
|
96
|
-
normalization=True,
|
|
97
|
-
)
|
|
58
|
+
logger_id = self._add_log_file_handler(log_file)
|
|
59
|
+
try:
|
|
60
|
+
logger.info(f"{' Starting preprocessing ':=^80}")
|
|
61
|
+
modality_names = ", ".join(
|
|
62
|
+
[modality.modality_name for modality in self.moving_modalities]
|
|
63
|
+
)
|
|
64
|
+
logger.info(
|
|
65
|
+
f"Received center modality: {self.center_modality.modality_name} "
|
|
66
|
+
f"and moving modalities: {modality_names}"
|
|
67
|
+
)
|
|
98
68
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
69
|
+
# Co-register moving modalities to center modality
|
|
70
|
+
logger.info(f"{' Starting Coregistration ':-^80}")
|
|
71
|
+
self.run_coregistration(
|
|
72
|
+
save_dir_coregistration=save_dir_coregistration,
|
|
73
|
+
)
|
|
74
|
+
logger.info(
|
|
75
|
+
f"Coregistration complete. Output saved to {save_dir_coregistration}"
|
|
76
|
+
)
|
|
77
|
+
# Optional: N4 bias correction
|
|
78
|
+
logger.info(f"{' Checking optional N4 bias correction ':-^80}")
|
|
79
|
+
self.run_n4_bias_correction(
|
|
80
|
+
save_dir_n4_bias_correction=save_dir_n4_bias_correction,
|
|
81
|
+
)
|
|
104
82
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
83
|
+
# Now we save images that are not skullstripped (current image = atlas registered or atlas registered + corrected)
|
|
84
|
+
logger.info("Saving non skull-stripped images...")
|
|
85
|
+
for modality in self.all_modalities:
|
|
86
|
+
if modality.raw_skull_output_path:
|
|
87
|
+
modality.save_current_image(
|
|
88
|
+
modality.raw_skull_output_path,
|
|
89
|
+
normalization=False,
|
|
90
|
+
)
|
|
91
|
+
if modality.normalized_skull_output_path:
|
|
92
|
+
modality.save_current_image(
|
|
93
|
+
modality.normalized_skull_output_path,
|
|
94
|
+
normalization=True,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Optional: Brain extraction
|
|
98
|
+
logger.info(f"{' Checking optional brain extraction ':-^80}")
|
|
99
|
+
self.run_brain_extraction(
|
|
100
|
+
save_dir_brain_extraction=save_dir_brain_extraction,
|
|
101
|
+
)
|
|
110
102
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
103
|
+
# Defacing
|
|
104
|
+
logger.info(f"{' Checking optional defacing ':-^80}")
|
|
105
|
+
self.run_defacing(
|
|
106
|
+
save_dir_defacing=save_dir_defacing,
|
|
107
|
+
)
|
|
114
108
|
|
|
115
|
-
#
|
|
116
|
-
|
|
117
|
-
|
|
109
|
+
# move to separate method
|
|
110
|
+
if save_dir_transformations:
|
|
111
|
+
save_dir_transformations = Path(save_dir_transformations)
|
|
118
112
|
|
|
119
|
-
|
|
120
|
-
|
|
113
|
+
# Save transformation matrices
|
|
114
|
+
logger.info(
|
|
115
|
+
f"Saving transformation matrices to {save_dir_transformations}"
|
|
121
116
|
)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
117
|
+
for modality in self.all_modalities:
|
|
118
|
+
|
|
119
|
+
modality_transformations_dir = (
|
|
120
|
+
save_dir_transformations / modality.modality_name
|
|
121
|
+
)
|
|
122
|
+
modality_transformations_dir.mkdir(exist_ok=True, parents=True)
|
|
123
|
+
for step, path in modality.transformation_paths.items():
|
|
124
|
+
if path is not None:
|
|
125
|
+
shutil.copyfile(
|
|
126
|
+
src=str(path.absolute()),
|
|
127
|
+
dst=str(
|
|
128
|
+
modality_transformations_dir
|
|
129
|
+
/ f"{step.value}_{path.name}"
|
|
130
|
+
),
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# End
|
|
134
|
+
logger.info(f"{' Preprocessing complete ':=^80}")
|
|
135
|
+
finally:
|
|
136
|
+
logger.remove(logger_id)
|
|
135
137
|
|
|
136
138
|
def run_defacing(
|
|
137
139
|
self, save_dir_defacing: Optional[Union[str, Path]] = None
|
|
@@ -5,10 +5,12 @@ import tempfile
|
|
|
5
5
|
import warnings
|
|
6
6
|
from abc import ABC, abstractmethod
|
|
7
7
|
from collections import Counter
|
|
8
|
-
from
|
|
8
|
+
from datetime import datetime
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from typing import List, Optional, Union
|
|
11
11
|
|
|
12
|
+
from loguru import logger
|
|
13
|
+
|
|
12
14
|
from brainles_preprocessing.brain_extraction.brain_extractor import (
|
|
13
15
|
BrainExtractor,
|
|
14
16
|
HDBetExtractor,
|
|
@@ -23,10 +25,6 @@ from brainles_preprocessing.n4_bias_correction import (
|
|
|
23
25
|
from brainles_preprocessing.registration import ANTsRegistrator
|
|
24
26
|
from brainles_preprocessing.registration.registrator import Registrator
|
|
25
27
|
from brainles_preprocessing.utils.citation_reminder import citation_reminder
|
|
26
|
-
from brainles_preprocessing.utils.logging_utils import LoggingManager
|
|
27
|
-
|
|
28
|
-
logging_man = LoggingManager(name=__name__)
|
|
29
|
-
logger = logging_man.get_logger()
|
|
30
28
|
|
|
31
29
|
|
|
32
30
|
class BasePreprocessor(ABC):
|
|
@@ -46,6 +44,28 @@ class BasePreprocessor(ABC):
|
|
|
46
44
|
|
|
47
45
|
"""
|
|
48
46
|
|
|
47
|
+
def _add_log_file_handler(self, log_file: Optional[Path | str]) -> int:
|
|
48
|
+
"""
|
|
49
|
+
Add a log file handler to the logger.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
log_file (Optional[Path | str]): Path to the log file. If None, a default log file will be created (brainles_preprocessing_{timestamp}.log).
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
int: The logger id
|
|
56
|
+
"""
|
|
57
|
+
log_file = Path(
|
|
58
|
+
log_file
|
|
59
|
+
if log_file
|
|
60
|
+
else f"brainles_preprocessing_{datetime.now().strftime('%Y-%m-%d_T%H-%M-%S.%f')}.log"
|
|
61
|
+
)
|
|
62
|
+
logger_id = logger.add(log_file, level="DEBUG", catch=True)
|
|
63
|
+
logger.info(
|
|
64
|
+
f"Logging console logs and further debug information to: {log_file.absolute()}"
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return logger_id
|
|
68
|
+
|
|
49
69
|
@citation_reminder
|
|
50
70
|
def __init__(
|
|
51
71
|
self,
|
|
@@ -59,7 +79,6 @@ class BasePreprocessor(ABC):
|
|
|
59
79
|
use_gpu: Optional[bool] = None,
|
|
60
80
|
limit_cuda_visible_devices: Optional[str] = None,
|
|
61
81
|
):
|
|
62
|
-
logging_man._setup_logger()
|
|
63
82
|
|
|
64
83
|
if not isinstance(center_modality, CenterModality):
|
|
65
84
|
warnings.warn(
|
|
@@ -146,18 +165,6 @@ class BasePreprocessor(ABC):
|
|
|
146
165
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
147
166
|
return False
|
|
148
167
|
|
|
149
|
-
def ensure_remove_log_file_handler(func):
|
|
150
|
-
@wraps(func)
|
|
151
|
-
def wrapper(*args, **kwargs):
|
|
152
|
-
try:
|
|
153
|
-
return func(*args, **kwargs)
|
|
154
|
-
finally:
|
|
155
|
-
self = args[0]
|
|
156
|
-
if isinstance(self, BasePreprocessor):
|
|
157
|
-
logging_man.remove_log_file_handler()
|
|
158
|
-
|
|
159
|
-
return wrapper
|
|
160
|
-
|
|
161
168
|
@property
|
|
162
169
|
def all_modalities(self) -> List[Modality]:
|
|
163
170
|
"""
|
|
@@ -173,7 +180,6 @@ class BasePreprocessor(ABC):
|
|
|
173
180
|
return any(modality.requires_deface for modality in self.all_modalities)
|
|
174
181
|
|
|
175
182
|
@abstractmethod
|
|
176
|
-
@ensure_remove_log_file_handler
|
|
177
183
|
def run(self, *args, **kwargs):
|
|
178
184
|
"""
|
|
179
185
|
Execute the preprocessing pipeline, encompassing
|
{brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/transform.py
RENAMED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
from typing import Optional, Union
|
|
3
3
|
|
|
4
|
+
from loguru import logger
|
|
5
|
+
|
|
4
6
|
from brainles_preprocessing.registration import ANTsRegistrator
|
|
5
7
|
from brainles_preprocessing.registration.registrator import Registrator
|
|
6
|
-
from brainles_preprocessing.utils.logging_utils import LoggingManager
|
|
7
|
-
|
|
8
|
-
logging_man = LoggingManager(name=__name__)
|
|
9
|
-
logger = logging_man.get_logger()
|
|
10
8
|
|
|
11
9
|
|
|
12
10
|
class Transform:
|
{brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/utils/zenodo.py
RENAMED
|
@@ -8,14 +8,9 @@ from pathlib import Path
|
|
|
8
8
|
from typing import Dict, List, Tuple
|
|
9
9
|
|
|
10
10
|
import requests
|
|
11
|
+
from loguru import logger
|
|
11
12
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
12
13
|
|
|
13
|
-
from brainles_preprocessing.utils.logging_utils import LoggingManager
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
logging_man = LoggingManager(name=__name__)
|
|
17
|
-
logger = logging_man.get_logger()
|
|
18
|
-
|
|
19
14
|
ZENODO_RECORD_URL = "https://zenodo.org/api/records/15236131"
|
|
20
15
|
ATLASES_FOLDER = Path(__file__).parent.parent / "registration" / "atlases"
|
|
21
16
|
ATLASES_DIR_PATTERN = "atlases_v*.*.*"
|
|
@@ -14,7 +14,7 @@ exclude = [
|
|
|
14
14
|
]
|
|
15
15
|
|
|
16
16
|
name = "brainles_preprocessing"
|
|
17
|
-
version = "0.6.
|
|
17
|
+
version = "0.6.1" # will be overwritten by poetry-dynamic-versioning but needs to be set
|
|
18
18
|
description = "Tool for preprocessing tasks in biomedical imaging, with a focus on (but not limited to) multi-modal brain MRI"
|
|
19
19
|
license = "Apache-2.0"
|
|
20
20
|
|
|
@@ -72,6 +72,7 @@ rich = "^13.6.0"
|
|
|
72
72
|
# optional registration backends
|
|
73
73
|
itk-elastix = { version = "^0.20.0", optional = true }
|
|
74
74
|
picsl_greedy = { version = "^0.0.6", optional = true }
|
|
75
|
+
loguru = "^0.7.3"
|
|
75
76
|
|
|
76
77
|
|
|
77
78
|
[tool.poetry.extras]
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import sys
|
|
2
|
-
import signal
|
|
3
|
-
import logging
|
|
4
|
-
import traceback
|
|
5
|
-
|
|
6
|
-
from datetime import datetime
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
from typing import Optional, Union
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class LoggingManager:
|
|
12
|
-
"""
|
|
13
|
-
Manages logging configurations for the application or library.
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
def __init__(self, name: str, log_file_path: Optional[Union[str, Path]] = None):
|
|
17
|
-
self.name = name
|
|
18
|
-
self.log_file_path = log_file_path
|
|
19
|
-
|
|
20
|
-
# Create and configure the custom logger
|
|
21
|
-
self.logger = logging.getLogger(self.name)
|
|
22
|
-
self.log_file_handler = None
|
|
23
|
-
|
|
24
|
-
# Disable log propagation
|
|
25
|
-
self.logger.propagate = False
|
|
26
|
-
|
|
27
|
-
# Set up the logger
|
|
28
|
-
self._setup_logger()
|
|
29
|
-
|
|
30
|
-
# Set up the logger file if provided
|
|
31
|
-
if log_file_path:
|
|
32
|
-
self._set_log_file(log_file_path)
|
|
33
|
-
|
|
34
|
-
def get_logger(self) -> logging.Logger:
|
|
35
|
-
"""
|
|
36
|
-
Returns the logger instance.
|
|
37
|
-
"""
|
|
38
|
-
return self.logger
|
|
39
|
-
|
|
40
|
-
def _setup_logger(self):
|
|
41
|
-
"""
|
|
42
|
-
Sets up the custom logger and overwrites system hooks to add logging for exceptions and signals.
|
|
43
|
-
"""
|
|
44
|
-
# Configure the custom logger if it hasn't been configured yet
|
|
45
|
-
if not self.logger.handlers:
|
|
46
|
-
self.logger.setLevel(logging.INFO)
|
|
47
|
-
formatter = logging.Formatter(
|
|
48
|
-
"[%(levelname)s | %(name)s] %(asctime)s: %(message)s",
|
|
49
|
-
"%Y-%m-%dT%H:%M:%S%z",
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
# Add a console handler
|
|
53
|
-
console_handler = logging.StreamHandler()
|
|
54
|
-
console_handler.setFormatter(formatter)
|
|
55
|
-
self.logger.addHandler(console_handler)
|
|
56
|
-
|
|
57
|
-
# Overwrite system hooks to log exceptions and signals (caution advised)
|
|
58
|
-
sys.excepthook = self.exception_handler
|
|
59
|
-
signal.signal(signal.SIGINT, self.signal_handler)
|
|
60
|
-
signal.signal(signal.SIGTERM, self.signal_handler)
|
|
61
|
-
|
|
62
|
-
def _set_log_file(self, log_file: str = None) -> None:
|
|
63
|
-
"""
|
|
64
|
-
Sets the log file handler for the logger.
|
|
65
|
-
|
|
66
|
-
Args:
|
|
67
|
-
log_file (str | Path, optional): Log file path. If not provided, a timestamped log file is created.
|
|
68
|
-
"""
|
|
69
|
-
|
|
70
|
-
# Remove existing log file handler if present
|
|
71
|
-
if self.log_file_handler:
|
|
72
|
-
self.remove_log_file_handler()
|
|
73
|
-
|
|
74
|
-
# Ensure parent directories exist
|
|
75
|
-
log_file = Path(
|
|
76
|
-
log_file
|
|
77
|
-
if log_file
|
|
78
|
-
else f"brainles_preprocessing_{datetime.now().strftime('%Y-%m-%d_T%H-%M-%S.%f')}.log"
|
|
79
|
-
)
|
|
80
|
-
log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
81
|
-
|
|
82
|
-
# Create and add the file handler
|
|
83
|
-
self.log_file_handler = logging.FileHandler(str(log_file))
|
|
84
|
-
self.log_file_handler.setFormatter(
|
|
85
|
-
logging.Formatter(
|
|
86
|
-
"[%(levelname)-8s | %(name)s | %(module)-15s | L%(lineno)-5d] %(asctime)s: %(message)s",
|
|
87
|
-
"%Y-%m-%dT%H:%M:%S%z",
|
|
88
|
-
)
|
|
89
|
-
)
|
|
90
|
-
self.logger.addHandler(self.log_file_handler)
|
|
91
|
-
self.log_file_path = log_file
|
|
92
|
-
|
|
93
|
-
def remove_log_file_handler(self) -> None:
|
|
94
|
-
"""
|
|
95
|
-
Removes the log file handler from the logger.
|
|
96
|
-
"""
|
|
97
|
-
if self.log_file_handler:
|
|
98
|
-
self.logger.removeHandler(self.log_file_handler)
|
|
99
|
-
self.log_file_handler.close()
|
|
100
|
-
self.log_file_handler = None
|
|
101
|
-
self.log_file_path = None
|
|
102
|
-
|
|
103
|
-
# overwrite system hooks to log exceptions and signals (SIGINT, SIGTERM)
|
|
104
|
-
#! NOTE: This will note work in Jupyter Notebooks, (Without extra setup) see https://stackoverflow.com/a/70469055:
|
|
105
|
-
def exception_handler(self, exception_type, value, tb):
|
|
106
|
-
"""Handle exceptions
|
|
107
|
-
|
|
108
|
-
Args:
|
|
109
|
-
exception_type (Exception): Exception type
|
|
110
|
-
exception (Exception): Exception
|
|
111
|
-
traceback (Traceback): Traceback
|
|
112
|
-
"""
|
|
113
|
-
self.logger.error(
|
|
114
|
-
"".join(traceback.format_exception(exception_type, value, tb))
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
if issubclass(exception_type, SystemExit):
|
|
118
|
-
# add specific code if exception was a system exit
|
|
119
|
-
sys.exit(value.code)
|
|
120
|
-
|
|
121
|
-
def signal_handler(self, sig, frame):
|
|
122
|
-
"""
|
|
123
|
-
Handles signals by logging them and exiting.
|
|
124
|
-
|
|
125
|
-
Args:
|
|
126
|
-
sig (int): Signal number
|
|
127
|
-
frame (FrameType): Current stack frame
|
|
128
|
-
"""
|
|
129
|
-
signame = signal.Signals(sig).name
|
|
130
|
-
self.logger.error(f"Received signal {sig} ({signame}), exiting...")
|
|
131
|
-
sys.exit(0)
|
|
File without changes
|
{brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{brainles_preprocessing-0.6.0 → brainles_preprocessing-0.6.1}/brainles_preprocessing/constants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|