pycerr 2.0.0__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.
- pycerr-2.0.0/.github/workflows/_version_tmp.py +17 -0
- pycerr-2.0.0/.github/workflows/publish.yml +82 -0
- pycerr-2.0.0/.github/workflows/python-package.yml +51 -0
- pycerr-2.0.0/.gitignore +48 -0
- pycerr-2.0.0/.readthedocs.yaml +32 -0
- pycerr-2.0.0/CLAUDE.md +112 -0
- pycerr-2.0.0/LICENSE +674 -0
- pycerr-2.0.0/MANIFEST.in +11 -0
- pycerr-2.0.0/PKG-INFO +205 -0
- pycerr-2.0.0/README.md +169 -0
- pycerr-2.0.0/cerr/__init__.py +0 -0
- pycerr-2.0.0/cerr/_version.py +24 -0
- pycerr-2.0.0/cerr/contour/__init__.py +0 -0
- pycerr-2.0.0/cerr/contour/contour_processing.py +172 -0
- pycerr-2.0.0/cerr/contour/rasterseg.py +498 -0
- pycerr-2.0.0/cerr/dataclasses/__init__.py +0 -0
- pycerr-2.0.0/cerr/dataclasses/beams.py +462 -0
- pycerr-2.0.0/cerr/dataclasses/dcm_cerr_name_map.json +59 -0
- pycerr-2.0.0/cerr/dataclasses/deform.py +228 -0
- pycerr-2.0.0/cerr/dataclasses/dose.py +898 -0
- pycerr-2.0.0/cerr/dataclasses/header.py +21 -0
- pycerr-2.0.0/cerr/dataclasses/imrt.py +18 -0
- pycerr-2.0.0/cerr/dataclasses/scan.py +1195 -0
- pycerr-2.0.0/cerr/dataclasses/scan_info.py +236 -0
- pycerr-2.0.0/cerr/dataclasses/structure.py +1630 -0
- pycerr-2.0.0/cerr/datasets/__init__.py +112 -0
- pycerr-2.0.0/cerr/datasets/convolutional_filter_settings/LoG_filter.json +20 -0
- pycerr-2.0.0/cerr/datasets/convolutional_filter_settings/Rot_inv_laws_energy_filter.json +28 -0
- pycerr-2.0.0/cerr/datasets/convolutional_filter_settings/gabor_filter.json +26 -0
- pycerr-2.0.0/cerr/datasets/convolutional_filter_settings/mean_filter.json +19 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/README_LICENSE.txt +11 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00000.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00001.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00002.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00003.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00004.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00005.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00006.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00007.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00008.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00009.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00010.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00011.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00012.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00013.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00014.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00015.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00016.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00017.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00018.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00019.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00020.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00021.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00022.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00023.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00024.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00025.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00026.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00027.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00028.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00029.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00030.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00031.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00032.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00033.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00034.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00035.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00036.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00037.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00038.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00039.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00040.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00041.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00042.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00043.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00044.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00045.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00046.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00047.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00048.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00049.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00050.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00051.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00052.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00053.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00054.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00055.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00056.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00057.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00058.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00059.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_RS_00060.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00000.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00001.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00002.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00003.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00004.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00005.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00006.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00007.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00008.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00009.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00010.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00011.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00012.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00013.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00014.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00015.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00016.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00017.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00018.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00019.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00020.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00021.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00022.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00023.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00024.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00025.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00026.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00027.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00028.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00029.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00030.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00031.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00032.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00033.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00034.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00035.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00036.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00037.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00038.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00039.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00040.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_RS_00041.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00000.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00001.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00002.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00003.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00004.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00005.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00006.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00007.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00008.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00009.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00010.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00011.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00012.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00013.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00014.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00015.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00016.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00017.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00018.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00019.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00020.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00021.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00022.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00023.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00024.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00025.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00026.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00027.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00028.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00029.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00030.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00031.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00032.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00033.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00034.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00035.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00036.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00037.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00038.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00039.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00040.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00041.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00042.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00043.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00044.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00045.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_RS_00046.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00000.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00001.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00002.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00003.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00004.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00005.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00006.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00007.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00008.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00009.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00010.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00011.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00012.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00013.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00014.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00015.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00016.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00017.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00018.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00019.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00020.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00021.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00022.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00023.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00024.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00025.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00026.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00027.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00028.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00029.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00030.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00031.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00032.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00033.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00034.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00035.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00036.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00037.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00038.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00039.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00040.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00041.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00042.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00043.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00044.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00045.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00046.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00047.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00048.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00049.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00050.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00051.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00052.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00053.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00054.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00055.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_RS_00056.dcm +0 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_a1.json +73 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_a2.json +74 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_b1.json +80 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_b2.json +79 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_c1.json +91 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_c2.json +91 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1a1.json +20 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1a2.json +21 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1a3.json +21 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1a4.json +21 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1b1.json +21 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1b2.json +21 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_2a.json +21 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_2b.json +21 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_2c.json +21 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3a1.json +22 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3a2.json +26 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3a3.json +29 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3b1.json +22 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3b2.json +26 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3b3.json +29 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3c1.json +22 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3c2.json +26 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3c3.json +29 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_4a1.json +24 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_4a2.json +26 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_4b1.json +24 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_4b2.json +26 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_5a1.json +23 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_5a2.json +29 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_6a1.json +23 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_6a2.json +30 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_1a.json +32 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_1b.json +38 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_2a.json +34 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_2b.json +42 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_3a.json +35 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_3b.json +41 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_4a.json +44 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_4b.json +49 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_5a.json +40 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_5b.json +49 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_6a.json +42 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_6b.json +49 -0
- pycerr-2.0.0/cerr/datasets/radiomics_settings/original_settings.json +89 -0
- pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/dose.nii +0 -0
- pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/mask_(testStr1 U testStr3).nii +0 -0
- pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/mask_testStr1.nii +0 -0
- pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/mask_testStr2.nii +0 -0
- pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/mask_testStr3.nii +0 -0
- pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/scan.nii +0 -0
- pycerr-2.0.0/cerr/dcm_export/__init__.py +0 -0
- pycerr-2.0.0/cerr/dcm_export/iod_helper.py +151 -0
- pycerr-2.0.0/cerr/dcm_export/reg_iod.py +478 -0
- pycerr-2.0.0/cerr/dcm_export/rtstruct_iod.py +279 -0
- pycerr-2.0.0/cerr/dvh.py +421 -0
- pycerr-2.0.0/cerr/imrtp/README_IMRTP.md +181 -0
- pycerr-2.0.0/cerr/imrtp/__init__.py +46 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/QIBData/aahn_18b.dat +338 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/QIBData/aahn_6b.dat +342 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/QIBData/qib_tables.npz +0 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/__init__.py +82 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/influence.py +291 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/montecarlo.py +117 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/qib.py +329 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/qib_data.py +108 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/raytrace.py +277 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/recalc.py +214 -0
- pycerr-2.0.0/cerr/imrtp/dosecalc/rtplan.py +242 -0
- pycerr-2.0.0/cerr/imrtp/imrtp.py +179 -0
- pycerr-2.0.0/cerr/imrtp/imrtp_gui.py +1155 -0
- pycerr-2.0.0/cerr/imrtp/imrtp_problem.py +407 -0
- pycerr-2.0.0/cerr/mri_metrics/__init__.py +0 -0
- pycerr-2.0.0/cerr/mri_metrics/dce_mri.py +961 -0
- pycerr-2.0.0/cerr/multiViewHelper.py +443 -0
- pycerr-2.0.0/cerr/plan_container.py +1331 -0
- pycerr-2.0.0/cerr/radiomics/__init__.py +0 -0
- pycerr-2.0.0/cerr/radiomics/first_order.py +144 -0
- pycerr-2.0.0/cerr/radiomics/gray_level_cooccurence.py +340 -0
- pycerr-2.0.0/cerr/radiomics/ibsi1.py +717 -0
- pycerr-2.0.0/cerr/radiomics/neighbor_gray_level_dependence.py +201 -0
- pycerr-2.0.0/cerr/radiomics/neighbor_gray_tone.py +170 -0
- pycerr-2.0.0/cerr/radiomics/preprocess.py +774 -0
- pycerr-2.0.0/cerr/radiomics/run_length.py +206 -0
- pycerr-2.0.0/cerr/radiomics/shape.py +252 -0
- pycerr-2.0.0/cerr/radiomics/size_zone.py +137 -0
- pycerr-2.0.0/cerr/radiomics/texture_filters.py +1491 -0
- pycerr-2.0.0/cerr/radiomics/texture_utils.py +291 -0
- pycerr-2.0.0/cerr/radiomics/vector_elasticity.py +132 -0
- pycerr-2.0.0/cerr/registration/__init__.py +0 -0
- pycerr-2.0.0/cerr/registration/register.py +520 -0
- pycerr-2.0.0/cerr/registration/settings/plastimatch_ct_ct_intra_pt_affine.txt +36 -0
- pycerr-2.0.0/cerr/registration/settings/plastimatch_ct_ct_intra_pt_bsplines.txt +46 -0
- pycerr-2.0.0/cerr/registration/settings/plastimatch_ct_ct_intra_pt_w_masks_affine.txt +38 -0
- pycerr-2.0.0/cerr/registration/settings/plastimatch_ct_ct_intra_pt_w_masks_bsplines.txt +48 -0
- pycerr-2.0.0/cerr/roe/__init__.py +1 -0
- pycerr-2.0.0/cerr/roe/dosimetric_models.py +936 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Bronchial stenosis (cox).json +18 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Bronchial stenosis (logistic).json +17 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Bronchial toxicity (Grade 3+).json +31 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Bronchial toxicity (Grade 5).json +30 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Esophagitis (Huang).json +27 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Esophagitis (Jackson_cox).json +27 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Esophagitis (Jackson_logistic).json +27 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Esophagitis (Wijsman).json +35 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Pneumonitis (Appelt).json +58 -0
- pycerr-2.0.0/cerr/roe/model_parameters/Rectal bleeding (grade 2+).json +20 -0
- pycerr-2.0.0/cerr/roe/roe_gui.py +1370 -0
- pycerr-2.0.0/cerr/scripts/demo_imrtp_gui.py +53 -0
- pycerr-2.0.0/cerr/utils/__init__.py +0 -0
- pycerr-2.0.0/cerr/utils/ai_pipeline.py +248 -0
- pycerr-2.0.0/cerr/utils/custom_colormaps.py +262 -0
- pycerr-2.0.0/cerr/utils/image_proc.py +477 -0
- pycerr-2.0.0/cerr/utils/interp.py +218 -0
- pycerr-2.0.0/cerr/utils/mask.py +746 -0
- pycerr-2.0.0/cerr/utils/statistics.py +31 -0
- pycerr-2.0.0/cerr/utils/uid.py +53 -0
- pycerr-2.0.0/cerr/viewer/API_pycerr_gui.md +346 -0
- pycerr-2.0.0/cerr/viewer/README_pycerr_gui.md +357 -0
- pycerr-2.0.0/cerr/viewer/__init__.py +35 -0
- pycerr-2.0.0/cerr/viewer/cerr_colormaps.py +4240 -0
- pycerr-2.0.0/cerr/viewer/pycerr_gui.py +4701 -0
- pycerr-2.0.0/cerr/viewer/pycerr_napari.py +1793 -0
- pycerr-2.0.0/cerr/viewer/pycerr_nbviewer.py +683 -0
- pycerr-2.0.0/docs/Makefile +20 -0
- pycerr-2.0.0/docs/cerr.contour.rst +29 -0
- pycerr-2.0.0/docs/cerr.dataclasses.rst +77 -0
- pycerr-2.0.0/docs/cerr.datasets.rst +10 -0
- pycerr-2.0.0/docs/cerr.dcm_export.rst +37 -0
- pycerr-2.0.0/docs/cerr.imrtp.dosecalc.rst +72 -0
- pycerr-2.0.0/docs/cerr.imrtp.rst +49 -0
- pycerr-2.0.0/docs/cerr.mri_metrics.rst +21 -0
- pycerr-2.0.0/docs/cerr.radiomics.rst +109 -0
- pycerr-2.0.0/docs/cerr.registration.rst +21 -0
- pycerr-2.0.0/docs/cerr.roe.rst +21 -0
- pycerr-2.0.0/docs/cerr.rst +55 -0
- pycerr-2.0.0/docs/cerr.utils.rst +69 -0
- pycerr-2.0.0/docs/cerr.viewer.rst +57 -0
- pycerr-2.0.0/docs/conf.py +71 -0
- pycerr-2.0.0/docs/index.rst +75 -0
- pycerr-2.0.0/docs/make.bat +35 -0
- pycerr-2.0.0/docs/modules.rst +7 -0
- pycerr-2.0.0/docs/requirements.txt +16 -0
- pycerr-2.0.0/docs/setup.rst +7 -0
- pycerr-2.0.0/docs/tests.rst +45 -0
- pycerr-2.0.0/pycerr.egg-info/PKG-INFO +205 -0
- pycerr-2.0.0/pycerr.egg-info/SOURCES.txt +404 -0
- pycerr-2.0.0/pycerr.egg-info/dependency_links.txt +1 -0
- pycerr-2.0.0/pycerr.egg-info/not-zip-safe +1 -0
- pycerr-2.0.0/pycerr.egg-info/requires.txt +22 -0
- pycerr-2.0.0/pycerr.egg-info/top_level.txt +1 -0
- pycerr-2.0.0/pyproject.toml +81 -0
- pycerr-2.0.0/requirements.txt +19 -0
- pycerr-2.0.0/setup.cfg +4 -0
- pycerr-2.0.0/setup.py +20 -0
- pycerr-2.0.0/tests/README.md +215 -0
- pycerr-2.0.0/tests/__init__.py +0 -0
- pycerr-2.0.0/tests/test_dcm_export_rtstruct.py +55 -0
- pycerr-2.0.0/tests/test_dicom_load.py +43 -0
- pycerr-2.0.0/tests/test_dvh.py +90 -0
- pycerr-2.0.0/tests/test_h5_roundtrip.py +58 -0
- pycerr-2.0.0/tests/test_ibsi1_features.py +192 -0
- pycerr-2.0.0/tests/test_ibsi2_features.py +192 -0
- pycerr-2.0.0/tests/test_ibsi2_filters.py +389 -0
- pycerr-2.0.0/tests/test_module_imports.py +63 -0
- pycerr-2.0.0/tests/test_nii_export_import.py +40 -0
- pycerr-2.0.0/tests/test_rasterization.py +92 -0
- pycerr-2.0.0/tests/test_roe_models.py +461 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# file generated by setuptools_scm
|
|
2
|
+
# don't change, don't track in version control
|
|
3
|
+
TYPE_CHECKING = False
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from typing import Tuple, Union
|
|
6
|
+
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
7
|
+
else:
|
|
8
|
+
VERSION_TUPLE = object
|
|
9
|
+
|
|
10
|
+
version: str
|
|
11
|
+
__version__: str
|
|
12
|
+
__version_tuple__: VERSION_TUPLE
|
|
13
|
+
version_tuple: VERSION_TUPLE
|
|
14
|
+
|
|
15
|
+
__version__ = version = '0.1.test000+ghash'
|
|
16
|
+
__version_tuple__ = version_tuple = (0, 1, 'test000', 'ghash')
|
|
17
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
# Release flow:
|
|
4
|
+
# * Manual run (Actions -> "Publish to PyPI" -> Run workflow, optionally from a
|
|
5
|
+
# tag) publishes to TestPyPI - use this as a dry run.
|
|
6
|
+
# * Pushing a version tag publishes to PyPI, e.g.:
|
|
7
|
+
# git tag -a v0.7.0 -m "v0.7.0" && git push origin v0.7.0
|
|
8
|
+
# setuptools_scm derives the version from the tag, so the PyPI version matches
|
|
9
|
+
# the tag exactly (v0.7.0 -> 0.7.0).
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
push:
|
|
13
|
+
tags:
|
|
14
|
+
- "v*"
|
|
15
|
+
workflow_dispatch: # manual run -> TestPyPI dry run
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
name: Build distribution
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
with:
|
|
24
|
+
fetch-depth: 0 # full history + tags so setuptools_scm sees the tag
|
|
25
|
+
- uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.12"
|
|
28
|
+
- name: Build sdist and wheel
|
|
29
|
+
run: |
|
|
30
|
+
python -m pip install --upgrade pip build twine
|
|
31
|
+
python -m build
|
|
32
|
+
- name: Validate metadata and long description
|
|
33
|
+
run: twine check dist/*
|
|
34
|
+
- name: Show version being published
|
|
35
|
+
run: ls -l dist/
|
|
36
|
+
- uses: actions/upload-artifact@v4
|
|
37
|
+
with:
|
|
38
|
+
name: dist
|
|
39
|
+
path: dist/
|
|
40
|
+
|
|
41
|
+
publish-testpypi:
|
|
42
|
+
name: Publish to TestPyPI (dry run)
|
|
43
|
+
needs: build
|
|
44
|
+
if: github.event_name == 'workflow_dispatch'
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
# The TestPyPI Trusted Publisher must reference this environment name.
|
|
47
|
+
environment:
|
|
48
|
+
name: testpypi
|
|
49
|
+
url: https://test.pypi.org/p/pycerr
|
|
50
|
+
permissions:
|
|
51
|
+
id-token: write # OIDC token for Trusted Publishing (no API token)
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/download-artifact@v4
|
|
54
|
+
with:
|
|
55
|
+
name: dist
|
|
56
|
+
path: dist/
|
|
57
|
+
- name: Publish to TestPyPI
|
|
58
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
59
|
+
with:
|
|
60
|
+
repository-url: https://test.pypi.org/legacy/
|
|
61
|
+
# Don't fail a re-run if this dev version was already uploaded
|
|
62
|
+
# (TestPyPI filenames are immutable).
|
|
63
|
+
skip-existing: true
|
|
64
|
+
|
|
65
|
+
publish-pypi:
|
|
66
|
+
name: Publish to PyPI
|
|
67
|
+
needs: build
|
|
68
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
69
|
+
runs-on: ubuntu-latest
|
|
70
|
+
# The PyPI Trusted Publisher must reference this environment name.
|
|
71
|
+
environment:
|
|
72
|
+
name: pypi
|
|
73
|
+
url: https://pypi.org/p/pycerr
|
|
74
|
+
permissions:
|
|
75
|
+
id-token: write # OIDC token for Trusted Publishing (no API token)
|
|
76
|
+
steps:
|
|
77
|
+
- uses: actions/download-artifact@v4
|
|
78
|
+
with:
|
|
79
|
+
name: dist
|
|
80
|
+
path: dist/
|
|
81
|
+
- name: Publish to PyPI
|
|
82
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
|
|
2
|
+
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
|
|
3
|
+
|
|
4
|
+
name: Python package
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [ "testing", "main" ]
|
|
9
|
+
pull_request:
|
|
10
|
+
branches: [ "testing", "main" ]
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
build:
|
|
14
|
+
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
strategy:
|
|
17
|
+
fail-fast: false
|
|
18
|
+
matrix:
|
|
19
|
+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v3
|
|
23
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
24
|
+
uses: actions/setup-python@v3
|
|
25
|
+
with:
|
|
26
|
+
python-version: ${{ matrix.python-version }}
|
|
27
|
+
- name: Install system libraries for Qt / headless GUI tests
|
|
28
|
+
# The viewer import smoke tests load napari / PyQt5, which need Qt system
|
|
29
|
+
# libraries and a virtual X display (xvfb) on the headless runner.
|
|
30
|
+
run: |
|
|
31
|
+
sudo apt-get update
|
|
32
|
+
sudo apt-get install -y xvfb libegl1 libopengl0 libdbus-1-3 \
|
|
33
|
+
libxkbcommon-x11-0 libxcb-cursor0 libxcb-icccm4 libxcb-image0 \
|
|
34
|
+
libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 \
|
|
35
|
+
libxcb-xinerama0
|
|
36
|
+
- name: Install dependencies
|
|
37
|
+
run: |
|
|
38
|
+
python -m pip install --upgrade pip
|
|
39
|
+
python -m pip install flake8 pytest
|
|
40
|
+
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
|
41
|
+
cp .github/workflows/_version_tmp.py cerr/_version.py
|
|
42
|
+
- name: Lint with flake8
|
|
43
|
+
run: |
|
|
44
|
+
# stop the build if there are Python syntax errors or undefined names
|
|
45
|
+
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
|
|
46
|
+
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
|
47
|
+
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
|
|
48
|
+
- name: Test with pytest
|
|
49
|
+
# Run under xvfb so the napari / PyQt5 import tests have a display.
|
|
50
|
+
run: |
|
|
51
|
+
xvfb-run -a pytest -v
|
pycerr-2.0.0/.gitignore
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Byte-compiled / optimized / cache
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# Distribution / packaging
|
|
7
|
+
build/
|
|
8
|
+
dist/
|
|
9
|
+
wheels/
|
|
10
|
+
*.egg
|
|
11
|
+
*.egg-info/
|
|
12
|
+
.eggs/
|
|
13
|
+
|
|
14
|
+
# setuptools_scm generates this from a git tag / CI temp file
|
|
15
|
+
cerr/_version.py
|
|
16
|
+
|
|
17
|
+
# Test & coverage
|
|
18
|
+
.pytest_cache/
|
|
19
|
+
.coverage
|
|
20
|
+
.coverage.*
|
|
21
|
+
htmlcov/
|
|
22
|
+
.tox/
|
|
23
|
+
.nox/
|
|
24
|
+
|
|
25
|
+
# Sphinx build output
|
|
26
|
+
docs/_build/
|
|
27
|
+
|
|
28
|
+
# Jupyter
|
|
29
|
+
.ipynb_checkpoints/
|
|
30
|
+
|
|
31
|
+
# Editors / IDEs
|
|
32
|
+
.idea/
|
|
33
|
+
.vscode/
|
|
34
|
+
*.swp
|
|
35
|
+
*~
|
|
36
|
+
|
|
37
|
+
# OS cruft
|
|
38
|
+
.DS_Store
|
|
39
|
+
Thumbs.db
|
|
40
|
+
|
|
41
|
+
# Virtual environments
|
|
42
|
+
.venv/
|
|
43
|
+
venv/
|
|
44
|
+
env/
|
|
45
|
+
ENV/
|
|
46
|
+
|
|
47
|
+
# Local test artifacts written to the repo root
|
|
48
|
+
/scan_from_cerr.nii.gz
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# .readthedocs.yaml
|
|
2
|
+
# Read the Docs configuration file
|
|
3
|
+
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
|
4
|
+
|
|
5
|
+
# Required
|
|
6
|
+
version: 2
|
|
7
|
+
|
|
8
|
+
# Set the OS, Python version and other tools you might need
|
|
9
|
+
build:
|
|
10
|
+
os: ubuntu-22.04
|
|
11
|
+
tools:
|
|
12
|
+
python: "3.12"
|
|
13
|
+
# You can also specify other tool versions:
|
|
14
|
+
# nodejs: "19"
|
|
15
|
+
# rust: "1.64"
|
|
16
|
+
# golang: "1.19"
|
|
17
|
+
|
|
18
|
+
# Build documentation in the "docs_old/" directory with Sphinx
|
|
19
|
+
sphinx:
|
|
20
|
+
configuration: docs/conf.py
|
|
21
|
+
|
|
22
|
+
# Optionally build your docs_old in additional formats such as PDF and ePub
|
|
23
|
+
# formats:
|
|
24
|
+
# - pdf
|
|
25
|
+
# - epub
|
|
26
|
+
|
|
27
|
+
# Optional but recommended, declare the Python requirements required
|
|
28
|
+
# to build your documentation
|
|
29
|
+
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
|
|
30
|
+
python:
|
|
31
|
+
install:
|
|
32
|
+
- requirements: docs/requirements.txt
|
pycerr-2.0.0/CLAUDE.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
pyCERR (Python-based Computational Environment for Radiological Research) is a medical imaging library for processing, visualizing, and analyzing radiological data. It supports DICOM, NIfTI, and HDF5 I/O, and provides tools for radiomics, dose-volume histogram analysis, and deformable image registration.
|
|
8
|
+
|
|
9
|
+
## Development Commands
|
|
10
|
+
|
|
11
|
+
### Installation
|
|
12
|
+
```bash
|
|
13
|
+
conda create -y --name pycerr python=3.11
|
|
14
|
+
conda activate pycerr
|
|
15
|
+
pip install -e ".[napari]"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Running Tests
|
|
19
|
+
```bash
|
|
20
|
+
# All tests
|
|
21
|
+
pytest tests/
|
|
22
|
+
|
|
23
|
+
# Single test file
|
|
24
|
+
pytest tests/test_ibsi1_features.py
|
|
25
|
+
|
|
26
|
+
# Single test function
|
|
27
|
+
pytest tests/test_ibsi1_features.py::test_function_name
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Linting
|
|
31
|
+
```bash
|
|
32
|
+
# Syntax errors and undefined names (enforced in CI)
|
|
33
|
+
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
|
|
34
|
+
|
|
35
|
+
# Style check (max line length 127, max complexity 10)
|
|
36
|
+
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Building Docs
|
|
40
|
+
```bash
|
|
41
|
+
cd docs && make html
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Architecture
|
|
45
|
+
|
|
46
|
+
### Central Data Container: `PlanC`
|
|
47
|
+
|
|
48
|
+
All imaging data lives in a `PlanC` instance (defined in `cerr/plan_container.py`). It holds lists of domain objects:
|
|
49
|
+
|
|
50
|
+
- `planC.scan` — volumetric images (CT, MR, PT, US, NM)
|
|
51
|
+
- `planC.structure` — segmentations (RTSTRUCT, SEG)
|
|
52
|
+
- `planC.dose` — dose distributions (RTDOSE)
|
|
53
|
+
- `planC.beams` — treatment plans (RTPLAN)
|
|
54
|
+
- `planC.deform` — deformable registration results
|
|
55
|
+
- `planC.header` — metadata (version, creation date)
|
|
56
|
+
|
|
57
|
+
### Key Modules
|
|
58
|
+
|
|
59
|
+
| Module | Purpose |
|
|
60
|
+
|--------|---------|
|
|
61
|
+
| `cerr/plan_container.py` | PlanC container + all I/O (DICOM, NIfTI, H5, pickle) |
|
|
62
|
+
| `cerr/dataclasses/` | Domain dataclasses: `scan.py`, `structure.py`, `dose.py`, `beams.py`, `deform.py` |
|
|
63
|
+
| `cerr/radiomics/` | IBSI-compliant texture/radiomic features and filters |
|
|
64
|
+
| `cerr/contour/` | Contour processing and rasterization (polygon → mask) |
|
|
65
|
+
| `cerr/viewer.py` | Interactive napari-based 2D/3D visualization |
|
|
66
|
+
| `cerr/dvh.py` | Dose-Volume Histogram calculation |
|
|
67
|
+
| `cerr/registration/` | Deformable image registration via plastimatch |
|
|
68
|
+
| `cerr/dcm_export/` | DICOM export (RTSTRUCT, RTDOSE IODs) |
|
|
69
|
+
| `cerr/utils/` | AI pipeline setup, image processing, masking, UID generation |
|
|
70
|
+
| `cerr/roe/` | Radiomics Outcome Explorer (dosimetric models) |
|
|
71
|
+
| `cerr/datasets/` | IBSI radiomics phantoms and reference values for validation |
|
|
72
|
+
|
|
73
|
+
### Typical Data Flow
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
loadDcmDir(dcmDir) → PlanC
|
|
77
|
+
├─ Scan: DICOM pixels → coordinate transforms → optionally SUV (PET)
|
|
78
|
+
├─ Structure: DICOM contour points → coordinate transform → lazy rasterization
|
|
79
|
+
├─ Dose: DICOM dose grid → coordinate transform
|
|
80
|
+
└─ Beams: RTPLAN fields
|
|
81
|
+
|
|
82
|
+
PlanC → process:
|
|
83
|
+
├─ radiomics.ibsi1.computeScalarFeatures(scanNum, structNum, settingsFile, planC)
|
|
84
|
+
├─ dvh.getDVH(structNum, doseNum, planC)
|
|
85
|
+
└─ registration.register.register_scans(planC, ...)
|
|
86
|
+
|
|
87
|
+
PlanC → export:
|
|
88
|
+
├─ saveToH5(planC, h5File) # HDF5 serialization
|
|
89
|
+
├─ scan.saveNii(fileName) # NIfTI export
|
|
90
|
+
└─ dcm_export/ # DICOM RT export
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Coordinate Systems
|
|
94
|
+
|
|
95
|
+
Each `Scan` object carries three transformation matrices:
|
|
96
|
+
- `Image2PhysicalTransM` — voxel indices → DICOM physical space (mm)
|
|
97
|
+
- `Image2VirtualPhysicalTransM` — voxel indices → pyCERR virtual space
|
|
98
|
+
- `cerrToDcmTransM` — pyCERR virtual → DICOM physical
|
|
99
|
+
|
|
100
|
+
pyCERR's virtual coordinate system differs from DICOM's: it uses a right-handed system with `(x, y, z)` = `(col, row, slice)` ordering. Conversion happens in `convertDcmToCerrVirtualCoords()` inside each dataclass loader.
|
|
101
|
+
|
|
102
|
+
### Contour Rasterization
|
|
103
|
+
|
|
104
|
+
Structure contour points are stored as polygon vertices (DICOM format). Rasterization to binary masks is performed lazily via `cerr/contour/rasterseg.py` — masks are computed on demand, not pre-stored. Use `structure.getStructureMask3M(structNum, scanNum, planC)` to get a 3D mask array.
|
|
105
|
+
|
|
106
|
+
### Radiomics
|
|
107
|
+
|
|
108
|
+
Radiomics feature extraction is IBSI-compliant (International Biomarker Standardization Initiative). The `cerr/datasets/` directory contains the IBSI phantoms and reference values used in `tests/test_ibsi1_features.py` and `test_ibsi2_features.py` to validate correctness. Settings are passed via JSON files in `cerr/radiomics/settings/`.
|
|
109
|
+
|
|
110
|
+
## CI
|
|
111
|
+
|
|
112
|
+
GitHub Actions (`.github/workflows/python-package.yml`) runs linting and pytest on Python 3.9–3.12 (Ubuntu). Tests download reference data from external URLs; network access is required for the test suite.
|