xcoll 0.4.0__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 (324) hide show
  1. xcoll/__init__.py +2 -1
  2. xcoll/beam_elements/__init__.py +7 -1
  3. xcoll/beam_elements/absorber.py +2 -2
  4. xcoll/beam_elements/base.py +105 -67
  5. xcoll/beam_elements/blowup.py +198 -0
  6. xcoll/beam_elements/{collimators_src → elements_src}/black_absorber.h +21 -3
  7. xcoll/beam_elements/{collimators_src → elements_src}/black_crystal.h +20 -2
  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 +19 -2
  11. xcoll/beam_elements/{collimators_src → elements_src}/everest_collimator.h +19 -3
  12. xcoll/beam_elements/{collimators_src → elements_src}/everest_crystal.h +30 -9
  13. xcoll/beam_elements/everest.py +5 -6
  14. xcoll/beam_elements/monitor.py +428 -0
  15. xcoll/colldb.py +103 -74
  16. xcoll/general.py +4 -4
  17. xcoll/initial_distribution.py +18 -6
  18. xcoll/install.py +3 -1
  19. xcoll/interaction_record/interaction_record.py +126 -80
  20. xcoll/interaction_record/interaction_record_src/interaction_record.h +43 -43
  21. xcoll/line_tools.py +8 -9
  22. xcoll/lossmap.py +48 -38
  23. xcoll/scattering_routines/everest/amorphous.h +4 -11
  24. xcoll/scattering_routines/everest/channeling.h +3 -8
  25. xcoll/scattering_routines/everest/everest.h +4 -1
  26. xcoll/scattering_routines/everest/jaw.h +4 -3
  27. xcoll/scattering_routines/everest/materials.py +35 -15
  28. xcoll/scattering_routines/everest/multiple_coulomb_scattering.h +2 -2
  29. xcoll/scattering_routines/everest/nuclear_interaction.h +1 -1
  30. xcoll/scattering_routines/everest/properties.h +6 -1
  31. xcoll/scattering_routines/fluka/flukaio/lib/libFlukaIO64.a +0 -0
  32. xcoll/scattering_routines/geant4/collimasim/.git +1 -0
  33. xcoll/scattering_routines/geant4/collimasim/.gitignore +12 -0
  34. xcoll/scattering_routines/geant4/collimasim/.gitmodules +3 -0
  35. xcoll/scattering_routines/geant4/collimasim/CMakeLists.txt +26 -0
  36. xcoll/scattering_routines/geant4/collimasim/README.md +21 -0
  37. xcoll/scattering_routines/geant4/collimasim/docs/Makefile +20 -0
  38. xcoll/scattering_routines/geant4/collimasim/docs/make.bat +35 -0
  39. xcoll/scattering_routines/geant4/collimasim/docs/source/collimasim.rst +10 -0
  40. xcoll/scattering_routines/geant4/collimasim/docs/source/conf.py +59 -0
  41. xcoll/scattering_routines/geant4/collimasim/docs/source/index.rst +26 -0
  42. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.appveyor.yml +37 -0
  43. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.clang-format +19 -0
  44. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.clang-tidy +65 -0
  45. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.cmake-format.yaml +73 -0
  46. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.git +1 -0
  47. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/CODEOWNERS +9 -0
  48. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/CONTRIBUTING.md +386 -0
  49. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/ISSUE_TEMPLATE/bug-report.yml +45 -0
  50. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/ISSUE_TEMPLATE/config.yml +8 -0
  51. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/dependabot.yml +16 -0
  52. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/labeler.yml +8 -0
  53. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/labeler_merged.yml +3 -0
  54. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/pull_request_template.md +19 -0
  55. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/ci.yml +969 -0
  56. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/configure.yml +84 -0
  57. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/format.yml +48 -0
  58. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/labeler.yml +16 -0
  59. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/pip.yml +103 -0
  60. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.gitignore +45 -0
  61. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.pre-commit-config.yaml +151 -0
  62. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.readthedocs.yml +3 -0
  63. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/CMakeLists.txt +297 -0
  64. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/LICENSE +29 -0
  65. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/MANIFEST.in +6 -0
  66. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/README.rst +180 -0
  67. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/Doxyfile +23 -0
  68. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/Makefile +192 -0
  69. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/_static/theme_overrides.css +11 -0
  70. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/chrono.rst +81 -0
  71. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/custom.rst +93 -0
  72. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/eigen.rst +310 -0
  73. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/functional.rst +109 -0
  74. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/index.rst +43 -0
  75. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/overview.rst +171 -0
  76. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/stl.rst +251 -0
  77. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/strings.rst +305 -0
  78. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/classes.rst +1297 -0
  79. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/embedding.rst +262 -0
  80. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/exceptions.rst +396 -0
  81. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/functions.rst +568 -0
  82. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/misc.rst +337 -0
  83. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/index.rst +13 -0
  84. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/numpy.rst +463 -0
  85. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/object.rst +286 -0
  86. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/utilities.rst +155 -0
  87. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/smart_ptrs.rst +174 -0
  88. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/basics.rst +308 -0
  89. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/benchmark.py +91 -0
  90. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/benchmark.rst +95 -0
  91. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/changelog.rst +2050 -0
  92. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/classes.rst +542 -0
  93. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/cmake/index.rst +8 -0
  94. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/compiling.rst +648 -0
  95. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/conf.py +381 -0
  96. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/faq.rst +343 -0
  97. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/index.rst +48 -0
  98. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/installing.rst +105 -0
  99. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/limitations.rst +72 -0
  100. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11-logo.png +0 -0
  101. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python1.png +0 -0
  102. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python1.svg +427 -0
  103. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python2.png +0 -0
  104. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python2.svg +427 -0
  105. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/reference.rst +130 -0
  106. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/release.rst +96 -0
  107. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/requirements.txt +8 -0
  108. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/upgrade.rst +548 -0
  109. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/attr.h +605 -0
  110. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/buffer_info.h +144 -0
  111. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/cast.h +1432 -0
  112. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/chrono.h +213 -0
  113. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/common.h +2 -0
  114. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/complex.h +65 -0
  115. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/class.h +709 -0
  116. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/common.h +1021 -0
  117. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/descr.h +104 -0
  118. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/init.h +346 -0
  119. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/internals.h +467 -0
  120. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/type_caster_base.h +978 -0
  121. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/typeid.h +55 -0
  122. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/eigen.h +606 -0
  123. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/embed.h +284 -0
  124. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/eval.h +163 -0
  125. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/functional.h +121 -0
  126. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/gil.h +193 -0
  127. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/iostream.h +275 -0
  128. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/numpy.h +1741 -0
  129. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/operators.h +163 -0
  130. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/options.h +65 -0
  131. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/pybind11.h +2497 -0
  132. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/pytypes.h +1879 -0
  133. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl/filesystem.h +103 -0
  134. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl.h +375 -0
  135. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl_bind.h +747 -0
  136. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/noxfile.py +88 -0
  137. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/__init__.py +11 -0
  138. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/__main__.py +52 -0
  139. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/_version.py +12 -0
  140. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/_version.pyi +6 -0
  141. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/commands.py +21 -0
  142. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/py.typed +0 -0
  143. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/setup_helpers.py +482 -0
  144. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/setup_helpers.pyi +63 -0
  145. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pyproject.toml +41 -0
  146. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/setup.cfg +56 -0
  147. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/setup.py +155 -0
  148. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/CMakeLists.txt +503 -0
  149. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/conftest.py +208 -0
  150. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/constructor_stats.h +275 -0
  151. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/cross_module_gil_utils.cpp +73 -0
  152. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/env.py +33 -0
  153. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_python_package/pytest.ini +0 -0
  154. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_python_package/test_files.py +279 -0
  155. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_setuptools/pytest.ini +0 -0
  156. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_setuptools/test_setuphelper.py +143 -0
  157. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/local_bindings.h +85 -0
  158. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/object.h +179 -0
  159. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_cross_module_tests.cpp +151 -0
  160. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_tests.cpp +91 -0
  161. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_tests.h +85 -0
  162. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pytest.ini +19 -0
  163. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/requirements.txt +12 -0
  164. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_async.cpp +26 -0
  165. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_async.py +25 -0
  166. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_buffers.cpp +216 -0
  167. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_buffers.py +163 -0
  168. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_builtin_casters.cpp +286 -0
  169. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_builtin_casters.py +536 -0
  170. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_call_policies.cpp +107 -0
  171. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_call_policies.py +248 -0
  172. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_callbacks.cpp +227 -0
  173. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_callbacks.py +202 -0
  174. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_chrono.cpp +84 -0
  175. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_chrono.py +210 -0
  176. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_class.cpp +550 -0
  177. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_class.py +473 -0
  178. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/CMakeLists.txt +84 -0
  179. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/embed.cpp +21 -0
  180. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_embed/CMakeLists.txt +28 -0
  181. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_function/CMakeLists.txt +39 -0
  182. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_target/CMakeLists.txt +46 -0
  183. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/main.cpp +6 -0
  184. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_embed/CMakeLists.txt +41 -0
  185. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_function/CMakeLists.txt +35 -0
  186. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_target/CMakeLists.txt +41 -0
  187. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/test.py +10 -0
  188. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_constants_and_functions.cpp +165 -0
  189. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_constants_and_functions.py +53 -0
  190. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_copy_move.cpp +238 -0
  191. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_copy_move.py +126 -0
  192. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_casters.cpp +141 -0
  193. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_casters.py +117 -0
  194. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_setup.cpp +41 -0
  195. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_setup.py +50 -0
  196. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_docstring_options.cpp +69 -0
  197. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_docstring_options.py +42 -0
  198. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eigen.cpp +348 -0
  199. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eigen.py +771 -0
  200. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/CMakeLists.txt +47 -0
  201. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/catch.cpp +22 -0
  202. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/external_module.cpp +23 -0
  203. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/test_interpreter.cpp +326 -0
  204. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/test_interpreter.py +15 -0
  205. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_enum.cpp +148 -0
  206. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_enum.py +272 -0
  207. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval.cpp +119 -0
  208. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval.py +51 -0
  209. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval_call.py +5 -0
  210. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.cpp +285 -0
  211. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.h +12 -0
  212. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.py +265 -0
  213. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_factory_constructors.cpp +397 -0
  214. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_factory_constructors.py +520 -0
  215. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_gil_scoped.cpp +49 -0
  216. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_gil_scoped.py +94 -0
  217. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_iostream.cpp +125 -0
  218. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_iostream.py +331 -0
  219. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_kwargs_and_defaults.cpp +153 -0
  220. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_kwargs_and_defaults.py +284 -0
  221. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_local_bindings.cpp +107 -0
  222. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_local_bindings.py +257 -0
  223. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_methods_and_attributes.cpp +412 -0
  224. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_methods_and_attributes.py +517 -0
  225. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_modules.cpp +102 -0
  226. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_modules.py +92 -0
  227. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_multiple_inheritance.cpp +233 -0
  228. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_multiple_inheritance.py +360 -0
  229. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_array.cpp +472 -0
  230. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_array.py +593 -0
  231. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_dtypes.cpp +524 -0
  232. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_dtypes.py +441 -0
  233. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_vectorize.cpp +103 -0
  234. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_vectorize.py +267 -0
  235. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_opaque_types.cpp +73 -0
  236. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_opaque_types.py +59 -0
  237. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_operator_overloading.cpp +235 -0
  238. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_operator_overloading.py +146 -0
  239. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pickling.cpp +189 -0
  240. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pickling.py +82 -0
  241. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pytypes.cpp +560 -0
  242. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pytypes.py +651 -0
  243. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_sequences_and_iterators.cpp +500 -0
  244. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_sequences_and_iterators.py +253 -0
  245. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_smart_ptr.cpp +452 -0
  246. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_smart_ptr.py +318 -0
  247. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl.cpp +342 -0
  248. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl.py +291 -0
  249. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl_binders.cpp +131 -0
  250. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl_binders.py +318 -0
  251. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_tagbased_polymorphic.cpp +144 -0
  252. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_tagbased_polymorphic.py +29 -0
  253. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_thread.cpp +66 -0
  254. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_thread.py +44 -0
  255. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_union.cpp +22 -0
  256. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_union.py +9 -0
  257. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_virtual_functions.cpp +510 -0
  258. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_virtual_functions.py +408 -0
  259. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/valgrind-numpy-scipy.supp +140 -0
  260. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/valgrind-python.supp +117 -0
  261. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindCatch.cmake +70 -0
  262. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindEigen3.cmake +86 -0
  263. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindPythonLibsNew.cmake +257 -0
  264. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/check-style.sh +44 -0
  265. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/cmake_uninstall.cmake.in +23 -0
  266. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/libsize.py +39 -0
  267. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/make_changelog.py +64 -0
  268. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Common.cmake +402 -0
  269. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Config.cmake.in +233 -0
  270. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11NewTools.cmake +276 -0
  271. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Tools.cmake +214 -0
  272. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pyproject.toml +3 -0
  273. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/setup_global.py.in +65 -0
  274. xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/setup_main.py.in +41 -0
  275. xcoll/scattering_routines/geant4/collimasim/pyproject.toml +8 -0
  276. xcoll/scattering_routines/geant4/collimasim/setup.py +144 -0
  277. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSPyATInterface.cpp +403 -0
  278. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSPyATInterface.hh +100 -0
  279. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSXtrackInterface.cpp +763 -0
  280. xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSXtrackInterface.hh +118 -0
  281. xcoll/scattering_routines/geant4/collimasim/src/collimasim/__init__.py +8 -0
  282. xcoll/scattering_routines/geant4/collimasim/src/collimasim/bindings.cpp +63 -0
  283. xcoll/scattering_routines/geant4/collimasim/src/collimasim/pyCollimatorPass.py +142 -0
  284. xcoll/scattering_routines/geant4/collimasim/src/collimasim/xtrack_collimator.py +556 -0
  285. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/PKG-INFO +6 -0
  286. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/SOURCES.txt +24 -0
  287. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/dependency_links.txt +1 -0
  288. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/not-zip-safe +1 -0
  289. xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/top_level.txt +1 -0
  290. xcoll/scattering_routines/geant4/collimasim/tests/README.md +25 -0
  291. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_forions.dat +25 -0
  292. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_new_example.dat +18 -0
  293. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_old_example.dat +68 -0
  294. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_testing.dat +15 -0
  295. xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_yaml_example.yaml +110 -0
  296. xcoll/scattering_routines/geant4/collimasim/tests/resources/collgaps.dat +7 -0
  297. xcoll/scattering_routines/geant4/collimasim/tests/resources/collgaps_pyat_test.dat +3 -0
  298. xcoll/scattering_routines/geant4/collimasim/tests/resources/collonly_twiss_file_example.tfs +54 -0
  299. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings.gmad +3 -0
  300. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings_black_absorber.gmad +3 -0
  301. xcoll/scattering_routines/geant4/collimasim/tests/resources/settings_ions.gmad +5 -0
  302. xcoll/scattering_routines/geant4/collimasim/tests/resources/twiss_file_testing.tfs +51 -0
  303. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat.py +65 -0
  304. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat_passmethod.py +59 -0
  305. xcoll/scattering_routines/geant4/collimasim/tests/test_pyat_tracking.py +102 -0
  306. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack.py +75 -0
  307. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_angle.py +74 -0
  308. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_colldb_load.py +84 -0
  309. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_interaction.py +159 -0
  310. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_interaction_ion.py +99 -0
  311. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_ions.py +78 -0
  312. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_lost_energy.py +88 -0
  313. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tilt.py +80 -0
  314. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tracking.py +97 -0
  315. xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tracking_ions.py +96 -0
  316. xcoll/scattering_routines/geometry/collimator_geometry.h +9 -10
  317. xcoll/scattering_routines/geometry/crystal_geometry.h +9 -6
  318. {xcoll-0.4.0.dist-info → xcoll-0.5.0.dist-info}/METADATA +1 -1
  319. xcoll-0.5.0.dist-info/RECORD +413 -0
  320. xcoll/scattering_routines/fluka/build_fluka_input.py +0 -58
  321. xcoll-0.4.0.dist-info/RECORD +0 -126
  322. {xcoll-0.4.0.dist-info → xcoll-0.5.0.dist-info}/LICENSE +0 -0
  323. {xcoll-0.4.0.dist-info → xcoll-0.5.0.dist-info}/NOTICE +0 -0
  324. {xcoll-0.4.0.dist-info → xcoll-0.5.0.dist-info}/WHEEL +0 -0
