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
|
@@ -9,6 +9,21 @@
|
|
|
9
9
|
#include <stdio.h>
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
/*gpufun*/
|
|
13
|
+
int8_t EverestBlockData_get_record_impacts(EverestBlockData el){
|
|
14
|
+
return EverestBlockData_get__record_interactions(el) % 2;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/*gpufun*/
|
|
18
|
+
int8_t EverestBlockData_get_record_exits(EverestBlockData el){
|
|
19
|
+
return (EverestBlockData_get__record_interactions(el) >> 1) % 2;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/*gpufun*/
|
|
23
|
+
int8_t EverestBlockData_get_record_scatterings(EverestBlockData el){
|
|
24
|
+
return (EverestBlockData_get__record_interactions(el) >> 2) % 2;
|
|
25
|
+
}
|
|
26
|
+
|
|
12
27
|
/*gpufun*/
|
|
13
28
|
void EverestBlock_set_material(EverestBlockData el){
|
|
14
29
|
MaterialData material = EverestBlockData_getp__material(el);
|
|
@@ -38,8 +53,10 @@ EverestCollData EverestBlock_init(EverestBlockData el, LocalParticle* part0, int
|
|
|
38
53
|
// Impact table
|
|
39
54
|
coll->record = EverestBlockData_getp_internal_record(el, part0);
|
|
40
55
|
coll->record_index = NULL;
|
|
56
|
+
coll->record_scatterings = 0;
|
|
41
57
|
if (coll->record){
|
|
42
|
-
coll->record_index =
|
|
58
|
+
coll->record_index = InteractionRecordData_getp__index(coll->record);
|
|
59
|
+
coll->record_scatterings = EverestBlockData_get_record_scatterings(el);
|
|
43
60
|
}
|
|
44
61
|
}
|
|
45
62
|
|
|
@@ -68,7 +85,8 @@ EverestData EverestBlock_init_data(LocalParticle* part, EverestCollData coll){
|
|
|
68
85
|
/*gpufun*/
|
|
69
86
|
void EverestBlock_track_local_particle(EverestBlockData el, LocalParticle* part0) {
|
|
70
87
|
int8_t active = EverestBlockData_get__tracking(el);
|
|
71
|
-
|
|
88
|
+
active *= EverestBlockData_get_active(el);
|
|
89
|
+
double const length = EverestBlockData_get_length(el);
|
|
72
90
|
|
|
73
91
|
// Initialise collimator data
|
|
74
92
|
// TODO: we want this to happen before tracking (instead of every turn), as a separate kernel
|
|
@@ -84,43 +102,54 @@ void EverestBlock_track_local_particle(EverestBlockData el, LocalParticle* part0
|
|
|
84
102
|
int8_t is_valid = xcoll_check_particle_init(coll->rng, part);
|
|
85
103
|
|
|
86
104
|
if (is_valid) {
|
|
87
|
-
|
|
88
|
-
double
|
|
89
|
-
|
|
105
|
+
// Store s-location of start of block
|
|
106
|
+
double s_block = LocalParticle_get_s(part);
|
|
107
|
+
LocalParticle_set_s(part, 0);
|
|
108
|
+
|
|
109
|
+
// Store initial coordinates for updating later
|
|
110
|
+
double const e0 = LocalParticle_get_energy0(part);
|
|
111
|
+
double const p0 = LocalParticle_get_p0c(part);
|
|
112
|
+
double const ptau_in = LocalParticle_get_ptau(part);
|
|
113
|
+
double const rvv_in = LocalParticle_get_rvv(part);
|
|
114
|
+
#ifdef XCOLL_USE_EXACT
|
|
115
|
+
double const xp_in = LocalParticle_get_exact_xp(part);
|
|
116
|
+
double const yp_in = LocalParticle_get_exact_yp(part);
|
|
117
|
+
#else
|
|
118
|
+
double const xp_in = LocalParticle_get_xp(part);
|
|
119
|
+
double const yp_in = LocalParticle_get_yp(part);
|
|
120
|
+
#endif
|
|
121
|
+
double const zeta_in = LocalParticle_get_zeta(part);
|
|
90
122
|
double const mass_ratio = LocalParticle_get_charge_ratio(part) / LocalParticle_get_chi(part); // m/m0
|
|
91
|
-
double energy
|
|
92
|
-
int is_abs = 0;
|
|
93
|
-
double const rpp_in = LocalParticle_get_rpp(part);
|
|
94
|
-
double const rvv_in = LocalParticle_get_rvv(part);
|
|
95
|
-
double const px_in = LocalParticle_get_px(part);
|
|
96
|
-
double const py_in = LocalParticle_get_py(part);
|
|
97
|
-
|
|
98
|
-
double* result = jaw(everest, part, energy, length, 0);
|
|
99
|
-
energy = result[0];
|
|
100
|
-
if (result[1] == 1){ is_abs = 1; }
|
|
101
|
-
double s_out = result[2];
|
|
102
|
-
free(result);
|
|
103
|
-
free(everest);
|
|
123
|
+
double energy = (p0*ptau_in + e0) * mass_ratio;
|
|
104
124
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
125
|
+
EverestData everest = EverestBlock_init_data(part, coll);
|
|
126
|
+
energy = jaw(everest, part, energy, length, 0);
|
|
127
|
+
free(everest);
|
|
128
|
+
LocalParticle_add_to_s(part, s_block);
|
|
129
|
+
|
|
130
|
+
LocalParticle_set_zeta(part, zeta_in);
|
|
131
|
+
// Survived particles need correcting:
|
|
132
|
+
if (LocalParticle_get_state(part)>0){
|
|
133
|
+
// Update energy
|
|
134
|
+
double ptau_out = (energy/mass_ratio - e0) / p0;
|
|
135
|
+
LocalParticle_update_ptau(part, ptau_out);
|
|
136
|
+
// Update zeta
|
|
137
|
+
#ifdef XCOLL_USE_EXACT
|
|
138
|
+
double xp = LocalParticle_get_exact_xp(part);
|
|
139
|
+
double yp = LocalParticle_get_exact_yp(part);
|
|
140
|
+
#else
|
|
141
|
+
double xp = LocalParticle_get_xp(part);
|
|
142
|
+
double yp = LocalParticle_get_yp(part);
|
|
143
|
+
#endif
|
|
110
144
|
double rvv = LocalParticle_get_rvv(part);
|
|
111
|
-
double rpp = LocalParticle_get_rpp(part);
|
|
112
145
|
// First we drift half the length with the old angles:
|
|
113
|
-
LocalParticle_add_to_zeta(part, drift_zeta_single(rvv_in,
|
|
146
|
+
LocalParticle_add_to_zeta(part, drift_zeta_single(rvv_in, xp_in, yp_in, length/2) );
|
|
114
147
|
// then half the length with the new angles:
|
|
115
|
-
LocalParticle_add_to_zeta(part, drift_zeta_single(rvv,
|
|
116
|
-
} else {
|
|
117
|
-
LocalParticle_set_s(part, s_out);
|
|
118
|
-
LocalParticle_set_state(part, XC_LOST_ON_EVEREST_BLOCK);
|
|
148
|
+
LocalParticle_add_to_zeta(part, drift_zeta_single(rvv, xp, yp, length/2) );
|
|
119
149
|
}
|
|
120
150
|
}
|
|
121
151
|
}
|
|
122
152
|
//end_per_particle_block
|
|
123
|
-
|
|
124
153
|
free(coll);
|
|
125
154
|
}
|
|
126
155
|
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
// copyright ############################### #
|
|
2
|
+
// This file is part of the Xcoll Package. #
|
|
3
|
+
// Copyright (c) CERN, 2024. #
|
|
4
|
+
// ######################################### #
|
|
5
|
+
|
|
6
|
+
#ifndef XCOLL_EVEREST_COLL_H
|
|
7
|
+
#define XCOLL_EVEREST_COLL_H
|
|
8
|
+
#include <math.h>
|
|
9
|
+
#include <stdio.h>
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
/*gpufun*/
|
|
13
|
+
int8_t EverestCollimatorData_get_record_impacts(EverestCollimatorData el){
|
|
14
|
+
return EverestCollimatorData_get__record_interactions(el) % 2;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/*gpufun*/
|
|
18
|
+
int8_t EverestCollimatorData_get_record_exits(EverestCollimatorData el){
|
|
19
|
+
return (EverestCollimatorData_get__record_interactions(el) >> 1) % 2;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/*gpufun*/
|
|
23
|
+
int8_t EverestCollimatorData_get_record_scatterings(EverestCollimatorData el){
|
|
24
|
+
return (EverestCollimatorData_get__record_interactions(el) >> 2) % 2;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
void EverestCollimator_set_material(EverestCollimatorData el){
|
|
28
|
+
MaterialData material = EverestCollimatorData_getp__material(el);
|
|
29
|
+
RandomRutherfordData rng = EverestCollimatorData_getp_rutherford_rng(el);
|
|
30
|
+
RandomRutherford_set_by_xcoll_material(rng, (GeneralMaterialData) material);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
/*gpufun*/
|
|
35
|
+
CollimatorGeometry EverestCollimator_init_geometry(EverestCollimatorData el, LocalParticle* part0, int8_t active){
|
|
36
|
+
CollimatorGeometry cg = (CollimatorGeometry) malloc(sizeof(CollimatorGeometry_));
|
|
37
|
+
if (active){ // This is needed in order to avoid that the initialisation is called during a twiss!
|
|
38
|
+
// Jaw corners (with tilts)
|
|
39
|
+
cg->jaw_LU = EverestCollimatorData_get__jaw_LU(el);
|
|
40
|
+
cg->jaw_RU = EverestCollimatorData_get__jaw_RU(el);
|
|
41
|
+
// Get angles of jaws
|
|
42
|
+
cg->sin_zL = EverestCollimatorData_get__sin_zL(el);
|
|
43
|
+
cg->cos_zL = EverestCollimatorData_get__cos_zL(el);
|
|
44
|
+
cg->sin_zR = EverestCollimatorData_get__sin_zR(el);
|
|
45
|
+
cg->cos_zR = EverestCollimatorData_get__cos_zR(el);
|
|
46
|
+
cg->sin_zDiff = EverestCollimatorData_get__sin_zDiff(el);
|
|
47
|
+
cg->cos_zDiff = EverestCollimatorData_get__cos_zDiff(el);
|
|
48
|
+
cg->jaws_parallel = EverestCollimatorData_get__jaws_parallel(el);
|
|
49
|
+
// Tilts
|
|
50
|
+
cg->sin_yL = EverestCollimatorData_get__sin_yL(el);
|
|
51
|
+
cg->cos_yL = EverestCollimatorData_get__cos_yL(el);
|
|
52
|
+
cg->sin_yR = EverestCollimatorData_get__sin_yR(el);
|
|
53
|
+
cg->cos_yR = EverestCollimatorData_get__cos_yR(el);
|
|
54
|
+
// Length and segments
|
|
55
|
+
cg->length = EverestCollimatorData_get_length(el);
|
|
56
|
+
cg->side = EverestCollimatorData_get__side(el);
|
|
57
|
+
double s_U, s_D, x_D;
|
|
58
|
+
if (cg->side != -1){
|
|
59
|
+
s_U = cg->length/2 * (1-cg->cos_yL);
|
|
60
|
+
s_D = cg->length/2 * (1+cg->cos_yL);
|
|
61
|
+
x_D = EverestCollimatorData_get__jaw_LD(el);
|
|
62
|
+
cg->segments_L = create_jaw(s_U, cg->jaw_LU, s_D, x_D, cg->sin_yL/cg->cos_yL, 1);
|
|
63
|
+
}
|
|
64
|
+
if (cg->side != 1){
|
|
65
|
+
s_U = cg->length/2 * (1-cg->cos_yR);
|
|
66
|
+
s_D = cg->length/2 * (1+cg->cos_yR);
|
|
67
|
+
x_D = EverestCollimatorData_get__jaw_RD(el);
|
|
68
|
+
cg->segments_R = create_jaw(s_U, cg->jaw_RU, s_D, x_D, cg->sin_yR/cg->cos_yR, -1);
|
|
69
|
+
}
|
|
70
|
+
// Impact table
|
|
71
|
+
cg->record = EverestCollimatorData_getp_internal_record(el, part0);
|
|
72
|
+
cg->record_index = NULL;
|
|
73
|
+
cg->record_impacts = 0;
|
|
74
|
+
cg->record_exits = 0;
|
|
75
|
+
if (cg->record){
|
|
76
|
+
cg->record_index = InteractionRecordData_getp__index(cg->record);
|
|
77
|
+
cg->record_impacts = EverestCollimatorData_get_record_impacts(el);
|
|
78
|
+
cg->record_exits = EverestCollimatorData_get_record_exits(el);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return cg;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/*gpufun*/
|
|
86
|
+
void EverestCollimator_free(CollimatorGeometry restrict cg, int8_t active){
|
|
87
|
+
if (active){
|
|
88
|
+
if (cg->side != -1){
|
|
89
|
+
destroy_jaw(cg->segments_L);
|
|
90
|
+
}
|
|
91
|
+
if (cg->side != 1){
|
|
92
|
+
destroy_jaw(cg->segments_R);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
free(cg);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
// TODO: it would be great if we could set EverestData as an xofield, because then we could
|
|
100
|
+
// run this function at creation of the collimator instead of every turn
|
|
101
|
+
// Hmmmm this should be called whenever we change an xofield
|
|
102
|
+
/*gpufun*/
|
|
103
|
+
EverestCollData EverestCollimator_init(EverestCollimatorData el, LocalParticle* part0, int8_t active){
|
|
104
|
+
EverestCollData coll = (EverestCollData) malloc(sizeof(EverestCollData_));
|
|
105
|
+
if (active){ // This is needed in order to avoid that the initialisation is called during a twiss!
|
|
106
|
+
// Random generator and material
|
|
107
|
+
coll->rng = EverestCollimatorData_getp_rutherford_rng(el);
|
|
108
|
+
MaterialData material = EverestCollimatorData_getp__material(el);
|
|
109
|
+
coll->exenergy = MaterialData_get_excitation_energy(material)*1.0e3; // MeV
|
|
110
|
+
coll->rho = MaterialData_get_density(material);
|
|
111
|
+
coll->anuc = MaterialData_get_A(material);
|
|
112
|
+
coll->zatom = MaterialData_get_Z(material);
|
|
113
|
+
coll->bnref = MaterialData_get_nuclear_elastic_slope(material);
|
|
114
|
+
coll->radl = MaterialData_get_radiation_length(material);
|
|
115
|
+
coll->csref[0] = MaterialData_get_cross_section(material, 0);
|
|
116
|
+
coll->csref[1] = MaterialData_get_cross_section(material, 1);
|
|
117
|
+
coll->csref[5] = MaterialData_get_cross_section(material, 5);
|
|
118
|
+
coll->only_mcs = MaterialData_get__only_mcs(material);
|
|
119
|
+
// Impact table: need it here to record interactions
|
|
120
|
+
coll->record = EverestCollimatorData_getp_internal_record(el, part0);
|
|
121
|
+
coll->record_index = NULL;
|
|
122
|
+
coll->record_scatterings = 0;
|
|
123
|
+
if (coll->record){
|
|
124
|
+
coll->record_index = InteractionRecordData_getp__index(coll->record);
|
|
125
|
+
coll->record_scatterings = EverestCollimatorData_get_record_scatterings(el);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return coll;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
/*gpufun*/
|
|
134
|
+
EverestData EverestCollimator_init_data(LocalParticle* part, EverestCollData coll){
|
|
135
|
+
EverestData everest = (EverestData) malloc(sizeof(EverestData_));
|
|
136
|
+
everest->coll = coll;
|
|
137
|
+
everest->rescale_scattering = 1;
|
|
138
|
+
#ifndef XCOLL_REFINE_ENERGY
|
|
139
|
+
// Preinitialise scattering parameters
|
|
140
|
+
double charge_ratio = LocalParticle_get_charge_ratio(part);
|
|
141
|
+
double mass_ratio = charge_ratio / LocalParticle_get_chi(part);
|
|
142
|
+
double energy = ( LocalParticle_get_ptau(part) + 1 / LocalParticle_get_beta0(part)
|
|
143
|
+
) * mass_ratio * LocalParticle_get_p0c(part) / 1e9; // energy in GeV
|
|
144
|
+
energy = LocalParticle_get_energy0(part) / 1e9;
|
|
145
|
+
calculate_scattering(everest, energy);
|
|
146
|
+
calculate_ionisation_properties(everest, energy);
|
|
147
|
+
#endif
|
|
148
|
+
return everest;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
/*gpufun*/
|
|
153
|
+
void EverestCollimator_track_local_particle(EverestCollimatorData el, LocalParticle* part0) {
|
|
154
|
+
int8_t active = EverestCollimatorData_get_active(el);
|
|
155
|
+
active *= EverestCollimatorData_get__tracking(el);
|
|
156
|
+
double const length = EverestCollimatorData_get_length(el);
|
|
157
|
+
|
|
158
|
+
// Initialise collimator data
|
|
159
|
+
// TODO: we want this to happen before tracking (instead of every turn), as a separate kernel
|
|
160
|
+
EverestCollData coll = EverestCollimator_init(el, part0, active);
|
|
161
|
+
CollimatorGeometry cg = EverestCollimator_init_geometry(el, part0, active);
|
|
162
|
+
|
|
163
|
+
//start_per_particle_block (part0->part)
|
|
164
|
+
if (!active){
|
|
165
|
+
// Drift full length
|
|
166
|
+
Drift_single_particle(part, length);
|
|
167
|
+
|
|
168
|
+
} else {
|
|
169
|
+
// Check collimator initialisation
|
|
170
|
+
int8_t is_valid = xcoll_check_particle_init(coll->rng, part);
|
|
171
|
+
|
|
172
|
+
if (is_valid) {
|
|
173
|
+
// Store s-location of start of collimator
|
|
174
|
+
double const s_coll = LocalParticle_get_s(part);
|
|
175
|
+
LocalParticle_set_s(part, 0);
|
|
176
|
+
|
|
177
|
+
// Store initial coordinates for updating later
|
|
178
|
+
double const e0 = LocalParticle_get_energy0(part);
|
|
179
|
+
double const p0 = LocalParticle_get_p0c(part);
|
|
180
|
+
double const ptau_in = LocalParticle_get_ptau(part);
|
|
181
|
+
double const rvv_in = LocalParticle_get_rvv(part);
|
|
182
|
+
#ifdef XCOLL_USE_EXACT
|
|
183
|
+
double const xp_in = LocalParticle_get_exact_xp(part);
|
|
184
|
+
double const yp_in = LocalParticle_get_exact_yp(part);
|
|
185
|
+
#else
|
|
186
|
+
double const xp_in = LocalParticle_get_xp(part);
|
|
187
|
+
double const yp_in = LocalParticle_get_yp(part);
|
|
188
|
+
#endif
|
|
189
|
+
double const zeta_in = LocalParticle_get_zeta(part);
|
|
190
|
+
double const mass_ratio = LocalParticle_get_charge_ratio(part) / LocalParticle_get_chi(part); // m/m0
|
|
191
|
+
double energy = (p0*ptau_in + e0) * mass_ratio;
|
|
192
|
+
|
|
193
|
+
// Check if hit on jaws
|
|
194
|
+
int8_t is_hit = hit_jaws_check_and_transform(part, cg);
|
|
195
|
+
|
|
196
|
+
if (is_hit != 0) {
|
|
197
|
+
// Hit one of the jaws, so scatter
|
|
198
|
+
double remaining_length = length - LocalParticle_get_s(part);
|
|
199
|
+
// Scatter
|
|
200
|
+
EverestData everest = EverestCollimator_init_data(part, coll);
|
|
201
|
+
energy = jaw(everest, part, energy, remaining_length, 1);
|
|
202
|
+
free(everest);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Transform back to the lab frame
|
|
206
|
+
hit_jaws_transform_back(is_hit, part, cg);
|
|
207
|
+
LocalParticle_add_to_s(part, s_coll);
|
|
208
|
+
|
|
209
|
+
LocalParticle_set_zeta(part, zeta_in);
|
|
210
|
+
// Hit and survived particles need correcting:
|
|
211
|
+
if (is_hit!=0 && LocalParticle_get_state(part)>0){
|
|
212
|
+
// Update energy
|
|
213
|
+
double ptau_out = (energy/mass_ratio - e0) / p0;
|
|
214
|
+
LocalParticle_update_ptau(part, ptau_out);
|
|
215
|
+
// Update zeta
|
|
216
|
+
#ifdef XCOLL_USE_EXACT
|
|
217
|
+
double xp = LocalParticle_get_exact_xp(part);
|
|
218
|
+
double yp = LocalParticle_get_exact_yp(part);
|
|
219
|
+
#else
|
|
220
|
+
double xp = LocalParticle_get_xp(part);
|
|
221
|
+
double yp = LocalParticle_get_yp(part);
|
|
222
|
+
#endif
|
|
223
|
+
double rvv = LocalParticle_get_rvv(part);
|
|
224
|
+
// First we drift half the length with the old angles:
|
|
225
|
+
LocalParticle_add_to_zeta(part, drift_zeta_single(rvv_in, xp_in, yp_in, length/2) );
|
|
226
|
+
// then half the length with the new angles:
|
|
227
|
+
LocalParticle_add_to_zeta(part, drift_zeta_single(rvv, xp, yp, length/2) );
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//end_per_particle_block
|
|
232
|
+
EverestCollimator_free(cg, active);
|
|
233
|
+
free(coll);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
#endif /* XCOLL_EVEREST_COLL_H */
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
// copyright ############################### #
|
|
2
|
+
// This file is part of the Xcoll Package. #
|
|
3
|
+
// Copyright (c) CERN, 2024. #
|
|
4
|
+
// ######################################### #
|
|
5
|
+
|
|
6
|
+
#ifndef XCOLL_EVEREST_CRYSTAL_H
|
|
7
|
+
#define XCOLL_EVEREST_CRYSTAL_H
|
|
8
|
+
#include <math.h>
|
|
9
|
+
#include <stdio.h>
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
/*gpufun*/
|
|
13
|
+
int8_t EverestCrystalData_get_record_impacts(EverestCrystalData el){
|
|
14
|
+
return EverestCrystalData_get__record_interactions(el) % 2;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/*gpufun*/
|
|
18
|
+
int8_t EverestCrystalData_get_record_exits(EverestCrystalData el){
|
|
19
|
+
return (EverestCrystalData_get__record_interactions(el) >> 1) % 2;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/*gpufun*/
|
|
23
|
+
int8_t EverestCrystalData_get_record_scatterings(EverestCrystalData el){
|
|
24
|
+
return (EverestCrystalData_get__record_interactions(el) >> 2) % 2;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
void EverestCrystal_set_material(EverestCrystalData el){
|
|
29
|
+
CrystalMaterialData material = EverestCrystalData_getp__material(el);
|
|
30
|
+
RandomRutherfordData rng = EverestCrystalData_getp_rutherford_rng(el);
|
|
31
|
+
RandomRutherford_set_by_xcoll_material(rng, (GeneralMaterialData) material);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
/*gpufun*/
|
|
36
|
+
CrystalGeometry EverestCrystal_init_geometry(EverestCrystalData el, LocalParticle* part0, int8_t active){
|
|
37
|
+
CrystalGeometry cg = (CrystalGeometry) malloc(sizeof(CrystalGeometry_));
|
|
38
|
+
if (active){ // This is needed in order to avoid that the initialisation is called during a twiss!
|
|
39
|
+
cg->length = EverestCrystalData_get_length(el);
|
|
40
|
+
cg->side = EverestCrystalData_get__side(el);
|
|
41
|
+
if (cg->side == 0){
|
|
42
|
+
kill_all_particles(part0, XC_ERR_INVALID_XOFIELD);
|
|
43
|
+
return cg;
|
|
44
|
+
}
|
|
45
|
+
double R = EverestCrystalData_get__bending_radius(el);
|
|
46
|
+
double t_R = EverestCrystalData_get__bending_angle(el);
|
|
47
|
+
cg->bending_radius = R;
|
|
48
|
+
cg->bending_angle = t_R;
|
|
49
|
+
cg->miscut_angle = EverestCrystalData_get_miscut(el);
|
|
50
|
+
cg->width = EverestCrystalData_get_width(el);
|
|
51
|
+
cg->height = EverestCrystalData_get_height(el);
|
|
52
|
+
cg->jaw_U = EverestCrystalData_get__jaw_U(el);
|
|
53
|
+
cg->sin_z = EverestCrystalData_get__sin_z(el);
|
|
54
|
+
cg->cos_z = EverestCrystalData_get__cos_z(el);
|
|
55
|
+
cg->sin_y = EverestCrystalData_get__sin_y(el);
|
|
56
|
+
cg->cos_y = EverestCrystalData_get__cos_y(el);
|
|
57
|
+
// Segments
|
|
58
|
+
if (cg->side == 1){
|
|
59
|
+
cg->segments = create_crystal(cg->bending_radius, cg->width, cg->length, cg->jaw_U, \
|
|
60
|
+
cg->sin_y, cg->cos_y);
|
|
61
|
+
} else if (cg->side == -1){
|
|
62
|
+
// jaw_U is the inner corner (shifted if right-sided crystal)
|
|
63
|
+
cg->segments = create_crystal(cg->bending_radius, cg->width, cg->length, cg->jaw_U - cg->width, \
|
|
64
|
+
cg->sin_y, cg->cos_y);
|
|
65
|
+
}
|
|
66
|
+
// Bend centre
|
|
67
|
+
cg->s_B = 0;
|
|
68
|
+
cg->x_B = cg->bending_radius;
|
|
69
|
+
// Miscut centre
|
|
70
|
+
cg->s_P = -R*sin(cg->miscut_angle);
|
|
71
|
+
cg->x_P = R*cos(cg->miscut_angle);
|
|
72
|
+
if (cg->side == 1 && R < 0){
|
|
73
|
+
// If R<0, a left-sided crystal bends towards the beam
|
|
74
|
+
cg->x_P = cg->x_P + cg->width;
|
|
75
|
+
cg->x_B = cg->x_B + cg->width;
|
|
76
|
+
} else if (cg->side == -1 && R > 0){
|
|
77
|
+
// If R>0, a right-sided crystal bends towards the beam
|
|
78
|
+
cg->x_P = cg->x_P - cg->width;
|
|
79
|
+
cg->x_B = cg->x_B - cg->width;
|
|
80
|
+
}
|
|
81
|
+
if (cg->side == -1){
|
|
82
|
+
// Mirror the crystal geometry
|
|
83
|
+
cg->bending_radius = -cg->bending_radius;
|
|
84
|
+
cg->bending_angle = -cg->bending_angle;
|
|
85
|
+
cg->miscut_angle = -cg->miscut_angle;
|
|
86
|
+
cg->x_P = -cg->x_P;
|
|
87
|
+
cg->x_B = -cg->x_B;
|
|
88
|
+
}
|
|
89
|
+
// From here on, crystal geometry parameters can always be treated as left-sided.
|
|
90
|
+
// Note that the segments are not mirrored, which is fine as get_s_of_first_crossing_with_vlimit
|
|
91
|
+
// is absolute (not in the jaw reference frame). It is only after a hit is registered, that we
|
|
92
|
+
// need to transform the particle to the jaw reference frame.
|
|
93
|
+
double Rb;
|
|
94
|
+
if (cg->miscut_angle > 0){
|
|
95
|
+
Rb = R - cg->width;
|
|
96
|
+
} else {
|
|
97
|
+
Rb = R;
|
|
98
|
+
}
|
|
99
|
+
cg->t_VImax = atan( (Rb*sin(t_R) - cg->s_P) / (R - Rb*cos(t_R) - cg->x_P) );
|
|
100
|
+
// Impact table
|
|
101
|
+
cg->record = EverestCrystalData_getp_internal_record(el, part0);
|
|
102
|
+
cg->record_index = NULL;
|
|
103
|
+
cg->record_impacts = 0;
|
|
104
|
+
cg->record_exits = 0;
|
|
105
|
+
if (cg->record){
|
|
106
|
+
cg->record_index = InteractionRecordData_getp__index(cg->record);
|
|
107
|
+
cg->record_impacts = EverestCrystalData_get_record_impacts(el);
|
|
108
|
+
cg->record_exits = EverestCrystalData_get_record_exits(el);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return cg;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/*gpufun*/
|
|
116
|
+
void EverestCrystal_free(CrystalGeometry restrict cg, int8_t active){
|
|
117
|
+
if (active){
|
|
118
|
+
destroy_crystal(cg->segments);
|
|
119
|
+
}
|
|
120
|
+
free(cg);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
// TODO: it would be great if we could set EverestData as an xofield, because then we could
|
|
125
|
+
// run this function at creation of the collimator instead of every turn
|
|
126
|
+
/*gpufun*/
|
|
127
|
+
EverestCollData EverestCrystal_init(EverestCrystalData el, LocalParticle* part0, int8_t active){
|
|
128
|
+
EverestCollData coll = (EverestCollData) malloc(sizeof(EverestCollData_));
|
|
129
|
+
if (active){ // This is needed in order to avoid that the initialisation is called during a twiss!
|
|
130
|
+
// Random generator and material
|
|
131
|
+
coll->rng = EverestCrystalData_getp_rutherford_rng(el);
|
|
132
|
+
CrystalMaterialData material = EverestCrystalData_getp__material(el);
|
|
133
|
+
coll->exenergy = CrystalMaterialData_get_excitation_energy(material)*1.0e3; // MeV
|
|
134
|
+
coll->rho = CrystalMaterialData_get_density(material);
|
|
135
|
+
coll->anuc = CrystalMaterialData_get_A(material);
|
|
136
|
+
coll->zatom = CrystalMaterialData_get_Z(material);
|
|
137
|
+
coll->bnref = CrystalMaterialData_get_nuclear_elastic_slope(material);
|
|
138
|
+
coll->csref[0] = CrystalMaterialData_get_cross_section(material, 0);
|
|
139
|
+
coll->csref[1] = CrystalMaterialData_get_cross_section(material, 1);
|
|
140
|
+
coll->csref[5] = CrystalMaterialData_get_cross_section(material, 5);
|
|
141
|
+
coll->dlri = CrystalMaterialData_get_crystal_radiation_length(material);
|
|
142
|
+
coll->dlyi = CrystalMaterialData_get_crystal_nuclear_length(material);
|
|
143
|
+
coll->ai = CrystalMaterialData_get_crystal_plane_distance(material);
|
|
144
|
+
coll->eum = CrystalMaterialData_get_crystal_potential(material);
|
|
145
|
+
coll->collnt = CrystalMaterialData_get_nuclear_collision_length(material);
|
|
146
|
+
coll->eta = 0.9; // Hard-coded channeling saturation factor
|
|
147
|
+
coll->orient = EverestCrystalData_get__orient(el);
|
|
148
|
+
// Impact table
|
|
149
|
+
coll->record = EverestCrystalData_getp_internal_record(el, part0);
|
|
150
|
+
coll->record_index = NULL;
|
|
151
|
+
if (coll->record){
|
|
152
|
+
coll->record_index = InteractionRecordData_getp__index(coll->record);
|
|
153
|
+
coll->record_scatterings = EverestCrystalData_get_record_scatterings(el);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return coll;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
/*gpufun*/
|
|
161
|
+
EverestData EverestCrystal_init_data(LocalParticle* part, EverestCollData restrict coll, CrystalGeometry restrict cg){
|
|
162
|
+
EverestData everest = (EverestData) malloc(sizeof(EverestData_));
|
|
163
|
+
everest->coll = coll;
|
|
164
|
+
everest->rescale_scattering = 1;
|
|
165
|
+
#ifndef XCOLL_REFINE_ENERGY
|
|
166
|
+
// Preinitialise scattering parameters
|
|
167
|
+
double charge_ratio = LocalParticle_get_charge_ratio(part);
|
|
168
|
+
double mass_ratio = charge_ratio / LocalParticle_get_chi(part);
|
|
169
|
+
double energy = ( LocalParticle_get_ptau(part) + 1 / LocalParticle_get_beta0(part)
|
|
170
|
+
) * mass_ratio * LocalParticle_get_p0c(part) / 1e9; // energy in GeV
|
|
171
|
+
calculate_scattering(everest, energy);
|
|
172
|
+
calculate_ionisation_properties(everest, energy);
|
|
173
|
+
calculate_critical_angle(everest, part, cg, energy);
|
|
174
|
+
calculate_VI_parameters(everest, part, energy);
|
|
175
|
+
#endif
|
|
176
|
+
return everest;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
/*gpufun*/
|
|
181
|
+
void EverestCrystal_track_local_particle(EverestCrystalData el, LocalParticle* part0) {
|
|
182
|
+
int8_t active = EverestCrystalData_get_active(el);
|
|
183
|
+
active *= EverestCrystalData_get__tracking(el);
|
|
184
|
+
double length = EverestCrystalData_get_length(el);
|
|
185
|
+
|
|
186
|
+
// Initialise collimator data
|
|
187
|
+
// TODO: we want this to happen before tracking (instead of every turn), as a separate kernel
|
|
188
|
+
EverestCollData coll = EverestCrystal_init(el, part0, active);
|
|
189
|
+
CrystalGeometry cg = EverestCrystal_init_geometry(el, part0, active);
|
|
190
|
+
|
|
191
|
+
double t_c = 0;
|
|
192
|
+
|
|
193
|
+
//start_per_particle_block (part0->part)
|
|
194
|
+
if (!active){
|
|
195
|
+
// Drift full length
|
|
196
|
+
Drift_single_particle(part, length);
|
|
197
|
+
|
|
198
|
+
} else {
|
|
199
|
+
// Check collimator initialisation
|
|
200
|
+
int8_t is_valid = xcoll_check_particle_init(coll->rng, part);
|
|
201
|
+
|
|
202
|
+
if (is_valid) {
|
|
203
|
+
double const s_coll = LocalParticle_get_s(part);
|
|
204
|
+
LocalParticle_set_s(part, 0);
|
|
205
|
+
|
|
206
|
+
// Store initial coordinates for updating later
|
|
207
|
+
double const e0 = LocalParticle_get_energy0(part);
|
|
208
|
+
double const p0 = LocalParticle_get_p0c(part);
|
|
209
|
+
double const ptau_in = LocalParticle_get_ptau(part);
|
|
210
|
+
double const rvv_in = LocalParticle_get_rvv(part);
|
|
211
|
+
#ifdef XCOLL_USE_EXACT
|
|
212
|
+
double const xp_in = LocalParticle_get_exact_xp(part);
|
|
213
|
+
double const yp_in = LocalParticle_get_exact_yp(part);
|
|
214
|
+
#else
|
|
215
|
+
double const xp_in = LocalParticle_get_xp(part);
|
|
216
|
+
double const yp_in = LocalParticle_get_yp(part);
|
|
217
|
+
#endif
|
|
218
|
+
double const zeta_in = LocalParticle_get_zeta(part);
|
|
219
|
+
double const mass_ratio = LocalParticle_get_charge_ratio(part) / LocalParticle_get_chi(part); // m/m0
|
|
220
|
+
double energy = (p0*ptau_in + e0) * mass_ratio;
|
|
221
|
+
|
|
222
|
+
// Check if hit on jaws
|
|
223
|
+
int8_t is_hit = hit_crystal_check_and_transform(part, cg);
|
|
224
|
+
|
|
225
|
+
if (is_hit != 0) {
|
|
226
|
+
// Hit one of the jaws, so scatter
|
|
227
|
+
double remaining_length = length - LocalParticle_get_s(part);
|
|
228
|
+
// Scatter
|
|
229
|
+
EverestData everest = EverestCrystal_init_data(part0, coll, cg);
|
|
230
|
+
calculate_initial_angle(everest, part, cg);
|
|
231
|
+
#ifdef XCOLL_USE_EXACT
|
|
232
|
+
double const xp = LocalParticle_get_exact_xp(part);
|
|
233
|
+
#else
|
|
234
|
+
double const xp = LocalParticle_get_xp(part);
|
|
235
|
+
#endif
|
|
236
|
+
if (fabs(xp - everest->t_I) < everest->t_c) {
|
|
237
|
+
energy = Channel(everest, part, cg, energy/1.e9, remaining_length)*1.e9;
|
|
238
|
+
} else {
|
|
239
|
+
energy = Amorphous(everest, part, cg, energy/1.e9, remaining_length)*1.e9;
|
|
240
|
+
}
|
|
241
|
+
// Temporary workaround to store the critical angle for use later
|
|
242
|
+
calculate_critical_angle(everest, part, cg, e0/1.e9);
|
|
243
|
+
t_c = everest->t_c;
|
|
244
|
+
free(everest);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Transform back to the lab frame
|
|
248
|
+
hit_crystal_transform_back(is_hit, part, cg);
|
|
249
|
+
LocalParticle_add_to_s(part, s_coll);
|
|
250
|
+
|
|
251
|
+
LocalParticle_set_zeta(part, zeta_in);
|
|
252
|
+
// Hit and survived particles need correcting:
|
|
253
|
+
if (is_hit!=0 && LocalParticle_get_state(part)>0){
|
|
254
|
+
// Update energy
|
|
255
|
+
double ptau_out = (energy/mass_ratio - e0) / p0;
|
|
256
|
+
LocalParticle_update_ptau(part, ptau_out);
|
|
257
|
+
// Update zeta
|
|
258
|
+
#ifdef XCOLL_USE_EXACT
|
|
259
|
+
double xp = LocalParticle_get_exact_xp(part);
|
|
260
|
+
double yp = LocalParticle_get_exact_yp(part);
|
|
261
|
+
#else
|
|
262
|
+
double xp = LocalParticle_get_xp(part);
|
|
263
|
+
double yp = LocalParticle_get_yp(part);
|
|
264
|
+
#endif
|
|
265
|
+
double rvv = LocalParticle_get_rvv(part);
|
|
266
|
+
// First we drift half the length with the old angles:
|
|
267
|
+
LocalParticle_add_to_zeta(part, drift_zeta_single(rvv_in, xp_in, yp_in, length/2) );
|
|
268
|
+
// then half the length with the new angles:
|
|
269
|
+
LocalParticle_add_to_zeta(part, drift_zeta_single(rvv, xp, yp, length/2) );
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//end_per_particle_block
|
|
274
|
+
EverestCrystalData_set__critical_angle(el, t_c);
|
|
275
|
+
EverestCrystal_free(cg, active);
|
|
276
|
+
free(coll);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
#endif /* XCOLL_EVEREST_CRYSTAL_H */
|