xtrack 0.79.5__tar.gz → 0.80.1__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 (298) hide show
  1. {xtrack-0.79.5/xtrack.egg-info → xtrack-0.80.1}/PKG-INFO +1 -1
  2. xtrack-0.80.1/tests/test_electron_cooler.py +212 -0
  3. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_elements.py +8 -0
  4. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_ions.py +44 -0
  5. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_native_madloader.py +36 -39
  6. xtrack-0.80.1/tests/test_optimize_for_tracking.py +79 -0
  7. xtrack-0.80.1/xtrack/_version.py +1 -0
  8. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements.py +117 -0
  9. xtrack-0.80.1/xtrack/beam_elements/elements_src/electroncooler.h +142 -0
  10. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/slice_elements.py +30 -0
  11. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/constants.h +8 -0
  12. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/line.py +1 -1
  13. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_parser/loader.py +23 -28
  14. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_parser/madx.lark +11 -1
  15. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_parser/parse.py +41 -60
  16. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/twiss.py +2 -9
  17. {xtrack-0.79.5 → xtrack-0.80.1/xtrack.egg-info}/PKG-INFO +1 -1
  18. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack.egg-info/SOURCES.txt +3 -0
  19. xtrack-0.79.5/xtrack/_version.py +0 -1
  20. {xtrack-0.79.5 → xtrack-0.80.1}/LICENSE +0 -0
  21. {xtrack-0.79.5 → xtrack-0.80.1}/MANIFEST.in +0 -0
  22. {xtrack-0.79.5 → xtrack-0.80.1}/README.md +0 -0
  23. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/__init__.py +0 -0
  24. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/base_classes.py +0 -0
  25. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/BB6D.py +0 -0
  26. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  27. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/__init__.py +0 -0
  28. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/beambeam.py +0 -0
  29. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/boost.py +0 -0
  30. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  31. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  32. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/qgauss.py +0 -0
  33. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/slicing.py +0 -0
  34. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
  35. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/elements.py +0 -0
  36. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/line.py +0 -0
  37. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/mathlibs.py +0 -0
  38. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/particles.py +0 -0
  39. {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/temp_pyparticles.py +0 -0
  40. {xtrack-0.79.5 → xtrack-0.80.1}/pyproject.toml +0 -0
  41. {xtrack-0.79.5 → xtrack-0.80.1}/setup.cfg +0 -0
  42. {xtrack-0.79.5 → xtrack-0.80.1}/setup.py +0 -0
  43. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_acceleration.py +0 -0
  44. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_amplitude_detuning.py +0 -0
  45. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  46. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_apertures.py +0 -0
  47. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_attr_replicas_and_slices.py +0 -0
  48. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_bucket_with_ref_energy_change.py +0 -0
  49. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_cavity_absolute_time.py +0 -0
  50. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
  51. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_coasting.py +0 -0
  52. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_collective_tracker.py +0 -0
  53. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_collimation.py +0 -0
  54. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_element_characterization_functions.py +0 -0
  55. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_element_internal_record.py +0 -0
  56. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_elements_classflags.py +0 -0
  57. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_elements_thick.py +0 -0
  58. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_environment.py +0 -0
  59. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  60. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  61. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_footprint.py +0 -0
  62. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_freeze_longitudinal.py +0 -0
  63. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_full_rings.py +0 -0
  64. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_h6_sps_beamline.py +0 -0
  65. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_hvkick.py +0 -0
  66. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_legacy_multiline_to_env.py +0 -0
  67. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_lhc_env.py +0 -0
  68. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_lhc_match_phase_15.py +0 -0
  69. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_line.py +0 -0
  70. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_lumi.py +0 -0
  71. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_mad_writer.py +0 -0
  72. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_madloader.py +0 -0
  73. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_madnginterface.py +0 -0
  74. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_magnet.py +0 -0
  75. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_and_track_from_element.py +0 -0
  76. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_coupling_knob.py +0 -0
  77. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_nested.py +0 -0
  78. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_optics_and_ip_knob.py +0 -0
  79. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  80. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_orbit_bump.py +0 -0
  81. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_tune_chroma_cminus.py +0 -0
  82. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_monitor.py +0 -0
  83. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_multi_bunch_gauss.py +0 -0
  84. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_multiline.py +0 -0
  85. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_multisetter.py +0 -0
  86. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_multispecies.py +0 -0
  87. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_particles.py +0 -0
  88. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_particles_basics.py +0 -0
  89. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_particles_pdg.py +0 -0
  90. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_periodic_symmetric_twiss_and_match.py +0 -0
  91. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_pipeline.py +0 -0
  92. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_prebuild_kernels.py +0 -0
  93. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_ps_against_ptc.py +0 -0
  94. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_ps_multiturn_twiss.py +0 -0
  95. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_psb_chicane.py +0 -0
  96. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_pyht_interface.py +0 -0
  97. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_radial_steering.py +0 -0
  98. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_radiation.py +0 -0
  99. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
  100. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  101. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_random_gen.py +0 -0
  102. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_random_gen_exp.py +0 -0
  103. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_random_gen_gauss.py +0 -0
  104. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_random_gen_ruth.py +0 -0
  105. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_rbend_rbarc.py +0 -0
  106. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_rf_track.py +0 -0
  107. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_rotation_signs.py +0 -0
  108. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_second_order_taylor_map.py +0 -0
  109. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_seeds.py +0 -0
  110. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
  111. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_slice_elements.py +0 -0
  112. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_slicing.py +0 -0
  113. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  114. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_spacecharge_in_ring.py +0 -0
  115. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_sps_thick.py +0 -0
  116. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_survey.py +0 -0
  117. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_tapering.py +0 -0
  118. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_thick_lhc.py +0 -0
  119. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_tilt_shifts.py +0 -0
  120. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_tracker.py +0 -0
  121. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_trajectory_correcton.py +0 -0
  122. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_twiss.py +0 -0
  123. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_twiss_vs_madx_psb.py +0 -0
  124. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_vs_madx.py +0 -0
  125. {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_xmask_orbit_correction.py +0 -0
  126. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/__init__.py +0 -0
  127. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/__init__.py +0 -0
  128. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  129. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  130. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  131. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
  132. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  133. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  134. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  135. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/base_element.py +0 -0
  136. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/__init__.py +0 -0
  137. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures.py +0 -0
  138. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  139. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  140. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  141. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  142. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  143. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  144. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/beam_interaction.py +0 -0
  145. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
  146. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  147. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  148. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  149. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift.h +0 -0
  150. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_elem.h +0 -0
  151. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  152. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  153. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  154. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  155. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  156. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  157. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
  158. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  159. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  160. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  161. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  162. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  163. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  164. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  165. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  166. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  167. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  168. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  169. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  170. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/rbend.h +0 -0
  171. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  172. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  173. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  174. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  175. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  176. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  177. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/solenoid.h +0 -0
  178. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  179. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  180. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_drift.h +0 -0
  181. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  182. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  183. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
  184. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  185. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_solenoid.h +0 -0
  186. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  187. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  188. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  189. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  190. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  191. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  192. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  193. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  194. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  195. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
  196. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  197. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  198. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  199. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  200. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  201. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_bend.h +0 -0
  202. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  203. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  204. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  205. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet.h +0 -0
  206. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  207. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  208. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  209. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
  210. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  211. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_multipolar_components.h +0 -0
  212. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_multipole.h +0 -0
  213. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_quadrupole.h +0 -0
  214. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_solenoid.h +0 -0
  215. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  216. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  217. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  218. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  219. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  220. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  221. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  222. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
  223. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  224. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  225. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  226. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  227. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/exciter.py +0 -0
  228. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/magnets.py +0 -0
  229. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/rft_element.py +0 -0
  230. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  231. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/environment.py +0 -0
  232. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/footprint.py +0 -0
  233. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/general.py +0 -0
  234. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/atomicadd.h +0 -0
  235. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/checks.h +0 -0
  236. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/particle_states.h +0 -0
  237. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/synrad_spectrum.h +0 -0
  238. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/internal_record.py +0 -0
  239. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/json.py +0 -0
  240. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/linear_normal_form.py +0 -0
  241. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/loss_location_refinement/__init__.py +0 -0
  242. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  243. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/lumi.py +0 -0
  244. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_loader.py +0 -0
  245. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_parser/__init__.py +0 -0
  246. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_writer.py +0 -0
  247. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/madng_interface.py +0 -0
  248. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/match.py +0 -0
  249. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/__init__.py +0 -0
  250. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_position_monitor.h +0 -0
  251. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_position_monitor.py +0 -0
  252. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
  253. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
  254. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_size_monitor.h +0 -0
  255. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_size_monitor.py +0 -0
  256. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/last_turns_monitor.h +0 -0
  257. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/last_turns_monitor.py +0 -0
  258. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/particles_monitor.h +0 -0
  259. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/particles_monitor.py +0 -0
  260. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multiline.py +0 -0
  261. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multiline_legacy/__init__.py +0 -0
  262. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  263. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  264. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multisetter/__init__.py +0 -0
  265. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multisetter/multisetter.py +0 -0
  266. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/__init__.py +0 -0
  267. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/constants.py +0 -0
  268. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/masses.py +0 -0
  269. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/particles.py +0 -0
  270. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/pdg.py +0 -0
  271. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/rng_src/base_rng.h +0 -0
  272. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
  273. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/pipeline/__init__.py +0 -0
  274. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/pipeline/core.py +0 -0
  275. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/pipeline/manager.py +0 -0
  276. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/pipeline/multitracker.py +0 -0
  277. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/progress_indicator.py +0 -0
  278. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/__init__.py +0 -0
  279. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_generators.py +0 -0
  280. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/exponential.h +0 -0
  281. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  282. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/normal.h +0 -0
  283. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/rutherford.h +0 -0
  284. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/uniform.h +0 -0
  285. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
  286. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/slicing.py +0 -0
  287. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/survey.py +0 -0
  288. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/synctime.py +0 -0
  289. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/tapering.py +0 -0
  290. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/targets.py +0 -0
  291. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/tracker.py +0 -0
  292. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/tracker_data.py +0 -0
  293. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/tracker_src/tracker.h +0 -0
  294. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/trajectory_correction.py +0 -0
  295. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/twissplot.py +0 -0
  296. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack.egg-info/dependency_links.txt +0 -0
  297. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack.egg-info/requires.txt +0 -0
  298. {xtrack-0.79.5 → xtrack-0.80.1}/xtrack.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xtrack
3
- Version: 0.79.5
3
+ Version: 0.80.1
4
4
  Summary: Tracking library for particle accelerators
5
5
  Home-page: https://xsuite.readthedocs.io/
6
6
  Download-URL: https://pypi.python.org/pypi/xtrack
@@ -0,0 +1,212 @@
1
+ # copyright ############################### #
2
+ # This file is part of the Xtrack Package. #
3
+ # Copyright (c) CERN, 2021. #
4
+ # ######################################### #
5
+
6
+ import numpy as np
7
+ import pytest
8
+ import pathlib
9
+ from cpymad.madx import Madx
10
+ from scipy.stats import linregress
11
+ from scipy import constants as cst
12
+ import ducktrack as dtk
13
+ import xobjects as xo
14
+ import xpart as xp
15
+ import xtrack as xt
16
+ from xobjects.test_helpers import for_all_test_contexts, fix_random_seed
17
+ from xtrack.beam_elements.elements import _angle_from_trig
18
+
19
+ test_data_folder = pathlib.Path(
20
+ __file__).parent.joinpath('../test_data').absolute()
21
+
22
+
23
+ @for_all_test_contexts
24
+ def test_ecooler_emittance(test_context):
25
+ """Test the electron cooler by comparing the cooling rate with Betacool for LEIR.
26
+ """
27
+ data = np.load(test_data_folder/'electron_cooler/emittance_betacool.npz')
28
+ emittance_betacool = data['emittance']
29
+ time_betacool = data['time']
30
+
31
+ gamma0 = 1.004469679
32
+ beta0 = np.sqrt(1 - 1 / gamma0**2)
33
+ mass0 = 193729.0248722061 * 1e6 # eV/c^2
34
+ clight = 299792458.0
35
+ p0c = mass0 * beta0 * gamma0 # eV/c
36
+ q0 = 54
37
+ particle_ref = xp.Particles(p0c=p0c,q0=q0,mass0=mass0,beta0=beta0,gamma0=gamma0)
38
+
39
+ circumference = 78.54370266 # m
40
+ T_per_turn = circumference/(clight*beta0)
41
+
42
+ qx = 1.82
43
+ qy = 2.72
44
+ beta_x = 5
45
+ beta_y = 5
46
+ qs=0.005247746218929317
47
+ bets0=-2078.673348423543
48
+
49
+ arc = xt.LineSegmentMap(
50
+ qx=qx, qy=qy,
51
+ length=circumference,
52
+ betx=beta_x,
53
+ bety=beta_y,
54
+ )
55
+
56
+ arc_matching = xt.LineSegmentMap(
57
+ qx=qx, qy=qy,
58
+ length=circumference,
59
+ betx=beta_x,
60
+ bety=beta_y,
61
+ qs=qs,
62
+ bets=bets0)
63
+
64
+ line_matching=xt.Line([arc_matching])
65
+ line_matching.build_tracker()
66
+
67
+ num_particles=int(1e2)
68
+ sigma_dp = 5e-3
69
+ gemitt_x = 14e-6
70
+ gemitt_y = 14e-6
71
+
72
+ nemitt_x = gemitt_x*beta0*gamma0
73
+ nemitt_y = gemitt_y*beta0*gamma0
74
+
75
+ particles = xp.generate_matched_gaussian_bunch(
76
+ num_particles=num_particles,
77
+ nemitt_x=nemitt_x, nemitt_y=nemitt_y, sigma_z=4.2,
78
+ particle_ref=particle_ref,
79
+ line=line_matching,
80
+ )
81
+
82
+ particles.delta = np.random.normal(loc=0.0, scale=sigma_dp, size=num_particles)
83
+ particles.zeta = np.random.uniform(-circumference/2, circumference/2, num_particles)
84
+
85
+ max_time_s = 1
86
+ int_time_s = 1*1e-3
87
+ num_turns = int((max_time_s / T_per_turn).item())
88
+ save_interval = int((int_time_s / T_per_turn).item())
89
+
90
+ monitor = xt.ParticlesMonitor(start_at_turn=0, stop_at_turn=1,
91
+ n_repetitions=int(num_turns/save_interval),
92
+ repetition_period=save_interval,
93
+ num_particles=len(particles.x))
94
+
95
+ current = 0.6 # amperes
96
+ cooler_length = 2.5 # m cooler length
97
+ radius_e_beam = 25 * 1e-3
98
+ temp_perp = 100e-3 # <E> [eV] = kb*T
99
+ temp_long = 1e-3 # <E> [eV]
100
+ magnetic_field = 0.075 # T for LEIR
101
+
102
+ electron_cooler = xt.ElectronCooler(current=current,
103
+ length=cooler_length,
104
+ radius_e_beam=radius_e_beam,
105
+ temp_perp=temp_perp, temp_long=temp_long,
106
+ magnetic_field=magnetic_field)
107
+
108
+ line = xt.Line(elements=[monitor, electron_cooler, arc],element_names=['monitor','electron_cooler','arc'])
109
+ line.particle_ref = particle_ref
110
+ line.build_tracker()
111
+
112
+ line.track(particles, num_turns=num_turns,
113
+ turn_by_turn_monitor=False,with_progress=True)
114
+
115
+ x = monitor.x[:,:,0]
116
+ px = monitor.px[:,:,0]
117
+ time = monitor.at_turn[:, 0, 0] * T_per_turn
118
+
119
+ action_x = (x**2/beta_x + beta_x*px**2)
120
+ geo_emittance_x=np.mean(action_x,axis=1)/2
121
+
122
+ # Match Betacool and Xsuite indices to compare emittance
123
+ valid_indices = ~np.isnan(time_betacool)
124
+ time_betacool = time_betacool[valid_indices]
125
+ matched_indices = [np.abs(time - tb).argmin() for tb in time_betacool]
126
+ emittance_xsuite = geo_emittance_x[matched_indices]
127
+ emittance_betacool = emittance_betacool[:len(emittance_xsuite)]
128
+
129
+ xo.assert_allclose(emittance_xsuite, emittance_betacool, rtol=0, atol=1e-5)
130
+
131
+ @for_all_test_contexts
132
+ def test_ecooler_force(test_context):
133
+ """Test the electron cooler by comparing the cooling force with Betacool for LEIR.
134
+ """
135
+ # Load Betacool force data
136
+ data_betacool = np.load(test_data_folder/'electron_cooler/force_betacool.npz')
137
+ v_diff_betacool = data_betacool['v_diff']
138
+ force_betacool = data_betacool['force']
139
+
140
+ beta_rel = 0.09423258405
141
+ gamma = 1.004469679
142
+ current = 0.6 # Amperes
143
+ cooler_length = 2.5 # m
144
+ radius_e_beam = 25 * 1e-3 # m
145
+ temp_perp = 100e-3 # eV
146
+ temp_long = 1e-3 # eV
147
+ magnetic_field = 0.075 # T for LEIR
148
+ mass0 = 193729.0248722061 * 1e6 # eV/c^2
149
+ clight = 299792458.0 # m/s
150
+ p0c = mass0 * beta_rel * gamma # eV/c
151
+ q0 = 54 # Charge
152
+ beta_x = 5 # m
153
+ emittance = 14 * 1e-6 # Initial geometric emittance (m·rad)
154
+
155
+ # Reference particle
156
+ particle_ref = xp.Particles(p0c=p0c, mass0=mass0, q0=q0)
157
+
158
+ # Electron cooler
159
+ cooler = xt.ElectronCooler(
160
+ current=current,
161
+ length=cooler_length,
162
+ radius_e_beam=radius_e_beam,
163
+ temp_perp=temp_perp,
164
+ temp_long=temp_long,
165
+ magnetic_field=magnetic_field,
166
+ record_flag=1
167
+ )
168
+
169
+ num_particles = int(1e4)
170
+ particles = xp.Particles(
171
+ mass0=mass0,
172
+ p0c=p0c,
173
+ q0=q0,
174
+ x=np.random.normal(0, 1e-20, num_particles),
175
+ px=np.random.normal(0, 4 * np.sqrt(emittance / beta_x), num_particles),
176
+ y=np.random.normal(0, 1e-20, num_particles),
177
+ py=np.random.normal(0, 1e-20, num_particles),
178
+ delta=np.zeros(num_particles),
179
+ zeta=np.zeros(num_particles)
180
+ )
181
+
182
+ line = xt.Line(elements=[cooler])
183
+ line.particle_ref = particle_ref
184
+ line.build_tracker()
185
+
186
+ # Start internal logging for the electron cooler
187
+ record = line.start_internal_logging_for_elements_of_type(
188
+ xt.ElectronCooler, capacity=10000)
189
+
190
+ line.track(particles)
191
+ force = record.Fx
192
+ particle_id=record.particle_id[:num_particles]
193
+ particle_id_sort=np.argsort(particle_id)
194
+
195
+ force=force[particle_id_sort]
196
+
197
+ px_tot = p0c * particles.px
198
+ beta_diff = px_tot / (mass0 * gamma)
199
+ v_diff = beta_diff * clight
200
+
201
+ sorted_indices = np.argsort(v_diff)
202
+ v_diff = v_diff[sorted_indices]
203
+ force = force[sorted_indices]
204
+
205
+ # Match Betacool and Xsuite indices to compare forces
206
+ v_diff_betacool = v_diff_betacool[~np.isnan(v_diff_betacool)]
207
+ matching_indices = [np.abs(v_diff - vb).argmin() for vb in v_diff_betacool]
208
+
209
+ force_xsuite = np.array([force[i] for i in matching_indices])
210
+ force_betacool = force_betacool[:len(v_diff_betacool)]
211
+
212
+ xo.assert_allclose(force_xsuite, force_betacool, rtol=0, atol=10)
@@ -5,6 +5,7 @@
5
5
 
6
6
  import numpy as np
7
7
  import pytest
8
+ import pathlib
8
9
  from cpymad.madx import Madx
9
10
  from scipy.stats import linregress
10
11
  from scipy import constants as cst
@@ -15,6 +16,9 @@ import xtrack as xt
15
16
  from xobjects.test_helpers import for_all_test_contexts, fix_random_seed
16
17
  from xtrack.beam_elements.elements import _angle_from_trig
17
18
 
19
+ test_data_folder = pathlib.Path(
20
+ __file__).parent.joinpath('../test_data').absolute()
21
+
18
22
 
19
23
  @for_all_test_contexts
20
24
  def test_constructor(test_context):
@@ -43,6 +47,8 @@ def test_constructor(test_context):
43
47
  sampling_frequency=1e3),
44
48
  xt.Bend(_context=test_context, length=1.),
45
49
  xt.Quadrupole(_context=test_context, length=1.),
50
+ xt.ElectronCooler(_context=test_context,current=2.4,length=1.5,radius_e_beam=25*1e-3,
51
+ temp_perp=0.01,temp_long=0.001,magnetic_field=0.060)
46
52
  ]
