xtrack 0.98.6__tar.gz → 0.98.8__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 (373) hide show
  1. {xtrack-0.98.6/xtrack.egg-info → xtrack-0.98.8}/PKG-INFO +1 -1
  2. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_cavity_absolute_time.py +1 -0
  3. xtrack-0.98.8/tests/test_cavity_harmonic.py +282 -0
  4. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_madloader.py +1 -2
  5. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_native_madloader.py +3 -3
  6. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_tapering.py +13 -0
  7. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_twiss.py +21 -19
  8. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_twiss_vs_madx_psb.py +0 -1
  9. xtrack-0.98.8/xtrack/_version.py +1 -0
  10. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/base_element.py +4 -5
  11. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements.py +43 -0
  12. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/cavity.h +1 -0
  13. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/crab_cavity.h +1 -0
  14. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/rfmultipole.h +2 -1
  15. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +1 -0
  16. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +1 -0
  17. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +1 -0
  18. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +1 -0
  19. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_rf.h +13 -2
  20. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_rf.template.h +13 -2
  21. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/slice_elements_thin.py +1 -1
  22. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/builder.py +6 -4
  23. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/environment.py +3 -13
  24. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/line.py +10 -5
  25. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/mad_loader.py +6 -7
  26. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/mad_parser/loader.py +11 -9
  27. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/mad_writer.py +1 -0
  28. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/particles/particles.py +1 -0
  29. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/tapering.py +8 -2
  30. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/tracker.py +1 -0
  31. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/twiss.py +182 -108
  32. {xtrack-0.98.6 → xtrack-0.98.8/xtrack.egg-info}/PKG-INFO +1 -1
  33. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack.egg-info/SOURCES.txt +1 -1
  34. xtrack-0.98.6/xtrack/_version.py +0 -1
  35. xtrack-0.98.6/xtrack/beam_elements/elements_src/temprf.h +0 -43
  36. {xtrack-0.98.6 → xtrack-0.98.8}/LICENSE +0 -0
  37. {xtrack-0.98.6 → xtrack-0.98.8}/MANIFEST.in +0 -0
  38. {xtrack-0.98.6 → xtrack-0.98.8}/README.md +0 -0
  39. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/__init__.py +0 -0
  40. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/base_classes.py +0 -0
  41. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/BB6D.py +0 -0
  42. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  43. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/__init__.py +0 -0
  44. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/beambeam.py +0 -0
  45. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/boost.py +0 -0
  46. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  47. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  48. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/qgauss.py +0 -0
  49. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/slicing.py +0 -0
  50. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/be_beamfields/spacecharge.py +0 -0
  51. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/elements.py +0 -0
  52. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/line.py +0 -0
  53. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/mathlibs.py +0 -0
  54. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/particles.py +0 -0
  55. {xtrack-0.98.6 → xtrack-0.98.8}/ducktrack/temp_pyparticles.py +0 -0
  56. {xtrack-0.98.6 → xtrack-0.98.8}/pyproject.toml +0 -0
  57. {xtrack-0.98.6 → xtrack-0.98.8}/setup.cfg +0 -0
  58. {xtrack-0.98.6 → xtrack-0.98.8}/setup.py +0 -0
  59. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_acceleration.py +0 -0
  60. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_acdipole.py +0 -0
  61. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_acdipole_twiss.py +0 -0
  62. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_amplitude_detuning.py +0 -0
  63. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_aperture_polygon.py +0 -0
  64. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_aperture_table.py +0 -0
  65. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  66. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_apertures.py +0 -0
  67. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_attr_replicas_and_slices.py +0 -0
  68. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_boris_spatial.py +0 -0
  69. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_bucket_with_ref_energy_change.py +0 -0
  70. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_chromatic_functions_vs_madx.py +0 -0
  71. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_coasting.py +0 -0
  72. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_collective_tracker.py +0 -0
  73. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_collimation.py +0 -0
  74. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_coupling_edwards_teng.py +0 -0
  75. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_electron_cooler.py +0 -0
  76. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_element_characterization_functions.py +0 -0
  77. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_element_internal_record.py +0 -0
  78. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_elements.py +0 -0
  79. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_elements_classflags.py +0 -0
  80. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_elements_thick.py +0 -0
  81. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_environment.py +0 -0
  82. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  83. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  84. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_footprint.py +0 -0
  85. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_freeze_longitudinal.py +0 -0
  86. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_full_rings.py +0 -0
  87. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_h6_sps_beamline.py +0 -0
  88. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_hvkick.py +0 -0
  89. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_ions.py +0 -0
  90. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_json.py +0 -0
  91. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_lhc_env.py +0 -0
  92. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_lhc_match_phase_15.py +0 -0
  93. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_line.py +0 -0
  94. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_load.py +0 -0
  95. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_load_vars.py +0 -0
  96. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_lumi.py +0 -0
  97. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_mad_writer.py +0 -0
  98. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_madnginterface.py +0 -0
  99. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_magnet.py +0 -0
  100. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_match_and_track_from_element.py +0 -0
  101. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_match_coupling_knob.py +0 -0
  102. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_match_nested.py +0 -0
  103. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_match_optics_and_ip_knob.py +0 -0
  104. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  105. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_match_orbit_bump.py +0 -0
  106. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_match_tune_chroma_cminus.py +0 -0
  107. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_misalign.py +0 -0
  108. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_monitor.py +0 -0
  109. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_multi_bunch_gauss.py +0 -0
  110. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_multiline.py +0 -0
  111. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_multisetter.py +0 -0
  112. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_multispecies.py +0 -0
  113. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_native_madloader_lhc.py +0 -0
  114. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_native_madloader_lhc_thin.py +0 -0
  115. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_native_madloader_ps.py +0 -0
  116. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_native_madloader_sps.py +0 -0
  117. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_native_madloader_ti2.py +0 -0
  118. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_optimize_for_tracking.py +0 -0
  119. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_particles.py +0 -0
  120. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_particles_basics.py +0 -0
  121. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_particles_pdg.py +0 -0
  122. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_pipeline.py +0 -0
  123. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_prebuild_kernels.py +0 -0
  124. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_ps_against_ptc.py +0 -0
  125. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_ps_multiturn_twiss.py +0 -0
  126. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_psb_chicane.py +0 -0
  127. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_pyht_interface.py +0 -0
  128. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_quadrupole_fringe_ptc.py +0 -0
  129. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_quadrupole_wedge.py +0 -0
  130. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_radial_steering.py +0 -0
  131. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_radiation.py +0 -0
  132. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_radiation_equilibrium_emittances.py +0 -0
  133. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  134. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_radiation_integrals.py +0 -0
  135. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_random_gen.py +0 -0
  136. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_random_gen_exp.py +0 -0
  137. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_random_gen_gauss.py +0 -0
  138. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_random_gen_ruth.py +0 -0
  139. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_rbend_straight_body.py +0 -0
  140. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_rf_track.py +0 -0
  141. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_rotation_signs.py +0 -0
  142. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_second_order_taylor_map.py +0 -0
  143. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_seeds.py +0 -0
  144. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_slice_and_insert_with_replicas.py +0 -0
  145. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_slice_elements.py +0 -0
  146. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_slicing.py +0 -0
  147. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  148. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  149. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_spacecharge_in_ring.py +0 -0
  150. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_spin.py +0 -0
  151. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_sps_thick_cpymad_loader.py +0 -0
  152. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_sps_thick_native_loader.py +0 -0
  153. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_survey.py +0 -0
  154. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_thick_kickers_rf_crab.py +0 -0
  155. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_thick_lhc.py +0 -0
  156. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_tilt_shifts.py +0 -0
  157. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_tracker.py +0 -0
  158. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_trajectory_correcton.py +0 -0
  159. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_twiss_to_file.py +0 -0
  160. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_vs_madx.py +0 -0
  161. {xtrack-0.98.6 → xtrack-0.98.8}/tests/test_xmask_orbit_correction.py +0 -0
  162. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/__init__.py +0 -0
  163. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/__init__.py +0 -0
  164. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  165. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  166. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  167. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/lhc_match/__init__.py +0 -0
  168. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  169. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  170. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  171. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/python_lattice_writer/__init__.py +0 -0
  172. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/_temp/python_lattice_writer/lattice_py_generation.py +0 -0
  173. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/aperture_meas.py +0 -0
  174. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/__init__.py +0 -0
  175. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/acdipole.py +0 -0
  176. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/apertures.py +0 -0
  177. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  178. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  179. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  180. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  181. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  182. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  183. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/beam_interaction.py +0 -0
  184. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/_generate_slice_elements_c_code.py +0 -0
  185. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/_include_integrator.py +0 -0
  186. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/acdipole.h +0 -0
  187. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/bend.h +0 -0
  188. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
  189. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  190. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  191. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift.h +0 -0
  192. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
  193. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
  194. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  195. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  196. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
  197. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
  198. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
  199. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  200. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  201. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  202. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  203. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
  204. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  205. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/elens.h +0 -0
  206. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  207. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  208. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
  209. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  210. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  211. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  212. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  213. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  214. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/marker.h +0 -0
  215. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/misalignment.h +0 -0
  216. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  217. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  218. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  219. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  220. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  221. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/rbend.h +0 -0
  222. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  223. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  224. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  225. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  226. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  227. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/slnd.h +0 -0
  228. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  229. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  230. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
  231. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  232. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  233. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
  234. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  235. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
  236. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  237. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  238. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  239. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
  240. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  241. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  242. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  243. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  244. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  245. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  246. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
  247. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  248. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  249. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  250. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  251. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  252. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
  253. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
  254. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_acdipole.h +0 -0
  255. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  256. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  257. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  258. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  259. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
  260. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  261. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
  262. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_magnet.h +0 -0
  263. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_magnet.template.h +0 -0
  264. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
  265. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  266. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  267. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  268. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
  269. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_misalignments.h +0 -0
  270. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  271. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  272. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  273. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  274. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  275. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  276. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
  277. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  278. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
  279. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  280. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/wire.h +0 -0
  281. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  282. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  283. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  284. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  285. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/exciter.py +0 -0
  286. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/rft_element.py +0 -0
  287. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/slice_base.py +0 -0
  288. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/slice_elements_drift.py +0 -0
  289. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/slice_elements_edge.py +0 -0
  290. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  291. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/boris.py +0 -0
  292. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/footprint.py +0 -0
  293. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/functions.py +0 -0
  294. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/general.py +0 -0
  295. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/headers/atomicadd.h +0 -0
  296. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/headers/checks.h +0 -0
  297. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/headers/constants.h +0 -0
  298. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/headers/particle_states.h +0 -0
  299. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/headers/synrad_spectrum.h +0 -0
  300. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/headers/track.h +0 -0
  301. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/headers/track_local_particle_with_transformations.h +0 -0
  302. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/internal_record.py +0 -0
  303. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/json.py +0 -0
  304. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/linear_normal_form.py +0 -0
  305. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/load.py +0 -0
  306. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/loss_location_refinement/__init__.py +0 -0
  307. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  308. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/lumi.py +0 -0
  309. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/mad_parser/__init__.py +0 -0
  310. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/mad_parser/madx.lark +0 -0
  311. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/mad_parser/parse.py +0 -0
  312. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/madng_interface.py +0 -0
  313. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/match.py +0 -0
  314. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/__init__.py +0 -0
  315. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/beam_position_monitor.h +0 -0
  316. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/beam_position_monitor.py +0 -0
  317. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/beam_profile_monitor.h +0 -0
  318. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/beam_profile_monitor.py +0 -0
  319. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/beam_size_monitor.h +0 -0
  320. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/beam_size_monitor.py +0 -0
  321. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/last_turns_monitor.h +0 -0
  322. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/last_turns_monitor.py +0 -0
  323. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/particles_monitor.h +0 -0
  324. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/monitors/particles_monitor.py +0 -0
  325. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/multiline.py +0 -0
  326. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/multiline_legacy/__init__.py +0 -0
  327. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  328. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  329. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/multisetter/__init__.py +0 -0
  330. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/multisetter/multisetter.h +0 -0
  331. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/multisetter/multisetter.py +0 -0
  332. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/particles/__init__.py +0 -0
  333. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/particles/constants.py +0 -0
  334. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/particles/local_particle_custom_api.h +0 -0
  335. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/particles/masses.py +0 -0
  336. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/particles/pdg.py +0 -0
  337. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/particles/rng_src/base_rng.h +0 -0
  338. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/particles/rng_src/particles_rng.h +0 -0
  339. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/pipeline/__init__.py +0 -0
  340. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/pipeline/core.py +0 -0
  341. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/pipeline/manager.py +0 -0
  342. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/pipeline/multitracker.py +0 -0
  343. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/prebuilt_kernel_definitions/__init__.py +0 -0
  344. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/prebuilt_kernel_definitions/element_inits.py +0 -0
  345. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/prebuilt_kernel_definitions/element_types.py +0 -0
  346. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/progress_indicator.py +0 -0
  347. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/random/__init__.py +0 -0
  348. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/random/random_generators.py +0 -0
  349. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/random/random_src/exponential.h +0 -0
  350. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  351. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/random/random_src/normal.h +0 -0
  352. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/random/random_src/rutherford.h +0 -0
  353. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/random/random_src/uniform.h +0 -0
  354. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/random/random_src/uniform_accurate.h +0 -0
  355. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/slicing.py +0 -0
  356. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/survey.py +0 -0
  357. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/svgutils/__init__.py +0 -0
  358. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/svgutils/parser.py +0 -0
  359. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/svgutils/path.py +0 -0
  360. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/svgutils/svgutils.py +0 -0
  361. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/synctime.py +0 -0
  362. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/table.py +0 -0
  363. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/targets.py +0 -0
  364. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/track_flags.py +0 -0
  365. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/tracker_data.py +0 -0
  366. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/tracker_src/tracker.h +0 -0
  367. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/trajectory_correction.py +0 -0
  368. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/twissplot.py +0 -0
  369. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack/view.py +0 -0
  370. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack.egg-info/dependency_links.txt +0 -0
  371. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack.egg-info/entry_points.txt +0 -0
  372. {xtrack-0.98.6 → xtrack-0.98.8}/xtrack.egg-info/requires.txt +0 -0
  373. {xtrack-0.98.6 → xtrack-0.98.8}/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.6
