xtrack 0.94.2__tar.gz → 0.96.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. {xtrack-0.94.2/xtrack.egg-info → xtrack-0.96.0}/PKG-INFO +1 -1
  2. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_acceleration.py +8 -30
  3. xtrack-0.96.0/tests/test_aperture_polygon.py +121 -0
  4. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_aperture_table.py +7 -8
  5. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_apertures.py +82 -74
  6. xtrack-0.96.0/tests/test_atomic_add.py +90 -0
  7. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_coupling_edwards_teng.py +28 -21
  8. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_element_internal_record.py +0 -1
  9. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_elements.py +15 -1
  10. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_elements_thick.py +581 -33
  11. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_environment.py +258 -216
  12. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_fcc_ee_solenoid_correction.py +7 -12
  13. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +8 -12
  14. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_h6_sps_beamline.py +1 -2
  15. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_hvkick.py +4 -9
  16. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_legacy_multiline_to_env.py +2 -2
  17. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_lhc_env.py +2 -2
  18. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_line.py +2 -2
  19. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_madloader.py +4 -4
  20. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_madnginterface.py +33 -11
  21. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_match_optics_and_ip_knob.py +17 -17
  22. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +1 -1
  23. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_misalign.py +254 -27
  24. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_native_madloader.py +96 -16
  25. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_native_madloader_lhc.py +27 -0
  26. xtrack-0.96.0/tests/test_native_madloader_lhc_thin.py +119 -0
  27. xtrack-0.96.0/tests/test_native_madloader_ps.py +117 -0
  28. xtrack-0.96.0/tests/test_native_madloader_sps.py +119 -0
  29. xtrack-0.96.0/tests/test_native_madloader_ti2.py +112 -0
  30. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_ps_against_ptc.py +12 -11
  31. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_ps_multiturn_twiss.py +6 -14
  32. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_psb_chicane.py +11 -28
  33. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_radiation.py +1 -4
  34. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_radiation_integrals.py +4 -4
  35. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_rbend_straight_body.py +37 -39
  36. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_slicing.py +156 -105
  37. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_spin.py +255 -0
  38. xtrack-0.94.2/tests/test_sps_thick.py → xtrack-0.96.0/tests/test_sps_thick_cpymad_loader.py +4 -1
  39. xtrack-0.96.0/tests/test_sps_thick_native_loader.py +216 -0
  40. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_survey.py +18 -15
  41. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_thick_kickers_rf_crab.py +48 -65
  42. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_thick_lhc.py +1 -1
  43. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_tilt_shifts.py +4 -7
  44. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_tracker.py +8 -25
  45. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_trajectory_correcton.py +12 -12
  46. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_twiss.py +24 -16
  47. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_twiss_to_file.py +2 -2
  48. xtrack-0.96.0/tests/test_twiss_vs_madx_psb.py +133 -0
  49. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_vs_madx.py +3 -0
  50. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +2 -2
  51. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/lhc_match/lhc_match.py +4 -4
  52. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/python_lattice_writer/lattice_py_generation.py +2 -1
  53. xtrack-0.96.0/xtrack/_version.py +1 -0
  54. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/base_element.py +96 -234
  55. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/apertures.py +11 -8
  56. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements.py +7 -0
  57. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/bend.h +1 -1
  58. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/misalignment.h +3 -2
  59. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/rbend.h +1 -1
  60. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/srotation.h +0 -13
  61. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_bend.h +1 -1
  62. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +1 -1
  63. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_bend.h +1 -1
  64. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +1 -1
  65. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +1 -1
  66. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +1 -1
  67. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +1 -1
  68. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +1 -1
  69. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_magnet.h +0 -1
  70. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +28 -23
  71. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_misalignments.h +18 -15
  72. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_srotation.h +13 -0
  73. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_xrotation.h +13 -0
  74. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_yrotation.h +13 -0
  75. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/xrotation.h +0 -13
  76. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/yrotation.h +0 -13
  77. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/slice_base.py +1 -0
  78. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/slice_elements_drift.py +4 -2
  79. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/builder.py +2 -4
  80. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/environment.py +129 -29
  81. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/footprint.py +3 -0
  82. xtrack-0.96.0/xtrack/headers/atomicadd.h +350 -0
  83. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/headers/particle_states.h +1 -0
  84. xtrack-0.96.0/xtrack/headers/track_local_particle_with_transformations.h +208 -0
  85. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/internal_record.py +14 -12
  86. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/line.py +61 -72
  87. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/load.py +11 -5
  88. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/loss_location_refinement/loss_location_refinement.py +32 -3
  89. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/mad_loader.py +5 -5
  90. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/mad_parser/loader.py +79 -62
  91. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/mad_parser/madx.lark +3 -2
  92. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/mad_parser/parse.py +6 -3
  93. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/mad_writer.py +48 -20
  94. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/madng_interface.py +3 -0
  95. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/match.py +1 -1
  96. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/particles/particles.py +3 -0
  97. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/slicing.py +50 -28
  98. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/tapering.py +2 -1
  99. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/track_flags.py +3 -3
  100. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/twiss.py +13 -11
  101. {xtrack-0.94.2 → xtrack-0.96.0/xtrack.egg-info}/PKG-INFO +1 -1
  102. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack.egg-info/SOURCES.txt +9 -2
  103. xtrack-0.94.2/tests/test_rbend_rbarc.py +0 -71
  104. xtrack-0.94.2/tests/test_twiss_vs_madx_psb.py +0 -47
  105. xtrack-0.94.2/xtrack/_version.py +0 -1
  106. xtrack-0.94.2/xtrack/headers/atomicadd.h +0 -41
  107. {xtrack-0.94.2 → xtrack-0.96.0}/LICENSE +0 -0
  108. {xtrack-0.94.2 → xtrack-0.96.0}/MANIFEST.in +0 -0
  109. {xtrack-0.94.2 → xtrack-0.96.0}/README.md +0 -0
  110. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/__init__.py +0 -0
  111. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/base_classes.py +0 -0
  112. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/BB6D.py +0 -0
  113. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  114. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/__init__.py +0 -0
  115. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/beambeam.py +0 -0
  116. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/boost.py +0 -0
  117. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  118. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  119. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/qgauss.py +0 -0
  120. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/slicing.py +0 -0
  121. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/be_beamfields/spacecharge.py +0 -0
  122. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/elements.py +0 -0
  123. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/line.py +0 -0
  124. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/mathlibs.py +0 -0
  125. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/particles.py +0 -0
  126. {xtrack-0.94.2 → xtrack-0.96.0}/ducktrack/temp_pyparticles.py +0 -0
  127. {xtrack-0.94.2 → xtrack-0.96.0}/pyproject.toml +0 -0
  128. {xtrack-0.94.2 → xtrack-0.96.0}/setup.cfg +0 -0
  129. {xtrack-0.94.2 → xtrack-0.96.0}/setup.py +0 -0
  130. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_amplitude_detuning.py +0 -0
  131. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  132. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_attr_replicas_and_slices.py +0 -0
  133. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_boris_spatial.py +0 -0
  134. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_bucket_with_ref_energy_change.py +0 -0
  135. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_cavity_absolute_time.py +0 -0
  136. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_chromatic_functions_vs_madx.py +0 -0
  137. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_coasting.py +0 -0
  138. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_collective_tracker.py +0 -0
  139. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_collimation.py +0 -0
  140. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_electron_cooler.py +0 -0
  141. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_element_characterization_functions.py +0 -0
  142. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_elements_classflags.py +0 -0
  143. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_footprint.py +0 -0
  144. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_freeze_longitudinal.py +0 -0
  145. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_full_rings.py +0 -0
  146. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_ions.py +0 -0
  147. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_json.py +0 -0
  148. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_lhc_match_phase_15.py +0 -0
  149. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_load.py +0 -0
  150. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_load_vars.py +0 -0
  151. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_lumi.py +0 -0
  152. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_mad_writer.py +0 -0
  153. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_magnet.py +0 -0
  154. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_match_and_track_from_element.py +0 -0
  155. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_match_coupling_knob.py +0 -0
  156. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_match_nested.py +0 -0
  157. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_match_orbit_bump.py +0 -0
  158. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_match_tune_chroma_cminus.py +0 -0
  159. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_monitor.py +0 -0
  160. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_multi_bunch_gauss.py +0 -0
  161. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_multiline.py +0 -0
  162. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_multisetter.py +0 -0
  163. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_multispecies.py +0 -0
  164. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_optimize_for_tracking.py +0 -0
  165. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_particles.py +0 -0
  166. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_particles_basics.py +0 -0
  167. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_particles_pdg.py +0 -0
  168. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_pipeline.py +0 -0
  169. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_prebuild_kernels.py +0 -0
  170. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_pyht_interface.py +0 -0
  171. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_quadrupole_fringe_ptc.py +0 -0
  172. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_quadrupole_wedge.py +0 -0
  173. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_radial_steering.py +0 -0
  174. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_radiation_equilibrium_emittances.py +0 -0
  175. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  176. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_random_gen.py +0 -0
  177. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_random_gen_exp.py +0 -0
  178. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_random_gen_gauss.py +0 -0
  179. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_random_gen_ruth.py +0 -0
  180. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_rf_track.py +0 -0
  181. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_rotation_signs.py +0 -0
  182. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_second_order_taylor_map.py +0 -0
  183. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_seeds.py +0 -0
  184. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_slice_and_insert_with_replicas.py +0 -0
  185. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_slice_elements.py +0 -0
  186. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  187. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  188. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_spacecharge_in_ring.py +0 -0
  189. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_tapering.py +0 -0
  190. {xtrack-0.94.2 → xtrack-0.96.0}/tests/test_xmask_orbit_correction.py +0 -0
  191. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/__init__.py +0 -0
  192. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/__init__.py +0 -0
  193. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  194. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  195. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  196. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/lhc_match/__init__.py +0 -0
  197. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  198. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/_temp/python_lattice_writer/__init__.py +0 -0
  199. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/aperture_meas.py +0 -0
  200. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/__init__.py +0 -0
  201. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  202. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  203. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  204. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  205. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  206. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  207. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/beam_interaction.py +0 -0
  208. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  209. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/crab_cavity.h +0 -0
  210. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
  211. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  212. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  213. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift.h +0 -0
  214. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
  215. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
  216. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  217. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  218. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
  219. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
  220. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
  221. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  222. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  223. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  224. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  225. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
  226. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  227. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/elens.h +0 -0
  228. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  229. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  230. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
  231. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  232. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  233. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  234. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  235. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  236. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/marker.h +0 -0
  237. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  238. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  239. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  240. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  241. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  242. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  243. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  244. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  245. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  246. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  247. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  248. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/slnd.h +0 -0
  249. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/temprf.h +0 -0
  250. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +0 -0
  251. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +0 -0
  252. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
  253. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  254. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  255. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  256. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
  257. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +0 -0
  258. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +0 -0
  259. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
  260. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  261. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  262. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  263. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  264. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  265. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  266. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  267. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  268. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  269. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
  270. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
  271. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  272. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  273. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  274. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  275. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
  276. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  277. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
  278. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_magnet.template.h +0 -0
  279. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
  280. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  281. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  282. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  283. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  284. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_rf.h +0 -0
  285. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_rf.template.h +0 -0
  286. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  287. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  288. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  289. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
  290. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
  291. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  292. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/wire.h +0 -0
  293. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  294. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  295. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/exciter.py +0 -0
  296. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/rft_element.py +0 -0
  297. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/slice_elements_edge.py +0 -0
  298. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  299. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/beam_elements/slice_elements_thin.py +0 -0
  300. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/boris.py +0 -0
  301. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/functions.py +0 -0
  302. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/general.py +0 -0
  303. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/headers/checks.h +0 -0
  304. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/headers/constants.h +0 -0
  305. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/headers/synrad_spectrum.h +0 -0
  306. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/headers/track.h +0 -0
  307. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/json.py +0 -0
  308. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/linear_normal_form.py +0 -0
  309. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/loss_location_refinement/__init__.py +0 -0
  310. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/lumi.py +0 -0
  311. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/mad_parser/__init__.py +0 -0
  312. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/__init__.py +0 -0
  313. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/beam_position_monitor.h +0 -0
  314. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/beam_position_monitor.py +0 -0
  315. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/beam_profile_monitor.h +0 -0
  316. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/beam_profile_monitor.py +0 -0
  317. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/beam_size_monitor.h +0 -0
  318. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/beam_size_monitor.py +0 -0
  319. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/last_turns_monitor.h +0 -0
  320. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/last_turns_monitor.py +0 -0
  321. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/particles_monitor.h +0 -0
  322. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/monitors/particles_monitor.py +0 -0
  323. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/multiline.py +0 -0
  324. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/multiline_legacy/__init__.py +0 -0
  325. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  326. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  327. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/multisetter/__init__.py +0 -0
  328. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/multisetter/multisetter.py +0 -0
  329. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/particles/__init__.py +0 -0
  330. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/particles/constants.py +0 -0
  331. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/particles/masses.py +0 -0
  332. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/particles/pdg.py +0 -0
  333. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/particles/rng_src/base_rng.h +0 -0
  334. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/particles/rng_src/particles_rng.h +0 -0
  335. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/pipeline/__init__.py +0 -0
  336. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/pipeline/core.py +0 -0
  337. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/pipeline/manager.py +0 -0
  338. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/pipeline/multitracker.py +0 -0
  339. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/prebuilt_kernel_definitions/__init__.py +0 -0
  340. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/prebuilt_kernel_definitions/element_inits.py +0 -0
  341. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/prebuilt_kernel_definitions/element_types.py +0 -0
  342. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/progress_indicator.py +0 -0
  343. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/random/__init__.py +0 -0
  344. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/random/random_generators.py +0 -0
  345. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/random/random_src/exponential.h +0 -0
  346. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  347. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/random/random_src/normal.h +0 -0
  348. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/random/random_src/rutherford.h +0 -0
  349. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/random/random_src/uniform.h +0 -0
  350. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/random/random_src/uniform_accurate.h +0 -0
  351. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/survey.py +0 -0
  352. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/svgutils/__init__.py +0 -0
  353. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/svgutils/parser.py +0 -0
  354. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/svgutils/path.py +0 -0
  355. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/svgutils/svgutils.py +0 -0
  356. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/synctime.py +0 -0
  357. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/table.py +0 -0
  358. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/targets.py +0 -0
  359. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/tracker.py +0 -0
  360. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/tracker_data.py +0 -0
  361. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/tracker_src/tracker.h +0 -0
  362. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/trajectory_correction.py +0 -0
  363. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/twissplot.py +0 -0
  364. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack/view.py +0 -0
  365. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack.egg-info/dependency_links.txt +0 -0
  366. {xtrack-0.94.2 → xtrack-0.96.0}/xtrack.egg-info/requires.txt +0 -0
  367. {xtrack-0.94.2 → xtrack-0.96.0}/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.94.2
