xtrack 0.90.2__tar.gz → 0.93.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 (354) hide show
  1. {xtrack-0.90.2/xtrack.egg-info → xtrack-0.93.0}/PKG-INFO +2 -1
  2. {xtrack-0.90.2 → xtrack-0.93.0}/setup.py +1 -1
  3. xtrack-0.93.0/tests/test_boris_spatial.py +117 -0
  4. xtrack-0.93.0/tests/test_json.py +94 -0
  5. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_mad_writer.py +0 -1
  6. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_rbend_straight_body.py +59 -1
  7. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_twiss.py +1 -1
  8. xtrack-0.93.0/tests/test_twiss_to_file.py +88 -0
  9. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/__init__.py +3 -2
  10. xtrack-0.93.0/xtrack/_version.py +1 -0
  11. xtrack-0.93.0/xtrack/boris.py +161 -0
  12. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/environment.py +5 -5
  13. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/general.py +10 -3
  14. xtrack-0.93.0/xtrack/json.py +96 -0
  15. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/line.py +4 -1
  16. xtrack-0.93.0/xtrack/load.py +140 -0
  17. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/mad_parser/loader.py +5 -3
  18. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/mad_writer.py +6 -1
  19. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/survey.py +1 -2
  20. xtrack-0.93.0/xtrack/table.py +1604 -0
  21. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/twiss.py +155 -98
  22. {xtrack-0.90.2 → xtrack-0.93.0/xtrack.egg-info}/PKG-INFO +2 -1
  23. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack.egg-info/SOURCES.txt +5 -0
  24. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack.egg-info/requires.txt +1 -0
  25. xtrack-0.90.2/xtrack/_version.py +0 -1
  26. xtrack-0.90.2/xtrack/json.py +0 -48
  27. xtrack-0.90.2/xtrack/load.py +0 -68
  28. {xtrack-0.90.2 → xtrack-0.93.0}/LICENSE +0 -0
  29. {xtrack-0.90.2 → xtrack-0.93.0}/MANIFEST.in +0 -0
  30. {xtrack-0.90.2 → xtrack-0.93.0}/README.md +0 -0
  31. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/__init__.py +0 -0
  32. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/base_classes.py +0 -0
  33. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/BB6D.py +0 -0
  34. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  35. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/__init__.py +0 -0
  36. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/beambeam.py +0 -0
  37. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/boost.py +0 -0
  38. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  39. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  40. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/qgauss.py +0 -0
  41. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/slicing.py +0 -0
  42. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/be_beamfields/spacecharge.py +0 -0
  43. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/elements.py +0 -0
  44. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/line.py +0 -0
  45. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/mathlibs.py +0 -0
  46. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/particles.py +0 -0
  47. {xtrack-0.90.2 → xtrack-0.93.0}/ducktrack/temp_pyparticles.py +0 -0
  48. {xtrack-0.90.2 → xtrack-0.93.0}/pyproject.toml +0 -0
  49. {xtrack-0.90.2 → xtrack-0.93.0}/setup.cfg +0 -0
  50. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_acceleration.py +0 -0
  51. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_amplitude_detuning.py +0 -0
  52. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_aperture_table.py +0 -0
  53. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  54. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_apertures.py +0 -0
  55. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_attr_replicas_and_slices.py +0 -0
  56. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_bucket_with_ref_energy_change.py +0 -0
  57. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_cavity_absolute_time.py +0 -0
  58. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_chromatic_functions_vs_madx.py +0 -0
  59. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_coasting.py +0 -0
  60. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_collective_tracker.py +0 -0
  61. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_collimation.py +0 -0
  62. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_coupling_edwards_teng.py +0 -0
  63. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_electron_cooler.py +0 -0
  64. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_element_characterization_functions.py +0 -0
  65. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_element_internal_record.py +0 -0
  66. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_elements.py +0 -0
  67. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_elements_classflags.py +0 -0
  68. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_elements_thick.py +0 -0
  69. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_environment.py +0 -0
  70. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  71. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  72. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_footprint.py +0 -0
  73. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_freeze_longitudinal.py +0 -0
  74. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_full_rings.py +0 -0
  75. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_h6_sps_beamline.py +0 -0
  76. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_hvkick.py +0 -0
  77. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_ions.py +0 -0
  78. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_legacy_multiline_to_env.py +0 -0
  79. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_lhc_env.py +0 -0
  80. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_lhc_match_phase_15.py +0 -0
  81. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_line.py +0 -0
  82. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_load.py +0 -0
  83. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_load_vars.py +0 -0
  84. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_lumi.py +0 -0
  85. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_madloader.py +0 -0
  86. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_madnginterface.py +0 -0
  87. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_magnet.py +0 -0
  88. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_match_and_track_from_element.py +0 -0
  89. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_match_coupling_knob.py +0 -0
  90. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_match_nested.py +0 -0
  91. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_match_optics_and_ip_knob.py +0 -0
  92. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  93. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_match_orbit_bump.py +0 -0
  94. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_match_tune_chroma_cminus.py +0 -0
  95. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_misalign.py +0 -0
  96. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_monitor.py +0 -0
  97. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_multi_bunch_gauss.py +0 -0
  98. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_multiline.py +0 -0
  99. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_multisetter.py +0 -0
  100. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_multispecies.py +0 -0
  101. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_native_madloader.py +0 -0
  102. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_optimize_for_tracking.py +0 -0
  103. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_particles.py +0 -0
  104. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_particles_basics.py +0 -0
  105. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_particles_pdg.py +0 -0
  106. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_pipeline.py +0 -0
  107. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_prebuild_kernels.py +0 -0
  108. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_ps_against_ptc.py +0 -0
  109. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_ps_multiturn_twiss.py +0 -0
  110. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_psb_chicane.py +0 -0
  111. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_pyht_interface.py +0 -0
  112. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_quadrupole_fringe_ptc.py +0 -0
  113. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_quadrupole_wedge.py +0 -0
  114. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_radial_steering.py +0 -0
  115. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_radiation.py +0 -0
  116. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_radiation_equilibrium_emittances.py +0 -0
  117. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  118. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_radiation_integrals.py +0 -0
  119. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_random_gen.py +0 -0
  120. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_random_gen_exp.py +0 -0
  121. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_random_gen_gauss.py +0 -0
  122. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_random_gen_ruth.py +0 -0
  123. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_rbend_rbarc.py +0 -0
  124. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_rf_track.py +0 -0
  125. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_rotation_signs.py +0 -0
  126. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_second_order_taylor_map.py +0 -0
  127. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_seeds.py +0 -0
  128. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_slice_and_insert_with_replicas.py +0 -0
  129. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_slice_elements.py +0 -0
  130. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_slicing.py +0 -0
  131. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  132. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  133. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_spacecharge_in_ring.py +0 -0
  134. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_spin.py +0 -0
  135. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_sps_thick.py +0 -0
  136. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_survey.py +0 -0
  137. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_tapering.py +0 -0
  138. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_thick_kickers_rf_crab.py +0 -0
  139. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_thick_lhc.py +0 -0
  140. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_tilt_shifts.py +0 -0
  141. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_tracker.py +0 -0
  142. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_trajectory_correcton.py +0 -0
  143. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_twiss_vs_madx_psb.py +0 -0
  144. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_vs_madx.py +0 -0
  145. {xtrack-0.90.2 → xtrack-0.93.0}/tests/test_xmask_orbit_correction.py +0 -0
  146. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/_temp/__init__.py +0 -0
  147. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  148. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  149. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  150. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/_temp/lhc_match/__init__.py +0 -0
  151. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  152. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  153. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  154. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/aperture_meas.py +0 -0
  155. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/base_element.py +0 -0
  156. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/__init__.py +0 -0
  157. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/apertures.py +0 -0
  158. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  159. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  160. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  161. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  162. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  163. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  164. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/beam_interaction.py +0 -0
  165. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements.py +0 -0
  166. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/bend.h +0 -0
  167. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  168. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/crab_cavity.h +0 -0
  169. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
  170. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  171. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  172. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift.h +0 -0
  173. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
  174. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
  175. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  176. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  177. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
  178. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
  179. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
  180. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  181. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  182. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  183. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  184. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
  185. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  186. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/elens.h +0 -0
  187. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  188. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  189. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
  190. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  191. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  192. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  193. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  194. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  195. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/marker.h +0 -0
  196. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/misalignment.h +0 -0
  197. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  198. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  199. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  200. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  201. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  202. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/rbend.h +0 -0
  203. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  204. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  205. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  206. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  207. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  208. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  209. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/slnd.h +0 -0
  210. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  211. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/temprf.h +0 -0
  212. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  213. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +0 -0
  214. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +0 -0
  215. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
  216. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  217. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  218. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
  219. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  220. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
  221. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  222. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  223. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  224. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +0 -0
  225. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +0 -0
  226. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
  227. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  228. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  229. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  230. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  231. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  232. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  233. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
  234. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  235. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  236. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  237. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  238. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  239. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
  240. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
  241. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  242. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  243. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  244. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  245. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
  246. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  247. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
  248. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_magnet.h +0 -0
  249. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_magnet.template.h +0 -0
  250. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
  251. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  252. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  253. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  254. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
  255. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_misalignments.h +0 -0
  256. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  257. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_rf.h +0 -0
  258. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_rf.template.h +0 -0
  259. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  260. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  261. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  262. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  263. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  264. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
  265. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  266. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
  267. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  268. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/wire.h +0 -0
  269. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  270. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  271. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  272. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  273. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/exciter.py +0 -0
  274. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/rft_element.py +0 -0
  275. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/slice_base.py +0 -0
  276. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/slice_elements_drift.py +0 -0
  277. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/slice_elements_edge.py +0 -0
  278. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  279. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/beam_elements/slice_elements_thin.py +0 -0
  280. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/footprint.py +0 -0
  281. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/functions.py +0 -0
  282. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/headers/atomicadd.h +0 -0
  283. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/headers/checks.h +0 -0
  284. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/headers/constants.h +0 -0
  285. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/headers/particle_states.h +0 -0
  286. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/headers/synrad_spectrum.h +0 -0
  287. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/headers/track.h +0 -0
  288. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/internal_record.py +0 -0
  289. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/linear_normal_form.py +0 -0
  290. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/loss_location_refinement/__init__.py +0 -0
  291. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  292. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/lumi.py +0 -0
  293. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/mad_loader.py +0 -0
  294. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/mad_parser/__init__.py +0 -0
  295. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/mad_parser/madx.lark +0 -0
  296. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/mad_parser/parse.py +0 -0
  297. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/madng_interface.py +0 -0
  298. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/match.py +0 -0
  299. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/__init__.py +0 -0
  300. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/beam_position_monitor.h +0 -0
  301. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/beam_position_monitor.py +0 -0
  302. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/beam_profile_monitor.h +0 -0
  303. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/beam_profile_monitor.py +0 -0
  304. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/beam_size_monitor.h +0 -0
  305. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/beam_size_monitor.py +0 -0
  306. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/last_turns_monitor.h +0 -0
  307. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/last_turns_monitor.py +0 -0
  308. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/particles_monitor.h +0 -0
  309. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/monitors/particles_monitor.py +0 -0
  310. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/multiline.py +0 -0
  311. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/multiline_legacy/__init__.py +0 -0
  312. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  313. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  314. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/multisetter/__init__.py +0 -0
  315. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/multisetter/multisetter.py +0 -0
  316. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/particles/__init__.py +0 -0
  317. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/particles/constants.py +0 -0
  318. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/particles/masses.py +0 -0
  319. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/particles/particles.py +0 -0
  320. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/particles/pdg.py +0 -0
  321. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/particles/rng_src/base_rng.h +0 -0
  322. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/particles/rng_src/particles_rng.h +0 -0
  323. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/pipeline/__init__.py +0 -0
  324. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/pipeline/core.py +0 -0
  325. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/pipeline/manager.py +0 -0
  326. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/pipeline/multitracker.py +0 -0
  327. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/prebuilt_kernel_definitions/__init__.py +0 -0
  328. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/prebuilt_kernel_definitions/element_inits.py +0 -0
  329. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/prebuilt_kernel_definitions/element_types.py +0 -0
  330. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/progress_indicator.py +0 -0
  331. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/random/__init__.py +0 -0
  332. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/random/random_generators.py +0 -0
  333. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/random/random_src/exponential.h +0 -0
  334. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  335. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/random/random_src/normal.h +0 -0
  336. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/random/random_src/rutherford.h +0 -0
  337. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/random/random_src/uniform.h +0 -0
  338. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/random/random_src/uniform_accurate.h +0 -0
  339. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/slicing.py +0 -0
  340. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/svgutils/__init__.py +0 -0
  341. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/svgutils/parser.py +0 -0
  342. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/svgutils/path.py +0 -0
  343. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/svgutils/svgutils.py +0 -0
  344. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/synctime.py +0 -0
  345. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/tapering.py +0 -0
  346. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/targets.py +0 -0
  347. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/track_flags.py +0 -0
  348. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/tracker.py +0 -0
  349. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/tracker_data.py +0 -0
  350. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/tracker_src/tracker.h +0 -0
  351. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/trajectory_correction.py +0 -0
  352. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack/twissplot.py +0 -0
  353. {xtrack-0.90.2 → xtrack-0.93.0}/xtrack.egg-info/dependency_links.txt +0 -0
  354. {xtrack-0.90.2 → xtrack-0.93.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.90.2
3
+ Version: 0.93.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
@@ -25,6 +25,7 @@ Requires-Dist: pytest; extra == "tests"
25
25
  Requires-Dist: pytest-mock; extra == "tests"
26
26
  Requires-Dist: pymadng; extra == "tests"
27
27
  Requires-Dist: requests-mock; extra == "tests"
28
+ Requires-Dist: tfs-pandas; extra == "tests"
28
29
  Provides-Extra: notebooks
29
30
  Requires-Dist: jupyter; extra == "notebooks"
30
31
  Requires-Dist: ipympl; extra == "notebooks"
@@ -50,7 +50,7 @@ setup(
50
50
  ],
51
51
  extras_require={
52
52
  'tests': ['cpymad', 'nafflib', 'PyHEADTAIL', 'pytest', 'pytest-mock',
53
- 'pymadng', 'requests-mock'],
53
+ 'pymadng', 'requests-mock', 'tfs-pandas'],
54
54
  'notebooks': ['jupyter', 'ipympl', 'xplt'],
55
55
  },