3
+ Version: 0.98.8
4
4
  Summary: Tracking library for particle accelerators
5
5
  Author: G. Iadarola et al.
6
6
  License-Expression: Apache-2.0
@@ -35,6 +35,7 @@ def test_cavity_absolute_time(test_context):
35
35
  tt = line.get_table()
36
36
  for nn in tt.rows[tt.element_type=='Cavity'].name:
37
37
  line[nn].absolute_time = 1 # Need property
38
+ line[nn].harmonic = 0
38
39
  line[nn].frequency = line.vars['f_rf']
39
40
 
40
41
  tw1 = line.twiss(search_for_t_rev=True)
@@ -0,0 +1,282 @@
1
+ import xtrack as xt
2
+ import xpart as xp
3
+ import xobjects as xo
4
+ import numpy as np
5
+ import pathlib
6
+ from cpymad.madx import Madx
7
+
8
+ test_data_folder = pathlib.Path(
9
+ __file__).parent.joinpath('../test_data').absolute()
10
+
11
+ def test_cavity_harmonic():
12
+
13
+ # Fix numpy random seed for reproducibility
14
+ np.random.seed(42)
15
+
16
+ line = xt.load(test_data_folder /
17
+ 'hllhc15_thick/lhc_thick_with_knobs.json')
18
+
19
+ tt_harm = line.get_table(attr=True)
20
+ tt_harm_cav = tt_harm.rows.match(element_type='Cavity')
21
+
22
+ for nn in tt_harm_cav.name:
23
+ assert line[nn].frequency == 0
24
+ assert line[nn].harmonic == 35640
25
+
26
+ line['vrf400'] = 16
27
+ tw_harm = line.twiss6d()
28
+
29
+ pp_harm = xp.generate_matched_gaussian_bunch(line=line,
30
+ num_particles=100_000,
31
+ nemitt_x=2e-6,
32
+ nemitt_y=2.5e-6,
33
+ sigma_z=0.08)
34
+
35
+ # Switch to frequency mode
36
+ for nn in tt_harm_cav.name:
37
+ line[nn].harmonic = 0
38
+ line[nn].frequency=400.79e6
39
+
40
+ tt_freq = line.get_table(attr=True)
41
+ tt_freq_cav = tt_freq.rows.match(element_type='Cavity')
42
+
43
+ pp_freq = xp.generate_matched_gaussian_bunch(line=line,
44
+ num_particles=100_000,
45
+ nemitt_x=2e-6,
46
+ nemitt_y=2.5e-6,
47
+ sigma_z=0.08)
48
+
49
+ tt_freq = line.get_table(attr=True)
50
+ tt_freq_cav = tt_freq.rows.match(element_type='Cavity')
51
+ tw_freq = line.twiss6d()
52
+
53
+ xo.assert_allclose(tw_harm.qs, tw_freq.qs, rtol=0, atol=1e-7)
54
+ xo.assert_allclose(pp_harm.zeta.std(), pp_freq.zeta.std(), rtol=0.01)
55
+ xo.assert_allclose(pp_harm.delta.std(), pp_freq.delta.std(), rtol=0.01)
56
+
57
+ xo.assert_allclose(tt_harm_cav.frequency, 0, rtol=1e-15)
58
+ xo.assert_allclose(tt_freq_cav.frequency, 400.79e6, rtol=1e-15)
59
+ xo.assert_allclose(tt_harm_cav.harmonic, 35640, rtol=1e-15)
60
+ xo.assert_allclose(tt_freq_cav.harmonic, 0, rtol=1e-15)
61
+
62
+
63
+ # Getting a mix of the two modes
64
+ for nn in tt_harm_cav.name:
65
+ line[nn].frequency = 0
66
+ line[nn].harmonic = 0
67
+
68
+ line['acsca.d5l4.b1'].harmonic = 35640
69
+ line['acsca.c5l4.b1'].frequency = 400.79e6
70
+ line['acsca.b5l4.b1'].harmonic = 35640
71
+ line['acsca.a5l4.b1'].frequency = 400.79e6
72
+ line['acsca.a5r4.b1'].harmonic = 35640
73
+ line['acsca.b5r4.b1'].frequency = 400.79e6
74
+ line['acsca.c5r4.b1'].harmonic = 35640
75
+ line['acsca.d5r4.b1'].frequency = 400.79e6
76
+
77
+ mad_src = line.to_madx_sequence('seq')
78
+
79
+ env2 = xt.load(string=mad_src, format='madx')
80
+ line2 = env2['seq']
81
+
82
+ tt3 = line2.get_table(attr=True)
83
+ tt3_cav = tt3.rows.match(element_type='Cavity')
84
+ xo.assert_allclose(tt3_cav.frequency, [0, 400.79e6, 0, 400.79e6, 0, 400.79e6, 0, 400.79e6], rtol=1e-15)
85
+ xo.assert_allclose(tt3_cav.harmonic, [35640, 0, 35640, 0, 35640, 0, 35640, 0], rtol=1e-15)
86
+
87
+ line2.set_particle_ref('proton', p0c=7e12)
88
+ tw3 = line2.twiss6d()
89
+ xo.assert_allclose(tw_harm.qs, tw3.qs, rtol=0, atol=1e-7)
90
+
91
+ line_slice_thick = line.copy()
92
+ line_slice_thick.slice_thick_elements([
93
+ xt.Strategy(slicing=None),
94
+ xt.Strategy(slicing=xt.Uniform(3, mode='thick'), name='acsca.*'),
95
+ ])
96
+
97
+ tt_sliced = line_slice_thick.get_table(attr=True)
98
+ tt_sliced_cav = tt_sliced.rows.match(element_type='ThickSliceCav.*')
99
+
100
+ assert np.all(tt_sliced_cav.name == np.array([
101
+ 'acsca.d5l4.b1..0', 'acsca.d5l4.b1..1', 'acsca.d5l4.b1..2',
102
+ 'acsca.c5l4.b1..0', 'acsca.c5l4.b1..1', 'acsca.c5l4.b1..2',
103
+ 'acsca.b5l4.b1..0', 'acsca.b5l4.b1..1', 'acsca.b5l4.b1..2',
104
+ 'acsca.a5l4.b1..0', 'acsca.a5l4.b1..1', 'acsca.a5l4.b1..2',
105
+ 'acsca.a5r4.b1..0', 'acsca.a5r4.b1..1', 'acsca.a5r4.b1..2',
106
+ 'acsca.b5r4.b1..0', 'acsca.b5r4.b1..1', 'acsca.b5r4.b1..2',
107
+ 'acsca.c5r4.b1..0', 'acsca.c5r4.b1..1', 'acsca.c5r4.b1..2',
108
+ 'acsca.d5r4.b1..0', 'acsca.d5r4.b1..1', 'acsca.d5r4.b1..2']))
109
+
110
+ xo.assert_allclose(tt_sliced_cav.frequency,
111
+ [0, 0, 0, 400.79e6, 400.79e6, 400.79e6,
112
+ 0, 0, 0, 400.79e6, 400.79e6, 400.79e6,
113
+ 0, 0, 0, 400.79e6, 400.79e6, 400.79e6,
114
+ 0, 0, 0, 400.79e6, 400.79e6, 400.79e6], rtol=1e-15)
115
+ xo.assert_allclose(tt_sliced_cav.harmonic,
116
+ [35640, 35640, 35640, 0, 0, 0,
117
+ 35640, 35640, 35640, 0, 0, 0,
118
+ 35640, 35640, 35640, 0, 0, 0,
119
+ 35640, 35640, 35640, 0, 0, 0], rtol=1e-15)
120
+ xo.assert_allclose(tt_sliced_cav.voltage, 16 / 8 / 3 * 1e6, rtol=1e-3)
121
+
122
+ tw_slice_thick = line_slice_thick.twiss6d()
123
+ xo.assert_allclose(tw_harm.qs, tw_slice_thick.qs, rtol=0, atol=1e-7)
124
+
125
+ line_slice_thin = line.copy()
126
+ line_slice_thin.slice_thick_elements([
127
+ xt.Strategy(slicing=None),
128
+ xt.Strategy(slicing=xt.Uniform(2, mode='thin'), name='acsca.*'),
129
+ ])
130
+
131
+ tt_sliced_thin = line_slice_thin.get_table(attr=True)
132
+ tt_sliced_thin_cav = tt_sliced_thin.rows.match(element_type='.*SliceCav.*')
133
+
134
+ assert np.all(tt_sliced_thin_cav.name == np.array(['drift_acsca.d5l4.b1..0', 'acsca.d5l4.b1..0',
135
+ 'drift_acsca.d5l4.b1..1', 'acsca.d5l4.b1..1',
136
+ 'drift_acsca.d5l4.b1..2', 'drift_acsca.c5l4.b1..0',
137
+ 'acsca.c5l4.b1..0', 'drift_acsca.c5l4.b1..1', 'acsca.c5l4.b1..1',
138
+ 'drift_acsca.c5l4.b1..2', 'drift_acsca.b5l4.b1..0',
139
+ 'acsca.b5l4.b1..0', 'drift_acsca.b5l4.b1..1', 'acsca.b5l4.b1..1',
140
+ 'drift_acsca.b5l4.b1..2', 'drift_acsca.a5l4.b1..0',
141
+ 'acsca.a5l4.b1..0', 'drift_acsca.a5l4.b1..1', 'acsca.a5l4.b1..1',
142
+ 'drift_acsca.a5l4.b1..2', 'drift_acsca.a5r4.b1..0',
143
+ 'acsca.a5r4.b1..0', 'drift_acsca.a5r4.b1..1', 'acsca.a5r4.b1..1',
144
+ 'drift_acsca.a5r4.b1..2', 'drift_acsca.b5r4.b1..0',
145
+ 'acsca.b5r4.b1..0', 'drift_acsca.b5r4.b1..1', 'acsca.b5r4.b1..1',
146
+ 'drift_acsca.b5r4.b1..2', 'drift_acsca.c5r4.b1..0',
147
+ 'acsca.c5r4.b1..0', 'drift_acsca.c5r4.b1..1', 'acsca.c5r4.b1..1',
148
+ 'drift_acsca.c5r4.b1..2', 'drift_acsca.d5r4.b1..0',
149
+ 'acsca.d5r4.b1..0', 'drift_acsca.d5r4.b1..1', 'acsca.d5r4.b1..1',
150
+ 'drift_acsca.d5r4.b1..2']))
151
+ xo.assert_allclose(tt_sliced_thin_cav.frequency,
152
+ [0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
153
+ 0.0000e+00, 4.0079e+08, 0.0000e+00, 4.0079e+08, 0.0000e+00,
154
+ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
155
+ 0.0000e+00, 4.0079e+08, 0.0000e+00, 4.0079e+08, 0.0000e+00,
156
+ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
157
+ 0.0000e+00, 4.0079e+08, 0.0000e+00, 4.0079e+08, 0.0000e+00,
158
+ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,
159
+ 0.0000e+00, 4.0079e+08, 0.0000e+00, 4.0079e+08, 0.0000e+00], rtol=1e-15)
160
+
161
+ xo.assert_allclose(tt_sliced_thin_cav.harmonic,
162
+ [ 0., 35640., 0., 35640., 0., 0., 0., 0.,
163
+ 0., 0., 0., 35640., 0., 35640., 0., 0.,
164
+ 0., 0., 0., 0., 0., 35640., 0., 35640.,
165
+ 0., 0., 0., 0., 0., 0., 0., 35640.,
166
+ 0., 35640., 0., 0., 0., 0., 0., 0.], rtol=1e-15)
167
+
168
+ xo.assert_allclose(tt_sliced_thin_cav.voltage,
169
+ [ 0., 1000000., 0., 1000000., 0., 0.,
170
+ 1000000., 0., 1000000., 0., 0., 1000000.,
171
+ 0., 1000000., 0., 0., 1000000., 0.,
172
+ 1000000., 0., 0., 1000000., 0., 1000000.,
173
+ 0., 0., 1000000., 0., 1000000., 0.,
174
+ 0., 1000000., 0., 1000000., 0., 0.,
175
+ 1000000., 0., 1000000., 0.], rtol=1e-15)
176
+
177
+ def test_cavity_harmonic_loader_native():
178
+
179
+ env = xt.load([test_data_folder / 'lhc_2024/lhc.seq',
180
+ test_data_folder / 'lhc_2024/injection_optics.madx'],
181
+ reverse_lines=['lhcb2'])
182
+ env.lhcb1.set_particle_ref('proton', p0c=450e9)
183
+ env.lhcb2.set_particle_ref('proton', p0c=450e9)
184
+
185
+ tt1 = env.lhcb1.get_table(attr=True)
186
+ tt2 = env.lhcb2.get_table(attr=True)
187
+
188
+ tt1_cav = tt1.rows.match(element_type='Cavity')
189
+ tt2_cav = tt2.rows.match(element_type='Cavity')
190
+
191
+ assert len(tt1_cav) == 8
192
+ assert len(tt2_cav) == 8
193
+ xo.assert_allclose(tt1_cav.frequency, 0)
194
+ xo.assert_allclose(tt2_cav.frequency, 0)
195
+ xo.assert_allclose(tt1_cav.harmonic, 35640)
196
+ xo.assert_allclose(tt2_cav.harmonic, 35640)
197
+
198
+ env['vrf400'] = 8
199
+ env['lagrf400.b1'] = 0.5
200
+
201
+ tw_harm = env.lhcb1.twiss6d()
202
+
203
+ for nn in tt1_cav.name:
204
+ env[nn].harmonic = 0
205
+ env[nn].frequency = 400.79e6
206
+
207
+ tw_freq = env.lhcb1.twiss6d()
208
+
209
+ xo.assert_allclose(tw_freq.qs, tw_harm.qs, rtol=0, atol=1e-7)
210
+
211
+ def test_cavity_harmonic_loader_cpymad():
212
+
213
+ mad = Madx()
214
+ mad.call(str(test_data_folder / 'lhc_2024/lhc.seq'))
215
+ mad.call(str(test_data_folder / 'lhc_2024/injection_optics.madx'))
216
+ mad.beam()
217
+ mad.use('lhcb1')
218
+
219
+ line = xt.Line.from_madx_sequence(mad.sequence.lhcb1,
220
+ deferred_expressions=True)
221
+
222
+ line.set_particle_ref('proton', p0c=450e9)
223
+
224
+ tt1 = line.get_table(attr=True)
225
+ tt1_cav = tt1.rows.match(element_type='Cavity')
226
+
227
+ assert len(tt1_cav) == 8
228
+ xo.assert_allclose(tt1_cav.frequency, 0)
229
+ xo.assert_allclose(tt1_cav.harmonic, 35640)
230
+
231
+ line['vrf400'] = 8
232
+ line['lagrf400.b1'] = 0.5
233
+
234
+ tw_harm = line.twiss6d()
235
+
236
+ for nn in tt1_cav.name:
237
+ line[nn].harmonic = 0
238
+ line[nn].frequency = 400.79e6
239
+
240
+ tw_freq = line.twiss6d()
241
+
242
+ xo.assert_allclose(tw_freq.qs, tw_harm.qs, rtol=0, atol=1e-7)
243
+
244
+ def test_cavity_harmonic_more_loader_checks():
245
+ from cpymad.madx import Madx
246
+ import xtrack as xt
247
+ import xobjects as xo
248
+
249
+ madx_src = """
250
+ hh = 5;
251
+ ff = 100;
252
+ cav_harm: rfcavity, harmon:=hh;
253
+ cav_freq: rfcavity, freq:=ff;
254
+
255
+ seq: sequence, l=10;
256
+ cav_harm, at=5;
257
+ cav_freq, at=7;
258
+ endsequence;
259
+
260
+ """
261
+
262
+ mad = Madx()
263
+ mad.input(madx_src)
264
+ mad.input('''
265
+ beam;
266
+ use, sequence=seq;
267
+ ''')
268
+
269
+ lcpymad = xt.Line.from_madx_sequence(mad.sequence.seq,
270
+ deferred_expressions=True)
271
+
272
+ env_native = xt.load(string=madx_src, format='madx')
273
+ lnative = env_native['seq']
274
+
275
+ for ll in [lcpymad, lnative]:
276
+ assert str(ll.ref['cav_harm'].harmonic._expr) == "vars['hh']"
277
+ assert ll.ref['cav_harm'].frequency._expr is None
278
+ assert ll.ref['cav_harm'].frequency._value == 0
279
+
280
+ assert str(ll.ref['cav_freq'].frequency._expr) == "(vars['ff'] * 1000000.0)"
281
+ assert ll.ref['cav_freq'].harmonic._expr is None
282
+ assert ll.ref['cav_freq'].harmonic._value == 0
@@ -602,8 +602,7 @@ def test_mad_elements_import():
602
602
 
