xtrack 0.89.4__tar.gz → 0.90.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 (344) hide show
  1. {xtrack-0.89.4/xtrack.egg-info → xtrack-0.90.1}/PKG-INFO +1 -1
  2. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_collimation.py +137 -1
  3. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_elements.py +36 -2
  4. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_elements_thick.py +7 -6
  5. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_environment.py +256 -23
  6. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_line.py +1 -1
  7. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_misalign.py +52 -39
  8. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_multispecies.py +2 -8
  9. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_particles.py +45 -1
  10. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_rbend_straight_body.py +1 -1
  11. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_slicing.py +0 -1
  12. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_survey.py +3 -6
  13. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_tilt_shifts.py +2 -1
  14. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_twiss.py +54 -0
  15. xtrack-0.90.1/xtrack/_version.py +1 -0
  16. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/base_element.py +14 -12
  17. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/apertures_src/limitellipse.h +3 -0
  18. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +4 -0
  19. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +4 -0
  20. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/apertures_src/limitrect.h +4 -0
  21. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +4 -2
  22. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements.py +88 -3
  23. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift.h +19 -3
  24. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice.h +19 -3
  25. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/misalignment.h +5 -4
  26. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_misalignments.h +91 -43
  27. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/environment.py +547 -41
  28. xtrack-0.90.1/xtrack/functions.py +80 -0
  29. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/general.py +26 -0
  30. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/line.py +221 -402
  31. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/loss_location_refinement/loss_location_refinement.py +20 -6
  32. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/mad_loader.py +4 -8
  33. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/multiline_legacy/shared_knobs.py +1 -1
  34. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/particles/__init__.py +2 -1
  35. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/particles/particles.py +69 -15
  36. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/survey.py +2 -1
  37. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/tracker_data.py +9 -0
  38. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/trajectory_correction.py +3 -1
  39. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/twiss.py +19 -3
  40. {xtrack-0.89.4 → xtrack-0.90.1/xtrack.egg-info}/PKG-INFO +1 -1
  41. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack.egg-info/SOURCES.txt +1 -0
  42. xtrack-0.89.4/xtrack/_version.py +0 -1
  43. {xtrack-0.89.4 → xtrack-0.90.1}/LICENSE +0 -0
  44. {xtrack-0.89.4 → xtrack-0.90.1}/MANIFEST.in +0 -0
  45. {xtrack-0.89.4 → xtrack-0.90.1}/README.md +0 -0
  46. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/__init__.py +0 -0
  47. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/base_classes.py +0 -0
  48. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/BB6D.py +0 -0
  49. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  50. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/__init__.py +0 -0
  51. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/beambeam.py +0 -0
  52. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/boost.py +0 -0
  53. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  54. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  55. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/qgauss.py +0 -0
  56. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/slicing.py +0 -0
  57. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
  58. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/elements.py +0 -0
  59. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/line.py +0 -0
  60. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/mathlibs.py +0 -0
  61. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/particles.py +0 -0
  62. {xtrack-0.89.4 → xtrack-0.90.1}/ducktrack/temp_pyparticles.py +0 -0
  63. {xtrack-0.89.4 → xtrack-0.90.1}/pyproject.toml +0 -0
  64. {xtrack-0.89.4 → xtrack-0.90.1}/setup.cfg +0 -0
  65. {xtrack-0.89.4 → xtrack-0.90.1}/setup.py +0 -0
  66. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_acceleration.py +0 -0
  67. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_amplitude_detuning.py +0 -0
  68. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_aperture_table.py +0 -0
  69. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  70. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_apertures.py +0 -0
  71. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_attr_replicas_and_slices.py +0 -0
  72. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_bucket_with_ref_energy_change.py +0 -0
  73. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_cavity_absolute_time.py +0 -0
  74. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
  75. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_coasting.py +0 -0
  76. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_collective_tracker.py +0 -0
  77. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_coupling_edwards_teng.py +0 -0
  78. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_electron_cooler.py +0 -0
  79. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_element_characterization_functions.py +0 -0
  80. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_element_internal_record.py +0 -0
  81. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_elements_classflags.py +0 -0
  82. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  83. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  84. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_footprint.py +0 -0
  85. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_freeze_longitudinal.py +0 -0
  86. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_full_rings.py +0 -0
  87. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_h6_sps_beamline.py +0 -0
  88. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_hvkick.py +0 -0
  89. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_ions.py +0 -0
  90. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_legacy_multiline_to_env.py +0 -0
  91. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_lhc_env.py +0 -0
  92. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_lhc_match_phase_15.py +0 -0
  93. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_load.py +0 -0
  94. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_load_vars.py +0 -0
  95. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_lumi.py +0 -0
  96. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_mad_writer.py +0 -0
  97. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_madloader.py +0 -0
  98. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_madnginterface.py +0 -0
  99. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_magnet.py +0 -0
  100. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_match_and_track_from_element.py +0 -0
  101. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_match_coupling_knob.py +0 -0
  102. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_match_nested.py +0 -0
  103. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_match_optics_and_ip_knob.py +0 -0
  104. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  105. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_match_orbit_bump.py +0 -0
  106. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_match_tune_chroma_cminus.py +0 -0
  107. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_monitor.py +0 -0
  108. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_multi_bunch_gauss.py +0 -0
  109. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_multiline.py +0 -0
  110. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_multisetter.py +0 -0
  111. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_native_madloader.py +0 -0
  112. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_optimize_for_tracking.py +0 -0
  113. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_particles_basics.py +0 -0
  114. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_particles_pdg.py +0 -0
  115. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_pipeline.py +0 -0
  116. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_prebuild_kernels.py +0 -0
  117. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_ps_against_ptc.py +0 -0
  118. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_ps_multiturn_twiss.py +0 -0
  119. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_psb_chicane.py +0 -0
  120. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_pyht_interface.py +0 -0
  121. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_quadrupole_fringe_ptc.py +0 -0
  122. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_quadrupole_wedge.py +0 -0
  123. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_radial_steering.py +0 -0
  124. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_radiation.py +0 -0
  125. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
  126. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  127. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_radiation_integrals.py +0 -0
  128. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_random_gen.py +0 -0
  129. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_random_gen_exp.py +0 -0
  130. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_random_gen_gauss.py +0 -0
  131. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_random_gen_ruth.py +0 -0
  132. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_rbend_rbarc.py +0 -0
  133. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_rf_track.py +0 -0
  134. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_rotation_signs.py +0 -0
  135. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_second_order_taylor_map.py +0 -0
  136. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_seeds.py +0 -0
  137. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
  138. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_slice_elements.py +0 -0
  139. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  140. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  141. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_spacecharge_in_ring.py +0 -0
  142. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_spin.py +0 -0
  143. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_sps_thick.py +0 -0
  144. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_tapering.py +0 -0
  145. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_thick_kickers_rf_crab.py +0 -0
  146. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_thick_lhc.py +0 -0
  147. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_tracker.py +0 -0
  148. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_trajectory_correcton.py +0 -0
  149. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_twiss_vs_madx_psb.py +0 -0
  150. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_vs_madx.py +0 -0
  151. {xtrack-0.89.4 → xtrack-0.90.1}/tests/test_xmask_orbit_correction.py +0 -0
  152. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/__init__.py +0 -0
  153. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/_temp/__init__.py +0 -0
  154. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  155. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  156. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  157. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
  158. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  159. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  160. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  161. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/aperture_meas.py +0 -0
  162. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/__init__.py +0 -0
  163. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/apertures.py +0 -0
  164. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  165. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/beam_interaction.py +0 -0
  166. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
  167. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  168. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/crab_cavity.h +0 -0
  169. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
  170. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  171. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  172. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
  173. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
  174. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  175. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
  176. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
  177. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
  178. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  179. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  180. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  181. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  182. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
  183. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  184. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
  185. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  186. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  187. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
  188. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  189. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  190. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  191. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  192. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  193. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/marker.h +0 -0
  194. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  195. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  196. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  197. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  198. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  199. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/rbend.h +0 -0
  200. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  201. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  202. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  203. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  204. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  205. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  206. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/slnd.h +0 -0
  207. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  208. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/temprf.h +0 -0
  209. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  210. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +0 -0
  211. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +0 -0
  212. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
  213. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  214. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  215. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
  216. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  217. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
  218. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  219. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  220. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  221. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +0 -0
  222. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +0 -0
  223. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
  224. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  225. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  226. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  227. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  228. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  229. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  230. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
  231. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  232. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  233. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  234. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  235. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  236. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
  237. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
  238. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  239. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  240. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  241. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  242. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
  243. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  244. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
  245. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_magnet.h +0 -0
  246. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_magnet.template.h +0 -0
  247. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
  248. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  249. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  250. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  251. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
  252. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  253. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_rf.h +0 -0
  254. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_rf.template.h +0 -0
  255. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  256. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  257. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  258. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  259. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  260. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
  261. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  262. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
  263. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  264. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
  265. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  266. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  267. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  268. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  269. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/exciter.py +0 -0
  270. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/rft_element.py +0 -0
  271. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/slice_base.py +0 -0
  272. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/slice_elements_drift.py +0 -0
  273. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/slice_elements_edge.py +0 -0
  274. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  275. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/beam_elements/slice_elements_thin.py +0 -0
  276. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/footprint.py +0 -0
  277. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/headers/atomicadd.h +0 -0
  278. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/headers/checks.h +0 -0
  279. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/headers/constants.h +0 -0
  280. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/headers/particle_states.h +0 -0
  281. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/headers/synrad_spectrum.h +0 -0
  282. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/headers/track.h +0 -0
  283. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/internal_record.py +0 -0
  284. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/json.py +0 -0
  285. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/linear_normal_form.py +0 -0
  286. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/load.py +0 -0
  287. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/loss_location_refinement/__init__.py +0 -0
  288. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/lumi.py +0 -0
  289. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/mad_parser/__init__.py +0 -0
  290. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/mad_parser/loader.py +0 -0
  291. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/mad_parser/madx.lark +0 -0
  292. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/mad_parser/parse.py +0 -0
  293. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/mad_writer.py +0 -0
  294. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/madng_interface.py +0 -0
  295. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/match.py +0 -0
  296. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/__init__.py +0 -0
  297. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/beam_position_monitor.h +0 -0
  298. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/beam_position_monitor.py +0 -0
  299. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
  300. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
  301. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/beam_size_monitor.h +0 -0
  302. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/beam_size_monitor.py +0 -0
  303. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/last_turns_monitor.h +0 -0
  304. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/last_turns_monitor.py +0 -0
  305. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/particles_monitor.h +0 -0
  306. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/monitors/particles_monitor.py +0 -0
  307. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/multiline.py +0 -0
  308. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/multiline_legacy/__init__.py +0 -0
  309. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  310. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/multisetter/__init__.py +0 -0
  311. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/multisetter/multisetter.py +0 -0
  312. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/particles/constants.py +0 -0
  313. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/particles/masses.py +0 -0
  314. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/particles/pdg.py +0 -0
  315. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/particles/rng_src/base_rng.h +0 -0
  316. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
  317. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/pipeline/__init__.py +0 -0
  318. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/pipeline/core.py +0 -0
  319. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/pipeline/manager.py +0 -0
  320. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/pipeline/multitracker.py +0 -0
  321. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/progress_indicator.py +0 -0
  322. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/random/__init__.py +0 -0
  323. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/random/random_generators.py +0 -0
  324. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/random/random_src/exponential.h +0 -0
  325. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  326. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/random/random_src/normal.h +0 -0
  327. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/random/random_src/rutherford.h +0 -0
  328. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/random/random_src/uniform.h +0 -0
  329. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
  330. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/slicing.py +0 -0
  331. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/svgutils/__init__.py +0 -0
  332. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/svgutils/parser.py +0 -0
  333. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/svgutils/path.py +0 -0
  334. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/svgutils/svgutils.py +0 -0
  335. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/synctime.py +0 -0
  336. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/tapering.py +0 -0
  337. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/targets.py +0 -0
  338. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/track_flags.py +0 -0
  339. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/tracker.py +0 -0
  340. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/tracker_src/tracker.h +0 -0
  341. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack/twissplot.py +0 -0
  342. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack.egg-info/dependency_links.txt +0 -0
  343. {xtrack-0.89.4 → xtrack-0.90.1}/xtrack.egg-info/requires.txt +0 -0
  344. {xtrack-0.89.4 → xtrack-0.90.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.89.4
3
+ Version: 0.90.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
@@ -411,7 +411,6 @@ def test_losslocationrefinement_skip_refinement_for_collimators():
411
411
  #################
412
412
 
413
413
  line.build_tracker()
414
- line.config.XTRACK_GLOBAL_XY_LIMIT = 1e3
415
414
 
416
415
  ##########################
417
416
  # Build particles object #
@@ -442,3 +441,140 @@ def test_losslocationrefinement_skip_refinement_for_collimators():
442
441
  loss_loc_refinement.refine_loss_location(particles)
443
442
 
444
443
  assert np.all(part_before.s == particles.s)
444
+
445
+ def test_memory_dealloc_repeated_refinements():
446
+
447
+ def _occupied_size(buffer):
448
+ return buffer.capacity - buffer.get_free()
449
+
450
+ n_part=10000
451
+ shift_x = 0.3e-2
452
+ shift_y = 0.5e-2
453
+ sandwitch_aper = True
454
+
455
+ ctx = xo.context_default
456
+ buf = ctx.new_buffer()
457
+
458
+ logger = logging.getLogger('xtrack')
459
+ logger.setLevel(logging.DEBUG)
460
+
461
+ # Define aper_0
462
+ aper_0 = xt.LimitEllipse(_buffer=buf, a=2e-2, b=2e-2)
463
+ shift_aper_0 = (shift_x, shift_y)
464
+ rot_deg_aper_0 = 10.
465
+
466
+ # Define aper_1
467
+ aper_1 = xt.LimitEllipse(_buffer=buf, a=1e-2, b=1e-2)
468
+ shift_aper_1 = (shift_x, shift_y)
469
+ rot_deg_aper_1 = 10.
470
+
471
+ # aper_0_sandwitch
472
+ if sandwitch_aper:
473
+ line_aper_0 = xt.Line(
474
+ elements=[xt.XYShift(_buffer=buf, dx=shift_aper_0[0], dy=shift_aper_0[1]),
475
+ xt.SRotation(_buffer=buf, angle=rot_deg_aper_0),
476
+ aper_0,
477
+ xt.Multipole(_buffer=buf, knl=[0.00]),
478
+ xt.SRotation(_buffer=buf, angle=-rot_deg_aper_0),
479
+ xt.XYShift(_buffer=buf, dx=-shift_aper_0[0], dy=-shift_aper_0[1])])
480
+ line_aper_0.build_tracker(_buffer=buf)
481
+ # aper_1_sandwitch
482
+ line_aper_1 = xt.Line(
483
+ elements=[xt.XYShift(_buffer=buf, dx=shift_aper_1[0], dy=shift_aper_1[1]),
484
+ xt.SRotation(_buffer=buf, angle=rot_deg_aper_1),
485
+ aper_1,
486
+ xt.Multipole(_buffer=buf, knl=[0.00]),
487
+ xt.SRotation(_buffer=buf, angle=-rot_deg_aper_1),
488
+ xt.XYShift(_buffer=buf, dx=-shift_aper_1[0], dy=-shift_aper_1[1])])
489
+ else:
490
+ aper_0.shift_x = shift_aper_0[0]
491
+ aper_0.shift_y = shift_aper_0[1]
492
+ aper_0.rot_s_rad = np.deg2rad(rot_deg_aper_0)
493
+ line_aper_0 = xt.Line(
494
+ elements=[aper_0, xt.Multipole(_buffer=buf, knl=[0.0])])
495
+ line_aper_0.build_tracker(_buffer=buf)
496
+ aper_1.shift_x = shift_aper_1[0]
497
+ aper_1.shift_y = shift_aper_1[1]
498
+ aper_1.rot_s_rad = np.deg2rad(rot_deg_aper_1)
499
+ line_aper_1 = xt.Line(
500
+ elements=[aper_1, xt.Multipole(_buffer=buf, knl=[0.00])])
501
+
502
+ line_aper_1.build_tracker(_buffer=buf)
503
+
504
+ # Build example line
505
+ line=xt.Line(
506
+ elements = ((xt.Drift(_buffer=buf, length=0.5),)
507
+ + line_aper_0.elements
508
+ + (xt.Drift(_buffer=buf, length=1),
509
+ xt.Multipole(_buffer=buf, knl=[0.]),
510
+ xt.Quadrupole(_buffer=buf, length=1),
511
+ xt.Cavity(_buffer=buf, voltage=3e6, frequency=400e6),
512
+ xt.ParticlesMonitor(_buffer=buf,
513
+ start_at_turn=0, stop_at_turn=10, num_particles=3),
514
+ xt.Drift(_buffer=buf, length=1.),
515
+ xt.Marker())
516
+ + line_aper_1.elements))
517
+ line.build_tracker(_buffer=buf)
518
+
519
+ # Test on full line
520
+ r = np.linspace(0, 0.018, n_part)
521
+ theta = np.linspace(0, 8*np.pi, n_part)
522
+ particles0 = xp.Particles(_context=ctx,
523
+ p0c=6500e9,
524
+ x=r*np.cos(theta)+shift_x,
525
+ y=r*np.sin(theta)+shift_y)
526
+
527
+
528
+
529
+ print('occupied size before refinement', _occupied_size(buf))
530
+
531
+ loss_loc_refinement = xt.LossLocationRefinement(line,
532
+ n_theta = 360,
533
+ r_max = 0.5, # m
534
+ dr = 50e-6,
535
+ ds = 0.1,
536
+ save_refine_lines=False,
537
+ allowed_backtrack_types=[
538
+ xt.Multipole,
539
+ xt.Cavity
540
+ ])
541
+ print('occupied size after init refinement', _occupied_size(buf))
542
+
543
+ n_repetitions = 20
544
+
545
+ import time
546
+ for i_iter in range(n_repetitions):
547
+
548
+ particles = particles0.copy()
549
+
550
+ line.track(particles)
551
+
552
+ t0 = time.time()
553
+
554
+ loss_loc_refinement.refine_loss_location(particles)
555
+ print('occupied size after refinement', _occupied_size(buf))
556
+
557
+ if i_iter==0:
558
+ occupied_size_first_iter = _occupied_size(buf)
559
+ else:
560
+ assert _occupied_size(buf) == occupied_size_first_iter, \
561
+ 'Buffer size increased after refinement! Memory leak?'
562
+
563
+ t1 = time.time()
564
+ print(f'Took\t{(t1-t0)*1e3:.2f} ms')
565
+
566
+ # Automatic checks
567
+ mask_lost = particles.state == 0
568
+ r_calc = np.sqrt((particles.x-shift_x)**2 + (particles.y-shift_y)**2)
569
+ assert np.all(r_calc[~mask_lost]<1e-2)
570
+ assert np.all(r_calc[mask_lost]>1e-2)
571
+ i_aper_1 = line.elements.index(aper_1)
572
+ assert np.all(particles.at_element[mask_lost]==i_aper_1)
573
+ assert np.all(particles.at_element[~mask_lost]==0)
574
+ s0 = line.get_s_elements()[line.elements.index(aper_0)]
575
+ s1 = line.get_s_elements()[line.elements.index(aper_1)]
576
+ r0 = np.sqrt(aper_0.a_squ)
577
+ r1 = np.sqrt(aper_1.a_squ)
578
+ s_expected = s0 + (r_calc-r0)/(r1 - r0)*(s1 - s0)
579
+ # TODO This threshold is a bit large
580
+ xo.assert_allclose(particles.s[mask_lost], s_expected[mask_lost], atol=0.11)
@@ -214,6 +214,40 @@ def test_drift(test_context):
214
214
  dtk_particle.zeta,
215
215
  rtol=1e-14, atol=1e-14)