56
56
  )
@@ -0,0 +1,117 @@
1
+ import numpy as np
2
+ from scipy.constants import c as clight
3
+ from scipy.constants import e as qe
4
+
5
+ import xobjects as xo
6
+ import xtrack as xt
7
+ from xtrack._temp.boris_and_solenoid_map.solenoid_field import SolenoidField
8
+
9
+
10
+ def test_boris_spatial():
11
+ delta=np.array([0, 4])
12
+ p0 = xt.Particles(mass0=xt.ELECTRON_MASS_EV, q0=1,
13
+ energy0=45.6e9/1000,
14
+ x=[-1e-3, -1e-3],
15
+ px=-1e-3*(1+delta),
16
+ y=1e-3,
17
+ delta=delta)
18
+
19
+ p = p0.copy()
20
+
21
+ sf = SolenoidField(L=4, a=0.3, B0=1.5, z0=20)
22
+
23
+ integrator = xt.BorisSpatialIntegrator(fieldmap_callable=sf.get_field,
24
+ s_start=0,
25
+ s_end=30,
26
+ n_steps=15000)
27
+ p_boris = p.copy()
28
+ integrator.track(p_boris)
29
+
30
+
31
+ x_log = np.array(integrator.x_log)
32
+ y_log = np.array(integrator.y_log)
33
+ z_log = np.array(integrator.z_log)
34
+
35
+ b_seen = sf.get_field(x_log, y_log, z_log)
36
+
37
+
38
+ z_axis = np.linspace(0, 30, 1001)
39
+ Bz_axis = sf.get_field(0 * z_axis, 0 * z_axis, z_axis)[2]
40
+
41
+ P0_J = p.p0c[0] * qe / clight
42
+ brho = P0_J / qe / p.q0
43
+
44
+ # ks = 0.5 * (Bz_axis[:-1] + Bz_axis[1:]) / brho
45
+ ks = Bz_axis / brho
46
+ ks_entry = ks[:-1]
47
+ ks_exit = ks_entry*0
48
+ ks_exit = ks[1:]
49
+
50
+ dz = z_axis[1]-z_axis[0]
51
+
52
+ line = xt.Line(elements=[xt.VariableSolenoid(length=dz,
53
+ ks_profile=[ks_entry[ii], ks_exit[ii]])
54
+ for ii in range(len(z_axis)-1)])
55
+ line.build_tracker()
56
+
57
+ p_xt = p0.copy()
58
+ line.track(p_xt, turn_by_turn_monitor='ONE_TURN_EBE')
59
+ mon = line.record_last_track
60
+
61
+ p_xt = p0.copy()
62
+ line.configure_radiation(model=None)
63
+ line.track(p_xt, turn_by_turn_monitor='ONE_TURN_EBE')
64
+ mon_no_rad = line.record_last_track
65
+
66
+ Bz_mid = 0.5 * (Bz_axis[:-1] + Bz_axis[1:])
67
+ Bz_mon = 0 * Bz_axis
68
+ Bz_mon[1:] = Bz_mid
69
+
70
+ # Wolsky Eq. 3.114
71
+ Ax = -0.5 * Bz_mon * mon.y
72
+ Ay = 0.5 * Bz_mon * mon.x
73
+
74
+ # Wolsky Eq. 2.74
75
+ ax_ref = Ax * p0.q0 * qe / P0_J
76
+ ay_ref = Ay * p0.q0 * qe / P0_J
77
+
78
+ px_mech = mon.px - ax_ref
79
+ py_mech = mon.py - ay_ref
80
+ pz_mech = np.sqrt((1 + mon.delta)**2 - px_mech**2 - py_mech**2)
81
+
82
+ xp = px_mech / pz_mech
83
+ yp = py_mech / pz_mech
84
+
85
+ dx_ds = np.diff(mon.x, axis=1) / np.diff(mon.s, axis=1)
86
+ dy_ds = np.diff(mon.y, axis=1) / np.diff(mon.s, axis=1)
87
+
88
+ z_check = sf.z0 + sf.L * np.linspace(-2, 2, 1001)
89
+
90
+ for i_part in range(z_log.shape[1]):
91
+
92
+ this_s_boris = 0.5 * (z_log[:-1, i_part] + z_log[1:, i_part])
93
+ dx_ds_boris = np.diff(x_log[:, i_part]) / np.diff(z_log[:, i_part])
94
+ dy_ds_boris = np.diff(y_log[:, i_part]) / np.diff(z_log[:, i_part])
95
+
96
+ s_xsuite = 0.5 * (mon.s[i_part, :-1] + mon.s[i_part, 1:])
97
+ dx_ds_xsuite = np.diff(mon.x[i_part, :]) / np.diff(mon.s[i_part, :])
98
+ dy_ds_xsuite = np.diff(mon.y[i_part, :]) / np.diff(mon.s[i_part, :])
99
+
100
+ dx_ds_xsuite_check = np.interp(z_check, s_xsuite, dx_ds_xsuite)
101
+ dy_ds_xsuite_check = np.interp(z_check, s_xsuite, dy_ds_xsuite)
102
+
103
+ dx_ds_boris_check = np.interp(z_check, this_s_boris, dx_ds_boris)
104
+ dy_ds_boris_check = np.interp(z_check, this_s_boris, dy_ds_boris)
105
+
106
+ this_dx_ds = dx_ds[i_part, :]
107
+ this_dy_ds = dy_ds[i_part, :]
108
+
109
+ xo.assert_allclose(dx_ds_xsuite_check, dx_ds_boris_check, rtol=0,
110
+ atol=2.8e-2 * (np.max(dx_ds_boris_check) - np.min(dx_ds_boris_check)))
111
+ xo.assert_allclose(dy_ds_xsuite_check, dy_ds_boris_check, rtol=0,
112
+ atol=2.8e-2 * (np.max(dy_ds_boris_check) - np.min(dy_ds_boris_check)))
113
+
114
+ xo.assert_allclose(ax_ref[i_part, :], mon.ax[i_part, :],
115
+ rtol=0, atol=np.max(np.abs(ax_ref)*3e-2))
116
+ xo.assert_allclose(ay_ref[i_part, :], mon.ay[i_part, :],
117
+ rtol=0, atol=np.max(np.abs(ay_ref)*3e-2))
@@ -0,0 +1,94 @@
1
+ import io
2
+
3
+ import numpy as np
4
+
5
+ from xtrack import json as xjson
6
+
7
+
8
+ def test_complex_scalar_round_trip():
9
+ data = {"value": 1 + 2j}
10
+
11
+ buffer = io.StringIO()
12
+ xjson.dump(data, buffer)
13
+ raw = buffer.getvalue()
14
+
15
+ buffer.seek(0)
16
+ loaded_from_file = xjson.load(file=buffer)
17
+ assert loaded_from_file == data
18
+ assert isinstance(loaded_from_file["value"], complex)
19
+
20
+ loaded_from_string = xjson.load(string=raw)
21
+ assert loaded_from_string == data
22
+ assert isinstance(loaded_from_string["value"], complex)
23
+
24
+
25
+ def test_complex_array_round_trip_preserves_dtype_and_shape(tmp_path):
26
+ array = np.array([[1 + 2j, 3 + 4j], [5 + 6j, 7 + 8j]], dtype=np.complex64)
27
+
28
+ path = tmp_path / "complex.json"
29
+ xjson.dump({"array": array}, path)
30
+
31
+ loaded = xjson.load(path)
32
+ round_trip = loaded["array"]
33
+
34
+ assert isinstance(round_trip, np.ndarray)
35
+ assert round_trip.dtype == array.dtype
36
+ np.testing.assert_allclose(round_trip, array)
37
+
38
+
39
+ def test_complex_array_round_trip_with_gzip(tmp_path):
40
+ array = np.array([1 + 2j, 3 + 4j], dtype=np.complex128)
41
+
42
+ path = tmp_path / "complex.json.gz"
43
+ xjson.dump({"array": array}, path)
44
+
45
+ loaded = xjson.load(path)
46
+ round_trip = loaded["array"]
47
+
48
+ assert isinstance(round_trip, np.ndarray)
49
+ assert round_trip.dtype == array.dtype
50
+ np.testing.assert_allclose(round_trip, array)
51
+
52
+
53
+ def test_python_primitive_types_round_trip():
54
+ data = {
55
+ "int": 42,
56
+ "float": 3.14,
57
+ "bool": True,
58
+ "str": "xtrack",
59
+ "list": [1, 2, 3],
60
+ "dict": {"nested": "value"},
61
+ "none": None,
62
+ }
63
+
64
+ buffer = io.StringIO()
65
+ xjson.dump(data, buffer)
66
+
67
+ buffer.seek(0)
68
+ loaded = xjson.load(file=buffer)
69
+ assert loaded == data
70
+
71
+
72
+ def test_numpy_scalar_round_trip():
73
+ data = {"value": np.int64(5)}
74
+
75
+ buffer = io.StringIO()
76
+ xjson.dump(data, buffer)
77
+
78
+ buffer.seek(0)
79
+ loaded = xjson.load(file=buffer)
80
+
81
+ assert loaded["value"] == 5
82
+ assert isinstance(loaded["value"], int)
83
+
84
+
85
+ def test_numpy_real_array_round_trip():
86
+ array = np.array([[1.0, 2.0], [3.0, 4.0]], dtype=np.float32)
87
+
88
+ buffer = io.StringIO()
89
+ xjson.dump({"array": array}, buffer)
90
+
91
+ buffer.seek(0)
92
+ loaded = xjson.load(file=buffer)
93
+
94
+ assert loaded["array"] == array.tolist()
@@ -29,7 +29,6 @@ def test_mad_writer(case):
29
29
  mad_seq = line.to_madx_sequence(sequence_name='myseq')