603
603
  assert isinstance(line['c1'], xt.Cavity)
604
604
  assert line.get_s_position('c1') == 0.2
605
- xo.assert_allclose(line['c1'].frequency, clight * line.particle_ref.beta0 / 10. * 8,
606
- rtol=0, atol=1e-7)
605
+ xo.assert_allclose(line['c1'].harmonic, 8, rtol=0, atol=1e-12)
607
606
  assert line['c1'].lag == 180
608
607
  assert line['c1'].voltage == 6e6
609
608
 
@@ -164,7 +164,7 @@ def example_sequence(temp_context_default_mod):
164
164
  se: sextupole, L=1, K2=2, K2S=3, TILT=2; ! ignore ktap
165
165
  oc: octupole, L=2, K3=3, K3S=2, TILT=2;
166
166
  ma: marker;
167
- rf: rfcavity, L=2, VOLT=1, LAG=2, FREQ=3, HARMON=2, NO_CAVITY_TOTALPATH; ! ignore N_BESSEL
167
+ rf: rfcavity, L=2, VOLT=1, LAG=2, FREQ=3, NO_CAVITY_TOTALPATH; ! ignore N_BESSEL
168
168
  mu: multipole, LRAD=1, TILT=2, KNL={3, 4, 5, 6}, KSL={1, 2, 3, 4};
