xcoll 0.3.6__py3-none-any.whl → 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of xcoll might be problematic. Click here for more details.
- xcoll/__init__.py +13 -4
- xcoll/beam_elements/__init__.py +14 -6
- xcoll/beam_elements/absorber.py +41 -7
- xcoll/beam_elements/base.py +1202 -247
- xcoll/beam_elements/blowup.py +198 -0
- xcoll/beam_elements/elements_src/black_absorber.h +136 -0
- xcoll/beam_elements/elements_src/black_crystal.h +129 -0
- xcoll/beam_elements/elements_src/blowup.h +42 -0
- xcoll/beam_elements/elements_src/emittance_monitor.h +109 -0
- xcoll/beam_elements/{collimators_src → elements_src}/everest_block.h +59 -30
- xcoll/beam_elements/elements_src/everest_collimator.h +237 -0
- xcoll/beam_elements/elements_src/everest_crystal.h +280 -0
- xcoll/beam_elements/everest.py +65 -119
- xcoll/beam_elements/monitor.py +428 -0
- xcoll/colldb.py +276 -747
- xcoll/general.py +5 -5
- xcoll/headers/checks.h +1 -1
- xcoll/headers/particle_states.h +2 -2
- xcoll/initial_distribution.py +207 -0
- xcoll/install.py +179 -0
- xcoll/interaction_record/__init__.py +1 -0
- xcoll/interaction_record/interaction_record.py +298 -0
- xcoll/interaction_record/interaction_record_src/interaction_record.h +98 -0
- xcoll/{impacts → interaction_record}/interaction_types.py +11 -4
- xcoll/line_tools.py +82 -0
- xcoll/lossmap.py +219 -0
- xcoll/manager.py +2 -937
- xcoll/rf_sweep.py +1 -1
- xcoll/scattering_routines/everest/amorphous.h +232 -0
- xcoll/scattering_routines/everest/channeling.h +240 -0
- xcoll/scattering_routines/everest/crystal_parameters.h +137 -0
- xcoll/scattering_routines/everest/everest.h +11 -30
- xcoll/scattering_routines/everest/everest.py +13 -10
- xcoll/scattering_routines/everest/jaw.h +28 -197
- xcoll/scattering_routines/everest/materials.py +37 -15
- xcoll/scattering_routines/everest/multiple_coulomb_scattering.h +31 -10
- xcoll/scattering_routines/everest/nuclear_interaction.h +86 -0
- xcoll/scattering_routines/everest/properties.h +6 -1
- xcoll/scattering_routines/fluka/flukaio/lib/libFlukaIO64.a +0 -0
- xcoll/scattering_routines/geant4/collimasim/.git +1 -0
- xcoll/scattering_routines/geant4/collimasim/.gitignore +12 -0
- xcoll/scattering_routines/geant4/collimasim/.gitmodules +3 -0
- xcoll/scattering_routines/geant4/collimasim/CMakeLists.txt +26 -0
- xcoll/scattering_routines/geant4/collimasim/README.md +21 -0
- xcoll/scattering_routines/geant4/collimasim/docs/Makefile +20 -0
- xcoll/scattering_routines/geant4/collimasim/docs/make.bat +35 -0
- xcoll/scattering_routines/geant4/collimasim/docs/source/collimasim.rst +10 -0
- xcoll/scattering_routines/geant4/collimasim/docs/source/conf.py +59 -0
- xcoll/scattering_routines/geant4/collimasim/docs/source/index.rst +26 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.appveyor.yml +37 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.clang-format +19 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.clang-tidy +65 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.cmake-format.yaml +73 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.git +1 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/CODEOWNERS +9 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/CONTRIBUTING.md +386 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/ISSUE_TEMPLATE/bug-report.yml +45 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/ISSUE_TEMPLATE/config.yml +8 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/dependabot.yml +16 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/labeler.yml +8 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/labeler_merged.yml +3 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/pull_request_template.md +19 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/ci.yml +969 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/configure.yml +84 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/format.yml +48 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/labeler.yml +16 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.github/workflows/pip.yml +103 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.gitignore +45 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.pre-commit-config.yaml +151 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/.readthedocs.yml +3 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/CMakeLists.txt +297 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/LICENSE +29 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/MANIFEST.in +6 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/README.rst +180 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/Doxyfile +23 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/Makefile +192 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/_static/theme_overrides.css +11 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/chrono.rst +81 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/custom.rst +93 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/eigen.rst +310 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/functional.rst +109 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/index.rst +43 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/overview.rst +171 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/stl.rst +251 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/cast/strings.rst +305 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/classes.rst +1297 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/embedding.rst +262 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/exceptions.rst +396 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/functions.rst +568 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/misc.rst +337 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/index.rst +13 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/numpy.rst +463 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/object.rst +286 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/pycpp/utilities.rst +155 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/advanced/smart_ptrs.rst +174 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/basics.rst +308 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/benchmark.py +91 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/benchmark.rst +95 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/changelog.rst +2050 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/classes.rst +542 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/cmake/index.rst +8 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/compiling.rst +648 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/conf.py +381 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/faq.rst +343 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/index.rst +48 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/installing.rst +105 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/limitations.rst +72 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11-logo.png +0 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python1.png +0 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python1.svg +427 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python2.png +0 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/pybind11_vs_boost_python2.svg +427 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/reference.rst +130 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/release.rst +96 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/requirements.txt +8 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/docs/upgrade.rst +548 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/attr.h +605 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/buffer_info.h +144 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/cast.h +1432 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/chrono.h +213 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/common.h +2 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/complex.h +65 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/class.h +709 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/common.h +1021 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/descr.h +104 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/init.h +346 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/internals.h +467 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/type_caster_base.h +978 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/detail/typeid.h +55 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/eigen.h +606 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/embed.h +284 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/eval.h +163 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/functional.h +121 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/gil.h +193 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/iostream.h +275 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/numpy.h +1741 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/operators.h +163 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/options.h +65 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/pybind11.h +2497 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/pytypes.h +1879 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl/filesystem.h +103 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl.h +375 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/include/pybind11/stl_bind.h +747 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/noxfile.py +88 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/__init__.py +11 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/__main__.py +52 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/_version.py +12 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/_version.pyi +6 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/commands.py +21 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/py.typed +0 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/setup_helpers.py +482 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pybind11/setup_helpers.pyi +63 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/pyproject.toml +41 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/setup.cfg +56 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/setup.py +155 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/CMakeLists.txt +503 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/conftest.py +208 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/constructor_stats.h +275 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/cross_module_gil_utils.cpp +73 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/env.py +33 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_python_package/pytest.ini +0 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_python_package/test_files.py +279 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_setuptools/pytest.ini +0 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/extra_setuptools/test_setuphelper.py +143 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/local_bindings.h +85 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/object.h +179 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_cross_module_tests.cpp +151 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_tests.cpp +91 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pybind11_tests.h +85 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/pytest.ini +19 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/requirements.txt +12 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_async.cpp +26 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_async.py +25 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_buffers.cpp +216 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_buffers.py +163 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_builtin_casters.cpp +286 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_builtin_casters.py +536 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_call_policies.cpp +107 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_call_policies.py +248 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_callbacks.cpp +227 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_callbacks.py +202 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_chrono.cpp +84 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_chrono.py +210 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_class.cpp +550 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_class.py +473 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/CMakeLists.txt +84 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/embed.cpp +21 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_embed/CMakeLists.txt +28 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_function/CMakeLists.txt +39 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/installed_target/CMakeLists.txt +46 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/main.cpp +6 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_embed/CMakeLists.txt +41 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_function/CMakeLists.txt +35 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/subdirectory_target/CMakeLists.txt +41 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_cmake_build/test.py +10 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_constants_and_functions.cpp +165 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_constants_and_functions.py +53 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_copy_move.cpp +238 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_copy_move.py +126 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_casters.cpp +141 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_casters.py +117 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_setup.cpp +41 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_custom_type_setup.py +50 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_docstring_options.cpp +69 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_docstring_options.py +42 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eigen.cpp +348 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eigen.py +771 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/CMakeLists.txt +47 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/catch.cpp +22 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/external_module.cpp +23 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/test_interpreter.cpp +326 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_embed/test_interpreter.py +15 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_enum.cpp +148 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_enum.py +272 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval.cpp +119 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval.py +51 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_eval_call.py +5 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.cpp +285 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.h +12 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_exceptions.py +265 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_factory_constructors.cpp +397 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_factory_constructors.py +520 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_gil_scoped.cpp +49 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_gil_scoped.py +94 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_iostream.cpp +125 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_iostream.py +331 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_kwargs_and_defaults.cpp +153 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_kwargs_and_defaults.py +284 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_local_bindings.cpp +107 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_local_bindings.py +257 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_methods_and_attributes.cpp +412 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_methods_and_attributes.py +517 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_modules.cpp +102 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_modules.py +92 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_multiple_inheritance.cpp +233 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_multiple_inheritance.py +360 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_array.cpp +472 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_array.py +593 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_dtypes.cpp +524 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_dtypes.py +441 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_vectorize.cpp +103 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_numpy_vectorize.py +267 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_opaque_types.cpp +73 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_opaque_types.py +59 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_operator_overloading.cpp +235 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_operator_overloading.py +146 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pickling.cpp +189 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pickling.py +82 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pytypes.cpp +560 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_pytypes.py +651 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_sequences_and_iterators.cpp +500 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_sequences_and_iterators.py +253 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_smart_ptr.cpp +452 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_smart_ptr.py +318 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl.cpp +342 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl.py +291 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl_binders.cpp +131 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_stl_binders.py +318 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_tagbased_polymorphic.cpp +144 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_tagbased_polymorphic.py +29 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_thread.cpp +66 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_thread.py +44 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_union.cpp +22 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_union.py +9 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_virtual_functions.cpp +510 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/test_virtual_functions.py +408 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/valgrind-numpy-scipy.supp +140 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tests/valgrind-python.supp +117 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindCatch.cmake +70 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindEigen3.cmake +86 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/FindPythonLibsNew.cmake +257 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/check-style.sh +44 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/cmake_uninstall.cmake.in +23 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/libsize.py +39 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/make_changelog.py +64 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Common.cmake +402 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Config.cmake.in +233 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11NewTools.cmake +276 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pybind11Tools.cmake +214 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/pyproject.toml +3 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/setup_global.py.in +65 -0
- xcoll/scattering_routines/geant4/collimasim/lib/pybind11/tools/setup_main.py.in +41 -0
- xcoll/scattering_routines/geant4/collimasim/pyproject.toml +8 -0
- xcoll/scattering_routines/geant4/collimasim/setup.py +144 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSPyATInterface.cpp +403 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSPyATInterface.hh +100 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSXtrackInterface.cpp +763 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim/BDSXtrackInterface.hh +118 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim/__init__.py +8 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim/bindings.cpp +63 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim/pyCollimatorPass.py +142 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim/xtrack_collimator.py +556 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/PKG-INFO +6 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/SOURCES.txt +24 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/dependency_links.txt +1 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/not-zip-safe +1 -0
- xcoll/scattering_routines/geant4/collimasim/src/collimasim.egg-info/top_level.txt +1 -0
- xcoll/scattering_routines/geant4/collimasim/tests/README.md +25 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_forions.dat +25 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_new_example.dat +18 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_old_example.dat +68 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_testing.dat +15 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/CollDB_yaml_example.yaml +110 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/collgaps.dat +7 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/collgaps_pyat_test.dat +3 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/collonly_twiss_file_example.tfs +54 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/settings.gmad +3 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/settings_black_absorber.gmad +3 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/settings_ions.gmad +5 -0
- xcoll/scattering_routines/geant4/collimasim/tests/resources/twiss_file_testing.tfs +51 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_pyat.py +65 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_pyat_passmethod.py +59 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_pyat_tracking.py +102 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack.py +75 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_angle.py +74 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_colldb_load.py +84 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_interaction.py +159 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_interaction_ion.py +99 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_ions.py +78 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_lost_energy.py +88 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tilt.py +80 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tracking.py +97 -0
- xcoll/scattering_routines/geant4/collimasim/tests/test_xtrack_tracking_ions.py +96 -0
- xcoll/scattering_routines/geometry/__init__.py +6 -0
- xcoll/scattering_routines/geometry/collimator_geometry.h +218 -0
- xcoll/scattering_routines/geometry/crystal_geometry.h +153 -0
- xcoll/scattering_routines/geometry/geometry.py +26 -0
- xcoll/scattering_routines/geometry/get_s.h +92 -0
- xcoll/scattering_routines/geometry/methods.h +111 -0
- xcoll/scattering_routines/geometry/objects.h +154 -0
- xcoll/scattering_routines/geometry/rotation.h +23 -0
- xcoll/scattering_routines/geometry/segments.h +226 -0
- xcoll/scattering_routines/geometry/sort.h +184 -0
- {xcoll-0.3.6.dist-info → xcoll-0.5.0.dist-info}/METADATA +1 -1
- xcoll-0.5.0.dist-info/RECORD +413 -0
- xcoll/beam_elements/collimators_src/absorber.h +0 -141
- xcoll/beam_elements/collimators_src/everest_collimator.h +0 -142
- xcoll/beam_elements/collimators_src/everest_crystal.h +0 -115
- xcoll/collimator_settings.py +0 -457
- xcoll/impacts/__init__.py +0 -1
- xcoll/impacts/impacts.py +0 -102
- xcoll/impacts/impacts_src/impacts.h +0 -99
- xcoll/scattering_routines/everest/crystal.h +0 -1302
- xcoll/scattering_routines/everest/scatter.h +0 -169
- xcoll/scattering_routines/everest/scatter_crystal.h +0 -260
- xcoll/scattering_routines/fluka/build_fluka_input.py +0 -58
- xcoll-0.3.6.dist-info/RECORD +0 -111
- {xcoll-0.3.6.dist-info → xcoll-0.5.0.dist-info}/LICENSE +0 -0
- {xcoll-0.3.6.dist-info → xcoll-0.5.0.dist-info}/NOTICE +0 -0
- {xcoll-0.3.6.dist-info → xcoll-0.5.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import xobjects as xo
|
|
3
|
+
import xtrack as xt
|
|
4
|
+
import xpart as xp
|
|
5
|
+
|
|
6
|
+
import collimasim as cs
|
|
7
|
+
|
|
8
|
+
import multiprocessing
|
|
9
|
+
|
|
10
|
+
def make_particles():
|
|
11
|
+
np.random.seed(seed=1994)
|
|
12
|
+
n_part = 5000
|
|
13
|
+
particles = xp.Particles(
|
|
14
|
+
_capacity=n_part,
|
|
15
|
+
p0c = 185.e9,
|
|
16
|
+
mass0 = xp.ELECTRON_MASS_EV,
|
|
17
|
+
x=np.random.uniform(-1e-3, 1e-3, n_part),
|
|
18
|
+
px=np.random.uniform(-1e-4, 1e-4, n_part),
|
|
19
|
+
y=np.random.uniform(-1e-3, 1e-3, n_part),
|
|
20
|
+
py=np.random.uniform(-1e-4, 1e-4, n_part),
|
|
21
|
+
zeta=np.random.uniform(-0.1, 0.1, n_part),
|
|
22
|
+
delta=np.random.uniform(-0.9, 0.9, n_part),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
return particles
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def run_g4_logitudinal(particles):
|
|
29
|
+
np.random.seed(seed=1994)
|
|
30
|
+
|
|
31
|
+
g4man = cs.Geant4CollimationManager(collimator_file="resources/CollDB_testing.dat",
|
|
32
|
+
bdsim_config_file="resources/settings_black_absorber.gmad",
|
|
33
|
+
tfs_file="resources/twiss_file_testing.tfs",
|
|
34
|
+
reference_pdg_id=-11,
|
|
35
|
+
reference_kinetic_energy=182.5e9,
|
|
36
|
+
emittance_norm=(1.e-3, 1.e-6),
|
|
37
|
+
relative_energy_cut=0.001,
|
|
38
|
+
seed=1993,
|
|
39
|
+
# batchMode=False
|
|
40
|
+
batchMode=True
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
coll1 = g4man.make_xtg4_collimator("coll_open") # Use new convenience method
|
|
44
|
+
|
|
45
|
+
# Generate a simple sequence
|
|
46
|
+
line = xt.Line(
|
|
47
|
+
elements=[coll1,
|
|
48
|
+
])
|
|
49
|
+
|
|
50
|
+
context = xo.ContextCpu()
|
|
51
|
+
line.build_tracker(_context=context)
|
|
52
|
+
|
|
53
|
+
part_copy = particles.copy()
|
|
54
|
+
line.track(part_copy, num_turns=1)
|
|
55
|
+
part_copy.remove_unused_space()
|
|
56
|
+
|
|
57
|
+
return part_copy
|
|
58
|
+
|
|
59
|
+
def run_drift_logitudinal(particles):
|
|
60
|
+
|
|
61
|
+
line = xt.Line(
|
|
62
|
+
elements=[xt.Drift(length=10),
|
|
63
|
+
])
|
|
64
|
+
|
|
65
|
+
context = xo.ContextCpu()
|
|
66
|
+
line.config.XTRACK_USE_EXACT_DRIFTS = True
|
|
67
|
+
line.build_tracker(_context=context)
|
|
68
|
+
|
|
69
|
+
part_copy = particles.copy()
|
|
70
|
+
line.track(part_copy, num_turns=1)
|
|
71
|
+
part_copy.remove_unused_space()
|
|
72
|
+
|
|
73
|
+
return part_copy
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_xtrack_tracking():
|
|
77
|
+
particles = make_particles()
|
|
78
|
+
part_g4 = run_g4_logitudinal(particles)
|
|
79
|
+
part_dr = run_drift_logitudinal(particles)
|
|
80
|
+
|
|
81
|
+
# BDSIM tracks trough some geometry padding now, which is not corrected for now
|
|
82
|
+
# so use a fairly lenient tolerance of 1e-8 for all coordinates over 10 m of drift
|
|
83
|
+
all_close = True
|
|
84
|
+
for var in ['x', 'px', 'y', 'py', 'zeta', 'delta']:
|
|
85
|
+
atol = 1e-8
|
|
86
|
+
rtol = 1e-5
|
|
87
|
+
var_close = np.all(np.isclose(getattr(part_g4, var), getattr(part_dr, var), atol=atol, rtol=rtol))
|
|
88
|
+
|
|
89
|
+
all_close &= var_close
|
|
90
|
+
print("Var {}: {}".format(var, var_close))
|
|
91
|
+
|
|
92
|
+
assert all_close
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
if __name__ == '__main__':
|
|
97
|
+
test_xtrack_tracking()
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import xobjects as xo
|
|
3
|
+
import xtrack as xt
|
|
4
|
+
import xpart as xp
|
|
5
|
+
|
|
6
|
+
import collimasim as cs
|
|
7
|
+
|
|
8
|
+
import multiprocessing
|
|
9
|
+
|
|
10
|
+
def make_particles():
|
|
11
|
+
np.random.seed(seed=1994)
|
|
12
|
+
n_part = 5000
|
|
13
|
+
particles = xp.Particles(
|
|
14
|
+
_capacity=n_part,
|
|
15
|
+
p0c = 36900e9,
|
|
16
|
+
mass0 = 193687676197.13638,
|
|
17
|
+
x=np.random.uniform(-1e-3, 1e-3, n_part),
|
|
18
|
+
px=np.random.uniform(-1e-4, 1e-4, n_part),
|
|
19
|
+
y=np.random.uniform(-1e-3, 1e-3, n_part),
|
|
20
|
+
py=np.random.uniform(-1e-4, 1e-4, n_part),
|
|
21
|
+
zeta=np.random.uniform(-0.1, 0.1, n_part),
|
|
22
|
+
delta=np.random.uniform(-0.4, 0.4, n_part),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
return particles
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def run_g4_logitudinal(particles):
|
|
29
|
+
np.random.seed(seed=1994)
|
|
30
|
+
|
|
31
|
+
g4man = cs.Geant4CollimationManager(collimator_file="resources/CollDB_testing.dat",
|
|
32
|
+
bdsim_config_file="resources/settings_black_absorber.gmad",
|
|
33
|
+
tfs_file="resources/twiss_file_testing.tfs",
|
|
34
|
+
reference_pdg_id=1000822080,
|
|
35
|
+
reference_kinetic_energy=36706820652500.0,
|
|
36
|
+
emittance_norm=(5.e-5, 5.e-5),
|
|
37
|
+
relative_energy_cut=0.001,
|
|
38
|
+
seed=1993,
|
|
39
|
+
# batchMode=False
|
|
40
|
+
batchMode=True
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
coll1 = g4man.make_xtg4_collimator("coll_open") # Use new convenience method
|
|
44
|
+
|
|
45
|
+
# Generate a simple sequence
|
|
46
|
+
line = xt.Line(
|
|
47
|
+
elements=[coll1,
|
|
48
|
+
])
|
|
49
|
+
|
|
50
|
+
context = xo.ContextCpu()
|
|
51
|
+
line.build_tracker(_context=context)
|
|
52
|
+
|
|
53
|
+
part_copy = particles.copy()
|
|
54
|
+
line.track(part_copy, num_turns=1)
|
|
55
|
+
part_copy.remove_unused_space()
|
|
56
|
+
|
|
57
|
+
return part_copy
|
|
58
|
+
|
|
59
|
+
def run_drift_logitudinal(particles):
|
|
60
|
+
|
|
61
|
+
line = xt.Line(
|
|
62
|
+
elements=[xt.Drift(length=10),
|
|
63
|
+
])
|
|
64
|
+
|
|
65
|
+
context = xo.ContextCpu()
|
|
66
|
+
line.config.XTRACK_USE_EXACT_DRIFTS = True
|
|
67
|
+
line.build_tracker(_context=context)
|
|
68
|
+
|
|
69
|
+
part_copy = particles.copy()
|
|
70
|
+
line.track(part_copy, num_turns=1)
|
|
71
|
+
part_copy.remove_unused_space()
|
|
72
|
+
|
|
73
|
+
return part_copy
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_xtrack_tracking():
|
|
77
|
+
particles = make_particles()
|
|
78
|
+
part_g4 = run_g4_logitudinal(particles)
|
|
79
|
+
part_dr = run_drift_logitudinal(particles)
|
|
80
|
+
|
|
81
|
+
# BDSIM tracks trough some geometry padding now, which is not corrected for now
|
|
82
|
+
# so use a fairly lenient tolerance of 1e-8 for all coordinates over 10 m of drift
|
|
83
|
+
all_close = True
|
|
84
|
+
for var in ['x', 'px', 'y', 'py', 'zeta', 'delta']:
|
|
85
|
+
atol = 1e-6 # For ions, the zeta variable doesn't seem to agree so well, e.g it is up to 1e-7 m off
|
|
86
|
+
rtol = 1e-5
|
|
87
|
+
var_close = np.all(np.isclose(getattr(part_g4, var), getattr(part_dr, var), atol=atol, rtol=rtol))
|
|
88
|
+
|
|
89
|
+
all_close &= var_close
|
|
90
|
+
print("Var {}: {}".format(var, var_close))
|
|
91
|
+
|
|
92
|
+
assert all_close
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
if __name__ == '__main__':
|
|
96
|
+
test_xtrack_tracking()
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// copyright ############################### #
|
|
2
|
+
// This file is part of the Xcoll Package. #
|
|
3
|
+
// Copyright (c) CERN, 2024. #
|
|
4
|
+
// ######################################### #
|
|
5
|
+
|
|
6
|
+
#ifndef XCOLL_COLL_GEOM_H
|
|
7
|
+
#define XCOLL_COLL_GEOM_H
|
|
8
|
+
#include <math.h>
|
|
9
|
+
#include <stdio.h>
|
|
10
|
+
|
|
11
|
+
typedef struct CollimatorGeometry_ {
|
|
12
|
+
// Collimator jaws (with tilts)
|
|
13
|
+
double jaw_LU;
|
|
14
|
+
double jaw_RU;
|
|
15
|
+
double length;
|
|
16
|
+
int8_t side;
|
|
17
|
+
// Jaw angles
|
|
18
|
+
double sin_zL;
|
|
19
|
+
double cos_zL;
|
|
20
|
+
double sin_zR;
|
|
21
|
+
double cos_zR;
|
|
22
|
+
double sin_zDiff;
|
|
23
|
+
double cos_zDiff;
|
|
24
|
+
int8_t jaws_parallel;
|
|
25
|
+
// Tilts
|
|
26
|
+
double sin_yL;
|
|
27
|
+
double cos_yL;
|
|
28
|
+
double sin_yR;
|
|
29
|
+
double cos_yR;
|
|
30
|
+
// Segments
|
|
31
|
+
Segment* segments_L;
|
|
32
|
+
Segment* segments_R;
|
|
33
|
+
// Impact table
|
|
34
|
+
InteractionRecordData record;
|
|
35
|
+
RecordIndex record_index;
|
|
36
|
+
int8_t record_impacts;
|
|
37
|
+
int8_t record_exits;
|
|
38
|
+
} CollimatorGeometry_;
|
|
39
|
+
typedef CollimatorGeometry_* CollimatorGeometry;
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
// This function checks if a particle hits a jaw (and which).
|
|
43
|
+
// Return value: 0 (no hit), 1 (hit on left jaw), -1 (hit on right jaw).
|
|
44
|
+
// Furthermore, the particle is moved to the location where it hits the jaw (drifted to the end if no hit),
|
|
45
|
+
// and transformed to the reference frame of that jaw.
|
|
46
|
+
/*gpufun*/
|
|
47
|
+
int8_t hit_jaws_check_and_transform(LocalParticle* part, CollimatorGeometry restrict cg){
|
|
48
|
+
double part_x, part_tan;
|
|
49
|
+
int8_t is_hit = 0;
|
|
50
|
+
double s_L = 1.e21;
|
|
51
|
+
double s_R = 1.e21;
|
|
52
|
+
|
|
53
|
+
// Find the first hit on the left jaw (if not a right-sided collimator)
|
|
54
|
+
if (cg->side != -1){
|
|
55
|
+
SRotation_single_particle(part, cg->sin_zL, cg->cos_zL);
|
|
56
|
+
part_x = LocalParticle_get_x(part);
|
|
57
|
+
#ifdef XCOLL_USE_EXACT
|
|
58
|
+
part_tan = LocalParticle_get_exact_xp(part);
|
|
59
|
+
#else
|
|
60
|
+
part_tan = LocalParticle_get_xp(part);
|
|
61
|
+
#endif
|
|
62
|
+
s_L = get_s_of_first_crossing(part_x, part_tan, cg->segments_L, 3);
|
|
63
|
+
if (s_L < S_MAX){
|
|
64
|
+
is_hit = 1;
|
|
65
|
+
} else if (cg->side == 1){
|
|
66
|
+
// If left-sided and no hit, rotate back to lab frame
|
|
67
|
+
SRotation_single_particle(part, -cg->sin_zL, cg->cos_zL);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// if rightsided: lab frame
|
|
72
|
+
// if leftsided and no hit: lab frame
|
|
73
|
+
// if leftsided and hit: left frame
|
|
74
|
+
// if bothsided and no hit: left frame
|
|
75
|
+
// if bothsided and hit: left frame
|
|
76
|
+
|
|
77
|
+
// Find the first hit on the right jaw (if not a left-sided collimator)
|
|
78
|
+
if (cg->side != 1){
|
|
79
|
+
if (cg->side == -1){
|
|
80
|
+
// We didn't rotate to the left frame earlier, so full rotation to the right frame now
|
|
81
|
+
SRotation_single_particle(part, cg->sin_zR, cg->cos_zR);
|
|
82
|
+
} else if (!cg->jaws_parallel){
|
|
83
|
+
// We rotated to the left frame before, so now rotate the difference
|
|
84
|
+
SRotation_single_particle(part, cg->sin_zDiff, cg->cos_zDiff);
|
|
85
|
+
}
|
|
86
|
+
part_x = LocalParticle_get_x(part);
|
|
87
|
+
#ifdef XCOLL_USE_EXACT
|
|
88
|
+
part_tan = LocalParticle_get_exact_xp(part);
|
|
89
|
+
#else
|
|
90
|
+
part_tan = LocalParticle_get_xp(part);
|
|
91
|
+
#endif
|
|
92
|
+
s_R = get_s_of_first_crossing(part_x, part_tan, cg->segments_R, 3);
|
|
93
|
+
if (s_R < S_MAX && s_R < s_L){
|
|
94
|
+
is_hit = -1;
|
|
95
|
+
} else if (is_hit == 1){
|
|
96
|
+
if (!cg->jaws_parallel){
|
|
97
|
+
// Rotate back to left frame
|
|
98
|
+
SRotation_single_particle(part, -cg->sin_zDiff, cg->cos_zDiff);
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
// No hit, rotate back to lab frame
|
|
102
|
+
SRotation_single_particle(part, -cg->sin_zR, cg->cos_zR);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// if rightsided and no hit: lab frame
|
|
107
|
+
// if rightsided and hit: right frame
|
|
108
|
+
// if leftsided and no hit: lab frame
|
|
109
|
+
// if leftsided and hit: left frame
|
|
110
|
+
// if bothsided and no hit: lab frame
|
|
111
|
+
// if bothsided and hit: hit frame
|
|
112
|
+
|
|
113
|
+
// Drift to the impact position or end, and move to jaw frame if relevant
|
|
114
|
+
if (is_hit == 1){
|
|
115
|
+
// Move to the impact position
|
|
116
|
+
#ifdef XCOLL_USE_EXACT
|
|
117
|
+
Drift_single_particle_exact(part, s_L);
|
|
118
|
+
#else
|
|
119
|
+
Drift_single_particle_expanded(part, s_L);
|
|
120
|
+
#endif
|
|
121
|
+
// Shift the reference frame to the jaw corner LU
|
|
122
|
+
XYShift_single_particle(part, cg->jaw_LU, 0);
|
|
123
|
+
LocalParticle_add_to_s(part, -cg->length/2*(1 - cg->cos_yL));
|
|
124
|
+
// Rotate the reference frame to tilt
|
|
125
|
+
double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), asin(cg->sin_yL));
|
|
126
|
+
LocalParticle_set_s(part, new_s);
|
|
127
|
+
if (cg->record_impacts){
|
|
128
|
+
InteractionRecordData_log(cg->record, cg->record_index, part, XC_ENTER_JAW_L);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
} else if (is_hit == -1){
|
|
132
|
+
// Move to the impact position
|
|
133
|
+
#ifdef XCOLL_USE_EXACT
|
|
134
|
+
Drift_single_particle_exact(part, s_R);
|
|
135
|
+
#else
|
|
136
|
+
Drift_single_particle_expanded(part, s_R);
|
|
137
|
+
#endif
|
|
138
|
+
// Shift the reference frame to the jaw corner RU
|
|
139
|
+
XYShift_single_particle(part, cg->jaw_RU, 0);
|
|
140
|
+
LocalParticle_add_to_s(part, -cg->length/2*(1 - cg->cos_yR));
|
|
141
|
+
// Rotate the reference frame to tilt
|
|
142
|
+
double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), asin(cg->sin_yR));
|
|
143
|
+
LocalParticle_set_s(part, new_s);
|
|
144
|
+
// Mirror x
|
|
145
|
+
LocalParticle_scale_x(part, -1);
|
|
146
|
+
#ifdef XCOLL_USE_EXACT
|
|
147
|
+
LocalParticle_scale_exact_xp(part, -1);
|
|
148
|
+
#else
|
|
149
|
+
LocalParticle_scale_xp(part, -1);
|
|
150
|
+
#endif
|
|
151
|
+
if (cg->record_impacts){
|
|
152
|
+
InteractionRecordData_log(cg->record, cg->record_index, part, XC_ENTER_JAW_R);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
} else {
|
|
156
|
+
#ifdef XCOLL_USE_EXACT
|
|
157
|
+
Drift_single_particle_exact(part, cg->length);
|
|
158
|
+
#else
|
|
159
|
+
Drift_single_particle_expanded(part, cg->length);
|
|
160
|
+
#endif
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return is_hit;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
/*gpufun*/
|
|
168
|
+
void hit_jaws_transform_back(int8_t is_hit, LocalParticle* part, CollimatorGeometry restrict cg){
|
|
169
|
+
if (is_hit != 0 && LocalParticle_get_state(part) > 0){
|
|
170
|
+
if (cg->record_exits){
|
|
171
|
+
InteractionRecordData_log(cg->record, cg->record_index, part, XC_EXIT_JAW);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (is_hit == 1){
|
|
175
|
+
// Rotate back from tilt
|
|
176
|
+
double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), -asin(cg->sin_yL));
|
|
177
|
+
LocalParticle_set_s(part, new_s);
|
|
178
|
+
// Shift the reference frame back from jaw corner LU
|
|
179
|
+
XYShift_single_particle(part, -cg->jaw_LU, 0);
|
|
180
|
+
LocalParticle_add_to_s(part, cg->length/2*(1 - cg->cos_yL));
|
|
181
|
+
// If particle survived, drift to end of element
|
|
182
|
+
if (LocalParticle_get_state(part) > 0){
|
|
183
|
+
#ifdef XCOLL_USE_EXACT
|
|
184
|
+
Drift_single_particle_exact(part, cg->length - LocalParticle_get_s(part));
|
|
185
|
+
#else
|
|
186
|
+
Drift_single_particle_expanded(part, cg->length - LocalParticle_get_s(part));
|
|
187
|
+
#endif
|
|
188
|
+
}
|
|
189
|
+
SRotation_single_particle(part, -cg->sin_zL, cg->cos_zL);
|
|
190
|
+
|
|
191
|
+
} else if (is_hit == -1){
|
|
192
|
+
// Mirror back
|
|
193
|
+
LocalParticle_scale_x(part, -1);
|
|
194
|
+
#ifdef XCOLL_USE_EXACT
|
|
195
|
+
LocalParticle_scale_exact_xp(part, -1);
|
|
196
|
+
#else
|
|
197
|
+
LocalParticle_scale_xp(part, -1);
|
|
198
|
+
#endif
|
|
199
|
+
// Rotate back from tilt
|
|
200
|
+
double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), -asin(cg->sin_yR));
|
|
201
|
+
LocalParticle_set_s(part, new_s);
|
|
202
|
+
// Shift the reference frame back from jaw corner RU
|
|
203
|
+
XYShift_single_particle(part, -cg->jaw_RU, 0);
|
|
204
|
+
LocalParticle_add_to_s(part, cg->length/2*(1 - cg->cos_yR));
|
|
205
|
+
// If particle survived, drift to end of element
|
|
206
|
+
if (LocalParticle_get_state(part) > 0){
|
|
207
|
+
#ifdef XCOLL_USE_EXACT
|
|
208
|
+
Drift_single_particle_exact(part, cg->length - LocalParticle_get_s(part));
|
|
209
|
+
#else
|
|
210
|
+
Drift_single_particle_expanded(part, cg->length - LocalParticle_get_s(part));
|
|
211
|
+
#endif
|
|
212
|
+
}
|
|
213
|
+
SRotation_single_particle(part, -cg->sin_zR, cg->cos_zR);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
#endif /* XCOLL_COLL_GEOM_H */
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// copyright ############################### #
|
|
2
|
+
// This file is part of the Xcoll Package. #
|
|
3
|
+
// Copyright (c) CERN, 2024. #
|
|
4
|
+
// ######################################### #
|
|
5
|
+
|
|
6
|
+
#ifndef XCOLL_CRY_GEOM_H
|
|
7
|
+
#define XCOLL_CRY_GEOM_H
|
|
8
|
+
#include <math.h>
|
|
9
|
+
#include <stdio.h>
|
|
10
|
+
|
|
11
|
+
typedef struct CrystalGeometry_ {
|
|
12
|
+
// Crystal inner upstream corner (with tilt)
|
|
13
|
+
double jaw_U;
|
|
14
|
+
double length;
|
|
15
|
+
int8_t side;
|
|
16
|
+
// Jaw angle
|
|
17
|
+
double sin_z;
|
|
18
|
+
double cos_z;
|
|
19
|
+
// Tilt
|
|
20
|
+
double sin_y;
|
|
21
|
+
double cos_y;
|
|
22
|
+
// Crystal geometry
|
|
23
|
+
double bending_radius;
|
|
24
|
+
double bending_angle;
|
|
25
|
+
double width;
|
|
26
|
+
double height;
|
|
27
|
+
double miscut_angle;
|
|
28
|
+
double s_B; // Bend centre
|
|
29
|
+
double x_B;
|
|
30
|
+
double s_P; // Miscut centre
|
|
31
|
+
double x_P;
|
|
32
|
+
double t_VImax;
|
|
33
|
+
// Segments
|
|
34
|
+
Segment* segments;
|
|
35
|
+
// Impact table
|
|
36
|
+
InteractionRecordData record;
|
|
37
|
+
RecordIndex record_index;
|
|
38
|
+
int8_t record_impacts;
|
|
39
|
+
int8_t record_exits;
|
|
40
|
+
} CrystalGeometry_;
|
|
41
|
+
typedef CrystalGeometry_* CrystalGeometry;
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
// This function checks if a particle hits a jaw (and which).
|
|
45
|
+
// Return value: 0 (no hit), 1 (hit on left jaw), -1 (hit on right jaw).
|
|
46
|
+
// Furthermore, the particle is moved to the location where it hits the jaw (drifted to the end if no hit),
|
|
47
|
+
// and transformed to the reference frame of that jaw.
|
|
48
|
+
/*gpufun*/
|
|
49
|
+
int8_t hit_crystal_check_and_transform(LocalParticle* part, CrystalGeometry restrict cg){
|
|
50
|
+
double part_x, part_tan_x, part_y, part_tan_y;
|
|
51
|
+
double s = 1.e21;
|
|
52
|
+
|
|
53
|
+
// Crystal should be single-sided
|
|
54
|
+
if (cg->side == 0){
|
|
55
|
+
LocalParticle_kill_particle(part, XC_ERR_NOT_IMPLEMENTED);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
SRotation_single_particle(part, cg->sin_z, cg->cos_z);
|
|
59
|
+
part_x = LocalParticle_get_x(part);
|
|
60
|
+
#ifdef XCOLL_USE_EXACT
|
|
61
|
+
part_tan_x = LocalParticle_get_exact_xp(part);
|
|
62
|
+
#else
|
|
63
|
+
part_tan_x = LocalParticle_get_xp(part);
|
|
64
|
+
#endif
|
|
65
|
+
part_y = LocalParticle_get_y(part);
|
|
66
|
+
#ifdef XCOLL_USE_EXACT
|
|
67
|
+
part_tan_y = LocalParticle_get_exact_yp(part);
|
|
68
|
+
#else
|
|
69
|
+
part_tan_y = LocalParticle_get_yp(part);
|
|
70
|
+
#endif
|
|
71
|
+
s = get_s_of_first_crossing_with_vlimit(part_x, part_tan_x, part_y, part_tan_y, cg->segments, 4, -cg->height/2, cg->height/2);
|
|
72
|
+
|
|
73
|
+
if (s < S_MAX){
|
|
74
|
+
// Hit: Drift to the impact position, and move to jaw frame if relevant
|
|
75
|
+
#ifdef XCOLL_USE_EXACT
|
|
76
|
+
Drift_single_particle_exact(part, s);
|
|
77
|
+
#else
|
|
78
|
+
Drift_single_particle_expanded(part, s);
|
|
79
|
+
#endif
|
|
80
|
+
// Shift the reference frame to the upstream jaw corner (for a crystal, this is always at s=0)
|
|
81
|
+
XYShift_single_particle(part, cg->jaw_U, 0);
|
|
82
|
+
// Rotate the reference frame to tilt
|
|
83
|
+
double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), asin(cg->sin_y));
|
|
84
|
+
LocalParticle_set_s(part, new_s);
|
|
85
|
+
if (cg->side == 1){
|
|
86
|
+
if (cg->record_impacts){
|
|
87
|
+
InteractionRecordData_log(cg->record, cg->record_index, part, XC_ENTER_JAW_L);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
} else {
|
|
91
|
+
// Mirror x
|
|
92
|
+
LocalParticle_scale_x(part, -1);
|
|
93
|
+
#ifdef XCOLL_USE_EXACT
|
|
94
|
+
LocalParticle_scale_exact_xp(part, -1);
|
|
95
|
+
#else
|
|
96
|
+
LocalParticle_scale_xp(part, -1);
|
|
97
|
+
#endif
|
|
98
|
+
if (cg->record_impacts){
|
|
99
|
+
InteractionRecordData_log(cg->record, cg->record_index, part, XC_ENTER_JAW_R);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return cg->side;
|
|
103
|
+
|
|
104
|
+
} else {
|
|
105
|
+
// No hit, rotate back to lab frame
|
|
106
|
+
SRotation_single_particle(part, -cg->sin_z, cg->cos_z);
|
|
107
|
+
// Drift to end
|
|
108
|
+
#ifdef XCOLL_USE_EXACT
|
|
109
|
+
Drift_single_particle_exact(part, cg->length);
|
|
110
|
+
#else
|
|
111
|
+
Drift_single_particle_expanded(part, cg->length);
|
|
112
|
+
#endif
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
/*gpufun*/
|
|
119
|
+
void hit_crystal_transform_back(int8_t is_hit, LocalParticle* part, CrystalGeometry restrict cg){
|
|
120
|
+
if (is_hit != 0){
|
|
121
|
+
if (LocalParticle_get_state(part) > 0){
|
|
122
|
+
if (cg->record_exits){
|
|
123
|
+
InteractionRecordData_log(cg->record, cg->record_index, part, XC_EXIT_JAW);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (cg->side == -1){
|
|
127
|
+
// Mirror back
|
|
128
|
+
LocalParticle_scale_x(part, -1);
|
|
129
|
+
#ifdef XCOLL_USE_EXACT
|
|
130
|
+
LocalParticle_scale_exact_xp(part, -1);
|
|
131
|
+
#else
|
|
132
|
+
LocalParticle_scale_xp(part, -1);
|
|
133
|
+
#endif
|
|
134
|
+
}
|
|
135
|
+
// Rotate back from tilt
|
|
136
|
+
double new_s = YRotation_single_particle_rotate_only(part, LocalParticle_get_s(part), -asin(cg->sin_y));
|
|
137
|
+
LocalParticle_set_s(part, new_s);
|
|
138
|
+
// Shift the reference frame back from jaw corner U
|
|
139
|
+
XYShift_single_particle(part, -cg->jaw_U, 0);
|
|
140
|
+
// If particle survived, drift to end of element
|
|
141
|
+
if (LocalParticle_get_state(part) > 0){
|
|
142
|
+
#ifdef XCOLL_USE_EXACT
|
|
143
|
+
Drift_single_particle_exact(part, cg->length - LocalParticle_get_s(part));
|
|
144
|
+
#else
|
|
145
|
+
Drift_single_particle_expanded(part, cg->length - LocalParticle_get_s(part));
|
|
146
|
+
#endif
|
|
147
|
+
}
|
|
148
|
+
SRotation_single_particle(part, -cg->sin_z, cg->cos_z);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
#endif /* XCOLL_CRY_GEOM_H */
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# copyright ############################### #
|
|
2
|
+
# This file is part of the Xcoll Package. #
|
|
3
|
+
# Copyright (c) CERN, 2024. #
|
|
4
|
+
# ######################################### #
|
|
5
|
+
|
|
6
|
+
import xtrack as xt
|
|
7
|
+
from ...interaction_record import InteractionRecord
|
|
8
|
+
from ...general import _pkg_root
|
|
9
|
+
|
|
10
|
+
class XcollGeometry(xt.BeamElement):
|
|
11
|
+
_xofields = {}
|
|
12
|
+
|
|
13
|
+
allow_track = False
|
|
14
|
+
|
|
15
|
+
_depends_on = [xt.Drift, xt.XYShift, xt.SRotation, xt.YRotation, InteractionRecord]
|
|
16
|
+
|
|
17
|
+
_extra_c_sources = [
|
|
18
|
+
_pkg_root.joinpath('scattering_routines','geometry','sort.h'),
|
|
19
|
+
_pkg_root.joinpath('scattering_routines','geometry','segments.h'),
|
|
20
|
+
_pkg_root.joinpath('scattering_routines','geometry','objects.h'),
|
|
21
|
+
_pkg_root.joinpath('scattering_routines','geometry','methods.h'),
|
|
22
|
+
_pkg_root.joinpath('scattering_routines','geometry','get_s.h'),
|
|
23
|
+
_pkg_root.joinpath('scattering_routines','geometry','rotation.h'),
|
|
24
|
+
_pkg_root.joinpath('scattering_routines','geometry','collimator_geometry.h'),
|
|
25
|
+
_pkg_root.joinpath('scattering_routines','geometry','crystal_geometry.h')
|
|
26
|
+
]
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// copyright ############################### #
|
|
2
|
+
// This file is part of the Xcoll Package. #
|
|
3
|
+
// Copyright (c) CERN, 2024. #
|
|
4
|
+
// ######################################### #
|
|
5
|
+
|
|
6
|
+
#ifndef XCOLL_GEOM_GET_S_H
|
|
7
|
+
#define XCOLL_GEOM_GET_S_H
|
|
8
|
+
#include <math.h>
|
|
9
|
+
#include <stdio.h>
|
|
10
|
+
#include <stdint.h>
|
|
11
|
+
#include <stdlib.h>
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
// IMPORTANT:
|
|
15
|
+
// These functions assume that the particle moves towards positive s!
|
|
16
|
+
// (hence no backscattering/backtracking is allowed)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
/*gpufun*/
|
|
20
|
+
double get_s_of_first_crossing(double part_x, double part_tan, Segment* segments, \
|
|
21
|
+
int8_t n_segments){
|
|
22
|
+
int8_t n_hit = 0;
|
|
23
|
+
double* s = (double*) malloc(XC_MAX_CROSS_PER_SEGMENT*n_segments*sizeof(double));
|
|
24
|
+
find_crossing(&n_hit, s, part_x, part_tan, segments, n_segments);
|
|
25
|
+
if (n_hit==0){
|
|
26
|
+
// No crossing
|
|
27
|
+
free(s);
|
|
28
|
+
return S_MAX;
|
|
29
|
+
}
|
|
30
|
+
double result = s[0];
|
|
31
|
+
free(s);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/*gpufun*/
|
|
36
|
+
double get_s_of_crossing_after_s(double part_x, double part_tan, Segment* segments, \
|
|
37
|
+
int8_t n_segments, double current_s){
|
|
38
|
+
int8_t n_hit = 0;
|
|
39
|
+
double* s = (double*) malloc(XC_MAX_CROSS_PER_SEGMENT*n_segments*sizeof(double));
|
|
40
|
+
find_crossing(&n_hit, s, part_x, part_tan, segments, n_segments);
|
|
41
|
+
for (int8_t i=0; i<n_hit; i++){
|
|
42
|
+
if (s[i] >= current_s){
|
|
43
|
+
double result = s[i];
|
|
44
|
+
free(s);
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// No crossing
|
|
49
|
+
free(s);
|
|
50
|
+
return S_MAX;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/*gpufun*/
|
|
54
|
+
double get_s_of_first_crossing_with_vlimit(double part_x, double part_tan_x, \
|
|
55
|
+
double part_y, double part_tan_y, Segment* segments, \
|
|
56
|
+
int8_t n_segments, double y_min, double y_max){
|
|
57
|
+
int8_t n_hit = 0;
|
|
58
|
+
double* s = (double*) malloc(XC_MAX_CROSS_PER_SEGMENT*n_segments*sizeof(double));
|
|
59
|
+
find_crossing_with_vlimit(&n_hit, s, part_x, part_tan_x, part_y, part_tan_y, \
|
|
60
|
+
segments, n_segments, y_min, y_max);
|
|
61
|
+
if (n_hit==0){
|
|
62
|
+
// No crossing
|
|
63
|
+
free(s);
|
|
64
|
+
return S_MAX;
|
|
65
|
+
}
|
|
66
|
+
double result = s[0];
|
|
67
|
+
free(s);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/*gpufun*/
|
|
72
|
+
double get_s_of_crossing_after_s_with_vlimit(double part_x, double part_tan_x, \
|
|
73
|
+
double part_y, double part_tan_y, Segment* segments, \
|
|
74
|
+
int8_t n_segments, double y_min, double y_max, double current_s){
|
|
75
|
+
int8_t n_hit = 0;
|
|
76
|
+
double* s = (double*) malloc(XC_MAX_CROSS_PER_SEGMENT*n_segments*sizeof(double));
|
|
77
|
+
find_crossing_with_vlimit(&n_hit, s, part_x, part_tan_x, part_y, part_tan_y, \
|
|
78
|
+
segments, n_segments, y_min, y_max);
|
|
79
|
+
for (int8_t i=0; i<n_hit; i++){
|
|
80
|
+
if (s[i] >= current_s){
|
|
81
|
+
double result = s[i];
|
|
82
|
+
free(s);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// No crossing
|
|
87
|
+
free(s);
|
|
88
|
+
return S_MAX;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
#endif /* XCOLL_GEOM_GET_S_H */
|