30
30
 
31
31
  mad = Madx(stdout=True)
32
- mad.options.rbarc = False
33
32
  mad.input(mad_seq)
34
33
  mad.beam(particle='proton', energy=7000e9)
35
34
  mad.use('myseq')
@@ -1,6 +1,7 @@
1
1
  import xtrack as xt
2
2
  import numpy as np
3
3
  import xobjects as xo
4
+ from cpymad.madx import Madx
4
5
  from xobjects.test_helpers import for_all_test_contexts
5
6
 
6
7
  import pathlib
@@ -1786,4 +1787,61 @@ def test_rbend_straight_body_v_shift():
1786
1787
  xo.assert_allclose(sv_test.Z, sv_curved.Z, atol=5e-14)
1787
1788
  xo.assert_allclose(sv_test.phi, sv_curved.phi, atol=5e-14)
1788
1789
  xo.assert_allclose(sv_test.psi, sv_curved.psi, atol=5e-14)
1789
- xo.assert_allclose(sv_test.theta, sv_curved.theta, atol=5e-14)
1790
+ xo.assert_allclose(sv_test.theta, sv_curved.theta, atol=5e-14)
1791
+
1792
+ def test_rbend_loading_writing_in_interfaces():
1793
+
1794
+ madx = Madx()
1795
+
1796
+ l_straight = 1.0
1797
+ angle = 0.5
1798
+ l_arc = l_straight / np.sinc(angle / np.pi / 2) # np.sinc is sin(pi*x)/(pi*x)
1799
+
1800
+ madx.input('''
1801
+ b: rbend, l=1.0, angle=0.5;
1802
+
1803
+ ss: sequence, l=5.0, refer=centre;
1804
+ b, at=2.5;
1805
+ endsequence;
1806
+ beam;
1807
+ use, sequence=ss;
1808
+ twiss, betx=1, bety=1;
1809
+ survey;
1810
+ ''')
1811
+ sv_madx = xt.Table(madx.table.survey, _copy_cols=True)
1812
+ xo.assert_allclose(madx.elements['b'].l, l_straight, rtol=1e-12)
1813
+ xo.assert_allclose(sv_madx['s', 'b:1'], 2.5 + l_arc / 2, rtol=1e-12) # b si at exit
1814
+
1815
+ # Check cpymad loader
1816
+ line = xt.Line.from_madx_sequence(madx.sequence.ss)
1817
+ line.remove('ss$start')
1818
+ line.remove('ss$end')
1819
+ line.particle_ref = xt.Particles(p0c=1e9)
1820
+ sv_xs = line.survey()
1821
+ xo.assert_allclose(line['b'].length_straight, l_straight, rtol=1e-12)
1822
+ xo.assert_allclose(line['b'].length, l_arc, rtol=1e-12)
1823
+ xo.assert_allclose(sv_xs['s', 'b'], 2.5 - l_arc / 2, rtol=1e-12) # b si at entrance
1824
+
1825
+ # Check to madx
1826
+ mad_str = line.to_madx_sequence(sequence_name='ggg')
1827
+ madx2 = Madx()
1828
+ madx2.input(mad_str)
1829
+ madx2.input('''
1830
+ beam;
1831
+ use, sequence=ggg;
1832
+ twiss, betx=1, bety=1;
1833
+ survey;
1834
+ ''')
1835
+ sv_madx2 = xt.Table(madx2.table.survey, _copy_cols=True)
1836
+ xo.assert_allclose(madx2.elements['b'].l, l_straight, rtol=1e-12)
1837
+
1838
+ # Check native madx loader
1839
+ env2 = xt.load(string=mad_str, format='madx')
1840
+ sv_xs2 = env2.ggg.survey()
1841
+ xo.assert_allclose(env2['b'].length_straight, l_straight, rtol=1e-12)
1842
+ xo.assert_allclose(env2['b'].length, l_arc, rtol=1e-12)
1843
+ xo.assert_allclose(sv_xs2['s', 'b'], 2.5 - l_arc / 2, rtol=1e-12) # b si at entrance
1844
+
1845
+ # Check madng
1846
+ sv_ng = line.madng_survey()
1847
+ xo.assert_allclose(sv_ng['s', 'b'], 2.5 - l_arc / 2, rtol=1e-12) # b si at entrance
@@ -2058,4 +2058,4 @@ def test_twiss_disable_apertures():
2058
2058
  tw = line.twiss(betx=1, bety=1, x=0.2, y=0)
