xtrack 0.65.5__tar.gz → 0.66.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 (250) hide show
  1. {xtrack-0.65.5/xtrack.egg-info → xtrack-0.66.1}/PKG-INFO +1 -1
  2. xtrack-0.66.1/tests/test_periodic_symmetric_twiss_and_match.py +154 -0
  3. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_twiss.py +26 -1
  4. xtrack-0.66.1/xtrack/_version.py +1 -0
  5. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/line.py +1 -2
  6. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/match.py +2 -2
  7. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/trajectory_correction.py +114 -39
  8. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/twiss.py +80 -33
  9. {xtrack-0.65.5 → xtrack-0.66.1/xtrack.egg-info}/PKG-INFO +1 -1
  10. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack.egg-info/SOURCES.txt +1 -0
  11. xtrack-0.65.5/xtrack/_version.py +0 -1
  12. {xtrack-0.65.5 → xtrack-0.66.1}/LICENSE +0 -0
  13. {xtrack-0.65.5 → xtrack-0.66.1}/MANIFEST.in +0 -0
  14. {xtrack-0.65.5 → xtrack-0.66.1}/README.md +0 -0
  15. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/__init__.py +0 -0
  16. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/base_classes.py +0 -0
  17. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/BB6D.py +0 -0
  18. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  19. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/__init__.py +0 -0
  20. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/beambeam.py +0 -0
  21. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/boost.py +0 -0
  22. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  23. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  24. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/qgauss.py +0 -0
  25. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/slicing.py +0 -0
  26. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
  27. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/elements.py +0 -0
  28. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/line.py +0 -0
  29. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/mathlibs.py +0 -0
  30. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/particles.py +0 -0
  31. {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/temp_pyparticles.py +0 -0
  32. {xtrack-0.65.5 → xtrack-0.66.1}/pyproject.toml +0 -0
  33. {xtrack-0.65.5 → xtrack-0.66.1}/setup.cfg +0 -0
  34. {xtrack-0.65.5 → xtrack-0.66.1}/setup.py +0 -0
  35. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_acceleration.py +0 -0
  36. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_amplitude_detuning.py +0 -0
  37. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  38. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_apertures.py +0 -0
  39. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_attr_replicas_and_slices.py +0 -0
  40. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_cavity_absolute_time.py +0 -0
  41. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
  42. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_coasting.py +0 -0
  43. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_collective_tracker.py +0 -0
  44. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_collimation.py +0 -0
  45. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_element_characterization_functions.py +0 -0
  46. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_element_internal_record.py +0 -0
  47. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_elements.py +0 -0
  48. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_elements_classflags.py +0 -0
  49. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_elements_thick.py +0 -0
  50. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  51. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  52. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_footprint.py +0 -0
  53. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_freeze_longitudinal.py +0 -0
  54. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_full_rings.py +0 -0
  55. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_hvkick.py +0 -0
  56. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_ions.py +0 -0
  57. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_lhc_match_phase_15.py +0 -0
  58. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_line.py +0 -0
  59. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_lumi.py +0 -0
  60. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_mad_writer.py +0 -0
  61. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_madloader.py +0 -0
  62. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_and_track_from_element.py +0 -0
  63. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_coupling_knob.py +0 -0
  64. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_nested.py +0 -0
  65. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_optics_and_ip_knob.py +0 -0
  66. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  67. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_orbit_bump.py +0 -0
  68. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_tune_chroma_cminus.py +0 -0
  69. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_monitor.py +0 -0
  70. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_multiline.py +0 -0
  71. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_multisetter.py +0 -0
  72. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_multispecies.py +0 -0
  73. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_particles_api.py +0 -0
  74. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_pipeline.py +0 -0
  75. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_prebuild_kernels.py +0 -0
  76. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_ps_against_ptc.py +0 -0
  77. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_ps_multiturn_twiss.py +0 -0
  78. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_psb_chicane.py +0 -0
  79. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_pyht_interface.py +0 -0
  80. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_radial_steering.py +0 -0
  81. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_radiation.py +0 -0
  82. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
  83. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_random_gen.py +0 -0
  84. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_random_gen_exp.py +0 -0
  85. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_random_gen_gauss.py +0 -0
  86. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_random_gen_ruth.py +0 -0
  87. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_rf_track.py +0 -0
  88. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_rotation_signs.py +0 -0
  89. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_second_order_taylor_map.py +0 -0
  90. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_seeds.py +0 -0
  91. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
  92. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_slice_elements.py +0 -0
  93. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_slicing.py +0 -0
  94. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  95. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_spacecharge_in_ring.py +0 -0
  96. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_sps_thick.py +0 -0
  97. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_survey.py +0 -0
  98. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_tapering.py +0 -0
  99. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_thick_lhc.py +0 -0
  100. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_tilt_shifts.py +0 -0
  101. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_tracker.py +0 -0
  102. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_trajectory_correcton.py +0 -0
  103. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_twiss_vs_madx_psb.py +0 -0
  104. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_var_cache.py +0 -0
  105. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_vs_madx.py +0 -0
  106. {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_xmask_orbit_correction.py +0 -0
  107. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/__init__.py +0 -0
  108. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/__init__.py +0 -0
  109. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  110. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  111. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  112. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
  113. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  114. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  115. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  116. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/base_element.py +0 -0
  117. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/__init__.py +0 -0
  118. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures.py +0 -0
  119. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  120. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  121. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  122. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  123. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  124. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  125. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/beam_interaction.py +0 -0
  126. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements.py +0 -0
  127. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
  128. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  129. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  130. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  131. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift.h +0 -0
  132. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_elem.h +0 -0
  133. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  134. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  135. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  136. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  137. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  138. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
  139. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  140. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  141. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  142. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  143. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  144. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  145. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  146. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  147. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  148. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  149. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  150. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  151. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  152. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/solenoid.h +0 -0
  153. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  154. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  155. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_drift.h +0 -0
  156. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  157. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  158. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  159. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_solenoid.h +0 -0
  160. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  161. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  162. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  163. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  164. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  165. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  166. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_bend.h +0 -0
  167. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  168. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  169. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  170. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  171. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_multipolar_components.h +0 -0
  172. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_multipole.h +0 -0
  173. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_quadrupole.h +0 -0
  174. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_solenoid.h +0 -0
  175. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  176. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  177. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  178. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  179. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  180. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  181. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  182. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
  183. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  184. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  185. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  186. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  187. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/exciter.py +0 -0
  188. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/rft_element.py +0 -0
  189. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/slice_elements.py +0 -0
  190. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  191. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/footprint.py +0 -0
  192. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/general.py +0 -0
  193. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/atomicadd.h +0 -0
  194. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/checks.h +0 -0
  195. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/constants.h +0 -0
  196. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/particle_states.h +0 -0
  197. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/synrad_spectrum.h +0 -0
  198. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/internal_record.py +0 -0
  199. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/linear_normal_form.py +0 -0
  200. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/loss_location_refinement/__init__.py +0 -0
  201. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  202. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/lumi.py +0 -0
  203. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/mad_loader.py +0 -0
  204. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/mad_writer.py +0 -0
  205. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/__init__.py +0 -0
  206. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_position_monitor.h +0 -0
  207. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_position_monitor.py +0 -0
  208. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
  209. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
  210. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_size_monitor.h +0 -0
  211. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_size_monitor.py +0 -0
  212. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/last_turns_monitor.h +0 -0
  213. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/last_turns_monitor.py +0 -0
  214. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/particles_monitor.h +0 -0
  215. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/particles_monitor.py +0 -0
  216. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multiline/__init__.py +0 -0
  217. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multiline/multiline.py +0 -0
  218. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multiline/shared_knobs.py +0 -0
  219. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multisetter/__init__.py +0 -0
  220. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multisetter/multisetter.py +0 -0
  221. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/__init__.py +0 -0
  222. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/constants.py +0 -0
  223. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/particles.py +0 -0
  224. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/rng_src/base_rng.h +0 -0
  225. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
  226. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/pipeline/__init__.py +0 -0
  227. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/pipeline/core.py +0 -0
  228. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/pipeline/manager.py +0 -0
  229. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/pipeline/multitracker.py +0 -0
  230. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/progress_indicator.py +0 -0
  231. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/__init__.py +0 -0
  232. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_generators.py +0 -0
  233. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/exponential.h +0 -0
  234. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  235. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/normal.h +0 -0
  236. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/rutherford.h +0 -0
  237. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/uniform.h +0 -0
  238. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
  239. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/slicing.py +0 -0
  240. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/survey.py +0 -0
  241. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/synctime.py +0 -0
  242. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/tapering.py +0 -0
  243. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/targets.py +0 -0
  244. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/tracker.py +0 -0
  245. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/tracker_data.py +0 -0
  246. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/tracker_src/tracker.h +0 -0
  247. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/twissplot.py +0 -0
  248. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack.egg-info/dependency_links.txt +0 -0
  249. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack.egg-info/requires.txt +0 -0
  250. {xtrack-0.65.5 → xtrack-0.66.1}/xtrack.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xtrack
3
- Version: 0.65.5
3
+ Version: 0.66.1
4
4
  Summary: Tracking library for particle accelerators
5
5
  Home-page: https://xsuite.readthedocs.io/
6
6
  Download-URL: https://pypi.python.org/pypi/xtrack
@@ -0,0 +1,154 @@
1
+
2
+ import xtrack as xt
3
+ import xobjects as xo
4
+ import numpy as np
5
+
6
+ def test_periodic_symmetric_twiss_and_match():
7
+
8
+ # Build line with half a cell
9
+ half_cell = xt.Line(
10
+ elements={
11
+ 'start_cell': xt.Marker(),
12
+ 'drift0': xt.Drift(length=1.),
13
+ 'qf1': xt.Quadrupole(k1=0.027/2, length=1.),
14
+ 'drift1_1': xt.Drift(length=1),
15
+ 'bend1': xt.Bend(k0=3e-4, h=3e-4, length=45.),
16
+ 'drift1_2': xt.Drift(length=1.),
17
+ 'qd1': xt.Quadrupole(k1=-0.0271/2, length=1.),
18
+ 'drift2': xt.Drift(length=1),
19
+ 'mid_cell': xt.Marker(),
20
+ }
21
+ )
22
+ half_cell.particle_ref = xt.Particles(p0c=2e9)
23
+
24
+ tw_half_cell = half_cell.twiss4d(init='periodic_symmetric', # <--- periodic-symmetric boundary
25
+ strengths=True # to get the strengths in table
26
+ )
27
+
28
+ cell = xt.Line(
29
+ elements={
30
+ 'start_cell': xt.Marker(),
31
+ 'drift0': xt.Drift(length=1.),
32
+ 'qf1': xt.Quadrupole(k1=0.027/2, length=1.),
33
+ 'drift1': xt.Drift(length=1),
34
+ 'bend1': xt.Bend(k0=3e-4, h=3e-4, length=45.),
35
+ 'drift2': xt.Drift(length=1.),
36
+ 'qd1': xt.Quadrupole(k1=-0.0271/2, length=1.),
37
+ 'drift3': xt.Drift(length=1),
38
+ 'mid_cell': xt.Marker(),
39
+ 'drift4': xt.Replica('drift3'),
40
+ 'qd2': xt.Replica('qd1'),
41
+ 'drift5': xt.Replica('drift2'),
42
+ 'bend2': xt.Replica('bend1'),
43
+ 'drift6': xt.Replica('drift1'),
44
+ 'qf2': xt.Replica('qf1'),
45
+ 'drift7': xt.Replica('drift0'),
46
+ 'end_cell': xt.Marker(),
47
+ }
48
+ )
49
+ cell.particle_ref = xt.Particles(p0c=2e9)
50
+ tw_cell = cell.twiss4d(strengths=True)
51
+
52
+ xo.assert_allclose(tw_half_cell.betx[:-1], # remove '_end_point'
53
+ tw_cell.rows[:'mid_cell'].betx, atol=0, rtol=1e-8)
54
+ xo.assert_allclose(tw_half_cell.bety[:-1], # remove '_end_point'
55
+ tw_cell.rows[:'mid_cell'].bety, atol=0, rtol=1e-8)
56
+ xo.assert_allclose(tw_half_cell.alfx[:-1], # remove '_end_point'
57
+ tw_cell.rows[:'mid_cell'].alfx, atol=1e-8, rtol=0)
58
+ xo.assert_allclose(tw_half_cell.alfy[:-1], # remove '_end_point'
59
+ tw_cell.rows[:'mid_cell'].alfy, atol=1e-8, rtol=0)
60
+ xo.assert_allclose(tw_half_cell.dx[:-1], # remove '_end_point'
61
+ tw_cell.rows[:'mid_cell'].dx, atol=1e-8, rtol=0)
62
+ xo.assert_allclose(tw_half_cell.dpx[:-1], # remove '_end_point'
63
+ tw_cell.rows[:'mid_cell'].dpx, atol=1e-8, rtol=0)
64
+
65
+ xo.assert_allclose(tw_half_cell.ax_chrom[:-1], # remove '_end_point'
66
+ tw_cell.rows[:'mid_cell'].ax_chrom, atol=1e-5, rtol=0)
67
+ xo.assert_allclose(tw_half_cell.ay_chrom[:-1], # remove '_end_point'
68
+ tw_cell.rows[:'mid_cell'].ay_chrom, atol=1e-5, rtol=0)
69
+ xo.assert_allclose(tw_half_cell.bx_chrom[:-1], # remove '_end_point'
70
+ tw_cell.rows[:'mid_cell'].bx_chrom, atol=1e-5, rtol=0)
71
+ xo.assert_allclose(tw_half_cell.by_chrom[:-1], # remove '_end_point'
72
+ tw_cell.rows[:'mid_cell'].by_chrom, atol=1e-5, rtol=0)
73
+
74
+ xo.assert_allclose(tw_half_cell.qx, tw_cell.qx / 2, atol=1e-9, rtol=0)
75
+ xo.assert_allclose(tw_half_cell.qy, tw_cell.qy / 2, atol=1e-9, rtol=0)
76
+ xo.assert_allclose(tw_half_cell.dqx, tw_cell.dqx / 2, atol=1e-6, rtol=0)
77
+ xo.assert_allclose(tw_half_cell.dqy, tw_cell.dqy / 2, atol=1e-6, rtol=0)
78
+
79
+ for ll in [cell, half_cell]:
80
+ ll.vars['kqf'] = 0.027/2
81
+ ll.vars['kqd'] = -0.0271/2
82
+ ll.element_refs['qf1'].k1 = ll.vars['kqf']
83
+ ll.element_refs['qd1'].k1 = ll.vars['kqd']
84
+
85
+ tw_cell = cell.twiss4d(strengths=True)
86
+ tw_half_cell = half_cell.twiss4d(init='periodic_symmetric', strengths=True)
87
+
88
+ xo.assert_allclose(tw_cell.mux[-1], 0.231, atol=1e-3, rtol=0)
89
+ xo.assert_allclose(tw_cell.muy[-1], 0.233, atol=1e-3, rtol=0)
90
+ xo.assert_allclose(tw_half_cell.mux[-1], 0.231 / 2, atol=1e-3, rtol=0)
91
+ xo.assert_allclose(tw_half_cell.muy[-1], 0.233 / 2, atol=1e-3, rtol=0)
92
+
93
+ opt_halfcell = half_cell.match(
94
+ method='4d',
95
+ start='start_cell', end='mid_cell',
96
+ init='periodic_symmetric',
97
+ targets=xt.TargetSet(mux=0.2501/2, muy=0.2502/2, at='mid_cell'),
98
+ vary=xt.VaryList(['kqf', 'kqd'], step=1e-5),
99
+ )
100
+
101
+ tw_cell = cell.twiss4d(strengths=True)
102
+ tw_half_cell = half_cell.twiss4d(init='periodic_symmetric', strengths=True)
103
+
104
+ xo.assert_allclose(tw_half_cell.mux[-1], 0.2501 / 2, atol=1e-3, rtol=0)
105
+ xo.assert_allclose(tw_half_cell.muy[-1], 0.2502 / 2, atol=1e-3, rtol=0)
106
+ xo.assert_allclose(tw_cell.mux[-1], 0.231, atol=1e-3, rtol=0) # unaffected
107
+ xo.assert_allclose(tw_cell.muy[-1], 0.233, atol=1e-3, rtol=0) # unaffected
108
+
109
+ opt_cell = cell.match(
110
+ method='4d',
111
+ start='start_cell', end='end_cell',
112
+ init='periodic',
113
+ targets=xt.TargetSet(mux=0.2501, muy=0.2502, at='end_cell'),
114
+ vary=xt.VaryList(['kqf', 'kqd'], step=1e-5),
115
+ )
116
+
117
+ xo.assert_allclose(half_cell.vv['kqf'], cell.vv['kqf'], rtol=1e-9, atol=0)
118
+ xo.assert_allclose(half_cell.vv['kqd'], cell.vv['kqd'], rtol=1e-9, atol=0)
119
+
120
+ tw_cell = cell.twiss4d(strengths=True)
121
+ tw_half_cell = half_cell.twiss4d(init='periodic_symmetric', strengths=True)
122
+
123
+ xo.assert_allclose(tw_half_cell.mux[-1], 0.2501 / 2, atol=1e-3, rtol=0)
124
+ xo.assert_allclose(tw_half_cell.muy[-1], 0.2502 / 2, atol=1e-3, rtol=0)
125
+ xo.assert_allclose(tw_cell.mux[-1], 0.2501, atol=1e-3, rtol=0)
126
+ xo.assert_allclose(tw_cell.muy[-1], 0.2502, atol=1e-3, rtol=0)
127
+
128
+ xo.assert_allclose(tw_half_cell.betx[:-1], # remove '_end_point'
129
+ tw_cell.rows[:'mid_cell'].betx, atol=0, rtol=1e-8)
130
+ xo.assert_allclose(tw_half_cell.bety[:-1], # remove '_end_point'
131
+ tw_cell.rows[:'mid_cell'].bety, atol=0, rtol=1e-8)
132
+ xo.assert_allclose(tw_half_cell.alfx[:-1], # remove '_end_point'
133
+ tw_cell.rows[:'mid_cell'].alfx, atol=1e-8, rtol=0)
134
+ xo.assert_allclose(tw_half_cell.alfy[:-1], # remove '_end_point'
135
+ tw_cell.rows[:'mid_cell'].alfy, atol=1e-8, rtol=0)
136
+ xo.assert_allclose(tw_half_cell.dx[:-1], # remove '_end_point'
137
+ tw_cell.rows[:'mid_cell'].dx, atol=1e-8, rtol=0)
138
+ xo.assert_allclose(tw_half_cell.dpx[:-1], # remove '_end_point'
139
+ tw_cell.rows[:'mid_cell'].dpx, atol=1e-8, rtol=0)
140
+
141
+ xo.assert_allclose(tw_half_cell.ax_chrom[:-1], # remove '_end_point'
142
+ tw_cell.rows[:'mid_cell'].ax_chrom, atol=1e-5, rtol=0)
143
+ xo.assert_allclose(tw_half_cell.ay_chrom[:-1], # remove '_end_point'
144
+ tw_cell.rows[:'mid_cell'].ay_chrom, atol=1e-5, rtol=0)
145
+ xo.assert_allclose(tw_half_cell.bx_chrom[:-1], # remove '_end_point'
146
+ tw_cell.rows[:'mid_cell'].bx_chrom, atol=1e-5, rtol=0)
147
+ xo.assert_allclose(tw_half_cell.by_chrom[:-1], # remove '_end_point'
148
+ tw_cell.rows[:'mid_cell'].by_chrom, atol=1e-5, rtol=0)
149
+
150
+ xo.assert_allclose(tw_half_cell.qx, tw_cell.qx / 2, atol=1e-9, rtol=0)
151
+ xo.assert_allclose(tw_half_cell.qy, tw_cell.qy / 2, atol=1e-9, rtol=0)
152
+ xo.assert_allclose(tw_half_cell.dqx, tw_cell.dqx / 2, atol=1e-6, rtol=0)
153
+ xo.assert_allclose(tw_half_cell.dqy, tw_cell.dqy / 2, atol=1e-6, rtol=0)
154
+
@@ -51,7 +51,6 @@ def test_twiss_4d_fodo_vs_beta_rel(test_context):
51
51
  xo.assert_allclose(tw.dqx, tw_4d_list[0].dqx, atol=1e-4, rtol=0)
52
52
  xo.assert_allclose(tw.dqy, tw_4d_list[0].dqy, atol=1e-4, rtol=0)
53
53
 
54
-
55
54
  @for_all_test_contexts
56
55
  def test_coupled_beta(test_context):
57
56
  mad = Madx(stdout=False)
@@ -1905,3 +1904,29 @@ def test_part_from_full_periodic(test_context, collider_for_test_twiss_range):
1905
1904
  tw_part2[kk, 'ip2'],
1906
1905
  tw[kk, 'ip2'] - tw[kk, 0] +(tw[kk, '_end_point'] - tw[kk, 'ip8']),
1907
1906
  rtol=1e-12, atol=5e-7)
1907
+
1908
+
1909
+
1910
+
1911
+ @for_all_test_contexts
1912
+ def test_twiss_add_strengths(test_context):
1913
+ ## Generate a simple line
1914
+ n = 6
1915
+ fodo = [
1916
+ xt.Multipole(length=0.2, knl=[0, +0.2], ksl=[0, 0]),
1917
+ xt.Drift(length=1.0),
1918
+ xt.Multipole(length=0.2, knl=[0, -0.2], ksl=[0, 0]),
1919
+ xt.Drift(length=1.0),
1920
+ xt.Multipole(length=1.0, knl=[2 * np.pi / n], hxl=[2 * np.pi / n]),
1921
+ xt.Drift(length=1.0),
1922
+ ]
1923
+ line = xt.Line(elements=n * fodo + [xt.Cavity(frequency=1e9, voltage=0, lag=180)])
1924
+ line.build_tracker(_context=test_context)
1925
+
1926
+ ## Twiss
1927
+ line.particle_ref = xp.Particles(mass0=xp.PROTON_MASS_EV, q0=1, p0c=1e8)
1928
+ tw = line.twiss(method="4d")
1929
+
1930
+ assert "length" not in tw.keys()
1931
+ tw.add_strengths()
1932
+ assert "length" in tw.keys()
@@ -0,0 +1 @@
1
+ __version__ = '0.66.1'
@@ -115,8 +115,7 @@ class Line:
115
115
  if isinstance(elements, dict):
116
116
  element_dict = elements
117
117
  if element_names is None:
118
- raise ValueError('`element_names` must be provided'
119
- ' if `elements` is a dictionary.')
118
+ element_names = list(element_dict.keys())
120
119
  else:
121
120
  if element_names is None:
122
121
  element_names = [f"e{ii}" for ii in range(len(elements))]
@@ -104,7 +104,7 @@ class ActionTwiss(xd.Action):
104
104
  if isinstance(twinit, xt.TwissInit):
105
105
  twinit_list[ii] = twinit.copy()
106
106
  elif isinstance(twinit, str):
107
- assert twinit == 'periodic'
107
+ assert twinit == 'periodic' or twinit == 'periodic_symmetric'
108
108
 
109
109
  # Handle init_at as xt.START or xt.END
110
110
  for ii, init_at in enumerate(ele_init_list):
@@ -126,7 +126,7 @@ class ActionTwiss(xd.Action):
126
126
  twinit_list[ii] = twinit.get_twiss_init(at_element=init_at)
127
127
  ele_init_list[ii] = None
128
128
  else:
129
- assert twinit is None or twinit == 'periodic'
129
+ assert twinit is None or twinit in ['periodic', 'periodic_symmetric']
130
130
 
131
131
  if not ismultiline:
132
132
  # Handle case in which twiss init is defined through kwargs
@@ -6,14 +6,17 @@ def _compute_correction(x_iter, response_matrix, n_micado=None, rcond=None,
6
6
 
7
7
  if isinstance(response_matrix, (list, tuple)):
8
8
  assert len(response_matrix) == 3 # U, S, Vt
9
- U, S, Vt = response_matrix
9
+ U, S, Vh = response_matrix
10
10
  if n_singular_values is not None:
11
11
  U = U[:, :n_singular_values]
12
12
  S = S[:n_singular_values]
13
- Vt = Vt[:n_singular_values, :]
14
- response_matrix = U @ np.diag(S) @ Vt
13
+ Vh = Vh[:n_singular_values, :]
14
+ response_matrix = U @ np.diag(S) @ Vh
15
15
  else:
16
16
  assert n_singular_values is None
17
+ U = None
18
+ S = None
19
+ Vh = None
17
20
 
18
21
  n_hcorrectors = response_matrix.shape[1]
19
22
 
@@ -45,8 +48,16 @@ def _compute_correction(x_iter, response_matrix, n_micado=None, rcond=None,
45
48
  mask_corr[:] = True
46
49
 
47
50
  # Compute the correction with least squares
48
- correction_masked, residual_x, rank_x, sval_x = np.linalg.lstsq(
49
- response_matrix[:, mask_corr], -x_iter, rcond=rcond)
51
+ if mask_corr.all() and S is not None:
52
+ # Can reuse the SVD decomposition
53
+ S_inv = np.zeros_like(S)
54
+ S_inv[S > 0] = 1 / S[S > 0]
55
+ if rcond is not None:
56
+ S_inv[S < rcond * S[0]] = 0
57
+ correction_masked = Vh.T.conj() @ (np.diag(S_inv) @ (U.T.conj() @ (-x_iter)))
58
+ else:
59
+ correction_masked, residual_x, rank_x, sval_x = np.linalg.lstsq(
60
+ response_matrix[:, mask_corr], -x_iter, rcond=rcond)
50
61
  correction_x = np.zeros(n_hcorrectors)
51
62
  correction_x[mask_corr] = correction_masked
52
63
 
@@ -60,11 +71,13 @@ def _build_response_matrix(tw, monitor_names, corrector_names,
60
71
  assert plane in ['x', 'y']
61
72
 
62
73
  # Build response matrix
63
- bet_monitors = tw.rows[monitor_names]['bet' + plane]
64
- bet_correctors = tw.rows[corrector_names]['bet' + plane]
74
+ mask_monitors = tw.mask[monitor_names]
75
+ mask_correctors = tw.mask[corrector_names]
76
+ bet_monitors = tw['bet' + plane][mask_monitors]
77
+ bet_correctors = tw['bet' + plane][mask_correctors]
65
78
 
66
- mu_monitor = tw.rows[monitor_names]['mu' + plane]
67
- mux_correctors = tw.rows[corrector_names]['mu' + plane]
79
+ mu_monitor = tw['mu' + plane][mask_monitors]
80
+ mux_correctors = tw['mu' + plane][mask_correctors]
68
81
 
69
82
  n_monitors = len(monitor_names)
70
83
  n_correctors = len(corrector_names)
@@ -159,13 +172,30 @@ class OrbitCorrectionSinglePlane:
159
172
  self.singular_vectors_out = U
160
173
  self.singular_vectors_in = Vt
161
174
 
162
- self.s_correctors = self.twiss_table.rows[self.corrector_names].s
163
- self.s_monitors = self.twiss_table.rows[self.monitor_names].s
175
+ # tw_table_local = self.twiss_table.rows[self.start:self.end]
176
+ # Parch: avoid issue with regular expression
177
+ if self.start is not None:
178
+ start = self.start.replace('$', '\\$')
179
+ else:
180
+ start = None
181
+ if self.end is not None:
182
+ end = self.end.replace('$', '\\$')
183
+ else:
184
+ end = None
185
+ tw_table_local = self.twiss_table.rows[start:end]
186
+
187
+ self._mask_monitors = tw_table_local.mask[self.monitor_names]
188
+ self._mask_correctors = tw_table_local.mask[self.corrector_names]
189
+ self.s_correctors = tw_table_local.s[self._mask_correctors]
190
+ self.s_monitors = tw_table_local.s[self._mask_monitors]
164
191
 
165
192
  self._add_correction_knobs()
166
193
 
167
194
  def correct(self, n_iter='auto', n_micado=None, n_singular_values=None,
168
- rcond=None, stop_iter_factor=0.1, verbose=True):
195
+ rcond=None, stop_iter_factor=0.1, verbose=True, _tw_orbit=None):
196
+
197
+ if _tw_orbit is not None and n_iter !=1:
198
+ raise ValueError('`_tw_orbit` can only be used with `n_iter=1`')
169
199
 
170
200
  assert n_iter == 'auto' or np.isscalar(n_iter)
171
201
  if n_iter == 'auto':
@@ -177,7 +207,7 @@ class OrbitCorrectionSinglePlane:
177
207
  i_iter = 0
178
208
  while True:
179
209
  try:
180
- position = self._measure_position()
210
+ position = self._measure_position(tw_orbit=_tw_orbit)
181
211
  except xt.twiss.ClosedOrbitSearchError:
182
212
  raise RuntimeError('Closed orbit not found. '
183
213
  'Please use the `thread(...)` method to obtain a first guess, '
@@ -200,13 +230,17 @@ class OrbitCorrectionSinglePlane:
200
230
  i_iter += 1
201
231
  if n_iter != 'auto' and i_iter >= n_iter:
202
232
  break
203
- position = self._measure_position()
204
- self._position_after = position
205
- if verbose:
206
- print(
207
- f'Trajectory correction - iter {i_iter}, rms: {position.std()}')
208
233
 
209
- def _measure_position(self):
234
+ if _tw_orbit is None:
235
+ position = self._measure_position()
236
+ self._position_after = position
237
+ if verbose:
238
+ print(
239
+ f'Trajectory correction - iter {i_iter}, rms: {position.std()}')
240
+ else:
241
+ self._position_after = None
242
+
243
+ def _compute_tw_orbit(self):
210
244
  if self.mode == 'open':
211
245
  # Initialized with betx=1, bety=1 (use W_matrix to avoid compilation)
212
246
  twinit = xt.TwissInit(W_matrix=np.eye(6),
@@ -217,8 +251,14 @@ class OrbitCorrectionSinglePlane:
217
251
  twinit = None
218
252
  tw_orbit = self.line.twiss4d(only_orbit=True, start=self.start, end=self.end,
219
253
  init=twinit, reverse=False)
254
+ return tw_orbit
255
+
256
+ def _measure_position(self, tw_orbit=None):
220
257
 
221
- position = tw_orbit.rows[self.monitor_names][self.plane]
258
+ if tw_orbit is None:
259
+ tw_orbit = self._compute_tw_orbit()
260
+
261
+ position = tw_orbit[self.plane][self._mask_monitors]
222
262
 
223
263
  return position
224
264
 
@@ -387,7 +427,8 @@ class TrajectoryCorrection:
387
427
  self.y_correction = None
388
428
 
389
429
  def correct(self, planes=None, n_micado=None, n_singular_values=None,
390
- rcond=None, n_iter='auto', verbose=True, stop_iter_factor=0.1):
430
+ rcond=None, n_iter='auto', verbose=True, stop_iter_factor=0.1,
431
+ tol_position_std=1e-10):
391
432
 
392
433
  '''
393
434
  Correct the trajectory in the horizontal and/or vertical plane.
@@ -445,30 +486,58 @@ class TrajectoryCorrection:
445
486
  i_iter = 0
446
487
  stop_x = self.x_correction is None or 'x' not in planes
447
488
  stop_y = self.y_correction is None or 'y' not in planes
489
+
490
+ if stop_x and stop_y:
491
+ return
492
+
493
+ if self.x_correction is not None:
494
+ a_correction = self.x_correction
495
+ if self.y_correction is not None:
496
+ a_correction = self.y_correction
497
+
498
+ tw_orbit = a_correction._compute_tw_orbit()
499
+
448
500
  while True:
449
- if not stop_x:
501
+
502
+ if self.x_correction is not None and 'x' in planes:
450
503
  self.x_correction.correct(n_micado=n_micado_x,
451
504
  n_singular_values=n_singular_values_x,
452
- rcond=rcond_x, verbose=False, n_iter=1)
453
- if i_iter > 0 and n_iter == 'auto':
454
- stop_x = (self.x_correction._position_after.std()
455
- > (1. - stop_iter_factor) * self.x_correction._position_before.std())
456
- if not stop_y:
505
+ rcond=rcond_x, verbose=False, n_iter=1,
506
+ _tw_orbit=tw_orbit)
507
+
508
+ if self.y_correction is not None and 'y' in planes:
457
509
  self.y_correction.correct(n_micado=n_micado_y,
458
510
  n_singular_values=n_singular_values_y,
459
- rcond=rcond_y, verbose=False, n_iter=1)
460
- if i_iter > 0 and n_iter == 'auto':
461
- stop_y = (self.y_correction._position_after.std()
462
- > (1. - stop_iter_factor) * self.y_correction._position_before.std())
511
+ rcond=rcond_y, verbose=False, n_iter=1,
512
+ _tw_orbit=tw_orbit)
513
+
514
+ tw_orbit_prev = tw_orbit
515
+ tw_orbit = a_correction._compute_tw_orbit()
516
+
517
+ if n_iter == 'auto' and self.x_correction is not None and 'x' in planes:
518
+ new_position = self.x_correction._measure_position(tw_orbit)
519
+ old_position = self.x_correction._measure_position(tw_orbit_prev)
520
+ stop_x = (new_position.std() < tol_position_std or
521
+ new_position.std() > (1. - stop_iter_factor) * old_position.std())
522
+
523
+ if n_iter == 'auto' and self.y_correction is not None and 'y' in planes:
524
+ new_position = self.y_correction._measure_position(tw_orbit)
525
+ old_position = self.y_correction._measure_position(tw_orbit_prev)
526
+ stop_y = (new_position.std() < tol_position_std or
527
+ new_position.std() > (1. - stop_iter_factor) * old_position.std())
463
528
 
464
529
  if verbose:
465
530
  str_2print = f'Iteration {i_iter}, '
466
531
  if self.x_correction is not None and 'x' in planes:
467
- str_2print += (f'x_rms: {self.x_correction._position_before.std():.2e}'
468
- f' -> {self.x_correction._position_after.std():.2e}, ')
532
+ new_position = self.x_correction._measure_position(tw_orbit)
533
+ old_position = self.x_correction._measure_position(tw_orbit_prev)
534
+ str_2print += (f'x_rms: {old_position.std():.2e}'
535
+ f' -> {new_position.std():.2e}, ')
469
536
  if self.y_correction is not None and 'y' in planes:
470
- str_2print += (f'y_rms: {self.y_correction._position_before.std():.2e}'
471
- f' -> {self.y_correction._position_after.std():.2e}')
537
+ new_position = self.y_correction._measure_position(tw_orbit)
538
+ old_position = self.y_correction._measure_position(tw_orbit_prev)
539
+ str_2print += (f'y_rms: {old_position.std():.2e}'
540
+ f' -> {new_position.std():.2e}')
472
541
  print(str_2print)
473
542
  if stop_x and stop_y:
474
543
  break
@@ -612,12 +681,15 @@ def _thread(line, ds_thread, twiss_table=None, rcond_short = None, rcond_long =
612
681
 
613
682
  if verbose:
614
683
  ocprint = ocorr_only_added_part
684
+ tw_orbit_print = ocprint.x_correction._compute_tw_orbit()
685
+ x_meas_print = ocprint.x_correction._measure_position(tw_orbit_print)
686
+ y_meas_print = ocprint.y_correction._measure_position(tw_orbit_print)
615
687
  str_2print = f'Stop at s={s_corr_end}, '
616
688
  str_2print += 'local rms = ['
617
689
  str_2print += (f'x: {ocprint.x_correction._position_before.std():.2e}'
618
- f' -> {ocprint.x_correction._position_after.std():.2e}, ')
690
+ f' -> {x_meas_print.std():.2e}, ')
619
691
  str_2print += (f'y: {ocprint.y_correction._position_before.std():.2e}'
620
- f' -> {ocprint.y_correction._position_after.std():.2e}]')
692
+ f' -> {y_meas_print.std():.2e}]')
621
693
  print(str_2print)
622
694
 
623
695
  # Correct from start line to end of new added portion
@@ -634,12 +706,15 @@ def _thread(line, ds_thread, twiss_table=None, rcond_short = None, rcond_long =
634
706
 
635
707
  if verbose:
636
708
  ocprint = ocorr
709
+ tw_orbit_print = ocprint.x_correction._compute_tw_orbit()
710
+ x_meas_print = ocprint.x_correction._measure_position(tw_orbit_print)
711
+ y_meas_print = ocprint.y_correction._measure_position(tw_orbit_print)
637
712
  str_2print = f'Stop at s={s_corr_end}, '
638
713
  str_2print += 'global rms = ['
639
714
  str_2print += (f'x: {ocprint.x_correction._position_before.std():.2e}'
640
- f' -> {ocprint.x_correction._position_after.std():.2e}, ')
715
+ f' -> {x_meas_print.std():.2e}, ')
641
716
  str_2print += (f'y: {ocprint.y_correction._position_before.std():.2e}'
642
- f' -> {ocprint.y_correction._position_after.std():.2e}]')
717
+ f' -> {y_meas_print.std():.2e}]')
643
718
  print(str_2print)
644
719
 
645
720
  s_corr_end += ds_thread