xcoll 0.5.12__py3-none-any.whl → 0.6.1__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 (336) hide show
  1. xcoll/__init__.py +5 -18
  2. xcoll/__init__.py.orig +26 -0
  3. xcoll/beam_elements/__init__.py +1 -0
  4. xcoll/beam_elements/absorber.py +12 -2
  5. xcoll/beam_elements/base.py +162 -62
  6. xcoll/beam_elements/blowup.py +1 -0
  7. xcoll/beam_elements/elements_src/black_absorber.h +57 -58
  8. xcoll/beam_elements/elements_src/black_crystal.h +49 -50
  9. xcoll/beam_elements/elements_src/everest_block.h +21 -11
  10. xcoll/beam_elements/elements_src/everest_collimator.h +100 -91
  11. xcoll/beam_elements/elements_src/everest_crystal.h +145 -140
  12. xcoll/beam_elements/elements_src/transparent_collimator.h +126 -0
  13. xcoll/beam_elements/elements_src/transparent_crystal.h +118 -0
  14. xcoll/beam_elements/everest.py +16 -5
  15. xcoll/beam_elements/monitor.py +1 -0
  16. xcoll/beam_elements/transparent.py +83 -0
  17. xcoll/colldb.py +15 -6
  18. xcoll/general.py +1 -1
  19. xcoll/general.py.orig +20 -0
  20. xcoll/headers/particle_states.py +51 -0
  21. xcoll/initial_distribution.py +121 -91
  22. xcoll/initial_distribution.py.orig +256 -0
  23. xcoll/interaction_record/interaction_record.py +2 -1
  24. xcoll/interaction_record/interaction_types.py +2 -2
  25. xcoll/line_tools.py +163 -73
  26. xcoll/lossmap.py +519 -127
  27. xcoll/plot.py +109 -0
  28. xcoll/rf_sweep.py +6 -0
  29. xcoll/scattering_routines/engine.py +414 -217
  30. xcoll/scattering_routines/environment.py +297 -0
  31. xcoll/scattering_routines/everest/amorphous.h +95 -71
  32. xcoll/scattering_routines/everest/{channeling.h → channelling.h} +121 -112
  33. xcoll/scattering_routines/everest/constants.h +1 -1
  34. xcoll/scattering_routines/everest/crystal_parameters.h +9 -9
  35. xcoll/scattering_routines/everest/everest.h +8 -3
  36. xcoll/scattering_routines/everest/everest.py +2 -1
  37. xcoll/scattering_routines/everest/ionisation_loss.h +141 -0
  38. xcoll/scattering_routines/everest/jaw.h +19 -24
  39. xcoll/scattering_routines/everest/materials.py +2 -0
  40. xcoll/scattering_routines/everest/multiple_coulomb_scattering.h +2 -2
  41. xcoll/scattering_routines/everest/nuclear_interaction.h +35 -19
  42. xcoll/scattering_routines/everest/properties.h +3 -72
  43. xcoll/xaux.py +65 -109
  44. {xcoll-0.5.12.dist-info → xcoll-0.6.1.dist-info}/METADATA +5 -5
  45. xcoll-0.6.1.dist-info/RECORD +138 -0
  46. xcoll/_manager.py +0 -22
  47. xcoll/headers/particle_states.h +0 -25
  48. xcoll/install.py +0 -35
  49. xcoll/scattering_routines/geant4/collimasim/.git +0 -1
  50. xcoll/scattering_routines/geant4/collimasim/.gitignore +0 -12
  51. xcoll/scattering_routines/geant4/collimasim/.gitmodules +0 -3
  52. xcoll/scattering_routines/geant4/collimasim/CMakeLists.txt +0 -26
  53. xcoll/scattering_routines/geant4/collimasim/README.md +0 -21
  54. xcoll/scattering_routines/geant4/collimasim/docs/Makefile +0 -20
  55. xcoll/scattering_routines/geant4/collimasim/docs/make.bat +0 -35
  56. xcoll/scattering_routines/geant4/collimasim/docs/source/collimasim.rst +0 -10
  57. xcoll/scattering_routines/geant4/collimasim/docs/source/conf.py +0 -59
  58. xcoll/scattering_routines/geant4/collimasim/docs/source/index.rst +0 -26
  59. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.appveyor.yml +0 -37
  60. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.clang-format +0 -19
  61. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.clang-tidy +0 -65
  62. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.cmake-format.yaml +0 -73
  63. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.git +0 -1
  64. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/CODEOWNERS +0 -9
  65. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/CONTRIBUTING.md +0 -386
  66. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/ISSUE_TEMPLATE/bug-report.yml +0 -45
  67. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/ISSUE_TEMPLATE/config.yml +0 -8
  68. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/dependabot.yml +0 -16
  69. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/labeler.yml +0 -8
  70. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/labeler_merged.yml +0 -3
  71. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/pull_request_template.md +0 -19
  72. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/ci.yml +0 -969
  73. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/configure.yml +0 -84
  74. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/format.yml +0 -48
  75. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/labeler.yml +0 -16
  76. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/pip.yml +0 -103
  77. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.gitignore +0 -45
  78. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.pre-commit-config.yaml +0 -151
  79. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.readthedocs.yml +0 -3
  80. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/CMakeLists.txt +0 -297
  81. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/LICENSE +0 -29
  82. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/MANIFEST.in +0 -6
  83. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/README.rst +0 -180
  84. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/Doxyfile +0 -23
  85. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/Makefile +0 -192
  86. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/_static/theme_overrides.css +0 -11
  87. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/chrono.rst +0 -81
  88. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/custom.rst +0 -93
  89. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/eigen.rst +0 -310
  90. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/functional.rst +0 -109
  91. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/index.rst +0 -43
  92. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/overview.rst +0 -171
  93. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/stl.rst +0 -251
  94. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/strings.rst +0 -305
  95. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/classes.rst +0 -1297
  96. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/embedding.rst +0 -262
  97. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/exceptions.rst +0 -396
  98. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/functions.rst +0 -568
  99. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/misc.rst +0 -337
  100. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/index.rst +0 -13
  101. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/numpy.rst +0 -463
  102. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/object.rst +0 -286
  103. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/utilities.rst +0 -155
  104. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/smart_ptrs.rst +0 -174
  105. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/basics.rst +0 -308
  106. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/benchmark.py +0 -91
  107. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/benchmark.rst +0 -95
  108. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/changelog.rst +0 -2050
  109. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/classes.rst +0 -542
  110. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/cmake/index.rst +0 -8
  111. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/compiling.rst +0 -648
  112. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/conf.py +0 -381
  113. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/faq.rst +0 -343
  114. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/index.rst +0 -48
  115. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/installing.rst +0 -105
  116. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/limitations.rst +0 -72
  117. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11-logo.png +0 -0
  118. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python1.png +0 -0
  119. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python1.svg +0 -427
  120. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python2.png +0 -0
  121. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python2.svg +0 -427
  122. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/reference.rst +0 -130
  123. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/release.rst +0 -96
  124. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/requirements.txt +0 -8
  125. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/upgrade.rst +0 -548
  126. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/attr.h +0 -605
  127. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/buffer_info.h +0 -144
  128. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/cast.h +0 -1432
  129. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/chrono.h +0 -213
  130. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/common.h +0 -2
  131. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/complex.h +0 -65
  132. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/class.h +0 -709
  133. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/common.h +0 -1021
  134. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/descr.h +0 -104
  135. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/init.h +0 -346
  136. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/internals.h +0 -467
  137. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/type_caster_base.h +0 -978
  138. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/typeid.h +0 -55
  139. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/eigen.h +0 -606
  140. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/embed.h +0 -284
  141. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/eval.h +0 -163
  142. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/functional.h +0 -121
  143. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/gil.h +0 -193
  144. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/iostream.h +0 -275
  145. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/numpy.h +0 -1741
  146. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/operators.h +0 -163
  147. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/options.h +0 -65
  148. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/pybind11.h +0 -2497
  149. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/pytypes.h +0 -1879
  150. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl/filesystem.h +0 -103
  151. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl.h +0 -375
  152. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl_bind.h +0 -747
  153. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/noxfile.py +0 -88
  154. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/__init__.py +0 -11
  155. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/__main__.py +0 -52
  156. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/_version.py +0 -12
  157. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/_version.pyi +0 -6
  158. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/commands.py +0 -21
  159. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/py.typed +0 -0
  160. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/setup_helpers.py +0 -482
  161. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/setup_helpers.pyi +0 -63
  162. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pyproject.toml +0 -41
  163. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/setup.cfg +0 -56
  164. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/setup.py +0 -155
  165. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/CMakeLists.txt +0 -503
  166. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/conftest.py +0 -208
  167. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/constructor_stats.h +0 -275
  168. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/cross_module_gil_utils.cpp +0 -73
  169. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/env.py +0 -33
  170. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_python_package/pytest.ini +0 -0
  171. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_python_package/test_files.py +0 -279
  172. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_setuptools/pytest.ini +0 -0
  173. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_setuptools/test_setuphelper.py +0 -143
  174. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/local_bindings.h +0 -85
  175. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/object.h +0 -179
  176. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_cross_module_tests.cpp +0 -151
  177. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_tests.cpp +0 -91
  178. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_tests.h +0 -85
  179. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pytest.ini +0 -19
  180. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/requirements.txt +0 -12
  181. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_async.cpp +0 -26
  182. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_async.py +0 -25
  183. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_buffers.cpp +0 -216
  184. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_buffers.py +0 -163
  185. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_builtin_casters.cpp +0 -286
  186. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_builtin_casters.py +0 -536
  187. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_call_policies.cpp +0 -107
  188. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_call_policies.py +0 -248
  189. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_callbacks.cpp +0 -227
  190. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_callbacks.py +0 -202
  191. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_chrono.cpp +0 -84
  192. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_chrono.py +0 -210
  193. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_class.cpp +0 -550
  194. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_class.py +0 -473
  195. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/CMakeLists.txt +0 -84
  196. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/embed.cpp +0 -21
  197. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_embed/CMakeLists.txt +0 -28
  198. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_function/CMakeLists.txt +0 -39
  199. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_target/CMakeLists.txt +0 -46
  200. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/main.cpp +0 -6
  201. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_embed/CMakeLists.txt +0 -41
  202. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_function/CMakeLists.txt +0 -35
  203. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_target/CMakeLists.txt +0 -41
  204. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/test.py +0 -10
  205. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_constants_and_functions.cpp +0 -165
  206. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_constants_and_functions.py +0 -53
  207. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_copy_move.cpp +0 -238
  208. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_copy_move.py +0 -126
  209. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_casters.cpp +0 -141
  210. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_casters.py +0 -117
  211. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_setup.cpp +0 -41
  212. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_setup.py +0 -50
  213. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_docstring_options.cpp +0 -69
  214. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_docstring_options.py +0 -42
  215. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eigen.cpp +0 -348
  216. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eigen.py +0 -771
  217. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/CMakeLists.txt +0 -47
  218. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/catch.cpp +0 -22
  219. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/external_module.cpp +0 -23
  220. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/test_interpreter.cpp +0 -326
  221. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/test_interpreter.py +0 -15
  222. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_enum.cpp +0 -148
  223. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_enum.py +0 -272
  224. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval.cpp +0 -119
  225. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval.py +0 -51
  226. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval_call.py +0 -5
  227. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.cpp +0 -285
  228. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.h +0 -12
  229. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.py +0 -265
  230. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_factory_constructors.cpp +0 -397
  231. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_factory_constructors.py +0 -520
  232. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_gil_scoped.cpp +0 -49
  233. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_gil_scoped.py +0 -94
  234. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_iostream.cpp +0 -125
  235. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_iostream.py +0 -331
  236. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_kwargs_and_defaults.cpp +0 -153
  237. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_kwargs_and_defaults.py +0 -284
  238. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_local_bindings.cpp +0 -107
  239. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_local_bindings.py +0 -257
  240. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_methods_and_attributes.cpp +0 -412
  241. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_methods_and_attributes.py +0 -517
  242. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_modules.cpp +0 -102
  243. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_modules.py +0 -92
  244. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_multiple_inheritance.cpp +0 -233
  245. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_multiple_inheritance.py +0 -360
  246. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_array.cpp +0 -472
  247. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_array.py +0 -593
  248. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_dtypes.cpp +0 -524
  249. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_dtypes.py +0 -441
  250. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_vectorize.cpp +0 -103
  251. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_vectorize.py +0 -267
  252. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_opaque_types.cpp +0 -73
  253. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_opaque_types.py +0 -59
  254. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_operator_overloading.cpp +0 -235
  255. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_operator_overloading.py +0 -146
  256. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pickling.cpp +0 -189
  257. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pickling.py +0 -82
  258. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pytypes.cpp +0 -560
  259. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pytypes.py +0 -651
  260. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_sequences_and_iterators.cpp +0 -500
  261. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_sequences_and_iterators.py +0 -253
  262. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_smart_ptr.cpp +0 -452
  263. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_smart_ptr.py +0 -318
  264. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl.cpp +0 -342
  265. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl.py +0 -291
  266. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl_binders.cpp +0 -131
  267. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl_binders.py +0 -318
  268. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_tagbased_polymorphic.cpp +0 -144
  269. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_tagbased_polymorphic.py +0 -29
  270. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_thread.cpp +0 -66
  271. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_thread.py +0 -44
  272. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_union.cpp +0 -22
  273. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_union.py +0 -9
  274. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_virtual_functions.cpp +0 -510
  275. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_virtual_functions.py +0 -408
  276. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/valgrind-numpy-scipy.supp +0 -140
  277. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/valgrind-python.supp +0 -117
  278. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindCatch.cmake +0 -70
  279. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindEigen3.cmake +0 -86
  280. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindPythonLibsNew.cmake +0 -257
  281. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/check-style.sh +0 -44
  282. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/cmake_uninstall.cmake.in +0 -23
  283. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/libsize.py +0 -39
  284. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/make_changelog.py +0 -64
  285. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Common.cmake +0 -402
  286. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Config.cmake.in +0 -233
  287. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11NewTools.cmake +0 -276
  288. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Tools.cmake +0 -214
  289. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pyproject.toml +0 -3
  290. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/setup_global.py.in +0 -65
  291. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/setup_main.py.in +0 -41
  292. xcoll/scattering_routines/geant4/collimasim/pyproject.toml +0 -8
  293. xcoll/scattering_routines/geant4/collimasim/setup.py +0 -144
  294. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSPyATInterface.cpp +0 -403
  295. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSPyATInterface.hh +0 -100
  296. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSXtrackInterface.cpp +0 -763
  297. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSXtrackInterface.hh +0 -118
  298. xcoll/scattering_routines/geant4/collimasim/src/collimasim/__init__.py +0 -8
  299. xcoll/scattering_routines/geant4/collimasim/src/collimasim/bindings.cpp +0 -63
  300. xcoll/scattering_routines/geant4/collimasim/src/collimasim/pyCollimatorPass.py +0 -142
  301. xcoll/scattering_routines/geant4/collimasim/src/collimasim/xtrack_collimator.py +0 -556
  302. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/PKG-INFO +0 -6
  303. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/SOURCES.txt +0 -24
  304. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/dependency_links.txt +0 -1
  305. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/not-zip-safe +0 -1
  306. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/top_level.txt +0 -1
  307. xcoll/scattering_routines/geant4/collimasim/tests/README.md +0 -25
  308. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_forions.dat +0 -25
  309. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_new_example.dat +0 -18
  310. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_old_example.dat +0 -68
  311. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_testing.dat +0 -15
  312. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_yaml_example.yaml +0 -110
  313. xcoll/scattering_routines/geant4/collimasim/tests/resources/collgaps.dat +0 -7
  314. xcoll/scattering_routines/geant4/collimasim/tests/resources/collgaps_pyat_test.dat +0 -3
  315. xcoll/scattering_routines/geant4/collimasim/tests/resources/collonly_twiss_file_example.tfs +0 -54
  316. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings.gmad +0 -3
  317. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings_black_absorber.gmad +0 -3
  318. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings_ions.gmad +0 -5
  319. xcoll/scattering_routines/geant4/collimasim/tests/resources/twiss_file_testing.tfs +0 -51
  320. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat.py +0 -65
  321. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat_passmethod.py +0 -59
  322. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat_tracking.py +0 -102
  323. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack.py +0 -75
  324. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_angle.py +0 -74
  325. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_colldb_load.py +0 -84
  326. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_interaction.py +0 -159
  327. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_interaction_ion.py +0 -99
  328. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_ions.py +0 -78
  329. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_lost_energy.py +0 -88
  330. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tilt.py +0 -80
  331. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tracking.py +0 -97
  332. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tracking_ions.py +0 -96
  333. xcoll-0.5.12.dist-info/RECORD +0 -415
  334. {xcoll-0.5.12.dist-info → xcoll-0.6.1.dist-info}/LICENSE +0 -0
  335. {xcoll-0.5.12.dist-info → xcoll-0.6.1.dist-info}/NOTICE +0 -0
  336. {xcoll-0.5.12.dist-info → xcoll-0.6.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,256 @@
1
+ # copyright ############################### #
2
+ # This file is part of the Xcoll package. #
3
+ # Copyright (c) CERN, 2025. #
4
+ # ######################################### #
5
+
6
+ import numpy as np
7
+ from warnings import warn
8
+
9
+ import xtrack as xt
10
+ import xobjects as xo
11
+ import xpart as xp
12
+
13
+ <<<<<<< HEAD
14
+ from .beam_elements import collimator_classes, EverestCrystal, Geant4Collimator
15
+ =======
16
+ from .beam_elements import collimator_classes, BaseCrystal
17
+ >>>>>>> main
18
+
19
+
20
+ def generate_pencil_on_collimator(line, name, num_particles, *, side='+-', pencil_spread=1e-6,
21
+ impact_parameter=0, sigma_z=7.61e-2, twiss=None, longitudinal=None,
22
+ longitudinal_betatron_cut=None, _capacity=None, tw=None,
23
+ _longitudinal_coords=None, **kwargs):
24
+ """Generate a pencil beam on a collimator."""
25
+
26
+ # Do some general checks
27
+ if not line._has_valid_tracker():
28
+ raise ValueError("Please build tracker before generating pencil distribution!")
29
+ coll = line[name]
30
+ if not isinstance(coll, tuple(collimator_classes)):
31
+ raise ValueError("Need to provide a valid collimator!")
32
+ if coll.optics is None:
33
+ raise ValueError("Need to assign optics to collimators before generating pencil distribution!")
34
+ num_particles = int(num_particles)
35
+ if len(line.get_elements_of_type(Geant4Collimator)[0]) > 0:
36
+ kwargs.setdefault('_capacity', 2*num_particles)
37
+
38
+ # Define the plane
39
+ angle = coll.angle
40
+ if abs(np.mod(angle-90,180)-90) < 1e-6:
41
+ plane = 'x'
42
+ transv_plane = 'y'
43
+ elif abs(np.mod(angle,180)-90) < 1e-6:
44
+ plane = 'y'
45
+ transv_plane = 'x'
46
+ else:
47
+ raise NotImplementedError("Pencil beam on a skew collimator not yet supported!")
48
+
49
+ if coll.side == 'left':
50
+ if side == '-':
51
+ raise ValueError("Cannot generate a pencil on the right jaw of a left-"
52
+ "sided collimator!")
53
+ side = '+'
54
+ if coll.side == 'right':
55
+ if side == '+':
56
+ raise ValueError("Cannot generate a pencil on the left jaw of a right-"
57
+ "sided collimator!")
58
+ side = '-'
59
+
60
+ if tw is not None:
61
+ warn("The argument tw is deprecated. Please use twiss instead.", FutureWarning)
62
+ if twiss is None:
63
+ twiss = tw
64
+
65
+ if twiss is None:
66
+ twiss = line.twiss()
67
+
68
+ # Longitudinal plane
69
+ if _longitudinal_coords:
70
+ zeta = _longitudinal_coords[0]
71
+ delta = _longitudinal_coords[1]
72
+
73
+ else:
74
+ zeta, delta = _generate_longitudinal_dist(line, num_particles, sigma_z, longitudinal)
75
+
76
+ # Generate 4D coordinates
77
+ # TODO: there is some looping in the calculation here and in xpart. Can it be improved?
78
+ if side == '+-':
79
+ num_plus = int(num_particles/2)
80
+ num_min = int(num_particles - num_plus)
81
+ zeta_plus = zeta[:num_plus] if hasattr(zeta, '__iter__') else zeta
82
+ zeta_min = zeta[num_plus:] if hasattr(zeta, '__iter__') else zeta
83
+ delta_plus = delta[:num_plus] if hasattr(delta, '__iter__') else delta
84
+ delta_min = delta[num_plus:] if hasattr(delta, '__iter__') else delta
85
+ if _capacity:
86
+ _capacity_plus = int(_capacity/2)
87
+ _capacity_min = int(_capacity - _capacity_plus)
88
+ else:
89
+ _capacity_plus = None
90
+ _capacity_min = None
91
+ part_plus = generate_pencil_on_collimator(line=line, name=name, num_particles=num_plus,
92
+ impact_parameter=impact_parameter, _capacity=_capacity_plus,
93
+ side='+', pencil_spread=pencil_spread, twiss=twiss,
94
+ _longitudinal_coords=[zeta_plus, delta_plus],
95
+ **kwargs)
96
+ part_min = generate_pencil_on_collimator(line=line, name=name, num_particles=num_min,
97
+ impact_parameter=impact_parameter, _capacity=_capacity_min,
98
+ side='-', pencil_spread=pencil_spread, twiss=twiss,
99
+ _longitudinal_coords=[zeta_min, delta_min],
100
+ **kwargs)
101
+
102
+ part = xt.Particles.merge([part_plus, part_min])
103
+ part.start_tracking_at_element = part_plus.start_tracking_at_element
104
+ assert part.start_tracking_at_element == part_min.start_tracking_at_element
105
+ return part
106
+
107
+ pencil, p_pencil, transverse_norm, p_transverse_norm, is_converging, at_element = \
108
+ _generate_4D_pencil_one_jaw(line, name, num_particles, plane, side,
109
+ impact_parameter, pencil_spread, twiss, **kwargs)
110
+
111
+ # Build the particles
112
+ if plane == 'x':
113
+ part = xp.build_particles(
114
+ x=pencil, px=p_pencil, y_norm=transverse_norm, py_norm=p_transverse_norm,
115
+ zeta=zeta, delta=delta, nemitt_x=coll.nemitt_x, nemitt_y=coll.nemitt_y,
116
+ line=line, at_element=at_element, _context=coll._buffer.context, **kwargs
117
+ )
118
+ else:
119
+ part = xp.build_particles(
120
+ x_norm=transverse_norm, px_norm=p_transverse_norm, y=pencil, py=p_pencil,
121
+ zeta=zeta, delta=delta, nemitt_x=coll.nemitt_x, nemitt_y=coll.nemitt_y,
122
+ line=line, at_element=at_element, _context=coll._buffer.context, **kwargs
123
+ )
124
+
125
+ part._init_random_number_generator()
126
+
127
+ if not is_converging:
128
+ dri = xt.Drift(length=-coll.length)
129
+ dri.track(part)
130
+ part.start_tracking_at_element -= 1
131
+ part.at_element -= 1
132
+
133
+ return part
134
+
135
+
136
+ def generate_delta_from_dispersion(line, at_element, *, plane, position_mm, nemitt_x, nemitt_y,
137
+ twiss=None, betatron_cut=0, match_at_front=True):
138
+ if line.tracker is None:
139
+ raise ValueError("Need to build tracker first!")
140
+ if not hasattr(betatron_cut, '__iter__'):
141
+ if hasattr(position_mm, '__iter__'):
142
+ betatron_cut = np.full_like(position_mm, betatron_cut)
143
+ elif not hasattr(position_mm, '__iter__'):
144
+ position_mm = np.full_like(betatron_cut, position_mm)
145
+ elif len(position_mm) != len(betatron_cut):
146
+ raise ValueError
147
+ if plane not in ['x', 'y']:
148
+ raise ValueError("The variable 'plane' needs to be either 'x' or 'y'!")
149
+
150
+ if twiss is None:
151
+ twiss = line.twiss()
152
+
153
+ beam_sizes = twiss.get_beam_covariance(nemitt_x=nemitt_x, nemitt_y=nemitt_y)
154
+ beam_sizes = beam_sizes.rows[at_element:f'{at_element}>>1'][f'sigma_{plane}']
155
+ sigma = beam_sizes[0] if match_at_front else beam_sizes[1]
156
+ delta = (position_mm - betatron_cut*sigma - twiss.rows[at_element][plane])
157
+ delta /= twiss.rows[at_element][f'd{plane}']
158
+
159
+ return delta
160
+
161
+
162
+ def _generate_4D_pencil_one_jaw(line, name, num_particles, plane, side, impact_parameter,
163
+ pencil_spread, twiss=None, _capacity=None, **kwargs):
164
+ coll = line[name]
165
+ beam_sizes = twiss.get_beam_covariance(nemitt_x=coll.nemitt_x, nemitt_y=coll.nemitt_y)
166
+
167
+ # Is it converging or diverging?
168
+ # TODO: dispersion might change this
169
+ # TODO: skew collimators
170
+ tolerance_tilt = 1e-12 # 0.1 urad tolerance on jaw tilt => we prioritise converging
171
+ divergence = coll.divergence
172
+ if side == '+':
173
+ if isinstance(coll, BaseCrystal):
174
+ # A pencil on the crystal should always be upstream
175
+ is_converging = True
176
+ pencil_pos = coll.jaw_U + impact_parameter
177
+ else:
178
+ betatron_angle = coll.gap_L * divergence
179
+ is_converging = coll.tilt_L + tolerance_tilt >= betatron_angle
180
+ print(f"Left jaw of collimator {name} is {'con' if is_converging else 'di'}verging.")
181
+ if is_converging:
182
+ pencil_pos = coll.jaw_LU + impact_parameter
183
+ else:
184
+ pencil_pos = coll.jaw_LD + impact_parameter
185
+ elif side == '-':
186
+ if isinstance(coll, BaseCrystal):
187
+ # A pencil on the crystal should always be upstream
188
+ is_converging = True
189
+ pencil_pos = coll.jaw_U - impact_parameter
190
+ else:
191
+ betatron_angle = coll.gap_R * divergence
192
+ is_converging = coll.tilt_R - tolerance_tilt <= betatron_angle
193
+ print(f"Right jaw of collimator {name} is {'con' if is_converging else 'di'}verging.")
194
+ if is_converging:
195
+ pencil_pos = coll.jaw_RU - impact_parameter
196
+ else:
197
+ pencil_pos = coll.jaw_RD - impact_parameter
198
+ else:
199
+ raise ValueError(f"Sinde {side} not supported in _generate_4D_pencil_one_jaw!")
200
+
201
+ if is_converging:
202
+ # pencil at front of jaw
203
+ sigma = beam_sizes.rows[name:f'{name}>>1'][f'sigma_{plane}'][0]
204
+ tw_at_s = twiss.rows[name]
205
+ at_element = name
206
+ else:
207
+ # pencil at back of jaw
208
+ sigma = beam_sizes.rows[name:f'{name}>>1'][f'sigma_{plane}'][1]
209
+ tw_at_s = twiss.rows[f'{name}>>1']
210
+ at_element = line.element_names[line.element_names.index(name)+1]
211
+
212
+ dr_sigmas = pencil_spread/sigma
213
+
214
+ # Collimator plane: generate pencil distribution
215
+ pencil, p_pencil = xp.generate_2D_pencil_with_absolute_cut(
216
+ num_particles, plane=plane, absolute_cut=pencil_pos, line=line,
217
+ dr_sigmas=dr_sigmas, nemitt_x=coll.nemitt_x, nemitt_y=coll.nemitt_y,
218
+ at_element=at_element, side=side, twiss=tw_at_s, **kwargs
219
+ )
220
+
221
+ # Other plane: generate gaussian distribution in normalized coordinates
222
+ transverse_norm = np.random.normal(size=num_particles)
223
+ p_transverse_norm = np.random.normal(size=num_particles)
224
+
225
+ return pencil, p_pencil, transverse_norm, p_transverse_norm, is_converging, at_element
226
+
227
+
228
+ def _generate_longitudinal_dist(line, num_particles, sigma_z, longitudinal):
229
+ # TODO: make this more general, make this better
230
+ if longitudinal is None:
231
+ return 0, 0
232
+ elif longitudinal == 'matched_dispersion':
233
+ raise NotImplementedError
234
+ # if longitudinal_betatron_cut is None:
235
+ # cut = 0
236
+ # else:
237
+ # cut = np.random.uniform(-longitudinal_betatron_cut, longitudinal_betatron_cut,
238
+ # num_particles)
239
+ # delta = generate_delta_from_dispersion(line, name, plane=plane, position_mm=pencil,
240
+ # nemitt_x=nemitt_x, nemitt_y=nemitt_y, twiss=tw,
241
+ # betatron_cut=cut, match_at_front=is_converging)
242
+ # zeta = 0
243
+ elif longitudinal == 'bucket':
244
+ return xp.generate_longitudinal_coordinates(
245
+ num_particles=num_particles, distribution='gaussian', sigma_z=sigma_z, line=line
246
+ )
247
+ elif not hasattr(longitudinal, '__iter__'):
248
+ raise ValueError
249
+ elif len(longitudinal) != 2:
250
+ raise ValueError
251
+ elif isinstance(longitudinal, str):
252
+ raise ValueError
253
+ elif isinstance(longitudinal, dict):
254
+ return longitudinal['zeta'], longitudinal['delta']
255
+ else:
256
+ return longitudinal[0], longitudinal[1]
@@ -8,6 +8,7 @@ import xtrack as xt
8
8
 
9
9
  from .interaction_types import source, interactions, shortcuts, is_point
10
10
  from ..general import _pkg_root
11
+ from ..headers.particle_states import particle_states_src
11
12
 
12
13
  import numpy as np
13
14
  import pandas as pd
@@ -53,7 +54,7 @@ class InteractionRecord(xt.BeamElement):
53
54
 
54
55
  _extra_c_sources = [
55
56
  source,
56
- _pkg_root.joinpath('headers','particle_states.h'),
57
+ particle_states_src,
57
58
  _pkg_root.joinpath('interaction_record','interaction_record_src','interaction_record.h')
58
59
  ]
59
60
 
@@ -20,8 +20,8 @@ source = r'''
20
20
  #define XC_PP_ELASTIC 15 // PP // point (no children)
21
21
  #define XC_SINGLE_DIFFRACTIVE 16 // SD // point (no children)
22
22
  #define XC_COULOMB 17 // C // point (no children)
23
- #define XC_CHANNELING 100 // CH // continuous
24
- #define XC_DECHANNELING 101 // DCH // point (no children)
23
+ #define XC_CHANNELLING 100 // CH // continuous
24
+ #define XC_DECHANNELLING 101 // DCH // point (no children)
25
25
  #define XC_VOLUME_REFLECTION_TRANS_CH 102 // VRCH // point (no children) Transition region around +-xpcrit
26
26
  #define XC_VOLUME_REFLECTION 103 // VR // point (no children)
27
27
  #define XC_VOLUME_REFLECTION_TRANS_MCS 104 // VRAM // point (no children) Transition region around t_P
xcoll/line_tools.py CHANGED
@@ -11,22 +11,108 @@ import xtrack as xt
11
11
  from .beam_elements import element_classes, collimator_classes, block_classes
12
12
 
13
13
 
14
- class XcollScatteringAPI:
15
- def __init__(self, line):
16
- self._line = line
14
+ class XcollLineAccessor:
15
+ _typename = 'element'
16
+
17
+ def __init__(self, line, names=None):
18
+ super().__setattr__('_line', line)
19
+ if names:
20
+ super().__setattr__('names', names)
21
+ # self.names = names
17
22
 
18
23
  @property
19
24
  def line(self):
20
25
  return self._line
21
26
 
27
+ @property
28
+ def _coll_dict(self):
29
+ return {name: self.line.get(name) for name in self.names}
30
+
31
+ def keys(self):
32
+ return self._coll_dict.keys()
33
+
34
+ def values(self):
35
+ return self._coll_dict.values()
36
+
37
+ def items(self):
38
+ return self._coll_dict.items()
39
+
40
+ def __iter__(self):
41
+ super().__setattr__('_iter_names', iter(self.names))
42
+ return self
43
+
44
+ def __next__(self):
45
+ try:
46
+ name = next(self._iter_names)
47
+ except StopIteration:
48
+ raise StopIteration
49
+ else:
50
+ return self.line[name]
51
+
52
+ def __len__(self):
53
+ return len(self.names)
54
+
55
+ def __contains__(self, key):
56
+ return key in self.names
57
+
58
+ def __getattr__(self, attr):
59
+ properties = {}
60
+ for name, el in self.items():
61
+ if hasattr(el, attr):
62
+ properties[name] = getattr(el, attr)
63
+ if len(properties) == 0:
64
+ raise AttributeError(f"Attribute `{attr}` not found.")
65
+ if len({tuple(ii) if isinstance(ii, list) else ii for ii in properties.values()}) == 1:
66
+ # If all values are the same, return a single value
67
+ return next(iter(properties.values()))
68
+ return properties
69
+
70
+ def __setattr__(self, attr, value):
71
+ if isinstance(value, dict):
72
+ for name, el in self.items():
73
+ if name in value:
74
+ if not hasattr(el, attr):
75
+ raise AttributeError(f"Attribute `{attr}` not found in "
76
+ + f"{self._typename} `{name}`.")
77
+ setattr(el, attr, value[name])
78
+ else:
79
+ # If value is not a dict, we assume it is a single value to set for all collimators
80
+ for name, el in self.items():
81
+ if hasattr(el, attr):
82
+ setattr(el, attr, value)
83
+
84
+ def __getitem__(self, name):
85
+ if name in self.names:
86
+ return self.line[name]
87
+ else:
88
+ raise ValueError(f"{self._typename.capitalize()} `{name}` not found in line!")
89
+
90
+ def __repr__(self):
91
+ return f"<{self.__class__.__name__} at {hex(id(self))}>"
92
+
93
+ def __str__(self):
94
+ if len(self.names) == 0:
95
+ return ''
96
+ res = [f'{self._typename.capitalize()}s:']
97
+ for name in self.names:
98
+ res.append(f" {name:<16} ({self.line[name].__class__.__name__})")
99
+ return "\n".join(res)
100
+
101
+
102
+ class XcollScatteringAPI(XcollLineAccessor):
103
+
104
+ @property
105
+ def names(self):
106
+ # This makes sure the accessor can access the names of the collimators dynamically
107
+ return self.line.get_elements_of_type(element_classes)[1]
108
+
22
109
  def enable(self):
23
- elements = self.line.get_elements_of_type(element_classes)[0]
24
- if len(elements) == 0:
110
+ if len(self) == 0:
25
111
  print("No xcoll elements found in line.")
26
112
  else:
27
113
  nemitt_x = None
28
114
  nemitt_y = None
29
- for el in elements:
115
+ for el in self:
30
116
  if hasattr(el, 'optics') and el.optics is not None:
31
117
  if nemitt_x is None:
32
118
  nemitt_x = el.nemitt_x
@@ -40,22 +126,78 @@ class XcollScatteringAPI:
40
126
  el.enable_scattering()
41
127
 
42
128
  def disable(self):
43
- elements = self.line.get_elements_of_type(element_classes)[0]
44
- if len(elements) == 0:
129
+ if len(self) == 0:
45
130
  print("No xcoll elements found in line.")
46
131
  else:
47
- for el in elements:
132
+ for el in self:
48
133
  if hasattr(el, 'disable_scattering'):
49
134
  el.disable_scattering()
50
135
 
51
136
 
52
- class XcollCollimatorAPI:
53
- def __init__(self, line):
54
- self._line = line
137
+ class XcollCollimatorAPI(XcollLineAccessor):
138
+ _typename = 'collimator'
139
+
140
+ def __str__(self):
141
+ res = []
142
+ if len(self.families) > 0:
143
+ res.append('Families:')
144
+ for family, names in self.families.items():
145
+ res.append(f" {family:8}: {', '.join(names)}")
146
+ res.append('')
147
+ res.append(super().__str__())
148
+ return "\n".join(res)
55
149
 
56
150
  @property
57
- def line(self):
58
- return self._line
151
+ def names(self):
152
+ # This makes sure the accessor can access the names of the collimators dynamically
153
+ return self.line.get_elements_of_type(collimator_classes)[1]
154
+
155
+ @property
156
+ def families(self):
157
+ families = {}
158
+ try:
159
+ prop_families = self.family
160
+ except AttributeError:
161
+ return families
162
+ else:
163
+ for name in self.names:
164
+ if name in prop_families:
165
+ if prop_families[name] not in families:
166
+ families[prop_families[name]] = []
167
+ families[prop_families[name]].append(name)
168
+ else:
169
+ if 'no family' not in families:
170
+ families['no family'] = []
171
+ families['no family'].append(name)
172
+ return families
173
+
174
+ def __getitem__(self, name):
175
+ # We can getitem by name or family, so we overwrite the super method
176
+ if name in self.families:
177
+ return XcollLineAccessor(line=self.line, names=self.families[name])
178
+ elif name in self.names:
179
+ return self.line[name]
180
+ else:
181
+ raise ValueError(f"Neither family nor collimator `{name}` found in line!")
182
+
183
+
184
+ def open(self, names=None):
185
+ if names is None:
186
+ names = self.names
187
+ if len(names) == 0:
188
+ print("No collimators found in line.")
189
+ else:
190
+ for coll in names:
191
+ self.line[coll].open_jaws(keep_tilts=False)
192
+ self.line[coll].gap = None
193
+
194
+ def to_parking(self, names=None):
195
+ if names is None:
196
+ names = self.names
197
+ if len(names) == 0:
198
+ print("No collimators found in line.")
199
+ else:
200
+ raise NotImplementedError("Need to move this to new type manager or so.")
59
201
 
60
202
  def install(self, names, elements, *, at_s=None, apertures=None, need_apertures=False, s_tol=1.e-6):
61
203
  if self.line._has_valid_tracker():
@@ -77,9 +219,11 @@ class XcollCollimatorAPI:
77
219
  assert len(apertures) == len(names)
78
220
 
79
221
  # Verify elements
80
- for el in elements:
222
+ for name, el in zip(names, elements):
81
223
  assert isinstance(el, block_classes)
82
224
  el._tracking = False
225
+ if el.name is None:
226
+ el.name = name
83
227
 
84
228
  # Get positions
85
229
  tab = self.line.get_table()
@@ -238,30 +382,11 @@ class XcollCollimatorAPI:
238
382
  twiss = tw
239
383
  if not self.line._has_valid_tracker():
240
384
  raise Exception("Please build tracker before setting the openings!")
241
- names = self.line.get_elements_of_type(collimator_classes)[1]
242
- tw_upstream, tw_downstream = self.get_optics_at(names, twiss=twiss)
385
+ tw_upstream, tw_downstream = self.get_optics_at(self.names, twiss=twiss)
243
386
  beta_gamma_rel = self.line.particle_ref._xobject.gamma0[0]*self.line.particle_ref._xobject.beta0[0]
244
- for coll in names:
245
- self.line[coll].assign_optics(name=coll, nemitt_x=nemitt_x, nemitt_y=nemitt_y, twiss_upstream=tw_upstream,
246
- twiss_downstream=tw_downstream, beta_gamma_rel=beta_gamma_rel)
247
-
248
- def open(self, names=None):
249
- if names is None:
250
- names = self.line.get_elements_of_type(collimator_classes)[1]
251
- if len(names) == 0:
252
- print("No collimators found in line.")
253
- else:
254
- for coll in names:
255
- self.line[coll].open_jaws(keep_tilts=False)
256
- self.line[coll].gap = None
257
-
258
- def to_parking(self, names=None):
259
- if names is None:
260
- names = self.line.get_elements_of_type(collimator_classes)[1]
261
- if len(names) == 0:
262
- print("No collimators found in line.")
263
- else:
264
- raise NotImplementedError("Need to move this to new type manager or so.")
387
+ for name, coll in self.items():
388
+ coll.assign_optics(name=name, nemitt_x=nemitt_x, nemitt_y=nemitt_y, twiss_upstream=tw_upstream,
389
+ twiss_downstream=tw_downstream, beta_gamma_rel=beta_gamma_rel)
265
390
 
266
391
  def _get_s_start(self, name, *, length, table=None):
267
392
  if table is None:
@@ -273,38 +398,3 @@ class XcollCollimatorAPI:
273
398
  if name not in table.name:
274
399
  raise ValueError(f"Element {name} not found in line. Need to manually provide `at_s`.")
275
400
  return table.rows[name].s[0] + existing_length/2. - length/2
276
-
277
-
278
-
279
- # Deprecated; to be removed
280
- # -------------------------
281
-
282
- def assign_optics_to_collimators(line, nemitt_x=None, nemitt_y=None, twiss=None):
283
- warn("The function xcoll.assign_optics_to_collimators() is deprecated and will be "
284
- + "removed in the future. Please use line.collimators.assign_optics() instead.", FutureWarning)
285
- line.collimators.assign_optics(nemitt_x=nemitt_x, nemitt_y=nemitt_y, twiss=twiss)
286
-
287
- def get_optics_at(names, *, twiss=None, line=None):
288
- warn("The function xcoll.get_optics_at() is deprecated and will be "
289
- + "removed in the future. Please use line.collimators.get_optics_at() instead.", FutureWarning)
290
- return line.collimators.get_optics_at(names=names, twiss=twiss)
291
-
292
- def open_collimators(line, names=None):
293
- warn("The function xcoll.open_collimators() is deprecated and will be "
294
- + "removed in the future. Please use line.collimators.open_collimators() instead.", FutureWarning)
295
- line.collimators.open(names=names)
296
-
297
- def send_to_parking(line, names=None):
298
- warn("The function xcoll.send_to_parking() is deprecated and will be "
299
- + "removed in the future. Please use line.collimators.send_to_parking() instead.", FutureWarning)
300
- line.collimators.to_parking(names=names)
301
-
302
- def enable_scattering(line):
303
- warn("The function xcoll.enable_scattering() is deprecated and will be "
304
- + "removed in the future. Please use line.scattering.enable() instead.", FutureWarning)
305
- line.scattering.enable()
306
-
307
- def disable_scattering(line):
308
- warn("The function xcoll.disable_scattering() is deprecated and will be "
309
- + "removed in the future. Please use line.scattering.disable() instead.", FutureWarning)
310
- line.scattering.disable()