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
@@ -0,0 +1,97 @@
1
+ import numpy as np
2
+ import xobjects as xo
3
+ import xtrack as xt
4
+ import xpart as xp
5
+
6
+ import collimasim as cs
7
+
8
+ import multiprocessing
9
+
10
+ def make_particles():
11
+ np.random.seed(seed=1994)
12
+ n_part = 5000
13
+ particles = xp.Particles(
14
+ _capacity=n_part,
15
+ p0c = 185.e9,
16
+ mass0 = xp.ELECTRON_MASS_EV,
17
+ x=np.random.uniform(-1e-3, 1e-3, n_part),
18
+ px=np.random.uniform(-1e-4, 1e-4, n_part),
19
+ y=np.random.uniform(-1e-3, 1e-3, n_part),
20
+ py=np.random.uniform(-1e-4, 1e-4, n_part),
21
+ zeta=np.random.uniform(-0.1, 0.1, n_part),
22
+ delta=np.random.uniform(-0.9, 0.9, n_part),
23
+ )
24
+
25
+ return particles
26
+
27
+
28
+ def run_g4_logitudinal(particles):
29
+ np.random.seed(seed=1994)
30
+
31
+ g4man = cs.Geant4CollimationManager(collimator_file="resources/CollDB_testing.dat",
32
+ bdsim_config_file="resources/settings_black_absorber.gmad",
33
+ tfs_file="resources/twiss_file_testing.tfs",
34
+ reference_pdg_id=-11,
35
+ reference_kinetic_energy=182.5e9,
36
+ emittance_norm=(1.e-3, 1.e-6),
37
+ relative_energy_cut=0.001,
38
+ seed=1993,
39
+ # batchMode=False
40
+ batchMode=True
41
+ )
42
+
43
+ coll1 = g4man.make_xtg4_collimator("coll_open") # Use new convenience method
44
+
45
+ # Generate a simple sequence
46
+ line = xt.Line(
47
+ elements=[coll1,
48
+ ])
49
+
50
+ context = xo.ContextCpu()
51
+ line.build_tracker(_context=context)
52
+
53
+ part_copy = particles.copy()
54
+ line.track(part_copy, num_turns=1)
55
+ part_copy.remove_unused_space()
56
+
57
+ return part_copy
58
+
59
+ def run_drift_logitudinal(particles):
60
+
61
+ line = xt.Line(
62
+ elements=[xt.Drift(length=10),
63
+ ])
64
+
65
+ context = xo.ContextCpu()
66
+ line.config.XTRACK_USE_EXACT_DRIFTS = True
67
+ line.build_tracker(_context=context)
68
+
69
+ part_copy = particles.copy()
70
+ line.track(part_copy, num_turns=1)
71
+ part_copy.remove_unused_space()
72
+
73
+ return part_copy
74
+
75
+
76
+ def test_xtrack_tracking():
77
+ particles = make_particles()
78
+ part_g4 = run_g4_logitudinal(particles)
79
+ part_dr = run_drift_logitudinal(particles)
80
+
81
+ # BDSIM tracks trough some geometry padding now, which is not corrected for now
82
+ # so use a fairly lenient tolerance of 1e-8 for all coordinates over 10 m of drift
83
+ all_close = True
84
+ for var in ['x', 'px', 'y', 'py', 'zeta', 'delta']:
85
+ atol = 1e-8
86
+ rtol = 1e-5
87
+ var_close = np.all(np.isclose(getattr(part_g4, var), getattr(part_dr, var), atol=atol, rtol=rtol))
88
+
89
+ all_close &= var_close
90
+ print("Var {}: {}".format(var, var_close))
91
+
92
+ assert all_close
93
+
94
+
95
+
96
+ if __name__ == '__main__':
97
+ test_xtrack_tracking()
@@ -0,0 +1,96 @@
1
+ import numpy as np
2
+ import xobjects as xo
3
+ import xtrack as xt
4
+ import xpart as xp
5
+
6
+ import collimasim as cs
7
+
8
+ import multiprocessing
9
+
10
+ def make_particles():
11
+ np.random.seed(seed=1994)
12
+ n_part = 5000
13
+ particles = xp.Particles(
14
+ _capacity=n_part,
15
+ p0c = 36900e9,
16
+ mass0 = 193687676197.13638,
17
+ x=np.random.uniform(-1e-3, 1e-3, n_part),
18
+ px=np.random.uniform(-1e-4, 1e-4, n_part),
19
+ y=np.random.uniform(-1e-3, 1e-3, n_part),
20
+ py=np.random.uniform(-1e-4, 1e-4, n_part),
21
+ zeta=np.random.uniform(-0.1, 0.1, n_part),
22
+ delta=np.random.uniform(-0.4, 0.4, n_part),
23
+ )
24
+
25
+ return particles
26
+
27
+
28
+ def run_g4_logitudinal(particles):
29
+ np.random.seed(seed=1994)
30
+
31
+ g4man = cs.Geant4CollimationManager(collimator_file="resources/CollDB_testing.dat",
32
+ bdsim_config_file="resources/settings_black_absorber.gmad",
33
+ tfs_file="resources/twiss_file_testing.tfs",
34
+ reference_pdg_id=1000822080,
35
+ reference_kinetic_energy=36706820652500.0,
36
+ emittance_norm=(5.e-5, 5.e-5),
37
+ relative_energy_cut=0.001,
38
+ seed=1993,
39
+ # batchMode=False
40
+ batchMode=True
41
+ )
42
+
43
+ coll1 = g4man.make_xtg4_collimator("coll_open") # Use new convenience method
44
+
45
+ # Generate a simple sequence
46
+ line = xt.Line(
47
+ elements=[coll1,
48
+ ])
49
+
50
+ context = xo.ContextCpu()
51
+ line.build_tracker(_context=context)
52
+
53
+ part_copy = particles.copy()
54
+ line.track(part_copy, num_turns=1)
55
+ part_copy.remove_unused_space()
56
+
57
+ return part_copy
58
+
59
+ def run_drift_logitudinal(particles):
60
+
61
+ line = xt.Line(
62
+ elements=[xt.Drift(length=10),
63
+ ])
64
+
65
+ context = xo.ContextCpu()
66
+ line.config.XTRACK_USE_EXACT_DRIFTS = True
67
+ line.build_tracker(_context=context)
68
+
69
+ part_copy = particles.copy()
70
+ line.track(part_copy, num_turns=1)
71
+ part_copy.remove_unused_space()
72
+
73
+ return part_copy
74
+
75
+
76
+ def test_xtrack_tracking():
77
+ particles = make_particles()
78
+ part_g4 = run_g4_logitudinal(particles)
79
+ part_dr = run_drift_logitudinal(particles)
80
+
81
+ # BDSIM tracks trough some geometry padding now, which is not corrected for now
82
+ # so use a fairly lenient tolerance of 1e-8 for all coordinates over 10 m of drift
83
+ all_close = True
84
+ for var in ['x', 'px', 'y', 'py', 'zeta', 'delta']:
85
+ atol = 1e-6 # For ions, the zeta variable doesn't seem to agree so well, e.g it is up to 1e-7 m off
86
+ rtol = 1e-5
87
+ var_close = np.all(np.isclose(getattr(part_g4, var), getattr(part_dr, var), atol=atol, rtol=rtol))
88
+
89
+ all_close &= var_close
90
+ print("Var {}: {}".format(var, var_close))
91
+
92
+ assert all_close
93
+
94
+
95
+ if __name__ == '__main__':
96
+ test_xtrack_tracking()
@@ -0,0 +1,6 @@
1
+ # copyright ############################### #
2
+ # This file is part of the Xcoll Package. #
3
+ # Copyright (c) CERN, 2024. #
4
+ # ######################################### #
5
+
6
+ from .geometry import XcollGeometry
@@ -0,0 +1,218 @@
1
+ // copyright ############################### #
2
+ // This file is part of the Xcoll Package. #
3
+ // Copyright (c) CERN, 2024. #
4
+ // ######################################### #
5
+
6
+ #ifndef XCOLL_COLL_GEOM_H
7
+ #define XCOLL_COLL_GEOM_H
8
+ #include <math.h>
9
+ #include <stdio.h>
10
+
11
+ typedef struct CollimatorGeometry_ {
12
+ // Collimator jaws (with tilts)
13
+ double jaw_LU;
14
+ double jaw_RU;
15
+ double length;
16
+ int8_t side;
17
+ // Jaw angles
18
+ double sin_zL;
19
+ double cos_zL;
20
+ double sin_zR;
21
+ double cos_zR;
22
+ double sin_zDiff;
23
+ double cos_zDiff;
24
+ int8_t jaws_parallel;
25
+ // Tilts
26
+ double sin_yL;
27
+ double cos_yL;
28
+ double sin_yR;
29
+ double cos_yR;
30
+ // Segments
31
+ Segment* segments_L;
32
+ Segment* segments_R;
33
+ // Impact table
34
+ InteractionRecordData record;
35
+ RecordIndex record_index;
36
+ int8_t record_impacts;
37
+ int8_t record_exits;
38
+ } CollimatorGeometry_;
39
+ typedef CollimatorGeometry_* CollimatorGeometry;
40
+
41
+
42
+ // This function checks if a particle hits a jaw (and which).
43
+ // Return value: 0 (no hit), 1 (hit on left jaw), -1 (hit on right jaw).
44
+ // Furthermore, the particle is moved to the location where it hits the jaw (drifted to the end if no hit),
45
+ // and transformed to the reference frame of that jaw.
46
+ /*gpufun*/
47
+ int8_t hit_jaws_check_and_transform(LocalParticle* part, CollimatorGeometry restrict cg){
48
+ double part_x, part_tan;
49
+ int8_t is_hit = 0;
50
+ double s_L = 1.e21;
51
+ double s_R = 1.e21;
52
+
53
+ // Find the first hit on the left jaw (if not a right-sided collimator)
54
+ if (cg->side != -1){
55
+ SRotation_single_particle(part, cg->sin_zL, cg->cos_zL);
56
+ part_x = LocalParticle_get_x(part);
57
+ #ifdef XCOLL_USE_EXACT
58
+ part_tan = LocalParticle_get_exact_xp(part);
59
+ #else
60
+ part_tan = LocalParticle_get_xp(part);
61
+ #endif
62
+ s_L = get_s_of_first_crossing(part_x, part_tan, cg->segments_L, 3);
63
+ if (s_L < S_MAX){
64
+ is_hit = 1;
65
+ } else if (cg->side == 1){
66
+ // If left-sided and no hit, rotate back to lab frame
67
+ SRotation_single_particle(part, -cg->sin_zL, cg->cos_zL);
68
+ }
69
+ }
70
+
71
+ // if rightsided: lab frame
72
+ // if leftsided and no hit: lab frame
73
+ // if leftsided and hit: left frame
74
+ // if bothsided and no hit: left frame
75
+ // if bothsided and hit: left frame
76
+
77
+ // Find the first hit on the right jaw (if not a left-sided collimator)
78
+ if (cg->side != 1){
79
+ if (cg->side == -1){
80
+ // We didn't rotate to the left frame earlier, so full rotation to the right frame now
81
+ SRotation_single_particle(part, cg->sin_zR, cg->cos_zR);
82
+ } else if (!cg->jaws_parallel){
83
+ // We rotated to the left frame before, so now rotate the difference
84
+ SRotation_single_particle(part, cg->sin_zDiff, cg->cos_zDiff);
85
+ }
86
+ part_x = LocalParticle_get_x(part);
87
+ #ifdef XCOLL_USE_EXACT
88
+ part_tan = LocalParticle_get_exact_xp(part);
89
+ #else
90
+ part_tan = LocalParticle_get_xp(part);
91
+ #endif
92
+ s_R = get_s_of_first_crossing(part_x, part_tan, cg->segments_R, 3);
93
+ if (s_R < S_MAX && s_R < s_L){
94
+ is_hit = -1;
95
+ } else if (is_hit == 1){
96
+ if (!cg->jaws_parallel){
97
+ // Rotate back to left frame
98
+ SRotation_single_particle(part, -cg->sin_zDiff, cg->cos_zDiff);
99
+ }
100
+ } else {
101
+ // No hit, rotate back to lab frame
102
+ SRotation_single_particle(part, -cg->sin_zR, cg->cos_zR);
103
+ }
104
+ }
105
+
106
+ // if rightsided and no hit: lab frame
107
+ // if rightsided and hit: right frame
108
+ // if leftsided and no hit: lab frame
109
+ // if leftsided and hit: left frame
110
+ // if bothsided and no hit: lab frame
111
+ // if bothsided and hit: hit frame
112
+
113
+ // Drift to the impact position or end, and move to jaw frame if relevant
114
+ if (is_hit == 1){
115
+ // Move to the impact position
116
+ #ifdef XCOLL_USE_EXACT
117
+ Drift_single_particle_exact(part, s_L);
118
+ #else
119
+ Drift_single_particle_expanded(part, s_L);
120
+ #endif
121
+ // Shift the reference frame to the jaw corner LU
122
+ XYShift_single_particle(part, cg->jaw_LU, 0);
123
+ LocalParticle_add_to_s(part, -cg->length/2*(1 - cg->cos_yL));
124
+ // Rotate the reference frame to tilt
125
+ double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), asin(cg->sin_yL));
126
+ LocalParticle_set_s(part, new_s);
127
+ if (cg->record_impacts){
128
+ InteractionRecordData_log(cg->record, cg->record_index, part, XC_ENTER_JAW_L);
129
+ }
130
+
131
+ } else if (is_hit == -1){
132
+ // Move to the impact position
133
+ #ifdef XCOLL_USE_EXACT
134
+ Drift_single_particle_exact(part, s_R);
135
+ #else
136
+ Drift_single_particle_expanded(part, s_R);
137
+ #endif
138
+ // Shift the reference frame to the jaw corner RU
139
+ XYShift_single_particle(part, cg->jaw_RU, 0);
140
+ LocalParticle_add_to_s(part, -cg->length/2*(1 - cg->cos_yR));
141
+ // Rotate the reference frame to tilt
142
+ double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), asin(cg->sin_yR));
143
+ LocalParticle_set_s(part, new_s);
144
+ // Mirror x
145
+ LocalParticle_scale_x(part, -1);
146
+ #ifdef XCOLL_USE_EXACT
147
+ LocalParticle_scale_exact_xp(part, -1);
148
+ #else
149
+ LocalParticle_scale_xp(part, -1);
150
+ #endif
151
+ if (cg->record_impacts){
152
+ InteractionRecordData_log(cg->record, cg->record_index, part, XC_ENTER_JAW_R);
153
+ }
154
+
155
+ } else {
156
+ #ifdef XCOLL_USE_EXACT
157
+ Drift_single_particle_exact(part, cg->length);
158
+ #else
159
+ Drift_single_particle_expanded(part, cg->length);
160
+ #endif
161
+ }
162
+
163
+ return is_hit;
164
+ }
165
+
166
+
167
+ /*gpufun*/
168
+ void hit_jaws_transform_back(int8_t is_hit, LocalParticle* part, CollimatorGeometry restrict cg){
169
+ if (is_hit != 0 && LocalParticle_get_state(part) > 0){
170
+ if (cg->record_exits){
171
+ InteractionRecordData_log(cg->record, cg->record_index, part, XC_EXIT_JAW);
172
+ }
173
+ }
174
+ if (is_hit == 1){
175
+ // Rotate back from tilt
176
+ double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), -asin(cg->sin_yL));
177
+ LocalParticle_set_s(part, new_s);
178
+ // Shift the reference frame back from jaw corner LU
179
+ XYShift_single_particle(part, -cg->jaw_LU, 0);
180
+ LocalParticle_add_to_s(part, cg->length/2*(1 - cg->cos_yL));
181
+ // If particle survived, drift to end of element
182
+ if (LocalParticle_get_state(part) > 0){
183
+ #ifdef XCOLL_USE_EXACT
184
+ Drift_single_particle_exact(part, cg->length - LocalParticle_get_s(part));
185
+ #else
186
+ Drift_single_particle_expanded(part, cg->length - LocalParticle_get_s(part));
187
+ #endif
188
+ }
189
+ SRotation_single_particle(part, -cg->sin_zL, cg->cos_zL);
190
+
191
+ } else if (is_hit == -1){
192
+ // Mirror back
193
+ LocalParticle_scale_x(part, -1);
194
+ #ifdef XCOLL_USE_EXACT
195
+ LocalParticle_scale_exact_xp(part, -1);
196
+ #else
197
+ LocalParticle_scale_xp(part, -1);
198
+ #endif
199
+ // Rotate back from tilt
200
+ double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), -asin(cg->sin_yR));
201
+ LocalParticle_set_s(part, new_s);
202
+ // Shift the reference frame back from jaw corner RU
203
+ XYShift_single_particle(part, -cg->jaw_RU, 0);
204
+ LocalParticle_add_to_s(part, cg->length/2*(1 - cg->cos_yR));
205
+ // If particle survived, drift to end of element
206
+ if (LocalParticle_get_state(part) > 0){
207
+ #ifdef XCOLL_USE_EXACT
208
+ Drift_single_particle_exact(part, cg->length - LocalParticle_get_s(part));
209
+ #else
210
+ Drift_single_particle_expanded(part, cg->length - LocalParticle_get_s(part));
211
+ #endif
212
+ }
213
+ SRotation_single_particle(part, -cg->sin_zR, cg->cos_zR);
214
+ }
215
+ }
216
+
217
+
218
+ #endif /* XCOLL_COLL_GEOM_H */
@@ -0,0 +1,153 @@
1
+ // copyright ############################### #
2
+ // This file is part of the Xcoll Package. #
3
+ // Copyright (c) CERN, 2024. #
4
+ // ######################################### #
5
+
6
+ #ifndef XCOLL_CRY_GEOM_H
7
+ #define XCOLL_CRY_GEOM_H
8
+ #include <math.h>
9
+ #include <stdio.h>
10
+
11
+ typedef struct CrystalGeometry_ {
12
+ // Crystal inner upstream corner (with tilt)
13
+ double jaw_U;
14
+ double length;
15
+ int8_t side;
16
+ // Jaw angle
17
+ double sin_z;
18
+ double cos_z;
19
+ // Tilt
20
+ double sin_y;
21
+ double cos_y;
22
+ // Crystal geometry
23
+ double bending_radius;
24
+ double bending_angle;
25
+ double width;
26
+ double height;
27
+ double miscut_angle;
28
+ double s_B; // Bend centre
29
+ double x_B;
30
+ double s_P; // Miscut centre
31
+ double x_P;
32
+ double t_VImax;
33
+ // Segments
34
+ Segment* segments;
35
+ // Impact table
36
+ InteractionRecordData record;
37
+ RecordIndex record_index;
38
+ int8_t record_impacts;
39
+ int8_t record_exits;
40
+ } CrystalGeometry_;
41
+ typedef CrystalGeometry_* CrystalGeometry;
42
+
43
+
44
+ // This function checks if a particle hits a jaw (and which).
45
+ // Return value: 0 (no hit), 1 (hit on left jaw), -1 (hit on right jaw).
46
+ // Furthermore, the particle is moved to the location where it hits the jaw (drifted to the end if no hit),
47
+ // and transformed to the reference frame of that jaw.
48
+ /*gpufun*/
49
+ int8_t hit_crystal_check_and_transform(LocalParticle* part, CrystalGeometry restrict cg){
50
+ double part_x, part_tan_x, part_y, part_tan_y;
51
+ double s = 1.e21;
52
+
53
+ // Crystal should be single-sided
54
+ if (cg->side == 0){
55
+ LocalParticle_kill_particle(part, XC_ERR_NOT_IMPLEMENTED);
56
+ }
57
+
58
+ SRotation_single_particle(part, cg->sin_z, cg->cos_z);
59
+ part_x = LocalParticle_get_x(part);
60
+ #ifdef XCOLL_USE_EXACT
61
+ part_tan_x = LocalParticle_get_exact_xp(part);
62
+ #else
63
+ part_tan_x = LocalParticle_get_xp(part);
64
+ #endif
65
+ part_y = LocalParticle_get_y(part);
66
+ #ifdef XCOLL_USE_EXACT
67
+ part_tan_y = LocalParticle_get_exact_yp(part);
68
+ #else
69
+ part_tan_y = LocalParticle_get_yp(part);
70
+ #endif
71
+ s = get_s_of_first_crossing_with_vlimit(part_x, part_tan_x, part_y, part_tan_y, cg->segments, 4, -cg->height/2, cg->height/2);
72
+
73
+ if (s < S_MAX){
74
+ // Hit: Drift to the impact position, and move to jaw frame if relevant
75
+ #ifdef XCOLL_USE_EXACT
76
+ Drift_single_particle_exact(part, s);
77
+ #else
78
+ Drift_single_particle_expanded(part, s);
79
+ #endif
80
+ // Shift the reference frame to the upstream jaw corner (for a crystal, this is always at s=0)
81
+ XYShift_single_particle(part, cg->jaw_U, 0);
82
+ // Rotate the reference frame to tilt
83
+ double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), asin(cg->sin_y));
84
+ LocalParticle_set_s(part, new_s);
85
+ if (cg->side == 1){
86
+ if (cg->record_impacts){
87
+ InteractionRecordData_log(cg->record, cg->record_index, part, XC_ENTER_JAW_L);
88
+ }
89
+
90
+ } else {
91
+ // Mirror x
92
+ LocalParticle_scale_x(part, -1);
93
+ #ifdef XCOLL_USE_EXACT
94
+ LocalParticle_scale_exact_xp(part, -1);
95
+ #else
96
+ LocalParticle_scale_xp(part, -1);
97
+ #endif
98
+ if (cg->record_impacts){
99
+ InteractionRecordData_log(cg->record, cg->record_index, part, XC_ENTER_JAW_R);
100
+ }
101
+ }
102
+ return cg->side;
103
+
104
+ } else {
105
+ // No hit, rotate back to lab frame
106
+ SRotation_single_particle(part, -cg->sin_z, cg->cos_z);
107
+ // Drift to end
108
+ #ifdef XCOLL_USE_EXACT
109
+ Drift_single_particle_exact(part, cg->length);
110
+ #else
111
+ Drift_single_particle_expanded(part, cg->length);
112
+ #endif
113
+ return 0;
114
+ }
115
+ }
116
+
117
+
118
+ /*gpufun*/
119
+ void hit_crystal_transform_back(int8_t is_hit, LocalParticle* part, CrystalGeometry restrict cg){
120
+ if (is_hit != 0){
121
+ if (LocalParticle_get_state(part) > 0){
122
+ if (cg->record_exits){
123
+ InteractionRecordData_log(cg->record, cg->record_index, part, XC_EXIT_JAW);
124
+ }
125
+ }
126
+ if (cg->side == -1){
127
+ // Mirror back
128
+ LocalParticle_scale_x(part, -1);
129
+ #ifdef XCOLL_USE_EXACT
130
+ LocalParticle_scale_exact_xp(part, -1);
131
+ #else
132
+ LocalParticle_scale_xp(part, -1);
133
+ #endif
134
+ }
135
+ // Rotate back from tilt
136
+ double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), -asin(cg->sin_y));
137
+ LocalParticle_set_s(part, new_s);
138
+ // Shift the reference frame back from jaw corner U
139
+ XYShift_single_particle(part, -cg->jaw_U, 0);
140
+ // If particle survived, drift to end of element
141
+ if (LocalParticle_get_state(part) > 0){
142
+ #ifdef XCOLL_USE_EXACT
143
+ Drift_single_particle_exact(part, cg->length - LocalParticle_get_s(part));
144
+ #else
145
+ Drift_single_particle_expanded(part, cg->length - LocalParticle_get_s(part));
146
+ #endif
147
+ }
148
+ SRotation_single_particle(part, -cg->sin_z, cg->cos_z);
149
+ }
150
+ }
151
+
152
+
153
+ #endif /* XCOLL_CRY_GEOM_H */
@@ -0,0 +1,26 @@
1
+ # copyright ############################### #
2
+ # This file is part of the Xcoll Package. #
3
+ # Copyright (c) CERN, 2024. #
4
+ # ######################################### #
5
+
6
+ import xtrack as xt
7
+ from ...interaction_record import InteractionRecord
8
+ from ...general import _pkg_root
9
+
10
+ class XcollGeometry(xt.BeamElement):
11
+ _xofields = {}
12
+
13
+ allow_track = False
14
+
15
+ _depends_on = [xt.Drift, xt.XYShift, xt.SRotation, xt.YRotation, InteractionRecord]
16
+
17
+ _extra_c_sources = [
18
+ _pkg_root.joinpath('scattering_routines','geometry','sort.h'),
19
+ _pkg_root.joinpath('scattering_routines','geometry','segments.h'),
20
+ _pkg_root.joinpath('scattering_routines','geometry','objects.h'),
21
+ _pkg_root.joinpath('scattering_routines','geometry','methods.h'),
22
+ _pkg_root.joinpath('scattering_routines','geometry','get_s.h'),
23
+ _pkg_root.joinpath('scattering_routines','geometry','rotation.h'),
24
+ _pkg_root.joinpath('scattering_routines','geometry','collimator_geometry.h'),
25
+ _pkg_root.joinpath('scattering_routines','geometry','crystal_geometry.h')
26
+ ]
@@ -0,0 +1,92 @@
1
+ // copyright ############################### #
2
+ // This file is part of the Xcoll Package. #
3
+ // Copyright (c) CERN, 2024. #
4
+ // ######################################### #
5
+
6
+ #ifndef XCOLL_GEOM_GET_S_H
7
+ #define XCOLL_GEOM_GET_S_H
8
+ #include <math.h>
9
+ #include <stdio.h>
10
+ #include <stdint.h>
11
+ #include <stdlib.h>
12
+
13
+
14
+ // IMPORTANT:
15
+ // These functions assume that the particle moves towards positive s!
16
+ // (hence no backscattering/backtracking is allowed)
17
+
18
+
19
+ /*gpufun*/
20
+ double get_s_of_first_crossing(double part_x, double part_tan, Segment* segments, \
21
+ int8_t n_segments){
22
+ int8_t n_hit = 0;
23
+ double* s = (double*) malloc(XC_MAX_CROSS_PER_SEGMENT*n_segments*sizeof(double));
24
+ find_crossing(&n_hit, s, part_x, part_tan, segments, n_segments);
25
+ if (n_hit==0){
26
+ // No crossing
27
+ free(s);
28
+ return S_MAX;
29
+ }
30
+ double result = s[0];
31
+ free(s);
32
+ return result;
33
+ }
34
+
35
+ /*gpufun*/
36
+ double get_s_of_crossing_after_s(double part_x, double part_tan, Segment* segments, \
37
+ int8_t n_segments, double current_s){
38
+ int8_t n_hit = 0;
39
+ double* s = (double*) malloc(XC_MAX_CROSS_PER_SEGMENT*n_segments*sizeof(double));
40
+ find_crossing(&n_hit, s, part_x, part_tan, segments, n_segments);
41
+ for (int8_t i=0; i<n_hit; i++){
42
+ if (s[i] >= current_s){
43
+ double result = s[i];
44
+ free(s);
45
+ return result;
46
+ }
47
+ }
48
+ // No crossing
49
+ free(s);
50
+ return S_MAX;
51
+ }
52
+
53
+ /*gpufun*/
54
+ double get_s_of_first_crossing_with_vlimit(double part_x, double part_tan_x, \
55
+ double part_y, double part_tan_y, Segment* segments, \
56
+ int8_t n_segments, double y_min, double y_max){
57
+ int8_t n_hit = 0;
58
+ double* s = (double*) malloc(XC_MAX_CROSS_PER_SEGMENT*n_segments*sizeof(double));
59
+ find_crossing_with_vlimit(&n_hit, s, part_x, part_tan_x, part_y, part_tan_y, \
60
+ segments, n_segments, y_min, y_max);
61
+ if (n_hit==0){
62
+ // No crossing
63
+ free(s);
64
+ return S_MAX;
65
+ }
66
+ double result = s[0];
67
+ free(s);
68
+ return result;
69
+ }
70
+
71
+ /*gpufun*/
72
+ double get_s_of_crossing_after_s_with_vlimit(double part_x, double part_tan_x, \
73
+ double part_y, double part_tan_y, Segment* segments, \
74
+ int8_t n_segments, double y_min, double y_max, double current_s){
75
+ int8_t n_hit = 0;
76
+ double* s = (double*) malloc(XC_MAX_CROSS_PER_SEGMENT*n_segments*sizeof(double));
77
+ find_crossing_with_vlimit(&n_hit, s, part_x, part_tan_x, part_y, part_tan_y, \
78
+ segments, n_segments, y_min, y_max);
79
+ for (int8_t i=0; i<n_hit; i++){
80
+ if (s[i] >= current_s){
81
+ double result = s[i];
82
+ free(s);
83
+ return result;
84
+ }
85
+ }
86
+ // No crossing
87
+ free(s);
88
+ return S_MAX;
89
+ }
90
+
91
+
92
+ #endif /* XCOLL_GEOM_GET_S_H */