3
+ Version: 0.96.0
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
@@ -8,7 +8,6 @@ import pathlib
8
8
 
9
9
  import numpy as np
10
10
  import pandas as pd
11
- from cpymad.madx import Madx
12
11
  from scipy.constants import c as clight
13
12
 
14
13
  import xobjects as xo
@@ -64,20 +63,10 @@ def test_energy_program(test_context):
64
63
  # Shift the time scale for testing purposes
65
64
  t_s = t_s
66
65
 
67
- # Load mad model and apply element shifts
68
- mad = Madx(stdout=False)
69
- mad.call(str(test_data_folder / 'psb_chicane/psb.seq'))
70
- mad.call(str(test_data_folder / 'psb_chicane/psb_fb_lhc.str'))
71
- mad.input('''
72
- beam, particle=PROTON, pc=0.5708301551893517;
73
- use, sequence=psb1;
74
- twiss;
75
- ''')
76
-
77
- line = xt.Line.from_madx_sequence(mad.sequence.psb1, allow_thick=True,
78
- deferred_expressions=True)
79
- line.particle_ref = xt.Particles(mass0=xt.PROTON_MASS_EV,
80
- gamma0=mad.sequence.psb1.beam.gamma)
66
+ env = xt.load([test_data_folder / 'psb_chicane/psb.seq',
67
+ test_data_folder / 'psb_chicane/psb_fb_lhc.str'])
68
+ env.psb1.set_particle_ref('proton', p0c=0.5708301551893517e9)
69
+ line = env.psb1
81
70
 