216
216
 
217
+ @for_all_test_contexts
218
+ def test_drift_exact_and_expanded(test_context):
219
+
220
+ line = xt.Line(elements=[xt.Drift(length=1.), xt.Drift(length=2.), xt.Drift(length=3.)])
221
+ ltot = line.get_length()
222
+ line.build_tracker(_context=test_context)
223
+
224
+ assert line['e2'].model == 'adaptive'
225
+
226
+ p0 = xp.Particles(p0c=1e9, px=0.3, _context=test_context)
227
+ x_prime_expanded = p0.px / (1 + p0.delta)
228
+ x_prime_exact = p0.px / np.sqrt((1 + p0.delta)**2 - p0.px**2)
229
+
230
+ p = p0.copy(_context=test_context)
231
+ line.track(p)
232
+ xo.assert_allclose(p.x, x_prime_expanded*ltot, rtol=1e-14, atol=1e-14)
233
+
234
+ line.configure_drift_model(model='exact')
235
+ assert line['e2'].model == 'exact'
236
+ p = p0.copy(_context=test_context)
237
+ line.track(p)
238
+ xo.assert_allclose(p.x, x_prime_exact*ltot, rtol=1e-14, atol=1e-14)
239
+
240
+ line.configure_drift_model(model='expanded')
241
+ assert line['e2'].model == 'expanded'
242
+ p = p0.copy(_context=test_context)
243
+ line.track(p)
244
+ xo.assert_allclose(p.x, x_prime_expanded*ltot, rtol=1e-14, atol=1e-14)
245
+
246
+ line.config.XTRACK_USE_EXACT_DRIFTS = True
247
+ p = p0.copy(_context=test_context)
248
+ line.track(p)
249
+ xo.assert_allclose(p.x, x_prime_exact*ltot, rtol=1e-14, atol=1e-14)
250
+
217
251
 
