xtrack 0.98.14__tar.gz → 0.99.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. {xtrack-0.98.14/xtrack.egg-info → xtrack-0.99.1}/PKG-INFO +1 -1
  2. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_coupling_edwards_teng.py +4 -2
  3. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_monitor.py +125 -0
  4. xtrack-0.99.1/tests/test_rdt_first_order_perturb.py +416 -0
  5. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/__init__.py +1 -0
  6. xtrack-0.99.1/xtrack/_version.py +1 -0
  7. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/environment.py +27 -12
  8. xtrack-0.99.1/xtrack/feed_down.py +124 -0
  9. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/line.py +11 -0
  10. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/linear_normal_form.py +3 -3
  11. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/match.py +3 -0
  12. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/__init__.py +1 -0
  13. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/beam_position_monitor.py +1 -0
  14. xtrack-0.99.1/xtrack/monitors/multi_element_monitor.h +62 -0
  15. xtrack-0.99.1/xtrack/monitors/multi_element_monitor.py +68 -0
  16. xtrack-0.99.1/xtrack/rdt.py +304 -0
  17. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/tracker.py +106 -13
  18. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/twiss.py +14 -3
  19. {xtrack-0.98.14 → xtrack-0.99.1/xtrack.egg-info}/PKG-INFO +1 -1
  20. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack.egg-info/SOURCES.txt +5 -0
  21. xtrack-0.98.14/xtrack/_version.py +0 -1
  22. {xtrack-0.98.14 → xtrack-0.99.1}/LICENSE +0 -0
  23. {xtrack-0.98.14 → xtrack-0.99.1}/MANIFEST.in +0 -0
  24. {xtrack-0.98.14 → xtrack-0.99.1}/README.md +0 -0
  25. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/__init__.py +0 -0
  26. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/base_classes.py +0 -0
  27. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/BB6D.py +0 -0
  28. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  29. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/__init__.py +0 -0
  30. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/beambeam.py +0 -0
  31. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/boost.py +0 -0
  32. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  33. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  34. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/qgauss.py +0 -0
  35. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/slicing.py +0 -0
  36. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
  37. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/elements.py +0 -0
  38. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/line.py +0 -0
  39. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/mathlibs.py +0 -0
  40. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/particles.py +0 -0
  41. {xtrack-0.98.14 → xtrack-0.99.1}/ducktrack/temp_pyparticles.py +0 -0
  42. {xtrack-0.98.14 → xtrack-0.99.1}/pyproject.toml +0 -0
  43. {xtrack-0.98.14 → xtrack-0.99.1}/setup.cfg +0 -0
  44. {xtrack-0.98.14 → xtrack-0.99.1}/setup.py +0 -0
  45. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_acceleration.py +0 -0
  46. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_acdipole.py +0 -0
  47. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_acdipole_twiss.py +0 -0
  48. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_amplitude_detuning.py +0 -0
  49. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_aperture_polygon.py +0 -0
  50. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_aperture_table.py +0 -0
  51. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  52. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_apertures.py +0 -0
  53. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_attr_replicas_and_slices.py +0 -0
  54. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_boris_spatial.py +0 -0
  55. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_bucket_with_ref_energy_change.py +0 -0
  56. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_cavity_absolute_time.py +0 -0
  57. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_cavity_harmonic.py +0 -0
  58. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
  59. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_coasting.py +0 -0
  60. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_collective_tracker.py +0 -0
  61. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_collimation.py +0 -0
  62. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_electron_cooler.py +0 -0
  63. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_element_characterization_functions.py +0 -0
  64. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_element_internal_record.py +0 -0
  65. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_elements.py +0 -0
  66. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_elements_classflags.py +0 -0
  67. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_elements_thick.py +0 -0
  68. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_environment.py +0 -0
  69. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  70. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  71. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_footprint.py +0 -0
  72. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_freeze_longitudinal.py +0 -0
  73. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_full_rings.py +0 -0
  74. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_h6_sps_beamline.py +0 -0
  75. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_hvkick.py +0 -0
  76. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_ions.py +0 -0
  77. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_json.py +0 -0
  78. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_lhc_env.py +0 -0
  79. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_lhc_match_phase_15.py +0 -0
  80. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_line.py +0 -0
  81. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_load.py +0 -0
  82. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_load_vars.py +0 -0
  83. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_lumi.py +0 -0
  84. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_mad_writer.py +0 -0
  85. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_madloader.py +0 -0
  86. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_madnginterface.py +0 -0
  87. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_magnet.py +0 -0
  88. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_match_and_track_from_element.py +0 -0
  89. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_match_coupling_knob.py +0 -0
  90. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_match_nested.py +0 -0
  91. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_match_optics_and_ip_knob.py +0 -0
  92. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  93. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_match_orbit_bump.py +0 -0
  94. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_match_tune_chroma_cminus.py +0 -0
  95. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_misalign.py +0 -0
  96. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_multi_bunch_gauss.py +0 -0
  97. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_multiline.py +0 -0
  98. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_multisetter.py +0 -0
  99. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_multispecies.py +0 -0
  100. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_native_madloader.py +0 -0
  101. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_native_madloader_lhc.py +0 -0
  102. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_native_madloader_lhc_thin.py +0 -0
  103. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_native_madloader_ps.py +0 -0
  104. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_native_madloader_sps.py +0 -0
  105. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_native_madloader_ti2.py +0 -0
  106. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_optimize_for_tracking.py +0 -0
  107. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_particles.py +0 -0
  108. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_particles_basics.py +0 -0
  109. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_particles_pdg.py +0 -0
  110. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_pipeline.py +0 -0
  111. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_prebuild_kernels.py +0 -0
  112. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_ps_against_ptc.py +0 -0
  113. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_ps_multiturn_twiss.py +0 -0
  114. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_psb_chicane.py +0 -0
  115. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_pyht_interface.py +0 -0
  116. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_quadrupole_fringe_ptc.py +0 -0
  117. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_quadrupole_wedge.py +0 -0
  118. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_radial_steering.py +0 -0
  119. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_radiation.py +0 -0
  120. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
  121. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  122. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_radiation_integrals.py +0 -0
  123. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_random_gen.py +0 -0
  124. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_random_gen_exp.py +0 -0
  125. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_random_gen_gauss.py +0 -0
  126. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_random_gen_ruth.py +0 -0
  127. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_rbend_straight_body.py +0 -0
  128. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_rf_track.py +0 -0
  129. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_rotation_signs.py +0 -0
  130. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_second_order_taylor_map.py +0 -0
  131. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_seeds.py +0 -0
  132. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
  133. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_slice_elements.py +0 -0
  134. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_slicing.py +0 -0
  135. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  136. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  137. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_spacecharge_in_ring.py +0 -0
  138. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_spin.py +0 -0
  139. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_sps_thick_cpymad_loader.py +0 -0
  140. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_sps_thick_native_loader.py +0 -0
  141. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_survey.py +0 -0
  142. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_tapering.py +0 -0
  143. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_thick_kickers_rf_crab.py +0 -0
  144. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_thick_lhc.py +0 -0
  145. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_tilt_shifts.py +0 -0
  146. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_tracker.py +0 -0
  147. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_trajectory_correcton.py +0 -0
  148. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_twiss.py +0 -0
  149. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_twiss_to_file.py +0 -0
  150. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_twiss_vs_madx_psb.py +0 -0
  151. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_vs_madx.py +0 -0
  152. {xtrack-0.98.14 → xtrack-0.99.1}/tests/test_xmask_orbit_correction.py +0 -0
  153. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/__init__.py +0 -0
  154. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  155. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  156. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  157. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
  158. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  159. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  160. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  161. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/python_lattice_writer/__init__.py +0 -0
  162. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/_temp/python_lattice_writer/lattice_py_generation.py +0 -0
  163. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/aperture_meas.py +0 -0
  164. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/base_element.py +0 -0
  165. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/__init__.py +0 -0
  166. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/acdipole.py +0 -0
  167. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/apertures.py +0 -0
  168. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  169. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  170. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  171. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  172. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  173. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  174. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/beam_interaction.py +0 -0
  175. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements.py +0 -0
  176. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/_generate_slice_elements_c_code.py +0 -0
  177. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/_include_integrator.py +0 -0
  178. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/acdipole.h +0 -0
  179. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
  180. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  181. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/crab_cavity.h +0 -0
  182. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
  183. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  184. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  185. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift.h +0 -0
  186. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
  187. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
  188. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  189. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  190. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
  191. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
  192. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
  193. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  194. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  195. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  196. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  197. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
  198. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  199. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
  200. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  201. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  202. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
  203. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  204. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  205. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  206. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  207. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  208. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/marker.h +0 -0
  209. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/misalignment.h +0 -0
  210. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  211. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  212. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  213. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  214. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  215. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/rbend.h +0 -0
  216. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  217. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  218. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  219. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  220. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  221. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  222. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/slnd.h +0 -0
  223. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  224. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  225. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +0 -0
  226. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +0 -0
  227. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
  228. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  229. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  230. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
  231. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  232. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
  233. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  234. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  235. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  236. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +0 -0
  237. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +0 -0
  238. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
  239. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  240. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  241. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  242. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  243. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  244. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  245. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
  246. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  247. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  248. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  249. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  250. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  251. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
  252. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
  253. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_acdipole.h +0 -0
  254. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  255. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  256. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  257. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  258. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
  259. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  260. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
  261. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_magnet.h +0 -0
  262. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_magnet.template.h +0 -0
  263. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
  264. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  265. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  266. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  267. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
  268. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_misalignments.h +0 -0
  269. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  270. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_rf.h +0 -0
  271. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_rf.template.h +0 -0
  272. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  273. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  274. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  275. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  276. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  277. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
  278. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  279. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
  280. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  281. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
  282. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  283. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  284. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  285. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  286. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/exciter.py +0 -0
  287. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/rft_element.py +0 -0
  288. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/slice_base.py +0 -0
  289. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/slice_elements_drift.py +0 -0
  290. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/slice_elements_edge.py +0 -0
  291. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  292. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/beam_elements/slice_elements_thin.py +0 -0
  293. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/boris.py +0 -0
  294. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/builder.py +0 -0
  295. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/footprint.py +0 -0
  296. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/functions.py +0 -0
  297. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/general.py +0 -0
  298. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/headers/atomicadd.h +0 -0
  299. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/headers/checks.h +0 -0
  300. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/headers/constants.h +0 -0
  301. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/headers/particle_states.h +0 -0
  302. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/headers/synrad_spectrum.h +0 -0
  303. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/headers/track.h +0 -0
  304. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/headers/track_local_particle_with_transformations.h +0 -0
  305. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/internal_record.py +0 -0
  306. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/json.py +0 -0
  307. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/load.py +0 -0
  308. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/loss_location_refinement/__init__.py +0 -0
  309. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  310. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/lumi.py +0 -0
  311. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/mad_loader.py +0 -0
  312. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/mad_parser/__init__.py +0 -0
  313. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/mad_parser/loader.py +0 -0
  314. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/mad_parser/madx.lark +0 -0
  315. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/mad_parser/parse.py +0 -0
  316. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/mad_writer.py +0 -0
  317. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/madng_interface.py +0 -0
  318. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/beam_position_monitor.h +0 -0
  319. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
  320. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
  321. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/beam_size_monitor.h +0 -0
  322. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/beam_size_monitor.py +0 -0
  323. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/last_turns_monitor.h +0 -0
  324. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/last_turns_monitor.py +0 -0
  325. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/particles_monitor.h +0 -0
  326. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/monitors/particles_monitor.py +0 -0
  327. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/multiline.py +0 -0
  328. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/multiline_legacy/__init__.py +0 -0
  329. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  330. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  331. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/multisetter/__init__.py +0 -0
  332. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/multisetter/multisetter.h +0 -0
  333. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/multisetter/multisetter.py +0 -0
  334. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/particles/__init__.py +0 -0
  335. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/particles/constants.py +0 -0
  336. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/particles/local_particle_custom_api.h +0 -0
  337. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/particles/masses.py +0 -0
  338. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/particles/particles.py +0 -0
  339. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/particles/pdg.py +0 -0
  340. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/particles/rng_src/base_rng.h +0 -0
  341. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
  342. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/pipeline/__init__.py +0 -0
  343. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/pipeline/core.py +0 -0
  344. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/pipeline/manager.py +0 -0
  345. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/pipeline/multitracker.py +0 -0
  346. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/prebuilt_kernel_definitions/__init__.py +0 -0
  347. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/prebuilt_kernel_definitions/element_inits.py +0 -0
  348. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/prebuilt_kernel_definitions/element_types.py +0 -0
  349. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/progress_indicator.py +0 -0
  350. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/random/__init__.py +0 -0
  351. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/random/random_generators.py +0 -0
  352. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/random/random_src/exponential.h +0 -0
  353. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  354. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/random/random_src/normal.h +0 -0
  355. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/random/random_src/rutherford.h +0 -0
  356. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/random/random_src/uniform.h +0 -0
  357. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
  358. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/slicing.py +0 -0
  359. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/survey.py +0 -0
  360. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/svgutils/__init__.py +0 -0
  361. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/svgutils/parser.py +0 -0
  362. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/svgutils/path.py +0 -0
  363. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/svgutils/svgutils.py +0 -0
  364. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/synctime.py +0 -0
  365. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/table.py +0 -0
  366. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/tapering.py +0 -0
  367. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/targets.py +0 -0
  368. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/track_flags.py +0 -0
  369. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/tracker_data.py +0 -0
  370. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/tracker_src/tracker.h +0 -0
  371. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/trajectory_correction.py +0 -0
  372. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/twissplot.py +0 -0
  373. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack/view.py +0 -0
  374. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack.egg-info/dependency_links.txt +0 -0
  375. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack.egg-info/entry_points.txt +0 -0
  376. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack.egg-info/requires.txt +0 -0
  377. {xtrack-0.98.14 → xtrack-0.99.1}/xtrack.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xtrack