xcoll/colldb.py CHANGED
@@ -4,13 +4,16 @@
4
4
  # ######################################### #
5
5
 
6
6
  import io
7
+ import re
7
8
  import json
8
9
  import numpy as np
9
10
  import pandas as pd
11
+ from pathlib import Path
10
12
 
11
13
  import xtrack as xt
12
14
 
13
- from .beam_elements import BlackAbsorber, EverestCollimator, EverestCrystal, collimator_classes, element_classes
15
+ from .beam_elements import BlackAbsorber, BlackCrystal, EverestCollimator, EverestCrystal, \
16
+ BaseCollimator, BaseCrystal, _all_collimator_classes
14
17
  from .install import install_elements
15
18
  from .scattering_routines.everest.materials import SixTrack_to_xcoll
16
19
 
@@ -19,7 +22,7 @@ def _initialise_None(dct):
19
22
  fields = {'gap': None, 'angle': 0, 'offset': 0, 'parking': 1, 'jaw': None, 'family': None}
20
23
  fields.update({'overwritten_keys': [], 'side': 'both', 'material': None, 'stage': None})
21
24
  fields.update({'length': 0, 'collimator_type': None, 'active': True, 'crystal': None, 'tilt': 0})
22
- fields.update({'bending_radius': 0, 'bending_angle': 0, 'width': 0, 'height': 0, 'miscut': 0})
25
+ fields.update({'bending_radius': None, 'bending_angle': None, 'width': 0, 'height': 0, 'miscut': 0})
23
26
  for f, val in fields.items():