2059
2059
  xo.assert_allclose(tw.x[-1], 0.2)
2060
2060
  with pytest.raises(AssertionError):
2061
- line.twiss(betx=1, bety=1, x=0.2, y=0, disable_apertures=False)
2061
+ line.twiss(betx=1, bety=1, x=0.2, y=0, disable_apertures=False)
@@ -0,0 +1,88 @@
1
+ import xtrack as xt
2
+ import xobjects as xo
3
+ import numpy as np
4
+ import pytest
5
+ import pathlib
6
+
7
+ test_data_folder = pathlib.Path(
8
+ __file__).parent.joinpath('../test_data').absolute()
9
+
10
+ @pytest.mark.parametrize("check_type", ['csv', 'hdf5', 'tfs', 'json'])
11
+ def test_twiss_table_file(check_type, tmp_path):
12
+
13
+ env = xt.load(test_data_folder / 'sps_thick/sps.seq')
14
+ env.vars.load(test_data_folder / 'sps_thick/lhc_q20.str')
15
+ line = env.sps
16
+ line.set_particle_ref('p', energy0=26e9)
17
+ tw = line.twiss4d()
18
+
19
+ if check_type == 'csv':
20
+ tw.to_csv(tmp_path / 'twiss_test.csv')
21
+ tw_test = xt.load(tmp_path / 'twiss_test.csv')
22
+ elif check_type == 'hdf5':
23
+ tw.to_hdf5(tmp_path / 'twiss_test.h5')
24
+ tw_test = xt.load(tmp_path / 'twiss_test.h5')
25
+ elif check_type == 'tfs':
26
+ tw.to_tfs(tmp_path / 'twiss_test.tfs')
27
+ tw_test = xt.load(tmp_path / 'twiss_test.tfs')
28
+ elif check_type == 'json':
29
+ tw.to_json(tmp_path / 'twiss_test.json')
30
+ tw_test = xt.load(tmp_path / 'twiss_test.json')
31
+ else:
32
+ raise ValueError(f'check_type {check_type} not supported')
33
+
34
+ assert isinstance(tw_test, xt.TwissTable)
35
+
36
+ assert np.all(np.array(tw_test._col_names) == np.array(tw._col_names))
37
+ if check_type == 'tfs':
38
+ assert set(tw_test.keys()) - set(tw.keys()) == {
39
+ '__class__', 'attrs_serialization', 'column_serialization', 'xtrack_version'
40
+ }
41
+ elif check_type == 'json':
42
+ assert set(tw_test.keys()) - set(tw.keys()) == {'xtrack_version'}
43
+ else:
44
+ assert set(tw_test.keys()) - set(tw.keys()) == {'__class__', 'xtrack_version'}
45
+ assert set(tw.keys()) - set(tw_test.keys()) == {'_action'}
46
+
47
+ for kk in tw._data:
48
+ if kk == '_action':
49
+ continue
50
+ if kk in ['particle_on_co', 'steps_r_matrix', 'line_config']:
51
+ continue # To be checked separately
52
+ if tw[kk] is None:
53
+ assert tw_test[kk] is None
54
+ continue
55
+ if isinstance(tw[kk], np.ndarray) and isinstance(tw[kk][0], str):
56
+ assert np.all(tw[kk] == tw_test[kk])
57
+ continue
58
+ elif isinstance(tw[kk], str):
59
+ assert tw[kk] == tw_test[kk]
60
+ continue
61
+ xo.assert_allclose(tw[kk], tw_test[kk], rtol=1e-7, atol=1e-15)
62
+
63
+ # Check particle_on_co
64
+ assert isinstance(tw.particle_on_co, xt.Particles)
65
+ assert isinstance(tw_test.particle_on_co, xt.Particles)
66
+ dct_ref = line.particle_ref.to_dict()
67
+ dct_test = tw_test.particle_on_co.to_dict()
68
+ for kk in dct_ref:
69
+ if isinstance(dct_ref[kk], np.ndarray):
70
+ xo.assert_allclose(dct_ref[kk], dct_test[kk], rtol=1e-10, atol=1e-15)
71
+ else:
72
+ assert dct_ref[kk] == dct_test[kk]
73
+
74
+ # Check steps_r_matrix
75
+ assert isinstance(tw.steps_r_matrix, dict)
76
+ assert isinstance(tw_test.steps_r_matrix, dict)
77
+ assert set(tw.steps_r_matrix.keys()) == set(tw_test.steps_r_matrix.keys())
78
+ for kk in tw.steps_r_matrix:
79
+ rmat_ref = tw.steps_r_matrix[kk]
80
+ rmat_test = tw_test.steps_r_matrix[kk]
81
+ xo.assert_allclose(rmat_ref, rmat_test, rtol=1e-10, atol=1e-15)
82
+
83
+ # Check line_config
84
+ assert isinstance(tw.line_config, dict)
85
+ assert isinstance(tw_test.line_config, dict)
86
+ assert set(tw.line_config.keys()) == set(tw_test.line_config.keys())
87
+ for kk in tw.line_config:
88
+ assert tw.line_config[kk] == tw_test.line_config[kk]
@@ -47,11 +47,12 @@ from .trajectory_correction import TrajectoryCorrection
47
47
  from .mad_parser.loader import load_madx_lattice