218
252
  @for_all_test_contexts
219
253
  def test_drift_exact(test_context):
@@ -232,7 +266,7 @@ def test_drift_exact(test_context):
232
266
  drift = xt.Drift(_context=test_context, length=10.)
233
267
  line = xt.Line(elements=[drift])
234
268
  line.build_tracker(compile=False, _context=test_context)
235
- line.config.XTRACK_USE_EXACT_DRIFTS = True
269
+ line.configure_drift_model(model='exact')
236
270
  line.track(particles)
237
271
 
238
272
  dtk_drift = dtk.elements.DriftExact(length=10.)
@@ -1162,7 +1196,7 @@ def test_nonlinearlens(test_context):
1162
1196
  """)
1163
1197
 
1164
1198
  line = xt.Line.from_madx_sequence(mad.sequence.ss)
1165
- line.config.XTRACK_USE_EXACT_DRIFTS = True # to be consistent with madx
1199
+ line.configure_drift_model('exact') # to be consistent with madx
1166
1200
  line.build_tracker(_context=test_context)
1167
1201
 
1168
1202
  num_p_test = 10
@@ -59,7 +59,7 @@ def test_combined_function_dipole_against_ptc(test_context, k0, k1, k2, length,
59
59
 
60
60
  ml = MadLoader(mad.sequence.ss, allow_thick=True)
61
61
  line_thick = ml.make_line()
62
- line_thick.config.XTRACK_USE_EXACT_DRIFTS = True # to be consistent with mad
62
+ line_thick.configure_drift_model('exact') # to be consistent with madx
63
63
  line_thick.build_tracker(_context=test_context)
64
64
  line_thick.configure_bend_model(core=model, edge='dipole-only')
65
65
 
@@ -1283,7 +1283,7 @@ def test_solenoid_against_madx(test_context, ks, ksi, length):
1283
1283
  ml = MadLoader(mad.sequence.ss, allow_thick=True)
1284
1284
  line_thick = ml.make_line()
1285
1285
  line_thick.build_tracker(_context=test_context)
1286
- line_thick.config.XTRACK_USE_EXACT_DRIFTS = True # to be consistent with madx
1286
+ line_thick.configure_drift_model('exact') # to be consistent with madx
1287
1287
 
1288
1288
  for ii in range(len(p0.x)):
1289
1289
  mad.input(f"""