169
169
  so: solenoid, l=2, ks=3; ! ignore ksi
170
170
 
@@ -450,7 +450,7 @@ def test_marker(example_sequence):
450
450
 
451
451
  def test_rfcavity(example_sequence):
452
452
  env, positions, _ = example_sequence
453
- # rf: rfcavity, L=2, VOLT=1, LAG=2, FREQ=3, HARMON=2; ! ignore N_BESSEL, NO_CAVITY_TOTALPATH
453
+ # rf: rfcavity, L=2, VOLT=1, LAG=2, FREQ=3; ! ignore N_BESSEL, NO_CAVITY_TOTALPATH
454
454
  rf1 = env['rf1/line']
455
455
  xo.assert_allclose(positions['rf1/line'], 27, atol=1e-14)
456
456
  assert isinstance(rf1, xt.Cavity)
@@ -655,7 +655,7 @@ def test_reversed_marker(example_sequence):
655
655
 
656
656
 
657
657
  def test_reversed_rfcavity(example_sequence):
658
- env, _, positions_reversed = example_sequence # ma: marker; # rf: rfcavity, L=2, VOLT=1, LAG=2, FREQ=3, HARMON=2; ! ignore N_BESSEL, NO_CAVITY_TOTALPATH
658
+ env, _, positions_reversed = example_sequence # ma: marker; # rf: rfcavity, L=2, VOLT=1, LAG=2, FREQ=3; ! ignore N_BESSEL, NO_CAVITY_TOTALPATH
659
659
  rf1 = env['rf1/line_reversed']
