xtrack 0.79.2__tar.gz → 0.79.4__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 (296) hide show
  1. {xtrack-0.79.2/xtrack.egg-info → xtrack-0.79.4}/PKG-INFO +1 -1
  2. xtrack-0.79.4/tests/test_particles_basics.py +681 -0
  3. xtrack-0.79.4/tests/test_particles_pdg.py +293 -0
  4. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_random_gen.py +1 -0
  5. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_random_gen_exp.py +3 -1
  6. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_trajectory_correcton.py +199 -1
  7. xtrack-0.79.4/xtrack/_version.py +1 -0
  8. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/line.py +5 -2
  9. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/particles/__init__.py +1 -1
  10. xtrack-0.79.4/xtrack/particles/constants.py +7 -0
  11. xtrack-0.79.4/xtrack/particles/masses.py +181 -0
  12. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/particles/particles.py +9 -7
  13. xtrack-0.79.4/xtrack/particles/pdg.py +549 -0
  14. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/trajectory_correction.py +139 -49
  15. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/twiss.py +2 -0
  16. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/twissplot.py +16 -2
  17. {xtrack-0.79.2 → xtrack-0.79.4/xtrack.egg-info}/PKG-INFO +1 -1
  18. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack.egg-info/SOURCES.txt +4 -0
  19. xtrack-0.79.2/xtrack/_version.py +0 -1
  20. xtrack-0.79.2/xtrack/particles/constants.py +0 -12
  21. {xtrack-0.79.2 → xtrack-0.79.4}/LICENSE +0 -0
  22. {xtrack-0.79.2 → xtrack-0.79.4}/MANIFEST.in +0 -0
  23. {xtrack-0.79.2 → xtrack-0.79.4}/README.md +0 -0
  24. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/__init__.py +0 -0
  25. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/base_classes.py +0 -0
  26. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/BB6D.py +0 -0
  27. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  28. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/__init__.py +0 -0
  29. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/beambeam.py +0 -0
  30. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/boost.py +0 -0
  31. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  32. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  33. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/qgauss.py +0 -0
  34. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/slicing.py +0 -0
  35. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/be_beamfields/spacecharge.py +0 -0
  36. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/elements.py +0 -0
  37. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/line.py +0 -0
  38. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/mathlibs.py +0 -0
  39. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/particles.py +0 -0
  40. {xtrack-0.79.2 → xtrack-0.79.4}/ducktrack/temp_pyparticles.py +0 -0
  41. {xtrack-0.79.2 → xtrack-0.79.4}/pyproject.toml +0 -0
  42. {xtrack-0.79.2 → xtrack-0.79.4}/setup.cfg +0 -0
  43. {xtrack-0.79.2 → xtrack-0.79.4}/setup.py +0 -0
  44. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_acceleration.py +0 -0
  45. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_amplitude_detuning.py +0 -0
  46. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  47. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_apertures.py +0 -0
  48. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_attr_replicas_and_slices.py +0 -0
  49. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_bucket_with_ref_energy_change.py +0 -0
  50. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_cavity_absolute_time.py +0 -0
  51. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_chromatic_functions_vs_madx.py +0 -0
  52. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_coasting.py +0 -0
  53. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_collective_tracker.py +0 -0
  54. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_collimation.py +0 -0
  55. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_element_characterization_functions.py +0 -0
  56. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_element_internal_record.py +0 -0
  57. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_elements.py +0 -0
  58. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_elements_classflags.py +0 -0
  59. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_elements_thick.py +0 -0
  60. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_environment.py +0 -0
  61. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  62. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  63. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_footprint.py +0 -0
  64. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_freeze_longitudinal.py +0 -0
  65. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_full_rings.py +0 -0
  66. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_h6_sps_beamline.py +0 -0
  67. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_hvkick.py +0 -0
  68. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_ions.py +0 -0
  69. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_legacy_multiline_to_env.py +0 -0
  70. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_lhc_env.py +0 -0
  71. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_lhc_match_phase_15.py +0 -0
  72. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_line.py +0 -0
  73. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_lumi.py +0 -0
  74. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_mad_writer.py +0 -0
  75. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_madloader.py +0 -0
  76. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_madnginterface.py +0 -0
  77. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_magnet.py +0 -0
  78. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_match_and_track_from_element.py +0 -0
  79. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_match_coupling_knob.py +0 -0
  80. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_match_nested.py +0 -0
  81. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_match_optics_and_ip_knob.py +0 -0
  82. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  83. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_match_orbit_bump.py +0 -0
  84. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_match_tune_chroma_cminus.py +0 -0
  85. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_monitor.py +0 -0
  86. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_multi_bunch_gauss.py +0 -0
  87. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_multiline.py +0 -0
  88. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_multisetter.py +0 -0
  89. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_multispecies.py +0 -0
  90. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_native_madloader.py +0 -0
  91. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_particles.py +0 -0
  92. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_periodic_symmetric_twiss_and_match.py +0 -0
  93. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_pipeline.py +0 -0
  94. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_prebuild_kernels.py +0 -0
  95. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_ps_against_ptc.py +0 -0
  96. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_ps_multiturn_twiss.py +0 -0
  97. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_psb_chicane.py +0 -0
  98. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_pyht_interface.py +0 -0
  99. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_radial_steering.py +0 -0
  100. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_radiation.py +0 -0
  101. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_radiation_equilibrium_emittances.py +0 -0
  102. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  103. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_random_gen_gauss.py +0 -0
  104. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_random_gen_ruth.py +0 -0
  105. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_rbend_rbarc.py +0 -0
  106. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_rf_track.py +0 -0
  107. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_rotation_signs.py +0 -0
  108. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_second_order_taylor_map.py +0 -0
  109. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_seeds.py +0 -0
  110. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_slice_and_insert_with_replicas.py +0 -0
  111. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_slice_elements.py +0 -0
  112. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_slicing.py +0 -0
  113. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  114. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_spacecharge_in_ring.py +0 -0
  115. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_sps_thick.py +0 -0
  116. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_survey.py +0 -0
  117. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_tapering.py +0 -0
  118. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_thick_lhc.py +0 -0
  119. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_tilt_shifts.py +0 -0
  120. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_tracker.py +0 -0
  121. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_twiss.py +0 -0
  122. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_twiss_vs_madx_psb.py +0 -0
  123. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_vs_madx.py +0 -0
  124. {xtrack-0.79.2 → xtrack-0.79.4}/tests/test_xmask_orbit_correction.py +0 -0
  125. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/__init__.py +0 -0
  126. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/_temp/__init__.py +0 -0
  127. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  128. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  129. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  130. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/_temp/lhc_match/__init__.py +0 -0
  131. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  132. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  133. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  134. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/base_element.py +0 -0
  135. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/__init__.py +0 -0
  136. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/apertures.py +0 -0
  137. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  138. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  139. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  140. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  141. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  142. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  143. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/beam_interaction.py +0 -0
  144. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements.py +0 -0
  145. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/bend.h +0 -0
  146. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  147. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  148. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  149. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/drift.h +0 -0
  150. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/drift_elem.h +0 -0
  151. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  152. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  153. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  154. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  155. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  156. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  157. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/elens.h +0 -0
  158. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  159. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  160. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  161. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  162. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  163. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  164. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  165. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  166. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  167. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  168. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  169. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  170. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/rbend.h +0 -0
  171. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  172. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  173. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  174. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  175. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  176. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  177. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/solenoid.h +0 -0
  178. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  179. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  180. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thick_slice_drift.h +0 -0
  181. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  182. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  183. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
  184. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  185. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thick_slice_solenoid.h +0 -0
  186. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  187. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  188. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  189. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  190. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  191. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  192. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  193. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  194. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  195. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
  196. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  197. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  198. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  199. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  200. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  201. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_bend.h +0 -0
  202. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  203. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  204. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  205. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_magnet.h +0 -0
  206. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  207. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  208. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  209. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
  210. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  211. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_multipolar_components.h +0 -0
  212. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_multipole.h +0 -0
  213. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_quadrupole.h +0 -0
  214. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_solenoid.h +0 -0
  215. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  216. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  217. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  218. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  219. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  220. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  221. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  222. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/wire.h +0 -0
  223. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  224. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  225. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  226. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  227. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/exciter.py +0 -0
  228. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/magnets.py +0 -0
  229. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/rft_element.py +0 -0
  230. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/slice_elements.py +0 -0
  231. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  232. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/environment.py +0 -0
  233. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/footprint.py +0 -0
  234. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/general.py +0 -0
  235. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/headers/atomicadd.h +0 -0
  236. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/headers/checks.h +0 -0
  237. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/headers/constants.h +0 -0
  238. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/headers/particle_states.h +0 -0
  239. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/headers/synrad_spectrum.h +0 -0
  240. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/internal_record.py +0 -0
  241. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/json.py +0 -0
  242. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/linear_normal_form.py +0 -0
  243. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/loss_location_refinement/__init__.py +0 -0
  244. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  245. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/lumi.py +0 -0
  246. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/mad_loader.py +0 -0
  247. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/mad_parser/__init__.py +0 -0
  248. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/mad_parser/loader.py +0 -0
  249. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/mad_parser/madx.lark +0 -0
  250. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/mad_parser/parse.py +0 -0
  251. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/mad_writer.py +0 -0
  252. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/madng_interface.py +0 -0
  253. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/match.py +0 -0
  254. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/__init__.py +0 -0
  255. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/beam_position_monitor.h +0 -0
  256. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/beam_position_monitor.py +0 -0
  257. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/beam_profile_monitor.h +0 -0
  258. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/beam_profile_monitor.py +0 -0
  259. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/beam_size_monitor.h +0 -0
  260. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/beam_size_monitor.py +0 -0
  261. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/last_turns_monitor.h +0 -0
  262. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/last_turns_monitor.py +0 -0
  263. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/particles_monitor.h +0 -0
  264. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/monitors/particles_monitor.py +0 -0
  265. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/multiline.py +0 -0
  266. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/multiline_legacy/__init__.py +0 -0
  267. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  268. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  269. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/multisetter/__init__.py +0 -0
  270. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/multisetter/multisetter.py +0 -0
  271. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/particles/rng_src/base_rng.h +0 -0
  272. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/particles/rng_src/particles_rng.h +0 -0
  273. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/pipeline/__init__.py +0 -0
  274. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/pipeline/core.py +0 -0
  275. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/pipeline/manager.py +0 -0
  276. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/pipeline/multitracker.py +0 -0
  277. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/progress_indicator.py +0 -0
  278. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/random/__init__.py +0 -0
  279. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/random/random_generators.py +0 -0
  280. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/random/random_src/exponential.h +0 -0
  281. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  282. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/random/random_src/normal.h +0 -0
  283. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/random/random_src/rutherford.h +0 -0
  284. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/random/random_src/uniform.h +0 -0
  285. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/random/random_src/uniform_accurate.h +0 -0
  286. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/slicing.py +0 -0
  287. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/survey.py +0 -0
  288. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/synctime.py +0 -0
  289. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/tapering.py +0 -0
  290. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/targets.py +0 -0
  291. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/tracker.py +0 -0
  292. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/tracker_data.py +0 -0
  293. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack/tracker_src/tracker.h +0 -0
  294. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack.egg-info/dependency_links.txt +0 -0
  295. {xtrack-0.79.2 → xtrack-0.79.4}/xtrack.egg-info/requires.txt +0 -0
  296. {xtrack-0.79.2 → xtrack-0.79.4}/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.79.2
