pyradbio 0.1.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 (631) hide show
  1. pyradbio-0.1.0/.env.example +32 -0
  2. pyradbio-0.1.0/.gitattributes +4 -0
  3. pyradbio-0.1.0/.github/workflows/ci.yml +104 -0
  4. pyradbio-0.1.0/.gitignore +60 -0
  5. pyradbio-0.1.0/.gitlab-ci.yml +47 -0
  6. pyradbio-0.1.0/.pre-commit-config.yaml +34 -0
  7. pyradbio-0.1.0/AGENTS.md +220 -0
  8. pyradbio-0.1.0/CHANGELOG.md +168 -0
  9. pyradbio-0.1.0/CITATION.cff +22 -0
  10. pyradbio-0.1.0/CLAUDE.md +70 -0
  11. pyradbio-0.1.0/LICENSE +21 -0
  12. pyradbio-0.1.0/PKG-INFO +263 -0
  13. pyradbio-0.1.0/README.md +178 -0
  14. pyradbio-0.1.0/ROADMAP.md +223 -0
  15. pyradbio-0.1.0/THIRD_PARTY_NOTICES.md +58 -0
  16. pyradbio-0.1.0/data/stopping/README.md +38 -0
  17. pyradbio-0.1.0/data/stopping/ahlen1980/PROVENANCE.md +30 -0
  18. pyradbio-0.1.0/data/stopping/arb1973/PROVENANCE.md +39 -0
  19. pyradbio-0.1.0/data/stopping/astar/PROVENANCE.md +39 -0
  20. pyradbio-0.1.0/data/stopping/brandt1982/PROVENANCE.md +27 -0
  21. pyradbio-0.1.0/data/stopping/estar/PROVENANCE.md +39 -0
  22. pyradbio-0.1.0/data/stopping/icru49/PROVENANCE.md +58 -0
  23. pyradbio-0.1.0/data/stopping/icru73/PROVENANCE.md +75 -0
  24. pyradbio-0.1.0/data/stopping/icru73/README.md +47 -0
  25. pyradbio-0.1.0/data/stopping/icru90/PROVENANCE.md +49 -0
  26. pyradbio-0.1.0/data/stopping/mstar/PROVENANCE.md +82 -0
  27. pyradbio-0.1.0/data/stopping/nist_isotopes/PROVENANCE.md +44 -0
  28. pyradbio-0.1.0/data/stopping/pdg/PROVENANCE.md +39 -0
  29. pyradbio-0.1.0/data/stopping/pstar/PROVENANCE.md +51 -0
  30. pyradbio-0.1.0/docs/architecture.md +105 -0
  31. pyradbio-0.1.0/docs/parameter_conventions.md +29 -0
  32. pyradbio-0.1.0/docs/references/IMK_Matsuya2025.md +257 -0
  33. pyradbio-0.1.0/docs/references/Katz1971.md +166 -0
  34. pyradbio-0.1.0/docs/references/LEM_III_Elsasser2008.md +75 -0
  35. pyradbio-0.1.0/docs/references/LEM_II_Elsasser2007.md +259 -0
  36. pyradbio-0.1.0/docs/references/LEM_IV_Elsasser2010.md +143 -0
  37. pyradbio-0.1.0/docs/references/LEM_IV_Friedrich2012.md +466 -0
  38. pyradbio-0.1.0/docs/references/LEM_IV_OPEN_CHOICES.md +402 -0
  39. pyradbio-0.1.0/docs/references/LEM_I_ScholzKraft.md +351 -0
  40. pyradbio-0.1.0/docs/references/LEM_TrackStructure_Elsasser2008b.md +82 -0
  41. pyradbio-0.1.0/docs/references/MCDS_SemenenkoStewart2006.md +80 -0
  42. pyradbio-0.1.0/docs/references/Microdosimetry.md +243 -0
  43. pyradbio-0.1.0/docs/references/NanOx.md +241 -0
  44. pyradbio-0.1.0/docs/references/NorthcliffeSchilling1970.md +115 -0
  45. pyradbio-0.1.0/docs/references/OSMK_Inaniwa2021_2023.md +257 -0
  46. pyradbio-0.1.0/docs/references/Phenomenological_RBE_models.md +289 -0
  47. pyradbio-0.1.0/docs/references/README.md +72 -0
  48. pyradbio-0.1.0/docs/references/RMF_Carlson2008_Frese2012.md +165 -0
  49. pyradbio-0.1.0/docs/references/RadPhysBio.md +101 -0
  50. pyradbio-0.1.0/docs/references/SMK_Inaniwa2018.md +214 -0
  51. pyradbio-0.1.0/docs/references/StoppingPower.md +249 -0
  52. pyradbio-0.1.0/docs/references/mMKM_Inaniwa2010.md +50 -0
  53. pyradbio-0.1.0/docs/references/pide_schema.md +85 -0
  54. pyradbio-0.1.0/docs/references/pyMKM_API.md +110 -0
  55. pyradbio-0.1.0/docs/references/rapidLEM_KraemerScholz2006.md +70 -0
  56. pyradbio-0.1.0/docs/references/survival_repo_notes.md +282 -0
  57. pyradbio-0.1.0/examples/README.md +112 -0
  58. pyradbio-0.1.0/examples/dose_protraction_and_bed.py +198 -0
  59. pyradbio-0.1.0/examples/katz_ion_kill_and_gamma_kill.py +217 -0
  60. pyradbio-0.1.0/examples/lem1_variants.py +232 -0
  61. pyradbio-0.1.0/examples/lineal_energy_spectra.py +242 -0
  62. pyradbio-0.1.0/examples/mcf_mkm_rbe_vs_let.py +116 -0
  63. pyradbio-0.1.0/examples/mixed_field_parameters.py +181 -0
  64. pyradbio-0.1.0/examples/mkm_zstar_and_alpha.py +155 -0
  65. pyradbio-0.1.0/examples/model_comparison_alpha_beta.py +183 -0
  66. pyradbio-0.1.0/examples/nanox_local_and_global_events.py +248 -0
  67. pyradbio-0.1.0/examples/osmk_oxygen_effect.py +219 -0
  68. pyradbio-0.1.0/examples/phenomenological_rbe_models.py +248 -0
  69. pyradbio-0.1.0/examples/radial_dose_profiles.py +140 -0
  70. pyradbio-0.1.0/examples/rmf_dsb_and_binary_misrepair.py +223 -0
  71. pyradbio-0.1.0/examples/smk_nucleus_stochastics.py +172 -0
  72. pyradbio-0.1.0/examples/survival_and_rbe.py +80 -0
  73. pyradbio-0.1.0/examples/water_stopping_power.py +64 -0
  74. pyradbio-0.1.0/pyproject.toml +152 -0
  75. pyradbio-0.1.0/pyradbio/__init__.py +60 -0
  76. pyradbio-0.1.0/pyradbio/benchmark/__init__.py +7 -0
  77. pyradbio-0.1.0/pyradbio/benchmark/cell_identity.py +79 -0
  78. pyradbio-0.1.0/pyradbio/benchmark/checkpoint.py +604 -0
  79. pyradbio-0.1.0/pyradbio/benchmark/crosscheck.py +574 -0
  80. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_11MeVu_data.csv +21 -0
  81. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_11MeVu_modified_lem.csv +52 -0
  82. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_11MeVu_original_lem.csv +42 -0
  83. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_266.4MeVu_data.csv +11 -0
  84. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_266.4MeVu_modified_lem.csv +83 -0
  85. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_266.4MeVu_original_lem.csv +50 -0
  86. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_4.2MeVu_data.csv +15 -0
  87. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_4.2MeVu_modified_lem.csv +102 -0
  88. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_4.2MeVu_original_lem.csv +44 -0
  89. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_76.9MeVu_data.csv +13 -0
  90. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_76.9MeVu_modified_lem.csv +78 -0
  91. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure10_76.9MeVu_original_lem.csv +53 -0
  92. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure11_carbon_data.csv +19 -0
  93. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure11_carbon_modified_lem.csv +85 -0
  94. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure11_carbon_original_lem.csv +33 -0
  95. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure11_helium_data.csv +15 -0
  96. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure11_helium_modified_lem.csv +20 -0
  97. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure11_helium_original_lem.csv +61 -0
  98. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure12_11MeVu_data.csv +18 -0
  99. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure12_11MeVu_modified_lem.csv +46 -0
  100. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure12_4.2MeVu_data.csv +18 -0
  101. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure12_4.2MeVu_modified_lem.csv +69 -0
  102. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure12_76.9MeVu_data.csv +14 -0
  103. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure12_76.9MeVu_modified_lem.csv +31 -0
  104. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure12_xray_reference.csv +37 -0
  105. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure2_eta.csv +204 -0
  106. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure3a_cluster.csv +54 -0
  107. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure3a_lq_shoulder.csv +23 -0
  108. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure3a_original.csv +48 -0
  109. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure3b_cluster.csv +58 -0
  110. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure3b_lq_shoulder.csv +22 -0
  111. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure3b_original.csv +54 -0
  112. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure4_neon_data.csv +18 -0
  113. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure4_neon_modified.csv +9 -0
  114. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure4_neon_original.csv +11 -0
  115. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure4_oxygen_data.csv +15 -0
  116. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure4_oxygen_modified.csv +41 -0
  117. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure4_oxygen_original.csv +24 -0
  118. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure6_clusters.csv +53 -0
  119. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure6_lem_new.csv +113 -0
  120. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure6_lem_old.csv +23 -0
  121. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure6_radial.csv +109 -0
  122. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure6_radial_clusters.csv +82 -0
  123. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure6_reduced_dt.csv +113 -0
  124. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure7_cluster_h10.csv +72 -0
  125. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure7_cluster_h10_dt11.csv +28 -0
  126. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure7_cluster_h20.csv +69 -0
  127. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure7_cluster_h35.csv +149 -0
  128. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure7_lem_new.csv +48 -0
  129. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure7_lem_old.csv +48 -0
  130. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure8_cho_data.csv +12 -0
  131. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure8_cho_modified_lem.csv +103 -0
  132. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure8_cho_original_lem.csv +87 -0
  133. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure8_v79_data.csv +10 -0
  134. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure8_v79_modified_lem.csv +40 -0
  135. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure8_v79_original_lem.csv +65 -0
  136. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure9_modified_lem_calc.csv +69 -0
  137. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure9_original_lem_calc.csv +37 -0
  138. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2007_figure9_v79_data.csv +11 -0
  139. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4a_v79_helium_data_rbealpha.csv +9 -0
  140. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4a_v79_helium_model_rbealpha.csv +150 -0
  141. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4a_v79_proton_data_rbealpha.csv +15 -0
  142. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4a_v79_proton_model_rbealpha.csv +146 -0
  143. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4b_hsg_carbon_data_rbe10.csv +20 -0
  144. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4b_hsg_carbon_data_rbealpha.csv +20 -0
  145. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4b_hsg_carbon_model_rbe10.csv +150 -0
  146. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4b_hsg_carbon_model_rbealpha.csv +149 -0
  147. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4b_hsg_helium_data_rbe10.csv +16 -0
  148. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4b_hsg_helium_data_rbealpha.csv +17 -0
  149. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4b_hsg_helium_model_rbe10.csv +150 -0
  150. pyradbio-0.1.0/pyradbio/benchmark/data/elsasser2010_figure4b_hsg_helium_model_rbealpha.csv +148 -0
  151. pyradbio-0.1.0/pyradbio/benchmark/data/friedrich2012_figure3_v79_carbon_calc_rbe_10.csv +42 -0
  152. pyradbio-0.1.0/pyradbio/benchmark/data/friedrich2012_figure3_v79_carbon_calc_rbe_alpha.csv +45 -0
  153. pyradbio-0.1.0/pyradbio/benchmark/data/friedrich2012_figure3_v79_carbon_data_rbe_10.csv +28 -0
  154. pyradbio-0.1.0/pyradbio/benchmark/data/friedrich2012_figure3_v79_carbon_data_rbe_alpha.csv +27 -0
  155. pyradbio-0.1.0/pyradbio/benchmark/data/friedrich2012_figure4_hypothetical_carbon_approx_alpha.csv +37 -0
  156. pyradbio-0.1.0/pyradbio/benchmark/data/friedrich2012_figure4_hypothetical_carbon_approx_beta.csv +40 -0
  157. pyradbio-0.1.0/pyradbio/benchmark/data/friedrich2012_figure4_hypothetical_carbon_full_simulation_alpha.csv +27 -0
  158. pyradbio-0.1.0/pyradbio/benchmark/data/friedrich2012_figure4_hypothetical_carbon_full_simulation_beta.csv +107 -0
  159. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2018_fig4a_z_domain.csv +1403 -0
  160. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2018_fig4b_z_star_domain.csv +1403 -0
  161. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2018_fig4c_z_nucleus.csv +1403 -0
  162. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2018_survival.csv +2402 -0
  163. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig5_hsg_C_exp_0mmHg.csv +22 -0
  164. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig5_hsg_C_osmk_0mmHg.csv +87 -0
  165. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig5_hsg_He_exp_0mmHg.csv +9 -0
  166. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig5_hsg_He_osmk_0mmHg.csv +67 -0
  167. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig5_hsg_Ne_exp_0mmHg.csv +22 -0
  168. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig5_hsg_Ne_osmk_0mmHg.csv +91 -0
  169. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig6_v79_C_exp_0mmHg.csv +23 -0
  170. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig6_v79_C_osmk_0mmHg.csv +85 -0
  171. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig6_v79_He_exp_0mmHg.csv +22 -0
  172. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig6_v79_He_osmk_0mmHg.csv +65 -0
  173. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig6_v79_Ne_exp_0mmHg.csv +16 -0
  174. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig6_v79_Ne_osmk_0mmHg.csv +68 -0
  175. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_C_exp_0mmHg.csv +8 -0
  176. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_C_exp_15p2mmHg.csv +6 -0
  177. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_C_exp_1p14mmHg.csv +6 -0
  178. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_C_exp_3p8mmHg.csv +6 -0
  179. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_C_osmk_0mmHg.csv +39 -0
  180. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_C_osmk_15p2mmHg.csv +38 -0
  181. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_C_osmk_1p14mmHg.csv +39 -0
  182. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_C_osmk_3p8mmHg.csv +37 -0
  183. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_N_exp_0mmHg.csv +4 -0
  184. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_N_osmk_0mmHg.csv +32 -0
  185. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_O_exp_0mmHg.csv +4 -0
  186. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_O_osmk_0mmHg.csv +48 -0
  187. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_Si_exp_0mmHg.csv +4 -0
  188. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_Si_exp_15p2mmHg.csv +4 -0
  189. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_Si_exp_3p8mmHg.csv +4 -0
  190. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_Si_osmk_0mmHg.csv +61 -0
  191. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_Si_osmk_15p2mmHg.csv +24 -0
  192. pyradbio-0.1.0/pyradbio/benchmark/data/inaniwa2021_fig7_cho_Si_osmk_3p8mmHg.csv +29 -0
  193. pyradbio-0.1.0/pyradbio/benchmark/data/matsuya2025_fig2_survival.csv +323 -0
  194. pyradbio-0.1.0/pyradbio/benchmark/data/matsuya2025_fig4_micronuclei.csv +319 -0
  195. pyradbio-0.1.0/pyradbio/benchmark/data/matsuya2025_fig7_dose_rate.csv +199 -0
  196. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure1_carbon_approx.csv +22 -0
  197. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure1_carbon_exact.csv +21 -0
  198. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure1_protons_approx.csv +25 -0
  199. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure1_protons_exact.csv +26 -0
  200. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure2_carbon_exact_1MeVu.csv +6 -0
  201. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure2_carbon_exact_400MeVu.csv +6 -0
  202. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure2_carbon_exact_50MeVu.csv +6 -0
  203. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure2_carbon_exact_8MeVu.csv +6 -0
  204. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure2_protons_exact_1MeVu.csv +6 -0
  205. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure2_protons_exact_200MeVu.csv +6 -0
  206. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure2_protons_exact_50MeVu.csv +6 -0
  207. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure2_protons_exact_8MeVu.csv +6 -0
  208. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure3_carbon_approx.csv +17 -0
  209. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure3_carbon_exact.csv +16 -0
  210. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure3_protons_approx.csv +19 -0
  211. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure3_protons_exact.csv +21 -0
  212. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_carbon_approx_1MeVu.csv +6 -0
  213. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_carbon_approx_200MeVu.csv +6 -0
  214. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_carbon_approx_50MeVu.csv +6 -0
  215. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_carbon_approx_8MeVu.csv +6 -0
  216. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_carbon_exact_1MeVu.csv +6 -0
  217. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_carbon_exact_200MeVu.csv +6 -0
  218. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_carbon_exact_50MeVu.csv +6 -0
  219. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_carbon_exact_8MeVu.csv +6 -0
  220. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_protons_approx_1MeVu.csv +6 -0
  221. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_protons_approx_200MeVu.csv +6 -0
  222. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_protons_approx_50MeVu.csv +6 -0
  223. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_protons_approx_8MeVu.csv +6 -0
  224. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_protons_exact_1MeVu.csv +6 -0
  225. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_protons_exact_200MeVu.csv +6 -0
  226. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_protons_exact_50MeVu.csv +6 -0
  227. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure4_protons_exact_8MeVu.csv +6 -0
  228. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_carbon_approx_1MeVu.csv +20 -0
  229. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_carbon_approx_400MeVu.csv +20 -0
  230. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_carbon_approx_50MeVu.csv +20 -0
  231. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_carbon_approx_8MeVu.csv +20 -0
  232. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_carbon_exact_1MeVu.csv +20 -0
  233. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_carbon_exact_400MeVu.csv +20 -0
  234. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_carbon_exact_50MeVu.csv +20 -0
  235. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_carbon_exact_8MeVu.csv +20 -0
  236. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_protons_approx_1MeVu.csv +20 -0
  237. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_protons_approx_200MeVu.csv +20 -0
  238. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_protons_approx_50MeVu.csv +20 -0
  239. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_protons_approx_8MeVu.csv +20 -0
  240. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_protons_exact_1MeVu.csv +20 -0
  241. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_protons_exact_200MeVu.csv +20 -0
  242. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_protons_exact_50MeVu.csv +20 -0
  243. pyradbio-0.1.0/pyradbio/benchmark/data/scholz1997_figure5_protons_exact_8MeVu.csv +20 -0
  244. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_argon_data.csv +13 -0
  245. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_carbon_data.csv +11 -0
  246. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_curve1_calc.csv +44 -0
  247. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_curve2_calc.csv +37 -0
  248. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_curve3_calc.csv +44 -0
  249. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_curve4_calc.csv +15 -0
  250. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_curve5_calc.csv +14 -0
  251. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_curve6_calc.csv +15 -0
  252. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_helium_data.csv +10 -0
  253. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_krypton_data.csv +7 -0
  254. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_neon_data.csv +10 -0
  255. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_uranium_data.csv +13 -0
  256. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure2_xenon_data.csv +9 -0
  257. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure3_argon_calc.csv +49 -0
  258. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure3_argon_data.csv +13 -0
  259. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure3_carbon_calc.csv +52 -0
  260. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure3_carbon_data.csv +12 -0
  261. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure3_uranium_calc.csv +192 -0
  262. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure3_uranium_data.csv +17 -0
  263. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_carbon_calc_s0p01.csv +18 -0
  264. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_carbon_calc_s0p2.csv +18 -0
  265. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_carbon_calc_s0p8.csv +21 -0
  266. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_helium_calc_s0p01.csv +29 -0
  267. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_helium_calc_s0p2.csv +30 -0
  268. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_helium_calc_s0p8.csv +45 -0
  269. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_proton_calc_s0p01.csv +53 -0
  270. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_proton_calc_s0p2.csv +51 -0
  271. pyradbio-0.1.0/pyradbio/benchmark/data/scholz_kraft1996_figure4_proton_calc_s0p8.csv +63 -0
  272. pyradbio-0.1.0/pyradbio/benchmark/dataset.py +395 -0
  273. pyradbio-0.1.0/pyradbio/benchmark/elsasser2007.py +739 -0
  274. pyradbio-0.1.0/pyradbio/benchmark/elsasser2008.py +616 -0
  275. pyradbio-0.1.0/pyradbio/benchmark/elsasser2008b.py +173 -0
  276. pyradbio-0.1.0/pyradbio/benchmark/elsasser2010.py +270 -0
  277. pyradbio-0.1.0/pyradbio/benchmark/friedrich2012.py +523 -0
  278. pyradbio-0.1.0/pyradbio/benchmark/harness.py +1044 -0
  279. pyradbio-0.1.0/pyradbio/benchmark/hartzell2025.py +28 -0
  280. pyradbio-0.1.0/pyradbio/benchmark/inaniwa2018.py +478 -0
  281. pyradbio-0.1.0/pyradbio/benchmark/inaniwa2021.py +538 -0
  282. pyradbio-0.1.0/pyradbio/benchmark/manganaro2018.py +476 -0
  283. pyradbio-0.1.0/pyradbio/benchmark/matsuya2025.py +779 -0
  284. pyradbio-0.1.0/pyradbio/benchmark/metrics.py +264 -0
  285. pyradbio-0.1.0/pyradbio/benchmark/pide.py +395 -0
  286. pyradbio-0.1.0/pyradbio/benchmark/radphysbio.py +791 -0
  287. pyradbio-0.1.0/pyradbio/benchmark/reference_tables.py +575 -0
  288. pyradbio-0.1.0/pyradbio/benchmark/report.py +181 -0
  289. pyradbio-0.1.0/pyradbio/benchmark/sato2012.py +171 -0
  290. pyradbio-0.1.0/pyradbio/benchmark/scholz1997.py +724 -0
  291. pyradbio-0.1.0/pyradbio/benchmark/scholz_kraft1996.py +1270 -0
  292. pyradbio-0.1.0/pyradbio/benchmark/stopping.py +125 -0
  293. pyradbio-0.1.0/pyradbio/benchmark/sweeps.py +290 -0
  294. pyradbio-0.1.0/pyradbio/cli.py +453 -0
  295. pyradbio-0.1.0/pyradbio/core/__init__.py +88 -0
  296. pyradbio-0.1.0/pyradbio/core/cell.py +78 -0
  297. pyradbio-0.1.0/pyradbio/core/chromatin.py +147 -0
  298. pyradbio-0.1.0/pyradbio/core/constants.py +78 -0
  299. pyradbio-0.1.0/pyradbio/core/elements.py +64 -0
  300. pyradbio-0.1.0/pyradbio/core/lq.py +370 -0
  301. pyradbio-0.1.0/pyradbio/core/mixing.py +354 -0
  302. pyradbio-0.1.0/pyradbio/core/oxygen.py +133 -0
  303. pyradbio-0.1.0/pyradbio/core/photon.py +107 -0
  304. pyradbio-0.1.0/pyradbio/core/protraction.py +350 -0
  305. pyradbio-0.1.0/pyradbio/core/radiation.py +148 -0
  306. pyradbio-0.1.0/pyradbio/data/__init__.py +1 -0
  307. pyradbio-0.1.0/pyradbio/data/reference_parameters.py +24 -0
  308. pyradbio-0.1.0/pyradbio/datasets.py +172 -0
  309. pyradbio-0.1.0/pyradbio/micro/__init__.py +81 -0
  310. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_carbon_AMF_100MeVu.csv +35 -0
  311. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_carbon_AMF_10MeVu.csv +42 -0
  312. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_carbon_AMF_1MeVu.csv +42 -0
  313. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_carbon_nBio_100MeVu.csv +33 -0
  314. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_carbon_nBio_10MeVu.csv +47 -0
  315. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_carbon_nBio_1MeVu.csv +36 -0
  316. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_helium_AMF_100MeVu.csv +25 -0
  317. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_helium_AMF_10MeVu.csv +27 -0
  318. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_helium_AMF_1MeVu.csv +36 -0
  319. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_helium_nBio_100MeVu.csv +44 -0
  320. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_helium_nBio_10MeVu.csv +25 -0
  321. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_helium_nBio_1MeVu.csv +36 -0
  322. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_hydrogen_AMF_100MeVu.csv +19 -0
  323. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_hydrogen_AMF_10MeVu.csv +21 -0
  324. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_hydrogen_AMF_1MeVu.csv +24 -0
  325. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_hydrogen_nBio_100MeVu.csv +23 -0
  326. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_hydrogen_nBio_10MeVu.csv +28 -0
  327. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_hydrogen_nBio_1MeVu.csv +28 -0
  328. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_lithium_AMF_100MeVu.csv +29 -0
  329. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_lithium_AMF_10MeVu.csv +40 -0
  330. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_lithium_AMF_1MeVu.csv +35 -0
  331. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_lithium_nBio_100MeVu.csv +40 -0
  332. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_lithium_nBio_10MeVu.csv +34 -0
  333. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_lithium_nBio_1MeVu.csv +29 -0
  334. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_neon_AMF_100MeVu.csv +48 -0
  335. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_neon_AMF_10MeVu.csv +52 -0
  336. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_neon_AMF_1MeVu.csv +36 -0
  337. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_neon_nBio_100MeVu.csv +45 -0
  338. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_neon_nBio_10MeVu.csv +56 -0
  339. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_neon_nBio_1MeVu.csv +38 -0
  340. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_oxygen_AMF_100MeVu.csv +46 -0
  341. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_oxygen_AMF_10MeVu.csv +44 -0
  342. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_oxygen_AMF_1MeVu.csv +42 -0
  343. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_oxygen_nBio_100MeVu.csv +38 -0
  344. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_oxygen_nBio_10MeVu.csv +57 -0
  345. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure4_oxygen_nBio_1MeVu.csv +40 -0
  346. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_AMF_rD0p0015um.csv +57 -0
  347. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_AMF_rD0p015um.csv +47 -0
  348. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_AMF_rD0p05um.csv +23 -0
  349. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_AMF_rD0p3um.csv +20 -0
  350. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_AMF_rD0p5um.csv +36 -0
  351. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_nBio_rD0p0015um.csv +57 -0
  352. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_nBio_rD0p015um.csv +52 -0
  353. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_nBio_rD0p05um.csv +51 -0
  354. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_nBio_rD0p3um.csv +26 -0
  355. pyradbio-0.1.0/pyradbio/micro/data/hartzell2025_figure7_carbon_nBio_rD0p5um.csv +123 -0
  356. pyradbio-0.1.0/pyradbio/micro/hartzell2025.py +206 -0
  357. pyradbio-0.1.0/pyradbio/micro/impact_parameter.py +321 -0
  358. pyradbio-0.1.0/pyradbio/micro/library.py +173 -0
  359. pyradbio-0.1.0/pyradbio/micro/lineal_energy.py +1826 -0
  360. pyradbio-0.1.0/pyradbio/micro/mcds.py +188 -0
  361. pyradbio-0.1.0/pyradbio/micro/multi_event.py +257 -0
  362. pyradbio-0.1.0/pyradbio/micro/sato.py +239 -0
  363. pyradbio-0.1.0/pyradbio/micro/sato_coefficients.py +161 -0
  364. pyradbio-0.1.0/pyradbio/models/__init__.py +9 -0
  365. pyradbio-0.1.0/pyradbio/models/base.py +406 -0
  366. pyradbio-0.1.0/pyradbio/models/katz/__init__.py +20 -0
  367. pyradbio-0.1.0/pyradbio/models/katz/model.py +648 -0
  368. pyradbio-0.1.0/pyradbio/models/lem/__init__.py +5 -0
  369. pyradbio-0.1.0/pyradbio/models/lem/_discrete.py +286 -0
  370. pyradbio-0.1.0/pyradbio/models/lem/_intertrack_kernel.py +916 -0
  371. pyradbio-0.1.0/pyradbio/models/lem/_lem4_kernel.py +311 -0
  372. pyradbio-0.1.0/pyradbio/models/lem/_localdose.py +604 -0
  373. pyradbio-0.1.0/pyradbio/models/lem/_localdose_kernel.py +146 -0
  374. pyradbio-0.1.0/pyradbio/models/lem/_mc_kernel.py +782 -0
  375. pyradbio-0.1.0/pyradbio/models/lem/base.py +2458 -0
  376. pyradbio-0.1.0/pyradbio/models/lem/engine.py +21 -0
  377. pyradbio-0.1.0/pyradbio/models/lem/lem1.py +627 -0
  378. pyradbio-0.1.0/pyradbio/models/lem/lem2.py +477 -0
  379. pyradbio-0.1.0/pyradbio/models/lem/lem3.py +44 -0
  380. pyradbio-0.1.0/pyradbio/models/lem/lem4.py +2679 -0
  381. pyradbio-0.1.0/pyradbio/models/mkm/__init__.py +65 -0
  382. pyradbio-0.1.0/pyradbio/models/mkm/base.py +104 -0
  383. pyradbio-0.1.0/pyradbio/models/mkm/imk.py +424 -0
  384. pyradbio-0.1.0/pyradbio/models/mkm/model.py +174 -0
  385. pyradbio-0.1.0/pyradbio/models/mkm/native_backend.py +137 -0
  386. pyradbio-0.1.0/pyradbio/models/mkm/osmk.py +557 -0
  387. pyradbio-0.1.0/pyradbio/models/mkm/pymkm_backend.py +365 -0
  388. pyradbio-0.1.0/pyradbio/models/mkm/spectrum_models.py +1723 -0
  389. pyradbio-0.1.0/pyradbio/models/nanox/__init__.py +58 -0
  390. pyradbio-0.1.0/pyradbio/models/nanox/base.py +61 -0
  391. pyradbio-0.1.0/pyradbio/models/nanox/ellf.py +228 -0
  392. pyradbio-0.1.0/pyradbio/models/nanox/model.py +647 -0
  393. pyradbio-0.1.0/pyradbio/models/phenomenological/__init__.py +69 -0
  394. pyradbio-0.1.0/pyradbio/models/phenomenological/base.py +323 -0
  395. pyradbio-0.1.0/pyradbio/models/phenomenological/carabe.py +79 -0
  396. pyradbio-0.1.0/pyradbio/models/phenomenological/chen.py +90 -0
  397. pyradbio-0.1.0/pyradbio/models/phenomenological/frese.py +112 -0
  398. pyradbio-0.1.0/pyradbio/models/phenomenological/jones.py +120 -0
  399. pyradbio-0.1.0/pyradbio/models/phenomenological/mairani.py +65 -0
  400. pyradbio-0.1.0/pyradbio/models/phenomenological/mcnamara.py +58 -0
  401. pyradbio-0.1.0/pyradbio/models/phenomenological/peeler.py +85 -0
  402. pyradbio-0.1.0/pyradbio/models/phenomenological/rorvik.py +62 -0
  403. pyradbio-0.1.0/pyradbio/models/phenomenological/tilly.py +104 -0
  404. pyradbio-0.1.0/pyradbio/models/phenomenological/unkelbach.py +72 -0
  405. pyradbio-0.1.0/pyradbio/models/phenomenological/wedenberg.py +60 -0
  406. pyradbio-0.1.0/pyradbio/models/phenomenological/wilkens.py +82 -0
  407. pyradbio-0.1.0/pyradbio/models/rmf/__init__.py +32 -0
  408. pyradbio-0.1.0/pyradbio/models/rmf/model.py +372 -0
  409. pyradbio-0.1.0/pyradbio/plotting.py +111 -0
  410. pyradbio-0.1.0/pyradbio/tables/__init__.py +21 -0
  411. pyradbio-0.1.0/pyradbio/tables/alpha_beta.py +142 -0
  412. pyradbio-0.1.0/pyradbio/tables/io.py +190 -0
  413. pyradbio-0.1.0/pyradbio/tables/zstar.py +90 -0
  414. pyradbio-0.1.0/pyradbio/track/__init__.py +1 -0
  415. pyradbio-0.1.0/pyradbio/track/base.py +32 -0
  416. pyradbio-0.1.0/pyradbio/track/data/northcliffe_schilling1970_water.csv +3939 -0
  417. pyradbio-0.1.0/pyradbio/track/kiefer_chatterjee.py +160 -0
  418. pyradbio-0.1.0/pyradbio/track/northcliffe_schilling.py +185 -0
  419. pyradbio-0.1.0/pyradbio/track/scholz_kraft.py +277 -0
  420. pyradbio-0.1.0/pyradbio/track/srim.py +201 -0
  421. pyradbio-0.1.0/pyradbio/track/stopping/__init__.py +82 -0
  422. pyradbio-0.1.0/pyradbio/track/stopping/_tabulated.py +187 -0
  423. pyradbio-0.1.0/pyradbio/track/stopping/barkas.py +164 -0
  424. pyradbio-0.1.0/pyradbio/track/stopping/base.py +315 -0
  425. pyradbio-0.1.0/pyradbio/track/stopping/bethe.py +524 -0
  426. pyradbio-0.1.0/pyradbio/track/stopping/data/ahlen1980_cos_chi.csv +208 -0
  427. pyradbio-0.1.0/pyradbio/track/stopping/data/astar_water_liquid.csv +313 -0
  428. pyradbio-0.1.0/pyradbio/track/stopping/data/barkas_arb1973.csv +109 -0
  429. pyradbio-0.1.0/pyradbio/track/stopping/data/brandt1982_ionization.csv +129 -0
  430. pyradbio-0.1.0/pyradbio/track/stopping/data/density_effect_water_liquid.csv +437 -0
  431. pyradbio-0.1.0/pyradbio/track/stopping/data/icru49_empirical_water.csv +273 -0
  432. pyradbio-0.1.0/pyradbio/track/stopping/data/icru49_reduced_nuclear.csv +658 -0
  433. pyradbio-0.1.0/pyradbio/track/stopping/data/icru73_2005_water_liquid.csv +3741 -0
  434. pyradbio-0.1.0/pyradbio/track/stopping/data/icru73_2009_water_liquid.csv +3741 -0
  435. pyradbio-0.1.0/pyradbio/track/stopping/data/icru90_water_liquid.csv +1019 -0
  436. pyradbio-0.1.0/pyradbio/track/stopping/data/mstar_c_water_liquid.csv +5341 -0
  437. pyradbio-0.1.0/pyradbio/track/stopping/data/mstar_d_water_liquid.csv +5341 -0
  438. pyradbio-0.1.0/pyradbio/track/stopping/data/nist_isotope_masses.csv +2976 -0
  439. pyradbio-0.1.0/pyradbio/track/stopping/data/pstar_water_liquid.csv +363 -0
  440. pyradbio-0.1.0/pyradbio/track/stopping/data/shell_corrections_water.csv +143 -0
  441. pyradbio-0.1.0/pyradbio/track/stopping/data/sternheimer_water_liquid.csv +9 -0
  442. pyradbio-0.1.0/pyradbio/track/stopping/effective_charge.py +231 -0
  443. pyradbio-0.1.0/pyradbio/track/stopping/grid.py +344 -0
  444. pyradbio-0.1.0/pyradbio/track/stopping/higher_order.py +194 -0
  445. pyradbio-0.1.0/pyradbio/track/stopping/hubert.py +125 -0
  446. pyradbio-0.1.0/pyradbio/track/stopping/icru.py +133 -0
  447. pyradbio-0.1.0/pyradbio/track/stopping/icru49_empirical.py +77 -0
  448. pyradbio-0.1.0/pyradbio/track/stopping/icru90_procedure.py +377 -0
  449. pyradbio-0.1.0/pyradbio/track/stopping/masses.py +116 -0
  450. pyradbio-0.1.0/pyradbio/track/stopping/mstar/__init__.py +198 -0
  451. pyradbio-0.1.0/pyradbio/track/stopping/mstar/database.py +92 -0
  452. pyradbio-0.1.0/pyradbio/track/stopping/mstar/paul.py +212 -0
  453. pyradbio-0.1.0/pyradbio/track/stopping/mstar/spline.py +62 -0
  454. pyradbio-0.1.0/pyradbio/track/stopping/nuclear.py +234 -0
  455. pyradbio-0.1.0/pyradbio/track/stopping/shell.py +418 -0
  456. pyradbio-0.1.0/pyradbio/track/stopping/xstar.py +273 -0
  457. pyradbio-0.1.0/pyradbio/track/stopping_power.py +686 -0
  458. pyradbio-0.1.0/scripts/README.md +48 -0
  459. pyradbio-0.1.0/scripts/lem1_mc_reference.py +776 -0
  460. pyradbio-0.1.0/scripts/lem4_friedrich2012_mc.py +326 -0
  461. pyradbio-0.1.0/scripts/lem_mc_vs_survival.py +240 -0
  462. pyradbio-0.1.0/scripts/stopping/build_tables.py +734 -0
  463. pyradbio-0.1.0/scripts/stopping/fetch_sources.py +881 -0
  464. pyradbio-0.1.0/scripts/stopping/mstar_reference.py +135 -0
  465. pyradbio-0.1.0/scripts/survival_paired_mc.py +669 -0
  466. pyradbio-0.1.0/tests/__init__.py +0 -0
  467. pyradbio-0.1.0/tests/benchmark/__init__.py +0 -0
  468. pyradbio-0.1.0/tests/benchmark/fixtures/README.md +16 -0
  469. pyradbio-0.1.0/tests/benchmark/fixtures/make_synthetic_pide.py +65 -0
  470. pyradbio-0.1.0/tests/benchmark/fixtures/radphysbio_excerpt.csv +133 -0
  471. pyradbio-0.1.0/tests/benchmark/fixtures/synthetic_pide.xlsx +0 -0
  472. pyradbio-0.1.0/tests/benchmark/test_checkpoint.py +1070 -0
  473. pyradbio-0.1.0/tests/benchmark/test_cli_benchmark.py +189 -0
  474. pyradbio-0.1.0/tests/benchmark/test_crosscheck.py +409 -0
  475. pyradbio-0.1.0/tests/benchmark/test_dataset.py +138 -0
  476. pyradbio-0.1.0/tests/benchmark/test_elsasser2007.py +722 -0
  477. pyradbio-0.1.0/tests/benchmark/test_elsasser2008.py +204 -0
  478. pyradbio-0.1.0/tests/benchmark/test_elsasser2008b.py +154 -0
  479. pyradbio-0.1.0/tests/benchmark/test_elsasser2010.py +154 -0
  480. pyradbio-0.1.0/tests/benchmark/test_friedrich2012.py +241 -0
  481. pyradbio-0.1.0/tests/benchmark/test_harness.py +305 -0
  482. pyradbio-0.1.0/tests/benchmark/test_harness_extensions.py +239 -0
  483. pyradbio-0.1.0/tests/benchmark/test_harness_registry.py +394 -0
  484. pyradbio-0.1.0/tests/benchmark/test_hartzell2025.py +66 -0
  485. pyradbio-0.1.0/tests/benchmark/test_inaniwa2018.py +422 -0
  486. pyradbio-0.1.0/tests/benchmark/test_inaniwa2021.py +493 -0
  487. pyradbio-0.1.0/tests/benchmark/test_lem1_mc_fingerprints.py +305 -0
  488. pyradbio-0.1.0/tests/benchmark/test_manganaro2018.py +232 -0
  489. pyradbio-0.1.0/tests/benchmark/test_matsuya2025.py +767 -0
  490. pyradbio-0.1.0/tests/benchmark/test_metrics.py +90 -0
  491. pyradbio-0.1.0/tests/benchmark/test_metrics_summaries.py +306 -0
  492. pyradbio-0.1.0/tests/benchmark/test_paper_inputs_methods.py +262 -0
  493. pyradbio-0.1.0/tests/benchmark/test_pide_loader.py +195 -0
  494. pyradbio-0.1.0/tests/benchmark/test_radphysbio.py +413 -0
  495. pyradbio-0.1.0/tests/benchmark/test_reference_tables.py +590 -0
  496. pyradbio-0.1.0/tests/benchmark/test_report.py +103 -0
  497. pyradbio-0.1.0/tests/benchmark/test_sato2012.py +150 -0
  498. pyradbio-0.1.0/tests/benchmark/test_scholz1997.py +389 -0
  499. pyradbio-0.1.0/tests/benchmark/test_scholz_kraft1996.py +331 -0
  500. pyradbio-0.1.0/tests/benchmark/test_scholz_kraft1996_mc.py +282 -0
  501. pyradbio-0.1.0/tests/benchmark/test_survival_cache_fingerprint.py +58 -0
  502. pyradbio-0.1.0/tests/benchmark/test_sweeps.py +519 -0
  503. pyradbio-0.1.0/tests/conftest.py +79 -0
  504. pyradbio-0.1.0/tests/core/__init__.py +0 -0
  505. pyradbio-0.1.0/tests/core/test_cell.py +53 -0
  506. pyradbio-0.1.0/tests/core/test_chromatin.py +107 -0
  507. pyradbio-0.1.0/tests/core/test_lq.py +268 -0
  508. pyradbio-0.1.0/tests/core/test_lq_fits.py +476 -0
  509. pyradbio-0.1.0/tests/core/test_mixing.py +272 -0
  510. pyradbio-0.1.0/tests/core/test_oxygen.py +123 -0
  511. pyradbio-0.1.0/tests/core/test_photon.py +90 -0
  512. pyradbio-0.1.0/tests/core/test_protraction.py +490 -0
  513. pyradbio-0.1.0/tests/core/test_radiation.py +126 -0
  514. pyradbio-0.1.0/tests/examples/__init__.py +0 -0
  515. pyradbio-0.1.0/tests/examples/_harness.py +136 -0
  516. pyradbio-0.1.0/tests/examples/test_examples_imports.py +72 -0
  517. pyradbio-0.1.0/tests/examples/test_examples_smoke.py +68 -0
  518. pyradbio-0.1.0/tests/examples/test_harness.py +155 -0
  519. pyradbio-0.1.0/tests/micro/__init__.py +0 -0
  520. pyradbio-0.1.0/tests/micro/fixtures/1mm_synthetic/Proton_10.500000_MeV.csv +7 -0
  521. pyradbio-0.1.0/tests/micro/fixtures/1mm_synthetic/Proton_100.500000_MeV.csv +7 -0
  522. pyradbio-0.1.0/tests/micro/test_impact_parameter.py +116 -0
  523. pyradbio-0.1.0/tests/micro/test_library.py +113 -0
  524. pyradbio-0.1.0/tests/micro/test_lineal_energy.py +893 -0
  525. pyradbio-0.1.0/tests/micro/test_mcds.py +220 -0
  526. pyradbio-0.1.0/tests/micro/test_multi_event.py +297 -0
  527. pyradbio-0.1.0/tests/micro/test_sato_engine.py +139 -0
  528. pyradbio-0.1.0/tests/micro/test_spectrum_moments.py +84 -0
  529. pyradbio-0.1.0/tests/models/__init__.py +0 -0
  530. pyradbio-0.1.0/tests/models/lem/__init__.py +0 -0
  531. pyradbio-0.1.0/tests/models/lem/test_base.py +118 -0
  532. pyradbio-0.1.0/tests/models/lem/test_lem1.py +1695 -0
  533. pyradbio-0.1.0/tests/models/lem/test_lem2.py +393 -0
  534. pyradbio-0.1.0/tests/models/lem/test_lem3.py +278 -0
  535. pyradbio-0.1.0/tests/models/lem/test_lem4.py +1367 -0
  536. pyradbio-0.1.0/tests/models/lem/test_lem4_discrete.py +465 -0
  537. pyradbio-0.1.0/tests/models/lem/test_lem4_intertrack.py +748 -0
  538. pyradbio-0.1.0/tests/models/lem/test_lem4_localdose.py +1451 -0
  539. pyradbio-0.1.0/tests/models/lem/test_lem4_mc_fingerprint.py +204 -0
  540. pyradbio-0.1.0/tests/models/lem/test_mc_eta_kernel.py +151 -0
  541. pyradbio-0.1.0/tests/models/lem/test_mc_primitives.py +250 -0
  542. pyradbio-0.1.0/tests/models/lem/test_shared_beta_models.py +137 -0
  543. pyradbio-0.1.0/tests/models/test_binned_spectrum_mixing.py +296 -0
  544. pyradbio-0.1.0/tests/models/test_imk.py +399 -0
  545. pyradbio-0.1.0/tests/models/test_katz.py +428 -0
  546. pyradbio-0.1.0/tests/models/test_lem_impact_parameter_crosscheck.py +91 -0
  547. pyradbio-0.1.0/tests/models/test_mkm_adapter.py +350 -0
  548. pyradbio-0.1.0/tests/models/test_model_interface.py +317 -0
  549. pyradbio-0.1.0/tests/models/test_model_refactor_regressions.py +182 -0
  550. pyradbio-0.1.0/tests/models/test_nanox.py +885 -0
  551. pyradbio-0.1.0/tests/models/test_native_mkm_backend.py +185 -0
  552. pyradbio-0.1.0/tests/models/test_osmk.py +463 -0
  553. pyradbio-0.1.0/tests/models/test_phenomenological_rbe.py +823 -0
  554. pyradbio-0.1.0/tests/models/test_phenomenological_rorvik_group.py +386 -0
  555. pyradbio-0.1.0/tests/models/test_rmf.py +427 -0
  556. pyradbio-0.1.0/tests/models/test_smk.py +888 -0
  557. pyradbio-0.1.0/tests/models/test_spectrum_microdosimetry_cache.py +701 -0
  558. pyradbio-0.1.0/tests/models/test_spectrum_models.py +380 -0
  559. pyradbio-0.1.0/tests/scripts/__init__.py +0 -0
  560. pyradbio-0.1.0/tests/scripts/test_build_stopping_tables.py +93 -0
  561. pyradbio-0.1.0/tests/scripts/test_fetch_stopping_sources.py +329 -0
  562. pyradbio-0.1.0/tests/scripts/test_scripts_cli.py +197 -0
  563. pyradbio-0.1.0/tests/tables/__init__.py +0 -0
  564. pyradbio-0.1.0/tests/tables/test_alpha_beta.py +105 -0
  565. pyradbio-0.1.0/tests/tables/test_cli.py +332 -0
  566. pyradbio-0.1.0/tests/tables/test_io.py +53 -0
  567. pyradbio-0.1.0/tests/tables/test_pymkm_txt.py +64 -0
  568. pyradbio-0.1.0/tests/tables/test_zstar_build.py +99 -0
  569. pyradbio-0.1.0/tests/test_data_attribution.py +25 -0
  570. pyradbio-0.1.0/tests/test_import_layers.py +116 -0
  571. pyradbio-0.1.0/tests/test_plotting.py +110 -0
  572. pyradbio-0.1.0/tests/test_repository_hygiene.py +129 -0
  573. pyradbio-0.1.0/tests/test_version.py +20 -0
  574. pyradbio-0.1.0/tests/track/__init__.py +0 -0
  575. pyradbio-0.1.0/tests/track/stopping/__init__.py +0 -0
  576. pyradbio-0.1.0/tests/track/stopping/conftest.py +38 -0
  577. pyradbio-0.1.0/tests/track/stopping/test_barkas.py +111 -0
  578. pyradbio-0.1.0/tests/track/stopping/test_base.py +228 -0
  579. pyradbio-0.1.0/tests/track/stopping/test_bethe.py +514 -0
  580. pyradbio-0.1.0/tests/track/stopping/test_effective_charge.py +179 -0
  581. pyradbio-0.1.0/tests/track/stopping/test_grid.py +310 -0
  582. pyradbio-0.1.0/tests/track/stopping/test_higher_order.py +219 -0
  583. pyradbio-0.1.0/tests/track/stopping/test_hubert.py +166 -0
  584. pyradbio-0.1.0/tests/track/stopping/test_icru.py +274 -0
  585. pyradbio-0.1.0/tests/track/stopping/test_icru90_procedure.py +422 -0
  586. pyradbio-0.1.0/tests/track/stopping/test_masses.py +87 -0
  587. pyradbio-0.1.0/tests/track/stopping/test_mstar.py +361 -0
  588. pyradbio-0.1.0/tests/track/stopping/test_nuclear.py +209 -0
  589. pyradbio-0.1.0/tests/track/stopping/test_raw_sources.py +61 -0
  590. pyradbio-0.1.0/tests/track/stopping/test_shell.py +250 -0
  591. pyradbio-0.1.0/tests/track/stopping/test_shipped_anchors.py +118 -0
  592. pyradbio-0.1.0/tests/track/stopping/test_xstar.py +309 -0
  593. pyradbio-0.1.0/tests/track/test_kiefer_chatterjee.py +230 -0
  594. pyradbio-0.1.0/tests/track/test_northcliffe_schilling.py +304 -0
  595. pyradbio-0.1.0/tests/track/test_scholz_kraft.py +221 -0
  596. pyradbio-0.1.0/tests/track/test_srim.py +118 -0
  597. pyradbio-0.1.0/tests/track/test_stopping_power.py +246 -0
  598. pyradbio-0.1.0/tests/track/test_stopping_power_describe.py +573 -0
  599. pyradbio-0.1.0/tests/validation/__init__.py +0 -0
  600. pyradbio-0.1.0/tests/validation/test_common.py +225 -0
  601. pyradbio-0.1.0/tests/validation/test_elsasser2007_lem2.py +29 -0
  602. pyradbio-0.1.0/tests/validation/test_pide_quick.py +60 -0
  603. pyradbio-0.1.0/tests/validation/test_reference_scripts.py +183 -0
  604. pyradbio-0.1.0/tests/validation/test_scholz_lem1.py +97 -0
  605. pyradbio-0.1.0/tests/validation/test_validation_smoke.py +39 -0
  606. pyradbio-0.1.0/validation/README.md +86 -0
  607. pyradbio-0.1.0/validation/_common.py +208 -0
  608. pyradbio-0.1.0/validation/data/.gitkeep +0 -0
  609. pyradbio-0.1.0/validation/data/lem4_friedrich2012_mc.csv +107 -0
  610. pyradbio-0.1.0/validation/data/mc_results.csv +43 -0
  611. pyradbio-0.1.0/validation/data/sk1996_mc_observables.csv +45 -0
  612. pyradbio-0.1.0/validation/data/sk1997_z_slope.csv +100 -0
  613. pyradbio-0.1.0/validation/data/survival_our_mc.json +997 -0
  614. pyradbio-0.1.0/validation/elsasser2007_lem2.py +1313 -0
  615. pyradbio-0.1.0/validation/elsasser2008_lem3.py +221 -0
  616. pyradbio-0.1.0/validation/imk_matsuya2025.py +582 -0
  617. pyradbio-0.1.0/validation/lem4_elsasser2010_friedrich2012.py +836 -0
  618. pyradbio-0.1.0/validation/lineal_energy_decunha.py +178 -0
  619. pyradbio-0.1.0/validation/lineal_energy_hartzell2025.py +232 -0
  620. pyradbio-0.1.0/validation/nanox_alcocer_avila2023.py +108 -0
  621. pyradbio-0.1.0/validation/osmk_inaniwa2021.py +413 -0
  622. pyradbio-0.1.0/validation/pide_pfuhl2022.py +314 -0
  623. pyradbio-0.1.0/validation/pymkm_crosscheck.py +138 -0
  624. pyradbio-0.1.0/validation/scholz1997_lem1.py +710 -0
  625. pyradbio-0.1.0/validation/scholz_kraft1996_lem1.py +676 -0
  626. pyradbio-0.1.0/validation/smk_inaniwa2018.py +258 -0
  627. pyradbio-0.1.0/validation/smk_model_paths.py +383 -0
  628. pyradbio-0.1.0/validation/survival_code_lem.py +723 -0
  629. pyradbio-0.1.0/validation/survival_code_mmkm.py +122 -0
  630. pyradbio-0.1.0/validation/trip98_lem1_rbe.py +225 -0
  631. pyradbio-0.1.0/validation/trip98_lem4_rbe.py +506 -0
