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