3
+ Version: 0.79.4
4
4
  Summary: Tracking library for particle accelerators
5
5
  Home-page: https://xsuite.readthedocs.io/
6
6
  Download-URL: https://pypi.python.org/pypi/xtrack
@@ -0,0 +1,681 @@
1
+ # copyright ############################### #
2
+ # This file is part of the Xpart Package. #
3
+ # Copyright (c) CERN, 2021. #
4
+ # ######################################### #
5
+
6
+ import numpy as np
7
+ import pytest
8
+ import xobjects as xo
9
+ import xtrack as xt
10
+ import xpart as xp
11
+
12
+ from xobjects.test_helpers import for_all_test_contexts
13
+
14
+
15
+ def _check_consistency_energy_variables(particles):
16
+ # Check consistency between beta0 and gamma0
17
+ xo.assert_allclose(particles.gamma0, 1/np.sqrt(1 - particles.beta0**2),
18
+ rtol=1e-14, atol=1e-14)
19
+
20
+ # Assert consistency of p0c
21
+ xo.assert_allclose(particles.p0c,
22
+ particles.mass0 * particles.beta0 * particles.gamma0,
23
+ rtol=1e-14, atol=1e-14)
24
+
25
+ # Check energy0 property (consistency of p0c and gamma0)
26
+ xo.assert_allclose(particles.energy0, particles.mass0 * particles.gamma0,
27
+ atol=1e-14, rtol=1e-14)
28
+
29
+ # Check consistency of rpp and delta
30
+ xo.assert_allclose(particles.rpp, 1./(particles.delta + 1),
31
+ rtol=1e-14, atol=1e-14)
32
+
33
+ beta = particles.beta0 * particles.rvv
34
+ gamma = 1/np.sqrt(1 - beta**2)
35
+ pc = particles.mass0 * gamma * beta
36
+
37
+ # Check consistency of delta with rvv
38
+ xo.assert_allclose(particles.delta, (pc-particles.p0c)/(particles.p0c),
39
+ rtol=1e-14, atol=1e-14)
40
+
41
+ # Check consistency of ptau with rvv
42
+ energy = particles.mass0 * gamma
43
+ xo.assert_allclose(particles.ptau, (energy - particles.energy0)/particles.p0c,
44
+ rtol=1e-14, atol=1e-14)
45
+
46
+ # Check consistency of pzeta
47
+ energy = particles.mass0 * gamma
48
+ xo.assert_allclose(particles.pzeta, (energy - particles.energy0)/(particles.beta0 * particles.p0c),
49
+ rtol=1e-14, atol=1e-14)
50
+
51
+
52
+ # Check energy property
53
+ xo.assert_allclose(particles.energy, energy, rtol=1e-14, atol=1e-14)
54
+
55
+
56
+ @for_all_test_contexts
57
+ def test_basics(test_context):
58
+ particles = xp.Particles(_context=test_context, _capacity=10,
59
+ mass0=xp.PROTON_MASS_EV, q0=1, p0c=7e12, # 7 TeV
60
+ x=[1e-3, 0], px=[1e-6, -1e-6], y=[0, 1e-3],
61
+ py=[2e-6, 0], zeta=[1e-2, 2e-2], delta=[0, 1e-4])
62
+
63
+ dct = particles.to_dict() # transfers it to cpu
64
+ assert dct['x'][0] == 1e-3
65
+ assert dct['ptau'][0] == 0
66
+ xo.assert_allclose(dct['ptau'][1], 1e-4, rtol=0, atol=1e-9)
67
+ xo.assert_allclose(1/(dct['rpp'][1]) - 1, 1e-4, rtol=0, atol=1e-14)
68
+
69
+ particles = xp.Particles(_context=test_context,
70
+ mass0=xp.PROTON_MASS_EV, q0=1, p0c=3e9,
71
+ x=[1e-3, 0], px=[1e-6, -1e-6], y=[0, 1e-3], py=[2e-6, 0],
72
+ zeta=[1e-2, 2e-2], pzeta=[0, 1e-4])
73
+
74
+ dct = particles.to_dict() # transfers it to cpu
75
+ assert dct['x'][0] == 1e-3
76
+ xo.assert_allclose(dct['ptau'][0], 0, atol=1e-14, rtol=0)
77
+ xo.assert_allclose(dct['ptau'][1]/dct['beta0'][1], 1e-4, rtol=0, atol=1e-9)
78
+ xo.assert_allclose(dct['delta'][1], 9.99995545e-05, rtol=0, atol=1e-13)
79
+
80
+ particles.move(_context=xo.ContextCpu())
81
+ _check_consistency_energy_variables(particles)
82
+
83
+
84
+ @for_all_test_contexts
85
+ def test_unallocated_particles(test_context):
86
+ particles = xp.Particles(_context=test_context, _capacity=10,
87
+ mass0=xp.PROTON_MASS_EV, q0=1, p0c=7e12, # 7 TeV
88
+ x=[1e-3, 0], px=[1e-6, -1e-6], y=[0, 1e-3],
89
+ py=[2e-6, 0], zeta=[1e-2, 2e-2], delta=[0, 1e-4])
90
+
91
+ dct = particles.to_dict() # transfers it to cpu
92
+ assert dct['x'][0] == 1e-3
93
+ assert dct['ptau'][0] == 0
94
+ xo.assert_allclose(dct['ptau'][1], 1e-4, rtol=0, atol=1e-9)
95
+ xo.assert_allclose(1/(dct['rpp'][1]) - 1, 1e-4, rtol=0, atol=1e-14)
96
+
97
+ particles2 = xp.Particles.from_dict(dct, _context=test_context)
98
+
99
+
100
+ @for_all_test_contexts(excluding='ContextPyopencl')
101
+ def test_linked_arrays(test_context):
102
+ ctx2np = test_context.nparray_from_context_array
103
+ np2ctx = test_context.nparray_to_context_array
104
+
105
+ particles = xp.Particles(_context=test_context, p0c=26e9, delta=[1,2,3])
106
+
107
+ assert ctx2np(particles.delta[2]) == 3
108
+ xo.assert_allclose(ctx2np(particles.rvv[2]), 1.00061, rtol=0, atol=1e-5)
109
+ xo.assert_allclose(ctx2np(particles.rpp[2]), 0.25, rtol=0, atol=1e-10)
110
+ xo.assert_allclose(ctx2np(particles.ptau[2]), 2.9995115176, rtol=0, atol=1e-6)
111
+
112
+ particles.delta[1] = particles.delta[2]
113
+
114
+ assert particles.delta[2] == particles.delta[1]
115
+ assert particles.ptau[2] == particles.ptau[1]
116
+ assert particles.rpp[2] == particles.rpp[1]
117
+ assert particles.rvv[2] == particles.rvv[1]
118
+
119
+ particles.ptau[0] = particles.ptau[2]
120
+
121
+ xo.assert_allclose(particles.delta[2], particles.delta[0], rtol=0, atol=1e-15)
122
+ xo.assert_allclose(particles.ptau[2], particles.ptau[0], rtol=0, atol=1e-16)
123
+ xo.assert_allclose(particles.rpp[2], particles.rpp[0], rtol=0, atol=1e-16)
124
+ xo.assert_allclose(particles.rvv[2], particles.rvv[0], rtol=0, atol=1e-15)
125
+
126
+ particles = xp.Particles(_context=test_context, p0c=26e9,
127
+ delta=[1,2,3,4,100,0])
128
+ p0 = particles.copy()
129
+ particles.state = np2ctx(np.array([1,1,1,1,0,1]))
130
+ particles.delta[3:] = np2ctx([np.nan, 2, 3])
131
+
132
+ assert particles.delta[5] == particles.delta[2]
133
+ assert particles.ptau[5] == particles.ptau[2]
134
+ assert particles.rvv[5] == particles.rvv[2]
135
+ assert particles.rpp[5] == particles.rpp[2]
136
+
137
+ assert particles.delta[4] == p0.delta[4]
138
+ assert particles.ptau[4] == p0.ptau[4]
139
+ assert particles.rvv[4] == p0.rvv[4]
140
+ assert particles.rpp[4] == p0.rpp[4]
141
+
142
+ assert particles.delta[3] == p0.delta[3]
143
+ assert particles.ptau[3] == p0.ptau[3]
144
+ assert particles.rvv[3] == p0.rvv[3]
145
+ assert particles.rpp[3] == p0.rpp[3]
146
+
147
+
148
+ @for_all_test_contexts
149
+ @pytest.mark.parametrize(
150
+ 'varname,values',
151
+ [
152
+ ('p0c', [4e9, 5e11, 6e13]),
153
+ ('gamma0', [3., 4., 5.]),
154
+ ('beta0', [0.8, 0.9, 0.99999999]),
155
+ ]
156
+ )
157
+ def test_particles_update_ref_vars(test_context, varname, values):
158
+ p = xp.Particles(_context=test_context,
159
+ delta=[1, 2, 3],
160
+ **{varname: values})
161
+
162
+ p_ref = p.copy()
163
+
164
+ getattr(p, varname)[1] = getattr(p, varname)[0]
165
+
166
+ assert p.p0c[0] == p.p0c[1]
167
+ assert p.gamma0[0] == p.gamma0[1]
168
+ assert p.beta0[0] == p.beta0[1]
169
+
170
+ assert p.p0c[0] == p_ref.p0c[0]
171
+ assert p.gamma0[0] == p_ref.gamma0[0]
172
+ assert p.beta0[0] == p_ref.beta0[0]
173
+
174
+ @for_all_test_contexts
175
+ def test_particles_update_p0c_and_energy_deviations(test_context):
176
+
177
+ part = xp.Particles(_context=test_context,
178
+ p0c=[1e12, 3e12, 2e12],
179
+ delta=[0, 0.1, 0],
180
+ state=[1, 0., 1.])
181
+
182
+ part.update_p0c_and_energy_deviations(p0c=2e12)
183
+
184
+ part.move(_context=xo.ContextCpu())
185
+ part.sort(interleave_lost_particles = True)
186
+ xo.assert_allclose(part.p0c, [2e12, 3e12, 2e12], rtol=0, atol=1e-14)
187
+ xo.assert_allclose(part.delta, [-0.5, 0.1, 0], rtol=0, atol=1e-14)
188
+
189
+
190
+ def test_sort():
191
+ # Sorting available only on CPU for now
192
+
193
+ p = xp.Particles(x=[0, 1, 2, 3, 4, 5, 6], _capacity=10)
194
+ p.state[[0, 3, 4]] = 0
195
+
196
+ line = xt.Line(elements=[xt.Cavity()])
197
+ line.build_tracker()
198
+ line.track(p)
199
+
200
+ assert np.all(p.particle_id == np.array([6, 1, 2, 5, 4, 3, 0,
201
+ -999999999, -999999999,
202
+ -999999999]))
203
+ assert np.all(p.x == np.array([6, 1, 2, 5, 4, 3, 0,
204
+ -999999999, -999999999, -999999999]))
205
+ assert np.all(p.state == np.array([1, 1, 1, 1, 0, 0, 0,
206
+ -999999999, -999999999, -999999999]))
207
+ assert p._num_active_particles == 4
208
+ assert p._num_lost_particles == 3
209
+
210
+ p.sort()
211
+
212
+ assert np.all(p.particle_id == np.array([1, 2, 5, 6, 0, 3, 4,
213
+ -999999999, -999999999,
214
+ -999999999]))
215
+ assert np.all(p.particle_id == np.array([1, 2, 5, 6, 0, 3, 4,
216
+ -999999999, -999999999,
217
+ -999999999]))
218
+ assert np.all(p.state == np.array([1, 1, 1, 1, 0, 0, 0,
219
+ -999999999, -999999999, -999999999]))
220
+ assert p._num_active_particles == 4
221
+ assert p._num_lost_particles == 3
222
+
223
+ p.sort(interleave_lost_particles=True)
224
+
225
+ assert np.all(p.particle_id == np.array([0, 1, 2, 3, 4, 5, 6,
226
+ -999999999, -999999999,
227
+ -999999999]))
228
+ assert np.all(p.particle_id == np.array([0, 1, 2, 3, 4, 5, 6,
229
+ -999999999, -999999999,
230
+ -999999999]))
231
+ assert np.all(p.state == np.array([0, 1, 1, 0, 0, 1, 1,
232
+ -999999999, -999999999, -999999999]))
233
+ assert p._num_active_particles == -2
234
+ assert p._num_lost_particles == -2
235
+
236
+ p = xp.Particles(x=[6, 5, 4, 3, 2, 1, 0], _capacity=10)
237
+ p.state[[0,3,4]] = 0
238
+
239
+ line.track(p)
240
+
241
+ assert np.all(p.particle_id == np.array([6, 1, 2, 5, 4, 3, 0,
242
+ -999999999, -999999999,
243
+ -999999999]))
244
+ assert np.all(p.x == np.array([0, 5, 4, 1, 2, 3, 6,
245
+ -999999999, -999999999, -999999999]))
246
+ assert np.all(p.state == np.array([1, 1, 1, 1, 0, 0, 0,
247
+ -999999999, -999999999, -999999999]))
248
+ assert p._num_active_particles == 4
249
+ assert p._num_lost_particles == 3
250
+
251
+ p.sort(by='x')
252
+
253
+ assert np.all(p.particle_id == np.array([6, 5, 2, 1, 4, 3, 0,
254
+ -999999999, -999999999,
255
+ -999999999]))
256
+ assert np.all(p.x == np.array([0, 1, 4, 5, 2, 3, 6,
257
+ -999999999, -999999999, -999999999]))
258
+ assert np.all(p.state == np.array([1, 1, 1, 1, 0, 0, 0,
259
+ -999999999, -999999999, -999999999]))
260
+ assert p._num_active_particles == 4
261
+ assert p._num_lost_particles == 3
262
+
263
+ p.sort(by='x', interleave_lost_particles=True)
264
+
265
+ assert np.all(p.particle_id == np.array([6, 5, 4, 3, 2, 1, 0,
266
+ -999999999, -999999999,
267
+ -999999999]))
268
+ assert np.all(p.x == np.array([0, 1, 2, 3, 4, 5, 6,
269
+ -999999999, -999999999, -999999999]))
270
+ assert np.all(p.state == np.array([1, 1, 0, 0, 1, 1, 0,
271
+ -999999999, -999999999, -999999999]))
272
+ assert p._num_active_particles == -2
273
+ assert p._num_lost_particles == -2
274
+
275
+
276
+ @for_all_test_contexts
277
+ def test_python_add_to_energy(test_context):
278
+ particles = xp.Particles(_context=test_context, mass0=xp.PROTON_MASS_EV,
279
+ q0=1, p0c=1.4e9, x=[1e-3, 0], px=[1e-6, -1e-6],
280
+ y=[0, 1e-3], py=[2e-6, 0], zeta=[1e-2, 2e-2],
281
+ delta=[0, 1e-4])
282
+
283
+ energy_before = particles.copy(_context=xo.ContextCpu()).energy
284
+ zeta_before = particles.copy(_context=xo.ContextCpu()).zeta
285
+
286
+ particles.add_to_energy(3e6)
287
+
288
+ expected_energy = energy_before + 3e6
289
+ particles.move(_context=xo.ContextCpu())
290
+ xo.assert_allclose(particles.energy, expected_energy,
291
+ atol=1e-14, rtol=1e-14)
292
+
293
+ _check_consistency_energy_variables(particles)
294
+
295
+ assert np.all(particles.zeta == zeta_before)
296
+
297
+
298
+ @for_all_test_contexts
299
+ def test_python_delta_setter(test_context):
300
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
301
+ px=[1e-6, -1e-6], py=[2e-6, 0], zeta=0.1)
302
+ _check_consistency_energy_variables(
303
+ particles.copy(_context=xo.ContextCpu()))
304
+ px_before = particles.copy(_context=xo.ContextCpu()).px
305
+ py_before = particles.copy(_context=xo.ContextCpu()).py
306
+ zeta_before = particles.copy(_context=xo.ContextCpu()).zeta
307
+ gamma0_before = particles.copy(_context=xo.ContextCpu()).gamma0
308
+
309
+ particles.delta = -2e-3
310
+
311
+ particles.move(_context=xo.ContextCpu())
312
+ xo.assert_allclose(particles.delta, -2e-3, atol=1e-14, rtol=1e-14)
313
+
314
+ _check_consistency_energy_variables(particles)
315
+
316
+ assert np.all(particles.gamma0 == gamma0_before)
317
+ assert np.all(particles.zeta == zeta_before)
318
+ assert np.all(particles.px == px_before)
319
+ assert np.all(particles.py == py_before)
320
+
321
+
322
+ @for_all_test_contexts
323
+ def test_LocalParticle_add_to_energy(test_context):
324
+ class TestElement(xt.BeamElement):
325
+ _xofields={
326
+ 'value': xo.Float64,
327
+ 'pz_only': xo.Int64,
328
+ }
329
+ _extra_c_sources = ['''
330
+ /*gpufun*/
331
+ void TestElement_track_local_particle(
332
+ TestElementData el, LocalParticle* part0){
333
+ double const value = TestElementData_get_value(el);
334
+ int const pz_only = (int) TestElementData_get_pz_only(el);
335
+ //start_per_particle_block (part0->part)
336
+ LocalParticle_add_to_energy(part, value, pz_only);
337
+ //end_per_particle_block
338
+ }
339
+ ''']
340
+
341
+ # pz_only = 1
342
+ telem = TestElement(_context=test_context, value=1e6, pz_only=1)
343
+
344
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
345
+ px=[1e-6, -1e-6], py=[2e-6, 0], zeta=0.1)
346
+ _check_consistency_energy_variables(
347
+ particles.copy(_context=xo.ContextCpu()))
348
+ energy_before = particles.copy(_context=xo.ContextCpu()).energy
349
+ px_before = particles.copy(_context=xo.ContextCpu()).px
350
+ py_before = particles.copy(_context=xo.ContextCpu()).py
351
+ zeta_before = particles.copy(_context=xo.ContextCpu()).zeta
352
+ gamma0_before = particles.copy(_context=xo.ContextCpu()).gamma0
353
+ telem.track(particles)
354
+
355
+ particles.move(_context=xo.ContextCpu())
356
+ xo.assert_allclose(particles.energy, energy_before + 1e6,
357
+ atol=1e-14, rtol=1e-14)
358
+
359
+ _check_consistency_energy_variables(particles)
360
+
361
+ assert np.all(particles.gamma0 == gamma0_before)
362
+ assert np.all(particles.zeta == zeta_before)
363
+ assert np.all(particles.px == px_before)
364
+ assert np.all(particles.py == py_before)
365
+
366
+ # pz_only = 0
367
+ telem = TestElement(_context=test_context, value=1e6, pz_only=0)
368
+
369
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
370
+ px=[1e-6, -1e-6], py=[2e-6, 0], zeta=0.1)
371
+ _check_consistency_energy_variables(
372
+ particles.copy(_context=xo.ContextCpu()))
373
+ energy_before = particles.copy(_context=xo.ContextCpu()).energy
374
+ px_before = particles.copy(_context=xo.ContextCpu()).px
375
+ py_before = particles.copy(_context=xo.ContextCpu()).py
376
+ rpp_before = particles.copy(_context=xo.ContextCpu()).rpp
377
+ zeta_before = particles.copy(_context=xo.ContextCpu()).zeta
378
+ gamma0_before = particles.copy(_context=xo.ContextCpu()).gamma0
379
+ telem.track(particles)
380
+
381
+ particles.move(_context=xo.ContextCpu())
382
+ xo.assert_allclose(particles.energy, energy_before + 1e6,
383
+ atol=1e-14, rtol=1e-14)
384
+
385
+ _check_consistency_energy_variables(particles)
386
+
387
+ rpp_after = particles.copy(_context=xo.ContextCpu()).rpp
388
+ assert np.all(particles.gamma0 == gamma0_before)
389
+ assert np.all(particles.zeta == zeta_before)
390
+ xo.assert_allclose(particles.px, px_before*rpp_before/rpp_after,
391
+ atol=1e-14, rtol=1e-14)
392
+ xo.assert_allclose(particles.py, py_before*rpp_before/rpp_after,
393
+ atol=1e-14, rtol=1e-14)
394
+
395
+
396
+ @for_all_test_contexts
397
+ def test_LocalParticle_update_delta(test_context):
398
+ class TestElement(xt.BeamElement):
399
+ _xofields={
400
+ 'value': xo.Float64,
401
+ }
402
+
403
+ _extra_c_sources =['''
404
+ /*gpufun*/
405
+ void TestElement_track_local_particle(
406
+ TestElementData el, LocalParticle* part0){
407
+ double const value = TestElementData_get_value(el);
408
+ //start_per_particle_block (part0->part)
409
+ LocalParticle_update_delta(part, value);
410
+ //end_per_particle_block
411
+ }
412
+ ''']
413
+
414
+ telem = TestElement(_context=test_context, value=-2e-3)
415
+
416
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
417
+ px=[1e-6, -1e-6], py=[2e-6, 0], zeta=0.1)
418
+ _check_consistency_energy_variables(
419
+ particles.copy(_context=xo.ContextCpu()))
420
+ px_before = particles.copy(_context=xo.ContextCpu()).px
421
+ py_before = particles.copy(_context=xo.ContextCpu()).py
422
+ zeta_before = particles.copy(_context=xo.ContextCpu()).zeta
423
+ gamma0_before = particles.copy(_context=xo.ContextCpu()).gamma0
424
+ telem.track(particles)
425
+
426
+ particles.move(_context=xo.ContextCpu())
427
+ xo.assert_allclose(particles.delta, -2e-3, atol=1e-14, rtol=1e-14)
428
+
429
+ _check_consistency_energy_variables(particles)
430
+
431
+ assert np.all(particles.gamma0 == gamma0_before)
432
+ assert np.all(particles.zeta == zeta_before)
433
+ assert np.all(particles.px == px_before)
434
+ assert np.all(particles.py == py_before)
435
+
436
+
437
+ @for_all_test_contexts
438
+ def test_LocalParticle_update_ptau(test_context):
439
+ class TestElement(xt.BeamElement):
440
+ _xofields={
441
+ 'value': xo.Float64,
442
+ }
443
+
444
+ _extra_c_sources = ['''
445
+ /*gpufun*/
446
+ void TestElement_track_local_particle(
447
+ TestElementData el, LocalParticle* part0){
448
+ double const value = TestElementData_get_value(el);
449
+ //start_per_particle_block (part0->part)
450
+ LocalParticle_update_ptau(part, value);
451
+ //end_per_particle_block
452
+ }
453
+ ''']
454
+
455
+ telem = TestElement(_context=test_context, value=-2e-3)
456
+
457
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
458
+ px=[1e-6, -1e-6], py=[2e-6, 0], zeta=0.1)
459
+ _check_consistency_energy_variables(
460
+ particles.copy(_context=xo.ContextCpu()))
461
+ px_before = particles.copy(_context=xo.ContextCpu()).px
462
+ py_before = particles.copy(_context=xo.ContextCpu()).py
463
+ zeta_before = particles.copy(_context=xo.ContextCpu()).zeta
464
+ gamma0_before = particles.copy(_context=xo.ContextCpu()).gamma0
465
+ telem.track(particles)
466
+
467
+ particles.move(_context=xo.ContextCpu())
468
+ xo.assert_allclose(particles.ptau, -2e-3, atol=1e-14, rtol=1e-14)
469
+
470
+ _check_consistency_energy_variables(particles)
471
+
472
+ assert np.all(particles.gamma0 == gamma0_before)
473
+ assert np.all(particles.zeta == zeta_before)
474
+ assert np.all(particles.px == px_before)
475
+ assert np.all(particles.py == py_before)
476
+
477
+
478
+ @for_all_test_contexts
479
+ def test_LocalParticle_update_pzeta(test_context):
480
+ class TestElement(xt.BeamElement):
481
+ _xofields={
482
+ 'value': xo.Float64,
483
+ }
484
+ _extra_c_sources = ['''
485
+ /*gpufun*/
486
+ void TestElement_track_local_particle(
487
+ TestElementData el, LocalParticle* part0){
488
+ double const value = TestElementData_get_value(el);
489
+ //start_per_particle_block (part0->part)
490
+ double const pzeta = LocalParticle_get_pzeta(part);
491
+ LocalParticle_update_pzeta(part, pzeta+value);
492
+ //end_per_particle_block
493
+ }
494
+ ''']
495
+
496
+ telem = TestElement(_context=test_context, value=-2e-3)
497
+
498
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
499
+ px=[1e-6, -1e-6], py=[2e-6, 0], zeta=0.1)
500
+ _check_consistency_energy_variables(
501
+ particles.copy(_context=xo.ContextCpu()))
502
+ px_before = particles.copy(_context=xo.ContextCpu()).px
503
+ py_before = particles.copy(_context=xo.ContextCpu()).py
504
+ ptau_before = particles.copy(_context=xo.ContextCpu()).ptau
505
+ zeta_before = particles.copy(_context=xo.ContextCpu()).zeta
506
+ gamma0_before = particles.copy(_context=xo.ContextCpu()).gamma0
507
+ telem.track(particles)
508
+
509
+ particles.move(_context=xo.ContextCpu())
510
+ xo.assert_allclose((particles.ptau - ptau_before)/particles.beta0,
511
+ -2e-3, atol=1e-14, rtol=1e-14)
512
+
513
+ _check_consistency_energy_variables(particles)
514
+
515
+ assert np.all(particles.gamma0 == gamma0_before)
516
+ assert np.all(particles.zeta == zeta_before)
517
+ assert np.all(particles.px == px_before)
518
+ assert np.all(particles.py == py_before)
519
+
520
+
521
+ @for_all_test_contexts
522
+ def test_LocalParticle_update_p0c(test_context):
523
+ class TestElement(xt.BeamElement):
524
+ _xofields={
525
+ 'value': xo.Float64,
526
+ }
527
+ _extra_c_sources = ['''
528
+ /*gpufun*/
529
+ void TestElement_track_local_particle(
530
+ TestElementData el, LocalParticle* part0){
531
+ double const value = TestElementData_get_value(el);
532
+ //start_per_particle_block (part0->part)
533
+ LocalParticle_update_p0c(part, value);
534
+ //end_per_particle_block
535
+ }
536
+ ''']
537
+
538
+ telem = TestElement(_context=test_context, value=1.5e9)
539
+
540
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
541
+ px=[1e-6, -1e-6], py=[2e-6, 0], zeta=0.1)
542
+
543
+ _check_consistency_energy_variables(
544
+ particles.copy(_context=xo.ContextCpu()))
545
+ px_before = particles.copy(_context=xo.ContextCpu()).px
546
+ py_before = particles.copy(_context=xo.ContextCpu()).py
547
+ energy_before = particles.copy(_context=xo.ContextCpu()).energy
548
+ beta0_before = particles.copy(_context=xo.ContextCpu()).beta0
549
+ p0c_before = particles.copy(_context=xo.ContextCpu()).p0c
550
+ zeta_before = particles.copy(_context=xo.ContextCpu()).zeta
551
+ telem.track(particles)
552
+
553
+ particles.move(_context=xo.ContextCpu())
554
+ xo.assert_allclose(particles.p0c, 1.5e9, atol=1e-14, rtol=1e-14)
555
+ xo.assert_allclose(particles.energy, energy_before, atol=1e-14, rtol=1e-14)
556
+
557
+ _check_consistency_energy_variables(particles)
558
+
559
+ xo.assert_allclose(particles.zeta, zeta_before*particles.beta0/beta0_before, atol=1e-14)
560
+ xo.assert_allclose(particles.px, px_before*p0c_before/particles.p0c, atol=1e-14)
561
+ xo.assert_allclose(particles.py, py_before*p0c_before/particles.p0c, atol=1e-14)
562
+
563
+
564
+
565
+ @for_all_test_contexts
566
+ def test_LocalParticle_angles(test_context):
567
+ class ScaleAng(xt.BeamElement):
568
+ _xofields={
569
+ 'scale_x': xo.Float64,
570
+ 'scale_y': xo.Float64,
571
+ 'scale_x2': xo.Float64,
572
+ 'scale_y2': xo.Float64,
573
+ }
574
+ _extra_c_sources = ['''
575
+ /*gpufun*/
576
+ void ScaleAng_track_local_particle(
577
+ ScaleAngData el, LocalParticle* part0){
578
+ double const scale_x = ScaleAngData_get_scale_x(el);
579
+ double const scale_y = ScaleAngData_get_scale_y(el);
580
+ double const scale_x2 = ScaleAngData_get_scale_x2(el);
581
+ double const scale_y2 = ScaleAngData_get_scale_y2(el);
582
+ //start_per_particle_block (part0->part)
583
+ LocalParticle_scale_xp(part, scale_x);
584
+ LocalParticle_scale_yp(part, scale_y);
585
+ LocalParticle_scale_xp_yp(part, scale_x2, scale_y2);
586
+ //end_per_particle_block
587
+ }
588
+ ''']
589
+
590
+ class KickAng(xt.BeamElement):
591
+ _xofields={
592
+ 'kick_x': xo.Float64,
593
+ 'kick_y': xo.Float64,
594
+ 'kick_x2': xo.Float64,
595
+ 'kick_y2': xo.Float64,
596
+ }
597
+ _extra_c_sources = ['''
598
+ /*gpufun*/
599
+ void KickAng_track_local_particle(
600
+ KickAngData el, LocalParticle* part0){
601
+ double const kick_x = KickAngData_get_kick_x(el);
602
+ double const kick_y = KickAngData_get_kick_y(el);
603
+ double const kick_x2 = KickAngData_get_kick_x2(el);
604
+ double const kick_y2 = KickAngData_get_kick_y2(el);
605
+ //start_per_particle_block (part0->part)
606
+ LocalParticle_add_to_xp(part, kick_x);
607
+ LocalParticle_add_to_yp(part, kick_y);
608
+ LocalParticle_add_to_xp_yp(part, kick_x2, kick_y2);
609
+ //end_per_particle_block
610
+ }
611
+ ''']
612
+
613
+ telem1 = KickAng(_context=test_context, kick_x=-5.0e-3, kick_y=2.0e-3, kick_x2=12.0e-3, kick_y2=-6.0e-3)
614
+ telem2 = ScaleAng(_context=test_context, scale_x=2.5, scale_y=1.3, scale_x2=1.2, scale_y2=0.7)
615
+ line = xt.Line(elements=[xt.Drift(length=1.2), telem1, xt.Drift(length=0.3),
616
+ telem2, xt.Drift(length=2.8)])
617
+ line.build_tracker(_context=test_context)
618
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
619
+ px=[1.0e-3, -1.0e-3], py=[2.0e-3, -1.2e-3], zeta=0.1)
620
+ line.track(particles)
621
+ particles.move(_context=xo.ContextCpu())
622
+ xo.assert_allclose(particles.px, [24.0e-3, 18.021e-3], atol=1e-14, rtol=1e-14)
623
+ xo.assert_allclose(particles.py, [-1.82e-3, -4.73564e-3], atol=1e-14, rtol=1e-14)
624
+
625
+ class ScaleAngExact(xt.BeamElement):
626
+ _xofields={
627
+ 'scale_x': xo.Float64,
628
+ 'scale_y': xo.Float64,
629
+ 'scale_x2': xo.Float64,
630
+ 'scale_y2': xo.Float64,
631
+ }
632
+ _extra_c_sources = ['''
633
+ /*gpufun*/
634
+ void ScaleAngExact_track_local_particle(
635
+ ScaleAngExactData el, LocalParticle* part0){
636
+ double const scale_x = ScaleAngExactData_get_scale_x(el);
637
+ double const scale_y = ScaleAngExactData_get_scale_y(el);
638
+ double const scale_x2 = ScaleAngExactData_get_scale_x2(el);
639
+ double const scale_y2 = ScaleAngExactData_get_scale_y2(el);
640
+ //start_per_particle_block (part0->part)
641
+ LocalParticle_scale_exact_xp(part, scale_x);
642
+ LocalParticle_scale_exact_yp(part, scale_y);
643
+ LocalParticle_scale_exact_xp_yp(part, scale_x2, scale_y2);
644
+ //end_per_particle_block
645
+ }
646
+ ''']
647
+
648
+ class KickAngExact(xt.BeamElement):
649
+ _xofields={
650
+ 'kick_x': xo.Float64,
651
+ 'kick_y': xo.Float64,
652
+ 'kick_x2': xo.Float64,
653
+ 'kick_y2': xo.Float64,
654
+ }
655
+ _extra_c_sources = ['''
656
+ /*gpufun*/
657
+ void KickAngExact_track_local_particle(
658
+ KickAngExactData el, LocalParticle* part0){
659
+ double const kick_x = KickAngExactData_get_kick_x(el);
660
+ double const kick_y = KickAngExactData_get_kick_y(el);
661
+ double const kick_x2 = KickAngExactData_get_kick_x2(el);
662
+ double const kick_y2 = KickAngExactData_get_kick_y2(el);
663
+ //start_per_particle_block (part0->part)
664
+ LocalParticle_add_to_exact_xp(part, kick_x);
665
+ LocalParticle_add_to_exact_yp(part, kick_y);
666
+ LocalParticle_add_to_exact_xp_yp(part, kick_x2, kick_y2);
667
+ //end_per_particle_block
668
+ }
669
+ ''']
670
+
671
+ telem1 = KickAngExact(_context=test_context, kick_x=-5.0e-3, kick_y=2.0e-3, kick_x2=12.0e-3, kick_y2=-6.0e-3)
672
+ telem2 = ScaleAngExact(_context=test_context, scale_x=2.5, scale_y=1.3, scale_x2=1.2, scale_y2=0.7)
673
+ line = xt.Line(elements=[xt.Drift(length=1.2), telem1, xt.Drift(length=0.3),
674
+ telem2, xt.Drift(length=2.8)])
675
+ line.build_tracker(_context=test_context)
676
+ particles = xp.Particles(_context=test_context, p0c=1.4e9, delta=[0, 1e-3],
677
+ px=[1.0e-3, -1.0e-3], py=[2.0e-3, -1.2e-3], zeta=0.1)
678
+ line.track(particles)
679
+ particles.move(_context=xo.ContextCpu())
680
+ xo.assert_allclose(particles.px, [23.99302e-3, 18.01805e-3], atol=1e-14)
681
+ xo.assert_allclose(particles.py, [-1.81976e-3, -4.73529e-3], atol=1e-14, rtol=5e-7)