xcoll 0.3.6__py3-none-any.whl → 0.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of xcoll might be problematic. Click here for more details.

Files changed (350) hide show
  1. xcoll/__init__.py +13 -4
  2. xcoll/beam_elements/__init__.py +14 -6
  3. xcoll/beam_elements/absorber.py +41 -7
  4. xcoll/beam_elements/base.py +1202 -247
  5. xcoll/beam_elements/blowup.py +198 -0
  6. xcoll/beam_elements/elements_src/black_absorber.h +136 -0
  7. xcoll/beam_elements/elements_src/black_crystal.h +129 -0
  8. xcoll/beam_elements/elements_src/blowup.h +42 -0
  9. xcoll/beam_elements/elements_src/emittance_monitor.h +109 -0
  10. xcoll/beam_elements/{collimators_src → elements_src}/everest_block.h +59 -30
  11. xcoll/beam_elements/elements_src/everest_collimator.h +237 -0
  12. xcoll/beam_elements/elements_src/everest_crystal.h +280 -0
  13. xcoll/beam_elements/everest.py +65 -119
  14. xcoll/beam_elements/monitor.py +428 -0
  15. xcoll/colldb.py +276 -747
  16. xcoll/general.py +5 -5
  17. xcoll/headers/checks.h +1 -1
  18. xcoll/headers/particle_states.h +2 -2
  19. xcoll/initial_distribution.py +207 -0
  20. xcoll/install.py +179 -0
  21. xcoll/interaction_record/__init__.py +1 -0
  22. xcoll/interaction_record/interaction_record.py +298 -0
  23. xcoll/interaction_record/interaction_record_src/interaction_record.h +98 -0
  24. xcoll/{impacts → interaction_record}/interaction_types.py +11 -4
  25. xcoll/line_tools.py +82 -0
  26. xcoll/lossmap.py +219 -0
  27. xcoll/manager.py +2 -937
  28. xcoll/rf_sweep.py +1 -1
  29. xcoll/scattering_routines/everest/amorphous.h +232 -0
  30. xcoll/scattering_routines/everest/channeling.h +240 -0
  31. xcoll/scattering_routines/everest/crystal_parameters.h +137 -0
  32. xcoll/scattering_routines/everest/everest.h +11 -30
  33. xcoll/scattering_routines/everest/everest.py +13 -10
  34. xcoll/scattering_routines/everest/jaw.h +28 -197
  35. xcoll/scattering_routines/everest/materials.py +37 -15
  36. xcoll/scattering_routines/everest/multiple_coulomb_scattering.h +31 -10
  37. xcoll/scattering_routines/everest/nuclear_interaction.h +86 -0
  38. xcoll/scattering_routines/everest/properties.h +6 -1
  39. xcoll/scattering_routines/fluka/flukaio/lib/libFlukaIO64.a +0 -0
  40. xcoll/scattering_routines/geant4/collimasim/.git +1 -0
  41. xcoll/scattering_routines/geant4/collimasim/.gitignore +12 -0
  42. xcoll/scattering_routines/geant4/collimasim/.gitmodules +3 -0
  43. xcoll/scattering_routines/geant4/collimasim/CMakeLists.txt +26 -0
  44. xcoll/scattering_routines/geant4/collimasim/README.md +21 -0
  45. xcoll/scattering_routines/geant4/collimasim/docs/Makefile +20 -0
  46. xcoll/scattering_routines/geant4/collimasim/docs/make.bat +35 -0
  47. xcoll/scattering_routines/geant4/collimasim/docs/source/collimasim.rst +10 -0
  48. xcoll/scattering_routines/geant4/collimasim/docs/source/conf.py +59 -0
  49. xcoll/scattering_routines/geant4/collimasim/docs/source/index.rst +26 -0
  50. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.appveyor.yml +37 -0
  51. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.clang-format +19 -0
  52. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.clang-tidy +65 -0
  53. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.cmake-format.yaml +73 -0
  54. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.git +1 -0
  55. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/CODEOWNERS +9 -0
  56. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/CONTRIBUTING.md +386 -0
  57. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/ISSUE_TEMPLATE/bug-report.yml +45 -0
  58. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/ISSUE_TEMPLATE/config.yml +8 -0
  59. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/dependabot.yml +16 -0
  60. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/labeler.yml +8 -0
  61. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/labeler_merged.yml +3 -0
  62. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/pull_request_template.md +19 -0
  63. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/ci.yml +969 -0
  64. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/configure.yml +84 -0
  65. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/format.yml +48 -0
  66. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/labeler.yml +16 -0
  67. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/pip.yml +103 -0
  68. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.gitignore +45 -0
  69. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.pre-commit-config.yaml +151 -0
  70. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.readthedocs.yml +3 -0
  71. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/CMakeLists.txt +297 -0
  72. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/LICENSE +29 -0
  73. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/MANIFEST.in +6 -0
  74. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/README.rst +180 -0
  75. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/Doxyfile +23 -0
  76. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/Makefile +192 -0
  77. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/_static/theme_overrides.css +11 -0
  78. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/chrono.rst +81 -0
  79. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/custom.rst +93 -0
  80. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/eigen.rst +310 -0
  81. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/functional.rst +109 -0
  82. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/index.rst +43 -0
  83. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/overview.rst +171 -0
  84. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/stl.rst +251 -0
  85. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/strings.rst +305 -0
  86. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/classes.rst +1297 -0
  87. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/embedding.rst +262 -0
  88. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/exceptions.rst +396 -0
  89. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/functions.rst +568 -0
  90. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/misc.rst +337 -0
  91. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/index.rst +13 -0
  92. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/numpy.rst +463 -0
  93. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/object.rst +286 -0
  94. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/utilities.rst +155 -0
  95. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/smart_ptrs.rst +174 -0
  96. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/basics.rst +308 -0
  97. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/benchmark.py +91 -0
  98. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/benchmark.rst +95 -0
  99. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/changelog.rst +2050 -0
  100. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/classes.rst +542 -0
  101. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/cmake/index.rst +8 -0
  102. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/compiling.rst +648 -0
  103. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/conf.py +381 -0
  104. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/faq.rst +343 -0
  105. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/index.rst +48 -0
  106. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/installing.rst +105 -0
  107. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/limitations.rst +72 -0
  108. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11-logo.png +0 -0
  109. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python1.png +0 -0
  110. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python1.svg +427 -0
  111. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python2.png +0 -0
  112. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python2.svg +427 -0
  113. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/reference.rst +130 -0
  114. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/release.rst +96 -0
  115. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/requirements.txt +8 -0
  116. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/upgrade.rst +548 -0
  117. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/attr.h +605 -0
  118. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/buffer_info.h +144 -0
  119. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/cast.h +1432 -0
  120. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/chrono.h +213 -0
  121. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/common.h +2 -0
  122. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/complex.h +65 -0
  123. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/class.h +709 -0
  124. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/common.h +1021 -0
  125. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/descr.h +104 -0
  126. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/init.h +346 -0
  127. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/internals.h +467 -0
  128. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/type_caster_base.h +978 -0
  129. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/typeid.h +55 -0
  130. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/eigen.h +606 -0
  131. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/embed.h +284 -0
  132. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/eval.h +163 -0
  133. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/functional.h +121 -0
  134. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/gil.h +193 -0
  135. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/iostream.h +275 -0
  136. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/numpy.h +1741 -0
  137. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/operators.h +163 -0
  138. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/options.h +65 -0
  139. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/pybind11.h +2497 -0
  140. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/pytypes.h +1879 -0
  141. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl/filesystem.h +103 -0
  142. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl.h +375 -0
  143. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl_bind.h +747 -0
  144. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/noxfile.py +88 -0
  145. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/__init__.py +11 -0
  146. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/__main__.py +52 -0
  147. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/_version.py +12 -0
  148. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/_version.pyi +6 -0
  149. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/commands.py +21 -0
  150. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/py.typed +0 -0
  151. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/setup_helpers.py +482 -0
  152. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/setup_helpers.pyi +63 -0
  153. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pyproject.toml +41 -0
  154. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/setup.cfg +56 -0
  155. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/setup.py +155 -0
  156. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/CMakeLists.txt +503 -0
  157. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/conftest.py +208 -0
  158. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/constructor_stats.h +275 -0
  159. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/cross_module_gil_utils.cpp +73 -0
  160. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/env.py +33 -0
  161. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_python_package/pytest.ini +0 -0
  162. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_python_package/test_files.py +279 -0
  163. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_setuptools/pytest.ini +0 -0
  164. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_setuptools/test_setuphelper.py +143 -0
  165. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/local_bindings.h +85 -0
  166. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/object.h +179 -0
  167. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_cross_module_tests.cpp +151 -0
  168. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_tests.cpp +91 -0
  169. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_tests.h +85 -0
  170. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pytest.ini +19 -0
  171. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/requirements.txt +12 -0
  172. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_async.cpp +26 -0
  173. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_async.py +25 -0
  174. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_buffers.cpp +216 -0
  175. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_buffers.py +163 -0
  176. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_builtin_casters.cpp +286 -0
  177. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_builtin_casters.py +536 -0
  178. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_call_policies.cpp +107 -0
  179. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_call_policies.py +248 -0
  180. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_callbacks.cpp +227 -0
  181. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_callbacks.py +202 -0
  182. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_chrono.cpp +84 -0
  183. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_chrono.py +210 -0
  184. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_class.cpp +550 -0
  185. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_class.py +473 -0
  186. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/CMakeLists.txt +84 -0
  187. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/embed.cpp +21 -0
  188. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_embed/CMakeLists.txt +28 -0
  189. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_function/CMakeLists.txt +39 -0
  190. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_target/CMakeLists.txt +46 -0
  191. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/main.cpp +6 -0
  192. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_embed/CMakeLists.txt +41 -0
  193. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_function/CMakeLists.txt +35 -0
  194. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_target/CMakeLists.txt +41 -0
  195. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/test.py +10 -0
  196. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_constants_and_functions.cpp +165 -0
  197. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_constants_and_functions.py +53 -0
  198. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_copy_move.cpp +238 -0
  199. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_copy_move.py +126 -0
  200. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_casters.cpp +141 -0
  201. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_casters.py +117 -0
  202. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_setup.cpp +41 -0
  203. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_setup.py +50 -0
  204. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_docstring_options.cpp +69 -0
  205. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_docstring_options.py +42 -0
  206. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eigen.cpp +348 -0
  207. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eigen.py +771 -0
  208. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/CMakeLists.txt +47 -0
  209. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/catch.cpp +22 -0
  210. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/external_module.cpp +23 -0
  211. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/test_interpreter.cpp +326 -0
  212. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/test_interpreter.py +15 -0
  213. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_enum.cpp +148 -0
  214. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_enum.py +272 -0
  215. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval.cpp +119 -0
  216. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval.py +51 -0
  217. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval_call.py +5 -0
  218. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.cpp +285 -0
  219. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.h +12 -0
  220. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.py +265 -0
  221. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_factory_constructors.cpp +397 -0
  222. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_factory_constructors.py +520 -0
  223. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_gil_scoped.cpp +49 -0
  224. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_gil_scoped.py +94 -0
  225. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_iostream.cpp +125 -0
  226. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_iostream.py +331 -0
  227. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_kwargs_and_defaults.cpp +153 -0
  228. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_kwargs_and_defaults.py +284 -0
  229. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_local_bindings.cpp +107 -0
  230. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_local_bindings.py +257 -0
  231. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_methods_and_attributes.cpp +412 -0
  232. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_methods_and_attributes.py +517 -0
  233. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_modules.cpp +102 -0
  234. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_modules.py +92 -0
  235. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_multiple_inheritance.cpp +233 -0
  236. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_multiple_inheritance.py +360 -0
  237. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_array.cpp +472 -0
  238. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_array.py +593 -0
  239. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_dtypes.cpp +524 -0
  240. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_dtypes.py +441 -0
  241. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_vectorize.cpp +103 -0
  242. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_vectorize.py +267 -0
  243. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_opaque_types.cpp +73 -0
  244. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_opaque_types.py +59 -0
  245. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_operator_overloading.cpp +235 -0
  246. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_operator_overloading.py +146 -0
  247. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pickling.cpp +189 -0
  248. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pickling.py +82 -0
  249. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pytypes.cpp +560 -0
  250. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pytypes.py +651 -0
  251. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_sequences_and_iterators.cpp +500 -0
  252. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_sequences_and_iterators.py +253 -0
  253. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_smart_ptr.cpp +452 -0
  254. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_smart_ptr.py +318 -0
  255. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl.cpp +342 -0
  256. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl.py +291 -0
  257. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl_binders.cpp +131 -0
  258. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl_binders.py +318 -0
  259. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_tagbased_polymorphic.cpp +144 -0
  260. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_tagbased_polymorphic.py +29 -0
  261. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_thread.cpp +66 -0
  262. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_thread.py +44 -0
  263. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_union.cpp +22 -0
  264. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_union.py +9 -0
  265. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_virtual_functions.cpp +510 -0
  266. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_virtual_functions.py +408 -0
  267. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/valgrind-numpy-scipy.supp +140 -0
  268. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/valgrind-python.supp +117 -0
  269. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindCatch.cmake +70 -0
  270. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindEigen3.cmake +86 -0
  271. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindPythonLibsNew.cmake +257 -0
  272. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/check-style.sh +44 -0
  273. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/cmake_uninstall.cmake.in +23 -0
  274. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/libsize.py +39 -0
  275. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/make_changelog.py +64 -0
  276. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Common.cmake +402 -0
  277. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Config.cmake.in +233 -0
  278. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11NewTools.cmake +276 -0
  279. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Tools.cmake +214 -0
  280. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pyproject.toml +3 -0
  281. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/setup_global.py.in +65 -0
  282. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/setup_main.py.in +41 -0
  283. xcoll/scattering_routines/geant4/collimasim/pyproject.toml +8 -0
  284. xcoll/scattering_routines/geant4/collimasim/setup.py +144 -0
  285. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSPyATInterface.cpp +403 -0
  286. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSPyATInterface.hh +100 -0
  287. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSXtrackInterface.cpp +763 -0
  288. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSXtrackInterface.hh +118 -0
  289. xcoll/scattering_routines/geant4/collimasim/src/collimasim/__init__.py +8 -0
  290. xcoll/scattering_routines/geant4/collimasim/src/collimasim/bindings.cpp +63 -0
  291. xcoll/scattering_routines/geant4/collimasim/src/collimasim/pyCollimatorPass.py +142 -0
  292. xcoll/scattering_routines/geant4/collimasim/src/collimasim/xtrack_collimator.py +556 -0
  293. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/PKG-INFO +6 -0
  294. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/SOURCES.txt +24 -0
  295. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/dependency_links.txt +1 -0
  296. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/not-zip-safe +1 -0
  297. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/top_level.txt +1 -0
  298. xcoll/scattering_routines/geant4/collimasim/tests/README.md +25 -0
  299. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_forions.dat +25 -0
  300. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_new_example.dat +18 -0
  301. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_old_example.dat +68 -0
  302. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_testing.dat +15 -0
  303. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_yaml_example.yaml +110 -0
  304. xcoll/scattering_routines/geant4/collimasim/tests/resources/collgaps.dat +7 -0
  305. xcoll/scattering_routines/geant4/collimasim/tests/resources/collgaps_pyat_test.dat +3 -0
  306. xcoll/scattering_routines/geant4/collimasim/tests/resources/collonly_twiss_file_example.tfs +54 -0
  307. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings.gmad +3 -0
  308. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings_black_absorber.gmad +3 -0
  309. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings_ions.gmad +5 -0
  310. xcoll/scattering_routines/geant4/collimasim/tests/resources/twiss_file_testing.tfs +51 -0
  311. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat.py +65 -0
  312. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat_passmethod.py +59 -0
  313. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat_tracking.py +102 -0
  314. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack.py +75 -0
  315. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_angle.py +74 -0
  316. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_colldb_load.py +84 -0
  317. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_interaction.py +159 -0
  318. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_interaction_ion.py +99 -0
  319. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_ions.py +78 -0
  320. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_lost_energy.py +88 -0
  321. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tilt.py +80 -0
  322. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tracking.py +97 -0
  323. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tracking_ions.py +96 -0
  324. xcoll/scattering_routines/geometry/__init__.py +6 -0
  325. xcoll/scattering_routines/geometry/collimator_geometry.h +218 -0
  326. xcoll/scattering_routines/geometry/crystal_geometry.h +153 -0
  327. xcoll/scattering_routines/geometry/geometry.py +26 -0
  328. xcoll/scattering_routines/geometry/get_s.h +92 -0
  329. xcoll/scattering_routines/geometry/methods.h +111 -0
  330. xcoll/scattering_routines/geometry/objects.h +154 -0
  331. xcoll/scattering_routines/geometry/rotation.h +23 -0
  332. xcoll/scattering_routines/geometry/segments.h +226 -0
  333. xcoll/scattering_routines/geometry/sort.h +184 -0
  334. {xcoll-0.3.6.dist-info → xcoll-0.5.0.dist-info}/METADATA +1 -1
  335. xcoll-0.5.0.dist-info/RECORD +413 -0
  336. xcoll/beam_elements/collimators_src/absorber.h +0 -141
  337. xcoll/beam_elements/collimators_src/everest_collimator.h +0 -142
  338. xcoll/beam_elements/collimators_src/everest_crystal.h +0 -115
  339. xcoll/collimator_settings.py +0 -457
  340. xcoll/impacts/__init__.py +0 -1
  341. xcoll/impacts/impacts.py +0 -102
  342. xcoll/impacts/impacts_src/impacts.h +0 -99
  343. xcoll/scattering_routines/everest/crystal.h +0 -1302
  344. xcoll/scattering_routines/everest/scatter.h +0 -169
  345. xcoll/scattering_routines/everest/scatter_crystal.h +0 -260
  346. xcoll/scattering_routines/fluka/build_fluka_input.py +0 -58
  347. xcoll-0.3.6.dist-info/RECORD +0 -111
  348. {xcoll-0.3.6.dist-info → xcoll-0.5.0.dist-info}/LICENSE +0 -0
  349. {xcoll-0.3.6.dist-info → xcoll-0.5.0.dist-info}/NOTICE +0 -0
  350. {xcoll-0.3.6.dist-info → xcoll-0.5.0.dist-info}/WHEEL +0 -0