47
53
 
48
54
  # test to_dict / from_dict
@@ -1246,3 +1252,5 @@ def test_multipole_tilt_90_deg(test_context):
1246
1252
  xo.assert_allclose(pf.py, pfy.py, rtol=0, atol=1e-14)
1247
1253
  xo.assert_allclose(pf.zeta, pfy.zeta, rtol=0, atol=1e-14)
1248
1254
  xo.assert_allclose(pf.ptau, pfy.ptau, rtol=0, atol=1e-14)
1255
+
1256
+
@@ -11,6 +11,50 @@ test_data_folder = pathlib.Path(
11
11
  __file__).parent.joinpath('../test_data').absolute()
12
12
 
13
13
 
14
+
15
+
16
+ @for_all_test_contexts
17
+ def test_chi(test_context):
18
+ ''' Tests if particles are deflected in quadrupoles according to their chi value.'''
19
+
20
+ quad1 = xt.Quadrupole(knl=[0,-0.005])
21
+ ql = xt.Line(
22
+ elements = [xt.Drift(length=10), quad1, xt.Drift(length=100)],
23
+ element_names = ['drift_0', 'quad_0', 'drift_1'])
24
+
25
+
26
+ ql.build_tracker(_context = test_context)
27
+
28
+ print(f"Test {test_context.__class__}")
29
+
30
+ z0 = 82
31
+ z = 82
32
+ m = 192755492342.6663 # pb207
33
+ m0 = 193687690162.6481
34
+ ql.particle_ref = xp.Particles(p0c=6.8e12*z0 , q0=z0, mass0=m0)
35
+
36
+ # reference species with effective rigidity
37
+ part1 = ql.particle_ref.copy(_context=test_context)
38
+ delta = 0
39
+ chi = (z0/z)*(m/m0)
40
+ part1.delta = (1 + delta)/(chi) - 1
41
+
42
+ # pb207
43
+ part2 = ql.particle_ref.copy(_context=test_context)
44
+ part2.chi = (z0/z)*(m/m0)
45
+ part2.charge_ratio = (z/z0)
46
+
47
+ #
48
+ x0 = 0.0001
49
+ part1.x = x0
50
+ part2.x = x0
51
+
52
+ ql.track(part1)
53
+ ql.track(part2)
54
+
55
+ xo.assert_allclose(part1.x[0], part2.x[0], rtol=0, atol=1e-6)
56
+
57
+
14
58
  @for_all_test_contexts