24
27
  if f not in dct.keys():
25
28
  dct[f] = val
@@ -76,7 +79,7 @@ class CollimatorDatabase:
76
79
  kwargs.get('ignore_crystals', True))
77
80
  self.nemitt_x = kwargs['nemitt_x']
78
81
  self.nemitt_y = kwargs['nemitt_y']
79
- self.line = None
82
+ self._elements = {}
80
83
 
81
84
 
82
85
  def _parse_dict(self, coll, fam, beam=None, _yaml_merged=False, ignore_crystals=True):
@@ -147,7 +150,6 @@ class CollimatorDatabase:
147
150
 
148
151
  @classmethod
149
152
  def from_yaml(cls, file, **kwargs):
150
-
151
153
  # Only do the import here, as to not force people to install
152
154
  # ruamel if they don't load CollimatorDatabase yaml's
153
155
  from ruamel.yaml import YAML
@@ -155,7 +157,8 @@ class CollimatorDatabase:
155
157
  if isinstance(file, io.IOBase):
156
158
  dct = yaml.load(file)
157
159
  else:
158
- with open(file, 'r') as fid:
160
+ file = Path(file).resolve()
161
+ with file.open('r') as fid:
159
162
  dct = yaml.load(fid)
160
163
  dct = _dict_keys_to_lower(dct)
