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.
Files changed (406) hide show
  1. pycerr-2.0.0/.github/workflows/_version_tmp.py +17 -0
  2. pycerr-2.0.0/.github/workflows/publish.yml +82 -0
  3. pycerr-2.0.0/.github/workflows/python-package.yml +51 -0
  4. pycerr-2.0.0/.gitignore +48 -0
  5. pycerr-2.0.0/.readthedocs.yaml +32 -0
  6. pycerr-2.0.0/CLAUDE.md +112 -0
  7. pycerr-2.0.0/LICENSE +674 -0
  8. pycerr-2.0.0/MANIFEST.in +11 -0
  9. pycerr-2.0.0/PKG-INFO +205 -0
  10. pycerr-2.0.0/README.md +169 -0
  11. pycerr-2.0.0/cerr/__init__.py +0 -0
  12. pycerr-2.0.0/cerr/_version.py +24 -0
  13. pycerr-2.0.0/cerr/contour/__init__.py +0 -0
  14. pycerr-2.0.0/cerr/contour/contour_processing.py +172 -0
  15. pycerr-2.0.0/cerr/contour/rasterseg.py +498 -0
  16. pycerr-2.0.0/cerr/dataclasses/__init__.py +0 -0
  17. pycerr-2.0.0/cerr/dataclasses/beams.py +462 -0
  18. pycerr-2.0.0/cerr/dataclasses/dcm_cerr_name_map.json +59 -0
  19. pycerr-2.0.0/cerr/dataclasses/deform.py +228 -0
  20. pycerr-2.0.0/cerr/dataclasses/dose.py +898 -0
  21. pycerr-2.0.0/cerr/dataclasses/header.py +21 -0
  22. pycerr-2.0.0/cerr/dataclasses/imrt.py +18 -0
  23. pycerr-2.0.0/cerr/dataclasses/scan.py +1195 -0
  24. pycerr-2.0.0/cerr/dataclasses/scan_info.py +236 -0
  25. pycerr-2.0.0/cerr/dataclasses/structure.py +1630 -0
  26. pycerr-2.0.0/cerr/datasets/__init__.py +112 -0
  27. pycerr-2.0.0/cerr/datasets/convolutional_filter_settings/LoG_filter.json +20 -0
  28. pycerr-2.0.0/cerr/datasets/convolutional_filter_settings/Rot_inv_laws_energy_filter.json +28 -0
  29. pycerr-2.0.0/cerr/datasets/convolutional_filter_settings/gabor_filter.json +26 -0
  30. pycerr-2.0.0/cerr/datasets/convolutional_filter_settings/mean_filter.json +19 -0
  31. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/README_LICENSE.txt +11 -0
  32. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00000.dcm +0 -0
  33. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00001.dcm +0 -0
  34. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00002.dcm +0 -0
  35. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00003.dcm +0 -0
  36. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00004.dcm +0 -0
  37. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00005.dcm +0 -0
  38. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00006.dcm +0 -0
  39. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00007.dcm +0 -0
  40. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00008.dcm +0 -0
  41. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00009.dcm +0 -0
  42. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00010.dcm +0 -0
  43. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00011.dcm +0 -0
  44. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00012.dcm +0 -0
  45. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00013.dcm +0 -0
  46. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00014.dcm +0 -0
  47. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00015.dcm +0 -0
  48. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00016.dcm +0 -0
  49. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00017.dcm +0 -0
  50. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00018.dcm +0 -0
  51. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00019.dcm +0 -0
  52. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00020.dcm +0 -0
  53. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00021.dcm +0 -0
  54. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00022.dcm +0 -0
  55. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00023.dcm +0 -0
  56. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00024.dcm +0 -0
  57. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00025.dcm +0 -0
  58. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00026.dcm +0 -0
  59. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00027.dcm +0 -0
  60. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00028.dcm +0 -0
  61. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00029.dcm +0 -0
  62. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00030.dcm +0 -0
  63. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00031.dcm +0 -0
  64. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00032.dcm +0 -0
  65. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00033.dcm +0 -0
  66. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00034.dcm +0 -0
  67. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00035.dcm +0 -0
  68. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00036.dcm +0 -0
  69. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00037.dcm +0 -0
  70. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00038.dcm +0 -0
  71. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00039.dcm +0 -0
  72. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00040.dcm +0 -0
  73. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00041.dcm +0 -0
  74. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00042.dcm +0 -0
  75. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00043.dcm +0 -0
  76. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00044.dcm +0 -0
  77. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00045.dcm +0 -0
  78. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00046.dcm +0 -0
  79. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00047.dcm +0 -0
  80. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00048.dcm +0 -0
  81. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00049.dcm +0 -0
  82. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00050.dcm +0 -0
  83. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00051.dcm +0 -0
  84. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00052.dcm +0 -0
  85. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00053.dcm +0 -0
  86. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00054.dcm +0 -0
  87. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00055.dcm +0 -0
  88. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00056.dcm +0 -0
  89. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00057.dcm +0 -0
  90. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00058.dcm +0 -0
  91. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_IMG_00059.dcm +0 -0
  92. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_1/DCM_RS_00060.dcm +0 -0
  93. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00000.dcm +0 -0
  94. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00001.dcm +0 -0
  95. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00002.dcm +0 -0
  96. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00003.dcm +0 -0
  97. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00004.dcm +0 -0
  98. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00005.dcm +0 -0
  99. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00006.dcm +0 -0
  100. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00007.dcm +0 -0
  101. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00008.dcm +0 -0
  102. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00009.dcm +0 -0
  103. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00010.dcm +0 -0
  104. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00011.dcm +0 -0
  105. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00012.dcm +0 -0
  106. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00013.dcm +0 -0
  107. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00014.dcm +0 -0
  108. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00015.dcm +0 -0
  109. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00016.dcm +0 -0
  110. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00017.dcm +0 -0
  111. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00018.dcm +0 -0
  112. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00019.dcm +0 -0
  113. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00020.dcm +0 -0
  114. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00021.dcm +0 -0
  115. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00022.dcm +0 -0
  116. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00023.dcm +0 -0
  117. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00024.dcm +0 -0
  118. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00025.dcm +0 -0
  119. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00026.dcm +0 -0
  120. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00027.dcm +0 -0
  121. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00028.dcm +0 -0
  122. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00029.dcm +0 -0
  123. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00030.dcm +0 -0
  124. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00031.dcm +0 -0
  125. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00032.dcm +0 -0
  126. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00033.dcm +0 -0
  127. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00034.dcm +0 -0
  128. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00035.dcm +0 -0
  129. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00036.dcm +0 -0
  130. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00037.dcm +0 -0
  131. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00038.dcm +0 -0
  132. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00039.dcm +0 -0
  133. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_IMG_00040.dcm +0 -0
  134. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_2/DCM_RS_00041.dcm +0 -0
  135. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00000.dcm +0 -0
  136. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00001.dcm +0 -0
  137. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00002.dcm +0 -0
  138. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00003.dcm +0 -0
  139. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00004.dcm +0 -0
  140. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00005.dcm +0 -0
  141. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00006.dcm +0 -0
  142. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00007.dcm +0 -0
  143. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00008.dcm +0 -0
  144. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00009.dcm +0 -0
  145. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00010.dcm +0 -0
  146. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00011.dcm +0 -0
  147. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00012.dcm +0 -0
  148. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00013.dcm +0 -0
  149. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00014.dcm +0 -0
  150. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00015.dcm +0 -0
  151. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00016.dcm +0 -0
  152. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00017.dcm +0 -0
  153. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00018.dcm +0 -0
  154. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00019.dcm +0 -0
  155. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00020.dcm +0 -0
  156. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00021.dcm +0 -0
  157. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00022.dcm +0 -0
  158. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00023.dcm +0 -0
  159. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00024.dcm +0 -0
  160. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00025.dcm +0 -0
  161. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00026.dcm +0 -0
  162. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00027.dcm +0 -0
  163. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00028.dcm +0 -0
  164. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00029.dcm +0 -0
  165. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00030.dcm +0 -0
  166. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00031.dcm +0 -0
  167. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00032.dcm +0 -0
  168. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00033.dcm +0 -0
  169. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00034.dcm +0 -0
  170. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00035.dcm +0 -0
  171. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00036.dcm +0 -0
  172. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00037.dcm +0 -0
  173. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00038.dcm +0 -0
  174. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00039.dcm +0 -0
  175. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00040.dcm +0 -0
  176. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00041.dcm +0 -0
  177. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00042.dcm +0 -0
  178. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00043.dcm +0 -0
  179. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00044.dcm +0 -0
  180. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_IMG_00045.dcm +0 -0
  181. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_3/DCM_RS_00046.dcm +0 -0
  182. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00000.dcm +0 -0
  183. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00001.dcm +0 -0
  184. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00002.dcm +0 -0
  185. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00003.dcm +0 -0
  186. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00004.dcm +0 -0
  187. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00005.dcm +0 -0
  188. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00006.dcm +0 -0
  189. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00007.dcm +0 -0
  190. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00008.dcm +0 -0
  191. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00009.dcm +0 -0
  192. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00010.dcm +0 -0
  193. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00011.dcm +0 -0
  194. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00012.dcm +0 -0
  195. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00013.dcm +0 -0
  196. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00014.dcm +0 -0
  197. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00015.dcm +0 -0
  198. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00016.dcm +0 -0
  199. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00017.dcm +0 -0
  200. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00018.dcm +0 -0
  201. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00019.dcm +0 -0
  202. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00020.dcm +0 -0
  203. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00021.dcm +0 -0
  204. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00022.dcm +0 -0
  205. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00023.dcm +0 -0
  206. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00024.dcm +0 -0
  207. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00025.dcm +0 -0
  208. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00026.dcm +0 -0
  209. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00027.dcm +0 -0
  210. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00028.dcm +0 -0
  211. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00029.dcm +0 -0
  212. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00030.dcm +0 -0
  213. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00031.dcm +0 -0
  214. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00032.dcm +0 -0
  215. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00033.dcm +0 -0
  216. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00034.dcm +0 -0
  217. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00035.dcm +0 -0
  218. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00036.dcm +0 -0
  219. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00037.dcm +0 -0
  220. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00038.dcm +0 -0
  221. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00039.dcm +0 -0
  222. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00040.dcm +0 -0
  223. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00041.dcm +0 -0
  224. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00042.dcm +0 -0
  225. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00043.dcm +0 -0
  226. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00044.dcm +0 -0
  227. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00045.dcm +0 -0
  228. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00046.dcm +0 -0
  229. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00047.dcm +0 -0
  230. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00048.dcm +0 -0
  231. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00049.dcm +0 -0
  232. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00050.dcm +0 -0
  233. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00051.dcm +0 -0
  234. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00052.dcm +0 -0
  235. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00053.dcm +0 -0
  236. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00054.dcm +0 -0
  237. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_IMG_00055.dcm +0 -0
  238. pycerr-2.0.0/cerr/datasets/radiomics_phantom_dicom/pat_4/DCM_RS_00056.dcm +0 -0
  239. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_a1.json +73 -0
  240. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_a2.json +74 -0
  241. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_b1.json +80 -0
  242. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_b2.json +79 -0
  243. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_c1.json +91 -0
  244. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi1/ibsi1_id_c2.json +91 -0
  245. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1a1.json +20 -0
  246. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1a2.json +21 -0
  247. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1a3.json +21 -0
  248. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1a4.json +21 -0
  249. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1b1.json +21 -0
  250. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_1b2.json +21 -0
  251. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_2a.json +21 -0
  252. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_2b.json +21 -0
  253. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_2c.json +21 -0
  254. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3a1.json +22 -0
  255. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3a2.json +26 -0
  256. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3a3.json +29 -0
  257. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3b1.json +22 -0
  258. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3b2.json +26 -0
  259. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3b3.json +29 -0
  260. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3c1.json +22 -0
  261. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3c2.json +26 -0
  262. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_3c3.json +29 -0
  263. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_4a1.json +24 -0
  264. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_4a2.json +26 -0
  265. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_4b1.json +24 -0
  266. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_4b2.json +26 -0
  267. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_5a1.json +23 -0
  268. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_5a2.json +29 -0
  269. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_6a1.json +23 -0
  270. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_1/ibsi_phase2_1_id_6a2.json +30 -0
  271. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_1a.json +32 -0
  272. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_1b.json +38 -0
  273. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_2a.json +34 -0
  274. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_2b.json +42 -0
  275. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_3a.json +35 -0
  276. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_3b.json +41 -0
  277. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_4a.json +44 -0
  278. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_4b.json +49 -0
  279. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_5a.json +40 -0
  280. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_5b.json +49 -0
  281. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_6a.json +42 -0
  282. pycerr-2.0.0/cerr/datasets/radiomics_settings/ibsi_settings/ibsi2_phase_2/ibsi_phase2_2_id_6b.json +49 -0
  283. pycerr-2.0.0/cerr/datasets/radiomics_settings/original_settings.json +89 -0
  284. pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/dose.nii +0 -0
  285. pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/mask_(testStr1 U testStr3).nii +0 -0
  286. pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/mask_testStr1.nii +0 -0
  287. pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/mask_testStr2.nii +0 -0
  288. pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/mask_testStr3.nii +0 -0
  289. pycerr-2.0.0/cerr/datasets/sample_ct/dosimetric_model_test_data/scan.nii +0 -0
  290. pycerr-2.0.0/cerr/dcm_export/__init__.py +0 -0
  291. pycerr-2.0.0/cerr/dcm_export/iod_helper.py +151 -0
  292. pycerr-2.0.0/cerr/dcm_export/reg_iod.py +478 -0
  293. pycerr-2.0.0/cerr/dcm_export/rtstruct_iod.py +279 -0
  294. pycerr-2.0.0/cerr/dvh.py +421 -0
  295. pycerr-2.0.0/cerr/imrtp/README_IMRTP.md +181 -0
  296. pycerr-2.0.0/cerr/imrtp/__init__.py +46 -0
  297. pycerr-2.0.0/cerr/imrtp/dosecalc/QIBData/aahn_18b.dat +338 -0
  298. pycerr-2.0.0/cerr/imrtp/dosecalc/QIBData/aahn_6b.dat +342 -0
  299. pycerr-2.0.0/cerr/imrtp/dosecalc/QIBData/qib_tables.npz +0 -0
  300. pycerr-2.0.0/cerr/imrtp/dosecalc/__init__.py +82 -0
  301. pycerr-2.0.0/cerr/imrtp/dosecalc/influence.py +291 -0
  302. pycerr-2.0.0/cerr/imrtp/dosecalc/montecarlo.py +117 -0
  303. pycerr-2.0.0/cerr/imrtp/dosecalc/qib.py +329 -0
  304. pycerr-2.0.0/cerr/imrtp/dosecalc/qib_data.py +108 -0
  305. pycerr-2.0.0/cerr/imrtp/dosecalc/raytrace.py +277 -0
  306. pycerr-2.0.0/cerr/imrtp/dosecalc/recalc.py +214 -0
  307. pycerr-2.0.0/cerr/imrtp/dosecalc/rtplan.py +242 -0
  308. pycerr-2.0.0/cerr/imrtp/imrtp.py +179 -0
  309. pycerr-2.0.0/cerr/imrtp/imrtp_gui.py +1155 -0
  310. pycerr-2.0.0/cerr/imrtp/imrtp_problem.py +407 -0
  311. pycerr-2.0.0/cerr/mri_metrics/__init__.py +0 -0
  312. pycerr-2.0.0/cerr/mri_metrics/dce_mri.py +961 -0
  313. pycerr-2.0.0/cerr/multiViewHelper.py +443 -0
  314. pycerr-2.0.0/cerr/plan_container.py +1331 -0
  315. pycerr-2.0.0/cerr/radiomics/__init__.py +0 -0
  316. pycerr-2.0.0/cerr/radiomics/first_order.py +144 -0
  317. pycerr-2.0.0/cerr/radiomics/gray_level_cooccurence.py +340 -0
  318. pycerr-2.0.0/cerr/radiomics/ibsi1.py +717 -0
  319. pycerr-2.0.0/cerr/radiomics/neighbor_gray_level_dependence.py +201 -0
  320. pycerr-2.0.0/cerr/radiomics/neighbor_gray_tone.py +170 -0
  321. pycerr-2.0.0/cerr/radiomics/preprocess.py +774 -0
  322. pycerr-2.0.0/cerr/radiomics/run_length.py +206 -0
  323. pycerr-2.0.0/cerr/radiomics/shape.py +252 -0
  324. pycerr-2.0.0/cerr/radiomics/size_zone.py +137 -0
  325. pycerr-2.0.0/cerr/radiomics/texture_filters.py +1491 -0
  326. pycerr-2.0.0/cerr/radiomics/texture_utils.py +291 -0
  327. pycerr-2.0.0/cerr/radiomics/vector_elasticity.py +132 -0
  328. pycerr-2.0.0/cerr/registration/__init__.py +0 -0
  329. pycerr-2.0.0/cerr/registration/register.py +520 -0
  330. pycerr-2.0.0/cerr/registration/settings/plastimatch_ct_ct_intra_pt_affine.txt +36 -0
  331. pycerr-2.0.0/cerr/registration/settings/plastimatch_ct_ct_intra_pt_bsplines.txt +46 -0
  332. pycerr-2.0.0/cerr/registration/settings/plastimatch_ct_ct_intra_pt_w_masks_affine.txt +38 -0
  333. pycerr-2.0.0/cerr/registration/settings/plastimatch_ct_ct_intra_pt_w_masks_bsplines.txt +48 -0
  334. pycerr-2.0.0/cerr/roe/__init__.py +1 -0
  335. pycerr-2.0.0/cerr/roe/dosimetric_models.py +936 -0
  336. pycerr-2.0.0/cerr/roe/model_parameters/Bronchial stenosis (cox).json +18 -0
  337. pycerr-2.0.0/cerr/roe/model_parameters/Bronchial stenosis (logistic).json +17 -0
  338. pycerr-2.0.0/cerr/roe/model_parameters/Bronchial toxicity (Grade 3+).json +31 -0
  339. pycerr-2.0.0/cerr/roe/model_parameters/Bronchial toxicity (Grade 5).json +30 -0
  340. pycerr-2.0.0/cerr/roe/model_parameters/Esophagitis (Huang).json +27 -0
  341. pycerr-2.0.0/cerr/roe/model_parameters/Esophagitis (Jackson_cox).json +27 -0
  342. pycerr-2.0.0/cerr/roe/model_parameters/Esophagitis (Jackson_logistic).json +27 -0
  343. pycerr-2.0.0/cerr/roe/model_parameters/Esophagitis (Wijsman).json +35 -0
  344. pycerr-2.0.0/cerr/roe/model_parameters/Pneumonitis (Appelt).json +58 -0
  345. pycerr-2.0.0/cerr/roe/model_parameters/Rectal bleeding (grade 2+).json +20 -0
  346. pycerr-2.0.0/cerr/roe/roe_gui.py +1370 -0
  347. pycerr-2.0.0/cerr/scripts/demo_imrtp_gui.py +53 -0
  348. pycerr-2.0.0/cerr/utils/__init__.py +0 -0
  349. pycerr-2.0.0/cerr/utils/ai_pipeline.py +248 -0
  350. pycerr-2.0.0/cerr/utils/custom_colormaps.py +262 -0
  351. pycerr-2.0.0/cerr/utils/image_proc.py +477 -0
  352. pycerr-2.0.0/cerr/utils/interp.py +218 -0
  353. pycerr-2.0.0/cerr/utils/mask.py +746 -0
  354. pycerr-2.0.0/cerr/utils/statistics.py +31 -0
  355. pycerr-2.0.0/cerr/utils/uid.py +53 -0
  356. pycerr-2.0.0/cerr/viewer/API_pycerr_gui.md +346 -0
  357. pycerr-2.0.0/cerr/viewer/README_pycerr_gui.md +357 -0
  358. pycerr-2.0.0/cerr/viewer/__init__.py +35 -0
  359. pycerr-2.0.0/cerr/viewer/cerr_colormaps.py +4240 -0
  360. pycerr-2.0.0/cerr/viewer/pycerr_gui.py +4701 -0
  361. pycerr-2.0.0/cerr/viewer/pycerr_napari.py +1793 -0
  362. pycerr-2.0.0/cerr/viewer/pycerr_nbviewer.py +683 -0
  363. pycerr-2.0.0/docs/Makefile +20 -0
  364. pycerr-2.0.0/docs/cerr.contour.rst +29 -0
  365. pycerr-2.0.0/docs/cerr.dataclasses.rst +77 -0
  366. pycerr-2.0.0/docs/cerr.datasets.rst +10 -0
  367. pycerr-2.0.0/docs/cerr.dcm_export.rst +37 -0
  368. pycerr-2.0.0/docs/cerr.imrtp.dosecalc.rst +72 -0
  369. pycerr-2.0.0/docs/cerr.imrtp.rst +49 -0
  370. pycerr-2.0.0/docs/cerr.mri_metrics.rst +21 -0
  371. pycerr-2.0.0/docs/cerr.radiomics.rst +109 -0
  372. pycerr-2.0.0/docs/cerr.registration.rst +21 -0
  373. pycerr-2.0.0/docs/cerr.roe.rst +21 -0
  374. pycerr-2.0.0/docs/cerr.rst +55 -0
  375. pycerr-2.0.0/docs/cerr.utils.rst +69 -0
  376. pycerr-2.0.0/docs/cerr.viewer.rst +57 -0
  377. pycerr-2.0.0/docs/conf.py +71 -0
  378. pycerr-2.0.0/docs/index.rst +75 -0
  379. pycerr-2.0.0/docs/make.bat +35 -0
  380. pycerr-2.0.0/docs/modules.rst +7 -0
  381. pycerr-2.0.0/docs/requirements.txt +16 -0
  382. pycerr-2.0.0/docs/setup.rst +7 -0
  383. pycerr-2.0.0/docs/tests.rst +45 -0
  384. pycerr-2.0.0/pycerr.egg-info/PKG-INFO +205 -0
  385. pycerr-2.0.0/pycerr.egg-info/SOURCES.txt +404 -0
  386. pycerr-2.0.0/pycerr.egg-info/dependency_links.txt +1 -0
  387. pycerr-2.0.0/pycerr.egg-info/not-zip-safe +1 -0
  388. pycerr-2.0.0/pycerr.egg-info/requires.txt +22 -0
  389. pycerr-2.0.0/pycerr.egg-info/top_level.txt +1 -0
  390. pycerr-2.0.0/pyproject.toml +81 -0
  391. pycerr-2.0.0/requirements.txt +19 -0
  392. pycerr-2.0.0/setup.cfg +4 -0
  393. pycerr-2.0.0/setup.py +20 -0
  394. pycerr-2.0.0/tests/README.md +215 -0
  395. pycerr-2.0.0/tests/__init__.py +0 -0
  396. pycerr-2.0.0/tests/test_dcm_export_rtstruct.py +55 -0
  397. pycerr-2.0.0/tests/test_dicom_load.py +43 -0
  398. pycerr-2.0.0/tests/test_dvh.py +90 -0
  399. pycerr-2.0.0/tests/test_h5_roundtrip.py +58 -0
  400. pycerr-2.0.0/tests/test_ibsi1_features.py +192 -0
  401. pycerr-2.0.0/tests/test_ibsi2_features.py +192 -0
  402. pycerr-2.0.0/tests/test_ibsi2_filters.py +389 -0
  403. pycerr-2.0.0/tests/test_module_imports.py +63 -0
  404. pycerr-2.0.0/tests/test_nii_export_import.py +40 -0
  405. pycerr-2.0.0/tests/test_rasterization.py +92 -0
  406. 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
@@ -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.