82
71
  line.build_tracker(_context=test_context)
83
72
 
@@ -176,21 +165,10 @@ def test_energy_program(test_context):
176
165
  @for_all_test_contexts(excluding=('ContextPyopencl',))
177
166
  def test_acceleration_transverse_shrink(test_context):
178
167
 
179
- mad = Madx(stdout=False)
180
-
181
- # Load mad model and apply element shifts
182
- mad.input(f'''
183
- call, file = '{str(test_data_folder)}/psb_chicane/psb.seq';
184
- call, file = '{str(test_data_folder)}/psb_chicane/psb_fb_lhc.str';
185
- beam;
186
- use, sequence=psb1;
187
- ''')
188
-
189
- line = xt.Line.from_madx_sequence(mad.sequence.psb1,
190
- deferred_expressions=True)
191
- e_kin_start_eV = 160e6
192
- line.particle_ref = xt.Particles(mass0=xt.PROTON_MASS_EV, q0=1.,
193
- energy0=xt.PROTON_MASS_EV + e_kin_start_eV)
168
+ env = xt.load([test_data_folder / 'psb_chicane/psb.seq',
169
+ test_data_folder / 'psb_chicane/psb_fb_lhc.str'])
170
+ env.psb1.set_particle_ref('proton', p0c=0.5708301551893517e9)
171
+ line = env.psb1
194
172
 
195
173
  # Slice to gain some tracking speed