@@ -0,0 +1,32 @@
1
+ # pyRadBio external reference-data locations.
2
+ #
3
+ # Copy this file to `.env` (git-ignored) and point each variable at the folder
4
+ # where you keep that data type. Third-party reference/benchmark data is NOT
5
+ # committed to this repository (see AGENTS.md and THIRD_PARTY_NOTICES.md); only
6
+ # self-digitised paper data is bundled in the package.
7
+ #
8
+ # Paths may use `~` and forward slashes on every platform (pathlib normalises
9
+ # them on Windows). Variables already exported in your shell / CI take priority
10
+ # over this file. Resolution and error messages live in `pyradbio/datasets.py`.
11
+
12
+ # PIDE database (GSI; registration required, not redistributable).
13
+ # Loader also falls back to the git-ignored ./data/pide/ folder if unset.
14
+ PYRADBIO_PIDE_DIR=/path/to/biodata/pide
15
+
16
+ # RadPhysBio database export (NTUA; Zanni et al. 2024, CC BY 4.0). Export the CSV
17
+ # from https://radbiodb.physics.ntua.gr/radphysbio/ into this folder.
18
+ PYRADBIO_RADPHYSBIO_DIR=/path/to/biodata/RadPhysBio
19
+
20
+ # TRiP98 reference tables. Base folder containing DEDX/ and RBE/{LEM1,LEM4}/.
21
+ PYRADBIO_TRIP98_DIR=/path/to/biodata/TRIP98
22
+
23
+ # "batuff/Survival"-code JSON exports (e.g., rapidLEM, rapid mMKM); the *.json sit directly here.
24
+ PYRADBIO_SURVIVAL_DIR=/path/to/biodata/Survival
25
+
26
+ # DeCunha 2025 lineal-energy spectrum library (Geant4-DNA). Other lineal-energy
27
+ # sources get their own PYRADBIO_LINEAL_ENERGY_<SOURCE>_DIR variable.
28
+ PYRADBIO_LINEAL_ENERGY_DECUNHA_DIR=/path/to/biodata/LinealEnergySpectra/Library/csv
29
+
30
+ # batuff/Survival SOURCE checkout (GPL-2). Its data/ holds the SRIM <Ion>_Srim.dat
31
+ # stopping-power tables and eta_Elsasser2007.dat. Distinct from PYRADBIO_SURVIVAL_DIR above.
32
+ PYRADBIO_SURVIVAL_SRC_DIR=/path/to/src/Survival
@@ -0,0 +1,4 @@
1
+ # The shipped stopping-power tables are compared byte for byte with a fresh rebuild
2
+ # (scripts/stopping/build_tables.py --check), which writes LF. Keep them LF in every
3
+ # checkout, whatever core.autocrlf says.
4
+ pyradbio/track/stopping/data/* text eol=lf
@@ -0,0 +1,104 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ # Manual runs add the validation quick-mode smoke job (validation-quick).
8
+ workflow_dispatch:
9
+
10
+ jobs:
11
+ test:
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ - uses: actions/setup-python@v5
20
+ with:
21
+ python-version: ${{ matrix.python-version }}
22
+ - name: Install
23
+ run: |
24
+ python -m pip install --upgrade pip
25
+ pip install -e ".[all]"
26
+ - name: Lint
27
+ run: ruff check .
28
+ - name: Format check
29
+ run: ruff format --check .
30
+ - name: Types
31
+ # mypy checks against python_version = 3.10 on every interpreter; 3.14
32
+ # needs numpy >= 2.3, whose stubs mypy rejects under that target (see
33
+ # pyproject.toml). The other four jobs cover it.
34
+ if: matrix.python-version != '3.14'
35
+ run: mypy pyradbio
36
+ - name: Test
37
+ # @slow tests (Monte-Carlo / full-simulation reconstructions) take
38
+ # multiple CPU-hours and are run locally, not in CI. PIDE-gated tests are
39
+ # skipped automatically (no --pide path in CI). The examples smoke tests
40
+ # (tests/examples) run in every job WITH coverage, so branches that only
41
+ # one Python version takes are covered once the per-version reports are
42
+ # combined; their 120 s duration guard is off under coverage and on CI.
43
+ env:
44
+ MPLBACKEND: Agg
45
+ run: >-
46
+ pytest -m "not slow and not benchmark" --cov=pyradbio
47
+ --cov-report=term-missing
48
+ --cov-report=xml:coverage-${{ matrix.python-version }}.xml
49
+ - name: Upload coverage to Codecov
50
+ # One report per interpreter, flagged by version; Codecov merges them.
51
+ # Needs the CODECOV_TOKEN repository secret; a failed upload does not fail CI.
52
+ if: ${{ !cancelled() }}
53
+ uses: codecov/codecov-action@v5
54
+ with:
55
+ token: ${{ secrets.CODECOV_TOKEN }}
56
+ files: coverage-${{ matrix.python-version }}.xml
57
+ flags: py${{ matrix.python-version }}
58
+ disable_search: true
59
+ fail_ci_if_error: false
60
+ - name: Upload coverage report
61
+ if: ${{ !cancelled() }}
62
+ uses: actions/upload-artifact@v4
63
+ with:
64
+ name: coverage-${{ matrix.python-version }}
65
+ path: coverage-${{ matrix.python-version }}.xml
66
+ if-no-files-found: warn
67
+
68
+ pymkm-validation:
69
+ # pyMKM is an optional validation reference (the `mkm` extra, not in `all`).
70
+ # This job installs it and runs only the tests that cross-check pyRadBio's
71
+ # native MKM engine and the Bethe stopping power against it.
72
+ runs-on: ubuntu-latest
73
+ steps:
74
+ - uses: actions/checkout@v4
75
+ - uses: actions/setup-python@v5
76
+ with:
77
+ python-version: "3.12"
78
+ - name: Install
79
+ run: |
80
+ python -m pip install --upgrade pip
81
+ pip install -e ".[all,mkm]"
82
+ - name: pyMKM cross-check tests
83
+ run: pytest -m "requires_pymkm and not slow and not benchmark"
84
+
85
+ validation-quick:
86
+ # The validation/ scripts in quick mode (PYRADBIO_QUICK=1). Manual only: it
87
+ # is @slow, and without the external datasets most scripts skip themselves
88
+ # (MissingDataExit / MissingExtraExit in validation/_common.py).
89
+ if: github.event_name == 'workflow_dispatch'
90
+ runs-on: ubuntu-latest
91
+ steps:
92
+ - uses: actions/checkout@v4
93
+ - uses: actions/setup-python@v5
94
+ with:
95
+ python-version: "3.12"
96
+ - name: Install
97
+ run: |
98
+ python -m pip install --upgrade pip
99
+ pip install -e ".[all]"
100
+ - name: Validation smoke (quick mode)
101
+ env:
102
+ MPLBACKEND: Agg
103
+ PYRADBIO_QUICK: "1"
104
+ run: pytest -m slow tests/validation
@@ -0,0 +1,60 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ .venv/
9
+ venv/
10
+
11
+ # Tooling
12
+ .pytest_cache/
13
+ .mypy_cache/
14
+ .ruff_cache/
15
+ .coverage
16
+ htmlcov/
17
+ .hypothesis/
18
+
19
+ # Local environment / external-data paths (see .env.example, which IS tracked).
20
+ .env
21
+
22
+ # Project data that must not be committed
23
+ # PIDE is distributed only after registration with an institutional e-mail
24
+ # (https://www.gsi.de/.../pide_project) and must NOT be redistributed.
25
+ # data/pide/ is the default local folder the loader reads from; drop your own
26
+ # PIDE export there. Everything in it is ignored EXCEPT the tracked README.
27
+ /data/pide/*
28
+ !/data/pide/README.md
29
+ # The PIDE publication -> PMID bridge is built from PIDE's reference list: local only.
30
+ pide_publications_pmid*.csv
31
+ *.PIDE
32
+ *.pide
33
+ # Raw water stopping-power sources (NIST PSTAR/ASTAR, the ICRU 90 addendum, MSTAR,
34
+ # NIST isotope masses, ICRU 73): fetched by scripts/stopping/fetch_sources.py and
35
+ # never committed. Only each source's PROVENANCE.md (origin, citation, notice,
36
+ # checksums), a per-source README (data format) and the folder README are tracked. What ships is our own regridded
37
+ # tables in pyradbio/track/stopping/data/.
38
+ /data/stopping/*/**
39
+ !/data/stopping/*/PROVENANCE.md
40
+ !/data/stopping/*/README.md
41
+ benchmark_results/
42
+ # alpha/beta tables written by `pyradbio table` (regenerate from the
43
+ # model_config header the CLI records in each file).
44
+ tables_*/
45
+
46
+ # Jupyter / jupytext
47
+ .ipynb_checkpoints/
48
+ # Notebooks are generated from the jupytext .py sources (the source of truth).
49
+ examples/**/*.ipynb
50
+ # Example figures are generated by running the example scripts.
51
+ examples/figures/
52
+ # Validation figures likewise; validation/data/ (our own offline-MC checkpoints)
53
+ # IS tracked.
54
+ validation/figures/
55
+
56
+ # Editors / OS / agent tooling
57
+ .idea/
58
+ .vscode/
59
+ .codex/
60
+ .DS_Store
@@ -0,0 +1,47 @@
1
+ # Internal GitLab pipeline: code quality and coverage as GitLab-native reports.
2
+ # The full Python-version matrix, Codecov and the pyMKM job run on GitHub Actions
3
+ # (.github/workflows/ci.yml); this mirrors its fast test selection on one version.
4
+
5
+ default:
6
+ image: python:3.12
7
+ before_script:
8
+ - python -m pip install --upgrade pip
9
+ - pip install -e ".[all]"
10
+ cache:
11
+ key: pip-$CI_COMMIT_REF_SLUG
12
+ paths: [.cache/pip]
13
+
14
+ variables:
15
+ PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
16
+ MPLBACKEND: Agg
17
+
18
+ stages: [quality, test]
19
+
20
+ code-quality:
21
+ stage: quality
22
+ script:
23
+ # Report first (never fails), then the strict gates.
24
+ - ruff check --exit-zero --output-format=gitlab --output-file=gl-code-quality-report.json .
25
+ - ruff check .
26
+ - ruff format --check .
27
+ - mypy pyradbio
28
+ artifacts:
29
+ when: always
30
+ reports:
31
+ codequality: gl-code-quality-report.json
32
+
33
+ test:
34
+ stage: test
35
+ needs: []
36
+ script:
37
+ - >-
38
+ pytest -m "not slow and not benchmark" --cov=pyradbio
39
+ --cov-report=term --cov-report=xml:coverage.xml --junitxml=report.xml
40
+ coverage: '/^TOTAL\s+.*\s(\d+(?:\.\d+)?)%$/'
41
+ artifacts:
42
+ when: always
43
+ reports:
44
+ coverage_report:
45
+ coverage_format: cobertura
46
+ path: coverage.xml
47
+ junit: report.xml
@@ -0,0 +1,34 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.17.4
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format
8
+
9
+ - repo: https://github.com/pre-commit/mirrors-mypy
10
+ rev: v2.1.0
11
+ hooks:
12
+ - id: mypy
13
+ # numpy pinned to match the project cap (PEP 695 stubs in numpy >= 2.5
14
+ # break mypy under python_version = 3.10).
15
+ additional_dependencies: ["numpy<2.3", scipy]
16
+ args: [pyradbio]
17
+ # Type-check the package as a whole; do not also pass changed filenames
18
+ # (that double-counts modules under the flat layout -> "Duplicate module").
19
+ pass_filenames: false
20
+
21
+ - repo: https://github.com/codespell-project/codespell
22
+ rev: v2.4.2
23
+ hooks:
24
+ - id: codespell
25
+ args: [--toml, pyproject.toml]
26
+ - repo: https://github.com/abravalheri/validate-pyproject
27
+ rev: v0.25
28
+ hooks:
29
+ - id: validate-pyproject
30
+
31
+ - repo: https://gitlab.com/schmieder.matthias/python-kacl
32
+ rev: v0.7.3
33
+ hooks:
34
+ - id: kacl-verify
@@ -0,0 +1,220 @@
1
+ # AGENTS.md
2
+
3
+ Operating contract for AI coding agents (Claude Code, etc.) working in this
4
+ repository. Read this fully before writing any code. `CLAUDE.md` mirrors this
5
+ file for Claude-specific tooling; if the two ever disagree, **this file wins**.
6
+
7
+ ## What pyRadBio is
8
+
9
+ A radiobiological-modelling library for ion-beam therapy, centred on the
10
+ linear-quadratic (LQ) model `-ln S(D) = αD + βD²`. It computes ion- and
11
+ energy-resolved α/β tables, z\* tables, survival curves, RBE, and the dose
12
+ required for a target survival level, for both single ions and mixed
13
+ radiation fields.
14
+
15
+ It implements these model families (inventory, references and open work:
16
+ `ROADMAP.md`):
17
+
18
+ - **LEM family (LEM I–IV)** — implemented here, since no maintained,
19
+ permissively-licensed implementation exists. This is the bulk of the
20
+ original work.
21
+ - **MKM family (MKM, modified MKM, MCF MKM, SMK, OSMK, IMK)** — implemented
22
+ here on our own track-structure and microdosimetry engines. `MKMModel`'s
23
+ default `z*` backend is the native `NativeMKMBackend`. The external
24
+ MIT-licensed package **pyMKM** (`BeppeMagro/pymkm`, Magro et al.,
25
+ *Computation* 2025, doi:10.3390/computation13110264) is an **optional
26
+ validation dependency** (`mkm` extra), never a default: it is the
27
+ **cross-check reference** for the family, and every native MKM piece must be
28
+ tested against pyMKM where the two overlap (`requires_pymkm` tests, run by a
29
+ dedicated CI job).
30
+ - **Stopping power** — every model's default LET source goes through the one
31
+ seam `track.stopping_power.default_stopping_power()`, which returns
32
+ `DefaultStoppingPower`: ICRU 90's procedure (`track.stopping.ICRU90Procedure`,
33
+ within ~0.3% of ICRU 90/49 for p, alpha, C) for Z 1-18, Hubert et al. 1990's alpha
34
+ scaling (`track.stopping.HubertAlphaScaling`) for Z 19-92 from 2.5 MeV/u, and the
35
+ analytic `SimpleBetheStoppingPower` elsewhere, anchored to the adjacent branch at its
36
+ range edge so the default is continuous (unvalidated there).
37
+ The `track.stopping` classes (XSTAR, ICRU by edition, MSTAR, Bethe with
38
+ switchable corrections, nuclear stopping), NS1970, SRIM tables, libdEdx (GPL,
39
+ runtime opt-in) and pyMKM's tables via the pyMKM adapter are explicit opt-ins.
40
+ See `docs/references/StoppingPower.md`. Raw stopping-power data stays
41
+ git-ignored in `data/stopping/<source>/` with a committed `PROVENANCE.md`; only
42
+ our own regridded tables ship. Do not bundle third-party stopping-power data
43
+ whose licence restricts redistribution or use (e.g. Geant4's G4EMLOW), and never
44
+ use SRIM data.
45
+ - **Phenomenological LET-based RBE models, RMF, Katz, NanOx** — implemented
46
+ here from their source papers.
47
+
48
+ Above them sits a shared LQ / mixed-field / survival / RBE / benchmark layer
49
+ that is model-agnostic.
50
+
51
+ ## Hard rules
52
+
53
+ 1. **Test-Driven Development is mandatory.** For every behavioural change:
54
+ write a failing test first (red), implement the minimum to pass (green),
55
+ then refactor. Commits that add behaviour without a corresponding test
56
+ will be rejected in review. Never delete, skip or `xfail` a test to make CI
57
+ pass.
58
+ 2. **Golden tests are sacred.** Tests marked `@pytest.mark.golden` pin model
59
+ output to published reference values and must cite the DOI in the test
60
+ docstring. Never weaken a golden tolerance to make a test pass — if it
61
+ fails, the implementation is wrong (or the reference was misread; document
62
+ which).
63
+ 3. **Licence hygiene.** MIT only. Do not copy code from non-MIT/BSD/Apache
64
+ sources, with one closed list of exceptions: code whose authors' notice grants
65
+ use, copying, modification and distribution without copyleft. Each admitted
66
+ source is named here, its notice is reproduced verbatim in
67
+ `THIRD_PARTY_NOTICES.md` (which states that the notice, not MIT, applies to those
68
+ files), and the derived files say so in their header. Admitted so far: **MSTAR
69
+ 3.12** (Paul & Schinner, freeware; condition: keep the authors' names in the
70
+ source comments) → `pyradbio/track/stopping/mstar/`. Adding a source to this
71
+ list is a maintainer decision; GPL/LGPL and other copyleft code never
72
+ qualifies. `batuff/Survival` may inform *architecture discussions only* — do
73
+ not copy its code; its numerical output is an independent cross-check, not
74
+ ground truth (`docs/references/survival_repo_notes.md`). pyMKM is MIT and may
75
+ be called as an optional validation dependency, not vendored and not made a
76
+ default.
77
+ 4. **Never commit PIDE data.** The PIDE database is distributed only after
78
+ registration and may not be redistributed. The benchmark reads from the
79
+ git-ignored `data/pide/` folder by default (override via `PYRADBIO_PIDE_DIR`
80
+ or an explicit `--pide` path); only its `README.md` is tracked. Tested
81
+ against PIDE 3.4.
82
+ 5. **No silent physics.** Every model parameter, default, and unit must be
83
+ explicit and documented at the point of definition with a paper/equation
84
+ reference. No magic numbers.
85
+ 6. **Numerical integration discipline** — see "Numerics" below. This is a
86
+ correctness requirement, not a style preference.
87
+
88
+ ## Toolchain
89
+
90
+ - Python ≥ 3.10, flat package layout, import root is `pyradbio`.
91
+ - Install dev env: `pip install -e ".[all]"`.
92
+ - Run tests: `pytest` (golden + unit). `pytest -m "not slow"` for the fast loop.
93
+ - Lint/format: `ruff check . && ruff format .`
94
+ - Types: `mypy pyradbio` (strict).
95
+ - All four (pytest, ruff check, ruff format --check, mypy) must pass before a
96
+ task is considered done. CI enforces them.
97
+
98
+ ## Optional dependency boundaries
99
+
100
+ Core library code must not casually import dependencies from optional extras.
101
+ Before using `pandas`, `pyarrow`, `openpyxl`, `matplotlib`, `numba`, `pymkm`, or
102
+ any other extra-only package, check `pyproject.toml` and keep the import inside
103
+ the feature layer that owns that extra. In particular:
104
+
105
+ - `pandas`/`pyarrow`/`openpyxl` belong to the `tables` extra and the table I/O
106
+ layer (`pyradbio/tables/`). Model and backend seams should return small typed
107
+ Python objects, not DataFrames.
108
+ - `matplotlib` belongs to `examples/` and `validation/` (through the
109
+ matplotlib-free helpers of `pyradbio.plotting`); the only library module that
110
+ may draw is `benchmark/report.py` (`tests/test_import_layers.py`).
111
+ - `numba` belongs behind explicit acceleration paths.
112
+ - `pymkm` belongs only in `models/mkm/pymkm_backend.py` (the pyMKM adapter:
113
+ `PyMKMBackend`, `PyMKMStoppingPower`). `MKMModel` and shared core code must
114
+ remain importable and fully functional without the `mkm` extra.
115
+ - Layering: `core/`, `track/` and `micro/` never import `models/`,
116
+ `benchmark/`, `tables/` or `cli` (enforced by `tests/test_import_layers.py`).
117
+
118
+ ## Numerics (read carefully)
119
+
120
+ These are the project's known correctness traps. Getting them wrong produces
121
+ plausible-but-wrong tables.
122
+
123
+ - **Mixed-field LQ mixing.** Dose-average α: `ᾱ = Σ dᵢ αᵢ / Σ dᵢ`.
124
+ Combine β via the dose-averaged square root: `√β̄ = Σ dᵢ √βᵢ / Σ dᵢ`
125
+ (Zaider–Rossi / Kanai convention). For the MKM, the mixing happens on the
126
+ saturation-corrected dose-mean specific energy `z*_1D` (dose-averaged), not
127
+ on α directly — see `mMKM_Inaniwa2010.md`, eq. (8) and appendix.
128
+ - **Spectral / intra-bin integration.** When integrating a model quantity `Q`
129
+ over a fluence spectrum φ(E), the dose weight is `d ∝ φ(E)·S(E)` with `S`
130
+ the (mass) stopping power. Across a wide energy bin, `S`, `z*`, and `α` all
131
+ vary, and the *product* `S·Q` does **not** equal `S(E_center)·Q(E_center)`.
132
+ The numerically significant error is the **intra-bin covariance** between
133
+ stopping power and the looked-up quantity, not the bin-mean approximation
134
+ alone. Integrate products (`S·z*`, `S·α`, `S·√β`) on a **fine logarithmic
135
+ sub-grid (~16 nodes/bin)**, not at bin centres. `core/mixing.py` owns this
136
+ (`dose_quadrature`), and models reach it only through the
137
+ `BiophysicalModel.alpha_beta` template -- never write a per-model mixing loop.
138
+ The mixing tests must include a bin wide enough to expose the covariance error and
139
+ assert the sub-grid result against a dense-reference integral.
140
+ - **Survival → dose inversion.** Solving `S(D)=S_target` for `D` under the LQ
141
+ model is a quadratic; prefer the closed form
142
+ `D = (-α + √(α² - 4β·lnS)) / (2β)` and guard `β→0`.
143
+ - **LEM local-dose integrals.** The radial dose `D(r) ∝ LET/r²` is singular;
144
+ respect `r_min`/`r_max` cutoffs per LEM version and normalise so the radial
145
+ integral reproduces the LET. Validate `r_max(E)` and (LEM III) the
146
+ velocity-dependent `r_min(β)=β·r_c` against the cited parameterisations.
147
+
148
+ ## Layout & ownership
149
+
150
+ ```
151
+ pyradbio/
152
+ core/ LQ model, radiation fields, photon refs, cell/target, MIXING (sub-grid)
153
+ track/ radial-dose models + stopping power (stopping/: water tables, ICRU 90
154
+ procedure = default for Z 1-18, Hubert alpha scaling Z 19-92)
155
+ micro/ microdosimetry: lineal-energy spectra and specific-energy engines
156
+ models/ base ABC; lem/ = LEM I–IV; mkm/ = engine-agnostic MKMModel +
157
+ MKMBackend protocol (NativeMKMBackend default, PyMKMBackend
158
+ optional cross-check) and the spectrum-based MKM variants; phenomenological/,
159
+ rmf/, katz/, nanox/
160
+ tables/ alpha-beta & z* table builders + serialization (csv/parquet/pyMKM .txt)
161
+ benchmark/ PIDE loader (user-supplied), paper reference data + inputs, metrics,
162
+ sweeps, MC checkpoint I/O, report
163
+ data/ bundled reference parameters (cell lines, etc.) — small, cited
164
+ plotting.py figure folder + save helpers for the scripts (no matplotlib import)
165
+ cli.py `pyradbio` entry point
166
+ examples/ runnable, notebook-pairable jupytext demos (see examples/README.md)
167
+ validation/ paper reconstructions + cross-code/data checks; data/ = tracked MC
168
+ checkpoints (see validation/README.md)
169
+ scripts/ offline MC generators that write validation/data/ (see scripts/README.md)
170
+ ```
171
+
172
+ Every model family implements one interface on `BiophysicalModel`
173
+ (`models/base.py`): `alpha_beta(field)`, `survival(field, D)`,
174
+ `dose_for_survival(field, S)`, `rbe_at_survival(field, S)`, `rbe_at_dose(field, D)`,
175
+ `reference()` and `alpha_beta_table(...)`, plus a `capabilities: ModelCapabilities`
176
+ ClassVar. A new model implements `_alpha_beta_ion` and declares `capabilities`;
177
+ model-specific axes (pO2, dose schedule, ...) are keyword-only arguments, never new
178
+ positional ones. Details: `docs/architecture.md`.
179
+
180
+ ## Examples, validation and scripts
181
+
182
+ Three folders, three jobs; each README holds the authoring rules — follow them.
183
+
184
+ - `examples/` **demonstrates** a capability: a small gallery of **jupytext
185
+ percent** scripts (plain `.py` that also opens as a notebook) that run with
186
+ only the `plot` extra, no external data and no network, within the 120 s
187
+ budget. The gallery is a fixed list (`tests/examples`), so a new example is a
188
+ deliberate decision.
189
+ - `validation/` **scores** a model against a published model line, another
190
+ code or a dataset (jupytext percent, minutes allowed). External data goes
191
+ through `pyradbio.datasets`, optional extras through `_common.require_extra`.
192
+ Every validation script supports `PYRADBIO_QUICK=1` (same figures, cheap
193
+ settings).
194
+ - `scripts/` holds offline generators (argparse, `main()`, `--dry-run`, no I/O
195
+ at import). Their outputs are the tracked checkpoints in `validation/data/`,
196
+ each gated by a fast numeric-fingerprint test.
197
+
198
+ **Illustrating capabilities is a continuous task.** Each major capability
199
+ should be illustrated by an example **or a validation script**; add or extend
200
+ one whenever a change introduces a user-facing capability.
201
+
202
+ - Name examples after the **concept**, never after a milestone or task, so the
203
+ gallery stays meaningful over time; name validation scripts after the paper
204
+ or code they score (`smk_inaniwa2018.py`).
205
+ - Every example is smoke-tested automatically (runs, writes a PNG, stays within
206
+ budget, imports only stdlib/numpy/scipy/matplotlib/pyradbio); every
207
+ validation script is smoke-tested in quick mode by the `@slow` suite.
208
+
209
+ ## Definition of done
210
+
211
+ A change is done when: its golden + unit tests are green, coverage on touched
212
+ modules ≥ 90%, ruff + mypy clean, its public API has docstrings with
213
+ equation/DOI references, and `CHANGELOG.md` is updated.
214
+
215
+ ## When unsure
216
+
217
+ Prefer to (a) read the relevant summary in `docs/references/`, (b) read the
218
+ cited paper section, (c) inspect the actual pyMKM API (`python -c "import
219
+ pymkm; help(pymkm.mktable)"`) rather than assuming it. Record any assumption
220
+ you could not verify as a `# ASSUMPTION:` comment and a note in the PR.