660
660
  xo.assert_allclose(positions_reversed['rf1/line_reversed'], 36 - 27, atol=1e-14)
661
661
  assert isinstance(rf1, xt.Cavity)
@@ -2,6 +2,7 @@ import json
2
2
  import pathlib
3
3
 
4
4
  import numpy as np
5
+ from scipy.constants import c as clight
5
6
 
6
7
  import xobjects as xo
7
8
  import xtrack as xt
@@ -25,6 +26,12 @@ def test_tapering_and_twiss_with_radiation():
25
26
  with open(filename, 'r') as f:
26
27
  line = xt.Line.from_dict(json.load(f))
27
28
 
29
+ # Use harmonic for one of the cavities
30
+ t_rev = line.get_length() / clight
31
+ harm = line['rf1'].frequency * t_rev
32
+ line['rf1'].frequency = 0
33
+ line['rf1'].harmonic = harm
34
+
28
35
  line.build_tracker()
29
36
 
30
37
  # Initial twiss (no radiation)
@@ -142,6 +149,12 @@ def test_tapering_zero_mean():
142
149
  line['rf2b'].voltage *= 2
143
150
  line['rf2a'].voltage *= 2
144
151
 
152
+ # Use harmonic for one of the cavities
153
+ t_rev = line.get_length() / clight
154
+ harm = line['rf1'].frequency * t_rev
155
+ line['rf1'].frequency = 0
156
+ line['rf1'].harmonic = line['rf1'].frequency * t_rev
157
+
145
158
  line.particle_ref.p0c = 4e9 # eV