@@ -1320,7 +1320,7 @@ def test_solenoid_against_madx(test_context, ks, ksi, length):
1320
1320
  def test_solenoid_thick_drift_like(test_context):
1321
1321
  solenoid = xt.UniformSolenoid(ks=1.001e-9, length=1, _context=test_context)
1322
1322
  l_drift = xt.Line(elements=[xt.Drift(length=1)])
1323
- l_drift.config.XTRACK_USE_EXACT_DRIFTS = True
1323
+ l_drift.configure_drift_model('exact')
1324
1324
  l_drift.build_tracker(_context=test_context)
1325
1325
 
1326
1326
  p0 = xp.Particles(
@@ -1743,7 +1743,6 @@ def test_solenoid_multipole_rotations():
1743
1743
  def test_drift_like_solenoid_with_kicks_radiation(radiation_mode, config):
1744
1744
  test_context = xo.ContextCpu()
1745
1745
 
1746
- config['XTRACK_USE_EXACT_DRIFTS'] = True
1747
1746
  knl = [0.1, 0.4, 0.5]
1748
1747
  ksl = [0.2, 0.3, 0.6]
1749
1748
 
@@ -1752,6 +1751,7 @@ def test_drift_like_solenoid_with_kicks_radiation(radiation_mode, config):
1752
1751
  xt.Multipole(knl=knl, ksl=ksl),
1753
1752
  xt.Drift(length=0.5),
1754
1753
  ])
