xtrack 0.76.2__tar.gz → 0.77.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 (272) hide show
  1. {xtrack-0.76.2/xtrack.egg-info → xtrack-0.77.1}/PKG-INFO +1 -1
  2. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_environment.py +191 -0
  3. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_native_madloader.py +243 -5
  4. xtrack-0.77.1/xtrack/_version.py +1 -0
  5. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/apertures.py +1 -1
  6. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/environment.py +38 -16
  7. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/line.py +6 -4
  8. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/mad_parser/loader.py +244 -107
  9. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/mad_parser/parse.py +1 -9
  10. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/slicing.py +5 -6
  11. {xtrack-0.76.2 → xtrack-0.77.1/xtrack.egg-info}/PKG-INFO +1 -1
  12. xtrack-0.76.2/xtrack/_version.py +0 -1
  13. {xtrack-0.76.2 → xtrack-0.77.1}/LICENSE +0 -0
  14. {xtrack-0.76.2 → xtrack-0.77.1}/MANIFEST.in +0 -0
  15. {xtrack-0.76.2 → xtrack-0.77.1}/README.md +0 -0
  16. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/__init__.py +0 -0
  17. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/base_classes.py +0 -0
  18. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/BB6D.py +0 -0
  19. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  20. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/__init__.py +0 -0
  21. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/beambeam.py +0 -0
  22. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/boost.py +0 -0
  23. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  24. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  25. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/qgauss.py +0 -0
  26. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/slicing.py +0 -0
  27. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
  28. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/elements.py +0 -0
  29. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/line.py +0 -0
  30. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/mathlibs.py +0 -0
  31. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/particles.py +0 -0
  32. {xtrack-0.76.2 → xtrack-0.77.1}/ducktrack/temp_pyparticles.py +0 -0
  33. {xtrack-0.76.2 → xtrack-0.77.1}/pyproject.toml +0 -0
  34. {xtrack-0.76.2 → xtrack-0.77.1}/setup.cfg +0 -0
  35. {xtrack-0.76.2 → xtrack-0.77.1}/setup.py +0 -0
  36. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_acceleration.py +0 -0
  37. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_amplitude_detuning.py +0 -0
  38. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  39. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_apertures.py +0 -0
  40. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_attr_replicas_and_slices.py +0 -0
  41. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_bucket_with_ref_energy_change.py +0 -0
  42. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_cavity_absolute_time.py +0 -0
  43. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
  44. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_coasting.py +0 -0
  45. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_collective_tracker.py +0 -0
  46. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_collimation.py +0 -0
  47. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_element_characterization_functions.py +0 -0
  48. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_element_internal_record.py +0 -0
  49. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_elements.py +0 -0
  50. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_elements_classflags.py +0 -0
  51. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_elements_thick.py +0 -0
  52. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  53. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  54. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_footprint.py +0 -0
  55. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_freeze_longitudinal.py +0 -0
  56. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_full_rings.py +0 -0
  57. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_h6_sps_beamline.py +0 -0
  58. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_hvkick.py +0 -0
  59. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_ions.py +0 -0
  60. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_legacy_multiline_to_env.py +0 -0
  61. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_lhc_env.py +0 -0
  62. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_lhc_match_phase_15.py +0 -0
  63. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_line.py +0 -0
  64. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_lumi.py +0 -0
  65. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_mad_writer.py +0 -0
  66. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_madloader.py +0 -0
  67. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_madnginterface.py +0 -0
  68. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_match_and_track_from_element.py +0 -0
  69. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_match_coupling_knob.py +0 -0
  70. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_match_nested.py +0 -0
  71. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_match_optics_and_ip_knob.py +0 -0
  72. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  73. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_match_orbit_bump.py +0 -0
  74. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_match_tune_chroma_cminus.py +0 -0
  75. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_monitor.py +0 -0
  76. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_multi_bunch_gauss.py +0 -0
  77. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_multiline.py +0 -0
  78. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_multisetter.py +0 -0
  79. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_multispecies.py +0 -0
  80. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_particles.py +0 -0
  81. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_periodic_symmetric_twiss_and_match.py +0 -0
  82. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_pipeline.py +0 -0
  83. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_prebuild_kernels.py +0 -0
  84. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_ps_against_ptc.py +0 -0
  85. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_ps_multiturn_twiss.py +0 -0
  86. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_psb_chicane.py +0 -0
  87. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_pyht_interface.py +0 -0
  88. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_radial_steering.py +0 -0
  89. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_radiation.py +0 -0
  90. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
  91. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_random_gen.py +0 -0
  92. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_random_gen_exp.py +0 -0
  93. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_random_gen_gauss.py +0 -0
  94. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_random_gen_ruth.py +0 -0
  95. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_rbend_rbarc.py +0 -0
  96. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_rf_track.py +0 -0
  97. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_rotation_signs.py +0 -0
  98. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_second_order_taylor_map.py +0 -0
  99. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_seeds.py +0 -0
  100. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
  101. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_slice_elements.py +0 -0
  102. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_slicing.py +0 -0
  103. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  104. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_spacecharge_in_ring.py +0 -0
  105. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_sps_thick.py +0 -0
  106. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_survey.py +0 -0
  107. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_tapering.py +0 -0
  108. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_thick_lhc.py +0 -0
  109. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_tilt_shifts.py +0 -0
  110. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_tracker.py +0 -0
  111. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_trajectory_correcton.py +0 -0
  112. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_twiss.py +0 -0
  113. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_twiss_vs_madx_psb.py +0 -0
  114. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_vs_madx.py +0 -0
  115. {xtrack-0.76.2 → xtrack-0.77.1}/tests/test_xmask_orbit_correction.py +0 -0
  116. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/__init__.py +0 -0
  117. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/_temp/__init__.py +0 -0
  118. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  119. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  120. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  121. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
  122. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  123. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  124. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  125. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/base_element.py +0 -0
  126. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/__init__.py +0 -0
  127. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  128. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  129. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  130. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  131. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  132. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  133. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/beam_interaction.py +0 -0
  134. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements.py +0 -0
  135. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
  136. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  137. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  138. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  139. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/drift.h +0 -0
  140. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/drift_elem.h +0 -0
  141. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  142. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  143. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  144. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  145. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  146. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  147. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
  148. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  149. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  150. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  151. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  152. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  153. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  154. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  155. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/rbend.h +0 -0
  156. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  157. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  158. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  159. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  160. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  161. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  162. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/solenoid.h +0 -0
  163. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  164. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  165. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thick_slice_drift.h +0 -0
  166. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  167. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  168. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
  169. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  170. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thick_slice_solenoid.h +0 -0
  171. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  172. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  173. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  174. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  175. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  176. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
  177. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  178. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  179. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  180. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_bend.h +0 -0
  181. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  182. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  183. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  184. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  185. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_multipolar_components.h +0 -0
  186. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_multipole.h +0 -0
  187. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_quadrupole.h +0 -0
  188. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_solenoid.h +0 -0
  189. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  190. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  191. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  192. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  193. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  194. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  195. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  196. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
  197. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  198. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  199. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  200. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  201. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/exciter.py +0 -0
  202. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/rft_element.py +0 -0
  203. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/slice_elements.py +0 -0
  204. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  205. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/footprint.py +0 -0
  206. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/general.py +0 -0
  207. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/headers/atomicadd.h +0 -0
  208. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/headers/checks.h +0 -0
  209. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/headers/constants.h +0 -0
  210. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/headers/particle_states.h +0 -0
  211. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/headers/synrad_spectrum.h +0 -0
  212. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/internal_record.py +0 -0
  213. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/json.py +0 -0
  214. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/linear_normal_form.py +0 -0
  215. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/loss_location_refinement/__init__.py +0 -0
  216. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  217. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/lumi.py +0 -0
  218. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/mad_loader.py +0 -0
  219. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/mad_parser/__init__.py +0 -0
  220. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/mad_parser/madx.lark +0 -0
  221. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/mad_writer.py +0 -0
  222. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/madng_interface.py +0 -0
  223. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/match.py +0 -0
  224. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/__init__.py +0 -0
  225. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/beam_position_monitor.h +0 -0
  226. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/beam_position_monitor.py +0 -0
  227. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
  228. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
  229. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/beam_size_monitor.h +0 -0
  230. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/beam_size_monitor.py +0 -0
  231. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/last_turns_monitor.h +0 -0
  232. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/last_turns_monitor.py +0 -0
  233. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/particles_monitor.h +0 -0
  234. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/monitors/particles_monitor.py +0 -0
  235. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/multiline.py +0 -0
  236. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/multiline_legacy/__init__.py +0 -0
  237. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  238. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  239. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/multisetter/__init__.py +0 -0
  240. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/multisetter/multisetter.py +0 -0
  241. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/particles/__init__.py +0 -0
  242. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/particles/constants.py +0 -0
  243. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/particles/particles.py +0 -0
  244. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/particles/rng_src/base_rng.h +0 -0
  245. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
  246. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/pipeline/__init__.py +0 -0
  247. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/pipeline/core.py +0 -0
  248. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/pipeline/manager.py +0 -0
  249. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/pipeline/multitracker.py +0 -0
  250. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/progress_indicator.py +0 -0
  251. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/random/__init__.py +0 -0
  252. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/random/random_generators.py +0 -0
  253. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/random/random_src/exponential.h +0 -0
  254. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  255. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/random/random_src/normal.h +0 -0
  256. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/random/random_src/rutherford.h +0 -0
  257. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/random/random_src/uniform.h +0 -0
  258. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
  259. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/survey.py +0 -0
  260. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/synctime.py +0 -0
  261. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/tapering.py +0 -0
  262. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/targets.py +0 -0
  263. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/tracker.py +0 -0
  264. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/tracker_data.py +0 -0
  265. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/tracker_src/tracker.h +0 -0
  266. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/trajectory_correction.py +0 -0
  267. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/twiss.py +0 -0
  268. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack/twissplot.py +0 -0
  269. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack.egg-info/SOURCES.txt +0 -0
  270. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack.egg-info/dependency_links.txt +0 -0
  271. {xtrack-0.76.2 → xtrack-0.77.1}/xtrack.egg-info/requires.txt +0 -0
  272. {xtrack-0.76.2 → xtrack-0.77.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.76.2
3
+ Version: 0.77.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
@@ -2971,3 +2971,194 @@ def test_builder_length():
2971
2971
  assert np.all(tt.name == np.array(['drift_1', 'mq', 'drift_2', '_end_point']))
2972
2972
  xo.assert_allclose(tt.s_center, np.array([ 4.75, 10. , 15.25, 20. ]),
2973
2973
  rtol=0, atol=1e-10)
2974
+
2975
+ def test_enviroment_from_two_lines():
2976
+
2977
+ env1 = xt.Environment()
2978
+ env1.vars.default_to_zero = True
2979
+ line1 = env1.new_line(components=[
2980
+ env1.new('qq1_thick', xt.Quadrupole, length=1., k1='kk', at=10),
2981
+ env1.new('qq1_thin', xt.Quadrupole, length=1., k1='kk', at=20),
2982
+ env1.new('qq_shared_thick', xt.Quadrupole, length=1., k1='kk', at=30),
2983
+ env1.new('qq_shared_thin', xt.Quadrupole, length=1., k1='kk', at=40),
2984
+ ])
2985
+ line1.slice_thick_elements(
2986
+ slicing_strategies=[
2987
+ xt.Strategy(slicing=xt.Teapot(2, mode='thick'), name='qq1_thick'),
2988
+ xt.Strategy(slicing=xt.Teapot(2, mode='thin'), name='qq1_thin'),
2989
+ xt.Strategy(slicing=xt.Teapot(2, mode='thick'), name='qq_shared_thick'),
2990
+ xt.Strategy(slicing=xt.Teapot(2, mode='thin'), name='qq_shared_thin'),
2991
+ ])
2992
+
2993
+ env2 = xt.Environment()
2994
+ env2.vars.default_to_zero = True
2995
+ line2 = env2.new_line(components=[
2996
+ env2.new('qq2_thick', xt.Quadrupole, length=1., k1='kk', at=10),
2997
+ env2.new('qq2_thin', xt.Quadrupole, length=1., k1='kk', at=20),
2998
+ env2.new('qq_shared_thick', xt.Quadrupole, length=1., k1='kk', at=30),
2999
+ env2.new('qq_shared_thin', xt.Quadrupole, length=1., k1='kk', at=40),
3000
+ ])
3001
+ line2.slice_thick_elements(
3002
+ slicing_strategies=[
3003
+ xt.Strategy(slicing=xt.Teapot(2, mode='thick'), name='qq2_thick'),
3004
+ xt.Strategy(slicing=xt.Teapot(2, mode='thin'), name='qq2_thin'),
3005
+ xt.Strategy(slicing=xt.Teapot(2, mode='thick'), name='qq_shared_thick'),
3006
+ xt.Strategy(slicing=xt.Teapot(2, mode='thin'), name='qq_shared_thin'),
3007
+ ])
3008
+
3009
+ # Merge the line in one environment
3010
+ env = xt.Environment(lines={'line1': line1, 'line2': line2})
3011
+
3012
+ tt1 = env.line1.get_table()
3013
+ tt2 = env.line2.get_table()
3014
+
3015
+ tt1.show(cols='name element_type parent_name')
3016
+ # name element_type parent_name
3017
+ # drift_1 Drift None
3018
+ # qq1_thick_entry Marker None
3019
+ # qq1_thick..0 ThickSliceQuadrupole qq1_thick
3020
+ # qq1_thick..1 ThickSliceQuadrupole qq1_thick
3021
+ # qq1_thick_exit Marker None
3022
+ # drift_2 Drift None
3023
+ # qq1_thin_entry Marker None
3024
+ # drift_qq1_thin..0 DriftSliceQuadrupole qq1_thin
3025
+ # qq1_thin..0 ThinSliceQuadrupole qq1_thin
3026
+ # drift_qq1_thin..1 DriftSliceQuadrupole qq1_thin
3027
+ # qq1_thin..1 ThinSliceQuadrupole qq1_thin
3028
+ # drift_qq1_thin..2 DriftSliceQuadrupole qq1_thin
3029
+ # qq1_thin_exit Marker None
3030
+ # drift_3 Drift None
3031
+ # qq_shared_thick_entry Marker None
3032
+ # qq_shared_thick..0/line1 ThickSliceQuadrupole qq_shared_thick/line1
3033
+ # qq_shared_thick..1/line1 ThickSliceQuadrupole qq_shared_thick/line1
3034
+ # qq_shared_thick_exit Marker None
3035
+ # drift_4 Drift None
3036
+ # qq_shared_thin_entry Marker None
3037
+ # drift_qq_shared_thin..0/line1 DriftSliceQuadrupole qq_shared_thin/line1
3038
+ # qq_shared_thin..0/line1 ThinSliceQuadrupole qq_shared_thin/line1
3039
+ # drift_qq_shared_thin..1/line1 DriftSliceQuadrupole qq_shared_thin/line1
3040
+ # qq_shared_thin..1/line1 ThinSliceQuadrupole qq_shared_thin/line1
3041
+ # drift_qq_shared_thin..2/line1 DriftSliceQuadrupole qq_shared_thin/line1
3042
+ # qq_shared_thin_exit Marker None
3043
+
3044
+ tt2.show(cols='name element_type parent_name')
3045
+ # name element_type parent_name
3046
+ # drift_5 Drift None
3047
+ # qq2_thick_entry Marker None
3048
+ # qq2_thick..0 ThickSliceQuadrupole qq2_thick
3049
+ # qq2_thick..1 ThickSliceQuadrupole qq2_thick
3050
+ # qq2_thick_exit Marker None
3051
+ # drift_6 Drift None
3052
+ # qq2_thin_entry Marker None
3053
+ # drift_qq2_thin..0 DriftSliceQuadrupole qq2_thin
3054
+ # qq2_thin..0 ThinSliceQuadrupole qq2_thin
3055
+ # drift_qq2_thin..1 DriftSliceQuadrupole qq2_thin
3056
+ # qq2_thin..1 ThinSliceQuadrupole qq2_thin
3057
+ # drift_qq2_thin..2 DriftSliceQuadrupole qq2_thin
3058
+ # qq2_thin_exit Marker None
3059
+ # drift_7 Drift None
3060
+ # qq_shared_thick_entry Marker None
3061
+ # qq_shared_thick..0/line2 ThickSliceQuadrupole qq_shared_thick/line2
3062
+ # qq_shared_thick..1/line2 ThickSliceQuadrupole qq_shared_thick/line2
3063
+ # qq_shared_thick_exit Marker None
3064
+ # drift_8 Drift None
3065
+ # qq_shared_thin_entry Marker None
3066
+ # drift_qq_shared_thin..0/line2 DriftSliceQuadrupole qq_shared_thin/line2
3067
+ # qq_shared_thin..0/line2 ThinSliceQuadrupole qq_shared_thin/line2
3068
+ # drift_qq_shared_thin..1/line2 DriftSliceQuadrupole qq_shared_thin/line2
3069
+ # qq_shared_thin..1/line2 ThinSliceQuadrupole qq_shared_thin/line2
3070
+ # drift_qq_shared_thin..2/line2 DriftSliceQuadrupole qq_shared_thin/line2
3071
+ # qq_shared_thin_exit Marker None
3072
+ # _end_point None
3073
+
3074
+ assert np.all(tt1.name == np.array([
3075
+ 'drift_1', 'qq1_thick_entry', 'qq1_thick..0', 'qq1_thick..1',
3076
+ 'qq1_thick_exit', 'drift_2', 'qq1_thin_entry', 'drift_qq1_thin..0',
3077
+ 'qq1_thin..0', 'drift_qq1_thin..1', 'qq1_thin..1',
3078
+ 'drift_qq1_thin..2', 'qq1_thin_exit', 'drift_3',
3079
+ 'qq_shared_thick_entry', 'qq_shared_thick..0/line1',
3080
+ 'qq_shared_thick..1/line1', 'qq_shared_thick_exit', 'drift_4',
3081
+ 'qq_shared_thin_entry', 'drift_qq_shared_thin..0/line1',
3082
+ 'qq_shared_thin..0/line1', 'drift_qq_shared_thin..1/line1',
3083
+ 'qq_shared_thin..1/line1', 'drift_qq_shared_thin..2/line1',
3084
+ 'qq_shared_thin_exit', '_end_point']))
3085
+
3086
+ assert np.all(tt1.element_type == np.array([
3087
+ 'Drift', 'Marker', 'ThickSliceQuadrupole', 'ThickSliceQuadrupole',
3088
+ 'Marker', 'Drift', 'Marker', 'DriftSliceQuadrupole',
3089
+ 'ThinSliceQuadrupole', 'DriftSliceQuadrupole',
3090
+ 'ThinSliceQuadrupole', 'DriftSliceQuadrupole', 'Marker', 'Drift',
3091
+ 'Marker', 'ThickSliceQuadrupole', 'ThickSliceQuadrupole', 'Marker',
3092
+ 'Drift', 'Marker', 'DriftSliceQuadrupole', 'ThinSliceQuadrupole',
3093
+ 'DriftSliceQuadrupole', 'ThinSliceQuadrupole',
3094
+ 'DriftSliceQuadrupole', 'Marker', '']))
3095
+
3096
+ assert np.all(tt1.parent_name == np.array([
3097
+ None, None, 'qq1_thick', 'qq1_thick', None, None, None, 'qq1_thin',
3098
+ 'qq1_thin', 'qq1_thin', 'qq1_thin', 'qq1_thin', None, None, None,
3099
+ 'qq_shared_thick/line1', 'qq_shared_thick/line1', None, None, None,
3100
+ 'qq_shared_thin/line1', 'qq_shared_thin/line1',
3101
+ 'qq_shared_thin/line1', 'qq_shared_thin/line1',
3102
+ 'qq_shared_thin/line1', None, None]))
3103
+
3104
+ assert np.all(tt2.name == np.array([
3105
+ 'drift_5', 'qq2_thick_entry', 'qq2_thick..0', 'qq2_thick..1',
3106
+ 'qq2_thick_exit', 'drift_6', 'qq2_thin_entry', 'drift_qq2_thin..0',
3107
+ 'qq2_thin..0', 'drift_qq2_thin..1', 'qq2_thin..1',
3108
+ 'drift_qq2_thin..2', 'qq2_thin_exit', 'drift_7',
3109
+ 'qq_shared_thick_entry', 'qq_shared_thick..0/line2',
3110
+ 'qq_shared_thick..1/line2', 'qq_shared_thick_exit', 'drift_8',
3111
+ 'qq_shared_thin_entry', 'drift_qq_shared_thin..0/line2',
3112
+ 'qq_shared_thin..0/line2', 'drift_qq_shared_thin..1/line2',
3113
+ 'qq_shared_thin..1/line2', 'drift_qq_shared_thin..2/line2',
3114
+ 'qq_shared_thin_exit', '_end_point']))
3115
+
3116
+ assert np.all(tt2.element_type == np.array([
3117
+ 'Drift', 'Marker', 'ThickSliceQuadrupole', 'ThickSliceQuadrupole',
3118
+ 'Marker', 'Drift', 'Marker', 'DriftSliceQuadrupole',
3119
+ 'ThinSliceQuadrupole', 'DriftSliceQuadrupole',
3120
+ 'ThinSliceQuadrupole', 'DriftSliceQuadrupole', 'Marker', 'Drift',
3121
+ 'Marker', 'ThickSliceQuadrupole', 'ThickSliceQuadrupole', 'Marker',
3122
+ 'Drift', 'Marker', 'DriftSliceQuadrupole', 'ThinSliceQuadrupole',
3123
+ 'DriftSliceQuadrupole', 'ThinSliceQuadrupole',
3124
+ 'DriftSliceQuadrupole', 'Marker', '']))
3125
+
3126
+ assert np.all(tt2.parent_name == np.array([
3127
+ None, None, 'qq2_thick', 'qq2_thick', None, None, None, 'qq2_thin',
3128
+ 'qq2_thin', 'qq2_thin', 'qq2_thin', 'qq2_thin', None, None, None,
3129
+ 'qq_shared_thick/line2', 'qq_shared_thick/line2', None, None, None,
3130
+ 'qq_shared_thin/line2', 'qq_shared_thin/line2',
3131
+ 'qq_shared_thin/line2', 'qq_shared_thin/line2',
3132
+ 'qq_shared_thin/line2', None, None]))
3133
+
3134
+ assert 'qq1_thick' in env.element_dict
3135
+ assert 'qq1_thin' in env.element_dict
3136
+ assert 'qq_shared_thick/line1' in env.element_dict
3137
+ assert 'qq_shared_thin/line1' in env.element_dict
3138
+ assert 'qq2_thick' in env.element_dict
3139
+ assert 'qq2_thin' in env.element_dict
3140
+ assert 'qq_shared_thick/line2' in env.element_dict
3141
+ assert 'qq_shared_thin/line2' in env.element_dict
3142
+
3143
+ line1['kk'] = 1e-1
3144
+ line2['kk'] = 1e-1
3145
+ env['kk'] = 1e-1
3146
+
3147
+ particle_ref = xt.Particles(p0c=7e12)
3148
+ line1.particle_ref = particle_ref
3149
+ line2.particle_ref = particle_ref
3150
+ env.line1.particle_ref = particle_ref
3151
+ env.line2.particle_ref = particle_ref
3152
+
3153
+ tw1 = line1.twiss(betx=1, bety=2)
3154
+ tw2 = line2.twiss(betx=1, bety=2)
3155
+ tw1i = env.line1.twiss(betx=1, bety=2)
3156
+ tw2i = env.line2.twiss(betx=1, bety=2)
3157
+
3158
+ assert np.allclose(tw1.s, tw1i.s, atol=0, rtol=1e-15)
3159
+ assert np.allclose(tw1.betx, tw1i.betx, atol=0, rtol=1e-15)
3160
+ assert np.allclose(tw1.bety, tw1i.bety, atol=0, rtol=1e-15)
3161
+
3162
+ assert np.allclose(tw2.s, tw2i.s, atol=0, rtol=1e-15)
3163
+ assert np.allclose(tw2.betx, tw2i.betx, atol=0, rtol=1e-15)
3164
+ assert np.allclose(tw2.bety, tw2i.bety, atol=0, rtol=1e-15)
@@ -9,6 +9,7 @@ from cpymad.madx import Madx
9
9
 
10
10
  from xdeps.refs import CompactFormatter
11
11
  import xtrack as xt
12
+ from xtrack import Strategy, Uniform
12
13
  from xtrack.mad_parser.loader import MadxLoader
13
14
  from xtrack.mad_parser.parse import MadxOutputType, MadxParser
14
15
 
@@ -725,15 +726,23 @@ def test_load_b2_with_bv_minus_one(tmp_path):
725
726
  mad.input('set, format=".20g";')
726
727
  mad.save(file=tmp_seq_path)
727
728
 
728
- line2_ref = xt.Line.from_madx_sequence(mad.sequence.lhcb2,
729
- allow_thick=True,
730
- deferred_expressions=True,
731
- replace_in_expr={'bv_aux': 'bvaux_b2'})
729
+ line2_ref = xt.Line.from_madx_sequence(
730
+ sequence=mad.sequence.lhcb2,
731
+ allow_thick=True,
732
+ deferred_expressions=True,
733
+ replace_in_expr={'bv_aux': 'bvaux_b2'},
734
+ )
732
735
  line2_ref.particle_ref = xt.Particles(mass0=xt.PROTON_MASS_EV, p0c=7000e9)
733
736
 
734
737
  env = xt.load_madx_lattice(tmp_seq_path, reverse_lines=['lhcb2'])
735
738
  line2 = env['lhcb2']
736
739
 
740
+ # Remove apertures, they are not supported in the cpymadloader
741
+ line2.element_names = [
742
+ name for name in line2.element_names
743
+ if not isinstance(line2[name], xt.LimitRectEllipse)
744
+ ]
745
+
737
746
  # Bend done
738
747
 
739
748
  # Quadrupole
@@ -879,7 +888,6 @@ def test_refer_and_thin_elements():
879
888
 
880
889
  def test_import_seq_length():
881
890
  sequence = """
882
-
883
891
  qu: quadrupole, l=2, k1=3, k1s=4, tilt=2; ! ignore thick and ktap
884
892
 
885
893
  line: sequence, l = ll;
@@ -897,3 +905,233 @@ def test_import_seq_length():
897
905
  assert np.all(tt.name == np.array(['drift_1', 'qu1', 'drift_2', '_end_point']))
898
906
  xo.assert_allclose(tt['s'], np.array([ 0., 18., 20., 30.]), rtol=0, atol=1e-15)
899
907
  assert env.line.builder.length == 'll'
908
+
909
+
910
+ def test_repeated_element_mad_behaviour():
911
+ sequence = """
912
+ mar: marker;
913
+ ben: sbend, l=1;
914
+
915
+ seq1: sequence, l=10;
916
+ ee: mar, at=5;
917
+ endsequence;
918
+
919
+ seq2: sequence, l=10;
920
+ ee: ben, at=5; ! in MAD-X this definition will be ignored
921
+ endsequence;
922
+ """
923
+
924
+ env = xt.load_madx_lattice(string=sequence)
925
+
926
+ element = env['ee']
927
+ assert env.seq1['ee'] == element
928
+ assert env.seq2['ee'] == element
929
+
930
+
931
+ @pytest.mark.parametrize('aper_config', ['attached_to_marker', 'standalone'])
932
+ def test_apertures_on_markers(aper_config):
933
+ if aper_config == 'attached_to_marker':
934
+ sequence = """
935
+ ! Attached to a marker
936
+ m_circle: marker, apertype="circle", aperture={.2};
937
+ m_ellipse: marker, apertype="ellipse", aperture={.2, .1};
938
+ m_rectangle: marker, apertype="rectangle", aperture={.07, .05};
939
+ m_rectellipse: marker, apertype="rectellipse", aperture={.2, .4, .25, .45};
940
+ m_racetrack: marker, apertype="racetrack", aperture={.6,.4,.2,.1};
941
+ m_octagon: marker, apertype="octagon", aperture={.4, .5, 0.5, 1.};
942
+ m_polygon: marker, apertype="circle", aper_vx={+5.800e-2,+5.800e-2,-8.800e-2}, aper_vy={+3.500e-2,-3.500e-2,+0.000e+0};
943
+ """
944
+ else:
945
+ sequence = """
946
+ ! Standalone
947
+ m_circle: circle, aperture={.2};
948
+ m_ellipse: ellipse, aperture={.2, .1};
949
+ m_rectangle: rectangle, aperture={.07, .05};
950
+ m_rectellipse: rectellipse, aperture={.2, .4, .25, .45};
951
+ m_racetrack: racetrack, aperture={.6,.4,.2,.1};
952
+ m_octagon: octagon, aperture={.4, .5, 0.5, 1.};
953
+ m_polygon: circle, aper_vx={+5.800e-2,+5.800e-2,-8.800e-2}, aper_vy={+3.500e-2,-3.500e-2,+0.000e+0};
954
+ """
955
+
956
+ sequence += """
957
+ line: sequence, l=1;
958
+ m_circle, at=0;
959
+ m_ellipse, at=0.01;
960
+ m_rectangle, at=0.02;
961
+ m_rectellipse, at=0.03;
962
+ m_racetrack, at=0.04;
963
+ m_octagon, at=0.05;
964
+ m_polygon, at=0.06;
965
+ endsequence;
966
+ """
967
+
968
+ env = xt.load_madx_lattice(string=sequence)
969
+ line = env.line
970
+
971
+ apertures = [ee for ee in line.elements if ee.__class__.__name__.startswith('Limit')]
972
+
973
+ assert isinstance(line[line['m_circle'].name_associated_aperture], xt.LimitEllipse)
974
+ circ = apertures[0]
975
+ assert circ.__class__.__name__ == 'LimitEllipse'
976
+ xo.assert_allclose(circ.a_squ, .2**2, atol=1e-13, rtol=0)
977
+ xo.assert_allclose(circ.b_squ, .2**2, atol=1e-13, rtol=0)
978
+
979
+ assert isinstance(line[line['m_ellipse'].name_associated_aperture], xt.LimitEllipse)
980
+ ellip = apertures[1]
981
+ assert ellip.__class__.__name__ == 'LimitEllipse'
982
+ xo.assert_allclose(ellip.a_squ, .2**2, atol=1e-13, rtol=0)
983
+ xo.assert_allclose(ellip.b_squ, .1**2, atol=1e-13, rtol=0)
984
+
985
+ assert isinstance(line[line['m_rectangle'].name_associated_aperture], xt.LimitRect)
986
+ rect = apertures[2]
987
+ assert rect.__class__.__name__ == 'LimitRect'
988
+ assert rect.min_x == -.07
989
+ assert rect.max_x == +.07
990
+ assert rect.min_y == -.05
991
+ assert rect.max_y == +.05
992
+
993
+ assert isinstance(line[line['m_rectellipse'].name_associated_aperture], xt.LimitRectEllipse)
994
+ rectellip = apertures[3]
995
+ assert rectellip.max_x == .2
996
+ assert rectellip.max_y == .4
997
+ xo.assert_allclose(rectellip.a_squ, .25**2, atol=1e-13, rtol=0)
998
+ xo.assert_allclose(rectellip.b_squ, .45**2, atol=1e-13, rtol=0)
999
+
1000
+ assert isinstance(line[line['m_racetrack'].name_associated_aperture], xt.LimitRacetrack)
1001
+ racetr = apertures[4]
1002
+ assert racetr.__class__.__name__ == 'LimitRacetrack'
1003
+ assert racetr.min_x == -.6
1004
+ assert racetr.max_x == +.6
1005
+ assert racetr.min_y == -.4
1006
+ assert racetr.max_y == +.4
1007
+ assert racetr.a == .2
1008
+ assert racetr.b == .1
1009
+
1010
+ assert isinstance(line[line['m_octagon'].name_associated_aperture], xt.LimitPolygon)
1011
+ octag = apertures[5]
1012
+ assert octag.__class__.__name__ == 'LimitPolygon'
1013
+ assert octag._xobject.x_vertices[0] == 0.4
1014
+ xo.assert_allclose(octag._xobject.y_vertices[0], 0.4*np.tan(0.5), atol=1e-14, rtol=0)
1015
+ assert octag._xobject.y_vertices[1] == 0.5
1016
+ xo.assert_allclose(octag._xobject.x_vertices[1], 0.5/np.tan(1.), atol=1e-14, rtol=0)
1017
+
1018
+ assert octag._xobject.y_vertices[2] == 0.5
1019
+ xo.assert_allclose(octag._xobject.x_vertices[2], -0.5/np.tan(1.), atol=1e-14, rtol=0)
1020
+ assert octag._xobject.x_vertices[3] == -0.4
1021
+ xo.assert_allclose(octag._xobject.y_vertices[3], 0.4*np.tan(0.5), atol=1e-14, rtol=0)
1022
+
1023
+
1024
+ assert octag._xobject.x_vertices[4] == -0.4
1025
+ xo.assert_allclose(octag._xobject.y_vertices[4], -0.4*np.tan(0.5), atol=1e-14, rtol=0)
1026
+ assert octag._xobject.y_vertices[5] == -0.5
1027
+ xo.assert_allclose(octag._xobject.x_vertices[5], -0.5/np.tan(1.), atol=1e-14, rtol=0)
1028
+
1029
+
1030
+ assert octag._xobject.y_vertices[6] == -0.5
1031
+ xo.assert_allclose(octag._xobject.x_vertices[6], 0.5/np.tan(1.), atol=1e-14, rtol=0)
1032
+ assert octag._xobject.x_vertices[7] == 0.4
1033
+ xo.assert_allclose(octag._xobject.y_vertices[7], -0.4*np.tan(0.5), atol=1e-14, rtol=0)
1034
+
1035
+ assert isinstance(line[line['m_polygon'].name_associated_aperture], xt.LimitPolygon)
1036
+ polyg = apertures[6]
1037
+ assert polyg.__class__.__name__ == 'LimitPolygon'
1038
+ assert len(polyg._xobject.x_vertices) == 3
1039
+ assert len(polyg._xobject.y_vertices) == 3
1040
+ # The below assertions don't match test_apertures.py::test_mad_import
1041
+ # TODO: Figure out what mad_loader.py:971 is doing? It seems wrong
1042
+ assert np.all(polyg.x_vertices == [5.8e-2, 5.8e-2, -8.8e-2])
1043
+ assert np.all(polyg.y_vertices == [3.5e-2, -3.5e-2, 0.0])
1044
+
1045
+
1046
+ def test_aperture_setting():
1047
+ sequence = """
1048
+ m_ellipse: marker, apertype="ellipse", aperture={.2, .1};
1049
+ m_aper: marker, apertype="rectangle", aperture={.3, .4};
1050
+
1051
+ line: sequence, l=1;
1052
+ m_ellipse, at=0;
1053
+ m_aper, at=0.1;
1054
+ endsequence;
1055
+
1056
+ m_ellipse, aperture={.3, .2}; ! no apertype
1057
+ m_aper, apertype="ellipse", aperture={.5, .6}; ! change apertype
1058
+ """
1059
+
1060
+ env = xt.load_madx_lattice(string=sequence)
1061
+ line = env.line
1062
+
1063
+ assert line['m_ellipse_aper'].a == .3
1064
+ assert line['m_ellipse_aper'].b == .2
1065
+
1066
+ assert line['m_aper_aper'].a == .5
1067
+ assert line['m_aper_aper'].b == .6
1068
+
1069
+
1070
+ def test_import_thick_with_apertures_and_slice():
1071
+ sequence = """
1072
+ k1=0.2;
1073
+ tilt=0.1;
1074
+
1075
+ elm: sbend,
1076
+ k1:=k1,
1077
+ l=1,
1078
+ angle=0.1,
1079
+ tilt=0.2,
1080
+ apertype="rectellipse",
1081
+ aperture={0.1,0.2,0.11,0.22},
1082
+ aper_tol={0.1,0.2,0.3},
1083
+ aper_tilt:=tilt,
1084
+ aper_offset={0.2, 0.3};
1085
+
1086
+ seq: sequence, l=1;
1087
+ elm: elm, at=0.5;
1088
+ endsequence;
1089
+ """
1090
+
1091
+ env = xt.load_madx_lattice(string=sequence)
1092
+ line = env.seq
1093
+
1094
+ def _assert_eq(a, b):
1095
+ xo.assert_allclose(a, b, atol=1e-16)
1096
+
1097
+ _assert_eq(line[f'elm_aper'].rot_s_rad, 0.1)
1098
+ _assert_eq(line[f'elm_aper'].shift_x, 0.2)
1099
+ _assert_eq(line[f'elm_aper'].shift_y, 0.3)
1100
+ _assert_eq(line[f'elm_aper'].max_x, 0.1)
1101
+ _assert_eq(line[f'elm_aper'].max_y, 0.2)
1102
+ _assert_eq(line[f'elm_aper'].a_squ, 0.11 ** 2)
1103
+ _assert_eq(line[f'elm_aper'].b_squ, 0.22 ** 2)
1104
+
1105
+ _assert_eq(line[f'elm'].rot_s_rad, 0.2)
1106
+
1107
+ line.slice_thick_elements(slicing_strategies=[Strategy(Uniform(2))])
1108
+
1109
+ assert np.all(line.get_table().rows['elm_entry':'elm_exit'].name == [
1110
+ 'elm_entry', # entry marker
1111
+ 'elm_aper..0', # entry edge aperture
1112
+ 'elm..entry_map', # entry edge (+transform)
1113
+ 'drift_elm..0', # drift 0
1114
+ 'elm_aper..1', # slice 1 aperture
1115
+ 'elm..0', # slice 0 (+transform)
1116
+ 'drift_elm..1', # drift 1
1117
+ 'elm_aper..2', # slice 2 aperture
1118
+ 'elm..1', # slice 2 (+transform)
1119
+ 'drift_elm..2', # drift 2
1120
+ 'elm_aper..3', # exit edge aperture
1121
+ 'elm..exit_map', # exit edge (+transform)
1122
+ 'elm_exit', # exit marker
1123
+ ])
1124
+
1125
+ line.build_tracker(compile=False) # To resolve parents
1126
+
1127
+ for i in range(4):
1128
+ _assert_eq(line[f'elm_aper..{i}'].resolve(line).rot_s_rad, 0.1)
1129
+ _assert_eq(line[f'elm_aper..{i}'].resolve(line).shift_x, 0.2)
1130
+ _assert_eq(line[f'elm_aper..{i}'].resolve(line).shift_y, 0.3)
1131
+ _assert_eq(line[f'elm_aper..{i}'].resolve(line).max_x, 0.1)
1132
+ _assert_eq(line[f'elm_aper..{i}'].resolve(line).max_y, 0.2)
1133
+ _assert_eq(line[f'elm_aper..{i}'].resolve(line).a_squ, 0.11 ** 2)
1134
+ _assert_eq(line[f'elm_aper..{i}'].resolve(line).b_squ, 0.22 ** 2)
1135
+
1136
+ for i in range(2):
1137
+ _assert_eq(line[f'elm..{i}']._parent.rot_s_rad, 0.2)
@@ -0,0 +1 @@
1
+ __version__ = '0.77.1'
@@ -266,7 +266,7 @@ class LimitPolygon(BeamElement):
266
266
  **kwargs)
267
267
 
268
268
  lengths = np.sqrt(np.diff(self.x_closed)**2
269
- + np.diff(self.y_closed)**2)
269
+ + np.diff(self.y_closed)**2)
270
270
 
271
271
  assert np.all(lengths>0)
272
272
 
@@ -144,9 +144,14 @@ class Environment:
144
144
  # Identify common elements
145
145
  counts = Counter()
146
146
  for ll in lines.values():
147
+ # Extract names of all elements and parents
148
+ elems_and_parents = set(ll.element_names)
149
+ for nn in ll.element_names:
150
+ if hasattr(ll.element_dict[nn], 'parent_name'):
151
+ elems_and_parents.add(ll.element_dict[nn].parent_name)
147
152
  # Count if it is not a marker or a drift, which will be handled by
148
153
  # `import_line`
149
- for nn in ll.element_names:
154
+ for nn in elems_and_parents:
150
155
  if (not (isinstance(ll.element_dict[nn], (xt.Marker))) and
151
156
  not bool(re.match(r'^drift_\d+$', nn))):
152
157
  counts[nn] += 1
@@ -478,6 +483,31 @@ class Environment:
478
483
  def copy_element_from(self, name, source, new_name=None):
479
484
  return xt.Line.copy_element_from(self, name, source, new_name)
480
485
 
486
+
487
+ def _import_element(self, line, name, rename_elements, suffix_for_common_elements,
488
+ already_imported):
489
+ new_name = name
490
+ if name in rename_elements:
491
+ new_name = rename_elements[name]
492
+ elif (bool(re.match(r'^drift_\d+$', name))
493
+ and line.ref[name].length._expr is None):
494
+ new_name = self._get_a_drift_name()
495
+ elif (name in self.element_dict and
496
+ not (isinstance(line[name], xt.Marker) and
497
+ isinstance(self.element_dict.get(name), xt.Marker))):
498
+ new_name += suffix_for_common_elements
499
+
500
+ self.copy_element_from(name, line, new_name=new_name)
501
+ already_imported[name] = new_name
502
+ if hasattr(line.element_dict[name], 'parent_name'):
503
+ parent_name = line.element_dict[name].parent_name
504
+ if parent_name not in already_imported:
505
+ self._import_element(line, parent_name, rename_elements,
506
+ suffix_for_common_elements, already_imported)
507
+ self.element_dict[new_name].parent_name = already_imported[parent_name]
508
+
509
+ return new_name
510
+
481
511
  def import_line(
482
512
  self,
483
513
  line,
@@ -520,20 +550,11 @@ class Environment:
520
550
  self.vars.default_to_zero = old_default_to_zero
521
551
 
522
552
  components = []
553
+ already_imported = {}
523
554
  for name in line.element_names:
524
- new_name = name
525
-
526
- if name in rename_elements:
527
- new_name = rename_elements[name]
528
- elif (bool(re.match(r'^drift_\d+$', name))
529
- and line.ref[name].length._expr is None):
530
- new_name = self._get_a_drift_name()
531
- elif (name in self.element_dict and
532
- not (isinstance(line[name], xt.Marker) and
533
- isinstance(self.element_dict.get(name), xt.Marker))):
534
- new_name += suffix_for_common_elements
535
-
536
- self.copy_element_from(name, line, new_name=new_name)
555
+ new_name = self._import_element(
556
+ line, name, rename_elements, suffix_for_common_elements,
557
+ already_imported)
537
558
 
538
559
  components.append(new_name)
539
560
 
@@ -1438,9 +1459,10 @@ def load_module_from_path(file_path):
1438
1459
  def _reverse_element(env, name):
1439
1460
  """Return a reversed element without modifying the original."""
1440
1461
 
1441
- SUPPORTED={'RBend', 'Bend', 'Quadrupole', 'Sextupole', 'Octupole',
1462
+ SUPPORTED = {'RBend', 'Bend', 'Quadrupole', 'Sextupole', 'Octupole',
1442
1463
  'Multipole', 'Cavity', 'Solenoid', 'RFMultipole',
1443
- 'Marker', 'Drift'}
1464
+ 'Marker', 'Drift', 'LimitRect', 'LimitEllipse', 'LimitPolygon',
1465
+ 'LimitRectEllipse'}
1444
1466
 
1445
1467
  ee = env.get(name)
1446
1468
  ee_ref = env.ref[name]
@@ -59,7 +59,7 @@ _ALLOWED_ELEMENT_TYPES_IN_NEW = [xt.Drift, xt.Bend, xt.Quadrupole, xt.Sextupole,
59
59
  xt.Marker, xt.Replica, xt.XYShift, xt.XRotation,
60
60
  xt.YRotation, xt.SRotation, xt.LimitRacetrack,
61
61
  xt.LimitRectEllipse, xt.LimitRect, xt.LimitEllipse,
62
- xt.RFMultipole, xt.RBend]
62
+ xt.LimitPolygon, xt.RFMultipole, xt.RBend]
63
63
 
64
64
  _ALLOWED_ELEMENT_TYPES_DICT = {'Drift': xt.Drift, 'Bend': xt.Bend,
65
65
  'Quadrupole': xt.Quadrupole, 'Sextupole': xt.Sextupole,
@@ -69,6 +69,7 @@ _ALLOWED_ELEMENT_TYPES_DICT = {'Drift': xt.Drift, 'Bend': xt.Bend,
69
69
  'LimitRacetrack': xt.LimitRacetrack,
70
70
  'LimitRectEllipse': xt.LimitRectEllipse,
71
71
  'LimitRect': xt.LimitRect, 'LimitEllipse': xt.LimitEllipse,
72
+ 'LimitPolygon': xt.LimitPolygon,
72
73
  'XYShift': xt.XYShift, 'XRotation': xt.XRotation,
73
74
  'YRotation': xt.YRotation, 'SRotation': xt.SRotation,
74
75
  'RFMultipole': xt.RFMultipole, 'RBend': xt.RBend}
@@ -3943,12 +3944,13 @@ class Line:
3943
3944
  Rename the element in the new line/environment. If not provided, the
3944
3945
  element is copied with the same name.
3945
3946
  """
3947
+ new_name_input = new_name if new_name != name else None
3946
3948
  new_name = new_name or name
3947
3949
  cls = type(source.element_dict[name])
3948
3950
 
3949
- if cls not in _ALLOWED_ELEMENT_TYPES_IN_NEW + [xt.DipoleEdge]: # No issue in copying DipoleEdge
3950
- # while creating it requires handling properties
3951
- # which are strings.
3951
+ if (cls not in _ALLOWED_ELEMENT_TYPES_IN_NEW + [xt.DipoleEdge] # No issue in copying DipoleEdge while creating it requires handling properties which are strings.
3952
+ and 'ThickSlice' not in cls.__name__ and 'ThinSlice' not in cls.__name__
3953
+ and 'DriftSlice' not in cls.__name__):
3952
3954
  raise ValueError(
3953
3955
  f'Only {_STR_ALLOWED_ELEMENT_TYPES_IN_NEW} elements are '
3954
3956
  f'allowed in `copy_from_env` for now.'