simba-accelerator 0.3.0__tar.gz → 0.4.0__tar.gz
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.
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/PKG-INFO +1 -1
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/requirements.txt +1 -1
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/Generators.py +30 -22
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/aliases.yaml +2 -2
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/gpt.py +1 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Genesis/Genesis.py +168 -38
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework.py +17 -8
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework_objects.py +53 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/slice.py +1 -1
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/genesis.py +28 -7
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/opal.py +3 -3
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/openpmd.py +4 -1
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/plot.py +187 -0
- simba_accelerator-0.4.0/simba/Modules/Wavefronts/__init__.py +128 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/constants.py +2 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/xopt.py +16 -1
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/plotting.py +4 -3
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/PKG-INFO +1 -1
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/SOURCES.txt +1 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/scm_file_list.json +1 -0
- simba_accelerator-0.4.0/simba_accelerator.egg-info/scm_version.json +8 -0
- simba_accelerator-0.3.0/simba_accelerator.egg-info/scm_version.json +0 -8
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/.coverage +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/.github/workflows/python-publish.yml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/.gitignore +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/LICENSE +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/MANIFEST.in +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/Makefile +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/README.md +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/.venv/pyvenv.cfg +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/2.0 +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/=3.8 +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/Makefile +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/make.bat +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/rebuild.sh +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/requirements.txt +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/Framework.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/Framework_objects.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/SimCodes.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/assets/elegant-fodo.png +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/assets/ocelot-fodo.png +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/conf.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/examples/notebooks/CLA-S02-DIA-SCR-03.openpmd.hdf5 +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/examples/notebooks/beams_example.ipynb +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/examples/notebooks/getting_started.ipynb +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/examples/notebooks/utility_functions.ipynb +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/getting-started.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/index.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/installation.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/loading-a-lattice.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/modules.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/references.bib +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.ASTRA.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.CSRTrack.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Cheetah.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Elegant.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.GPT.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Generators.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.MAD8.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.OPAL.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Ocelot.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Xsuite.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Framework_objects.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Beams.Particles.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Beams.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Fields.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Matrices.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Twiss.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.optimisation.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.plotting.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.rst +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/CLA-S02-DIA-SCR-03.openpmd.hdf5 +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/beams_example.ipynb +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/getting_started.ipynb +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/params.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/utility_functions.ipynb +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/make.bat +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/meta.yml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/pyproject.toml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/readthedocs.yml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/setup.cfg +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/setup.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/.gitignore +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/ASTRA/ASTRA.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/ASTRA/ASTRARules.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/ASTRA/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/CSRTrack/CSRTrack.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/CSRTrack/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/CSRTrack/csrtrack_defaults.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Cheetah/Cheetah.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Cheetah/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Cheetah/cheetah_defaults.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/Elegant.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/commands_Elegant.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/elements_Elegant.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/keyword_conversion_rules_elegant.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Executables.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/GPT/GPT.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/GPT/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/astra.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/astra.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/elegant.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/gpt.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/keywords.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/opal.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/opal.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/species.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Genesis/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Genesis/commands_Genesis.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/OPAL/OPAL.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/OPAL/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/OPAL/commands_Opal.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/OPAL/globals_Opal.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/Ocelot.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/mbi.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/ocelot_defaults.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/savebeamopenpmd.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Wake_T/Wake_T.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Wake_T/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Xsuite/Xsuite.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Xsuite/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/type_conversion_rules.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Executables.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/FrameworkHelperFunctions.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework_Settings.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework_elements.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework_lattices.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/.gitignore +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/centroids.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/emittance.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/kde.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/minimumVolumeEllipse.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/mve.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/sigmas.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/twiss.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/astra.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/cheetah.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/gdf.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/hdf5.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/mad8.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/ocelot.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/sdds.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/vsim.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/wake_t.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/xsuite.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/FieldParameter.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/astra.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/gdf.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/hdf5.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/opal.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/sdds.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/MathParser.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Matrices/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Matrices/elegant.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Matrices/hdf5.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/SDDSFile.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/astra.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/cheetah.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/elegant.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/genesis.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/gpt.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/hdf5.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/ocelot.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/opal.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/plot.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/xsuite.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/gdf_beam.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/gdf_emit.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/id_number.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/id_number_server.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/merge_two_dicts.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/constraints.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/nelder_mead.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/optimiser.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/latticeDraw.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/multiAxisPlot.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/multiPlot.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/pmd_units.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/symmlinks.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/units.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Vision_Mission.docx +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/__init__.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/elementkeywords.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/hosts.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/yaml_checker.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/dependency_links.txt +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/requires.txt +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/top_level.txt +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/CLARA/Settings/250pC/1/constants.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/CLARA/src/FEBE_Simple_NM.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/CLARA/test.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/ISIS/LEBT/testing_SimFrame_LEBT.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/ISIS/MEBT/testing_SimFrame_MEBT.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/framework_test.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/twiss.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/xopt_example/example.yaml +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/xopt_test.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/.coverage +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_beam.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_field.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_framework.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_framework_lattice.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_framework_objects.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_generator.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_track.py +0 -0
- {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_twiss.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: simba-accelerator
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: A python framework for particle accelerator simulations
|
|
5
5
|
Author-email: James Jones <james.jones@stfc.ac.uk>
|
|
6
6
|
Maintainer-email: James Jones <james.jones@stfc.ac.uk>, Alex Brynes <alexander.brynes@stfc.ac.uk>, Mark Johnson <mark.johnson@stfc.ac.uk>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""
|
|
2
2
|
SIMBA Beam Generator module
|
|
3
3
|
|
|
4
4
|
This module defines a class for generating a beam distribution. The beam properties, code and number of particles
|
|
@@ -105,39 +105,39 @@ from easygdf import load
|
|
|
105
105
|
import warnings
|
|
106
106
|
|
|
107
107
|
with open(
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
os.path.dirname(os.path.abspath(__file__)) + "/astra.yaml",
|
|
109
|
+
"r",
|
|
110
110
|
) as infile:
|
|
111
111
|
astra_generator_keywords = yaml.safe_load(infile)
|
|
112
112
|
|
|
113
113
|
with open(
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
os.path.dirname(os.path.abspath(__file__)) + "/gpt.yaml",
|
|
115
|
+
"r",
|
|
116
116
|
) as infile:
|
|
117
117
|
gpt_generator_keywords = yaml.safe_load(infile)
|
|
118
118
|
|
|
119
119
|
with open(
|
|
120
|
-
|
|
121
|
-
|
|
120
|
+
os.path.dirname(os.path.abspath(__file__)) + "/elegant.yaml",
|
|
121
|
+
"r",
|
|
122
122
|
) as infile:
|
|
123
123
|
elegant_generator_keywords = {"defaults": {}}
|
|
124
124
|
elegant_generator_keywords.update(yaml.safe_load(infile))
|
|
125
125
|
|
|
126
126
|
with open(
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
os.path.dirname(os.path.abspath(__file__)) + "/opal.yaml",
|
|
128
|
+
"r",
|
|
129
129
|
) as infile:
|
|
130
130
|
opal_generator_keywords = yaml.safe_load(infile)
|
|
131
131
|
|
|
132
132
|
with open(
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
os.path.dirname(os.path.abspath(__file__)) + "/aliases.yaml",
|
|
134
|
+
"r",
|
|
135
135
|
) as infile:
|
|
136
136
|
aliases = yaml.safe_load(infile)
|
|
137
137
|
|
|
138
138
|
with open(
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
os.path.dirname(os.path.abspath(__file__)) + "/species.yaml",
|
|
140
|
+
"r",
|
|
141
141
|
) as infile:
|
|
142
142
|
code_species = yaml.safe_load(infile)
|
|
143
143
|
|
|
@@ -457,7 +457,6 @@ class frameworkGenerator(BaseModel):
|
|
|
457
457
|
generator_keywords: Dict = {}
|
|
458
458
|
"""Generator keywords from :class:`~simba.Framework.Framework` class"""
|
|
459
459
|
|
|
460
|
-
|
|
461
460
|
model_config = ConfigDict(
|
|
462
461
|
extra="allow",
|
|
463
462
|
arbitrary_types_allowed=True,
|
|
@@ -598,10 +597,10 @@ class frameworkGenerator(BaseModel):
|
|
|
598
597
|
"""
|
|
599
598
|
return float(
|
|
600
599
|
(
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
600
|
+
3
|
|
601
|
+
* self.thermal_emittance ** 2
|
|
602
|
+
* self.speed_of_light ** 2
|
|
603
|
+
* self.particle_mass
|
|
605
604
|
)
|
|
606
605
|
/ 2
|
|
607
606
|
/ self.elementary_charge
|
|
@@ -614,7 +613,7 @@ class frameworkGenerator(BaseModel):
|
|
|
614
613
|
"""
|
|
615
614
|
return self.name
|
|
616
615
|
|
|
617
|
-
def
|
|
616
|
+
def generate(self):
|
|
618
617
|
if self.initial_momentum <= 0:
|
|
619
618
|
raise ValueError("initial_momentum must be set to a non-zero value")
|
|
620
619
|
q_over_c = UnitValue(
|
|
@@ -642,6 +641,11 @@ class frameworkGenerator(BaseModel):
|
|
|
642
641
|
beam.Particles.t = UnitValue(abs(-z / constants.speed_of_light), units="s")
|
|
643
642
|
beam.Particles.set_total_charge(self.charge)
|
|
644
643
|
beam.set_species(self.species)
|
|
644
|
+
return beam
|
|
645
|
+
|
|
646
|
+
def write(self, beam=None):
|
|
647
|
+
if beam is None:
|
|
648
|
+
beam = self.generate()
|
|
645
649
|
rbf.openpmd.write_openpmd_beam_file(
|
|
646
650
|
beam,
|
|
647
651
|
self.global_parameters["master_subdir"] + "/" + self.filename,
|
|
@@ -765,8 +769,10 @@ class frameworkGenerator(BaseModel):
|
|
|
765
769
|
# }
|
|
766
770
|
# return latticedict
|
|
767
771
|
|
|
772
|
+
|
|
768
773
|
def poly_curve(x, coeffs):
|
|
769
|
-
return sum(c * x**i for i, c in enumerate(coeffs, start=1))
|
|
774
|
+
return sum(c * x ** i for i, c in enumerate(coeffs, start=1))
|
|
775
|
+
|
|
770
776
|
|
|
771
777
|
def sample_2d_gaussian_with_axis_cutoffs(N, mean, cov, cutoffs):
|
|
772
778
|
"""
|
|
@@ -789,8 +795,8 @@ def sample_2d_gaussian_with_axis_cutoffs(N, mean, cov, cutoffs):
|
|
|
789
795
|
|
|
790
796
|
# Apply per-axis cutoffs
|
|
791
797
|
mask = (
|
|
792
|
-
|
|
793
|
-
|
|
798
|
+
(np.abs(z_white[:, 0]) <= cutoffs[0]) &
|
|
799
|
+
(np.abs(z_white[:, 1]) <= cutoffs[1])
|
|
794
800
|
)
|
|
795
801
|
|
|
796
802
|
accepted = x[mask]
|
|
@@ -798,6 +804,7 @@ def sample_2d_gaussian_with_axis_cutoffs(N, mean, cov, cutoffs):
|
|
|
798
804
|
|
|
799
805
|
return np.array(samples[:N])
|
|
800
806
|
|
|
807
|
+
|
|
801
808
|
def sample_gaussian(offset, sigma, cutoff, size):
|
|
802
809
|
while True:
|
|
803
810
|
samples = np.random.normal(offset, sigma, size * 2)
|
|
@@ -805,6 +812,7 @@ def sample_gaussian(offset, sigma, cutoff, size):
|
|
|
805
812
|
if len(accepted) >= size:
|
|
806
813
|
return accepted[:size]
|
|
807
814
|
|
|
815
|
+
|
|
808
816
|
def sample_flat_top(offset, sigma, cutoff, edge_width, size):
|
|
809
817
|
"""
|
|
810
818
|
Create a flat-top distribution centered at 0,
|
|
@@ -60,7 +60,7 @@ aliases:
|
|
|
60
60
|
alias: sig_px
|
|
61
61
|
correlation_px:
|
|
62
62
|
alias: cor_px
|
|
63
|
-
multiplier:
|
|
63
|
+
multiplier: 1000000
|
|
64
64
|
distribution_type_y:
|
|
65
65
|
alias: dist_y
|
|
66
66
|
sigma_y:
|
|
@@ -70,7 +70,7 @@ aliases:
|
|
|
70
70
|
alias: sig_py
|
|
71
71
|
correlation_py:
|
|
72
72
|
alias: cor_py
|
|
73
|
-
multiplier:
|
|
73
|
+
multiplier: 1000000
|
|
74
74
|
distribution_type_px:
|
|
75
75
|
alias: dist_px
|
|
76
76
|
distribution_type_py:
|
|
@@ -492,6 +492,7 @@ setGBphidist("beam","u", 0, 2*pi);
|
|
|
492
492
|
HDF5filename = "laser.openpmd.hdf5"
|
|
493
493
|
else:
|
|
494
494
|
HDF5filename = self.filename
|
|
495
|
+
self.global_parameters["beam"].set_species(self.species)
|
|
495
496
|
rbf.openpmd.write_openpmd_beam_file(
|
|
496
497
|
self.global_parameters["beam"],
|
|
497
498
|
self.global_parameters["master_subdir"] + "/" + HDF5filename,
|
|
@@ -5,6 +5,14 @@ Various objects and functions to handle Genesis lattices and commands. See `Gene
|
|
|
5
5
|
|
|
6
6
|
.. _Genesis manual: https://github.com/svenreiche/Genesis-1.3-Version4/tree/master/manual
|
|
7
7
|
|
|
8
|
+
SASE and HGHG are currently supported, with HGHG running if a laser is associated with the first
|
|
9
|
+
undulator in the lattice. In this case, a chicane should also be defined after the first undulator in
|
|
10
|
+
the simulation configuration file. Harmonic conversion is calculated based on the strength of
|
|
11
|
+
the first undulator in the beamline after `<lattice>.split_element` which must also be passed
|
|
12
|
+
to the simulation configuration file.
|
|
13
|
+
|
|
14
|
+
Advanced schemes such as EEHG are not yet supported.
|
|
15
|
+
|
|
8
16
|
Classes:
|
|
9
17
|
- :class:`~simba.Codes.Genesis.Genesis.genesisLattice`: The Genesis lattice object, used for
|
|
10
18
|
creating a string representation of the lattice suitable for Genesis input and lattice files.
|
|
@@ -116,6 +124,7 @@ from ...Framework_objects import (
|
|
|
116
124
|
from ...FrameworkHelperFunctions import saveFile
|
|
117
125
|
from ...Modules import Beams as rbf
|
|
118
126
|
from typing import Dict, List, Literal
|
|
127
|
+
import h5py
|
|
119
128
|
|
|
120
129
|
command_files_order = [
|
|
121
130
|
"setup",
|
|
@@ -124,20 +133,38 @@ command_files_order = [
|
|
|
124
133
|
"profile_file",
|
|
125
134
|
"profile_const",
|
|
126
135
|
"profile_polynom",
|
|
127
|
-
"
|
|
136
|
+
"profile_gauss",
|
|
128
137
|
"field",
|
|
129
138
|
"importdistribution",
|
|
130
139
|
"importbeam",
|
|
131
140
|
"importfield",
|
|
132
141
|
"beam",
|
|
142
|
+
"track_first",
|
|
133
143
|
"alter_setup",
|
|
134
144
|
"alter_beam",
|
|
145
|
+
"field_2",
|
|
135
146
|
"sort",
|
|
136
147
|
"track",
|
|
137
148
|
"write",
|
|
138
149
|
"end",
|
|
139
150
|
]
|
|
140
151
|
|
|
152
|
+
beam_profile_properties = [
|
|
153
|
+
"betax",
|
|
154
|
+
"betay",
|
|
155
|
+
"alphax",
|
|
156
|
+
"alphay",
|
|
157
|
+
"gamma",
|
|
158
|
+
"delgam",
|
|
159
|
+
"current",
|
|
160
|
+
# "xcenter",
|
|
161
|
+
# "ycenter",
|
|
162
|
+
# "pxcenter",
|
|
163
|
+
# "pycenter",
|
|
164
|
+
"ex",
|
|
165
|
+
"ey"
|
|
166
|
+
]
|
|
167
|
+
|
|
141
168
|
class genesisLattice(frameworkLattice):
|
|
142
169
|
"""
|
|
143
170
|
Class for defining the Genesis lattice object, used for
|
|
@@ -192,7 +219,7 @@ class genesisLattice(frameworkLattice):
|
|
|
192
219
|
npart: int = None
|
|
193
220
|
"""Number of macro particles per slice; if not provided, calculate from the beam"""
|
|
194
221
|
|
|
195
|
-
nbins: int =
|
|
222
|
+
nbins: int = 16
|
|
196
223
|
"""Number of macro particles to be grouped into beamlets"""
|
|
197
224
|
|
|
198
225
|
seed: int = randint(1,10000000)
|
|
@@ -205,7 +232,7 @@ class genesisLattice(frameworkLattice):
|
|
|
205
232
|
field_power: float = 1e3
|
|
206
233
|
"""Initial power for :class:`~simba.Codes.Genesis.Genesis.genesis_field_command`"""
|
|
207
234
|
|
|
208
|
-
dgrid: float = 1e-
|
|
235
|
+
dgrid: float = 1e-3
|
|
209
236
|
"""Grid size for :class:`~simba.Codes.Genesis.Genesis.genesis_field_command`"""
|
|
210
237
|
|
|
211
238
|
ngrid: int = 251
|
|
@@ -228,6 +255,15 @@ class genesisLattice(frameworkLattice):
|
|
|
228
255
|
one4one: bool = False
|
|
229
256
|
"""If `True`, run in one-for-one mode; if not, use :attr:`~npart` and :attr:`~nbins`"""
|
|
230
257
|
|
|
258
|
+
chicanes: str | list = None
|
|
259
|
+
"""Names of chicanes in the beamline; these should be defined as `chicane` groups
|
|
260
|
+
in the simulation configuration file."""
|
|
261
|
+
|
|
262
|
+
split_element: str = None
|
|
263
|
+
"""Name of the element at which to split the lattice for hamonic conversion.
|
|
264
|
+
Only one split is currently allowed. Harmonic conversion is based on the strength of the
|
|
265
|
+
first undulator after the split."""
|
|
266
|
+
|
|
231
267
|
|
|
232
268
|
def model_post_init(self, __context):
|
|
233
269
|
super().model_post_init(__context)
|
|
@@ -250,7 +286,27 @@ class genesisLattice(frameworkLattice):
|
|
|
250
286
|
str
|
|
251
287
|
The lattice represented as a string compatible with Genesis
|
|
252
288
|
"""
|
|
253
|
-
|
|
289
|
+
chicane_dict = {}
|
|
290
|
+
if self.chicanes is not None:
|
|
291
|
+
if isinstance(self.chicanes, str):
|
|
292
|
+
self.chicanes = [self.chicanes]
|
|
293
|
+
for chicane in self.chicanes:
|
|
294
|
+
if chicane in self.groupObjects:
|
|
295
|
+
chicane_dict.update(
|
|
296
|
+
{
|
|
297
|
+
chicane: {
|
|
298
|
+
"start": self.groupObjects[chicane].elementObjects[0].name,
|
|
299
|
+
"end": self.groupObjects[chicane].elementObjects[-1].name,
|
|
300
|
+
"r56": self.groupObjects[chicane].r56,
|
|
301
|
+
"dipole_length": self.groupObjects[chicane].elementObjects[0].magnetic.length,
|
|
302
|
+
"drift_length": self.groupObjects[chicane].elementObjects[1].start.z -
|
|
303
|
+
self.groupObjects[chicane].elementObjects[0].end.z,
|
|
304
|
+
"length": self.groupObjects[chicane].elementObjects[-1].end.z -
|
|
305
|
+
self.groupObjects[chicane].elementObjects[0].start.z,
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
)
|
|
309
|
+
return self.section.to_genesis(split_element=self.split_element, chicanes=chicane_dict)
|
|
254
310
|
|
|
255
311
|
def write(self) -> None:
|
|
256
312
|
"""
|
|
@@ -308,13 +364,38 @@ class genesisLattice(frameworkLattice):
|
|
|
308
364
|
zmatch=self.match_location,
|
|
309
365
|
)
|
|
310
366
|
self.commandFiles["field"] = genesis_field_command(
|
|
311
|
-
power=self.
|
|
367
|
+
power=self.get_field_power(),
|
|
312
368
|
ngrid=self.ngrid,
|
|
313
369
|
dgrid=self.dgrid,
|
|
314
|
-
waist_size=self.
|
|
370
|
+
waist_size=self.get_waist_size(),
|
|
315
371
|
waist_pos=self.wigglers[0].physical.middle.z - self.startObject.physical.start.z
|
|
316
372
|
)
|
|
317
373
|
self.commandFiles["track"] = genesis_track_command()
|
|
374
|
+
if isinstance(self.split_element, str):
|
|
375
|
+
first_wiggler = None
|
|
376
|
+
for elem in self.elementObjects.values():
|
|
377
|
+
if elem.name == self.split_element:
|
|
378
|
+
continue
|
|
379
|
+
if elem.hardware_class.lower() == "wiggler":
|
|
380
|
+
first_wiggler = elem
|
|
381
|
+
break
|
|
382
|
+
if first_wiggler is None:
|
|
383
|
+
raise ValueError(f"No undulator found after split_element {self.split_element}")
|
|
384
|
+
gamma0 = self.global_parameters["beam"].beam.centroids.mean_gamma.val
|
|
385
|
+
lambda0_from_und = first_wiggler.period / (2 * gamma0 ** 2) * (1 + first_wiggler.normalized_strength ** 2)
|
|
386
|
+
harmonic_number = int(round(self.fundamental_wavelength / lambda0_from_und))
|
|
387
|
+
self.commandFiles["track_first"] = genesis_track_command()
|
|
388
|
+
self.commandFiles["alter_setup"] = genesis_alter_setup_command(
|
|
389
|
+
beamline=f"{self.objectname}_SPLIT_2",
|
|
390
|
+
delz=first_wiggler.period,
|
|
391
|
+
harmonic=harmonic_number,
|
|
392
|
+
)
|
|
393
|
+
self.commandFiles["field_2"] = genesis_field_command(
|
|
394
|
+
power=0,
|
|
395
|
+
ngrid=self.ngrid,
|
|
396
|
+
dgrid=self.dgrid,
|
|
397
|
+
accumulate=True,
|
|
398
|
+
)
|
|
318
399
|
self.commandFiles["write"] = genesis_write_command(
|
|
319
400
|
field=f"{self.end}_FIELD",
|
|
320
401
|
beam=f"{self.end}_BEAM",
|
|
@@ -334,7 +415,30 @@ class genesisLattice(frameworkLattice):
|
|
|
334
415
|
HDF5filename = f"{rootname}.openpmd.hdf5"
|
|
335
416
|
rbf.openpmd.write_openpmd_beam_file(beam, HDF5filename)
|
|
336
417
|
self.commandFiles = {}
|
|
337
|
-
|
|
418
|
+
outfields = sorted(
|
|
419
|
+
[
|
|
420
|
+
e for e in os.listdir(self.global_parameters["master_subdir"]) if ".fld.h5" in e and self.end not in e
|
|
421
|
+
]
|
|
422
|
+
)
|
|
423
|
+
outbeams = sorted(
|
|
424
|
+
[
|
|
425
|
+
e for e in os.listdir(self.global_parameters["master_subdir"]) if ".par.h5" in e and self.end not in e
|
|
426
|
+
]
|
|
427
|
+
)
|
|
428
|
+
subd = self.global_parameters["master_subdir"]
|
|
429
|
+
for outf, photon in zip(outfields, self.getElementType("photon_monitor")):
|
|
430
|
+
os.rename(f"{subd}/{outf}", f"{subd}/{photon.name}.fld.h5")
|
|
431
|
+
for outb, scr in zip(outbeams, self.getElementType("screen")):
|
|
432
|
+
os.rename(f"{subd}/{outb}", f"{subd}/{scr.name}.par.h5")
|
|
433
|
+
with h5py.File(f"{self.global_parameters['master_subdir']}/{self.objectname}.out.h5", "r+") as f:
|
|
434
|
+
dset = f["/Lattice/z"]
|
|
435
|
+
dset[:] = dset[:] + self.startObject.physical.start.z
|
|
436
|
+
try:
|
|
437
|
+
with h5py.File(f"{self.global_parameters['master_subdir']}/{self.objectname}.Run2.out.h5", "r+") as f:
|
|
438
|
+
dset = f["/Lattice/z"]
|
|
439
|
+
dset[:] = dset[:] + self.elementObjects[self.split_element].physical.start.z
|
|
440
|
+
except FileNotFoundError:
|
|
441
|
+
pass
|
|
338
442
|
|
|
339
443
|
def write_setup_file(self) -> None:
|
|
340
444
|
gamma0 = self.global_parameters["beam"].beam.centroids.mean_gamma.val
|
|
@@ -347,11 +451,18 @@ class genesisLattice(frameworkLattice):
|
|
|
347
451
|
if not np.isclose([self.fundamental_wavelength], [lambda0_from_und]):
|
|
348
452
|
warn(f"First undulator strength is not close to fundamental_wavelength")
|
|
349
453
|
delz = first_wiggler.period
|
|
454
|
+
if isinstance(self.split_element, str):
|
|
455
|
+
if self.split_element in self.elements:
|
|
456
|
+
beamline = f"{self.objectname}_SPLIT_1"
|
|
457
|
+
else:
|
|
458
|
+
raise ValueError(f"split_element {self.split_element} not found in elements")
|
|
459
|
+
else:
|
|
460
|
+
beamline = self.objectname
|
|
350
461
|
self.commandFiles["setup"] = genesis_setup_command(
|
|
351
462
|
rootname=self.objectname,
|
|
352
463
|
lattice=self.objectname + ".lat",
|
|
353
464
|
#outputdir=self.global_parameters["master_subdir"],
|
|
354
|
-
beamline=
|
|
465
|
+
beamline=beamline,
|
|
355
466
|
one4one=self.one4one,
|
|
356
467
|
lambda0=self.fundamental_wavelength,
|
|
357
468
|
gamma0=gamma0,
|
|
@@ -390,7 +501,6 @@ class genesisLattice(frameworkLattice):
|
|
|
390
501
|
genesisbeamfilename,
|
|
391
502
|
n_slice = int(self.nbins),
|
|
392
503
|
)
|
|
393
|
-
beam_profile_properties = self.get_beam_profile_properties()
|
|
394
504
|
props = {}
|
|
395
505
|
self.commandFiles["profile_file"] = []
|
|
396
506
|
for b in beam_profile_properties:
|
|
@@ -401,7 +511,7 @@ class genesisLattice(frameworkLattice):
|
|
|
401
511
|
ydata=f"{self.start}.genesis.hdf5/{b}",
|
|
402
512
|
)
|
|
403
513
|
)
|
|
404
|
-
props.update({b: f"{b}_profile"})
|
|
514
|
+
props.update({b: f"@{b}_profile"})
|
|
405
515
|
self.commandFiles["beam"] = genesis_beam_command(**props)
|
|
406
516
|
self.files.append(f"{self.global_parameters['master_subdir']}/{self.start}.genesis.hdf5")
|
|
407
517
|
elif self.beam_type == "beam":
|
|
@@ -416,44 +526,64 @@ class genesisLattice(frameworkLattice):
|
|
|
416
526
|
E0_eV = float(beam.E0_eV.val)
|
|
417
527
|
else:
|
|
418
528
|
E0_eV = float(beam.E0_eV.val[0])
|
|
529
|
+
slmom = beam.slice.slice_momentum_spread.val
|
|
530
|
+
lenslmom = len(slmom)
|
|
531
|
+
delgam = float(np.mean(slmom[int(lenslmom/2 - 3): int(lenslmom/2 + 3)])) / E0_eV
|
|
419
532
|
ddd = {
|
|
420
533
|
"betax": float(beam.twiss.beta_x.val),
|
|
421
534
|
"betay": float(beam.twiss.beta_y.val),
|
|
422
535
|
"alphax": float(beam.twiss.alpha_x.val),
|
|
423
536
|
"alphay": float(beam.twiss.alpha_y.val),
|
|
424
537
|
"gamma": float(beam.centroids.mean_gamma.val),
|
|
425
|
-
"delgam":
|
|
538
|
+
"delgam": delgam,
|
|
426
539
|
"current": float(beam.slice.peak_current.val),
|
|
427
|
-
"xcenter": float(beam.centroids.mean_x.val),
|
|
428
|
-
"ycenter": float(beam.centroids.mean_y.val),
|
|
429
|
-
"pxcenter": float(beam.centroids.mean_cpx.val) / E0_eV,
|
|
430
|
-
"pycenter": float(beam.centroids.mean_cpy.val) / E0_eV,
|
|
540
|
+
# "xcenter": float(beam.centroids.mean_x.val),
|
|
541
|
+
# "ycenter": float(beam.centroids.mean_y.val),
|
|
542
|
+
# "pxcenter": float(beam.centroids.mean_cpx.val) / E0_eV,
|
|
543
|
+
# "pycenter": float(beam.centroids.mean_cpy.val) / E0_eV,
|
|
431
544
|
"ex": float(beam.emittance.normalized_horizontal_emittance.val),
|
|
432
545
|
"ey": float(beam.emittance.normalized_vertical_emittance.val),
|
|
433
546
|
}
|
|
434
547
|
return ddd
|
|
435
548
|
|
|
436
|
-
def
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
"
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
549
|
+
def get_field_power(self) -> float | str:
|
|
550
|
+
"""
|
|
551
|
+
Get the initial field power if the first undulator has a laser associated with it.
|
|
552
|
+
If not, return :attr:`~field_power`.
|
|
553
|
+
|
|
554
|
+
Returns
|
|
555
|
+
-------
|
|
556
|
+
float
|
|
557
|
+
Label of laser field profile if laser is associated with first undulator; else, :attr:`~field_power`
|
|
558
|
+
"""
|
|
559
|
+
first_wiggler = self.wigglers[0]
|
|
560
|
+
if first_wiggler.laser:
|
|
561
|
+
self.commandFiles["profile_gauss"] = genesis_profile_gauss_command(
|
|
562
|
+
label=first_wiggler.name + "_laser_profile",
|
|
563
|
+
c0=first_wiggler.laser.max_power,
|
|
564
|
+
s0=first_wiggler.laser.initial_position,
|
|
565
|
+
sig=first_wiggler.laser.pulse_duration_rms * speed_of_light,
|
|
566
|
+
)
|
|
567
|
+
return f"@{first_wiggler.name}_laser_profile"
|
|
568
|
+
else:
|
|
569
|
+
return self.field_power
|
|
570
|
+
|
|
571
|
+
def get_waist_size(self) -> float:
|
|
572
|
+
"""
|
|
573
|
+
Get the waist size if the first undulator has a laser associated with it.
|
|
574
|
+
If not, return :attr:`~waist_size`.
|
|
575
|
+
|
|
576
|
+
Returns
|
|
577
|
+
-------
|
|
578
|
+
float
|
|
579
|
+
Waist size
|
|
580
|
+
"""
|
|
581
|
+
first_wiggler = self.wigglers[0]
|
|
582
|
+
if first_wiggler.laser:
|
|
583
|
+
waist = first_wiggler.laser.waist
|
|
584
|
+
return waist
|
|
585
|
+
else:
|
|
586
|
+
return self.waist_size
|
|
457
587
|
|
|
458
588
|
def run(self) -> None:
|
|
459
589
|
"""
|
|
@@ -632,7 +762,7 @@ class genesis_alter_setup_command(genesisCommandFile):
|
|
|
632
762
|
objecttype: str = "alter_setup"
|
|
633
763
|
"""Type of object for frameworkObject"""
|
|
634
764
|
|
|
635
|
-
rootname: str
|
|
765
|
+
rootname: str | None = None
|
|
636
766
|
"""The basic string, with which all output files will start,
|
|
637
767
|
unless the output filename is directly overwritten (see
|
|
638
768
|
:class:`~simba.Codes.Genesis.Genesis.genesis_write_command`)"""
|
|
@@ -1099,7 +1229,7 @@ class genesis_field_command(genesisCommandFile):
|
|
|
1099
1229
|
"""Position where the focal point is located relative to the undulator entrance.
|
|
1100
1230
|
Negative values place it before, resulting in a diverging radiation field."""
|
|
1101
1231
|
|
|
1102
|
-
waist_size: float | str
|
|
1232
|
+
waist_size: float | str | None = None
|
|
1103
1233
|
"""Waist size according to the definition of w 0 according to Siegman’s ’Laser’ handbook"""
|
|
1104
1234
|
|
|
1105
1235
|
xcenter: float = 0.0
|
|
@@ -33,6 +33,7 @@ from laura.Exporters.YAML import export_machine, export_elements
|
|
|
33
33
|
from .Modules.merge_two_dicts import merge_two_dicts
|
|
34
34
|
from .Modules import Beams as rbf
|
|
35
35
|
from .Modules import Twiss as rtf
|
|
36
|
+
from .Modules import Wavefronts as rwf
|
|
36
37
|
from .Modules import constants
|
|
37
38
|
from .Codes import Executables as exes
|
|
38
39
|
from .Codes.Generators import (
|
|
@@ -693,7 +694,10 @@ class Framework(BaseModel):
|
|
|
693
694
|
exclude_keys=["controls", "electrical", "manufacturer", "reference"],
|
|
694
695
|
)
|
|
695
696
|
|
|
696
|
-
|
|
697
|
+
for k in list(self.machine.elements.keys()):
|
|
698
|
+
_ = self.machine.elements[k]
|
|
699
|
+
|
|
700
|
+
self.elementObjects = dict(self.machine.elements)
|
|
697
701
|
|
|
698
702
|
# for name, elem in list(elements.items()):
|
|
699
703
|
# self.read_Element(name, elem)
|
|
@@ -1066,7 +1070,7 @@ class Framework(BaseModel):
|
|
|
1066
1070
|
end = np.array([elem.physical.end.x, elem.physical.end.y, elem.physical.end.z])
|
|
1067
1071
|
length = elem.physical.length
|
|
1068
1072
|
physical_angle = elem.physical.physical_angle
|
|
1069
|
-
|
|
1073
|
+
|
|
1070
1074
|
# Calculate local offset from middle to end
|
|
1071
1075
|
if abs(physical_angle) > 1e-9:
|
|
1072
1076
|
# Bent element - correct arc geometry
|
|
@@ -1078,15 +1082,15 @@ class Framework(BaseModel):
|
|
|
1078
1082
|
ex_local = 0
|
|
1079
1083
|
ey_local = 0
|
|
1080
1084
|
ez_local = length / 2.0
|
|
1081
|
-
|
|
1085
|
+
|
|
1082
1086
|
local_offset = np.array([ex_local, ey_local, ez_local])
|
|
1083
|
-
|
|
1087
|
+
|
|
1084
1088
|
# Apply the full 3D rotation matrix
|
|
1085
1089
|
rotated_offset = elem.physical.rotated_position(local_offset.tolist())
|
|
1086
|
-
|
|
1090
|
+
|
|
1087
1091
|
# Calculate expected end position
|
|
1088
1092
|
cend = middle + np.array(rotated_offset)
|
|
1089
|
-
|
|
1093
|
+
|
|
1090
1094
|
# Check if calculated end matches actual end
|
|
1091
1095
|
diff = cend - end
|
|
1092
1096
|
if not np.allclose(diff, 0, atol=10 ** (-decimals)):
|
|
@@ -2098,6 +2102,9 @@ class frameworkDirectory(BaseModel):
|
|
|
2098
2102
|
beams: bool | rbf.beamGroup | None = False
|
|
2099
2103
|
"""Flag to indicate whether to load beam files"""
|
|
2100
2104
|
|
|
2105
|
+
wavefronts: bool | rwf.wavefrontGroup | None = False
|
|
2106
|
+
"""Flag to indicate whether to load wavefront files"""
|
|
2107
|
+
|
|
2101
2108
|
verbose: bool = False
|
|
2102
2109
|
"""Flag to print status updates"""
|
|
2103
2110
|
|
|
@@ -2154,6 +2161,8 @@ class frameworkDirectory(BaseModel):
|
|
|
2154
2161
|
else:
|
|
2155
2162
|
self.beams = None
|
|
2156
2163
|
self.twiss = rtf.twiss()
|
|
2164
|
+
if self.wavefronts:
|
|
2165
|
+
self.wavefronts = rwf.load_directory(directory)
|
|
2157
2166
|
if self.twiss:
|
|
2158
2167
|
self.twiss.load_directory(directory, verbose=self.verbose)
|
|
2159
2168
|
|
|
@@ -2270,8 +2279,8 @@ class frameworkDirectory(BaseModel):
|
|
|
2270
2279
|
|
|
2271
2280
|
|
|
2272
2281
|
def load_directory(
|
|
2273
|
-
directory: str = ".", twiss: bool = True, beams: bool = False, **kwargs
|
|
2282
|
+
directory: str = ".", twiss: bool = True, beams: bool = False, wavefronts: bool = False, **kwargs
|
|
2274
2283
|
) -> frameworkDirectory:
|
|
2275
2284
|
"""Load a directory from a SIMBA tracking run and return a frameworkDirectory object"""
|
|
2276
|
-
fw = frameworkDirectory(directory=directory, twiss=twiss, beams=beams, **kwargs)
|
|
2285
|
+
fw = frameworkDirectory(directory=directory, twiss=twiss, beams=beams, wavefronts=wavefronts, **kwargs)
|
|
2277
2286
|
return fw
|
|
@@ -1081,6 +1081,18 @@ class frameworkLattice(BaseModel):
|
|
|
1081
1081
|
"""
|
|
1082
1082
|
return self.getElementType("wiggler")
|
|
1083
1083
|
|
|
1084
|
+
@property
|
|
1085
|
+
def photon_monitors(self) -> list:
|
|
1086
|
+
"""
|
|
1087
|
+
Property to get all photon monitor elements in the lattice.
|
|
1088
|
+
|
|
1089
|
+
Returns
|
|
1090
|
+
-------
|
|
1091
|
+
list
|
|
1092
|
+
A list of photon monitor elements in the lattice.
|
|
1093
|
+
"""
|
|
1094
|
+
return self.getElementType("photon_monitor")
|
|
1095
|
+
|
|
1084
1096
|
@property
|
|
1085
1097
|
def lines(self) -> list:
|
|
1086
1098
|
"""
|
|
@@ -2290,6 +2302,7 @@ class chicane(frameworkGroup):
|
|
|
2290
2302
|
def __init__(self, name, elementObjects, type, elements, **kwargs):
|
|
2291
2303
|
super(chicane, self).__init__(name, elementObjects, type, elements, **kwargs)
|
|
2292
2304
|
self.ratios = (1, -1, -1, 1)
|
|
2305
|
+
self.elementObjects = [self.allElementObjects[e] for e in self.elements]
|
|
2293
2306
|
|
|
2294
2307
|
def update(self, **kwargs) -> None:
|
|
2295
2308
|
"""
|
|
@@ -2308,6 +2321,46 @@ class chicane(frameworkGroup):
|
|
|
2308
2321
|
self.change_Parameter("gap", kwargs["gap"])
|
|
2309
2322
|
return None
|
|
2310
2323
|
|
|
2324
|
+
@property
|
|
2325
|
+
def drift_d1_to_d2(self) -> float:
|
|
2326
|
+
"""
|
|
2327
|
+
Drift length between dipole 1 and dipole 2
|
|
2328
|
+
|
|
2329
|
+
Returns
|
|
2330
|
+
-------
|
|
2331
|
+
float
|
|
2332
|
+
The drift length between dipole 1 and dipole 2
|
|
2333
|
+
"""
|
|
2334
|
+
e1 = self.elementObjects[0]
|
|
2335
|
+
e2 = self.elementObjects[1]
|
|
2336
|
+
return np.sqrt(np.sum([(getattr(e2.start, d) - getattr(e1.end, d)) ** 2 for d in ["x", "y", "z"]]))
|
|
2337
|
+
|
|
2338
|
+
@property
|
|
2339
|
+
def r56(self) -> float:
|
|
2340
|
+
"""
|
|
2341
|
+
R56 of the chicane
|
|
2342
|
+
|
|
2343
|
+
Returns
|
|
2344
|
+
-------
|
|
2345
|
+
float
|
|
2346
|
+
R56 = 2 * angle^2 * (L1 + 2/3 * L2)
|
|
2347
|
+
"""
|
|
2348
|
+
e1 = self.elementObjects[0]
|
|
2349
|
+
ld = self.drift_d1_to_d2
|
|
2350
|
+
return 2 * self.angle ** 2 * (ld * (2 * e1.magnetic.length) / 3)
|
|
2351
|
+
|
|
2352
|
+
@property
|
|
2353
|
+
def delay(self) -> float:
|
|
2354
|
+
"""
|
|
2355
|
+
Delay (longitudinal slippage) of the chicane
|
|
2356
|
+
|
|
2357
|
+
Returns
|
|
2358
|
+
-------
|
|
2359
|
+
float
|
|
2360
|
+
Delay = 2 * R56
|
|
2361
|
+
"""
|
|
2362
|
+
return 2 * self.r56
|
|
2363
|
+
|
|
2311
2364
|
@property
|
|
2312
2365
|
def angle(self) -> float:
|
|
2313
2366
|
"""
|