146
159
 
147
160
  line.configure_radiation(model=None)
@@ -3,6 +3,7 @@ import pathlib
3
3
  from itertools import product
4
4
 
5
5
  import numpy as np
6
+ from scipy.constants import c as clight
6
7
  import pytest
7
8
  from cpymad.madx import Madx
8
9
 
@@ -68,9 +69,6 @@ def test_coupled_beta(test_context):
68
69
  line = env['lhcb1']
69
70
  line.set_particle_ref('proton', p0c=7e12)
70
71
  line['mqwa.a4r3.b1..1'].ksl[1] = 1e-4
71
- tt_cav = line.get_table().rows.match('Cavity', 'element_type')
72
- for nn in tt_cav.name:
73
- line[nn].frequency = 400.79e6
74
72
 
75
73
  line.build_tracker(_context=test_context)
76
74
 
@@ -107,10 +105,6 @@ def test_twiss_zeta0_delta0(test_context):
107
105
  line = env['lhcb1']
108
106
  line.set_particle_ref('proton', p0c=7e12)
109
107
 
110
- tt_cav = line.get_table().rows.match('Cavity', 'element_type')
111
- for nn in tt_cav.name:
112
- line[nn].frequency = 400.79e6
113
-
114
108
  env['on_crab1'] = -190
115
109
  env['on_crab5'] = -190
116
110
 
@@ -1024,6 +1018,11 @@ def test_longitudinal_plane_against_matrix(machine, test_context):
1024
1018
  tw = line.twiss()
1025
1019
  circumference = tw.circumference
1026
1020
 
1021
+ if line[cavity_name].harmonic:
1022
+ frequency_rf = line[cavity_name].harmonic / (line.get_length() / tw.beta0 / clight)
1023
+ else:
1024
+ frequency_rf = line[cavity_name].frequency
1025
+
1027
1026
  if longitudinal_mode == 'nonlinear':
1028
1027
  matrix = xt.LineSegmentMap(
1029
1028
  qx=tw.qx, qy=tw.qy,
@@ -1033,7 +1032,7 @@ def test_longitudinal_plane_against_matrix(machine, test_context):
1033
1032
  dx=tw.dx[0], dpx=tw.dpx[0],
1034
1033
  dy=tw.dy[0], dpy=tw.dpy[0],
1035
1034
  voltage_rf=line[cavity_name].voltage,
1036
- frequency_rf=line[cavity_name].frequency,
1035
+ frequency_rf=frequency_rf,
1037
1036
  lag_rf=line[cavity_name].lag,
1038
1037
  momentum_compaction_factor=tw.momentum_compaction_factor,
1039
1038
  length=circumference)
@@ -1047,7 +1046,7 @@ def test_longitudinal_plane_against_matrix(machine, test_context):
1047
1046
  dx=tw.dx[0], dpx=tw.dpx[0],
1048
1047
  dy=tw.dy[0], dpy=tw.dpy[0],
1049
1048
  voltage_rf=line[cavity_name].voltage,
1050
- frequency_rf=line[cavity_name].frequency,
1049
+ frequency_rf=frequency_rf,
1051
1050
  lag_rf=line[cavity_name].lag,
1052
1051
  momentum_compaction_factor=tw.momentum_compaction_factor,
1053
1052
  length=circumference)
@@ -1592,14 +1591,17 @@ def test_longitudinal_beam_sizes(test_context):
1592
1591
  beam_sizes.sigma_zeta / beam_sizes.sigma_pzeta, tw.bets0, atol=0, rtol=5e-5)
1593
1592
 
1594
1593
  @for_all_test_contexts(excluding=('ContextCupy', 'ContextPyopencl'))
1595
- def test_second_order_chromaticity_and_dispersion(test_context):
1594
+ @pytest.mark.parametrize('method', ['6d', '4d'])
1595
+ def test_second_order_chromaticity_and_dispersion(test_context, method):
1596
1596
 