161
164
 
@@ -214,7 +217,8 @@ class CollimatorDatabase:
214
217
  if isinstance(file, io.IOBase):
215
218
  dct = json.load(file)
216
219
  else:
217
- with open(file, 'r') as fid:
220
+ file = Path(file).resolve()
221
+ with file.open('r') as fid:
218
222
  dct = json.load(fid)
219
223
  dct = _dict_keys_to_lower(dct)
220
224
  return cls.from_dict(dct, **kwargs)
@@ -259,17 +263,16 @@ class CollimatorDatabase:
259
263
 
260
264
  @classmethod
261
265
  def from_SixTrack(cls, file, ignore_crystals=True, **kwargs):
262
- # only import regex here
263
- import re
264
- with open(file, 'r') as infile:
266
+ file = Path(file).resolve()
267
+ with file.open('r') as fp:
265
268
  coll_data_string = ''
266
269
  family_settings = {}
267
270
  family_types = {}
268
271
  side = {}
269
- cry_fields = ['bending_radius', 'width', 'height', 'thick', 'miscut', 'crystal']
272
+ cry_fields = ['bending_radius', 'width', 'height', 'thick', 'tilt', 'miscut', 'crystal']
270
273
  cry = {}
271
274
 
272
- for line in infile:
275
+ for line in fp:
273
276
  if line.startswith('#'):