@@ -9,6 +9,21 @@
9
9
  #include <stdio.h>
10
10
 
11
11
 
12
+ /*gpufun*/
13
+ int8_t EverestBlockData_get_record_impacts(EverestBlockData el){
14
+ return EverestBlockData_get__record_interactions(el) % 2;
15
+ }
16
+
17
+ /*gpufun*/
18
+ int8_t EverestBlockData_get_record_exits(EverestBlockData el){
19
+ return (EverestBlockData_get__record_interactions(el) >> 1) % 2;
20
+ }
21
+
22
+ /*gpufun*/
23
+ int8_t EverestBlockData_get_record_scatterings(EverestBlockData el){
24
+ return (EverestBlockData_get__record_interactions(el) >> 2) % 2;
25
+ }
26
+
12
27
  /*gpufun*/
13
28
  void EverestBlock_set_material(EverestBlockData el){
14
29
  MaterialData material = EverestBlockData_getp__material(el);
@@ -38,8 +53,10 @@ EverestCollData EverestBlock_init(EverestBlockData el, LocalParticle* part0, int
38
53
  // Impact table
39
54
  coll->record = EverestBlockData_getp_internal_record(el, part0);
40
55
  coll->record_index = NULL;
56
+ coll->record_scatterings = 0;
41
57
  if (coll->record){
42
- coll->record_index = CollimatorImpactsData_getp__index(coll->record);
58
+ coll->record_index = InteractionRecordData_getp__index(coll->record);
59
+ coll->record_scatterings = EverestBlockData_get_record_scatterings(el);
43
60
  }
44
61
  }
45
62
 
@@ -68,7 +85,8 @@ EverestData EverestBlock_init_data(LocalParticle* part, EverestCollData coll){
68
85
  /*gpufun*/
69
86
  void EverestBlock_track_local_particle(EverestBlockData el, LocalParticle* part0) {
70
87
  int8_t active = EverestBlockData_get__tracking(el);
71
- double const length = EverestBlockData_get_length(el);
88
+ active *= EverestBlockData_get_active(el);
89
+ double const length = EverestBlockData_get_length(el);
72
90
 
73
91
  // Initialise collimator data
74
92
  // TODO: we want this to happen before tracking (instead of every turn), as a separate kernel
@@ -84,43 +102,54 @@ void EverestBlock_track_local_particle(EverestBlockData el, LocalParticle* part0
84
102
  int8_t is_valid = xcoll_check_particle_init(coll->rng, part);
85
103
 
86
104
  if (is_valid) {
87
- EverestData everest = EverestBlock_init_data(part, coll);
88
- double const e0 = LocalParticle_get_energy0(part) / 1.e9; // Reference energy in GeV
89
- double const p0 = LocalParticle_get_p0c(part) / 1e9; // Reference momentum in GeV
105
+ // Store s-location of start of block
106
+ double s_block = LocalParticle_get_s(part);
107
+ LocalParticle_set_s(part, 0);
108
+
109
+ // Store initial coordinates for updating later
110
+ double const e0 = LocalParticle_get_energy0(part);
111
+ double const p0 = LocalParticle_get_p0c(part);
112
+ double const ptau_in = LocalParticle_get_ptau(part);
113
+ double const rvv_in = LocalParticle_get_rvv(part);
114
+ #ifdef XCOLL_USE_EXACT
115
+ double const xp_in = LocalParticle_get_exact_xp(part);
116
+ double const yp_in = LocalParticle_get_exact_yp(part);
117
+ #else
118
+ double const xp_in = LocalParticle_get_xp(part);
119
+ double const yp_in = LocalParticle_get_yp(part);
120
+ #endif
121
+ double const zeta_in = LocalParticle_get_zeta(part);
90
122
  double const mass_ratio = LocalParticle_get_charge_ratio(part) / LocalParticle_get_chi(part); // m/m0
91
- double energy = (LocalParticle_get_ptau(part)*p0 + e0) * mass_ratio; // energy in GeV
92
- int is_abs = 0;
93
- double const rpp_in = LocalParticle_get_rpp(part);
94
- double const rvv_in = LocalParticle_get_rvv(part);
95
- double const px_in = LocalParticle_get_px(part);
96
- double const py_in = LocalParticle_get_py(part);
97
-
98
- double* result = jaw(everest, part, energy, length, 0);
99
- energy = result[0];
100
- if (result[1] == 1){ is_abs = 1; }
101
- double s_out = result[2];
102
- free(result);
103
- free(everest);
123
+ double energy = (p0*ptau_in + e0) * mass_ratio;
104
124
 
105
- double ptau_out = (energy/mass_ratio - e0) / p0;
106
- LocalParticle_update_ptau(part, ptau_out);
107
- if (is_abs==0){
108
- double px = LocalParticle_get_px(part);
109
- double py = LocalParticle_get_py(part);
125
+ EverestData everest = EverestBlock_init_data(part, coll);
126
+ energy = jaw(everest, part, energy, length, 0);
127
+ free(everest);
128
+ LocalParticle_add_to_s(part, s_block);
129
+
130
+ LocalParticle_set_zeta(part, zeta_in);
131
+ // Survived particles need correcting:
132
+ if (LocalParticle_get_state(part)>0){
133
+ // Update energy
134
+ double ptau_out = (energy/mass_ratio - e0) / p0;
135
+ LocalParticle_update_ptau(part, ptau_out);
136
+ // Update zeta
137
+ #ifdef XCOLL_USE_EXACT
138
+ double xp = LocalParticle_get_exact_xp(part);
139
+ double yp = LocalParticle_get_exact_yp(part);
140
+ #else
141
+ double xp = LocalParticle_get_xp(part);
142
+ double yp = LocalParticle_get_yp(part);
143
+ #endif
110
144
  double rvv = LocalParticle_get_rvv(part);
111
- double rpp = LocalParticle_get_rpp(part);
112
145
  // First we drift half the length with the old angles:
113
- LocalParticle_add_to_zeta(part, drift_zeta_single(rvv_in, px_in*rpp_in, py_in*rpp_in, length/2) );
146
+ LocalParticle_add_to_zeta(part, drift_zeta_single(rvv_in, xp_in, yp_in, length/2) );
114
147
  // then half the length with the new angles:
115
- LocalParticle_add_to_zeta(part, drift_zeta_single(rvv, px*rpp, py*rpp, length/2) );
116
- } else {
117
- LocalParticle_set_s(part, s_out);
118
- LocalParticle_set_state(part, XC_LOST_ON_EVEREST_BLOCK);
148
+ LocalParticle_add_to_zeta(part, drift_zeta_single(rvv, xp, yp, length/2) );
119
149
  }
120
150
  }
121
151
  }
122
152
  //end_per_particle_block
123
-
124
153
  free(coll);
125
154
  }
126
155
 
@@ -0,0 +1,237 @@
1
+ // copyright ############################### #
2
+ // This file is part of the Xcoll Package. #
3
+ // Copyright (c) CERN, 2024. #
4
+ // ######################################### #
5
+
6
+ #ifndef XCOLL_EVEREST_COLL_H
7
+ #define XCOLL_EVEREST_COLL_H
8
+ #include <math.h>
9
+ #include <stdio.h>
10
+
11
+
12
+ /*gpufun*/
13
+ int8_t EverestCollimatorData_get_record_impacts(EverestCollimatorData el){
14
+ return EverestCollimatorData_get__record_interactions(el) % 2;
15
+ }
16
+
17
+ /*gpufun*/
18
+ int8_t EverestCollimatorData_get_record_exits(EverestCollimatorData el){
19
+ return (EverestCollimatorData_get__record_interactions(el) >> 1) % 2;
20
+ }
21
+
22
+ /*gpufun*/
23
+ int8_t EverestCollimatorData_get_record_scatterings(EverestCollimatorData el){
24
+ return (EverestCollimatorData_get__record_interactions(el) >> 2) % 2;
25
+ }
26
+
27
+ void EverestCollimator_set_material(EverestCollimatorData el){
28
+ MaterialData material = EverestCollimatorData_getp__material(el);
29
+ RandomRutherfordData rng = EverestCollimatorData_getp_rutherford_rng(el);
30
+ RandomRutherford_set_by_xcoll_material(rng, (GeneralMaterialData) material);
31
+ }
32
+
33
+
34
+ /*gpufun*/
35
+ CollimatorGeometry EverestCollimator_init_geometry(EverestCollimatorData el, LocalParticle* part0, int8_t active){
36
+ CollimatorGeometry cg = (CollimatorGeometry) malloc(sizeof(CollimatorGeometry_));
37
+ if (active){ // This is needed in order to avoid that the initialisation is called during a twiss!
38
+ // Jaw corners (with tilts)
39
+ cg->jaw_LU = EverestCollimatorData_get__jaw_LU(el);
40
+ cg->jaw_RU = EverestCollimatorData_get__jaw_RU(el);
41
+ // Get angles of jaws
42
+ cg->sin_zL = EverestCollimatorData_get__sin_zL(el);
43
+ cg->cos_zL = EverestCollimatorData_get__cos_zL(el);
44
+ cg->sin_zR = EverestCollimatorData_get__sin_zR(el);
45
+ cg->cos_zR = EverestCollimatorData_get__cos_zR(el);
46
+ cg->sin_zDiff = EverestCollimatorData_get__sin_zDiff(el);
47
+ cg->cos_zDiff = EverestCollimatorData_get__cos_zDiff(el);
48
+ cg->jaws_parallel = EverestCollimatorData_get__jaws_parallel(el);
49
+ // Tilts
50
+ cg->sin_yL = EverestCollimatorData_get__sin_yL(el);
51
+ cg->cos_yL = EverestCollimatorData_get__cos_yL(el);
52
+ cg->sin_yR = EverestCollimatorData_get__sin_yR(el);
53
+ cg->cos_yR = EverestCollimatorData_get__cos_yR(el);
54
+ // Length and segments
55
+ cg->length = EverestCollimatorData_get_length(el);
56
+ cg->side = EverestCollimatorData_get__side(el);
57
+ double s_U, s_D, x_D;
58
+ if (cg->side != -1){
59
+ s_U = cg->length/2 * (1-cg->cos_yL);
60
+ s_D = cg->length/2 * (1+cg->cos_yL);
61
+ x_D = EverestCollimatorData_get__jaw_LD(el);
62
+ cg->segments_L = create_jaw(s_U, cg->jaw_LU, s_D, x_D, cg->sin_yL/cg->cos_yL, 1);
63
+ }
64
+ if (cg->side != 1){
65
+ s_U = cg->length/2 * (1-cg->cos_yR);
66
+ s_D = cg->length/2 * (1+cg->cos_yR);
67
+ x_D = EverestCollimatorData_get__jaw_RD(el);
68
+ cg->segments_R = create_jaw(s_U, cg->jaw_RU, s_D, x_D, cg->sin_yR/cg->cos_yR, -1);
69
+ }
70
+ // Impact table
71
+ cg->record = EverestCollimatorData_getp_internal_record(el, part0);
72
+ cg->record_index = NULL;
73
+ cg->record_impacts = 0;
74
+ cg->record_exits = 0;
75
+ if (cg->record){
76
+ cg->record_index = InteractionRecordData_getp__index(cg->record);
77
+ cg->record_impacts = EverestCollimatorData_get_record_impacts(el);
78
+ cg->record_exits = EverestCollimatorData_get_record_exits(el);
79
+ }
80
+ }
81
+
82
+ return cg;
83
+ }
84
+
85
+ /*gpufun*/
86
+ void EverestCollimator_free(CollimatorGeometry restrict cg, int8_t active){
87
+ if (active){
88
+ if (cg->side != -1){
89
+ destroy_jaw(cg->segments_L);
90
+ }
91
+ if (cg->side != 1){
92
+ destroy_jaw(cg->segments_R);
93
+ }
94
+ }
95
+ free(cg);
96
+ }
97
+
98
+
99
+ // TODO: it would be great if we could set EverestData as an xofield, because then we could
100
+ // run this function at creation of the collimator instead of every turn
101
+ // Hmmmm this should be called whenever we change an xofield
102
+ /*gpufun*/
103
+ EverestCollData EverestCollimator_init(EverestCollimatorData el, LocalParticle* part0, int8_t active){
104
+ EverestCollData coll = (EverestCollData) malloc(sizeof(EverestCollData_));
105
+ if (active){ // This is needed in order to avoid that the initialisation is called during a twiss!
106
+ // Random generator and material
107
+ coll->rng = EverestCollimatorData_getp_rutherford_rng(el);
108
+ MaterialData material = EverestCollimatorData_getp__material(el);
109
+ coll->exenergy = MaterialData_get_excitation_energy(material)*1.0e3; // MeV
110
+ coll->rho = MaterialData_get_density(material);
111
+ coll->anuc = MaterialData_get_A(material);
112
+ coll->zatom = MaterialData_get_Z(material);
113
+ coll->bnref = MaterialData_get_nuclear_elastic_slope(material);
114
+ coll->radl = MaterialData_get_radiation_length(material);
115
+ coll->csref[0] = MaterialData_get_cross_section(material, 0);
116
+ coll->csref[1] = MaterialData_get_cross_section(material, 1);
117
+ coll->csref[5] = MaterialData_get_cross_section(material, 5);
118
+ coll->only_mcs = MaterialData_get__only_mcs(material);
119
+ // Impact table: need it here to record interactions
120
+ coll->record = EverestCollimatorData_getp_internal_record(el, part0);
121
+ coll->record_index = NULL;
122
+ coll->record_scatterings = 0;
123
+ if (coll->record){
124
+ coll->record_index = InteractionRecordData_getp__index(coll->record);
125
+ coll->record_scatterings = EverestCollimatorData_get_record_scatterings(el);
126
+ }
127
+ }
128
+
129
+ return coll;
130
+ }
131
+
132
+
133
+ /*gpufun*/
134
+ EverestData EverestCollimator_init_data(LocalParticle* part, EverestCollData coll){
135
+ EverestData everest = (EverestData) malloc(sizeof(EverestData_));
136
+ everest->coll = coll;
137
+ everest->rescale_scattering = 1;
138
+ #ifndef XCOLL_REFINE_ENERGY
139
+ // Preinitialise scattering parameters
140
+ double charge_ratio = LocalParticle_get_charge_ratio(part);
141
+ double mass_ratio = charge_ratio / LocalParticle_get_chi(part);
142
+ double energy = ( LocalParticle_get_ptau(part) + 1 / LocalParticle_get_beta0(part)
143
+ ) * mass_ratio * LocalParticle_get_p0c(part) / 1e9; // energy in GeV
144
+ energy = LocalParticle_get_energy0(part) / 1e9;
145
+ calculate_scattering(everest, energy);
146
+ calculate_ionisation_properties(everest, energy);
147
+ #endif
148
+ return everest;
149
+ }
150
+
151
+
152
+ /*gpufun*/
153
+ void EverestCollimator_track_local_particle(EverestCollimatorData el, LocalParticle* part0) {
154
+ int8_t active = EverestCollimatorData_get_active(el);
155
+ active *= EverestCollimatorData_get__tracking(el);
156
+ double const length = EverestCollimatorData_get_length(el);
157
+
158
+ // Initialise collimator data
159
+ // TODO: we want this to happen before tracking (instead of every turn), as a separate kernel
160
+ EverestCollData coll = EverestCollimator_init(el, part0, active);
161
+ CollimatorGeometry cg = EverestCollimator_init_geometry(el, part0, active);
162
+
163
+ //start_per_particle_block (part0->part)
164
+ if (!active){
165
+ // Drift full length
166
+ Drift_single_particle(part, length);
167
+
168
+ } else {
169
+ // Check collimator initialisation
170
+ int8_t is_valid = xcoll_check_particle_init(coll->rng, part);
171
+
172
+ if (is_valid) {
173
+ // Store s-location of start of collimator
174
+ double const s_coll = LocalParticle_get_s(part);
175
+ LocalParticle_set_s(part, 0);
176
+
177
+ // Store initial coordinates for updating later
178
+ double const e0 = LocalParticle_get_energy0(part);
179
+ double const p0 = LocalParticle_get_p0c(part);
180
+ double const ptau_in = LocalParticle_get_ptau(part);
181
+ double const rvv_in = LocalParticle_get_rvv(part);
182
+ #ifdef XCOLL_USE_EXACT
183
+ double const xp_in = LocalParticle_get_exact_xp(part);
184
+ double const yp_in = LocalParticle_get_exact_yp(part);
185
+ #else
186
+ double const xp_in = LocalParticle_get_xp(part);
187
+ double const yp_in = LocalParticle_get_yp(part);
188
+ #endif
189
+ double const zeta_in = LocalParticle_get_zeta(part);
190
+ double const mass_ratio = LocalParticle_get_charge_ratio(part) / LocalParticle_get_chi(part); // m/m0
191
+ double energy = (p0*ptau_in + e0) * mass_ratio;
192
+
193
+ // Check if hit on jaws
194
+ int8_t is_hit = hit_jaws_check_and_transform(part, cg);
195
+
196
+ if (is_hit != 0) {
197
+ // Hit one of the jaws, so scatter
198
+ double remaining_length = length - LocalParticle_get_s(part);
199
+ // Scatter
200
+ EverestData everest = EverestCollimator_init_data(part, coll);
201
+ energy = jaw(everest, part, energy, remaining_length, 1);
202
+ free(everest);
203
+ }
204
+
205
+ // Transform back to the lab frame
206
+ hit_jaws_transform_back(is_hit, part, cg);
207
+ LocalParticle_add_to_s(part, s_coll);
208
+
209
+ LocalParticle_set_zeta(part, zeta_in);
210
+ // Hit and survived particles need correcting:
211
+ if (is_hit!=0 && LocalParticle_get_state(part)>0){
212
+ // Update energy
213
+ double ptau_out = (energy/mass_ratio - e0) / p0;
214
+ LocalParticle_update_ptau(part, ptau_out);
215
+ // Update zeta
216
+ #ifdef XCOLL_USE_EXACT
217
+ double xp = LocalParticle_get_exact_xp(part);
218
+ double yp = LocalParticle_get_exact_yp(part);
219
+ #else
220
+ double xp = LocalParticle_get_xp(part);
221
+ double yp = LocalParticle_get_yp(part);
222
+ #endif
223
+ double rvv = LocalParticle_get_rvv(part);
224
+ // First we drift half the length with the old angles:
225
+ LocalParticle_add_to_zeta(part, drift_zeta_single(rvv_in, xp_in, yp_in, length/2) );
226
+ // then half the length with the new angles:
227
+ LocalParticle_add_to_zeta(part, drift_zeta_single(rvv, xp, yp, length/2) );
228
+ }
229
+ }
230
+ }
231
+ //end_per_particle_block
232
+ EverestCollimator_free(cg, active);
233
+ free(coll);
234
+ }
235
+
236
+
237
+ #endif /* XCOLL_EVEREST_COLL_H */
@@ -0,0 +1,280 @@
1
+ // copyright ############################### #
2
+ // This file is part of the Xcoll Package. #
3
+ // Copyright (c) CERN, 2024. #
4
+ // ######################################### #
5
+
6
+ #ifndef XCOLL_EVEREST_CRYSTAL_H
7
+ #define XCOLL_EVEREST_CRYSTAL_H
8
+ #include <math.h>
9
+ #include <stdio.h>
10
+
11
+
12
+ /*gpufun*/
13
+ int8_t EverestCrystalData_get_record_impacts(EverestCrystalData el){
14
+ return EverestCrystalData_get__record_interactions(el) % 2;
15
+ }
16
+
17
+ /*gpufun*/
18
+ int8_t EverestCrystalData_get_record_exits(EverestCrystalData el){
19
+ return (EverestCrystalData_get__record_interactions(el) >> 1) % 2;
20
+ }
21
+
22
+ /*gpufun*/
23
+ int8_t EverestCrystalData_get_record_scatterings(EverestCrystalData el){
24
+ return (EverestCrystalData_get__record_interactions(el) >> 2) % 2;
25
+ }
26
+
27
+
28
+ void EverestCrystal_set_material(EverestCrystalData el){
29
+ CrystalMaterialData material = EverestCrystalData_getp__material(el);
30
+ RandomRutherfordData rng = EverestCrystalData_getp_rutherford_rng(el);
31
+ RandomRutherford_set_by_xcoll_material(rng, (GeneralMaterialData) material);
32
+ }
33
+
34
+
35
+ /*gpufun*/
36
+ CrystalGeometry EverestCrystal_init_geometry(EverestCrystalData el, LocalParticle* part0, int8_t active){
37
+ CrystalGeometry cg = (CrystalGeometry) malloc(sizeof(CrystalGeometry_));
38
+ if (active){ // This is needed in order to avoid that the initialisation is called during a twiss!
39
+ cg->length = EverestCrystalData_get_length(el);
40
+ cg->side = EverestCrystalData_get__side(el);
41
+ if (cg->side == 0){
42
+ kill_all_particles(part0, XC_ERR_INVALID_XOFIELD);
43
+ return cg;
44
+ }
45
+ double R = EverestCrystalData_get__bending_radius(el);
46
+ double t_R = EverestCrystalData_get__bending_angle(el);
47
+ cg->bending_radius = R;
48
+ cg->bending_angle = t_R;
49
+ cg->miscut_angle = EverestCrystalData_get_miscut(el);
50
+ cg->width = EverestCrystalData_get_width(el);
51
+ cg->height = EverestCrystalData_get_height(el);
52
+ cg->jaw_U = EverestCrystalData_get__jaw_U(el);
53
+ cg->sin_z = EverestCrystalData_get__sin_z(el);
54
+ cg->cos_z = EverestCrystalData_get__cos_z(el);
55
+ cg->sin_y = EverestCrystalData_get__sin_y(el);
56
+ cg->cos_y = EverestCrystalData_get__cos_y(el);
57
+ // Segments
58
+ if (cg->side == 1){
59
+ cg->segments = create_crystal(cg->bending_radius, cg->width, cg->length, cg->jaw_U, \
60
+ cg->sin_y, cg->cos_y);
61
+ } else if (cg->side == -1){
62
+ // jaw_U is the inner corner (shifted if right-sided crystal)
63
+ cg->segments = create_crystal(cg->bending_radius, cg->width, cg->length, cg->jaw_U - cg->width, \
64
+ cg->sin_y, cg->cos_y);
65
+ }
66
+ // Bend centre
67
+ cg->s_B = 0;
68
+ cg->x_B = cg->bending_radius;
69
+ // Miscut centre
70
+ cg->s_P = -R*sin(cg->miscut_angle);
71
+ cg->x_P = R*cos(cg->miscut_angle);
72
+ if (cg->side == 1 && R < 0){
73
+ // If R<0, a left-sided crystal bends towards the beam
74
+ cg->x_P = cg->x_P + cg->width;
75
+ cg->x_B = cg->x_B + cg->width;
76
+ } else if (cg->side == -1 && R > 0){
77
+ // If R>0, a right-sided crystal bends towards the beam
78
+ cg->x_P = cg->x_P - cg->width;
79
+ cg->x_B = cg->x_B - cg->width;
80
+ }
81
+ if (cg->side == -1){
82
+ // Mirror the crystal geometry
83
+ cg->bending_radius = -cg->bending_radius;
84
+ cg->bending_angle = -cg->bending_angle;
85
+ cg->miscut_angle = -cg->miscut_angle;
86
+ cg->x_P = -cg->x_P;
87
+ cg->x_B = -cg->x_B;
88
+ }
89
+ // From here on, crystal geometry parameters can always be treated as left-sided.
90
+ // Note that the segments are not mirrored, which is fine as get_s_of_first_crossing_with_vlimit
91
+ // is absolute (not in the jaw reference frame). It is only after a hit is registered, that we
92
+ // need to transform the particle to the jaw reference frame.
93
+ double Rb;
94
+ if (cg->miscut_angle > 0){
95
+ Rb = R - cg->width;
96
+ } else {
97
+ Rb = R;
98
+ }
99
+ cg->t_VImax = atan( (Rb*sin(t_R) - cg->s_P) / (R - Rb*cos(t_R) - cg->x_P) );
100
+ // Impact table
101
+ cg->record = EverestCrystalData_getp_internal_record(el, part0);
102
+ cg->record_index = NULL;
103
+ cg->record_impacts = 0;
104
+ cg->record_exits = 0;
105
+ if (cg->record){
106
+ cg->record_index = InteractionRecordData_getp__index(cg->record);
107
+ cg->record_impacts = EverestCrystalData_get_record_impacts(el);
108
+ cg->record_exits = EverestCrystalData_get_record_exits(el);
109
+ }
110
+ }
111
+
112
+ return cg;
113
+ }
114
+
115
+ /*gpufun*/
116
+ void EverestCrystal_free(CrystalGeometry restrict cg, int8_t active){
117
+ if (active){
118
+ destroy_crystal(cg->segments);
119
+ }
120
+ free(cg);
121
+ }
122
+
123
+
124
+ // TODO: it would be great if we could set EverestData as an xofield, because then we could
125
+ // run this function at creation of the collimator instead of every turn
126
+ /*gpufun*/
127
+ EverestCollData EverestCrystal_init(EverestCrystalData el, LocalParticle* part0, int8_t active){
128
+ EverestCollData coll = (EverestCollData) malloc(sizeof(EverestCollData_));
129
+ if (active){ // This is needed in order to avoid that the initialisation is called during a twiss!
130
+ // Random generator and material
131
+ coll->rng = EverestCrystalData_getp_rutherford_rng(el);
132
+ CrystalMaterialData material = EverestCrystalData_getp__material(el);
133
+ coll->exenergy = CrystalMaterialData_get_excitation_energy(material)*1.0e3; // MeV
134
+ coll->rho = CrystalMaterialData_get_density(material);
135
+ coll->anuc = CrystalMaterialData_get_A(material);
136
+ coll->zatom = CrystalMaterialData_get_Z(material);
137
+ coll->bnref = CrystalMaterialData_get_nuclear_elastic_slope(material);
138
+ coll->csref[0] = CrystalMaterialData_get_cross_section(material, 0);
139
+ coll->csref[1] = CrystalMaterialData_get_cross_section(material, 1);
140
+ coll->csref[5] = CrystalMaterialData_get_cross_section(material, 5);
141
+ coll->dlri = CrystalMaterialData_get_crystal_radiation_length(material);
142
+ coll->dlyi = CrystalMaterialData_get_crystal_nuclear_length(material);
143
+ coll->ai = CrystalMaterialData_get_crystal_plane_distance(material);
144
+ coll->eum = CrystalMaterialData_get_crystal_potential(material);
145
+ coll->collnt = CrystalMaterialData_get_nuclear_collision_length(material);
146
+ coll->eta = 0.9; // Hard-coded channeling saturation factor
147
+ coll->orient = EverestCrystalData_get__orient(el);
148
+ // Impact table
149
+ coll->record = EverestCrystalData_getp_internal_record(el, part0);
150
+ coll->record_index = NULL;
151
+ if (coll->record){
152
+ coll->record_index = InteractionRecordData_getp__index(coll->record);
153
+ coll->record_scatterings = EverestCrystalData_get_record_scatterings(el);
154
+ }
155
+ }
156
+ return coll;
157
+ }
158
+
159
+
160
+ /*gpufun*/
161
+ EverestData EverestCrystal_init_data(LocalParticle* part, EverestCollData restrict coll, CrystalGeometry restrict cg){
162
+ EverestData everest = (EverestData) malloc(sizeof(EverestData_));
163
+ everest->coll = coll;
164
+ everest->rescale_scattering = 1;
165
+ #ifndef XCOLL_REFINE_ENERGY
166
+ // Preinitialise scattering parameters
167
+ double charge_ratio = LocalParticle_get_charge_ratio(part);
168
+ double mass_ratio = charge_ratio / LocalParticle_get_chi(part);
169
+ double energy = ( LocalParticle_get_ptau(part) + 1 / LocalParticle_get_beta0(part)
170
+ ) * mass_ratio * LocalParticle_get_p0c(part) / 1e9; // energy in GeV
171
+ calculate_scattering(everest, energy);
172
+ calculate_ionisation_properties(everest, energy);
173
+ calculate_critical_angle(everest, part, cg, energy);
174
+ calculate_VI_parameters(everest, part, energy);
175
+ #endif
176
+ return everest;
177
+ }
178
+
179
+
180
+ /*gpufun*/
181
+ void EverestCrystal_track_local_particle(EverestCrystalData el, LocalParticle* part0) {
182
+ int8_t active = EverestCrystalData_get_active(el);
183
+ active *= EverestCrystalData_get__tracking(el);
184
+ double length = EverestCrystalData_get_length(el);
185
+
186
+ // Initialise collimator data
187
+ // TODO: we want this to happen before tracking (instead of every turn), as a separate kernel
188
+ EverestCollData coll = EverestCrystal_init(el, part0, active);
189
+ CrystalGeometry cg = EverestCrystal_init_geometry(el, part0, active);
190
+
191
+ double t_c = 0;
192
+
193
+ //start_per_particle_block (part0->part)
194
+ if (!active){
195
+ // Drift full length
196
+ Drift_single_particle(part, length);
197
+
198
+ } else {
199
+ // Check collimator initialisation
200
+ int8_t is_valid = xcoll_check_particle_init(coll->rng, part);
201
+
202
+ if (is_valid) {
203
+ double const s_coll = LocalParticle_get_s(part);
204
+ LocalParticle_set_s(part, 0);
205
+
206
+ // Store initial coordinates for updating later
207
+ double const e0 = LocalParticle_get_energy0(part);
208
+ double const p0 = LocalParticle_get_p0c(part);
209
+ double const ptau_in = LocalParticle_get_ptau(part);
210
+ double const rvv_in = LocalParticle_get_rvv(part);
211
+ #ifdef XCOLL_USE_EXACT
212
+ double const xp_in = LocalParticle_get_exact_xp(part);
213
+ double const yp_in = LocalParticle_get_exact_yp(part);
214
+ #else
215
+ double const xp_in = LocalParticle_get_xp(part);
216
+ double const yp_in = LocalParticle_get_yp(part);
217
+ #endif
218
+ double const zeta_in = LocalParticle_get_zeta(part);
219
+ double const mass_ratio = LocalParticle_get_charge_ratio(part) / LocalParticle_get_chi(part); // m/m0
220
+ double energy = (p0*ptau_in + e0) * mass_ratio;
221
+
222
+ // Check if hit on jaws
223
+ int8_t is_hit = hit_crystal_check_and_transform(part, cg);
224
+
225
+ if (is_hit != 0) {
226
+ // Hit one of the jaws, so scatter
227
+ double remaining_length = length - LocalParticle_get_s(part);
228
+ // Scatter
229
+ EverestData everest = EverestCrystal_init_data(part0, coll, cg);
230
+ calculate_initial_angle(everest, part, cg);
231
+ #ifdef XCOLL_USE_EXACT
232
+ double const xp = LocalParticle_get_exact_xp(part);
233
+ #else
234
+ double const xp = LocalParticle_get_xp(part);
235
+ #endif
236
+ if (fabs(xp - everest->t_I) < everest->t_c) {
237
+ energy = Channel(everest, part, cg, energy/1.e9, remaining_length)*1.e9;
238
+ } else {
239
+ energy = Amorphous(everest, part, cg, energy/1.e9, remaining_length)*1.e9;
240
+ }
241
+ // Temporary workaround to store the critical angle for use later
242
+ calculate_critical_angle(everest, part, cg, e0/1.e9);
243
+ t_c = everest->t_c;
244
+ free(everest);
245
+ }
246
+
247
+ // Transform back to the lab frame
248
+ hit_crystal_transform_back(is_hit, part, cg);
249
+ LocalParticle_add_to_s(part, s_coll);
250
+
251
+ LocalParticle_set_zeta(part, zeta_in);
252
+ // Hit and survived particles need correcting:
253
+ if (is_hit!=0 && LocalParticle_get_state(part)>0){
254
+ // Update energy
255
+ double ptau_out = (energy/mass_ratio - e0) / p0;
256
+ LocalParticle_update_ptau(part, ptau_out);
257
+ // Update zeta
258
+ #ifdef XCOLL_USE_EXACT
259
+ double xp = LocalParticle_get_exact_xp(part);
260
+ double yp = LocalParticle_get_exact_yp(part);
261
+ #else
262
+ double xp = LocalParticle_get_xp(part);
263
+ double yp = LocalParticle_get_yp(part);
264
+ #endif
265
+ double rvv = LocalParticle_get_rvv(part);
266
+ // First we drift half the length with the old angles:
267
+ LocalParticle_add_to_zeta(part, drift_zeta_single(rvv_in, xp_in, yp_in, length/2) );
268
+ // then half the length with the new angles:
269
+ LocalParticle_add_to_zeta(part, drift_zeta_single(rvv, xp, yp, length/2) );
270
+ }
271
+ }
272
+ }
273
+ //end_per_particle_block
274
+ EverestCrystalData_set__critical_angle(el, t_c);
275
+ EverestCrystal_free(cg, active);
276
+ free(coll);
277
+ }
278
+
279
+
280
+ #endif /* XCOLL_EVEREST_CRYSTAL_H */