1597
1597
  line = xt.load(test_data_folder /
1598
1598
  'hllhc15_thick/lhc_thick_with_knobs.json')
1599
1599
  line.vars['on_x5'] = 300
1600
+ line.vars['vrf400'] = 16
1601
+
1600
1602
  line.build_tracker(_context=test_context)
1601
1603
 
1602
- tw = line.twiss(method='4d')
1604
+ tw = line.twiss(method=method)
1603
1605
  tw_fw = line.twiss(start='ip4', end='ip6', init_at='ip4',
1604
1606
  x=tw['x', 'ip4'], px=tw['px', 'ip4'],
1605
1607
  y=tw['y', 'ip4'], py=tw['py', 'ip4'],
@@ -1643,14 +1645,14 @@ def test_second_order_chromaticity_and_dispersion(test_context):
1643
1645
  pxs_qy = np.polyfit(delta, qy_xs, 3)
1644
1646
 
1645
1647
  xo.assert_allclose(delta, nlchr.delta0, atol=1e-6, rtol=0)
1646
- xo.assert_allclose(tw['dx', location], pxs_x[-2], atol=0, rtol=1e-4)
1647
- xo.assert_allclose(tw['dpx', location], pxs_px[-2], atol=0, rtol=1e-4)
1648
- xo.assert_allclose(tw['dy', location], pxs_y[-2], atol=0, rtol=1e-4)
1649
- xo.assert_allclose(tw['dpy', location], pxs_py[-2], atol=0, rtol=1e-4)
1650
- xo.assert_allclose(tw['ddx', location], 2*pxs_x[-3], atol=0, rtol=1e-4)
1651
- xo.assert_allclose(tw['ddpx', location], 2*pxs_px[-3], atol=0, rtol=1e-4)
1652
- xo.assert_allclose(tw['ddy', location], 2*pxs_y[-3], atol=0, rtol=1e-4)
1653
- xo.assert_allclose(tw['ddpy', location], 2*pxs_py[-3], atol=0, rtol=1e-4)
1648
+ xo.assert_allclose(tw['dx', location], pxs_x[-2], atol=0, rtol=5e-4)
1649
+ xo.assert_allclose(tw['dpx', location], pxs_px[-2], atol=0, rtol=5e-4)
1650
+ xo.assert_allclose(tw['dy', location], pxs_y[-2], atol=0, rtol=5e-4)
1651
+ xo.assert_allclose(tw['dpy', location], pxs_py[-2], atol=0, rtol=5e-4)
1652
+ xo.assert_allclose(tw['ddx', location], 2*pxs_x[-3], atol=0, rtol=5e-4)
1653
+ xo.assert_allclose(tw['ddpx', location], 2*pxs_px[-3], atol=0, rtol=5e-4)
1654
+ xo.assert_allclose(tw['ddy', location], 2*pxs_y[-3], atol=0, rtol=5e-4)
1655
+ xo.assert_allclose(tw['ddpy', location], 2*pxs_py[-3], atol=0, rtol=5e-4)
1654
1656
  xo.assert_allclose(tw['dqx'], pxs_qx[-2], atol=0, rtol=1e-3)
1655
1657
  xo.assert_allclose(tw['ddqx'], pxs_qx[-3]*2, atol=0, rtol=1e-2)
1656
1658
  xo.assert_allclose(tw['dqy'], pxs_qy[-2], atol=0, rtol=1e-3)
@@ -27,7 +27,6 @@ def test_twiss_psb(test_context):
27
27
  env = xt.load(test_data_folder / 'psb_injection/psb_injection.seq')
28
28
  line = env['psb']
29
29
  line.set_particle_ref('proton', gamma0=mad.sequence['psb'].beam.gamma)
30
- line['br.c02'].frequency = 1 / line_ref.get_length() * clight * line_ref.particle_ref.beta0[0] # h_rf = 1
31
30
 
32
31
  line.build_tracker(_context=test_context)
33
32
  beta0 = line.particle_ref.beta0[0]
@@ -0,0 +1 @@
1
+ __version__ = '0.98.8'
@@ -531,14 +531,13 @@ class BeamElement(xo.HybridClass, metaclass=MetaBeamElement):
531
531
  raise ValueError("Invalid array type")
532
532
 
533
533
  def xoinitialize(self, **kwargs):
534
- rot_s_rad = kwargs.pop('rot_s_rad', None)
535
- # For the shifts we accept both shift_x and _shift_x for backward compatibility
534
+ rot_s_rad = kwargs.pop('rot_s_rad', kwargs.pop('_rot_s_rad', None))
536
535
  shift_x = kwargs.pop('shift_x', kwargs.pop('_shift_x', None))
537
536
  shift_y = kwargs.pop('shift_y', kwargs.pop('_shift_y', None))
538
537
  shift_s = kwargs.pop('shift_s', kwargs.pop('_shift_s', None))
539
- rot_x_rad = kwargs.pop('rot_x_rad', None)
540
- rot_y_rad = kwargs.pop('rot_y_rad', None)
541
- rot_s_rad_no_frame = kwargs.pop('rot_s_rad_no_frame', None)
538
+ rot_x_rad = kwargs.pop('rot_x_rad', kwargs.pop('_rot_x_rad', None))
539
+ rot_y_rad = kwargs.pop('rot_y_rad', kwargs.pop('_rot_y_rad', None))
540
+ rot_s_rad_no_frame = kwargs.pop('rot_s_rad_no_frame', kwargs.pop('_rot_s_rad_no_frame', None))
542
541
 
543
542
  xo.HybridClass.xoinitialize(self, **kwargs)
544
543
 
@@ -523,6 +523,7 @@ class Cavity(_HasModelRF, _HasIntegrator, BeamElement):
523
523
  'voltage': xo.Float64,
524
524
  'frequency': xo.Float64,
525
525
  'lag': xo.Float64,
526
+ 'harmonic': xo.Float64,
526
527
  'lag_taper': xo.Float64,
527
528
  'absolute_time': xo.Int64,
528
529
  'num_kicks': xo.Int64,
@@ -539,8 +540,13 @@ class Cavity(_HasModelRF, _HasIntegrator, BeamElement):
539
540
  _rename = {
540
541
  'model': '_model',
541
542
  'integrator': '_integrator',
543
+ 'frequency': '_frequency',
544
+ 'harmonic': '_harmonic',
542
545
  }
543
546
 
547
+ _default_frequency = 0.0
548
+ _default_harmonic = 0.0
549
+
544
550
  _noexpr_fields = _NOEXPR_FIELDS
545
551
 
546
552
  def __init__(self, **kwargs):
@@ -551,6 +557,8 @@ class Cavity(_HasModelRF, _HasIntegrator, BeamElement):
551
557
 
552
558
  model = kwargs.pop('model', None)
553
559
  integrator = kwargs.pop('integrator', None)
560
+ frequency = kwargs.pop('frequency', None)
561
+ harmonic = kwargs.pop('harmonic', None)
554
562
 
555
563
  self.xoinitialize(**kwargs)
556
564
 
@@ -561,6 +569,41 @@ class Cavity(_HasModelRF, _HasIntegrator, BeamElement):
561
569
  if integrator is not None:
562
570
  self.integrator = integrator
563
571
 
572
+ if frequency is not None:
573
+ self.frequency = frequency
574
+
575
+ if harmonic is not None:
576
+ self.harmonic = harmonic
577
+
578
+ def track(self, particles, *args, **kwargs):
579
+
580
+ if self.harmonic != 0:
581
+ raise RuntimeError("Cavity cannot be used in standalone tracking "
582
+ "when harmonic is not zero. Please use the "
583
+ "cavity within a Line or set frequency instead"
584
+ " of harmonic.")
585
+ return super().track(particles, *args, **kwargs)
586
+
587
+ @property
588
+ def frequency(self):
589
+ return self._frequency
590
+
591
+ @frequency.setter
592
+ def frequency(self, value):
593
+ if self._harmonic != 0 and value != 0:
594
+ raise ValueError("Cannot set non-zero frequency when harmonic is not zero.")
595
+ self._frequency = value
596
+
597
+ @property
598
+ def harmonic(self):
599
+ return self._harmonic
600
+
601
+ @harmonic.setter
602
+ def harmonic(self, value):
603
+ if self._frequency != 0 and value != 0:
604
+ raise ValueError("Cannot set non-zero harmonic when frequency is not zero.")
605
+ self._harmonic = value
606
+
564
607
  @property
565
608
  def _thin_slice_class(self):
566
609
  return xt.ThinSliceCavity
@@ -18,6 +18,7 @@ void Cavity_track_local_particle(CavityData el, LocalParticle* part0)
18
18
  /*voltage*/ CavityData_get_voltage(el),
19
19
  /*frequency*/ CavityData_get_frequency(el),
20
20
  /*lag*/ CavityData_get_lag(el),
21
+ /*harmonic*/ CavityData_get_harmonic(el),
21
22
  /*transverse_voltage*/ 0.,
22
23
  /*transverse_lag*/ 0.,
23
24
  /*absolute_time*/ CavityData_get_absolute_time(el),
@@ -17,6 +17,7 @@ void CrabCavity_track_local_particle(CrabCavityData el, LocalParticle* part0)
17
17
  /*length*/ CrabCavityData_get_length(el),
18
18
  /*voltage*/ 0,
19
19
  /*frequency*/ CrabCavityData_get_frequency(el),
20
+ /*harmonic*/ 0.,
20
21
  /*lag*/ 0.,
21
22
  /*transverse_voltage*/ CrabCavityData_get_crab_voltage(el),
22
23
  /*transverse_lag*/ CrabCavityData_get_lag(el),
@@ -14,10 +14,11 @@ void RFMultipole_track_local_particle(RFMultipoleData el, LocalParticle* part0){
14
14
  track_rf_particles(
15
15
  /*weight*/ 1.,
16
16
  /*part0*/ part0,
17
- /*length*/ 0,
17
+ /*length*/ 0.,
18
18
  /*voltage*/ RFMultipoleData_get_voltage(el),
19
19
  /*frequency*/ RFMultipoleData_get_frequency(el),
20
20
  /*lag*/ RFMultipoleData_get_lag(el),
21
+ /*harmonic*/ 0.,
21
22
  /*transverse_voltage*/ 0.,
22
23
  /*transverse_lag*/ 0.,
23
24
  /*absolute_time*/ 0, // not used here
@@ -21,6 +21,7 @@ void ThickSliceCavity_track_local_particle(ThickSliceCavityData el, LocalParticl
21
21
  /*voltage*/ ThickSliceCavityData_get__parent_voltage(el),
22
22
  /*frequency*/ ThickSliceCavityData_get__parent_frequency(el),
23
23
  /*lag*/ ThickSliceCavityData_get__parent_lag(el),
24
+ /*harmonic*/ ThickSliceCavityData_get__parent_harmonic(el),
24
25
  /*transverse_voltage*/ 0.,
25
26
  /*transverse_lag*/ 0.,
26
27
  /*absolute_time*/ ThickSliceCavityData_get__parent_absolute_time(el),
@@ -20,6 +20,7 @@ void ThickSliceCrabCavity_track_local_particle(ThickSliceCrabCavityData el, Loca
20
20
  /*length*/ ThickSliceCrabCavityData_get__parent_length(el),
21
21
  /*voltage*/ 0,
22
22
  /*frequency*/ ThickSliceCrabCavityData_get__parent_frequency(el),
23
+ /*harmonic*/ 0.,
23
24
  /*lag*/ 0.,
24
25
  /*transverse_voltage*/ ThickSliceCrabCavityData_get__parent_crab_voltage(el),
25
26
  /*transverse_lag*/ ThickSliceCrabCavityData_get__parent_lag(el),
@@ -21,6 +21,7 @@ void ThinSliceCavity_track_local_particle(ThinSliceCavityData el, LocalParticle*
21
21
  /*voltage*/ ThinSliceCavityData_get__parent_voltage(el),
22
22
  /*frequency*/ ThinSliceCavityData_get__parent_frequency(el),
23
23
  /*lag*/ ThinSliceCavityData_get__parent_lag(el),
24
+ /*harmonic*/ ThinSliceCavityData_get__parent_harmonic(el),
24
25
  /*transverse_voltage*/ 0.,
25
26
  /*transverse_lag*/ 0.,
26
27
  /*absolute_time*/ ThinSliceCavityData_get__parent_absolute_time(el),
@@ -20,6 +20,7 @@ void ThinSliceCrabCavity_track_local_particle(ThinSliceCrabCavityData el, LocalP
20
20
  /*length*/ ThinSliceCrabCavityData_get__parent_length(el),
21
21
  /*voltage*/ 0,
22
22
  /*frequency*/ ThinSliceCrabCavityData_get__parent_frequency(el),
23
+ /*harmonic*/ 0.,
23
24
  /*lag*/ 0.,
24
25
  /*transverse_voltage*/ ThinSliceCrabCavityData_get__parent_crab_voltage(el),
25
26
  /*transverse_lag*/ ThinSliceCrabCavityData_get__parent_lag(el),