196
174
  line.slice_thick_elements(
@@ -0,0 +1,121 @@
1
+ import numpy as np
2
+
3
+ import xobjects as xo
4
+ import xtrack as xt
5
+
6
+ def _polygon_signed_area(x, y):
7
+ x_close = np.concatenate([x, x[:1]])
8
+ y_close = np.concatenate([y, y[:1]])
9
+ return 0.5 * np.sum(x_close[:-1] * y_close[1:] - x_close[1:] * y_close[:-1])
10
+
11
+
12
+ def _polygon_centroid(x, y):
13
+ x_close = np.concatenate([x, x[:1]])
14
+ y_close = np.concatenate([y, y[:1]])
15
+ cross = x_close[:-1] * y_close[1:] - x_close[1:] * y_close[:-1]
16
+ area = np.sum(cross) / 2.0
17
+ cx = np.sum((x_close[:-1] + x_close[1:]) * cross) / (6.0 * area)
18
+ cy = np.sum((y_close[:-1] + y_close[1:]) * cross) / (6.0 * area)
19
+ return np.array([cx, cy])
20
+
21
+
22
+ def test_limitpolygon_area_signed():
23
+ x_ccw = np.array([-2.0, 2.0, 2.0, -2.0]) * 1e-2
24
+ y_ccw = np.array([-1.0, -1.0, 1.5, 1.5]) * 1e-2
25
+
26
+ aper_ccw = xt.LimitPolygon(
27
+ x_vertices=x_ccw,
28
+ y_vertices=y_ccw,
29
+ )
30
+
31
+ aper_cw = xt.LimitPolygon(
32
+ x_vertices=x_ccw[::-1],
33
+ y_vertices=y_ccw[::-1],
34
+ )
35
+
36
+ signed_expected = _polygon_signed_area(x_ccw, y_ccw)
37
+ assert signed_expected > 0
38
+
39
+ xo.assert_allclose(aper_ccw.area, abs(signed_expected), atol=0, rtol=0)
40
+ xo.assert_allclose(
41
+ aper_ccw.get_area(signed=True), signed_expected, atol=0, rtol=0
42
+ )
43
+ xo.assert_allclose(aper_cw.area, abs(signed_expected), atol=0, rtol=0)
44
+ xo.assert_allclose(
45
+ aper_cw.get_area(signed=True), -signed_expected, atol=0, rtol=0
46
+ )
47
+
48
+
49
+ def test_limitpolygon_normals_point_inward():
50
+ x_vertices = np.array([-1.0, 2.0, 2.5, 0.0]) * 1e-2
51
+ y_vertices = np.array([-1.0, -1.0, 1.5, 2.0]) * 1e-2
52
+
53
+ aper = xt.LimitPolygon(
54
+ x_vertices=x_vertices,
55
+ y_vertices=y_vertices,
56
+ )
57
+
58
+ ctx = aper._buffer.context
59
+ Nx = ctx.nparray_from_context_array(aper.x_normal)
60
+ Ny = ctx.nparray_from_context_array(aper.y_normal)
61
+
62
+ xo.assert_allclose(np.sqrt(Nx**2 + Ny**2), 1.0, rtol=0, atol=1e-14)
63
+
64
+ xv = ctx.nparray_from_context_array(aper.x_vertices)
65
+ yv = ctx.nparray_from_context_array(aper.y_vertices)
66
+ centroid = _polygon_centroid(xv, yv)
67
+ xv_close = np.concatenate([xv, xv[:1]])
68
+ yv_close = np.concatenate([yv, yv[:1]])
69
+
70
+ for ii in range(len(xv)):
71
+ midpoint = np.array([
72
+ 0.5 * (xv_close[ii] + xv_close[ii + 1]),
73
+ 0.5 * (yv_close[ii] + yv_close[ii + 1]),
74
+ ])
75
+ vec_to_center = centroid - midpoint
76
+ normal = np.array([Nx[ii], Ny[ii]])
77
+ assert np.dot(normal, vec_to_center) > 0
78
+
79
+
80
+ def test_limitpolygon_impact_point_and_normal():
81
+ x_vertices = np.array([-1.0, 1.0, 1.0, -1.0]) * 1e-2
82
+ y_vertices = np.array([-1.0, -1.0, 1.0, 1.0]) * 1e-2
83
+
84
+ aper = xt.LimitPolygon(
85
+ x_vertices=x_vertices,
86
+ y_vertices=y_vertices,
87
+ )
88
+
89
+ ctx = aper._buffer.context
90
+ to_ctx = ctx.nparray_to_context_array
91
+ from_ctx = ctx.nparray_from_context_array
92
+
93
+ x_in = to_ctx(np.array([0.0, 0.0]))
94
+ y_in = to_ctx(np.array([0.0, 0.0]))
95
+ z_in = to_ctx(np.array([0.0, 0.0]))
96
+ x_out = to_ctx(np.array([2.0e-2, 0.0]))
97
+ y_out = to_ctx(np.array([0.0, -2.0e-2]))
98
+ z_out = to_ctx(np.array([0.0, 0.0]))
99
+
100
+ x_int, y_int, z_int, Nx, Ny, i_found = aper.impact_point_and_normal(
101
+ x_in=x_in,
102
+ y_in=y_in,
103
+ z_in=z_in,
104
+ x_out=x_out,
105
+ y_out=y_out,
106
+ z_out=z_out,
107
+ )
108
+
109
+ x_int = from_ctx(x_int)
110
+ y_int = from_ctx(y_int)
111
+ z_int = from_ctx(z_int)
112
+ Nx = from_ctx(Nx)
113
+ Ny = from_ctx(Ny)
114
+ i_found = from_ctx(i_found)
115
+
116
+ xo.assert_allclose(x_int, np.array([1.0e-2, 0.0]), atol=1e-15, rtol=0)
117
+ xo.assert_allclose(y_int, np.array([0.0, -1.0e-2]), atol=1e-15, rtol=0)
118
+ xo.assert_allclose(z_int, np.array([0., 0]), atol=1e-15, rtol=0)
119
+ xo.assert_allclose(Nx, np.array([-1.0, 0.0]), atol=1e-14, rtol=0)
120
+ xo.assert_allclose(Ny, np.array([0.0, 1.0]), atol=1e-14, rtol=0)
121
+ assert np.all(i_found >= 0)
@@ -14,9 +14,8 @@ def test_aperture_table():
14
14
  'vtaf.51632.b_aper', 'vbrta.51633.a_aper', 'vbrta.51633.b_aper',
15
15
  'bgiha.51634.a_aper', 'bgiva.51674.a_aper']
16
16
 
17
- env = xt.load(test_data_folder /
18
- 'sps_with_apertures/EYETS 2024-2025.seq')
19
- env.vars.load(str(test_data_folder / 'sps_with_apertures/lhc_q20.str'))
17
+ env = xt.load([test_data_folder / 'sps_with_apertures/EYETS 2024-2025.seq',
18
+ test_data_folder / 'sps_with_apertures/lhc_q20.str'])
20
19
  line = env.sps
21
20
  line.particle_ref = xt.Particles(mass0=xt.PROTON_MASS_EV, q0=1, p0c=26e9)
22
21
 
@@ -62,9 +61,9 @@ def test_aperture_table():
62
61
  aper_check = aper.rows['veba.20250.a_aper' : 'vebb.20270.b_aper']
63
62
 
