xtrack 0.79.5__tar.gz → 0.80.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.
- {xtrack-0.79.5/xtrack.egg-info → xtrack-0.80.1}/PKG-INFO +1 -1
- xtrack-0.80.1/tests/test_electron_cooler.py +212 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_elements.py +8 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_ions.py +44 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_native_madloader.py +36 -39
- xtrack-0.80.1/tests/test_optimize_for_tracking.py +79 -0
- xtrack-0.80.1/xtrack/_version.py +1 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements.py +117 -0
- xtrack-0.80.1/xtrack/beam_elements/elements_src/electroncooler.h +142 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/slice_elements.py +30 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/constants.h +8 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/line.py +1 -1
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_parser/loader.py +23 -28
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_parser/madx.lark +11 -1
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_parser/parse.py +41 -60
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/twiss.py +2 -9
- {xtrack-0.79.5 → xtrack-0.80.1/xtrack.egg-info}/PKG-INFO +1 -1
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack.egg-info/SOURCES.txt +3 -0
- xtrack-0.79.5/xtrack/_version.py +0 -1
- {xtrack-0.79.5 → xtrack-0.80.1}/LICENSE +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/MANIFEST.in +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/README.md +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/base_classes.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/BB6D.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/beambeam.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/boost.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/qgauss.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/slicing.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/elements.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/line.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/mathlibs.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/particles.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/ducktrack/temp_pyparticles.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/pyproject.toml +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/setup.cfg +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/setup.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_acceleration.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_amplitude_detuning.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_apertures.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_attr_replicas_and_slices.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_bucket_with_ref_energy_change.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_cavity_absolute_time.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_coasting.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_collective_tracker.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_collimation.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_element_characterization_functions.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_element_internal_record.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_elements_classflags.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_elements_thick.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_environment.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_footprint.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_freeze_longitudinal.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_full_rings.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_h6_sps_beamline.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_hvkick.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_legacy_multiline_to_env.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_lhc_env.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_lhc_match_phase_15.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_line.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_lumi.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_mad_writer.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_madloader.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_madnginterface.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_magnet.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_and_track_from_element.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_coupling_knob.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_nested.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_optics_and_ip_knob.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_orbit_bump.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_match_tune_chroma_cminus.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_monitor.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_multi_bunch_gauss.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_multiline.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_multisetter.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_multispecies.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_particles.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_particles_basics.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_particles_pdg.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_periodic_symmetric_twiss_and_match.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_pipeline.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_prebuild_kernels.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_ps_against_ptc.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_ps_multiturn_twiss.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_psb_chicane.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_pyht_interface.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_radial_steering.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_radiation.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_random_gen.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_random_gen_exp.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_random_gen_gauss.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_random_gen_ruth.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_rbend_rbarc.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_rf_track.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_rotation_signs.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_second_order_taylor_map.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_seeds.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_slice_elements.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_slicing.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_spacecharge_in_ring.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_sps_thick.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_survey.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_tapering.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_thick_lhc.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_tilt_shifts.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_tracker.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_trajectory_correcton.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_twiss.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_twiss_vs_madx_psb.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_vs_madx.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/tests/test_xmask_orbit_correction.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/base_element.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/beam_interaction.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_elem.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/magnet.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/rbend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/solenoid.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_drift.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thick_slice_solenoid.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_bend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_multipolar_components.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_multipole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_quadrupole.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_solenoid.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/wedge.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/exciter.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/magnets.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/rft_element.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/environment.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/footprint.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/general.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/atomicadd.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/checks.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/particle_states.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/headers/synrad_spectrum.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/internal_record.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/json.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/linear_normal_form.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/loss_location_refinement/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/lumi.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_loader.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_parser/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/mad_writer.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/madng_interface.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/match.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_position_monitor.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_position_monitor.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_size_monitor.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/beam_size_monitor.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/last_turns_monitor.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/last_turns_monitor.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/particles_monitor.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/monitors/particles_monitor.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multiline.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multiline_legacy/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multiline_legacy/shared_knobs.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multisetter/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/multisetter/multisetter.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/constants.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/masses.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/particles.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/pdg.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/rng_src/base_rng.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/pipeline/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/pipeline/core.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/pipeline/manager.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/pipeline/multitracker.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/progress_indicator.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/__init__.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_generators.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/exponential.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/normal.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/rutherford.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/uniform.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/slicing.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/survey.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/synctime.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/tapering.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/targets.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/tracker.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/tracker_data.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/tracker_src/tracker.h +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/trajectory_correction.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack/twissplot.py +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack.egg-info/dependency_links.txt +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack.egg-info/requires.txt +0 -0
- {xtrack-0.79.5 → xtrack-0.80.1}/xtrack.egg-info/top_level.txt +0 -0
@@ -0,0 +1,212 @@
|
|
1
|
+
# copyright ############################### #
|
2
|
+
# This file is part of the Xtrack Package. #
|
3
|
+
# Copyright (c) CERN, 2021. #
|
4
|
+
# ######################################### #
|
5
|
+
|
6
|
+
import numpy as np
|
7
|
+
import pytest
|
8
|
+
import pathlib
|
9
|
+
from cpymad.madx import Madx
|
10
|
+
from scipy.stats import linregress
|
11
|
+
from scipy import constants as cst
|
12
|
+
import ducktrack as dtk
|
13
|
+
import xobjects as xo
|
14
|
+
import xpart as xp
|
15
|
+
import xtrack as xt
|
16
|
+
from xobjects.test_helpers import for_all_test_contexts, fix_random_seed
|
17
|
+
from xtrack.beam_elements.elements import _angle_from_trig
|
18
|
+
|
19
|
+
test_data_folder = pathlib.Path(
|
20
|
+
__file__).parent.joinpath('../test_data').absolute()
|
21
|
+
|
22
|
+
|
23
|
+
@for_all_test_contexts
|
24
|
+
def test_ecooler_emittance(test_context):
|
25
|
+
"""Test the electron cooler by comparing the cooling rate with Betacool for LEIR.
|
26
|
+
"""
|
27
|
+
data = np.load(test_data_folder/'electron_cooler/emittance_betacool.npz')
|
28
|
+
emittance_betacool = data['emittance']
|
29
|
+
time_betacool = data['time']
|
30
|
+
|
31
|
+
gamma0 = 1.004469679
|
32
|
+
beta0 = np.sqrt(1 - 1 / gamma0**2)
|
33
|
+
mass0 = 193729.0248722061 * 1e6 # eV/c^2
|
34
|
+
clight = 299792458.0
|
35
|
+
p0c = mass0 * beta0 * gamma0 # eV/c
|
36
|
+
q0 = 54
|
37
|
+
particle_ref = xp.Particles(p0c=p0c,q0=q0,mass0=mass0,beta0=beta0,gamma0=gamma0)
|
38
|
+
|
39
|
+
circumference = 78.54370266 # m
|
40
|
+
T_per_turn = circumference/(clight*beta0)
|
41
|
+
|
42
|
+
qx = 1.82
|
43
|
+
qy = 2.72
|
44
|
+
beta_x = 5
|
45
|
+
beta_y = 5
|
46
|
+
qs=0.005247746218929317
|
47
|
+
bets0=-2078.673348423543
|
48
|
+
|
49
|
+
arc = xt.LineSegmentMap(
|
50
|
+
qx=qx, qy=qy,
|
51
|
+
length=circumference,
|
52
|
+
betx=beta_x,
|
53
|
+
bety=beta_y,
|
54
|
+
)
|
55
|
+
|
56
|
+
arc_matching = xt.LineSegmentMap(
|
57
|
+
qx=qx, qy=qy,
|
58
|
+
length=circumference,
|
59
|
+
betx=beta_x,
|
60
|
+
bety=beta_y,
|
61
|
+
qs=qs,
|
62
|
+
bets=bets0)
|
63
|
+
|
64
|
+
line_matching=xt.Line([arc_matching])
|
65
|
+
line_matching.build_tracker()
|
66
|
+
|
67
|
+
num_particles=int(1e2)
|
68
|
+
sigma_dp = 5e-3
|
69
|
+
gemitt_x = 14e-6
|
70
|
+
gemitt_y = 14e-6
|
71
|
+
|
72
|
+
nemitt_x = gemitt_x*beta0*gamma0
|
73
|
+
nemitt_y = gemitt_y*beta0*gamma0
|
74
|
+
|
75
|
+
particles = xp.generate_matched_gaussian_bunch(
|
76
|
+
num_particles=num_particles,
|
77
|
+
nemitt_x=nemitt_x, nemitt_y=nemitt_y, sigma_z=4.2,
|
78
|
+
particle_ref=particle_ref,
|
79
|
+
line=line_matching,
|
80
|
+
)
|
81
|
+
|
82
|
+
particles.delta = np.random.normal(loc=0.0, scale=sigma_dp, size=num_particles)
|
83
|
+
particles.zeta = np.random.uniform(-circumference/2, circumference/2, num_particles)
|
84
|
+
|
85
|
+
max_time_s = 1
|
86
|
+
int_time_s = 1*1e-3
|
87
|
+
num_turns = int((max_time_s / T_per_turn).item())
|
88
|
+
save_interval = int((int_time_s / T_per_turn).item())
|
89
|
+
|
90
|
+
monitor = xt.ParticlesMonitor(start_at_turn=0, stop_at_turn=1,
|
91
|
+
n_repetitions=int(num_turns/save_interval),
|
92
|
+
repetition_period=save_interval,
|
93
|
+
num_particles=len(particles.x))
|
94
|
+
|
95
|
+
current = 0.6 # amperes
|
96
|
+
cooler_length = 2.5 # m cooler length
|
97
|
+
radius_e_beam = 25 * 1e-3
|
98
|
+
temp_perp = 100e-3 # <E> [eV] = kb*T
|
99
|
+
temp_long = 1e-3 # <E> [eV]
|
100
|
+
magnetic_field = 0.075 # T for LEIR
|
101
|
+
|
102
|
+
electron_cooler = xt.ElectronCooler(current=current,
|
103
|
+
length=cooler_length,
|
104
|
+
radius_e_beam=radius_e_beam,
|
105
|
+
temp_perp=temp_perp, temp_long=temp_long,
|
106
|
+
magnetic_field=magnetic_field)
|
107
|
+
|
108
|
+
line = xt.Line(elements=[monitor, electron_cooler, arc],element_names=['monitor','electron_cooler','arc'])
|
109
|
+
line.particle_ref = particle_ref
|
110
|
+
line.build_tracker()
|
111
|
+
|
112
|
+
line.track(particles, num_turns=num_turns,
|
113
|
+
turn_by_turn_monitor=False,with_progress=True)
|
114
|
+
|
115
|
+
x = monitor.x[:,:,0]
|
116
|
+
px = monitor.px[:,:,0]
|
117
|
+
time = monitor.at_turn[:, 0, 0] * T_per_turn
|
118
|
+
|
119
|
+
action_x = (x**2/beta_x + beta_x*px**2)
|
120
|
+
geo_emittance_x=np.mean(action_x,axis=1)/2
|
121
|
+
|
122
|
+
# Match Betacool and Xsuite indices to compare emittance
|
123
|
+
valid_indices = ~np.isnan(time_betacool)
|
124
|
+
time_betacool = time_betacool[valid_indices]
|
125
|
+
matched_indices = [np.abs(time - tb).argmin() for tb in time_betacool]
|
126
|
+
emittance_xsuite = geo_emittance_x[matched_indices]
|
127
|
+
emittance_betacool = emittance_betacool[:len(emittance_xsuite)]
|
128
|
+
|
129
|
+
xo.assert_allclose(emittance_xsuite, emittance_betacool, rtol=0, atol=1e-5)
|
130
|
+
|
131
|
+
@for_all_test_contexts
|
132
|
+
def test_ecooler_force(test_context):
|
133
|
+
"""Test the electron cooler by comparing the cooling force with Betacool for LEIR.
|
134
|
+
"""
|
135
|
+
# Load Betacool force data
|
136
|
+
data_betacool = np.load(test_data_folder/'electron_cooler/force_betacool.npz')
|
137
|
+
v_diff_betacool = data_betacool['v_diff']
|
138
|
+
force_betacool = data_betacool['force']
|
139
|
+
|
140
|
+
beta_rel = 0.09423258405
|
141
|
+
gamma = 1.004469679
|
142
|
+
current = 0.6 # Amperes
|
143
|
+
cooler_length = 2.5 # m
|
144
|
+
radius_e_beam = 25 * 1e-3 # m
|
145
|
+
temp_perp = 100e-3 # eV
|
146
|
+
temp_long = 1e-3 # eV
|
147
|
+
magnetic_field = 0.075 # T for LEIR
|
148
|
+
mass0 = 193729.0248722061 * 1e6 # eV/c^2
|
149
|
+
clight = 299792458.0 # m/s
|
150
|
+
p0c = mass0 * beta_rel * gamma # eV/c
|
151
|
+
q0 = 54 # Charge
|
152
|
+
beta_x = 5 # m
|
153
|
+
emittance = 14 * 1e-6 # Initial geometric emittance (m·rad)
|
154
|
+
|
155
|
+
# Reference particle
|
156
|
+
particle_ref = xp.Particles(p0c=p0c, mass0=mass0, q0=q0)
|
157
|
+
|
158
|
+
# Electron cooler
|
159
|
+
cooler = xt.ElectronCooler(
|
160
|
+
current=current,
|
161
|
+
length=cooler_length,
|
162
|
+
radius_e_beam=radius_e_beam,
|
163
|
+
temp_perp=temp_perp,
|
164
|
+
temp_long=temp_long,
|
165
|
+
magnetic_field=magnetic_field,
|
166
|
+
record_flag=1
|
167
|
+
)
|
168
|
+
|
169
|
+
num_particles = int(1e4)
|
170
|
+
particles = xp.Particles(
|
171
|
+
mass0=mass0,
|
172
|
+
p0c=p0c,
|
173
|
+
q0=q0,
|
174
|
+
x=np.random.normal(0, 1e-20, num_particles),
|
175
|
+
px=np.random.normal(0, 4 * np.sqrt(emittance / beta_x), num_particles),
|
176
|
+
y=np.random.normal(0, 1e-20, num_particles),
|
177
|
+
py=np.random.normal(0, 1e-20, num_particles),
|
178
|
+
delta=np.zeros(num_particles),
|
179
|
+
zeta=np.zeros(num_particles)
|
180
|
+
)
|
181
|
+
|
182
|
+
line = xt.Line(elements=[cooler])
|
183
|
+
line.particle_ref = particle_ref
|
184
|
+
line.build_tracker()
|
185
|
+
|
186
|
+
# Start internal logging for the electron cooler
|
187
|
+
record = line.start_internal_logging_for_elements_of_type(
|
188
|
+
xt.ElectronCooler, capacity=10000)
|
189
|
+
|
190
|
+
line.track(particles)
|
191
|
+
force = record.Fx
|
192
|
+
particle_id=record.particle_id[:num_particles]
|
193
|
+
particle_id_sort=np.argsort(particle_id)
|
194
|
+
|
195
|
+
force=force[particle_id_sort]
|
196
|
+
|
197
|
+
px_tot = p0c * particles.px
|
198
|
+
beta_diff = px_tot / (mass0 * gamma)
|
199
|
+
v_diff = beta_diff * clight
|
200
|
+
|
201
|
+
sorted_indices = np.argsort(v_diff)
|
202
|
+
v_diff = v_diff[sorted_indices]
|
203
|
+
force = force[sorted_indices]
|
204
|
+
|
205
|
+
# Match Betacool and Xsuite indices to compare forces
|
206
|
+
v_diff_betacool = v_diff_betacool[~np.isnan(v_diff_betacool)]
|
207
|
+
matching_indices = [np.abs(v_diff - vb).argmin() for vb in v_diff_betacool]
|
208
|
+
|
209
|
+
force_xsuite = np.array([force[i] for i in matching_indices])
|
210
|
+
force_betacool = force_betacool[:len(v_diff_betacool)]
|
211
|
+
|
212
|
+
xo.assert_allclose(force_xsuite, force_betacool, rtol=0, atol=10)
|
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
import numpy as np
|
7
7
|
import pytest
|
8
|
+
import pathlib
|
8
9
|
from cpymad.madx import Madx
|
9
10
|
from scipy.stats import linregress
|
10
11
|
from scipy import constants as cst
|
@@ -15,6 +16,9 @@ import xtrack as xt
|
|
15
16
|
from xobjects.test_helpers import for_all_test_contexts, fix_random_seed
|
16
17
|
from xtrack.beam_elements.elements import _angle_from_trig
|
17
18
|
|
19
|
+
test_data_folder = pathlib.Path(
|
20
|
+
__file__).parent.joinpath('../test_data').absolute()
|
21
|
+
|
18
22
|
|
19
23
|
@for_all_test_contexts
|
20
24
|
def test_constructor(test_context):
|
@@ -43,6 +47,8 @@ def test_constructor(test_context):
|
|
43
47
|
sampling_frequency=1e3),
|
44
48
|
xt.Bend(_context=test_context, length=1.),
|
45
49
|
xt.Quadrupole(_context=test_context, length=1.),
|
50
|
+
xt.ElectronCooler(_context=test_context,current=2.4,length=1.5,radius_e_beam=25*1e-3,
|
51
|
+
temp_perp=0.01,temp_long=0.001,magnetic_field=0.060)
|
46
52
|
]
|
47
53
|
|
48
54
|
# test to_dict / from_dict
|
@@ -1246,3 +1252,5 @@ def test_multipole_tilt_90_deg(test_context):
|
|
1246
1252
|
xo.assert_allclose(pf.py, pfy.py, rtol=0, atol=1e-14)
|
1247
1253
|
xo.assert_allclose(pf.zeta, pfy.zeta, rtol=0, atol=1e-14)
|
1248
1254
|
xo.assert_allclose(pf.ptau, pfy.ptau, rtol=0, atol=1e-14)
|
1255
|
+
|
1256
|
+
|
@@ -11,6 +11,50 @@ test_data_folder = pathlib.Path(
|
|
11
11
|
__file__).parent.joinpath('../test_data').absolute()
|
12
12
|
|
13
13
|
|
14
|
+
|
15
|
+
|
16
|
+
@for_all_test_contexts
|
17
|
+
def test_chi(test_context):
|
18
|
+
''' Tests if particles are deflected in quadrupoles according to their chi value.'''
|
19
|
+
|
20
|
+
quad1 = xt.Quadrupole(knl=[0,-0.005])
|
21
|
+
ql = xt.Line(
|
22
|
+
elements = [xt.Drift(length=10), quad1, xt.Drift(length=100)],
|
23
|
+
element_names = ['drift_0', 'quad_0', 'drift_1'])
|
24
|
+
|
25
|
+
|
26
|
+
ql.build_tracker(_context = test_context)
|
27
|
+
|
28
|
+
print(f"Test {test_context.__class__}")
|
29
|
+
|
30
|
+
z0 = 82
|
31
|
+
z = 82
|
32
|
+
m = 192755492342.6663 # pb207
|
33
|
+
m0 = 193687690162.6481
|
34
|
+
ql.particle_ref = xp.Particles(p0c=6.8e12*z0 , q0=z0, mass0=m0)
|
35
|
+
|
36
|
+
# reference species with effective rigidity
|
37
|
+
part1 = ql.particle_ref.copy(_context=test_context)
|
38
|
+
delta = 0
|
39
|
+
chi = (z0/z)*(m/m0)
|
40
|
+
part1.delta = (1 + delta)/(chi) - 1
|
41
|
+
|
42
|
+
# pb207
|
43
|
+
part2 = ql.particle_ref.copy(_context=test_context)
|
44
|
+
part2.chi = (z0/z)*(m/m0)
|
45
|
+
part2.charge_ratio = (z/z0)
|
46
|
+
|
47
|
+
#
|
48
|
+
x0 = 0.0001
|
49
|
+
part1.x = x0
|
50
|
+
part2.x = x0
|
51
|
+
|
52
|
+
ql.track(part1)
|
53
|
+
ql.track(part2)
|
54
|
+
|
55
|
+
xo.assert_allclose(part1.x[0], part2.x[0], rtol=0, atol=1e-6)
|
56
|
+
|
57
|
+
|
14
58
|
@for_all_test_contexts
|
15
59
|
def test_ions(test_context):
|
16
60
|
|
@@ -45,81 +45,74 @@ def test_simple_parser():
|
|
45
45
|
return; ! should also be ignored
|
46
46
|
"""
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
'qd.l': {'deferred': False, 'expr': 0.5},
|
55
|
-
'offset': {'deferred': True, 'expr': 0.1},
|
56
|
-
},
|
48
|
+
env = xt.Environment()
|
49
|
+
env['twopi'] = 2 * math.pi
|
50
|
+
parser = MadxParser(vars=env.vars, functions=env.functions)
|
51
|
+
result = parser.parse_string(sequence)
|
52
|
+
|
53
|
+
expected = {
|
57
54
|
'elements': {
|
58
55
|
'mb': {
|
59
|
-
'angle':
|
60
|
-
'l':
|
56
|
+
'angle': env.vars['hello'],
|
57
|
+
'l': env.vars['mb.l'],
|
61
58
|
'parent': 'sbend',
|
62
59
|
},
|
63
60
|
'qf': {
|
64
|
-
'k1':
|
65
|
-
'l':
|
61
|
+
'k1': 1.0,
|
62
|
+
'l': 1.0,
|
66
63
|
'parent': 'quadrupole',
|
67
64
|
},
|
68
65
|
'qd': {
|
69
|
-
'k1':
|
70
|
-
'l':
|
66
|
+
'k1': -1.0,
|
67
|
+
'l': 1.0,
|
71
68
|
'parent': 'quadrupole',
|
72
69
|
},
|
73
70
|
},
|
74
71
|
'lines': {
|
75
72
|
'line': {
|
76
|
-
'l':
|
73
|
+
'l': 12.0,
|
77
74
|
'parent': 'sequence',
|
78
75
|
'elements': {
|
79
76
|
'ip1': {
|
80
|
-
'at':
|
77
|
+
'at': 0.0,
|
81
78
|
'parent': 'marker',
|
82
79
|
},
|
83
80
|
'qf1': {
|
84
|
-
'at':
|
85
|
-
'from':
|
81
|
+
'at': 1.0 + env.vars['offset'],
|
82
|
+
'from': 'ip1',
|
86
83
|
'parent': 'qf',
|
87
|
-
'slot_id':
|
84
|
+
'slot_id': 1.0,
|
88
85
|
},
|
89
86
|
'mb1': {
|
90
|
-
'at':
|
91
|
-
'from':
|
87
|
+
'at': 2.0 + env.vars['offset'],
|
88
|
+
'from': 'ip1',
|
92
89
|
'parent': 'mb',
|
93
|
-
'slot_id':
|
90
|
+
'slot_id': 2.0,
|
94
91
|
},
|
95
92
|
'qd1': {
|
96
|
-
'at':
|
97
|
-
'from':
|
93
|
+
'at': 3.0 + env.vars['offset'],
|
94
|
+
'from': 'ip1',
|
98
95
|
'parent': 'qd',
|
99
|
-
'slot_id':
|
96
|
+
'slot_id': 3.0,
|
100
97
|
},
|
101
98
|
},
|
102
99
|
},
|
103
100
|
},
|
104
101
|
'parameters': {
|
105
102
|
'mb1': {
|
106
|
-
'k0':
|
107
|
-
'polarity':
|
103
|
+
'k0': env.vars['hello'],
|
104
|
+
'polarity': 1.0,
|
108
105
|
},
|
109
106
|
'qf1': {
|
110
|
-
'knl':
|
107
|
+
'knl': [0.0, 0.0, 0.0, 0.01, 0.0],
|
111
108
|
},
|
112
109
|
'qd1': {
|
113
|
-
'knl':
|
110
|
+
'knl': [0.0, 0.0, 0.0, -0.01, 0.0],
|
114
111
|
},
|
115
112
|
},
|
116
113
|
}
|
117
114
|
|
118
|
-
parser = MadxParser()
|
119
|
-
result = parser.parse_string(sequence)
|
120
|
-
|
121
115
|
def _order_madx_output(item):
|
122
|
-
item['vars'] = OrderedDict(item['vars'])
|
123
116
|
item['elements'] = OrderedDict(item['elements'])
|
124
117
|
item['lines'] = OrderedDict(item['lines'])
|
125
118
|
for line in item['lines'].values():
|
@@ -137,6 +130,7 @@ def test_simple_parser():
|
|
137
130
|
[
|
138
131
|
('a := 42;', 42, None),
|
139
132
|
('c := 3; d := 4; a := c^d;', 81, '(c ** d)'),
|
133
|
+
('c := 3; d := 4; a = c^d;', 81, None),
|
140
134
|
]
|
141
135
|
)
|
142
136
|
def test_parse_simple_expression(input, value, expr):
|
@@ -146,6 +140,10 @@ def test_parse_simple_expression(input, value, expr):
|
|
146
140
|
if expr is not None:
|
147
141
|
formatter = CompactFormatter(None)
|
148
142
|
assert env.get_expr('a')._formatted(formatter) == expr
|
143
|
+
else:
|
144
|
+
assert env.get_expr('a') is None
|
145
|
+
env['c'] = 8
|
146
|
+
assert env['a'] == value
|
149
147
|
|
150
148
|
|
151
149
|
@pytest.fixture(scope='module')
|
@@ -890,13 +888,12 @@ def test_import_seq_length():
|
|
890
888
|
sequence = """
|
891
889
|
qu: quadrupole, l=2, k1=3, k1s=4, tilt=2; ! ignore thick and ktap
|
892
890
|
|
893
|
-
line: sequence, l = ll;
|
894
|
-
qu1: qu, at = 19;
|
895
|
-
endsequence;
|
896
|
-
|
897
891
|
ll := 3 * a;
|
898
892
|
a = 10;
|
899
893
|
|
894
|
+
line: sequence, l = ll;
|
895
|
+
qu1: qu, at = 19;
|
896
|
+
endsequence;
|
900
897
|
"""
|
901
898
|
|
902
899
|
env = xt.load_madx_lattice(string=sequence)
|
@@ -904,7 +901,7 @@ def test_import_seq_length():
|
|
904
901
|
tt = env.line.get_table()
|
905
902
|
assert np.all(tt.name == np.array(['drift_1', 'qu1', 'drift_2', '_end_point']))
|
906
903
|
xo.assert_allclose(tt['s'], np.array([ 0., 18., 20., 30.]), rtol=0, atol=1e-15)
|
907
|
-
assert env.line.builder.length ==
|
904
|
+
assert env.line.builder.length == 30
|
908
905
|
|
909
906
|
|
910
907
|
def test_repeated_element_mad_behaviour():
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import xtrack as xt
|
2
|
+
import xpart as xp
|
3
|
+
|
4
|
+
def test_optimize_with_radiation():
|
5
|
+
|
6
|
+
env = xt.Environment()
|
7
|
+
|
8
|
+
env.new('mb', xt.Bend, length=1, k0=1, h=1)
|
9
|
+
env.new('mq', xt.Quadrupole, length=1, k1=1)
|
10
|
+
env.new('ms', xt.Sextupole, length=1, k2=1)
|
11
|
+
env.new('mo', xt.Octupole, length=1, k3=1)
|
12
|
+
|
13
|
+
element_list = ['mb', 'mq', 'ms', 'mo']
|
14
|
+
|
15
|
+
for element in element_list:
|
16
|
+
line = env.new_line(components=[element])
|
17
|
+
|
18
|
+
line.slice_thick_elements(
|
19
|
+
slicing_strategies=[xt.Strategy(slicing=xt.Teapot(1))])
|
20
|
+
|
21
|
+
line.build_tracker()
|
22
|
+
line.configure_radiation('mean')
|
23
|
+
|
24
|
+
part = xp.Particles(p0c=1e15, x=0.11)
|
25
|
+
line.track(part)
|
26
|
+
|
27
|
+
line.optimize_for_tracking()
|
28
|
+
part_opt = xp.Particles(p0c=1e15, x=0.11)
|
29
|
+
line.track(part_opt)
|
30
|
+
|
31
|
+
assert part.x == part_opt.x
|
32
|
+
assert part.y == part_opt.y
|
33
|
+
assert part.px == part_opt.px
|
34
|
+
assert part.py == part_opt.py
|
35
|
+
assert part.zeta == part_opt.zeta
|
36
|
+
assert part.pzeta == part_opt.pzeta
|
37
|
+
|
38
|
+
def test_optimize_with_delta_taper():
|
39
|
+
|
40
|
+
env = xt.Environment()
|
41
|
+
|
42
|
+
env.new('mb', xt.Bend, length=1, k0=1, h=1)
|
43
|
+
env.new('mq', xt.Quadrupole, length=1, k1=1)
|
44
|
+
env.new('ms', xt.Sextupole, length=1, k2=1)
|
45
|
+
env.new('mo', xt.Octupole, length=1, k3=1)
|
46
|
+
|
47
|
+
thin_classes = [xt.ThinSliceBendEntry, xt.ThinSliceBendExit, xt.ThinSliceBend,
|
48
|
+
xt.ThinSliceQuadrupole, xt.ThinSliceSextupole, xt.ThinSliceOctupole]
|
49
|
+
|
50
|
+
element_list = ['mb', 'mq', 'ms', 'mo']
|
51
|
+
|
52
|
+
for element in element_list:
|
53
|
+
line = env.new_line(components=[element])
|
54
|
+
|
55
|
+
|
56
|
+
line.slice_thick_elements(
|
57
|
+
slicing_strategies=[xt.Strategy(slicing=xt.Teapot(1))])
|
58
|
+
|
59
|
+
for el in line.elements:
|
60
|
+
if type(el) in thin_classes:
|
61
|
+
el.delta_taper = 0.1
|
62
|
+
print(el)
|
63
|
+
|
64
|
+
line.build_tracker()
|
65
|
+
line.configure_radiation('mean')
|
66
|
+
|
67
|
+
part = xp.Particles(p0c=1e15, x=0.11)
|
68
|
+
line.track(part)
|
69
|
+
|
70
|
+
line.optimize_for_tracking()
|
71
|
+
part_opt = xp.Particles(p0c=1e15, x=0.11)
|
72
|
+
line.track(part_opt)
|
73
|
+
|
74
|
+
assert part.x == part_opt.x
|
75
|
+
assert part.y == part_opt.y
|
76
|
+
assert part.px == part_opt.px
|
77
|
+
assert part.py == part_opt.py
|
78
|
+
assert part.zeta == part_opt.zeta
|
79
|
+
assert part.pzeta == part_opt.pzeta
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = '0.80.1'
|
@@ -21,6 +21,8 @@ from xtrack.beam_elements.magnets import (
|
|
21
21
|
DEFAULT_MULTIPOLE_ORDER, SynchrotronRadiationRecord, _prepare_multipolar_params,
|
22
22
|
_NOEXPR_FIELDS, COMMON_MAGNET_SOURCES
|
23
23
|
)
|
24
|
+
from xtrack.internal_record import RecordIndex
|
25
|
+
|
24
26
|
|
25
27
|
class ReferenceEnergyIncrease(BeamElement):
|
26
28
|
|
@@ -3195,6 +3197,121 @@ class SecondOrderTaylorMap(BeamElement):
|
|
3195
3197
|
|
3196
3198
|
return out
|
3197
3199
|
|
3200
|
+
class ElectronCoolerRecord(xo.HybridClass):
|
3201
|
+
_xofields = {
|
3202
|
+
'_index': RecordIndex,
|
3203
|
+
'Fx': xo.Float64[:],
|
3204
|
+
'Fy': xo.Float64[:],
|
3205
|
+
'Fl': xo.Float64[:],
|
3206
|
+
'particle_id': xo.Float64[:]}
|
3207
|
+
class ElectronCooler(BeamElement):
|
3208
|
+
"""
|
3209
|
+
Beam element modeling an electron cooler. In particular, this beam element uses the Parkhomchuk model for electron cooling.
|
3210
|
+
Every turn each particle receives transverse and longitudinal kicks based on the cooling force provided by the Parkhomchuk model.
|
3211
|
+
|
3212
|
+
|
3213
|
+
Parameters
|
3214
|
+
----------
|
3215
|
+
current : float, optional
|
3216
|
+
The current in the electron beam, in amperes.
|
3217
|
+
length : float, optional
|
3218
|
+
The length of the electron cooler, in meters.
|
3219
|
+
radius_e_beam : float, optional
|
3220
|
+
The radius of the electron beam, in meters.
|
3221
|
+
temp_perp : float, optional
|
3222
|
+
The transverse temperature of the electron beam, in electron volts.
|
3223
|
+
temp_long : float, optional
|
3224
|
+
The longitudinal temperature of the electron beam, in electron volts.
|
3225
|
+
magnetic_field : float, optional
|
3226
|
+
The magnetic field strength, in tesla.
|
3227
|
+
offset_x : float, optional
|
3228
|
+
The horizontal offset of the electron cooler, in meters.
|
3229
|
+
offset_px : float, optional
|
3230
|
+
The horizontal angle of the electron cooler, in rad.
|
3231
|
+
offset_y : float, optional
|
3232
|
+
The horizontal offset of the electron cooler, in meters.
|
3233
|
+
offset_py : float, optional
|
3234
|
+
The vertical angle of the electron cooler, in rad.
|
3235
|
+
offset_energy : float, optional
|
3236
|
+
The energy offset of the electrons, in eV.
|
3237
|
+
magnetic_field_ratio : float, optional
|
3238
|
+
The ratio of perpendicular component of magnetic field with the
|
3239
|
+
longitudinal component of the magnetic field. This is a measure
|
3240
|
+
of the magnetic field quality. With the ideal magnetic field quality
|
3241
|
+
being 0.
|
3242
|
+
space_charge : float, optional
|
3243
|
+
Whether space charge of electron beam is enabled. 0 is off and 1 is on.
|
3244
|
+
|
3245
|
+
"""
|
3246
|
+
|
3247
|
+
_xofields = {
|
3248
|
+
'current' : xo.Float64,
|
3249
|
+
'length' : xo.Float64,
|
3250
|
+
'radius_e_beam' : xo.Float64,
|
3251
|
+
'temp_perp' : xo.Float64,
|
3252
|
+
'temp_long' : xo.Float64,
|
3253
|
+
'magnetic_field': xo.Float64,
|
3254
|
+
|
3255
|
+
'offset_x' : xo.Float64,
|
3256
|
+
'offset_px' : xo.Float64,
|
3257
|
+
'offset_y' : xo.Float64,
|
3258
|
+
'offset_py' : xo.Float64,
|
3259
|
+
'offset_energy' : xo.Float64,
|
3260
|
+
|
3261
|
+
'magnetic_field_ratio' : xo.Float64,
|
3262
|
+
'space_charge_factor' : xo.Float64,
|
3263
|
+
'record_flag': xo.Int64,
|
3264
|
+
}
|
3265
|
+
|
3266
|
+
_extra_c_sources = [
|
3267
|
+
_pkg_root.joinpath('headers/constants.h'),
|
3268
|
+
_pkg_root.joinpath('beam_elements/elements_src/electroncooler.h')]
|
3269
|
+
|
3270
|
+
_internal_record_class = ElectronCoolerRecord
|
3271
|
+
|
3272
|
+
def __init__(self, current = 0,
|
3273
|
+
length = 0,
|
3274
|
+
radius_e_beam = 0,
|
3275
|
+
temp_perp = 0,
|
3276
|
+
temp_long = 0,
|
3277
|
+
magnetic_field = 0,
|
3278
|
+
|
3279
|
+
offset_x = 0,
|
3280
|
+
offset_px = 0,
|
3281
|
+
offset_y = 0,
|
3282
|
+
offset_py = 0,
|
3283
|
+
offset_energy = 0,
|
3284
|
+
|
3285
|
+
magnetic_field_ratio = 0,
|
3286
|
+
space_charge_factor = 0,
|
3287
|
+
record_flag =0,
|
3288
|
+
**kwargs):
|
3289
|
+
|
3290
|
+
if "_xobject" in kwargs:
|
3291
|
+
self.xoinitialize(_xobject=kwargs['_xobject'])
|
3292
|
+
return
|
3293
|
+
|
3294
|
+
super().__init__(**kwargs)
|
3295
|
+
self.current = current
|
3296
|
+
self.length = length
|
3297
|
+
self.radius_e_beam = radius_e_beam
|
3298
|
+
self.temp_perp = temp_perp
|
3299
|
+
self.temp_long = temp_long
|
3300
|
+
self.magnetic_field = magnetic_field
|
3301
|
+
|
3302
|
+
self.offset_x = offset_x
|
3303
|
+
self.offset_px = offset_px
|
3304
|
+
self.offset_y = offset_y
|
3305
|
+
self.offset_py = offset_py
|
3306
|
+
self.offset_energy = offset_energy
|
3307
|
+
|
3308
|
+
self.magnetic_field_ratio = magnetic_field_ratio
|
3309
|
+
self.space_charge_factor = space_charge_factor
|
3310
|
+
self.record_flag = record_flag
|
3311
|
+
|
3312
|
+
def get_backtrack_element(self, _context=None, _buffer=None, _offset=None):
|
3313
|
+
raise NotImplementedError
|
3314
|
+
|
3198
3315
|
class ThinSliceNotNeededError(Exception):
|
3199
3316
|
pass
|
3200
3317
|
|