1754
+ line_test.configure_drift_model('exact')
1755
1755
 
1756
1756
  line_ref = xt.Line(elements=[
1757
1757
  xt.UniformSolenoid(ks=0, length=1, knl=knl, ksl=ksl, num_multipole_kicks=1)
@@ -1803,8 +1803,6 @@ def test_drift_like_solenoid_with_kicks_radiation(radiation_mode, config):
1803
1803
  def test_solenoid_with_kicks_radiation(radiation_mode, config):
1804
1804
  test_context = xo.ContextCpu()
1805
1805
 
1806
- config['XTRACK_USE_EXACT_DRIFTS'] = True
1807
-
1808
1806
  ks = 0.4
1809
1807
  l = 1.1
1810
1808
  knl = [0.1, 0.4, 0.5]
@@ -1818,6 +1816,9 @@ def test_solenoid_with_kicks_radiation(radiation_mode, config):
1818
1816
  line_1 = xt.Line(elements=[sol_1])
1819
1817
  line_3 = xt.Line(elements=[sol_3])
1820
1818
 
1819
+ for ll in (line_ref, line_1, line_3):
1820
+ ll.configure_drift_model('exact')
1821
+
1821
1822
  coords = np.linspace(-0.05, 0.05, 10)
1822
1823
  coords_6d = np.array(list(itertools.product(*(coords,) * 6))).T
1823
1824
 
@@ -620,19 +620,19 @@ def test_assemble_ring():
620
620
  assert 'cell3_copy' in env.lines
621
621
  assert cell3_select.particle_ref is not None
622
622
  assert env.lines['cell3_copy'] is cell3_select
623
- assert cell3_select._element_dict is env.element_dict
623
+ assert cell3_select.element_dict is env.element_dict
624
624
  assert cell3_select.element_names[0] == 'start.cell.3.arc.2'
625
625
  assert cell3_select.element_names[-1] == 'end.cell.3.arc.2'
626
626
  assert (np.array(cell3_select.element_names) == np.array(
627
627
  tw.rows['start.cell.3.arc.2':'end.cell.3.arc.2'].name)).all()
628
628
 
629
- # Check that they share the _element_dict
630
- assert cell._element_dict is env.element_dict
631
- assert halfcell._element_dict is env.element_dict
632
- assert halfcell_ss._element_dict is env.element_dict
633
- assert cell_ss._element_dict is env.element_dict
634
- assert insertion._element_dict is env.element_dict
635
- assert ring2._element_dict is env.element_dict
629
+ # Check that they share the element_dict
630
+ assert cell.element_dict is env.element_dict
631
+ assert halfcell.element_dict is env.element_dict
632
+ assert halfcell_ss.element_dict is env.element_dict
633
+ assert cell_ss.element_dict is env.element_dict
634
+ assert insertion.element_dict is env.element_dict
635
+ assert ring2.element_dict is env.element_dict
636
636
 
637
637
  cell3_select.twiss4d()
638
638
 
@@ -1039,19 +1039,19 @@ def test_assemble_ring_builders():
1039
1039
  name='cell3_copy')
1040
1040
  assert 'cell3_copy' in env.lines
1041
1041
  assert env.lines['cell3_copy'] is cell3_select
1042
- assert cell3_select._element_dict is env.element_dict
1042
+ assert cell3_select.element_dict is env.element_dict
1043
1043
  assert cell3_select.element_names[0] == 'start.cell.3.arc.2'
1044
1044
  assert cell3_select.element_names[-1] == 'end.cell.3.arc.2'
1045
1045
  assert (np.array(cell3_select.element_names) == np.array(
1046
1046
  tw.rows['start.cell.3.arc.2':'end.cell.3.arc.2'].name)).all()
1047
1047
 
1048
- # Check that they share the _element_dict
1049
- assert cell._element_dict is env.element_dict
1050
- assert halfcell._element_dict is env.element_dict
1051
- assert halfcell_ss._element_dict is env.element_dict
1052
- assert cell_ss._element_dict is env.element_dict
1053
- assert insertion._element_dict is env.element_dict
1054
- assert ring2._element_dict is env.element_dict
1048
+ # Check that they share the element_dict
1049
+ assert cell.element_dict is env.element_dict
1050
+ assert halfcell.element_dict is env.element_dict
1051
+ assert halfcell_ss.element_dict is env.element_dict
1052
+ assert cell_ss.element_dict is env.element_dict
1053
+ assert insertion.element_dict is env.element_dict
1054
+ assert ring2.element_dict is env.element_dict
1055
1055
 
1056
1056
  cell3_select.twiss4d()
1057
1057
 
@@ -1393,13 +1393,13 @@ def test_assemble_ring_repeated_elements():
1393
1393
  xo.assert_allclose(tw_ring2.betx[0], tw_cell.betx[0], atol=0, rtol=5e-4)
1394
1394
  xo.assert_allclose(tw_ring2.bety[0], tw_cell.bety[0], atol=0, rtol=5e-4)
1395
1395
 
1396
- # Check that they share the _element_dict
1397
- assert cell._element_dict is env.element_dict
1398
- assert halfcell._element_dict is env.element_dict
1399
- assert halfcell_ss._element_dict is env.element_dict
1400
- assert cell_ss._element_dict is env.element_dict
1401
- assert insertion._element_dict is env.element_dict
1402
- assert ring2._element_dict is env.element_dict
1396
+ # Check that they share the element_dict
1397
+ assert cell.element_dict is env.element_dict
1398
+ assert halfcell.element_dict is env.element_dict
1399
+ assert halfcell_ss.element_dict is env.element_dict
1400
+ assert cell_ss.element_dict is env.element_dict
1401
+ assert insertion.element_dict is env.element_dict
1402
+ assert ring2.element_dict is env.element_dict
1403
1403
 
1404
1404
  xo.assert_allclose(tw_ring2['betx', 'ip::0'], tw_half_insertion['betx', 'ip'], atol=0, rtol=5e-4)
1405
1405
  xo.assert_allclose(tw_ring2['bety', 'ip::0'], tw_half_insertion['bety', 'ip'], atol=0, rtol=5e-4)
@@ -3193,3 +3193,236 @@ def test_enviroment_from_two_lines():
3193
3193
  assert np.allclose(tw2.s, tw2i.s, atol=0, rtol=1e-15)
3194
3194
  assert np.allclose(tw2.betx, tw2i.betx, atol=0, rtol=1e-15)
3195
3195
  assert np.allclose(tw2.bety, tw2i.bety, atol=0, rtol=1e-15)
3196
+
3197
+ def test_particle_ref_from_particles_container():
3198
+
3199
+ env = xt.Environment()
3200
+ env['a'] = 4.
3201
+
3202
+ env.new_particle('my_particle', p0c=['1e12 * a'])
3203
+ assert 'my_particle' in env.particles
3204
+ xo.assert_allclose(env['my_particle'].p0c, 4e12, rtol=0, atol=1e-9)
3205
+ env['a'] = 5.
3206
+ xo.assert_allclose(env['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3207
+
3208
+ env.particle_ref = 'my_particle'
3209
+
3210
+ xo.assert_allclose(env.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3211
+ assert env.particle_ref.__class__.__name__ == 'EnvParticleRef'
3212
+ assert env._particle_ref == 'my_particle'
3213
+ assert env.ref['my_particle']._value is env.get('my_particle')
3214
+ env.particle_ref.p0c = '2e12 * a'
3215
+ xo.assert_allclose(env.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3216
+ env['my_particle'].p0c = '1e12 * a'
3217
+ xo.assert_allclose(env.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3218
+
3219
+ env2 = xt.Environment.from_dict(env.to_dict())
3220
+ assert 'my_particle' in env2.particles
3221
+ assert isinstance(env2.get('my_particle'), xt.Particles)
3222
+ assert env2.get('my_particle') is not env.get('my_particle')
3223
+ assert env2._particle_ref == "my_particle"
3224
+ assert env2.ref['my_particle']._value is env2.get('my_particle')
3225
+ xo.assert_allclose(env2['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3226
+ env2['a'] = 6.
3227
+ xo.assert_allclose(env2['my_particle'].p0c, 6e12, rtol=0, atol=1e-9)
3228
+ env2['a'] = 5.
3229
+
3230
+ assert env2.particle_ref.__class__.__name__ == 'EnvParticleRef'
3231
+ env2.particle_ref.p0c = '2e12 * a'
3232
+ xo.assert_allclose(env2.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3233
+ env2['my_particle'].p0c = '1e12 * a'
3234
+ xo.assert_allclose(env2.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3235
+
3236
+ env2 = env.copy()
3237
+ assert 'my_particle' in env2.particles
3238
+ assert env2._particle_ref == "my_particle"
3239
+ assert env.ref['my_particle']._value is env.get('my_particle')
3240
+ assert isinstance(env2.get('my_particle'), xt.Particles)
3241
+ assert env2.get('my_particle') is not env.get('my_particle')
3242
+ xo.assert_allclose(env2['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3243
+ env2['a'] = 6.
3244
+ xo.assert_allclose(env2['my_particle'].p0c, 6e12, rtol=0, atol=1e-9)
3245
+ env2['a'] = 5.
3246
+
3247
+ assert env2.particle_ref.__class__.__name__ == 'EnvParticleRef'
3248
+ env2.particle_ref.p0c = '2e12 * a'
3249
+ xo.assert_allclose(env2.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3250
+ env2['my_particle'].p0c = '1e12 * a'
3251
+ xo.assert_allclose(env2.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3252
+
3253
+ ll = env.new_line(name='my_line', components=[])
3254
+ assert ll._particle_ref == 'my_particle'
3255
+
3256
+ xo.assert_allclose(ll.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3257
+ assert ll.particle_ref.__class__.__name__ == 'LineParticleRef'
3258
+ ll.particle_ref.p0c = '2e12 * a'
3259
+ xo.assert_allclose(env.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3260
+ env['my_particle'].p0c = '1e12 * a'
3261
+ xo.assert_allclose(ll.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3262
+
3263
+ ll2 = xt.Line.from_dict(ll.to_dict())
3264
+ assert 'my_particle' in ll2.env.particles
3265
+ assert ll2.env.particle_ref is None
3266
+ assert ll2.particle_ref.__class__.__name__ == 'LineParticleRef'
3267
+ assert ll2._particle_ref == 'my_particle'
3268
+ xo.assert_allclose(ll2.env['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3269
+ ll2['a'] = 7.
3270
+ xo.assert_allclose(ll2.env['my_particle'].p0c, 7e12, rtol=0, atol=1e-9)
3271
+ ll2['a'] = 5.
3272
+
3273
+ ll2.particle_ref.p0c = '2e12 * a'
3274
+ xo.assert_allclose(ll2.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3275
+ ll2.env['my_particle'].p0c = '1e12 * a'
3276
+ xo.assert_allclose(ll2.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3277
+
3278
+
3279
+ ll2 = ll.copy()
3280
+ assert 'my_particle' in ll2.env.particles
3281
+ assert ll2.env.particle_ref is None
3282
+ assert ll2.particle_ref.__class__.__name__ == 'LineParticleRef'
3283
+ assert ll2._particle_ref == 'my_particle'
3284
+ xo.assert_allclose(ll2.env['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3285
+ ll2['a'] = 7.
3286
+ xo.assert_allclose(ll2.env['my_particle'].p0c, 7e12, rtol=0, atol=1e-9)
3287
+ ll2['a'] = 5.
3288
+
3289
+ ll2.particle_ref.p0c = '2e12 * a'
3290
+ xo.assert_allclose(ll2.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3291
+ ll2.env['my_particle'].p0c = '1e12 * a'
3292
+ xo.assert_allclose(ll2.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3293
+
3294
+ def test_particle_ref_as_object():
3295
+
3296
+ env = xt.Environment()
3297
+ env['a'] = 4.
3298
+
3299
+ env.new_particle('my_particle', p0c=['1e12 * a'])
3300
+ assert 'my_particle' in env.particles
3301
+ xo.assert_allclose(env['my_particle'].p0c, 4e12, rtol=0, atol=1e-9)
3302
+ env['a'] = 5.
3303
+ xo.assert_allclose(env['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3304
+
3305
+ part = env['my_particle'].copy()
3306
+ env.particle_ref = part
3307
+
3308
+ xo.assert_allclose(env.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3309
+ assert env.particle_ref.__class__.__name__ == 'EnvParticleRef'
3310
+ assert env._particle_ref is part
3311
+ env['my_particle'].p0c = '2e12 * a'
3312
+ xo.assert_allclose(env.eval('2e12 * a'), 10e12, rtol=0, atol=1e-9)
3313
+ xo.assert_allclose(env.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3314
+
3315
+ env2 = xt.Environment.from_dict(env.to_dict())
3316
+ assert 'my_particle' in env2.particles
3317
+ assert isinstance(env2.get('my_particle'), xt.Particles)
3318
+ assert env2.get('my_particle') is not env.get('my_particle')
3319
+ assert isinstance(env2._particle_ref, xt.Particles)
3320
+ assert env2.particle_ref.__class__.__name__ == 'EnvParticleRef'
3321
+
3322
+ env2 = env.copy()
3323
+ assert 'my_particle' in env2.particles
3324
+ assert isinstance(env2._particle_ref, xt.Particles)
3325
+ assert isinstance(env2.get('my_particle'), xt.Particles)
3326
+ assert env2.get('my_particle') is not env.get('my_particle')
3327
+ assert env2.particle_ref.__class__.__name__ == 'EnvParticleRef'
3328
+
3329
+ ll = env.new_line(name='my_line', components=[])
3330
+ assert isinstance(ll._particle_ref, xt.Particles)
3331
+ assert ll._particle_ref is env._particle_ref
3332
+ xo.assert_allclose(ll.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3333
+ assert ll.particle_ref.__class__.__name__ == 'LineParticleRef'
3334
+
3335
+ ll2 = xt.Line.from_dict(ll.to_dict())
3336
+ assert ll2.env.particle_ref is None
3337
+ assert ll2.particle_ref.__class__.__name__ == 'LineParticleRef'
3338
+ assert isinstance(ll2._particle_ref, xt.Particles)
3339
+ assert ll2._particle_ref is not ll._particle_ref
3340
+
3341
+
3342
+ ll2 = ll.copy()
3343
+ assert ll2.env.particle_ref is None
3344
+ assert ll2.particle_ref.__class__.__name__ == 'LineParticleRef'
3345
+ assert isinstance(ll2._particle_ref, xt.Particles)
3346
+ assert ll2._particle_ref is not ll._particle_ref
3347
+
3348
+ def test_line_set_particle_ref():
3349
+
3350
+ line = xt.Line()
3351
+ line.set_particle_ref('electron', beta0=0.9)
3352
+
3353
+ xo.assert_allclose(line.particle_ref.q0 , -1, rtol=0, atol=1e-14)
3354
+ xo.assert_allclose(line.particle_ref.mass0 , xt.ELECTRON_MASS_EV)
3355
+ xo.assert_allclose(line.particle_ref.beta0 , 0.9, rtol=0, atol=1e-14)
3356
+
3357
+ env = xt.Environment()
3358
+ env['my_beta0'] = 0.1
3359
+ env.new_particle('my_part', 'proton', beta0='my_beta0')
3360
+
3361
+ line = env.new_line()
3362
+ line.set_particle_ref('my_part')
3363
+ line['my_beta0'] = 0.6
3364
+
3365
+ xo.assert_allclose(line.particle_ref.q0 , 1, rtol=0, atol=1e-14)
3366
+ xo.assert_allclose(line.particle_ref.mass0 , xt.PROTON_MASS_EV)
3367
+ xo.assert_allclose(line.particle_ref.beta0 , 0.6, rtol=0, atol=1e-14)
3368
+
3369
+ p_ref = xt.Particles('Pb208', p0c=7e12/82)
3370
+ line = xt.Line()
3371
+ line.set_particle_ref(p_ref)
3372
+
3373
+ xo.assert_allclose(line.particle_ref.q0 , 82, rtol=0, atol=1e-14)
3374
+ xo.assert_allclose(line.particle_ref.mass0, xt.particles.masses.Pb208_MASS_EV)
3375
+ xo.assert_allclose(line.particle_ref.p0c , 7e12/82, rtol=0, atol=1e-14)
3376
+
3377
+
3378
+ def test_env_set_particle_ref():
3379
+
3380
+ env = xt.Environment()
3381
+ env.set_particle_ref('electron', beta0=0.9)
3382
+
3383
+ xo.assert_allclose(env.particle_ref.q0 , -1, rtol=0, atol=1e-14)
3384
+ xo.assert_allclose(env.particle_ref.mass0 , xt.ELECTRON_MASS_EV)
3385
+ xo.assert_allclose(env.particle_ref.beta0 , 0.9, rtol=0, atol=1e-14)
3386
+
3387
+ env.new_line(name='line1', components=[env.new('d1', 'Drift', length=1)])
3388
+ env.line1.set_particle_ref('electron', beta0=0.9)
3389
+
3390
+ xo.assert_allclose(env.line1.particle_ref.q0 , -1, rtol=0, atol=1e-14)
3391
+ xo.assert_allclose(env.line1.particle_ref.mass0 , xt.ELECTRON_MASS_EV)
3392
+ xo.assert_allclose(env.line1.particle_ref.beta0 , 0.9, rtol=0, atol=1e-14)
3393
+
3394
+ env.set_particle_ref('proton', beta0=0.8)
3395
+ xo.assert_allclose(env.particle_ref.q0 , 1, rtol=0, atol=1e-14)
3396
+ xo.assert_allclose(env.particle_ref.mass0 , xt.PROTON_MASS_EV)
3397
+ xo.assert_allclose(env.particle_ref.beta0 , 0.8, rtol=0, atol=1e-14)
3398
+ xo.assert_allclose(env.line1.particle_ref.q0 , 1, rtol=0, atol=1e-14)
3399
+ xo.assert_allclose(env.line1.particle_ref.mass0 , xt.PROTON_MASS_EV)
3400
+ xo.assert_allclose(env.line1.particle_ref.beta0 , 0.8, rtol=0, atol=1e-14)
3401
+
3402
+ env['my_beta0'] = 0.1
3403
+ env.new_particle('my_part', 'proton', beta0='my_beta0')
3404
+ env.set_particle_ref('my_part')
3405
+
3406
+ env['my_beta0'] = 0.6
3407
+ xo.assert_allclose(env.line1.particle_ref.q0 , 1, rtol=0, atol=1e-14)
3408
+ xo.assert_allclose(env.line1.particle_ref.mass0 , xt.PROTON_MASS_EV)
3409
+ xo.assert_allclose(env.line1.particle_ref.beta0 , 0.6, rtol=0, atol=1e-14)
3410
+
3411
+ p_ref = xt.Particles('Pb208', p0c=7e12/82)
3412
+ env.set_particle_ref(p_ref)
3413
+
3414
+ xo.assert_allclose(env.particle_ref.q0 , 82, rtol=0, atol=1e-14)
3415
+ xo.assert_allclose(env.particle_ref.mass0, xt.particles.masses.Pb208_MASS_EV)
3416
+ xo.assert_allclose(env.particle_ref.p0c , 7e12/82, rtol=0, atol=1e-14)
3417
+ xo.assert_allclose(env.line1.particle_ref.q0 , 82, rtol=0, atol=1e-14)
3418
+ xo.assert_allclose(env.line1.particle_ref.mass0, xt.particles.masses.Pb208_MASS_EV)
3419
+ xo.assert_allclose(env.line1.particle_ref.p0c , 7e12/82, rtol=0, atol=1e-14)
3420
+
3421
+ env.set_particle_ref('positron', beta0=0.7, lines=None)
3422
+ xo.assert_allclose(env.particle_ref.q0 , 1, rtol=0, atol=1e-14)
3423
+ xo.assert_allclose(env.particle_ref.mass0 , xt.ELECTRON_MASS_EV)
3424
+ xo.assert_allclose(env.particle_ref.beta0 , 0.7, rtol=0, atol=1e-14)
3425
+ # line unchanged
3426
+ xo.assert_allclose(env.line1.particle_ref.q0 , 82, rtol=0, atol=1e-14)
3427
+ xo.assert_allclose(env.line1.particle_ref.mass0, xt.particles.masses.Pb208_MASS_EV)
3428
+ xo.assert_allclose(env.line1.particle_ref.p0c , 7e12/82, rtol=0, atol=1e-14)
@@ -65,7 +65,7 @@ def test_simplification_methods():
65
65
  line.remove_zero_length_drifts(inplace=True)
66
66
 
67
67
  # Test merging of multipoles
68
- line._var_management = None
68
+ line.env._var_management = None
69
69
  line.insert_element(element=xt.Multipole(knl=[1, 0, 3], ksl=[0, 20, 0]), name='m1', at_s=3.3)
70
70
  line.insert_element(element=xt.Multipole(knl=[4, 2], ksl=[10, 40]), name='m2', at_s=3.3)
71
71
  line.insert_element(element=xt.Multipole(knl=[0, 3, 8], ksl=[2, 0, 17]), name='m3', at_s=3.3)