64
63
  assert np.all(aper_check.name == np.array(
65
- ['veba.20250.a_aper', 'drift_333..2', 'mba.20250', 'drift_334..0',
66
- 'veba.20250.b_aper', 'drift_334..1', 'vebb.20270.a_aper',
67
- 'drift_334..2', 'mbb.20270', 'drift_335..0', 'vebb.20270.b_aper']))
64
+ ['veba.20250.a_aper', '||drift_979', 'mba.20250', '||drift_991',
65
+ 'veba.20250.b_aper', '||drift_671', 'vebb.20270.a_aper',
66
+ '||drift_992', 'mbb.20270', '||drift_993', 'vebb.20270.b_aper']))
68
67
  xo.assert_allclose(aper_check.s, np.array([
69
68
  1225.8247 , 1225.8247 , 1226.0176907, 1232.2777093,
70
69
  1232.4827 , 1232.4827 , 1232.4847 , 1232.4847 ,
@@ -133,8 +132,8 @@ def test_aperture_table_aper_at_same_s():
133
132
 
134
133
  import numpy as np
135
134
  import xobjects as xo
136
- assert np.all(tt.name == ['drift_1', 'lrect', 'lellipse', 'drift_2', 'm', 'lellipse',
137
- '_end_point'])
135
+ assert np.all(tt.name == ['||drift_1', 'lrect', 'lellipse', '||drift_2', 'm', 'lellipse',
136
+ '_end_point'])
138
137
  xo.assert_allclose(tt.s, np.array([0., 3., 3., 3., 5., 5., 5.]), rtol=0, atol=1e-6)
139
138
  xo.assert_allclose(tt.x_aper_low, np.array([-0.0505, -0.0505, -0.0205, -0.0205, -0.0205,
140
139
  -0.0205, -0.0205]), rtol=0, atol=1e-6)
@@ -9,6 +9,8 @@ import xobjects as xo
9
9
  import xtrack as xt
10
10
  import xpart as xp
11
11
  from xobjects.test_helpers import for_all_test_contexts
12
+ import pytest
13
+ from cpymad.madx import Madx
12
14
 
13
15
 
14
16
  @for_all_test_contexts
@@ -116,13 +118,10 @@ def test_aperture_polygon(test_context):
116
118
  xo.assert_allclose(ctx2np(parttest.state), 0)
117
119
 
118
120
 
119
- def test_mad_import():
121
+ @pytest.mark.parametrize("loader", ['cpymad', 'native'])
122
+ def test_mad_import(loader):
120
123
 
121
- from cpymad.madx import Madx
122
-
123
- mad = Madx(stdout=False)
124
-
125
- mad.input("""
124
+ mad_src = """
126
125
  m_circle: marker, apertype="circle", aperture={.2};
127
126
  m_ellipse: marker, apertype="ellipse", aperture={.2, .1};
128
127
  m_rectangle: marker, apertype="rectangle", aperture={.07, .05};
@@ -140,14 +139,16 @@ def test_mad_import():
140
139
  m_octagon, at=0.05;
141
140
  m_polygon, at=0.06;
142
141
  endsequence;
143
-
144
- use,sequence=ss;
145
- twiss,betx=1,bety=1;
146
142
  """
147
- )
148
-
149
- line = xt.Line.from_madx_sequence(mad.sequence.ss, install_apertures=True)
150
-
143
+ if loader == 'cpymad':
144
+ mad = Madx()
145
+ mad.input(mad_src)
146
+ mad.beam()
147
+ mad.use('ss')
148
+ line = xt.Line.from_madx_sequence(mad.sequence.ss, install_apertures=True)
149
+ elif loader == 'native':
150
+ env = xt.load(string=mad_src, format='madx')
151
+ line = env.ss
151
152
  apertures = [ee for ee in line.elements if ee.__class__.__name__.startswith('Limit')]
152
153
 
153
154
  circ = apertures[0]
@@ -210,10 +211,15 @@ def test_mad_import():
210
211
  assert polyg.__class__.__name__ == 'LimitPolygon'
211
212
  assert len(polyg._xobject.x_vertices) == 3
212
213
  assert len(polyg._xobject.y_vertices) == 3
213
- assert polyg._xobject.x_vertices[0] == -8.8e-2
214
- assert polyg._xobject.y_vertices[0] == 0
215
- assert polyg._xobject.x_vertices[1] == 5.8e-2
216
- assert polyg._xobject.y_vertices[1] == -3.5e-2
214
+ # assert polyg._xobject.x_vertices[0] == -8.8e-2
215
+ # assert polyg._xobject.y_vertices[0] == 0
216
+ # assert polyg._xobject.x_vertices[1] == 5.8e-2
217
+ # assert polyg._xobject.y_vertices[1] == -3.5e-2
218
+ # breakpoint()
219
+ xo.assert_allclose(polyg.x_vertices, np.array([+5.800e-2,+5.800e-2,-8.800e-2]),
220
+ atol=1e-14, rtol=0)
221
+ xo.assert_allclose(polyg.y_vertices, np.array([+3.500e-2,-3.500e-2,+0.000e+0]),
222
+ atol=1e-14, rtol=0)
217
223
 
218
224
 
219
225
  @for_all_test_contexts
@@ -301,62 +307,64 @@ def test_aperture_svg_path():
301
307
  aper2=xt.LimitPolygon.from_dict(aper.to_dict())
302
308
  assert aper2.svg==aper.svg
303
309
 
304
- x_expected = np.array([ 3.41600000e-03, 3.15400000e-03, 2.92800000e-03, 2.75000000e-03,
305
- 2.63200000e-03, 2.58600000e-03, 2.62400000e-03, 2.75800000e-03,
306
- 3.00000000e-03, 2.40800000e-03, 2.12700000e-03, 1.86400000e-03,
307
- 1.62500000e-03, 1.41600000e-03, 1.24300000e-03, 1.11200000e-03,
308
- 1.02900000e-03, 1.00000000e-03, 7.24296143e-04, 5.96239745e-04,
309
- 4.76593043e-04, 3.66655177e-04, 2.67619865e-04, 1.80562445e-04,
310
- 1.06428199e-04, 4.60220848e-05, -4.44089210e-19, 7.05663559e-04,
311
- 1.04481682e-03, 1.37237342e-03, 1.68655149e-03, 1.98564190e-03,
312
- 2.26801764e-03, 2.53214260e-03, 2.77657996e-03, 3.00000000e-03,
313
- 3.01200000e-03, 2.99700000e-03, 2.96800000e-03, 2.92500000e-03,
314
- 2.86800000e-03, 2.79700000e-03, 2.71200000e-03, 2.61300000e-03,
315
- 2.50000000e-03, 2.25600000e-03, 2.13100000e-03, 2.00400000e-03,
316
- 1.87500000e-03, 1.74400000e-03, 1.61100000e-03, 1.47600000e-03,
317
- 1.33900000e-03, 1.20000000e-03, 1.00800000e-03, 9.78000000e-04,
318
- 9.92000000e-04, 1.05000000e-03, 1.15200000e-03, 1.29800000e-03,
319
- 1.48800000e-03, 1.72200000e-03, 2.00000000e-03, 2.54000000e-03,
320
- 2.76500000e-03, 2.96000000e-03, 3.12500000e-03, 3.26000000e-03,
321
- 3.36500000e-03, 3.44000000e-03, 3.48500000e-03, 3.50000000e-03,
322
- 3.52000000e-03, 3.54500000e-03, 3.58000000e-03, 3.62500000e-03,
323
- 3.68000000e-03, 3.74500000e-03, 3.82000000e-03, 3.90500000e-03,
324
- 4.00000000e-03, 4.56952827e-03, 4.82689224e-03, 5.06408867e-03,
325
- 5.27982723e-03, 5.47293432e-03, 5.64235946e-03, 5.78718097e-03,
326
- 5.90661105e-03, 6.00000000e-03, 6.27570386e-03, 6.40376026e-03,
327
- 6.52340696e-03, 6.63334482e-03, 6.73238014e-03, 6.81943755e-03,
328
- 6.89357180e-03, 6.95397792e-03, 7.00000000e-03, 7.38400000e-03,
329
- 7.44100000e-03, 7.43200000e-03, 7.37500000e-03, 7.28800000e-03,
330
- 7.18900000e-03, 7.09600000e-03, 7.02700000e-03, 7.00000000e-03,
331
- 6.50400000e-03, 6.31600000e-03, 6.15200000e-03, 6.00000000e-03,
332
- 5.84800000e-03, 5.68400000e-03, 5.49600000e-03, 5.27200000e-03,
333
- 5.00000000e-03, 1.20000000e-02, 1.30000000e-02, 1.00000000e-02,
334
- 4.00000000e-03])
335
- y_expected = np.array([-0.007504 , -0.007316 , -0.007152 , -0.007 , -0.006848 ,
336
- -0.006684 , -0.006496 , -0.006272 , -0.006 , -0.005904 ,
337
- -0.005811 , -0.005712 , -0.005625 , -0.005568 , -0.005559 ,
338
- -0.005616 , -0.005757 , -0.006 , -0.00610643, -0.00618056,
339
- -0.00626762, -0.00636666, -0.00647659, -0.00659624, -0.0067243 ,
340
- -0.00685937, -0.007 , -0.00721282, -0.00735764, -0.00752707,
341
- -0.00772017, -0.00793591, -0.00817311, -0.00843047, -0.0087066 ,
342
- -0.009 , -0.00918 , -0.009255 , -0.00932 , -0.009375 ,
343
- -0.00942 , -0.009455 , -0.00948 , -0.009495 , -0.0095 ,
344
- -0.00956 , -0.009635 , -0.00974 , -0.009875 , -0.01004 ,
345
- -0.010235 , -0.01046 , -0.010715 , -0.011 , -0.011512 ,
346
- -0.011702 , -0.011848 , -0.01195 , -0.012008 , -0.012022 ,
347
- -0.011992 , -0.011918 , -0.0118 , -0.011524 , -0.011389 ,
348
- -0.011256 , -0.011125 , -0.010996 , -0.010869 , -0.010744 ,
349
- -0.010621 , -0.0105 , -0.010288 , -0.010203 , -0.010132 ,
350
- -0.010075 , -0.010032 , -0.010003 , -0.009988 , -0.009987 ,
351
- -0.01 , -0.01046786, -0.01073198, -0.01101436, -0.01131345,
352
- -0.01162763, -0.01195518, -0.01229434, -0.01264324, -0.013 ,
353
- -0.01289357, -0.01281944, -0.01273238, -0.01263334, -0.01252341,
354
- -0.01240376, -0.0122757 , -0.01214063, -0.012 , -0.011888 ,
355
- -0.011757 , -0.011584 , -0.011375 , -0.011136 , -0.010873 ,
356
- -0.010592 , -0.010299 , -0.01 , -0.010376 , -0.010414 ,
357
- -0.010368 , -0.01025 , -0.010072 , -0.009846 , -0.009584 ,
358
- -0.009298 , -0.009 , -0.003 , -0. , -0.001 ,
359
- -0.008 ])
310
+ x_expected = np.array([
311
+ 4.00000000e-03, 1.00000000e-02, 1.30000000e-02, 1.20000000e-02,
312
+ 5.00000000e-03, 5.27200000e-03, 5.49600000e-03, 5.68400000e-03,
313
+ 5.84800000e-03, 6.00000000e-03, 6.15200000e-03, 6.31600000e-03,
314
+ 6.50400000e-03, 7.00000000e-03, 7.02700000e-03, 7.09600000e-03,
315
+ 7.18900000e-03, 7.28800000e-03, 7.37500000e-03, 7.43200000e-03,
316
+ 7.44100000e-03, 7.38400000e-03, 7.00000000e-03, 6.95397792e-03,
317
+ 6.89357180e-03, 6.81943755e-03, 6.73238014e-03, 6.63334482e-03,
318
+ 6.52340696e-03, 6.40376026e-03, 6.27570386e-03, 6.00000000e-03,
319
+ 5.90661105e-03, 5.78718097e-03, 5.64235946e-03, 5.47293432e-03,
320
+ 5.27982723e-03, 5.06408867e-03, 4.82689224e-03, 4.56952827e-03,
321
+ 4.00000000e-03, 3.90500000e-03, 3.82000000e-03, 3.74500000e-03,
322
+ 3.68000000e-03, 3.62500000e-03, 3.58000000e-03, 3.54500000e-03,
323
+ 3.52000000e-03, 3.50000000e-03, 3.48500000e-03, 3.44000000e-03,
324
+ 3.36500000e-03, 3.26000000e-03, 3.12500000e-03, 2.96000000e-03,
325
+ 2.76500000e-03, 2.54000000e-03, 2.00000000e-03, 1.72200000e-03,
326
+ 1.48800000e-03, 1.29800000e-03, 1.15200000e-03, 1.05000000e-03,
327
+ 9.92000000e-04, 9.78000000e-04, 1.00800000e-03, 1.20000000e-03,
328
+ 1.33900000e-03, 1.47600000e-03, 1.61100000e-03, 1.74400000e-03,
329
+ 1.87500000e-03, 2.00400000e-03, 2.13100000e-03, 2.25600000e-03,
330
+ 2.50000000e-03, 2.61300000e-03, 2.71200000e-03, 2.79700000e-03,
331
+ 2.86800000e-03, 2.92500000e-03, 2.96800000e-03, 2.99700000e-03,
332
+ 3.01200000e-03, 3.00000000e-03, 2.77657996e-03, 2.53214260e-03,
333
+ 2.26801764e-03, 1.98564190e-03, 1.68655149e-03, 1.37237342e-03,
334
+ 1.04481682e-03, 7.05663559e-04, -4.44089210e-19, 4.60220848e-05,
335
+ 1.06428199e-04, 1.80562445e-04, 2.67619865e-04, 3.66655177e-04,
336
+ 4.76593043e-04, 5.96239745e-04, 7.24296143e-04, 1.00000000e-03,
337
+ 1.02900000e-03, 1.11200000e-03, 1.24300000e-03, 1.41600000e-03,
338
+ 1.62500000e-03, 1.86400000e-03, 2.12700000e-03, 2.40800000e-03,
339
+ 3.00000000e-03, 2.75800000e-03, 2.62400000e-03, 2.58600000e-03,
340
+ 2.63200000e-03, 2.75000000e-03, 2.92800000e-03, 3.15400000e-03,
341
+ 3.41600000e-03])
342
+ y_expected = np.array([
343
+ -0.008 , -0.001 , -0. , -0.003 , -0.009 ,
344
+ -0.009298 , -0.009584 , -0.009846 , -0.010072 , -0.01025 ,
345
+ -0.010368 , -0.010414 , -0.010376 , -0.01 , -0.010299 ,
346
+ -0.010592 , -0.010873 , -0.011136 , -0.011375 , -0.011584 ,
347
+ -0.011757 , -0.011888 , -0.012 , -0.01214063, -0.0122757 ,
348
+ -0.01240376, -0.01252341, -0.01263334, -0.01273238, -0.01281944,
349
+ -0.01289357, -0.013 , -0.01264324, -0.01229434, -0.01195518,
350
+ -0.01162763, -0.01131345, -0.01101436, -0.01073198, -0.01046786,
351
+ -0.01 , -0.009987 , -0.009988 , -0.010003 , -0.010032 ,
352
+ -0.010075 , -0.010132 , -0.010203 , -0.010288 , -0.0105 ,
353
+ -0.010621 , -0.010744 , -0.010869 , -0.010996 , -0.011125 ,
354
+ -0.011256 , -0.011389 , -0.011524 , -0.0118 , -0.011918 ,
355
+ -0.011992 , -0.012022 , -0.012008 , -0.01195 , -0.011848 ,
356
+ -0.011702 , -0.011512 , -0.011 , -0.010715 , -0.01046 ,
357
+ -0.010235 , -0.01004 , -0.009875 , -0.00974 , -0.009635 ,
358
+ -0.00956 , -0.0095 , -0.009495 , -0.00948 , -0.009455 ,
359
+ -0.00942 , -0.009375 , -0.00932 , -0.009255 , -0.00918 ,
360
+ -0.009 , -0.0087066 , -0.00843047, -0.00817311, -0.00793591,
361
+ -0.00772017, -0.00752707, -0.00735764, -0.00721282, -0.007 ,
362
+ -0.00685937, -0.0067243 , -0.00659624, -0.00647659, -0.00636666,
363
+ -0.00626762, -0.00618056, -0.00610643, -0.006 , -0.005757 ,
364
+ -0.005616 , -0.005559 , -0.005568 , -0.005625 , -0.005712 ,
365
+ -0.005811 , -0.005904 , -0.006 , -0.006272 , -0.006496 ,
366
+ -0.006684 , -0.006848 , -0.007 , -0.007152 , -0.007316 ,
367
+ -0.007504 ])
360
368
 
361
369
  xo.assert_allclose(aper.x_vertices, x_expected, atol=1e-6, rtol=0)
362
370
  xo.assert_allclose(aper.y_vertices, y_expected, atol=1e-6, rtol=0)
@@ -378,4 +386,4 @@ def test_limitrect_to_dict():
378
386
  assert lrectdef.min_x == -1e10
379
387
  assert lrectdef.max_x == 1e10
380
388
  assert lrectdef.min_y == -1e10
381
- assert lrectdef.max_y == 1e10
389
+ assert lrectdef.max_y == 1e10
@@ -0,0 +1,90 @@
1
+ # copyright ############################### #
2
+ # This file is part of the Xtrack Package. #
3
+ # Copyright (c) CERN, 2025. #
4
+ # ######################################### #
5
+
6
+ import pytest
7
+ import numpy as np
8
+
9
+ import xtrack as xt
10
+ import xobjects as xo
11
+ from xobjects.test_helpers import for_all_test_contexts
12
+
13
+
14
+ @for_all_test_contexts
15
+ @pytest.mark.parametrize("overload", [True, False], ids=['overload', 'no_overload'])
16
+ @pytest.mark.parametrize("ctype", [xo.Int8, xo.Int16, xo.Int32, xo.Int64,
17
+ xo.UInt8, xo.UInt16, xo.UInt32,
18
+ xo.UInt64, xo.Float32, xo.Float64])
19
+ def test_atomic(overload, ctype, test_context):
20
+ if overload:
21
+ func_name = 'atomicAdd'
22
+ else:
23
+ func_name = f'atomicAdd_{ctype.__name__.lower()[0]}{ctype.__name__.split("t")[1]}'
24
+ class TestAtomic(xt.BeamElement):
25
+ _xofields = {f'val': ctype}
26
+ allow_track = False
27
+ _extra_c_sources = [f'''
28
+ #include <headers/track.h>
29
+ #include <headers/atomicadd.h>
30
+
31
+ GPUKERN
32
+ void run_atomic_test(TestAtomicData el, GPUGLMEM {ctype._c_type}* increments,
33
+ GPUGLMEM {ctype._c_type}* retvals, int length) {{
34
+ VECTORIZE_OVER(ii, length);
35
+ GPUGLMEM {ctype._c_type}* val = TestAtomicData_getp_val(el);
36
+ {ctype._c_type} ret = {func_name}(val, increments[ii]);
37
+ retvals[ii] = ret;
38
+ END_VECTORIZE;
39
+ }}
40
+ ''']
41
+
42
+ _kernels = {
43
+ 'run_atomic_test': xo.Kernel(
44
+ c_name='run_atomic_test',
45
+ args=[xo.Arg(xo.ThisClass, name='el'),
46
+ xo.Arg(ctype, pointer=True, name='increments'),
47
+ xo.Arg(ctype, pointer=True, name='retvals'),
48
+ xo.Arg(xo.Int32, name='length')],
49
+ n_threads='length')
50
+ }
51
+
52
+ atomic = TestAtomic(_context=test_context, val=0)
53
+ assert atomic.val == 0
54
+
55
+ # Test with all increments = 1, so we can check the return values easily.
56
+ num_steps = 10000
57
+ if ctype.__name__.startswith('Int') or ctype.__name__.startswith('Uint'):
58
+ # Less steps to avoid overflow
59
+ num_steps = min(num_steps, 2**(8*ctype._size - 1) - 1)
60
+ increments = test_context.zeros(shape=(num_steps,), dtype=ctype._dtype) + 1
61
+ retvals = test_context.zeros(shape=(num_steps,), dtype=ctype._dtype)
62
+ atomic.run_atomic_test(increments=increments, retvals=retvals, length=num_steps)
63
+ assert atomic.val == num_steps
64
+ retvals = np.sort(test_context.nparray_from_context_array(retvals))
65
+ assert np.allclose(retvals, np.arange(num_steps, dtype=ctype._dtype), atol=1.e-15, rtol=1.e-15)
66
+
67
+ # Test with random increments, where we now only can check the total sum
68
+ # (retvals can be anything). Watch out: overflow is undefined behaviour,
69
+ # except for unsigned integers, so we skip this test for signed integers.
70
+ atomic.val = 0
71
+ retvals = test_context.zeros(shape=(num_steps,), dtype=ctype._dtype)
72
+ if ctype.__name__.startswith('Uint'):
73
+ low = 0
74
+ high = 2**(8*ctype._size) - 1
75
+ increments = np.random.randint(low, high+1, size=num_steps, dtype=ctype._dtype)
76
+ increments = test_context.nparray_to_context_array(increments)
77
+ atomic.run_atomic_test(increments=increments, retvals=retvals, length=num_steps)
78
+ increments = test_context.nparray_from_context_array(increments)
79
+ assert atomic.val == (np.sum(increments).item() % (2**(8*ctype._size)))
80
+
81
+ elif ctype.__name__.startswith('Float'):
82
+ increments = np.zeros(shape=(num_steps,), dtype=ctype._dtype)
83
+ increments += np.random.uniform(0, 10, size=num_steps)
84
+ increments = test_context.nparray_to_context_array(increments)
85
+ atomic.run_atomic_test(increments=increments, retvals=retvals, length=num_steps)
86
+ increments = test_context.nparray_from_context_array(increments)
87
+ if ctype == xo.Float32:
88
+ assert np.isclose(atomic.val, np.sum(increments), atol=10., rtol=1.e-4)
89
+ else:
90
+ assert np.isclose(atomic.val, np.sum(increments), atol=1.e-6, rtol=1.e-12)
@@ -15,35 +15,42 @@ def test_coupling_edwards_teng():
15
15
  mad = Madx()
16
16
  mad.call(str(test_data_folder / 'lhc_2024/lhc.seq'))
17
17
  mad.call(str(test_data_folder / 'lhc_2024/injection_optics.madx'))
18
+ mad.options.rbarc = True # override setting in lhc.seq to be compatible with Xsuite
18
19
 
19
20
  mad.beam()
20
21
  mad.use('lhcb1')
21
22
 
22
- mad.globals.on_x1 = 0
23
- mad.globals.on_x2h = 0
24
- mad.globals.on_x2v = 0
25
- mad.globals.on_x5 = 0
26
- mad.globals.on_x8h = 0
27
- mad.globals.on_x8v = 0
28
-
29
- mad.globals.on_sep1 = 0
30
- mad.globals.on_sep2h = 0
31
- mad.globals.on_sep2v = 0
32
- mad.globals.on_sep5 = 0
33
- mad.globals.on_sep8h = 0
34
- mad.globals.on_sep8v = 0
35
-
36
- mad.globals.on_a2 = 0
37
- mad.globals.on_a8 = 0
38
-
39
- mad.globals['kqs.a67b1'] = 1e-4
23
+ settings = dict(
24
+ on_x1 = 0,
25
+ on_x2h = 0,
26
+ on_x2v = 0,
27
+ on_x5 = 0,
28
+ on_x8h = 0,
29
+ on_x8v = 0,
30
+ on_sep1 = 0,
31
+ on_sep2h = 0,
32
+ on_sep2v = 0,
33
+ on_sep5 = 0,
34
+ on_sep8h = 0,
35
+ on_sep8v = 0,
36
+ on_a2 = 0,
37
+ on_a8 = 0,
38
+ )
39
+ settings['kqs.a67b1'] = 1e-4
40
+
41
+ for kk, vv in settings.items():
42
+ mad.globals[kk] = vv
40
43
 
41
44
  twmad = mad.twiss()
42
45
 
43
- line = xt.Line.from_madx_sequence(mad.sequence.lhcb1, deferred_expressions=True)
44
- line.particle_ref = xt.Particles(p0c=450e9)
45
- tw = line.twiss4d(coupling_edw_teng=True)
46
+ env = xt.load([test_data_folder / 'lhc_2024/lhc.seq',
47
+ test_data_folder / 'lhc_2024/injection_optics.madx'])
48
+ line = env['lhcb1']
49
+ line.set_particle_ref('proton', p0c=450e9)
50
+ for kk, vv in settings.items():
51
+ line[kk] = vv
46
52
 
53
+ tw = line.twiss4d(coupling_edw_teng=True)
47
54
 
48
55
  r11_mad, r12_mad, r21_mad, r22_mad = twmad.r11, twmad.r12, twmad.r21, twmad.r22
49
56
 
@@ -276,7 +276,6 @@ def test_record_with_twiss(test_context):
276
276
  line.particle_ref = xp.Particles(mass0=xp.PROTON_MASS_EV, q0=1, p0c=6.5e12)
277
277
  io_buffer = line.tracker.io_buffer
278
278
  line.twiss(at_s=np.linspace(0, line.get_length(), 500))
279
-
280
279
 
281
280
 
282
281
  @for_all_test_contexts
@@ -223,7 +223,7 @@ def test_drift_exact_and_expanded(test_context):
223
223
 
224
224
  assert line['e2'].model == 'adaptive'
225
225
 
226
- p0 = xp.Particles(p0c=1e9, px=0.3, _context=test_context)
226
+ p0 = xp.Particles(p0c=1e9, px=0.3)
227
227
  x_prime_expanded = p0.px / (1 + p0.delta)
228
228
  x_prime_exact = p0.px / np.sqrt((1 + p0.delta)**2 - p0.px**2)
229
229
 
@@ -1288,3 +1288,17 @@ def test_multipole_tilt_90_deg(test_context):
1288
1288
  xo.assert_allclose(pf.ptau, pfy.ptau, rtol=0, atol=1e-14)
1289
1289
 
1290
1290
 
1291
+ def test_beam_element_sin_cos_rot_backwards_compatible():
1292
+ rot_s_rad = 0.13
1293
+ sin_rot_s = np.sin(rot_s_rad)
1294
+ cos_rot_s = np.cos(rot_s_rad)
1295
+
1296
+ mb_init = xt.Bend(length=1, _sin_rot_s=sin_rot_s, _cos_rot_s=cos_rot_s)
1297
+ mb_dict = xt.Bend.from_dict({
1298
+ 'length': 1,
1299
+ '_sin_rot_s': sin_rot_s,
1300
+ '_cos_rot_s': cos_rot_s,
1301
+ })
1302
+
1303
+ assert rot_s_rad == mb_init.rot_s_rad
1304
+ assert rot_s_rad == mb_dict.rot_s_rad