15
59
  def test_ions(test_context):
16
60
 
@@ -45,81 +45,74 @@ def test_simple_parser():
45
45
  return; ! should also be ignored
46
46
  """
47
47
 
48
- expected: MadxOutputType = {
49
- 'vars': {
50
- 'third': {'deferred': False, 'expr': '(1.0 / 3.0)'},
51
- 'power': {'deferred': False, 'expr': '(3.0 ** 4.0)'},
52
- 'hello': {'deferred': True, 'expr': '(third * twopi)'},
53
- 'mb.l': {'deferred': False, 'expr': 1.0},
54
- 'qd.l': {'deferred': False, 'expr': 0.5},
55
- 'offset': {'deferred': True, 'expr': 0.1},
56
- },
48
+ env = xt.Environment()
49
+ env['twopi'] = 2 * math.pi
50
+ parser = MadxParser(vars=env.vars, functions=env.functions)
51
+ result = parser.parse_string(sequence)
52
+
53
+ expected = {
57
54
  'elements': {
58
55
  'mb': {
59
- 'angle': {'deferred': True, 'expr': 'hello'},
60
- 'l': {'deferred': True, 'expr': 'mb.l'},
56
+ 'angle': env.vars['hello'],
57
+ 'l': env.vars['mb.l'],
61
58
  'parent': 'sbend',
62
59
  },
63
60
  'qf': {
64
- 'k1': {'deferred': True, 'expr': 1.0},
65
- 'l': {'deferred': True, 'expr': 1.0},
61
+ 'k1': 1.0,
62
+ 'l': 1.0,
66
63
  'parent': 'quadrupole',
67
64
  },
68
65
  'qd': {
69
- 'k1': {'deferred': True, 'expr': -1.0},
70
- 'l': {'deferred': True, 'expr': 1.0},
66
+ 'k1': -1.0,
67
+ 'l': 1.0,
71
68
  'parent': 'quadrupole',
72
69
  },
73
70
  },
74
71
  'lines': {
75
72
  'line': {
76
- 'l': {'deferred': False, 'expr': 12.0},
73
+ 'l': 12.0,
77
74
  'parent': 'sequence',
78
75
  'elements': {
79
76
  'ip1': {
80
- 'at': {'deferred': False, 'expr': 0.0},
77
+ 'at': 0.0,
81
78
  'parent': 'marker',
82
79
  },
83
80
  'qf1': {
84
- 'at': {'deferred': True, 'expr': '(1.0 + offset)'},
85
- 'from': {'deferred': False, 'expr': 'ip1'},
81
+ 'at': 1.0 + env.vars['offset'],
82
+ 'from': 'ip1',
86
83
  'parent': 'qf',
87
- 'slot_id': {'deferred': False, 'expr': 1.0},
84
+ 'slot_id': 1.0,
88
85
  },
89
86
  'mb1': {
90
- 'at': {'deferred': True, 'expr': '(2.0 + offset)'},
91
- 'from': {'deferred': False, 'expr': 'ip1'},
87
+ 'at': 2.0 + env.vars['offset'],
88
+ 'from': 'ip1',
92
89
  'parent': 'mb',
93
- 'slot_id': {'deferred': False, 'expr': 2.0},
90
+ 'slot_id': 2.0,
94
91
  },
95
92
  'qd1': {
96
- 'at': {'deferred': True, 'expr': '(3.0 + offset)'},
97
- 'from': {'deferred': False, 'expr': 'ip1'},
93
+ 'at': 3.0 + env.vars['offset'],
94
+ 'from': 'ip1',
98
95
  'parent': 'qd',
99
- 'slot_id': {'deferred': False, 'expr': 3.0},
96
+ 'slot_id': 3.0,
100
97
  },
101
98
  },
102
99
  },
103
100
  },
104
101
  'parameters': {
105
102
  'mb1': {
106
- 'k0': {'deferred': True, 'expr': 'hello'},
107
- 'polarity': {'deferred': False, 'expr': 1.0},
103
+ 'k0': env.vars['hello'],
104
+ 'polarity': 1.0,
108
105
  },
109
106
  'qf1': {
110
- 'knl': {'deferred': True, 'expr': [0.0, 0.0, 0.0, 0.01, 0.0]},
107
+ 'knl': [0.0, 0.0, 0.0, 0.01, 0.0],
111
108
  },
112
109
  'qd1': {
113
- 'knl': {'deferred': True, 'expr': [0.0, 0.0, 0.0, -0.01, 0.0]},
110
+ 'knl': [0.0, 0.0, 0.0, -0.01, 0.0],
114
111
  },
115
112
  },
116
113
  }
117
114
 
118
- parser = MadxParser()
119
- result = parser.parse_string(sequence)
120
-
121
115
  def _order_madx_output(item):
122
- item['vars'] = OrderedDict(item['vars'])
123
116
  item['elements'] = OrderedDict(item['elements'])
124
117
  item['lines'] = OrderedDict(item['lines'])
125
118
  for line in item['lines'].values():
@@ -137,6 +130,7 @@ def test_simple_parser():
137
130
  [
138
131
  ('a := 42;', 42, None),
139
132
  ('c := 3; d := 4; a := c^d;', 81, '(c ** d)'),
133
+ ('c := 3; d := 4; a = c^d;', 81, None),
140
134
  ]
141
135
  )
142
136
  def test_parse_simple_expression(input, value, expr):
@@ -146,6 +140,10 @@ def test_parse_simple_expression(input, value, expr):
146
140
  if expr is not None:
147
141
  formatter = CompactFormatter(None)
148
142
  assert env.get_expr('a')._formatted(formatter) == expr
143
+ else:
144
+ assert env.get_expr('a') is None
145
+ env['c'] = 8
146
+ assert env['a'] == value
149
147
 
150
148
 
151
149
  @pytest.fixture(scope='module')
@@ -890,13 +888,12 @@ def test_import_seq_length():
890
888
  sequence = """