274
277
  continue # Comment
275
278
  sline = line.split()
@@ -282,8 +285,8 @@ class CollimatorDatabase:
282
285
  elif sline[0].lower() == "crystal":
283
286
  cry[sline[1]] = {}
284
287
  for i, key in enumerate(cry_fields):
285
- idx = i+2 if i < 4 else i+3 # we skip "tilt"
286
- if i < 5:
288
+ idx = i+2
289
+ if i < 6:
287
290
  cry[sline[1]][key] = float(sline[idx])
288
291
  else:
289
292
  cry[sline[1]][key] = int(sline[idx])
@@ -507,77 +510,85 @@ class CollimatorDatabase:
507
510
  _print_colls(bx_colls, self, 'bx', file)
508
511
  print('WARNING -- some collimators could not be assigned to b1 or b2. Tracking might not work with those collimators. Please manually change the output file if necessary.')
509
512
 
513
+
510
514
  # ====================================
511
515
  # ====== Installing collimators ======
512
516
  # ====================================
513
517
 
514
- def install_black_absorbers(self, line, names=None, *, verbose=False, need_apertures=True):
515
- self.line = line
516
- elements = []
517
- if names is None:
518
+ def _get_names_from_line(self, line, names, families):
519
+ if names is None and families is None:
518
520
  names = self.collimator_names