3
- Version: 0.98.14
3
+ Version: 0.99.1
4
4
  Summary: Tracking library for particle accelerators
5
5
  Author: G. Iadarola et al.
6
6
  License-Expression: Apache-2.0
@@ -81,10 +81,12 @@ def test_coupling_edwards_teng():
81
81
  xo.assert_allclose(tw.bety_edw_teng, bety_mad_at_s, atol=0, rtol=1e-6)
82
82
  xo.assert_allclose(tw.alfy_edw_teng, alfy_mad_at_s, atol=1e-4, rtol=1e-6)
83
83
 
84
- xo.assert_allclose(tw.f1001, rdt_mad_at_s['f1001'], rtol=1e-3,
84
+ # Note different convention:
85
+ xo.assert_allclose(tw.f1001, -np.conj(rdt_mad_at_s['f1001']), rtol=1e-3,
85
86
  atol=5e-4 * np.max(np.abs(rdt_mad_at_s['f1001'])))
86
- xo.assert_allclose(tw.f1010, rdt_mad_at_s['f1010'], rtol=1e-3,
87
+ xo.assert_allclose(tw.f1010, -np.conj(rdt_mad_at_s['f1010']), rtol=1e-3,
87
88
  atol=5e-3 * np.max(np.abs(rdt_mad_at_s['f1010'])))
89
+ xo.assert_allclose(tw.f0110, np.conj(tw.f1001), rtol=0, atol=1e-12)
88
90
 
89
91
 
90
92
 
@@ -492,3 +492,128 @@ def test_beam_position_monitor(test_context):
492
492
  expected_x_centroid[18:20] = np.nan
493
493
  assert_allclose(monitor.x_cen, expected_x_centroid, err_msg="Monitor x centroid does not match expected values")
494
494
  assert_allclose(monitor.y_cen, -expected_x_centroid, err_msg="Monitor y centroid does not match expected values")
495
+
496
+ @pytest.mark.parametrize("with_progress_bar", [False, True])
497
+ def test_multi_element_monitor(with_progress_bar):
498
+
499
+ line = xt.load(test_data_folder / 'hllhc15_thick/lhc_thick_with_knobs.json')
500
+
501
+ # Get names of all BPMs in the line
502
+ tt = line.get_table()
503
+ tt_obs = tt.rows.match(name='bpm.*')
504
+ tt_obs.name # is ['bpmw.4r7.b1', 'bpmwe.4r7.b1', 'bpmw.5r7.b1', ...,
505
+
506
+ # Generate some particle
507
+ p0 = xt.Particles(p0c=7e12, x=1e-6*np.arange(20),
508
+ y=2e-6*np.arange(20),
509
+ delta=1e-5*np.arange(20)
510
+ )
511
+
512
+ # Track particles for 10 turns, monitoring at all BPMs
513
+ num_turns = 10
514
+ p = p0.copy()
515
+ line.track(p, num_turns=num_turns, multi_element_monitor_at=tt_obs.name,
516
+ with_progress=(1 if with_progress_bar else None))
517
+
518
+ # Get the recorded data
519
+ mon = line.record_multi_element_last_track
520
+
521
+ line_with_monitors = line.copy(shallow=True)
522
+
523
+ nn_check_1 = 'bpm.17r3.b1'
524
+ nn_check_2 = 'bpm.23l5.b1'
525
+
526
+ mon_1 = xt.ParticlesMonitor(
527
+ start_at_turn=0,
528
+ stop_at_turn=num_turns,
529
+ num_particles=len(p0.x))
530
+ mon_2 = xt.ParticlesMonitor(
531
+ start_at_turn=0,
532
+ stop_at_turn=num_turns,
533
+ num_particles=len(p0.x))
534
+
535
+ line_with_monitors.insert('mon_1', mon_1, at=nn_check_1+'@start')
536
+ line_with_monitors.insert('mon_2', mon_2, at=nn_check_2+'@start')
537
+ p_ref = p0.copy()
538
+ line_with_monitors.track(p_ref, num_turns=num_turns)
539
+ xo.assert_allclose(mon.get('x', obs_name=nn_check_1), mon_1.x.T, atol=1e-14)
540
+ xo.assert_allclose(mon.get('px', obs_name=nn_check_1), mon_1.px.T, atol=1e-14)
541
+ xo.assert_allclose(mon.get('y', obs_name=nn_check_1), mon_1.y.T, atol=1e-14)
542
+ xo.assert_allclose(mon.get('py', obs_name=nn_check_1), mon_1.py.T, atol=1e-14)
543
+ xo.assert_allclose(mon.get('zeta', obs_name=nn_check_1), mon_1.zeta.T, atol=1e-14)
544
+ xo.assert_allclose(mon.get('delta', obs_name=nn_check_1), mon_1.delta.T, atol=1e-14)
545
+
546
+ xo.assert_allclose(mon.get('x', obs_name=nn_check_2), mon_2.x.T, atol=1e-14)
547
+ xo.assert_allclose(mon.get('px', obs_name=nn_check_2), mon_2.px.T, atol=1e-14)
548
+ xo.assert_allclose(mon.get('y', obs_name=nn_check_2), mon_2.y.T, atol=1e-14)
549
+ xo.assert_allclose(mon.get('py', obs_name=nn_check_2), mon_2.py.T, atol=1e-14)
550
+ xo.assert_allclose(mon.get('zeta', obs_name=nn_check_2), mon_2.zeta.T, atol=1e-14)
551
+ xo.assert_allclose(mon.get('delta', obs_name=nn_check_2), mon_2.delta.T, atol=1e-14)
552
+
553
+ # Access all data for a given coordinate
554
+ assert mon.data.shape == (num_turns, len(p0.x), 6, len(tt_obs))
555
+ xo.assert_allclose(mon.get('x'), mon.data[:,:,0,:], atol=1e-14)
556
+ xo.assert_allclose(mon.get('px'), mon.data[:,:,1,:], atol=1e-14)
557
+ xo.assert_allclose(mon.get('y'), mon.data[:,:,2,:], atol=1e-14)
558
+ xo.assert_allclose(mon.get('py'), mon.data[:,:,3,:], atol=1e-14)
559
+ xo.assert_allclose(mon.get('zeta'), mon.data[:,:,4,:], atol=1e-14)
560
+ xo.assert_allclose(mon.get('delta'), mon.data[:,:,5,:], atol=1e-14)
561
+
562
+ idx = tt_obs.rows.indices['bpm.17r3.b1'][0]
563
+
564
+ # # Access data for a given coordinate and observation point
565
+ # mon.get('x', obs_name='bpmw.4r7.b1') # shape ddddis (nom_turns, n_particles)
566
+ xo.assert_allclose(mon.get('x', obs_name=nn_check_1), mon.data[:,:,0,idx], atol=1e-14)
567
+ xo.assert_allclose(mon.get('px', obs_name=nn_check_1), mon.data[:,:,1,idx], atol=1e-14)
568
+ xo.assert_allclose(mon.get('y', obs_name=nn_check_1), mon.data[:,:,2,idx], atol=1e-14)
569
+ xo.assert_allclose(mon.get('py', obs_name=nn_check_1), mon.data[:,:,3,idx], atol=1e-14)
570
+ xo.assert_allclose(mon.get('delta', obs_name=nn_check_1), mon.data[:,:,5,idx], atol=1e-14)
571
+
572
+
573
+ # # Access data for a given coordinate, observation point and particle_id
574
+ # mon.get('x', obs_name='bpmw.4r7.b1', particle_id=10) # shape is (nom_turns,)
575
+ particle_id = 10
576
+ xo.assert_allclose(mon.get('x', obs_name=nn_check_1, particle_id=particle_id),
577
+ mon.data[:,particle_id - mon.part_id_start,0,idx], atol=1e-14)
578
+ xo.assert_allclose(mon.get('px', obs_name=nn_check_1, particle_id=particle_id),
579
+ mon.data[:,particle_id - mon.part_id_start,1,idx], atol=1e-14)
580
+ xo.assert_allclose(mon.get('y', obs_name=nn_check_1, particle_id=particle_id),
581
+ mon.data[:,particle_id - mon.part_id_start,2,idx], atol=1e-14)
582
+ xo.assert_allclose(mon.get('py', obs_name=nn_check_1, particle_id=particle_id),
583
+ mon.data[:,particle_id - mon.part_id_start,3,idx], atol=1e-14)
584
+ xo.assert_allclose(mon.get('zeta', obs_name=nn_check_1, particle_id=particle_id),
585
+ mon.data[:,particle_id - mon.part_id_start,4,idx], atol=1e-14)
586
+ xo.assert_allclose(mon.get('delta', obs_name=nn_check_1, particle_id=particle_id),
587
+ mon.data[:,particle_id - mon.part_id_start,5,idx], atol=1e-14)
588
+
589
+ # # Access data for a given coordinate, observation point, particle_id and turn
590
+ # mon.get('x', obs_name='bpmw.4r7.b1', particle_id=10, turn=5) # is a scalar
591
+ turn = 5
592
+ xo.assert_allclose(mon.get('x', obs_name=nn_check_1, particle_id=particle_id, turn=turn),
593
+ mon.data[turn,particle_id - mon.part_id_start,0,idx], atol=1e-14)
594
+ xo.assert_allclose(mon.get('px', obs_name=nn_check_1, particle_id=particle_id, turn=turn),
595
+ mon.data[turn,particle_id - mon.part_id_start,1,idx], atol=1e-14)
596
+ xo.assert_allclose(mon.get('y', obs_name=nn_check_1, particle_id=particle_id, turn=turn),
597
+ mon.data[turn,particle_id - mon.part_id_start,2,idx], atol=1e-14)
598
+ xo.assert_allclose(mon.get('py', obs_name=nn_check_1, particle_id=particle_id, turn=turn),
599
+ mon.data[turn,particle_id - mon.part_id_start,3,idx], atol=1e-14)
600
+ xo.assert_allclose(mon.get('zeta', obs_name=nn_check_1, particle_id=particle_id, turn=turn),
601
+ mon.data[turn,particle_id - mon.part_id_start,4,idx], atol=1e-14)
602
+ xo.assert_allclose(mon.get('delta', obs_name=nn_check_1, particle_id=particle_id, turn=turn),
603
+ mon.data[turn,particle_id - mon.part_id_start,5,idx], atol=1e-14)
604
+
605
+ # # Get all BPMs for a given particles and turn
606
+ # mon.get('x', particle_id=10, turn=5) # shape is (n_obs_points,)
607
+ xo.assert_allclose(mon.get('x', particle_id=particle_id, turn=turn),
608
+ mon.data[turn,particle_id - mon.part_id_start,0,:], atol=1e-14)
609
+ xo.assert_allclose(mon.get('px', particle_id=particle_id, turn=turn),
610
+ mon.data[turn,particle_id - mon.part_id_start,1,:], atol=1e-14)
611
+ xo.assert_allclose(mon.get('y', particle_id=particle_id, turn=turn),
612
+ mon.data[turn,particle_id - mon.part_id_start,2,:], atol=1e-14)
613
+ xo.assert_allclose(mon.get('py', particle_id=particle_id, turn=turn),
614
+ mon.data[turn,particle_id - mon.part_id_start,3,:], atol=1e-14)
615
+ xo.assert_allclose(mon.get('zeta', particle_id=particle_id, turn=turn),
616
+ mon.data[turn,particle_id - mon.part_id_start,4,:], atol=1e-14)
617
+ xo.assert_allclose(mon.get('delta', particle_id=particle_id, turn=turn),
618
+ mon.data[turn,particle_id - mon.part_id_start,5,:], atol=1e-14)
619
+
@@ -0,0 +1,416 @@
1
+ import xtrack as xt
2
+ import xtrack.feed_down as fd
3
+ from xtrack.rdt import tracking_from_rdt
4
+ import numpy as np
5
+ import xobjects as xo
6
+ import pytest
7
+ import pathlib
8
+
9
+ test_data_folder = pathlib.Path(
10
+ __file__).parent.joinpath('../test_data').absolute()
11
+
12
+ def test_feed_down_rotation_dipole():
13
+ kn = np.array([1, 0])
14
+ ks = np.array([0, 0])
15
+ psi = np.pi / 2 # 90 degrees tilt
16
+
17
+ kn_eff, kskew_eff = fd.feed_down(
18
+ kn=kn[None, :],
19
+ kskew=ks[None, :],
20
+ shift_x=0.,
21
+ shift_y=0.,
22
+ psi=psi,
23
+ x0=0.,
24
+ y0=0.,
25
+ max_output_order=None,
26
+ )
27
+
28
+ assert kn_eff.shape == (1, 2)
29
+ assert kskew_eff.shape == (1, 2)
30
+
31
+ xo.assert_allclose(kn_eff, np.array([[0, 0]]), atol=1e-15)
32
+ xo.assert_allclose(kskew_eff, np.array([[-1, 0]]), atol=1e-15)
33
+
34
+ m = xt.Multipole(knl=kn, ksl=ks, rot_s_rad=psi)
35
+ m_fdown = xt.Multipole(knl=kn_eff[0, :], ksl=kskew_eff[0, :], rot_s_rad=0.0)
36
+
37
+ p = xt.Particles()
38
+ p_fdown = p.copy()
39
+ m.track(p)
40
+ m_fdown.track(p_fdown)
41
+
42
+ xo.assert_allclose(p.px, p_fdown.px, atol=1e-15)
43
+ xo.assert_allclose(p.py, p_fdown.py, atol=1e-15)
44
+
45
+ def test_feed_down_rotation_quadrupole():
46
+ kn = np.array([0, 1])
47
+ ks = np.array([0, 0])
48
+ psi = np.pi / 4 # 45 degrees tilt
49
+
50
+ kn_eff, kskew_eff = fd.feed_down(
51
+ kn=kn[None, :],
52
+ kskew=ks[None, :],
53
+ shift_x=0.,
54
+ shift_y=0.,
55
+ psi=psi,
56
+ x0=0.,
57
+ y0=0.,
58
+ max_output_order=None,
59
+ )
60
+
61
+ m = xt.Multipole(knl=kn, ksl=ks, rot_s_rad=psi)
62
+ m_fdown = xt.Multipole(knl=kn_eff[0, :], ksl=kskew_eff[0, :], rot_s_rad=0.0)
63
+
64
+ p = xt.Particles()
65
+ p_fdown = p.copy()
66
+ m.track(p)
67
+ m_fdown.track(p_fdown)
68
+
69
+ xo.assert_allclose(p.px, p_fdown.px, atol=1e-15)
70
+ xo.assert_allclose(p.py, p_fdown.py, atol=1e-15)
71
+
72
+
73
+ def test_feed_down_rotation_higher_order():
74
+ kn = np.array([0, 1, 2, 10])
75
+ ks = np.array([0, 3, 2, 20])
76
+ psi = np.pi / 4 # 45 degrees tilt
77
+ shift_x = 0.001
78
+ shift_y = -0.002
79
+
80
+ kn_eff, kskew_eff = fd.feed_down(
81
+ kn=kn[None, :],
82
+ kskew=ks[None, :],
83
+ shift_x=shift_x,
84
+ shift_y=shift_y,
85
+ psi=psi,
86
+ x0=0.,
87
+ y0=0.,
88
+ max_output_order=None,
89
+ )
90
+
91
+ m = xt.Multipole(knl=kn, ksl=ks, rot_s_rad=psi, shift_x=shift_x, shift_y=shift_y)
92
+ m_fdown = xt.Multipole(knl=kn_eff[0, :], ksl=kskew_eff[0, :])
93
+
94
+ p = xt.Particles(x=4e-3, y=5e-3)
95
+ p_fdown = p.copy()
96
+ m.track(p)
97
+ m_fdown.track(p_fdown)
98
+
99
+ xo.assert_allclose(p.px, p_fdown.px, atol=1e-15)
100
+ xo.assert_allclose(p.py, p_fdown.py, atol=1e-15)
101
+
102
+ PIMMS_RTD_CONFIGURATIONS = [
103
+ 'sextupole',
104
+ 'skew_sextupole',
105
+ 'skew_quadrupole',
106
+ 'tilted_quadrupole',
107
+ 'shifted_octupole_x',
108
+ 'shifted_octupole_y',
109
+ 'orbit_in_octupole_x',
110
+ 'orbit_in_octupole_y',
111
+ 'orbit_in_skew_octupole_x',
112
+ 'orbit_in_skew_octupole_y',
113
+ ]
114
+
115
+ @pytest.mark.parametrize("configuration", PIMMS_RTD_CONFIGURATIONS)
116
+ def test_rdt_first_order_perturbation_against_tracking(configuration):
117
+
118
+ env = xt.load(test_data_folder / 'pimms/PIMM.seq')
119
+ line = env.pimms
120
+ line.set_particle_ref('proton', kinetic_energy0=100e6)
121
+ line.replace_all_repeated_elements()
122
+
123
+ line.env.new('skew_quad', xt.Quadrupole, length=0.2)
124
+ line.env.new('octup', xt.Octupole, length=0.2)
125
+
126
+ line.insert('skew_quad', anchor='start', at='xrra@end')
127
+ line.insert('octup', anchor='start', at='skew_quad@end')
128
+
129
+ env['qf1k1'] = 3.15396e-01
130
+ env['qd1k1'] = -5.24626e-01
131
+ env['qf2k1'] = 5.22717e-01
132
+
133
+ # Build knobs to control the orbit in the straight section with the non-linear
134
+ # elements
135
+ line.vars.default_to_zero = True
136
+ env['qd.3'].knl[0] = 'kx1'
137
+ env['qf1.3'].knl[0] = 'kx2'
138
+ env['qf1.4'].knl[0] = 'kx3'
139
+ env['qd.4'].knl[0] = 'kx4'
140
+ env['qd.3'].ksl[0] = 'ky1'
141
+ env['qf1.3'].ksl[0] = 'ky2'
142
+ env['qf1.4'].ksl[0] = 'ky3'
143
+ env['qd.4'].ksl[0] = 'ky4'
144
+ line.vars.default_to_zero = False
145
+
146
+ opt = line.match_knob(
147
+ method='4d',
148
+ betx=1, bety=1,
149
+ knob_name='x_bump_mm',
150
+ vary=xt.VaryList(['kx1', 'kx2', 'kx3', 'kx4'], step=1e-6),
151
+ targets=[
152
+ xt.TargetSet(x=1e-3, px=0, at='skew_quad'),
153
+ xt.TargetSet(x=0.0, px=0, at='qd.5')
154
+ ],
155
+ run=False)
156
+ opt.solve()
157
+ opt.generate_knob()
158
+
159
+ opt = line.match_knob(
160
+ method='4d',
161
+ betx=1, bety=1,
162
+ knob_name='y_bump_mm',
163
+ vary=xt.VaryList(['ky1', 'ky2', 'ky3', 'ky4'], step=1e-6),
164
+ targets=[
165
+ xt.TargetSet(y=-1e-3, py=0, at='skew_quad'),
166
+ xt.TargetSet(y=0.0, py=0, at='qd.5')
167
+ ],
168
+ run=False)
169
+ opt.solve()
170
+ opt.generate_knob()
171
+
172
+ tw0 = line.twiss4d()
173
+
174
+ rtols = {}
175
+ if configuration == 'sextupole':
176
+ env['xrra'].k2 = 0.8
177
+ rdts = ['f3000', 'f1200', 'f1020', 'f0111',
178
+ # 'f0120' # this one in quite bad
179
+ ]
180
+ elif configuration == 'skew_sextupole':
181
+ env['xrrb'].k2s = 0.8
182
+ rdts = ['f0030', 'f0012', 'f2010', 'f0210', 'f1110']
183
+ elif configuration == 'skew_quadrupole':
184
+ env['skew_quad'].k1s = 0.02
185
+ rdts = ['f1001', 'f1010', 'f0110']
186
+ elif configuration == 'tilted_quadrupole':
187
+ env['qd.4'].rot_s_rad = 0.002
188
+ rdts = ['f1001', 'f1010', 'f0110']
189
+ elif configuration == 'shifted_octupole_x':
190
+ env['octup'].k3 = 80.
191
+ env['octup'].shift_x = 0.005
192
+ rdts = ['f3000', 'f1200', 'f1020', 'f0111',
193
+ # 'f0120' # this one in quite bad
194
+ ]
195
+ rtols = {'f3000': 0.5, 'f1200': 0.2, 'f0111': 0.2}
196
+ elif configuration == 'shifted_octupole_y':
197
+ env['octup'].k3 = 80.
198
+ env['octup'].shift_y = -0.005
199
+ rdts = ['f0030', 'f0012', 'f2010', 'f0210', 'f1110']
200
+ elif configuration == 'orbit_in_octupole_x':
201
+ env['octup'].k3 = 80.
202
+ line['x_bump_mm'] = -5.0 # mm
203
+ rdts = ['f3000', 'f1200', 'f1020', 'f0111',
204
+ # 'f0120' # this one in quite bad
205
+ ]
206
+ rtols = {'f1200': 0.2, 'f0111': 0.2}
207
+ elif configuration == 'orbit_in_octupole_y':
208
+ env['octup'].k3 = 80.
209
+ line['y_bump_mm'] = 5.0 # mm
210
+ rdts = ['f0030', 'f0012', 'f2010', 'f0210', 'f1110']
211
+ elif configuration == 'orbit_in_skew_octupole_x':
212
+ env['octup'].k3s = 80.
213
+ line['x_bump_mm'] = 5.0 # mm
214
+ rdts = ['f0030', 'f0012', 'f2010', 'f0210', 'f1110']
215
+ elif configuration == 'orbit_in_skew_octupole_y':
216
+ env['octup'].k3s = 80.
217
+ line['y_bump_mm'] = -5.0 # mm
218
+ rdts = ['f3000', 'f1200', 'f1020', 'f0111',
219
+ # 'f0120' # this one in quite bad
220
+ ]
221
+ rtols = {'f1200': 0.2, 'f0111': 0.2}
222
+ else:
223
+ raise ValueError(f'Unknown configuration {configuration}')
224
+
225
+
226
+ tw1 = line.twiss4d()
227
+
228
+ # Compute strengths
229
+ strengths = line.get_table(attr=True)
230
+
231
+ # Generate 20 particles on the x axis
232
+ # particles = line.build_particles(x=3e-3, px=5e-4, y=0, py=0, zeta=0, delta=0)
233
+ particles = line.build_particles(x=3e-3, px=5e-4, y=2e-3, py=3e-5, zeta=0, delta=0)
234
+
235
+ # Inspect the particles
236
+ particles.get_table()
237
+
238
+ # Track 1000 turns logging turn-by-turn data
239
+ num_turns = 20_000
240
+ line.track(particles, num_turns=num_turns, turn_by_turn_monitor=True,
241
+ with_progress=100)
242
+ rec = line.record_last_track
243
+
244
+ nc = tw0.get_normalized_coordinates(rec)
245
+
246
+ # Compute RDTs via first-order perturbation theory
247
+ rdt_vals = xt.rdt_first_order_perturbation(rdt=rdts, twiss=tw0,
248
+ orbit=tw1,
249
+ strengths=strengths)
250
+
251
+ i_part_analyze = 0
252
+ x_norm = nc.x_norm[i_part_analyze, :]
253
+ px_norm = nc.px_norm[i_part_analyze, :]
254
+ y_norm = nc.y_norm[i_part_analyze, :]
255
+ py_norm = nc.py_norm[i_part_analyze, :]
256
+
257
+ zx_norm = x_norm - 1j * px_norm
258
+ zy_norm = y_norm - 1j * py_norm
259
+ # tracking from RDTs
260
+ Ix = 0.5 * (zx_norm[0].real**2 + zx_norm[0].imag**2)
261
+ Iy = 0.5 * (zy_norm[0].real**2 + zy_norm[0].imag**2)
262
+ psi_x0 = np.angle(zx_norm[0].real + 1j * zx_norm[0].imag)
263
+ psi_y0 = np.angle(zy_norm[0].real + 1j * zy_norm[0].imag)
264
+
265
+ def initial_conditions(Ix, Iy, psi_x0, psi_y0):
266
+
267
+ hx_minus, hy_minus = tracking_from_rdt(
268
+ rdts={rr: (rdt_vals[rr][0]) for rr in rdts},
269
+ Ix=Ix,
270
+ Iy=Iy,
271
+ Qx=tw0.qx,
272
+ Qy=tw0.qy,
273
+ psi_x0=psi_x0,
274
+ psi_y0=psi_y0,
275
+ num_turns=1
276
+ )
277
+
278
+ return np.array([hx_minus[0].real,
279
+ hx_minus[0].imag,
280
+ hy_minus[0].real,
281
+ hy_minus[0].imag])
282
+
283
+ opt = xt.match.opt_from_callable(
284
+ lambda xx: initial_conditions(xx[0], xx[1], xx[2], xx[3]),
285
+ x0=np.array([Ix, Iy, psi_x0, psi_y0]),
286
+ steps=np.array([Ix*1e-4, Ix*1e-4, 1e-4, 1e-4]),
287
+ tar=np.array([zx_norm[0].real, zx_norm[0].imag,
288
+ zy_norm[0].real, zy_norm[0].imag]),
289
+ tols=[1e-10, 1e-10, 1e-10, 1e-10],
290
+ )
291
+ opt.step()
292
+ res = opt.get_knob_values()
293
+ Ix = res[0]
294
+ Iy = res[1]
295
+ psi_x0 = res[2]
296
+ psi_y0 = res[3]
297
+
298
+
299
+ hx_minus, hy_minus = tracking_from_rdt(
300
+ rdts={rr: (rdt_vals[rr][0]) for rr in rdts},
301
+ Ix=Ix,
302
+ Iy=Iy,
303
+ Qx=tw0.qx,
304
+ Qy=tw0.qy,
305
+ psi_x0=psi_x0,
306
+ psi_y0=psi_y0,
307
+ num_turns=num_turns
308
+ )
309
+
310
+ zx_spectrum = np.fft.fft(zx_norm)
311
+ zy_spectrum = np.fft.fft(zy_norm)
312
+
313
+ hx_spectrum = np.fft.fft(hx_minus)
314
+ hy_spectrum = np.fft.fft(hy_minus)
315
+
316
+ freqs = np.fft.fftfreq(num_turns)
317
+ freqs[freqs < 0] += 1.0
318
+
319
+ import nafflib
320
+ f_hx, s_hx = nafflib.get_tunes_all(hx_minus, N=100)
321
+ f_hy, s_hy = nafflib.get_tunes_all(hy_minus, N=100)
322
+ f_x, s_x = nafflib.get_tunes_all(zx_norm, N=100)
323
+ f_y, s_y = nafflib.get_tunes_all(zy_norm, N=100)
324
+
325
+ f_x[f_x < 0] += 1.0
326
+ f_hx[f_hx < 0] += 1.0
327
+ f_y[f_y < 0] += 1.0
328
+ f_hy[f_hy < 0] += 1.0
329
+
330
+ f_h = {'x': f_hx, 'y': f_hy}
331
+ s_h = {'x': s_hx, 'y': s_hy}
332
+ f_z = {'x': f_x, 'y': f_y}
333
+ s_z = {'x': s_x, 'y': s_y}
334
+
335
+ dq_search = 0.001
336
+ print()
337
+ for rr in rdts:
338
+ print(f'Spectral lines excited by {rr}:')
339
+ for pp in ['x', 'y']:
340
+ if rdt_vals[rr + f'_ampl_{pp}_expr'] == '0':
341
+ print(f' Expected {pp} freq: not excited')
342
+ elif rdt_vals[rr + f"_freq_{pp}"] == 0:
343
+ print(f' Expected {pp} freq: zero frequency')
344
+ else:
345
+ print(f' Expected {pp} freq: {rdt_vals[rr + f"_freq_{pp}_expr"]} = {rdt_vals[rr + f"_freq_{pp}"]:.6f}')
346
+ mask_search_z = (np.abs(f_z[pp] - rdt_vals[rr + f'_freq_{pp}']) < dq_search)
347
+ i_max_z = np.argmax(np.abs(s_z[pp][mask_search_z]))
348
+ f_z_max = f_z[pp][mask_search_z][i_max_z]
349
+ s_z_max = s_z[pp][mask_search_z][i_max_z]
350
+ mask_search_h = (np.abs(f_h[pp] - rdt_vals[rr + f'_freq_{pp}']) < dq_search)
351
+ i_max_h = np.argmax(np.abs(s_h[pp][mask_search_h]))
352
+ f_h_max = f_h[pp][mask_search_h][i_max_h]
353
+ s_h_max = s_h[pp][mask_search_h][i_max_h]
354
+ print(f' From tracking: freq={f_z_max:.6f}, amp={np.abs(s_z_max):.6e}, phase={np.angle(s_z_max, deg=True):.2f} deg')
355
+ print(f' From RDTs: freq={f_h_max:.6f}, amp={np.abs(s_h_max):.6e}, phase={np.angle(s_h_max, deg=True):.2f} deg')
356
+ xo.assert_allclose(f_z_max, f_h_max, atol=5e-4)
357
+ xo.assert_allclose(s_z_max, s_h_max, rtol=rtols.get(rr, 0.1))
358
+ print('')
359
+
360
+ def test_rdt_lhc_vs_madng():
361
+
362
+ env = xt.load(test_data_folder / 'hllhc15_thick/hllhc15_collider_thick.json')
363
+
364
+ line = env.lhcb1
365
+ tw0 = line.twiss(method='4d')
366
+
367
+ # Coupling RDTs
368
+ line['kqs.a45b1'] = 1e-4 # Introduce a skew quadrupole
369
+ rdts = xt.rdt_first_order_perturbation(
370
+ rdt=['f1001', 'f1010', 'f0110'],
371
+ twiss=tw0,
372
+ strengths=line.get_table(attr=True)
373
+ )
374
+ tw_edw_teng = line.twiss4d(coupling_edw_teng=True)
375
+ line['kqs.a45b1'] = 0.0 # Remove skew quadrupole
376
+
377
+ # outliers came from the fact that at the sources the RDT jumps at entry
378
+ # instead of exit of the element or viceversa
379
+ xo.assert_allclose(rdts.f1001, tw_edw_teng.f1001, atol=0.07*np.max(np.abs(tw_edw_teng.f1001)), max_outliers=5)
380
+ xo.assert_allclose(rdts.f1010, tw_edw_teng.f1010, atol=0.07*np.max(np.abs(tw_edw_teng.f1010)), max_outliers=5)
381
+ xo.assert_allclose(rdts.f0110, tw_edw_teng.f0110, atol=0.07*np.max(np.abs(tw_edw_teng.f0110)), max_outliers=5)
382
+ xo.assert_allclose(rdts.f1001, np.conj(rdts.f0110), atol=1e-12)
383
+
384
+ # RDTs from chromaticity sextupoles
385
+ rdt_names = ['f3000', 'f1200', 'f1020', 'f0120', 'f0111']
386
+ rdts = xt.rdt_first_order_perturbation(
387
+ rdt=rdt_names,
388
+ twiss=tw0,
389
+ strengths=line.get_table(attr=True)
390
+ )
391
+ tw_ng = line.madng_twiss(rdts=rdt_names)
392
+ for nn in rdt_names:
393
+ # outliers came from the fact that at the sources the RDT jumps at entry
394
+ # instead of exit of the element or viceversa
395
+ xo.assert_allclose(rdts[nn], tw_ng[nn],
396
+ atol=0.1*np.max(np.abs(tw_ng[nn])),
397
+ max_outliers=0.01*len(tw_ng))
398
+
399
+ line['on_x1'] = 0
400
+ line['on_x5'] = 250
401
+ line['on_disp'] = 2
402
+ tw1 = line.twiss(method='4d', coupling_edw_teng=True)
403
+ rdt_names = ['f1001', 'f1010', 'f0110']
404
+ rdts = xt.rdt_first_order_perturbation(
405
+ rdt=rdt_names,
406
+ twiss=tw0,
407
+ orbit=tw1,
408
+ strengths=line.get_table(attr=True)
409
+ )
410
+ for nn in rdt_names:
411
+ # outliers came from the fact that at the sources the RDT jumps at entry
412
+ # instead of exit of the element or viceversa
413
+ xo.assert_allclose(rdts[nn], tw1[nn],
414
+ atol=0.06*np.max(np.abs(tw1[nn])),
415
+ max_outliers=0.005*len(tw1))
416
+
@@ -22,6 +22,7 @@ from .match import (Vary, Target, TargetList, VaryList, TargetInequality, Action
22
22
  from .targets import (TargetLuminosity, TargetSeparationOrthogonalToCrossing,
23
23
  TargetSeparation)
24
24
  from .twiss import TwissInit, TwissTable
25
+ from .rdt import rdt_first_order_perturbation
25
26
  from .loss_location_refinement import LossLocationRefinement
26
27
  from .internal_record import (RecordIdentifier, RecordIndex, new_io_buffer,
27
28
  start_internal_logging, stop_internal_logging)
@@ -0,0 +1 @@
1
+ __version__ = '0.99.1'