891
889
  qu: quadrupole, l=2, k1=3, k1s=4, tilt=2; ! ignore thick and ktap
892
890
 
893
- line: sequence, l = ll;
894
- qu1: qu, at = 19;
895
- endsequence;
896
-
897
891
  ll := 3 * a;
898
892
  a = 10;
899
893
 
894
+ line: sequence, l = ll;
895
+ qu1: qu, at = 19;
896
+ endsequence;
900
897
  """
901
898
 
902
899
  env = xt.load_madx_lattice(string=sequence)
@@ -904,7 +901,7 @@ def test_import_seq_length():
904
901
  tt = env.line.get_table()
905
902
  assert np.all(tt.name == np.array(['drift_1', 'qu1', 'drift_2', '_end_point']))
906
903
  xo.assert_allclose(tt['s'], np.array([ 0., 18., 20., 30.]), rtol=0, atol=1e-15)
907
- assert env.line.builder.length == 'll'
904
+ assert env.line.builder.length == 30
908
905
 
909
906
 
910
907
  def test_repeated_element_mad_behaviour():
@@ -0,0 +1,79 @@
1
+ import xtrack as xt
2
+ import xpart as xp
3
+
4
+ def test_optimize_with_radiation():
5
+
6
+ env = xt.Environment()
7
+
8
+ env.new('mb', xt.Bend, length=1, k0=1, h=1)
9
+ env.new('mq', xt.Quadrupole, length=1, k1=1)
10
+ env.new('ms', xt.Sextupole, length=1, k2=1)
11
+ env.new('mo', xt.Octupole, length=1, k3=1)
12
+
13
+ element_list = ['mb', 'mq', 'ms', 'mo']
14
+
15
+ for element in element_list:
16
+ line = env.new_line(components=[element])
17
+
18
+ line.slice_thick_elements(
19
+ slicing_strategies=[xt.Strategy(slicing=xt.Teapot(1))])
20
+
21
+ line.build_tracker()
22
+ line.configure_radiation('mean')
23
+
24
+ part = xp.Particles(p0c=1e15, x=0.11)
25
+ line.track(part)
26
+
27
+ line.optimize_for_tracking()
28
+ part_opt = xp.Particles(p0c=1e15, x=0.11)
29
+ line.track(part_opt)
30
+
31
+ assert part.x == part_opt.x
32
+ assert part.y == part_opt.y
33
+ assert part.px == part_opt.px
34
+ assert part.py == part_opt.py
35
+ assert part.zeta == part_opt.zeta
36
+ assert part.pzeta == part_opt.pzeta
37
+
38
+ def test_optimize_with_delta_taper():
39
+
40
+ env = xt.Environment()
41
+
42
+ env.new('mb', xt.Bend, length=1, k0=1, h=1)
43
+ env.new('mq', xt.Quadrupole, length=1, k1=1)
44
+ env.new('ms', xt.Sextupole, length=1, k2=1)
45
+ env.new('mo', xt.Octupole, length=1, k3=1)
46
+
47
+ thin_classes = [xt.ThinSliceBendEntry, xt.ThinSliceBendExit, xt.ThinSliceBend,
48
+ xt.ThinSliceQuadrupole, xt.ThinSliceSextupole, xt.ThinSliceOctupole]
49
+
50
+ element_list = ['mb', 'mq', 'ms', 'mo']
51
+
52
+ for element in element_list:
53
+ line = env.new_line(components=[element])
54
+
55
+
56
+ line.slice_thick_elements(
57
+ slicing_strategies=[xt.Strategy(slicing=xt.Teapot(1))])
58
+
59
+ for el in line.elements:
60
+ if type(el) in thin_classes:
61
+ el.delta_taper = 0.1
62
+ print(el)
63
+
64
+ line.build_tracker()
65
+ line.configure_radiation('mean')
66
+
67
+ part = xp.Particles(p0c=1e15, x=0.11)
68
+ line.track(part)
69
+
70
+ line.optimize_for_tracking()
71
+ part_opt = xp.Particles(p0c=1e15, x=0.11)
72
+ line.track(part_opt)
73
+
74
+ assert part.x == part_opt.x
75
+ assert part.y == part_opt.y
76
+ assert part.px == part_opt.px
77
+ assert part.py == part_opt.py
78
+ assert part.zeta == part_opt.zeta
79
+ assert part.pzeta == part_opt.pzeta
@@ -0,0 +1 @@
1
+ __version__ = '0.80.1'
@@ -21,6 +21,8 @@ from xtrack.beam_elements.magnets import (
21
21
  DEFAULT_MULTIPOLE_ORDER, SynchrotronRadiationRecord, _prepare_multipolar_params,
22
22
  _NOEXPR_FIELDS, COMMON_MAGNET_SOURCES
23
23
  )
24
+ from xtrack.internal_record import RecordIndex
25
+
24
26
 
25
27
  class ReferenceEnergyIncrease(BeamElement):
26
28
 
@@ -3195,6 +3197,121 @@ class SecondOrderTaylorMap(BeamElement):
3195
3197
 
3196
3198
  return out
3197
3199
 
3200
+ class ElectronCoolerRecord(xo.HybridClass):
3201
+ _xofields = {
3202
+ '_index': RecordIndex,
3203
+ 'Fx': xo.Float64[:],
3204
+ 'Fy': xo.Float64[:],
3205
+ 'Fl': xo.Float64[:],
3206
+ 'particle_id': xo.Float64[:]}
3207
+ class ElectronCooler(BeamElement):
3208
+ """
3209
+ Beam element modeling an electron cooler. In particular, this beam element uses the Parkhomchuk model for electron cooling.
3210
+ Every turn each particle receives transverse and longitudinal kicks based on the cooling force provided by the Parkhomchuk model.
3211
+
3212
+
3213
+ Parameters
3214
+ ----------
3215
+ current : float, optional
3216
+ The current in the electron beam, in amperes.
3217
+ length : float, optional
3218
+ The length of the electron cooler, in meters.
3219
+ radius_e_beam : float, optional
3220
+ The radius of the electron beam, in meters.
3221
+ temp_perp : float, optional
3222
+ The transverse temperature of the electron beam, in electron volts.
3223
+ temp_long : float, optional
3224
+ The longitudinal temperature of the electron beam, in electron volts.
3225
+ magnetic_field : float, optional
3226
+ The magnetic field strength, in tesla.
3227
+ offset_x : float, optional
3228
+ The horizontal offset of the electron cooler, in meters.
3229
+ offset_px : float, optional
3230
+ The horizontal angle of the electron cooler, in rad.
3231
+ offset_y : float, optional
3232
+ The horizontal offset of the electron cooler, in meters.
3233
+ offset_py : float, optional
3234
+ The vertical angle of the electron cooler, in rad.
3235
+ offset_energy : float, optional
3236
+ The energy offset of the electrons, in eV.
3237
+ magnetic_field_ratio : float, optional
3238
+ The ratio of perpendicular component of magnetic field with the
3239
+ longitudinal component of the magnetic field. This is a measure
3240
+ of the magnetic field quality. With the ideal magnetic field quality
3241
+ being 0.
3242
+ space_charge : float, optional
3243
+ Whether space charge of electron beam is enabled. 0 is off and 1 is on.
3244
+
3245
+ """
3246
+
3247
+ _xofields = {
3248
+ 'current' : xo.Float64,
3249
+ 'length' : xo.Float64,
3250
+ 'radius_e_beam' : xo.Float64,
3251
+ 'temp_perp' : xo.Float64,
3252
+ 'temp_long' : xo.Float64,
3253
+ 'magnetic_field': xo.Float64,
3254
+
3255
+ 'offset_x' : xo.Float64,
3256
+ 'offset_px' : xo.Float64,
3257
+ 'offset_y' : xo.Float64,
3258
+ 'offset_py' : xo.Float64,
3259
+ 'offset_energy' : xo.Float64,
3260
+
3261
+ 'magnetic_field_ratio' : xo.Float64,
3262
+ 'space_charge_factor' : xo.Float64,
3263
+ 'record_flag': xo.Int64,
3264
+ }
3265
+
3266
+ _extra_c_sources = [
3267
+ _pkg_root.joinpath('headers/constants.h'),
3268
+ _pkg_root.joinpath('beam_elements/elements_src/electroncooler.h')]
3269
+
3270
+ _internal_record_class = ElectronCoolerRecord
3271
+
3272
+ def __init__(self, current = 0,
3273
+ length = 0,
3274
+ radius_e_beam = 0,
3275
+ temp_perp = 0,
3276
+ temp_long = 0,
3277
+ magnetic_field = 0,
3278
+
3279
+ offset_x = 0,
3280
+ offset_px = 0,
3281
+ offset_y = 0,
3282
+ offset_py = 0,
3283
+ offset_energy = 0,
3284
+
3285
+ magnetic_field_ratio = 0,
3286
+ space_charge_factor = 0,
3287
+ record_flag =0,
3288
+ **kwargs):
3289
+
3290
+ if "_xobject" in kwargs:
3291
+ self.xoinitialize(_xobject=kwargs['_xobject'])
3292
+ return
3293
+
3294
+ super().__init__(**kwargs)
3295
+ self.current = current
3296
+ self.length = length
3297
+ self.radius_e_beam = radius_e_beam
3298
+ self.temp_perp = temp_perp
3299
+ self.temp_long = temp_long
3300
+ self.magnetic_field = magnetic_field
3301
+
3302
+ self.offset_x = offset_x
3303
+ self.offset_px = offset_px
3304
+ self.offset_y = offset_y
3305
+ self.offset_py = offset_py
3306
+ self.offset_energy = offset_energy
3307
+
3308
+ self.magnetic_field_ratio = magnetic_field_ratio
3309
+ self.space_charge_factor = space_charge_factor
3310
+ self.record_flag = record_flag
3311
+
3312
+ def get_backtrack_element(self, _context=None, _buffer=None, _offset=None):
3313
+ raise NotImplementedError
3314
+
3198
3315
  class ThinSliceNotNeededError(Exception):
3199
3316
  pass
3200
3317