519
- for name in names:
520
- if verbose: print(f"Installing {name:20} as BlackAbsorber")
521
- el = BlackAbsorber(gap=self[name]['gap'], angle=self[name]['angle'],
522
- length=self[name]['length'], side=self[name]['side'],
523
- _tracking=False)
521
+ elif names is None:
522
+ names = self.get_collimators_from_family(families)
523
+ elif families is not None:
524
+ names.append(self.get_collimators_from_family(families))
525
+ return list(set(names)) # Remove duplicates
524
526
 
527
+ def _check_installed(self, line, name, collimator_class):
525
528
  # Check that collimator is not installed as different type
526
529
  # TODO: automatically replace collimator type and print warning
527
- if isinstance(line[name], tuple(collimator_classes)):
528
- raise ValueError(f"Trying to install {name} as {el.__class__.__name__},"
529
- + f" but it is already installed as {line[name].__class__.__name__}!\n"
530
+ if isinstance(line[name], _all_collimator_classes):
531
+ raise ValueError(f"Trying to install {name} as {collimator_class.__name__}, "
532
+ + f"but it is already installed as {line[name].__class__.__name__}!\n"
530
533
  + f"Please reconstruct the line.")
531
-
532
534
  # TODO: only allow Marker elements, no Drifts!!
533
535
  # How to do this with importing a line for MAD-X or SixTrack...?
536
+ # Maybe we want a DriftCollimator type in Xtrack as a general placeholder
534
537
  elif not isinstance(line[name], (xt.Marker, xt.Drift)):
535
- raise ValueError(f"Trying to install {name} as {el.__class__.__name__},"
536
- + f" but the line element to replace is not an xtrack.Marker "
538
+ raise ValueError(f"Trying to install {name} as {collimator_class.__name__}, "
539
+ + f"but the line element to replace is not an xtrack.Marker "
537
540
  + f"(or xtrack.Drift)!\nPlease check the name, or correct the "
538
541
  + f"element.")
539
- el.emittance = [self.nemitt_x, self.nemitt_y]
540
- elements.append(el)
541
- install_elements(line, names, elements, need_apertures=need_apertures)
542
542
 
543
- def install_everest_collimators(self, line, names=None, *, verbose=False, need_apertures=True):
544
- self.line = line
545
- elements = []
546
- if names is None:
547
- names = self.collimator_names
543
+ def _create_collimator(self, line, collimator_class, name, **kwargs):
544
+ assert issubclass(collimator_class, BaseCollimator)
545
+ self._check_installed(line, name, collimator_class)
546
+ if kwargs.pop('verbose', False):
547
+ print(f"Installing {name:20} as {collimator_class.__name__}")
548
+ el = collimator_class(gap=self[name]['gap'], angle=self[name]['angle'],
549
+ length=self[name]['length'], side=self[name]['side'],
550
+ _tracking=False, **kwargs)
551
+ el.emittance = [self.nemitt_x, self.nemitt_y]
552
+ self._elements[name] = el
553
+
554
+ def _create_crystal(self, line, crystal_class, name, **kwargs):
555
+ assert issubclass(crystal_class, BaseCrystal)
556
+ self._check_installed(line, name, crystal_class)
557
+ if kwargs.pop('verbose', False):
558
+ print(f"Installing {name:20} as {crystal_class.__name__}")
559
+ el = crystal_class(gap=self[name]['gap'], angle=self[name]['angle'],
560
+ length=self[name]['length'], side=self[name]['side'],
561
+ bending_radius=self[name]['bending_radius'],
562
+ width=self[name]['width'], height=self[name]['height'],
563
+ _tracking=False, **kwargs)
564
+ el.emittance = [self.nemitt_x, self.nemitt_y]
565
+ self._elements[name] = el
566
+
567
+ def install_black_absorbers(self, line, *, names=None, families=None, verbose=False, need_apertures=True):
568
+ names = self._get_names_from_line(line, names, families)
548
569
  for name in names:
549
- mat = SixTrack_to_xcoll[self[name]['material']]
550
- if self[name]['crystal'] is None:
551
- if verbose: print(f"Installing {name:20} as EverestCollimator")
552
- el = EverestCollimator(gap=self[name]['gap'], angle=self[name]['angle'],
553
- length=self[name]['length'], side=self[name]['side'],
554
- material=mat[0], _tracking=False)
570
+ if self[name]['bending_radius'] is None:
571
+ self._create_collimator(line, BlackAbsorber, name, verbose=verbose)
555
572
  else:
556
- if verbose: print(f"Installing {name:20} as EverestCrystal")
557
- el = EverestCrystal(gap=self[name]['gap'], angle=self[name]['angle'],
558
- length=self[name]['length'], side=self[name]['side'], material=mat[1],
559
- lattice=self[name]['crystal'], bending_radius=self[name]['bending_radius'],
560
- width=self[name]['width'], height=self[name]['height'],
561
- miscut=self[name]['miscut'], _tracking=False)
562
-
563
- # Check that collimator is not installed as different type
564
- # TODO: automatically replace collimator type and print warning
565
- if isinstance(line[name], tuple(collimator_classes)):
566
- raise ValueError(f"Trying to install {name} as {el.__class__.__name__},"
567
- + f" but it is already installed as {line[name].__class__.__name__}!\n"
568
- + f"Please reconstruct the line.")
573
+ self._create_crystal(line, BlackCrystal, name, verbose=verbose)
574
+ elements = [self._elements[name] for name in names]
575
+ install_elements(line, names, elements, need_apertures=need_apertures)
569
576
 
570
- # TODO: only allow Marker elements, no Drifts!!
571
- # How to do this with importing a line for MAD-X or SixTrack...?
572
- elif not isinstance(line[name], (xt.Marker, xt.Drift)):
573
- raise ValueError(f"Trying to install {name} as {el.__class__.__name__},"
574
- + f" but the line element to replace is not an xtrack.Marker "
575
- + f"(or xtrack.Drift)!\nPlease check the name, or correct the "
576
- + f"element.")
577
- el.emittance = [self.nemitt_x, self.nemitt_y]
578
- elements.append(el)
577
+ def install_everest_collimators(self, line, *, names=None, families=None, verbose=False, need_apertures=True):
578
+ names = self._get_names_from_line(line, names, families)
579
+ for name in names:
580
+ mat = SixTrack_to_xcoll(self[name]['material'])
581
+ if self[name]['bending_radius'] is None:
582
+ self._create_collimator(line, EverestCollimator, name, material=mat[0],
583
+ verbose=verbose)
584
+ else:
585
+ self._create_crystal(line, EverestCrystal, name, material=mat[1],
586
+ lattice=self[name]['crystal'], verbose=verbose,
587
+ miscut=self[name]['miscut'])
588
+ elements = [self._elements[name] for name in names]
579
589
  install_elements(line, names, elements, need_apertures=need_apertures)
580
590
 
591
+
581
592
  # ==================================
582
593
  # ====== Accessing attributes ======
583
594
  # ==================================
@@ -588,15 +599,35 @@ class CollimatorDatabase:
588
599
 
589
600
  @property
590
601
  def collimator_families(self):
591
- return self._family_dict.keys()
602
+ families = {fam: [] for fam in self._family_dict.keys()}
603
+ families["no family"] = []
604
+ for name in self.collimator_names:
605
+ if 'family' not in self[name] or self[name]['family'].lower() == 'unknown':
606
+ families["no family"].append(name)
607
+ else:
608
+ families[self[name]['family']].append(name)
609
+ return families
610
+
611
+ def get_collimators_from_family(self, family):
612
+ if not hasattr(family, '__iter__') and not isinstance(family, str):
613
+ family = [family]
614
+ result = []
615
+ for fam in family:
616
+ if fam not in self.collimator_families:
617
+ raise ValueError(f"Family '{fam}' not found in CollimatorDatabase!")
618
+ result += self.collimator_families[fam]
619
+ return result
592
620
 
593
- def __getattr__(self, name):
594
- if name in self._family_dict:
595
- return self._family_dict[name]
596
- elif name in self._collimator_dict:
597
- return self._collimator_dict[name]
621
+ @property
622
+ def properties(self):
623
+ return {attr for d in self._collimator_dict.values() for attr in d.keys()}
624
+
625
+ def __getattr__(self, attr):
626
+ if attr in self.properties:
627
+ # TODO: include families
628
+ return {kk: vv.get(attr, None) for kk, vv in self._collimator_dict.items()}
598
629
  else:
599
- raise ValueError(f"Family nor collimator '{name}' found in CollimatorDatabase!")
630
+ raise ValueError(f"Property `{attr}` not present in CollimatorDatabase!")
600
631
 
601
632
  def __getitem__(self, name):
602
633
  if name in self._family_dict:
@@ -604,7 +635,5 @@ class CollimatorDatabase:
604
635
  elif name in self._collimator_dict:
605
636
  return self._collimator_dict[name]
606
637
  else:
607
- raise ValueError(f"Family nor collimator '{name}' found in CollimatorDatabase!")
608
-
609
-
638
+ raise ValueError(f"Family nor collimator `{name}` found in CollimatorDatabase!")
610
639
 
xcoll/general.py CHANGED
@@ -9,8 +9,8 @@ _pkg_root = Path(__file__).parent.absolute()
9
9
 
10
10
  citation = "F.F. Van der Veken, et al.: Recent Developments with the New Tools for Collimation Simulations in Xsuite, Proceedings of HB2023, Geneva, Switzerland."
11
11
 
12
- # ===================
12
+ # ======================
13
13
  # Do not change
14
- # ===================
15
- __version__ = '0.4.0'
16
- # ===================
14
+ # ======================
15
+ __version__ = '0.5.0'
16
+ # ======================
@@ -9,7 +9,7 @@ import xtrack as xt
9
9
  import xobjects as xo
10
10
  import xpart as xp
11
11
 
12
- from .beam_elements import collimator_classes
12
+ from .beam_elements import _all_collimator_classes, EverestCrystal
13
13
 
14
14
 
15
15
  def generate_pencil_on_collimator(line, name, num_particles, *, side='+-', pencil_spread=1e-6,
@@ -24,7 +24,7 @@ def generate_pencil_on_collimator(line, name, num_particles, *, side='+-', penci
24
24
 
25
25
  coll = line[name]
26
26
 
27
- if not isinstance(coll, tuple(collimator_classes)):
27
+ if not isinstance(coll, tuple(_all_collimator_classes)):
28
28
  raise ValueError("Need to provide a valid collimator!")
29
29
 
30
30
  if coll.optics is None:
@@ -171,14 +171,26 @@ def _generate_4D_pencil_one_jaw(line, name, num_particles, plane, side, impact_p
171
171
 
172
172
  if side == '+':
173
173
  if is_converging:
174
- pencil_pos = coll.jaw_LU + impact_parameter
174
+ if isinstance(coll, EverestCrystal):
175
+ pencil_pos = coll.jaw_U + impact_parameter
176
+ else:
177
+ pencil_pos = coll.jaw_LU + impact_parameter
175
178
  else:
176
- pencil_pos = coll.jaw_LD + impact_parameter
179
+ if isinstance(coll, EverestCrystal):
180
+ pencil_pos = coll.jaw_D - impact_parameter
181
+ else:
182
+ pencil_pos = coll.jaw_LD + impact_parameter
177
183
  elif side == '-':
178
184
  if is_converging:
179
- pencil_pos = coll.jaw_RU - impact_parameter
185
+ if isinstance(coll, EverestCrystal):
186
+ pencil_pos = coll.jaw_U - impact_parameter
187
+ else:
188
+ pencil_pos = coll.jaw_RU - impact_parameter
180
189
  else:
181
- pencil_pos = coll.jaw_RD - impact_parameter
190
+ if isinstance(coll, EverestCrystal):
191
+ pencil_pos = coll.jaw_D + impact_parameter
192
+ else:
193
+ pencil_pos = coll.jaw_RD - impact_parameter
182
194
 
183
195
  # Collimator plane: generate pencil distribution
184
196
  pencil, p_pencil = xp.generate_2D_pencil_with_absolute_cut(
xcoll/install.py CHANGED
@@ -83,6 +83,8 @@ def _get_s_start(line, name, length, tab=None):
83
83
  existing_length = line[name].length
84
84
  else:
85
85
  existing_length = 0
86
+ if name not in tab.name:
87
+ raise ValueError(f"Element {name} not found in line. Need to mmanually provide `at_s`.")
86
88
  return tab.rows[name].s[0] + existing_length/2. - length/2
87
89
 
88
90
 
@@ -171,7 +173,7 @@ def prepare_space_for_element(line, name, s_start, s_end, tab=None, s_tol=1.e-6)
171
173
  continue
172
174
  if not element_type.startswith('Limit'):
173
175
  print(f"Warning: Removed active element {element_name} "
174
- + f"at location inside collimator!")
176
+ + f"at location inside collimator {name}!")
175
177
  length = line[element_name].length if hasattr(line[element_name], 'length') else 0
176
178
  line.element_dict[element_name] = xt.Drift(length=length)
177
179