48
48
  from . import json
49
49
  from .load import load
50
+ from .boris import BorisSpatialIntegrator
50
51
 
51
52
  from .multiline import Multiline
52
53
 
53
- from xdeps import Table, FunctionPieceWiseLinear
54
+ from xdeps import FunctionPieceWiseLinear
55
+ from .table import Table
54
56
 
55
57
  from ._version import __version__
56
58
 
57
-
@@ -0,0 +1 @@
1
+ __version__ = '0.93.0'
@@ -0,0 +1,161 @@
1
+ import numpy as np
2
+
3
+ from scipy.constants import c as clight
4
+ from scipy.constants import e as qe
5
+
6
+ class BorisSpatialIntegrator:
7
+
8
+ isthick = True
9
+
10
+ def __init__(self, fieldmap_callable, s_start, s_end, n_steps, verbose=False):
11
+ self.fieldmap_callable = fieldmap_callable
12
+ self.s_start = s_start
13
+ self.s_end = s_end
14
+ self.ds = (s_end - s_start) / n_steps
15
+ self.n_steps = n_steps
16
+ self.verbose = verbose
17
+ self.length = s_end - s_start
18
+
19
+ def track(self, p):
20
+
21
+ x_log = []
22
+ y_log = []
23
+ z_log = []
24
+ s_in = p.s.copy()
25
+ p.s=self.s_start
26
+
27
+ for ii in range(self.n_steps):
28
+
29
+ if self.verbose:
30
+ print(f's_in = {s_in[0]:.3f} s_in_map = {p.s[0]:.3f}', end='\r', flush=True)
31
+
32
+ q0 = p.q0
33
+ x = p.x.copy()
34
+ y = p.y.copy()
35
+ z = p.s.copy()
36
+ px = p.px.copy()
37
+ py = p.py.copy()
38
+ delta = p.delta.copy()
39
+ p0c = p.p0c
40
+
41
+ charge0_coulomb = q0 * qe
42
+
43
+ P0 = p0c * qe / clight # in kg m/s
44
+ P = P0 * (1 + delta)
45
+
46
+ Px = px * P0
47
+ Py = py * P0
48
+
49
+ w = np.zeros((Px.shape[0], 3), dtype=Px.dtype)
50
+ w[:, 0] = Px
51
+ w[:, 1] = Py
52
+ w[:, 2] = P
53
+
54
+ x_new, y_new, z_new, w_new = step_spatial_boris_B(x, y, z, w,
55
+ charge0_coulomb, self.ds,
56
+ field_fn=self.fieldmap_callable)
57
+ p.x = x_new.copy()
58
+ p.y = y_new.copy()
59
+ p.s = z_new.copy()
60
+ p.px = w_new[:, 0] / P0
61
+ p.py = w_new[:, 1] / P0
62
+
63
+ x_log.append(p.x.copy())
64
+ y_log.append(p.y.copy())
65
+ z_log.append(p.s.copy())
66
+ p.s = s_in + self.length
67
+ self.x_log = np.array(x_log)
68
+ self.y_log = np.array(y_log)
69
+ self.z_log = np.array(z_log)
70
+
71
+
72
+ import numpy as np
73
+ c = 299_792_458.0 # m/s
74
+
75
+ def step_spatial_boris_B(x, y, z, w, q, dz, field_fn):
76
+ """
77
+ Spatial Boris step for magnetic fields only (E = 0),
78
+ using constant total momentum magnitude P = w[:,2].
79
+
80
+ Parameters
81
+ ----------
82
+ x, y, z : (N,) arrays
83
+ Particle positions [m].
84
+ w : (N, 3) array
85
+ Momentum-like state: (px, py, P), where
86
+ P = |p| = sqrt(px^2 + py^2 + pz^2) is constant.
87
+ q : float
88
+ Particle charge [C].
89
+ dz : float
90
+ Spatial step along z [m].
91
+ field_fn : callable(x, y, z) -> (Bx, By, Bz)
92
+ Function returning magnetic-field components [T].
93
+
94
+ Returns
95
+ -------
96
+ x1, y1, z1 : (N,) arrays
97
+ Updated positions [m].
98
+ w1 : (N, 3) array
99
+ Updated momentum state (px, py, P).
100
+ """
101
+
102
+ # --- Unpack and ensure arrays
103
+ x = np.asarray(x)
104
+ y = np.asarray(y)
105
+ z = np.asarray(z)
106
+ w = np.asarray(w)
107
+ px, py, P = w[:, 0], w[:, 1], w[:, 2]
108
+
109
+ # --- Compute longitudinal momentum from constant magnitude
110
+ pz = np.sqrt(np.maximum(P**2 - px**2 - py**2, 0.0))
111
+
112
+ # --- Half drift in (x, y)
113
+ xh = x + (px / pz) * (dz * 0.5)
114
+ yh = y + (py / pz) * (dz * 0.5)
115
+ zh = z + dz * 0.5
116
+
117
+ # --- Evaluate magnetic field at mid-step
118
+ Bx, By, Bz = field_fn(xh, yh, zh)
119
+
120
+ # ============================================
121
+ # (1) FIRST HALF-KICK from (Bx, By)
122
+ # ============================================
123
+ pxm = px - 0.5 * q * dz * By
124
+ pym = py + 0.5 * q * dz * Bx
125
+
126
+ # --- Recompute pz to maintain |p| = P
127
+ pz = np.sqrt(np.maximum(P**2 - pxm**2 - pym**2, 0.0))
128
+
129
+ # ============================================
130
+ # (2) ROTATION due to Bz
131
+ # ============================================
132
+ t = 0.5 * q * Bz * dz / pz
133
+ t2 = t * t
134
+ s = 2.0 * t / (1.0 + t2)
135
+ c0 = (1.0 - t2) / (1.0 + t2)
136
+
137
+ # pxp = c0 * pxm - s * pym
138
+ # pyp = s * pxm + c0 * pym
139
+ pxp = c0 * pxm + s * pym
140
+ pyp = -s * pxm + c0 * pym
141
+
142
+ # ============================================
143
+ # (3) SECOND HALF-KICK from (Bx, By)
144
+ # ============================================
145
+ px1 = pxp - 0.5 * q * dz * By
146
+ py1 = pyp + 0.5 * q * dz * Bx
147
+
148
+ # --- Recompute pz after full step
149
+ pz1 = np.sqrt(np.maximum(P**2 - px1**2 - py1**2, 0.0))
150
+
151
+ # ============================================
152
+ # (4) SECOND HALF-DRIFT (x, y)
153
+ # ============================================
154
+ x1 = xh + (px1 / pz1) * (dz * 0.5)
155
+ y1 = yh + (py1 / pz1) * (dz * 0.5)
156
+ z1 = z + dz
157
+
158
+ # --- Pack updated (px, py, P)
159
+ w1 = np.stack([px1, py1, P], axis=1)
160
+
161
+ return x1, y1, z1, w1
@@ -658,11 +658,10 @@ class Environment:
658
658
 
