xtrack 0.87.1__tar.gz → 0.88.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 (322) hide show
  1. {xtrack-0.87.1/xtrack.egg-info → xtrack-0.88.1}/PKG-INFO +1 -1
  2. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_lhc_match_phase_15.py +2 -2
  3. xtrack-0.88.1/tests/test_load_vars.py +120 -0
  4. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_madnginterface.py +1 -1
  5. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_magnet.py +2 -2
  6. xtrack-0.88.1/tests/test_quadrupole_fringe_ptc.py +66 -0
  7. xtrack-0.88.1/tests/test_quadrupole_wedge.py +94 -0
  8. xtrack-0.88.1/tests/test_rbend_straight_body.py +348 -0
  9. xtrack-0.88.1/tests/test_survey.py +499 -0
  10. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_vs_madx.py +1 -1
  11. xtrack-0.88.1/xtrack/_version.py +1 -0
  12. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements.py +37 -0
  13. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/rbend.h +1 -1
  14. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +1 -1
  15. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +1 -1
  16. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +1 -1
  17. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +1 -1
  18. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet.h +70 -3
  19. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet_edge.h +12 -2
  20. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +9 -10
  21. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_wedge.h +27 -1
  22. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/wedge.h +12 -1
  23. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/magnets.py +8 -1
  24. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/line.py +106 -35
  25. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multisetter/multisetter.py +2 -2
  26. xtrack-0.88.1/xtrack/survey.py +587 -0
  27. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/twiss.py +2 -2
  28. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/twissplot.py +1 -1
  29. {xtrack-0.87.1 → xtrack-0.88.1/xtrack.egg-info}/PKG-INFO +1 -1
  30. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack.egg-info/SOURCES.txt +4 -0
  31. xtrack-0.87.1/tests/test_survey.py +0 -124
  32. xtrack-0.87.1/xtrack/_version.py +0 -1
  33. xtrack-0.87.1/xtrack/survey.py +0 -323
  34. {xtrack-0.87.1 → xtrack-0.88.1}/LICENSE +0 -0
  35. {xtrack-0.87.1 → xtrack-0.88.1}/MANIFEST.in +0 -0
  36. {xtrack-0.87.1 → xtrack-0.88.1}/README.md +0 -0
  37. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/__init__.py +0 -0
  38. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/base_classes.py +0 -0
  39. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/BB6D.py +0 -0
  40. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  41. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/__init__.py +0 -0
  42. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/beambeam.py +0 -0
  43. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/boost.py +0 -0
  44. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  45. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  46. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/qgauss.py +0 -0
  47. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/slicing.py +0 -0
  48. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
  49. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/elements.py +0 -0
  50. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/line.py +0 -0
  51. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/mathlibs.py +0 -0
  52. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/particles.py +0 -0
  53. {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/temp_pyparticles.py +0 -0
  54. {xtrack-0.87.1 → xtrack-0.88.1}/pyproject.toml +0 -0
  55. {xtrack-0.87.1 → xtrack-0.88.1}/setup.cfg +0 -0
  56. {xtrack-0.87.1 → xtrack-0.88.1}/setup.py +0 -0
  57. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_acceleration.py +0 -0
  58. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_amplitude_detuning.py +0 -0
  59. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_aperture_table.py +0 -0
  60. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  61. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_apertures.py +0 -0
  62. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_attr_replicas_and_slices.py +0 -0
  63. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_bucket_with_ref_energy_change.py +0 -0
  64. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_cavity_absolute_time.py +0 -0
  65. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
  66. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_coasting.py +0 -0
  67. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_collective_tracker.py +0 -0
  68. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_collimation.py +0 -0
  69. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_electron_cooler.py +0 -0
  70. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_element_characterization_functions.py +0 -0
  71. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_element_internal_record.py +0 -0
  72. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_elements.py +0 -0
  73. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_elements_classflags.py +0 -0
  74. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_elements_thick.py +0 -0
  75. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_environment.py +0 -0
  76. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  77. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  78. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_footprint.py +0 -0
  79. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_freeze_longitudinal.py +0 -0
  80. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_full_rings.py +0 -0
  81. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_h6_sps_beamline.py +0 -0
  82. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_hvkick.py +0 -0
  83. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_ions.py +0 -0
  84. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_legacy_multiline_to_env.py +0 -0
  85. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_lhc_env.py +0 -0
  86. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_line.py +0 -0
  87. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_load.py +0 -0
  88. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_lumi.py +0 -0
  89. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_mad_writer.py +0 -0
  90. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_madloader.py +0 -0
  91. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_and_track_from_element.py +0 -0
  92. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_coupling_knob.py +0 -0
  93. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_nested.py +0 -0
  94. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_optics_and_ip_knob.py +0 -0
  95. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  96. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_orbit_bump.py +0 -0
  97. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_tune_chroma_cminus.py +0 -0
  98. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_monitor.py +0 -0
  99. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_multi_bunch_gauss.py +0 -0
  100. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_multiline.py +0 -0
  101. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_multisetter.py +0 -0
  102. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_multispecies.py +0 -0
  103. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_native_madloader.py +0 -0
  104. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_optimize_for_tracking.py +0 -0
  105. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_particles.py +0 -0
  106. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_particles_basics.py +0 -0
  107. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_particles_pdg.py +0 -0
  108. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_periodic_symmetric_twiss_and_match.py +0 -0
  109. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_pipeline.py +0 -0
  110. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_prebuild_kernels.py +0 -0
  111. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_ps_against_ptc.py +0 -0
  112. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_ps_multiturn_twiss.py +0 -0
  113. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_psb_chicane.py +0 -0
  114. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_pyht_interface.py +0 -0
  115. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radial_steering.py +0 -0
  116. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radiation.py +0 -0
  117. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
  118. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  119. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radiation_integrals.py +0 -0
  120. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_random_gen.py +0 -0
  121. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_random_gen_exp.py +0 -0
  122. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_random_gen_gauss.py +0 -0
  123. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_random_gen_ruth.py +0 -0
  124. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_rbend_rbarc.py +0 -0
  125. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_rf_track.py +0 -0
  126. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_rotation_signs.py +0 -0
  127. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_second_order_taylor_map.py +0 -0
  128. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_seeds.py +0 -0
  129. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
  130. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_slice_elements.py +0 -0
  131. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_slicing.py +0 -0
  132. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  133. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  134. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_spacecharge_in_ring.py +0 -0
  135. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_spin.py +0 -0
  136. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_sps_thick.py +0 -0
  137. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_tapering.py +0 -0
  138. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_thick_lhc.py +0 -0
  139. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_tilt_shifts.py +0 -0
  140. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_tracker.py +0 -0
  141. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_trajectory_correcton.py +0 -0
  142. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_twiss.py +0 -0
  143. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_twiss_vs_madx_psb.py +0 -0
  144. {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_xmask_orbit_correction.py +0 -0
  145. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/__init__.py +0 -0
  146. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/__init__.py +0 -0
  147. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  148. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  149. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  150. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
  151. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  152. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  153. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  154. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/aperture_meas.py +0 -0
  155. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/base_element.py +0 -0
  156. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/__init__.py +0 -0
  157. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures.py +0 -0
  158. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  159. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  160. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  161. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  162. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  163. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  164. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/beam_interaction.py +0 -0
  165. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
  166. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  167. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
  168. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  169. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  170. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift.h +0 -0
  171. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  172. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  173. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  174. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  175. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  176. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  177. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
  178. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  179. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
  180. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  181. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  182. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
  183. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  184. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  185. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  186. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  187. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  188. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/marker.h +0 -0
  189. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  190. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  191. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  192. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  193. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  194. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  195. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  196. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  197. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  198. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  199. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  200. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/slnd.h +0 -0
  201. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  202. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  203. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  204. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  205. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  206. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
  207. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  208. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  209. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  210. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  211. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  212. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  213. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  214. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  215. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  216. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  217. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  218. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  219. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
  220. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
  221. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_cavity.h +0 -0
  222. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  223. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  224. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  225. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  226. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
  227. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  228. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
  229. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  230. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  231. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
  232. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  233. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  234. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  235. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  236. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  237. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
  238. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
  239. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  240. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  241. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  242. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  243. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/exciter.py +0 -0
  244. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/rft_element.py +0 -0
  245. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/slice_elements_edge.py +0 -0
  246. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  247. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/slice_elements_thin.py +0 -0
  248. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/environment.py +0 -0
  249. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/footprint.py +0 -0
  250. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/general.py +0 -0
  251. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/atomicadd.h +0 -0
  252. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/checks.h +0 -0
  253. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/constants.h +0 -0
  254. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/particle_states.h +0 -0
  255. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/synrad_spectrum.h +0 -0
  256. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/track.h +0 -0
  257. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/internal_record.py +0 -0
  258. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/json.py +0 -0
  259. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/linear_normal_form.py +0 -0
  260. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/load.py +0 -0
  261. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/loss_location_refinement/__init__.py +0 -0
  262. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  263. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/lumi.py +0 -0
  264. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_loader.py +0 -0
  265. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_parser/__init__.py +0 -0
  266. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_parser/loader.py +0 -0
  267. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_parser/madx.lark +0 -0
  268. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_parser/parse.py +0 -0
  269. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_writer.py +0 -0
  270. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/madng_interface.py +0 -0
  271. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/match.py +0 -0
  272. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/__init__.py +0 -0
  273. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_position_monitor.h +0 -0
  274. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_position_monitor.py +0 -0
  275. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
  276. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
  277. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_size_monitor.h +0 -0
  278. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_size_monitor.py +0 -0
  279. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/last_turns_monitor.h +0 -0
  280. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/last_turns_monitor.py +0 -0
  281. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/particles_monitor.h +0 -0
  282. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/particles_monitor.py +0 -0
  283. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multiline.py +0 -0
  284. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multiline_legacy/__init__.py +0 -0
  285. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  286. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  287. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multisetter/__init__.py +0 -0
  288. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/__init__.py +0 -0
  289. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/constants.py +0 -0
  290. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/masses.py +0 -0
  291. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/particles.py +0 -0
  292. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/pdg.py +0 -0
  293. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/rng_src/base_rng.h +0 -0
  294. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
  295. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/pipeline/__init__.py +0 -0
  296. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/pipeline/core.py +0 -0
  297. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/pipeline/manager.py +0 -0
  298. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/pipeline/multitracker.py +0 -0
  299. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/progress_indicator.py +0 -0
  300. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/__init__.py +0 -0
  301. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_generators.py +0 -0
  302. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/exponential.h +0 -0
  303. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  304. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/normal.h +0 -0
  305. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/rutherford.h +0 -0
  306. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/uniform.h +0 -0
  307. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
  308. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/slicing.py +0 -0
  309. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/svgutils/__init__.py +0 -0
  310. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/svgutils/parser.py +0 -0
  311. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/svgutils/path.py +0 -0
  312. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/svgutils/svgutils.py +0 -0
  313. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/synctime.py +0 -0
  314. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/tapering.py +0 -0
  315. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/targets.py +0 -0
  316. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/tracker.py +0 -0
  317. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/tracker_data.py +0 -0
  318. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/tracker_src/tracker.h +0 -0
  319. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/trajectory_correction.py +0 -0
  320. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack.egg-info/dependency_links.txt +0 -0
  321. {xtrack-0.87.1 → xtrack-0.88.1}/xtrack.egg-info/requires.txt +0 -0
  322. {xtrack-0.87.1 → xtrack-0.88.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.87.1
3
+ Version: 0.88.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
@@ -17,9 +17,9 @@ test_data_folder = pathlib.Path(
17
17
  'config',
18
18
  ['noshift', 'shift']
19
19
  )
20
- @for_all_test_contexts
21
20
  @fix_random_seed(2836475)
22
- def test_lhc_match_phase_15(test_context, config):
21
+ def test_lhc_match_phase_15(config):
22
+ test_context = xo.ContextCpu()
23
23
 
24
24
  if config == 'noshift':
25
25
  d_mux_15_b1 = 0
@@ -0,0 +1,120 @@
1
+ # copyright ############################### #
2
+ # This file is part of the Xtrack Package. #
3
+ # Copyright (c) CERN, 2025. #
4
+ # ######################################### #
5
+ import pytest
6
+ import xtrack as xt
7
+ import json
8
+ import textwrap
9
+
10
+
11
+ @pytest.fixture
12
+ def madx_vars():
13
+ return """
14
+ b := 3 * a;
15
+ a = 5;
16
+ c := 4 * z;
17
+ """
18
+
19
+
20
+ @pytest.fixture
21
+ def json_vars():
22
+ dct = {
23
+ 'b': '3 * a',
24
+ 'a': 5,
25
+ 'c': '4 * z'
26
+ }
27
+ return json.dumps(dct)
28
+
29
+
30
+ @pytest.fixture
31
+ def python_file():
32
+ source = """
33
+ import xtrack as xt
34
+ env = xt.get_environment()
35
+ env.vars.default_to_zero = True
36
+ env['b'] = '3 * a'
37
+ env['a'] = 5
38
+ env['c'] = '4 * z'
39
+ """
40
+ return textwrap.dedent(source)
41
+
42
+
43
+ @pytest.mark.parametrize(
44
+ 'input_fixture,format', [
45
+ ('madx_vars', 'madx'),
46
+ ('json_vars', 'json'),
47
+ ]
48
+ )
49
+ def test_load_vars_string(input_fixture, format, request):
50
+ input_data = request.getfixturevalue(input_fixture)
51
+ env = xt.Environment()
52
+ env.vars.load(string=input_data, format=format)
53
+
54
+ assert str(env.get_expr('b')) == "(3.0 * vars['a'])"
55
+ assert env['b'] == 15
56
+ assert env.get_expr('a') is None
57
+ assert env['a'] == 5
58
+ assert str(env.get_expr('c')) == "(4.0 * vars['z'])"
59
+ assert env['c'] == 0
60
+ assert env.get_expr('z') is None
61
+ assert env['z'] == 0
62
+
63
+ @pytest.mark.parametrize(
64
+ 'input_fixture,format,suffix', [
65
+ ('madx_vars', 'madx', 'madx'),
66
+ ('json_vars', 'json', 'json'),
67
+ ('python_file', 'python', 'py'),
68
+ ]
69
+ )
70
+ @pytest.mark.parametrize('with_format', [True, False])
71
+ def test_load_file(input_fixture, format, suffix, with_format, tmpdir, request):
72
+ input_data = request.getfixturevalue(input_fixture)
73
+
74
+ temp_file = tmpdir / f'test_input.{suffix}'
75
+ with open(temp_file, 'w') as f:
76
+ f.write(input_data)
77
+
78
+ kwargs = {'file': str(temp_file)}
79
+ if with_format:
80
+ kwargs['format'] = format
81
+ env = xt.Environment()
82
+ env.vars.load(**kwargs)
83
+
84
+ assert str(env.get_expr('b')) == "(3.0 * vars['a'])"
85
+ assert env['b'] == 15
86
+ assert env.get_expr('a') is None
87
+ assert env['a'] == 5
88
+ assert str(env.get_expr('c')) == "(4.0 * vars['z'])"
89
+ assert env['c'] == 0
90
+ assert env.get_expr('z') is None
91
+ assert env['z'] == 0
92
+
93
+
94
+ @pytest.mark.parametrize(
95
+ 'input_fixture,format,suffix', [
96
+ ('madx_vars', 'madx', 'madx'),
97
+ ('json_vars', 'json', 'json'),
98
+ ]
99
+ )
100
+ @pytest.mark.parametrize('with_format', [True, False])
101
+ def test_load_http(input_fixture, format, suffix, with_format, tmpdir, request, requests_mock):
102
+ input_data = request.getfixturevalue(input_fixture)
103
+
104
+ url = f'http://example.com/test_input.{suffix}'
105
+ requests_mock.get(url, text=input_data)
106
+
107
+ kwargs = {'file': url}
108
+ if with_format:
109
+ kwargs['format'] = format
110
+ env = xt.Environment()
111
+ env.vars.load(**kwargs)
112
+
113
+ assert str(env.get_expr('b')) == "(3.0 * vars['a'])"
114
+ assert env['b'] == 15
115
+ assert env.get_expr('a') is None
116
+ assert env['a'] == 5
117
+ assert str(env.get_expr('c')) == "(4.0 * vars['z'])"
118
+ assert env['c'] == 0
119
+ assert env.get_expr('z') is None
120
+ assert env['z'] == 0
@@ -124,6 +124,6 @@ def test_madng_survey():
124
124
  xo.assert_allclose(survey.psi, xsurvey.psi, atol=1e-5, rtol=0)
125
125
  xo.assert_allclose(survey.s, xsurvey.s, atol=1e-5, rtol=0)
126
126
  xo.assert_allclose(survey.angle, xsurvey.angle, atol=1e-5, rtol=0)
127
- xo.assert_allclose(survey.tilt, xsurvey.tilt, atol=1e-5, rtol=0)
127
+ xo.assert_allclose(survey.tilt, xsurvey.rot_s_rad, atol=1e-5, rtol=0)
128
128
  # Length doesn't work because of multipoles.
129
129
  #xo.assert_allclose(survey.length, xsurvey.length, atol=1e-5, rtol=0)
@@ -992,7 +992,7 @@ def test_edge_full_model_with_dipole_component_and_angle(test_context):
992
992
  # The rotation is also the other way than in the underlying map :'(
993
993
  xt.DipoleEdge(model='full', k=3, fint=0.3, hgap=0.4),
994
994
  xt.MultipoleEdge(kn=[0, 4, 5], order=2),
995
- xt.Wedge(angle=-0.2, k=3),
995
+ xt.Wedge(angle=-0.2, k=3, k1=4, quad_wedge_then_dip_wedge=1),
996
996
  ]
997
997
 
998
998
  p0 = xt.Particles(
@@ -1030,7 +1030,7 @@ def test_edge_full_model_with_dipole_component_and_angle_exit(test_context):
1030
1030
  fringe_integral=0.3, half_gap=0.4, k_order=2, _context=test_context
1031
1031
  )
1032
1032
  e_ref = [
1033
- xt.Wedge(angle=-0.2, k=3),
1033
+ xt.Wedge(angle=-0.2, k=3, k1=4),
1034
1034
  xt.MultipoleEdge(kn=[0, 4, 5], is_exit=True, order=2),
1035
1035
  xt.DipoleEdge(model='full', k=-3, fint=0.3, hgap=0.4),
1036
1036
  xt.YRotation(angle=np.rad2deg(-0.2)),
@@ -0,0 +1,66 @@
1
+ # Checks entrance fringe for very strong quadrupole against values of PTC
2
+
3
+ import xtrack as xt
4
+ import numpy as np
5
+ from cpymad.madx import Madx
6
+
7
+ def test_quadrupole_fringe_ptc():
8
+ b2 = 100
9
+ b1 = 0
10
+ length=1e-20
11
+
12
+ # Initial conditions
13
+ x0 = 0.07
14
+ px0 = 0.03
15
+ y0 = 0.08
16
+ py0 = 0.06
17
+ zeta0 = 0.04
18
+ delta0=0.1
19
+ beta0=0.1
20
+
21
+ p0 = xt.Particles(x=x0,px=px0,y=y0,py=py0,delta=delta0,zeta=zeta0,beta0=beta0)
22
+
23
+ ptau0 = float(p0.ptau)
24
+ tau0 = zeta0/beta0
25
+
26
+ # XSuite
27
+ quadrupole = xt.Bend(length=length, k0=b1, k1=b2,
28
+ edge_entry_model='full', edge_exit_model='full')
29
+ line = xt.Line(elements=[ quadrupole])
30
+ line.discard_tracker()
31
+ line.build_tracker()
32
+ line.track(p0)
33
+
34
+ mat = line.compute_one_turn_matrix_finite_differences(p0)['R_matrix']
35
+ det = np.linalg.det(mat)
36
+
37
+ assert np.isclose(det, 1.0)
38
+
39
+ # PTC
40
+ madx_sequence = line.to_madx_sequence('quadrupole_fringes')
41
+
42
+ madx = Madx()
43
+ madx.beam(particle='proton', beta=beta0)
44
+ madx.input(madx_sequence)
45
+ madx.use('quadrupole_fringes')
46
+
47
+ madx.input(f"""
48
+ ptc_create_universe;
49
+ ptc_create_layout, exact=true;
50
+ ptc_setswitch, fringe=true;
51
+ ptc_start, x={x0}, px={px0}, y={y0}, py={py0}, t={tau0}, pt={ptau0};
52
+ ptc_track, icase=6, TURNS=1;
53
+ ptc_track_end;
54
+ ptc_end;
55
+ stop;
56
+ """
57
+ )
58
+
59
+ df = madx.table.tracksumm.dframe()
60
+
61
+ assert np.isclose(p0.x, df.x[-1])
62
+ assert np.isclose(p0.px, df.px[-1])
63
+ assert np.isclose(p0.y, df.y[-1])
64
+ assert np.isclose(p0.py, df.py[-1])
65
+ assert np.isclose(p0.ptau, df.pt[-1])
66
+ assert np.isclose(p0.zeta/p0.beta0, df.t[-1])
@@ -0,0 +1,94 @@
1
+ import xtrack as xt
2
+ import numpy as np
3
+ from cpymad.madx import Madx
4
+
5
+
6
+ def test_quadrupole_wedge():
7
+ """
8
+ Hardcoded test for quadrupole wedge with hard edge fringe.
9
+ """
10
+
11
+ angle = 0.1
12
+ b2 = 5
13
+ b1 = 0
14
+
15
+ quadrupole = xt.Bend(length=0, k0=b1, k1=b2, edge_entry_angle=angle,
16
+ edge_entry_model='full')
17
+ line= xt.Line(elements=[quadrupole])
18
+
19
+ x=np.linspace(-1e-2, 1e-2, 5)
20
+ px=np.linspace(-5e-2, 5e-2, 5)
21
+ y=np.linspace(-2e-2, 2e-2, 5)
22
+ py=np.linspace(-3e-2, 3e-2, 5)
23
+
24
+ p0 = xt.Particles(x=x,px=px,y=y,py=py)
25
+
26
+ line.discard_tracker()
27
+ line.build_tracker()
28
+ line.track(p0)
29
+
30
+ x_expval = np.array([-0.0100055, -0.00500069, 0., 0.00500069, 0.01000557])
31
+ px_expval = np.array([-5.00952476e-02, -2.50259834e-02, 1.38777878e-17, 2.49697042e-02, 4.98702638e-02])
32
+ y_expval = np.array([-0.01999435, -0.00999929, 0., 0.00999928, 0.01999424])
33
+ py_expval = np.array([-0.0301435, -0.01503677, 0., 0.01496143, 0.02984211])
34
+
35
+ assert np.allclose(p0.x, x_expval)
36
+ assert np.allclose(p0.px, px_expval)
37
+ assert np.allclose(p0.y, y_expval)
38
+ assert np.allclose(p0.py, py_expval)
39
+
40
+
41
+ def test_quadrupole_wedge_ptc():
42
+ """
43
+ Test against PTC with MAD8_WEDGE=False.
44
+ Hardcoded values since the option is not available without recompiling PTC.
45
+ """
46
+
47
+ angle_in = 0.1
48
+ angle_out = 0.13
49
+ b2 = 100
50
+ b1 = 0
51
+ length=1e-20
52
+
53
+ x0 = 0.07
54
+ px0 = 0.03
55
+ y0 = 0.08
56
+ py0 = 0.06
57
+ zeta0 = 0.04
58
+ delta0=0.1
59
+ beta0=0.1
60
+
61
+ p0 = xt.Particles(x=x0,px=px0,y=y0,py=py0,delta=delta0,zeta=zeta0,beta0=beta0)
62
+
63
+ ptau0 = float(p0.ptau)
64
+ tau0 = zeta0/beta0
65
+
66
+ # XSuite
67
+ quadrupole = xt.Bend(length=length, k0=b1, k1=b2,
68
+ edge_entry_angle=angle_in, edge_exit_angle=angle_out,
69
+ edge_entry_model='full', edge_exit_model='full')
70
+ line = xt.Line(elements=[quadrupole])
71
+
72
+ line.discard_tracker()
73
+ line.build_tracker()
74
+ line.track(p0)
75
+
76
+ mat = line.compute_one_turn_matrix_finite_differences(p0)['R_matrix']
77
+ det = np.linalg.det(mat)
78
+
79
+ assert np.isclose(det, 1.0)
80
+
81
+ # PTC values
82
+ x_ptc = 0.07043818253
83
+ px_ptc = 0.1313937438
84
+ y_ptc = 0.07993855538
85
+ py_ptc = -0.07321782159
86
+ tau_ptc = 0.4245507041
87
+ ptau_ptc = 0.01049449328
88
+
89
+ assert np.isclose(p0.x, x_ptc)
90
+ assert np.isclose(p0.px, px_ptc)
91
+ assert np.isclose(p0.y, y_ptc)
92
+ assert np.isclose(p0.py, py_ptc)
93
+ assert np.isclose(p0.zeta/p0.beta0, tau_ptc)
94
+ assert np.isclose(p0.ptau, ptau_ptc)
@@ -0,0 +1,348 @@
1
+ import xtrack as xt
2
+ import numpy as np
3
+ import xobjects as xo
4
+ from xobjects.test_helpers import for_all_test_contexts
5
+
6
+ import pathlib
7
+
8
+ test_data_folder = pathlib.Path(
9
+ __file__).parent.joinpath('../test_data').absolute()
10
+
11
+ @for_all_test_contexts
12
+ def test_rbend_straight_body_edge_full(test_context):
13
+
14
+ edge_model = 'full'
15
+
16
+ b_ref = xt.RBend(angle=0.1, k0_from_h=True, length_straight=3.)
17
+ b_ref.edge_entry_model = edge_model
18
+ b_ref.edge_exit_model = edge_model
19
+ b_ref.model = 'rot-kick-rot'
20
+ b_ref.num_multipole_kicks = 100
21
+ l_ref = xt.Line([b_ref])
22
+ l_ref.append('end', xt.Marker())
23
+ l_ref.particle_ref = xt.Particles(p0c=10e9)
24
+ l_ref.build_tracker(_context=test_context)
25
+ tw_ref0 = l_ref.twiss(betx=1, bety=1)
26
+ tw_ref = l_ref.twiss(betx=1, bety=1, x=2e-3, px=1e-3, y=2e-3, py=2e-3, delta=1e-3)
27
+
28
+ b_test = xt.RBend(
29
+ angle=0.1, k0_from_h=True, length_straight=3)
30
+ b_test.rbend_model = 'straight-body'
31
+ b_test.model = 'bend-kick-bend'
32
+ b_test.num_multipole_kicks = 100
33
+ b_test.edge_entry_model = edge_model
34
+ b_test.edge_exit_model = edge_model
35
+ l_test = xt.Line([b_test])
36
+ l_test.append('end', xt.Marker())
37
+ l_test.particle_ref = xt.Particles(p0c=10e9)
38
+ l_test.build_tracker(_context=test_context)
39
+ tw_test0 = l_test.twiss(betx=1, bety=1)
40
+ tw_test = l_test.twiss(betx=1, bety=1, x=2e-3, px=1e-3, y=2e-3, py=2e-3, delta=1e-3)
41
+
42
+ xo.assert_allclose(tw_ref0.betx, tw_test0.betx, rtol=1e-9, atol=0.0)
43
+ xo.assert_allclose(tw_ref0.bety, tw_test0.bety, rtol=1e-9, atol=0.0)
44
+ xo.assert_allclose(tw_ref0.x, tw_test0.x, rtol=0, atol=1e-12)
45
+ xo.assert_allclose(tw_ref0.y, tw_test0.y, rtol=0, atol=1e-12)
46
+ xo.assert_allclose(tw_ref0.s, tw_test0.s, rtol=0, atol=1e-12)
47
+ xo.assert_allclose(tw_ref0.zeta, tw_test0.zeta, rtol=0, atol=1e-11)
48
+ xo.assert_allclose(tw_ref0.px, tw_test0.px, rtol=0, atol=1e-12)
49
+ xo.assert_allclose(tw_ref0.py, tw_test0.py, rtol=0, atol=1e-12)
50
+
51
+ xo.assert_allclose(tw_ref.betx, tw_test.betx, rtol=5e-9, atol=0.0)
52
+ xo.assert_allclose(tw_ref.bety, tw_test.bety, rtol=5e-9, atol=0.0)
53
+ xo.assert_allclose(tw_ref.x, tw_test.x, rtol=0, atol=1e-12)
54
+ xo.assert_allclose(tw_ref.y, tw_test.y, rtol=0, atol=1e-12)
55
+ xo.assert_allclose(tw_ref.s, tw_test.s, rtol=0, atol=1e-12)
56
+ xo.assert_allclose(tw_ref.zeta, tw_test.zeta, rtol=0, atol=1e-1)
57
+ xo.assert_allclose(tw_ref.px, tw_test.px, rtol=0, atol=1e-12)
58
+ xo.assert_allclose(tw_ref.py, tw_test.py, rtol=0, atol=1e-12)
59
+
60
+ l_sliced = l_test.copy(shallow=True)
61
+ l_sliced.cut_at_s(np.linspace(0, l_test.get_length(), 100))
62
+ tw_test_sliced0 = l_sliced.twiss(betx=1, bety=1)
63
+
64
+ xo.assert_allclose(tw_test_sliced0.betx[-1], tw_test0.betx[-1], rtol=1e-9, atol=0.0)
65
+ xo.assert_allclose(tw_test_sliced0.bety[-1], tw_test0.bety[-1], rtol=1e-9, atol=0.0)
66
+ xo.assert_allclose(tw_test_sliced0.x[-1], tw_test0.x[-1], rtol=0, atol=1e-12)
67
+ xo.assert_allclose(tw_test_sliced0.y[-1], tw_test0.y[-1], rtol=0, atol=1e-12)
68
+ xo.assert_allclose(tw_test_sliced0.s[-1], tw_test0.s[-1], rtol=0, atol=1e-12)
69
+ xo.assert_allclose(tw_test_sliced0.zeta[-1], tw_test0.zeta[-1], rtol=0, atol=1e-11)
70
+ xo.assert_allclose(tw_test_sliced0.px[-1], tw_test0.px[-1], rtol=0, atol=1e-12)
71
+ xo.assert_allclose(tw_test_sliced0.py[-1], tw_test0.py[-1], rtol=0, atol=1e-12)
72
+
73
+ @for_all_test_contexts
74
+ def test_rbend_straight_body_edge_linear(test_context):
75
+
76
+ edge_model = 'linear'
77
+
78
+ b_ref = xt.RBend(angle=0.1, k0_from_h=True, length_straight=3.)
79
+ b_ref.edge_entry_model = edge_model
80
+ b_ref.edge_exit_model = edge_model
81
+ b_ref.model = 'rot-kick-rot'
82
+ b_ref.num_multipole_kicks = 100
83
+ l_ref = xt.Line([b_ref])
84
+ l_ref.append('end', xt.Marker())
85
+ l_ref.particle_ref = xt.Particles(p0c=10e9)
86
+ l_ref.build_tracker(_context=test_context)
87
+ tw_ref0 = l_ref.twiss(betx=1, bety=1)
88
+ tw_ref = l_ref.twiss(betx=1, bety=1, x=2e-3, px=1e-3, y=2e-3, py=2e-3, delta=1e-3)
89
+
90
+ b_test = xt.RBend(
91
+ angle=0.1, k0_from_h=True, length_straight=3)
92
+ b_test.rbend_model = 'straight-body'
93
+ b_test.model = 'bend-kick-bend'
94
+ b_test.num_multipole_kicks = 100
95
+ b_test.edge_entry_model = edge_model
96
+ b_test.edge_exit_model = edge_model
97
+ l_test = xt.Line([b_test])
98
+ l_test.append('end', xt.Marker())
99
+ l_test.particle_ref = xt.Particles(p0c=10e9)
100
+ l_test.build_tracker(_context=test_context)
101
+ tw_test0 = l_test.twiss(betx=1, bety=1)
102
+ tw_test = l_test.twiss(betx=1, bety=1, x=2e-3, px=1e-3, y=2e-3, py=2e-3, delta=1e-3)
103
+
104
+ xo.assert_allclose(tw_ref0.betx, tw_test0.betx, rtol=1e-9, atol=0.0)
105
+ xo.assert_allclose(tw_ref0.bety, tw_test0.bety, rtol=1e-9, atol=0.0)
106
+ xo.assert_allclose(tw_ref0.x, tw_test0.x, rtol=0, atol=1e-12)
107
+ xo.assert_allclose(tw_ref0.y, tw_test0.y, rtol=0, atol=1e-12)
108
+ xo.assert_allclose(tw_ref0.s, tw_test0.s, rtol=0, atol=1e-12)
109
+ xo.assert_allclose(tw_ref0.zeta, tw_test0.zeta, rtol=0, atol=1e-11)
110
+ xo.assert_allclose(tw_ref0.px, tw_test0.px, rtol=0, atol=1e-12)
111
+ xo.assert_allclose(tw_ref0.py, tw_test0.py, rtol=0, atol=1e-12)
112
+
113
+ xo.assert_allclose(tw_ref.betx, tw_test.betx, rtol=5e-6, atol=0.0)
114
+ xo.assert_allclose(tw_ref.bety, tw_test.bety, rtol=5e-6, atol=0.0)
115
+ xo.assert_allclose(tw_ref.x, tw_test.x, rtol=0, atol=1e-8)
116
+ xo.assert_allclose(tw_ref.y, tw_test.y, rtol=0, atol=1e-8)
117
+ xo.assert_allclose(tw_ref.s, tw_test.s, rtol=0, atol=1e-12)
118
+ xo.assert_allclose(tw_ref.zeta, tw_test.zeta, rtol=0, atol=1e-1)
119
+ xo.assert_allclose(tw_ref.px, tw_test.px, rtol=0, atol=1e-9)
120
+ xo.assert_allclose(tw_ref.py, tw_test.py, rtol=0, atol=1e-9)
121
+
122
+ tw_back = l_test.twiss(init=tw_test, init_at='end')
123
+
124
+ assert tw_back.orientation == 'backward'
125
+ xo.assert_allclose(tw_back.betx, tw_test.betx, rtol=5e-6, atol=0.0)
126
+ xo.assert_allclose(tw_back.bety, tw_test.bety, rtol=5e-6, atol=0.0)
127
+ xo.assert_allclose(tw_back.x, tw_test.x, rtol=0, atol=1e-8)
128
+ xo.assert_allclose(tw_back.y, tw_test.y, rtol=0, atol=1e-8)
129
+ xo.assert_allclose(tw_back.s, tw_test.s, rtol=0, atol=1e-12)
130
+ xo.assert_allclose(tw_back.zeta, tw_test.zeta, rtol=0, atol=1e-1)
131
+ xo.assert_allclose(tw_back.px, tw_test.px, rtol=0, atol=1e-9)
132
+ xo.assert_allclose(tw_back.py, tw_test.py, rtol=0, atol=1e-9)
133
+
134
+ l_sliced = l_test.copy(shallow=True)
135
+ l_sliced.cut_at_s(np.linspace(0, l_test.get_length(), 100))
136
+ tw_test_sliced0 = l_sliced.twiss(betx=1, bety=1)
137
+
138
+ xo.assert_allclose(tw_test_sliced0.betx[-1], tw_test0.betx[-1], rtol=1e-9, atol=0.0)
139
+ xo.assert_allclose(tw_test_sliced0.bety[-1], tw_test0.bety[-1], rtol=1e-9, atol=0.0)
140
+ xo.assert_allclose(tw_test_sliced0.x[-1], tw_test0.x[-1], rtol=0, atol=1e-12)
141
+ xo.assert_allclose(tw_test_sliced0.y[-1], tw_test0.y[-1], rtol=0, atol=1e-12)
142
+ xo.assert_allclose(tw_test_sliced0.s[-1], tw_test0.s[-1], rtol=0, atol=1e-12)
143
+ xo.assert_allclose(tw_test_sliced0.zeta[-1], tw_test0.zeta[-1], rtol=0, atol=1e-11)
144
+ xo.assert_allclose(tw_test_sliced0.px[-1], tw_test0.px[-1], rtol=0, atol=1e-12)
145
+ xo.assert_allclose(tw_test_sliced0.py[-1], tw_test0.py[-1], rtol=0, atol=1e-12)
146
+
147
+ tw_test_sliced_back = l_sliced.twiss(init=tw_test_sliced0, init_at='end')
148
+
149
+ assert tw_test_sliced_back.orientation == 'backward'
150
+ xo.assert_allclose(tw_test_sliced_back.betx, tw_test_sliced0.betx, rtol=5e-9, atol=0.0)
151
+ xo.assert_allclose(tw_test_sliced_back.bety, tw_test_sliced0.bety, rtol=5e-9, atol=0.0)
152
+ xo.assert_allclose(tw_test_sliced_back.x, tw_test_sliced0.x, rtol=0, atol=1e-12)
153
+ xo.assert_allclose(tw_test_sliced_back.y, tw_test_sliced0.y, rtol=0, atol=1e-12)
154
+ xo.assert_allclose(tw_test_sliced_back.s, tw_test_sliced0.s, rtol=0, atol=1e-12)
155
+ xo.assert_allclose(tw_test_sliced_back.zeta, tw_test_sliced0.zeta, rtol=0, atol=1e-11)
156
+ xo.assert_allclose(tw_test_sliced_back.px, tw_test_sliced0.px, rtol=0, atol=1e-12)
157
+ xo.assert_allclose(tw_test_sliced_back.py, tw_test_sliced0.py, rtol=0, atol=1e-12)
158
+
159
+ def test_rbend_straight_body_survey():
160
+
161
+ env = xt.Environment(particle_ref=xt.Particles(p0c=10e9))
162
+
163
+ line = env.new_line(length=5, components=[
164
+ env.new('mb', 'RBend', angle=0.3, k0_from_h=True, length_straight=3,
165
+ rbend_model='straight-body', at=2.5)])
166
+
167
+ line.cut_at_s(np.linspace(0, line.get_length(), 11))
168
+ line.insert('mid', xt.Marker(), at=2.5)
169
+
170
+ line['mb'].rbend_model = 'straight-body'
171
+ sv_straight = line.survey(element0='mid')
172
+ tt_straight = line.get_table(attr=True)
173
+
174
+ line['mb'].rbend_model = 'curved-body'
175
+ sv_curved = line.survey(element0='mid')
176
+ tt_curved = line.get_table(attr=True)
177
+
178
+ tt_straight.cols['s element_type angle_rad']
179
+ # is:
180
+ # Table: 18 rows, 4 cols
181
+ # name s element_type angle_rad
182
+ # drift_1..0 0 DriftSlice 0
183
+ # drift_1..1 0.5 DriftSlice 0
184
+ # mb_entry 0.99436 Marker 0
185
+ # mb..entry_map 0.99436 ThinSliceRBendEntry 0.15
186
+ # mb..0 0.99436 ThickSliceRBend 0
187
+ # mb..1 1 ThickSliceRBend 0
188
+ # mb..2 1.5 ThickSliceRBend 0
189
+ # mb..3 2 ThickSliceRBend 0
190
+ # mid 2.5 Marker 0
191
+ # mb..4 2.5 ThickSliceRBend 0
192
+ # mb..5 3 ThickSliceRBend 0
193
+ # mb..6 3.5 ThickSliceRBend 0
194
+ # mb..7 4 ThickSliceRBend 0
195
+ # mb..exit_map 4.00564 ThinSliceRBendExit 0.15
196
+ # mb_exit 4.00564 Marker 0
197
+ # drift_2..0 4.00564 DriftSlice 0
198
+ # drift_2..1 4.5 DriftSlice 0
199
+ # _end_point 5 0
200
+
201
+ assert np.all(tt_straight['name'] == [
202
+ 'drift_1..0', 'drift_1..1', 'mb_entry', 'mb..entry_map', 'mb..0',
203
+ 'mb..1', 'mb..2', 'mb..3', 'mid', 'mb..4', 'mb..5', 'mb..6', 'mb..7',
204
+ 'mb..exit_map', 'mb_exit', 'drift_2..0', 'drift_2..1', '_end_point'
205
+ ])
206
+
207
+ # Assert entire columns using np.all
208
+ assert np.all(tt_straight['element_type'] == [
209
+ 'DriftSlice', 'DriftSlice', 'Marker', 'ThinSliceRBendEntry', 'ThickSliceRBend',
210
+ 'ThickSliceRBend', 'ThickSliceRBend', 'ThickSliceRBend', 'Marker', 'ThickSliceRBend',
211
+ 'ThickSliceRBend', 'ThickSliceRBend', 'ThickSliceRBend', 'ThinSliceRBendExit',
212
+ 'Marker', 'DriftSlice', 'DriftSlice', ''
213
+ ])
214
+
215
+ xo.assert_allclose(
216
+ tt_straight['angle_rad'],
217
+ np.array([0, 0, 0, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.15, 0, 0, 0, 0]),
218
+ atol=1e-12
219
+ )
220
+
221
+ xo.assert_allclose(tt_straight['s'], np.array([
222
+ 0. , 0.5 , 0.9943602, 0.9943602, 0.9943602, 1. ,
223
+ 1.5 , 2. , 2.5 , 2.5 , 3. , 3.5 ,
224
+ 4. , 4.0056398, 4.0056398, 4.0056398, 4.5 , 5. ]
225
+ ), atol=1e-5)
226
+
227
+
228
+ tt_curved.cols['s element_type angle_rad']
229
+ # is:
230
+ # Table: 18 rows, 4 cols
231
+ # name s element_type angle_rad
232
+ # drift_1..0 0 DriftSlice 0
233
+ # drift_1..1 0.5 DriftSlice 0
234
+ # mb_entry 0.99436 Marker 0
235
+ # mb..entry_map 0.99436 ThinSliceRBendEntry 0
236
+ # mb..0 0.99436 ThickSliceRBend 0.000561868
237
+ # mb..1 1 ThickSliceRBend 0.0498127
238
+ # mb..2 1.5 ThickSliceRBend 0.0498127
239
+ # mb..3 2 ThickSliceRBend 0.0498127
240
+ # mid 2.5 Marker 0
241
+ # mb..4 2.5 ThickSliceRBend 0.0498127
242
+ # mb..5 3 ThickSliceRBend 0.0498127
243
+ # mb..6 3.5 ThickSliceRBend 0.0498127
244
+ # mb..7 4 ThickSliceRBend 0.000561868
245
+ # mb..exit_map 4.00564 ThinSliceRBendExit 0
246
+ # mb_exit 4.00564 Marker 0
247
+ # drift_2..0 4.00564 DriftSlice 0
248
+ # drift_2..1 4.5 DriftSlice 0
249
+ # _end_point 5 0
250
+
251
+ assert np.all(tt_curved['name'] == [
252
+ 'drift_1..0', 'drift_1..1', 'mb_entry', 'mb..entry_map', 'mb..0',
253
+ 'mb..1', 'mb..2', 'mb..3', 'mid', 'mb..4', 'mb..5', 'mb..6', 'mb..7',
254
+ 'mb..exit_map', 'mb_exit', 'drift_2..0', 'drift_2..1', '_end_point'
255
+ ])
256
+
257
+ assert np.all(tt_curved['element_type'] == [
258
+ 'DriftSlice', 'DriftSlice', 'Marker', 'ThinSliceRBendEntry', 'ThickSliceRBend',
259
+ 'ThickSliceRBend', 'ThickSliceRBend', 'ThickSliceRBend', 'Marker', 'ThickSliceRBend',
260
+ 'ThickSliceRBend', 'ThickSliceRBend', 'ThickSliceRBend', 'ThinSliceRBendExit',
261
+ 'Marker', 'DriftSlice', 'DriftSlice', ''
262
+ ])
263
+
264
+ xo.assert_allclose(
265
+ tt_curved['angle_rad'],
266
+ np.array([0, 0, 0, 0, 0.000561868, 0.0498127, 0.0498127, 0.0498127, 0, 0.0498127,
267
+ 0.0498127, 0.0498127, 0.000561868, 0, 0, 0, 0, 0]),
268
+ rtol=1e-6
269
+ )
270
+
271
+ xo.assert_allclose(tt_curved['s'], np.array([
272
+ 0. , 0.5 , 0.9943602, 0.9943602, 0.9943602, 1. ,
273
+ 1.5 , 2. , 2.5 , 2.5 , 3. , 3.5 ,
274
+ 4. , 4.0056398, 4.0056398, 4.0056398, 4.5 , 5. ]
275
+ ), atol=1e-5)
276
+
277
+ def test_rbend_straight_sps():
278
+
279
+ env = xt.load(test_data_folder / 'sps_thick/sps.seq')
280
+ env.vars.load(test_data_folder / 'sps_thick/lhc_q20.str')
281
+
282
+ line = env['sps']
283
+ line.particle_ref = xt.Particles(p0c=26e9, mass0=xt.PROTON_MASS_EV)
284
+
285
+ tt = line.get_table()
286
+ tt_rbend = tt.rows[tt.element_type == 'RBend']
287
+
288
+ line.slice_thick_elements(
289
+ slicing_strategies=[
290
+ xt.Strategy(None),
291
+ xt.Strategy(slicing=xt.Uniform(10, mode='thick'), element_type=xt.RBend),
292
+ ])
293
+
294
+ line.set(tt_rbend, edge_entry_model='full')
295
+ line.set(tt_rbend, edge_exit_model='full')
296
+
297
+ line.set(tt_rbend, rbend_model='straight-body')
298
+ tw_straight = line.twiss4d()
299
+
300
+ line.set(tt_rbend, rbend_model='curved-body')
301
+ tw_curved = line.twiss4d()
302
+
303
+ xo.assert_allclose(tw_curved.x.max(), 0, rtol=0, atol=1e-9)
304
+ assert tw_straight.x.max() > 3e-3
305
+
306
+ xo.assert_allclose(tw_straight.qx, tw_curved.qx, rtol=0, atol=1e-8)
307
+ xo.assert_allclose(tw_straight.qy, tw_curved.qy, rtol=0, atol=1e-8)
308
+ xo.assert_allclose(tw_straight.dqx, tw_curved.dqx, rtol=0, atol=1e-3)
309
+ xo.assert_allclose(tw_straight.dqy, tw_curved.dqy, rtol=0, atol=1e-3)
310
+ xo.assert_allclose(tw_straight.rows['qf.*|qd.*'].betx,
311
+ tw_curved.rows['qf.*|qd.*'].betx,
312
+ atol=0, rtol=1e-8)
313
+ xo.assert_allclose(tw_straight.rows['qf.*|qd.*'].bety,
314
+ tw_curved.rows['qf.*|qd.*'].bety,
315
+ atol=0, rtol=1e-8)
316
+ xo.assert_allclose(tw_straight.rows['qf.*|qd.*'].x, 0, atol=1e-10, rtol=0)
317
+ xo.assert_allclose(tw_straight.rows['qf.*|qd.*'].y, 0, atol=1e-10, rtol=0)
318
+
319
+ # Switch to electrons to check synchrotron radiation features
320
+
321
+ # 20 GeV electrons (like in LEP times)
322
+ env.particle_ref = xt.Particles(energy0=20e9, mass0=xt.ELECTRON_MASS_EV)
323
+ line.particle_ref = env.particle_ref
324
+
325
+ line['actcse.31632'].voltage = 4.2e+08
326
+ line['actcse.31632'].frequency = 3e6
327
+ line['actcse.31632'].lag = 180.
328
+
329
+ line.configure_radiation(model='mean')
330
+
331
+ line.set(tt_rbend, rbend_model='curved-body')
332
+ tw_rad_curved = line.twiss(eneloss_and_damping=True,
333
+ radiation_integrals=True)
334
+
335
+ line.set(tt_rbend, rbend_model='straight-body')
336
+ tw_rad_straight = line.twiss(eneloss_and_damping=True,
337
+ radiation_integrals=True)
338
+
339
+ xo.assert_allclose(tw_rad_straight.eq_gemitt_x,
340
+ tw_rad_curved.eq_gemitt_x, rtol=1e-2)
341
+ xo.assert_allclose(tw_rad_straight.eq_gemitt_zeta,
342
+ tw_rad_curved.eq_gemitt_zeta, rtol=1e-2)
343
+ xo.assert_allclose(tw_rad_straight.eq_gemitt_y,
344
+ tw_rad_curved.eq_gemitt_y, atol=1e-20)
345
+ xo.assert_allclose(tw_rad_straight.rad_int_eq_gemitt_x,
346
+ tw_rad_curved.rad_int_eq_gemitt_x, rtol=1e-2)
347
+ xo.assert_allclose(tw_rad_straight.rad_int_eq_gemitt_y,
348
+ tw_rad_curved.rad_int_eq_gemitt_y, atol=1e-20)