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.
Files changed (219) hide show
  1. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/PKG-INFO +1 -1
  2. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/requirements.txt +1 -1
  3. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/Generators.py +30 -22
  4. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/aliases.yaml +2 -2
  5. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/gpt.py +1 -0
  6. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Genesis/Genesis.py +168 -38
  7. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework.py +17 -8
  8. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework_objects.py +53 -0
  9. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/slice.py +1 -1
  10. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/genesis.py +28 -7
  11. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/opal.py +3 -3
  12. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/openpmd.py +4 -1
  13. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/plot.py +187 -0
  14. simba_accelerator-0.4.0/simba/Modules/Wavefronts/__init__.py +128 -0
  15. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/constants.py +2 -0
  16. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/xopt.py +16 -1
  17. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/plotting.py +4 -3
  18. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/PKG-INFO +1 -1
  19. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/SOURCES.txt +1 -0
  20. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/scm_file_list.json +1 -0
  21. simba_accelerator-0.4.0/simba_accelerator.egg-info/scm_version.json +8 -0
  22. simba_accelerator-0.3.0/simba_accelerator.egg-info/scm_version.json +0 -8
  23. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/.coverage +0 -0
  24. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/.github/workflows/python-publish.yml +0 -0
  25. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/.gitignore +0 -0
  26. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/LICENSE +0 -0
  27. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/MANIFEST.in +0 -0
  28. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/Makefile +0 -0
  29. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/README.md +0 -0
  30. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/.venv/pyvenv.cfg +0 -0
  31. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/2.0 +0 -0
  32. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/=3.8 +0 -0
  33. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/Makefile +0 -0
  34. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/make.bat +0 -0
  35. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/rebuild.sh +0 -0
  36. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/requirements.txt +0 -0
  37. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/Framework.rst +0 -0
  38. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/Framework_objects.rst +0 -0
  39. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/SimCodes.rst +0 -0
  40. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/assets/elegant-fodo.png +0 -0
  41. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/assets/ocelot-fodo.png +0 -0
  42. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/conf.py +0 -0
  43. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/examples/notebooks/CLA-S02-DIA-SCR-03.openpmd.hdf5 +0 -0
  44. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/examples/notebooks/beams_example.ipynb +0 -0
  45. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/examples/notebooks/getting_started.ipynb +0 -0
  46. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/examples/notebooks/utility_functions.ipynb +0 -0
  47. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/getting-started.rst +0 -0
  48. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/index.rst +0 -0
  49. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/installation.rst +0 -0
  50. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/loading-a-lattice.rst +0 -0
  51. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/modules.rst +0 -0
  52. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/references.bib +0 -0
  53. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.ASTRA.rst +0 -0
  54. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.CSRTrack.rst +0 -0
  55. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Cheetah.rst +0 -0
  56. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Elegant.rst +0 -0
  57. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.GPT.rst +0 -0
  58. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Generators.rst +0 -0
  59. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.MAD8.rst +0 -0
  60. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.OPAL.rst +0 -0
  61. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Ocelot.rst +0 -0
  62. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.Xsuite.rst +0 -0
  63. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Codes.rst +0 -0
  64. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Framework_objects.rst +0 -0
  65. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Beams.Particles.rst +0 -0
  66. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Beams.rst +0 -0
  67. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Fields.rst +0 -0
  68. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Matrices.rst +0 -0
  69. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.Twiss.rst +0 -0
  70. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.optimisation.rst +0 -0
  71. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.plotting.rst +0 -0
  72. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.Modules.rst +0 -0
  73. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/docs/source/simba.rst +0 -0
  74. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/CLA-S02-DIA-SCR-03.openpmd.hdf5 +0 -0
  75. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/beams_example.ipynb +0 -0
  76. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/getting_started.ipynb +0 -0
  77. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/params.yaml +0 -0
  78. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/examples/notebooks/utility_functions.ipynb +0 -0
  79. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/make.bat +0 -0
  80. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/meta.yml +0 -0
  81. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/pyproject.toml +0 -0
  82. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/readthedocs.yml +0 -0
  83. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/setup.cfg +0 -0
  84. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/setup.py +0 -0
  85. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/.gitignore +0 -0
  86. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/ASTRA/ASTRA.py +0 -0
  87. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/ASTRA/ASTRARules.py +0 -0
  88. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/ASTRA/__init__.py +0 -0
  89. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/CSRTrack/CSRTrack.py +0 -0
  90. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/CSRTrack/__init__.py +0 -0
  91. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/CSRTrack/csrtrack_defaults.yaml +0 -0
  92. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Cheetah/Cheetah.py +0 -0
  93. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Cheetah/__init__.py +0 -0
  94. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Cheetah/cheetah_defaults.yaml +0 -0
  95. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/Elegant.py +0 -0
  96. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/__init__.py +0 -0
  97. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/commands_Elegant.yaml +0 -0
  98. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/elements_Elegant.yaml +0 -0
  99. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Elegant/keyword_conversion_rules_elegant.yaml +0 -0
  100. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Executables.py +0 -0
  101. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/GPT/GPT.py +0 -0
  102. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/GPT/__init__.py +0 -0
  103. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/__init__.py +0 -0
  104. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/astra.py +0 -0
  105. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/astra.yaml +0 -0
  106. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/elegant.yaml +0 -0
  107. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/gpt.yaml +0 -0
  108. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/keywords.yaml +0 -0
  109. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/opal.py +0 -0
  110. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/opal.yaml +0 -0
  111. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Generators/species.yaml +0 -0
  112. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Genesis/__init__.py +0 -0
  113. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Genesis/commands_Genesis.yaml +0 -0
  114. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/OPAL/OPAL.py +0 -0
  115. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/OPAL/__init__.py +0 -0
  116. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/OPAL/commands_Opal.yaml +0 -0
  117. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/OPAL/globals_Opal.yaml +0 -0
  118. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/Ocelot.py +0 -0
  119. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/__init__.py +0 -0
  120. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/mbi.py +0 -0
  121. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/ocelot_defaults.yaml +0 -0
  122. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Ocelot/savebeamopenpmd.py +0 -0
  123. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Wake_T/Wake_T.py +0 -0
  124. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Wake_T/__init__.py +0 -0
  125. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Xsuite/Xsuite.py +0 -0
  126. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/Xsuite/__init__.py +0 -0
  127. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/__init__.py +0 -0
  128. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Codes/type_conversion_rules.yaml +0 -0
  129. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Executables.yaml +0 -0
  130. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/FrameworkHelperFunctions.py +0 -0
  131. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework_Settings.py +0 -0
  132. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework_elements.py +0 -0
  133. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Framework_lattices.py +0 -0
  134. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/.gitignore +0 -0
  135. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/__init__.py +0 -0
  136. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/centroids.py +0 -0
  137. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/emittance.py +0 -0
  138. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/kde.py +0 -0
  139. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/minimumVolumeEllipse.py +0 -0
  140. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/mve.py +0 -0
  141. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/sigmas.py +0 -0
  142. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/Particles/twiss.py +0 -0
  143. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/__init__.py +0 -0
  144. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/astra.py +0 -0
  145. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/cheetah.py +0 -0
  146. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/gdf.py +0 -0
  147. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/hdf5.py +0 -0
  148. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/mad8.py +0 -0
  149. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/ocelot.py +0 -0
  150. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/sdds.py +0 -0
  151. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/vsim.py +0 -0
  152. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/wake_t.py +0 -0
  153. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Beams/xsuite.py +0 -0
  154. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/FieldParameter.py +0 -0
  155. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/__init__.py +0 -0
  156. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/astra.py +0 -0
  157. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/gdf.py +0 -0
  158. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/hdf5.py +0 -0
  159. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/opal.py +0 -0
  160. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Fields/sdds.py +0 -0
  161. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/MathParser.py +0 -0
  162. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Matrices/__init__.py +0 -0
  163. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Matrices/elegant.py +0 -0
  164. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Matrices/hdf5.py +0 -0
  165. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/SDDSFile.py +0 -0
  166. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/__init__.py +0 -0
  167. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/astra.py +0 -0
  168. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/cheetah.py +0 -0
  169. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/elegant.py +0 -0
  170. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/genesis.py +0 -0
  171. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/gpt.py +0 -0
  172. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/hdf5.py +0 -0
  173. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/ocelot.py +0 -0
  174. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/opal.py +0 -0
  175. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/plot.py +0 -0
  176. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/Twiss/xsuite.py +0 -0
  177. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/__init__.py +0 -0
  178. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/gdf_beam.py +0 -0
  179. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/gdf_emit.py +0 -0
  180. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/id_number.py +0 -0
  181. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/id_number_server.py +0 -0
  182. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/merge_two_dicts.py +0 -0
  183. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/__init__.py +0 -0
  184. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/constraints.py +0 -0
  185. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/nelder_mead.py +0 -0
  186. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/optimisation/optimiser.py +0 -0
  187. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/__init__.py +0 -0
  188. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/latticeDraw.py +0 -0
  189. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/multiAxisPlot.py +0 -0
  190. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/plotting/multiPlot.py +0 -0
  191. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/pmd_units.py +0 -0
  192. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/symmlinks.py +0 -0
  193. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Modules/units.py +0 -0
  194. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/Vision_Mission.docx +0 -0
  195. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/__init__.py +0 -0
  196. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/elementkeywords.yaml +0 -0
  197. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/hosts.yaml +0 -0
  198. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba/yaml_checker.py +0 -0
  199. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/dependency_links.txt +0 -0
  200. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/requires.txt +0 -0
  201. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/simba_accelerator.egg-info/top_level.txt +0 -0
  202. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/CLARA/Settings/250pC/1/constants.py +0 -0
  203. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/CLARA/src/FEBE_Simple_NM.py +0 -0
  204. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/CLARA/test.py +0 -0
  205. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/ISIS/LEBT/testing_SimFrame_LEBT.py +0 -0
  206. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/ISIS/MEBT/testing_SimFrame_MEBT.py +0 -0
  207. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/framework_test.py +0 -0
  208. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/twiss.py +0 -0
  209. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/xopt_example/example.yaml +0 -0
  210. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/tests/xopt_test.py +0 -0
  211. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/.coverage +0 -0
  212. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_beam.py +0 -0
  213. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_field.py +0 -0
  214. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_framework.py +0 -0
  215. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_framework_lattice.py +0 -0
  216. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_framework_objects.py +0 -0
  217. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_generator.py +0 -0
  218. {simba_accelerator-0.3.0 → simba_accelerator-0.4.0}/unit_tests/test_track.py +0 -0
  219. {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.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>
@@ -18,7 +18,7 @@ numba>=0.61.2
18
18
  pyFFTW==0.15.0
19
19
  sphinx>=8.1.0
20
20
  cheetah-accelerator>=0.7.5
21
- openpmd-beamphysics>=0.10
21
+ openpmd-beamphysics>=0.15
22
22
  sphinx-rtd-theme
23
23
  myst-nb
24
24
  sphinx_autodoc_typehints>=3.0.0
@@ -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
- os.path.dirname(os.path.abspath(__file__)) + "/astra.yaml",
109
- "r",
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
- os.path.dirname(os.path.abspath(__file__)) + "/gpt.yaml",
115
- "r",
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
- os.path.dirname(os.path.abspath(__file__)) + "/elegant.yaml",
121
- "r",
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
- os.path.dirname(os.path.abspath(__file__)) + "/opal.yaml",
128
- "r",
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
- os.path.dirname(os.path.abspath(__file__)) + "/aliases.yaml",
134
- "r",
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
- os.path.dirname(os.path.abspath(__file__)) + "/species.yaml",
140
- "r",
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
- 3
602
- * self.thermal_emittance**2
603
- * self.speed_of_light**2
604
- * self.particle_mass
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 write(self):
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
- (np.abs(z_white[:, 0]) <= cutoffs[0]) &
793
- (np.abs(z_white[:, 1]) <= cutoffs[1])
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: 1000
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: 1000
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
- "profile_gauus",
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 = 4
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-4
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
- return self.section.to_genesis()
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.field_power,
367
+ power=self.get_field_power(),
312
368
  ngrid=self.ngrid,
313
369
  dgrid=self.dgrid,
314
- waist_size=self.waist_size,
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=self.objectname,
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": float(beam.sigmas.sigma_cp_eV.val) / E0_eV,
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 get_beam_profile_properties(self) -> List:
437
- return [
438
- "betax",
439
- "betay",
440
- "alphax",
441
- "alphay",
442
- "gamma",
443
- "delgam",
444
- "current",
445
- "xcenter",
446
- "ycenter",
447
- "pxcenter",
448
- "pycenter",
449
- "ex",
450
- "ey"
451
- ]
452
-
453
- # ocebeamfilename = hdf5outname.replace("hdf5", "ocelot.npz")
454
- # self.pin = rbf.beam.write_ocelot_beam_file(
455
- # self.global_parameters["beam"], ocebeamfilename, write=write
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
- self.elementObjects = {k: v for k, v in self.machine.elements.items()}
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
  """