659
659
  def _get_a_drift_name(self):
660
660
  self._drift_counter += 1
661
- nn = f'drift_{self._drift_counter}'
662
- if nn not in self.element_dict:
663
- return nn
664
- else:
665
- return self._get_a_drift_name()
661
+ while nn := f'drift_{self._drift_counter}':
662
+ if nn not in self.element_dict:
663
+ return nn
664
+ self._drift_counter += 1
666
665
 
667
666
  def __setitem__(self, key, value):
668
667
 
@@ -679,6 +678,7 @@ class Environment:
679
678
  def to_dict(self, include_var_management=True, include_version=True):
680
679
 
681
680
  out = {}
681
+ out['__class__'] = self.__class__.__name__
682
682
 
683
683
  if include_version:
684
684
  out["xtrack_version"] = xt.__version__
@@ -23,7 +23,7 @@ class _LOC:
23
23
  START = _LOC('START')
24
24
  END = _LOC('END')
25
25
 
26
- def read_url(url, timeout=0.1):
26
+ def read_url(url, timeout=0.1, binary=False):
27
27
  """
28
28
  Read content from a URL.
29
29
  """
@@ -31,9 +31,16 @@ def read_url(url, timeout=0.1):
31
31
  response = requests.get(url, timeout=timeout)
32
32
  response.raise_for_status() # Raise an error for bad responses
33
33
  if url.endswith('.gz'):
34
- return gzip.decompress(response.content).decode("utf-8")
34
+ out = gzip.decompress(response.content)
35
+ if binary:
36
+ return out
37
+ else:
38
+ return out.decode("utf-8")
35
39
  else:
36
- return response.text
40
+ if binary:
41
+ return response.content
42
+ else:
43
+ return response.text
37
44
  except requests.exceptions.RequestException as e:
38
45
  raise RuntimeError(f"Failed to read from URL {url}: {e}")
39
46