xtrack 0.87.1__tar.gz → 0.88.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.87.1/xtrack.egg-info → xtrack-0.88.1}/PKG-INFO +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_lhc_match_phase_15.py +2 -2
- xtrack-0.88.1/tests/test_load_vars.py +120 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_madnginterface.py +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_magnet.py +2 -2
- xtrack-0.88.1/tests/test_quadrupole_fringe_ptc.py +66 -0
- xtrack-0.88.1/tests/test_quadrupole_wedge.py +94 -0
- xtrack-0.88.1/tests/test_rbend_straight_body.py +348 -0
- xtrack-0.88.1/tests/test_survey.py +499 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_vs_madx.py +1 -1
- xtrack-0.88.1/xtrack/_version.py +1 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements.py +37 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/rbend.h +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet.h +70 -3
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet_edge.h +12 -2
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +9 -10
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_wedge.h +27 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/wedge.h +12 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/magnets.py +8 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/line.py +106 -35
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multisetter/multisetter.py +2 -2
- xtrack-0.88.1/xtrack/survey.py +587 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/twiss.py +2 -2
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/twissplot.py +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1/xtrack.egg-info}/PKG-INFO +1 -1
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack.egg-info/SOURCES.txt +4 -0
- xtrack-0.87.1/tests/test_survey.py +0 -124
- xtrack-0.87.1/xtrack/_version.py +0 -1
- xtrack-0.87.1/xtrack/survey.py +0 -323
- {xtrack-0.87.1 → xtrack-0.88.1}/LICENSE +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/MANIFEST.in +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/README.md +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/base_classes.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/BB6D.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/beambeam.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/boost.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/qgauss.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/slicing.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/elements.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/line.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/mathlibs.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/particles.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/ducktrack/temp_pyparticles.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/pyproject.toml +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/setup.cfg +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/setup.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_acceleration.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_amplitude_detuning.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_aperture_table.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_apertures.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_attr_replicas_and_slices.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_bucket_with_ref_energy_change.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_cavity_absolute_time.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_coasting.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_collective_tracker.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_collimation.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_electron_cooler.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_element_characterization_functions.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_element_internal_record.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_elements.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_elements_classflags.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_elements_thick.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_environment.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_footprint.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_freeze_longitudinal.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_full_rings.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_h6_sps_beamline.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_hvkick.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_ions.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_legacy_multiline_to_env.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_lhc_env.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_line.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_load.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_lumi.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_mad_writer.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_madloader.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_and_track_from_element.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_coupling_knob.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_nested.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_optics_and_ip_knob.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_orbit_bump.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_match_tune_chroma_cminus.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_monitor.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_multi_bunch_gauss.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_multiline.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_multisetter.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_multispecies.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_native_madloader.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_optimize_for_tracking.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_particles.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_particles_basics.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_particles_pdg.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_periodic_symmetric_twiss_and_match.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_pipeline.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_prebuild_kernels.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_ps_against_ptc.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_ps_multiturn_twiss.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_psb_chicane.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_pyht_interface.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radial_steering.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radiation.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_radiation_integrals.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_random_gen.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_random_gen_exp.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_random_gen_gauss.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_random_gen_ruth.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_rbend_rbarc.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_rf_track.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_rotation_signs.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_second_order_taylor_map.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_seeds.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_slice_elements.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_slicing.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_spacecharge_in_ring.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_spin.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_sps_thick.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_tapering.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_thick_lhc.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_tilt_shifts.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_tracker.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_trajectory_correcton.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_twiss.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_twiss_vs_madx_psb.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/tests/test_xmask_orbit_correction.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/aperture_meas.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/base_element.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/beam_interaction.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/magnet.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/marker.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/slnd.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_cavity.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/exciter.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/rft_element.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/slice_elements_edge.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/beam_elements/slice_elements_thin.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/environment.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/footprint.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/general.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/atomicadd.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/checks.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/constants.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/particle_states.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/synrad_spectrum.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/headers/track.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/internal_record.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/json.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/linear_normal_form.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/load.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/loss_location_refinement/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/lumi.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_loader.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_parser/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_parser/loader.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_parser/madx.lark +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_parser/parse.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/mad_writer.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/madng_interface.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/match.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_position_monitor.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_position_monitor.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_size_monitor.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/beam_size_monitor.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/last_turns_monitor.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/last_turns_monitor.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/particles_monitor.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/monitors/particles_monitor.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multiline.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multiline_legacy/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multiline_legacy/shared_knobs.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/multisetter/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/constants.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/masses.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/particles.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/pdg.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/rng_src/base_rng.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/pipeline/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/pipeline/core.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/pipeline/manager.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/pipeline/multitracker.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/progress_indicator.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_generators.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/exponential.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/normal.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/rutherford.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/uniform.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/slicing.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/svgutils/__init__.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/svgutils/parser.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/svgutils/path.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/svgutils/svgutils.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/synctime.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/tapering.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/targets.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/tracker.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/tracker_data.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/tracker_src/tracker.h +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack/trajectory_correction.py +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack.egg-info/dependency_links.txt +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack.egg-info/requires.txt +0 -0
- {xtrack-0.87.1 → xtrack-0.88.1}/xtrack.egg-info/top_level.txt +0 -0
|
@@ -17,9 +17,9 @@ test_data_folder = pathlib.Path(
|
|
|
17
17
|
'config',
|
|
18
18
|
['noshift', 'shift']
|
|
19
19
|
)
|
|
20
|
-
@for_all_test_contexts
|
|
21
20
|
@fix_random_seed(2836475)
|
|
22
|
-
def test_lhc_match_phase_15(
|
|
21
|
+
def test_lhc_match_phase_15(config):
|
|
22
|
+
test_context = xo.ContextCpu()
|
|
23
23
|
|
|
24
24
|
if config == 'noshift':
|
|
25
25
|
d_mux_15_b1 = 0
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# copyright ############################### #
|
|
2
|
+
# This file is part of the Xtrack Package. #
|
|
3
|
+
# Copyright (c) CERN, 2025. #
|
|
4
|
+
# ######################################### #
|
|
5
|
+
import pytest
|
|
6
|
+
import xtrack as xt
|
|
7
|
+
import json
|
|
8
|
+
import textwrap
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@pytest.fixture
|
|
12
|
+
def madx_vars():
|
|
13
|
+
return """
|
|
14
|
+
b := 3 * a;
|
|
15
|
+
a = 5;
|
|
16
|
+
c := 4 * z;
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@pytest.fixture
|
|
21
|
+
def json_vars():
|
|
22
|
+
dct = {
|
|
23
|
+
'b': '3 * a',
|
|
24
|
+
'a': 5,
|
|
25
|
+
'c': '4 * z'
|
|
26
|
+
}
|
|
27
|
+
return json.dumps(dct)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@pytest.fixture
|
|
31
|
+
def python_file():
|
|
32
|
+
source = """
|
|
33
|
+
import xtrack as xt
|
|
34
|
+
env = xt.get_environment()
|
|
35
|
+
env.vars.default_to_zero = True
|
|
36
|
+
env['b'] = '3 * a'
|
|
37
|
+
env['a'] = 5
|
|
38
|
+
env['c'] = '4 * z'
|
|
39
|
+
"""
|
|
40
|
+
return textwrap.dedent(source)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@pytest.mark.parametrize(
|
|
44
|
+
'input_fixture,format', [
|
|
45
|
+
('madx_vars', 'madx'),
|
|
46
|
+
('json_vars', 'json'),
|
|
47
|
+
]
|
|
48
|
+
)
|
|
49
|
+
def test_load_vars_string(input_fixture, format, request):
|
|
50
|
+
input_data = request.getfixturevalue(input_fixture)
|
|
51
|
+
env = xt.Environment()
|
|
52
|
+
env.vars.load(string=input_data, format=format)
|
|
53
|
+
|
|
54
|
+
assert str(env.get_expr('b')) == "(3.0 * vars['a'])"
|
|
55
|
+
assert env['b'] == 15
|
|
56
|
+
assert env.get_expr('a') is None
|
|
57
|
+
assert env['a'] == 5
|
|
58
|
+
assert str(env.get_expr('c')) == "(4.0 * vars['z'])"
|
|
59
|
+
assert env['c'] == 0
|
|
60
|
+
assert env.get_expr('z') is None
|
|
61
|
+
assert env['z'] == 0
|
|
62
|
+
|
|
63
|
+
@pytest.mark.parametrize(
|
|
64
|
+
'input_fixture,format,suffix', [
|
|
65
|
+
('madx_vars', 'madx', 'madx'),
|
|
66
|
+
('json_vars', 'json', 'json'),
|
|
67
|
+
('python_file', 'python', 'py'),
|
|
68
|
+
]
|
|
69
|
+
)
|
|
70
|
+
@pytest.mark.parametrize('with_format', [True, False])
|
|
71
|
+
def test_load_file(input_fixture, format, suffix, with_format, tmpdir, request):
|
|
72
|
+
input_data = request.getfixturevalue(input_fixture)
|
|
73
|
+
|
|
74
|
+
temp_file = tmpdir / f'test_input.{suffix}'
|
|
75
|
+
with open(temp_file, 'w') as f:
|
|
76
|
+
f.write(input_data)
|
|
77
|
+
|
|
78
|
+
kwargs = {'file': str(temp_file)}
|
|
79
|
+
if with_format:
|
|
80
|
+
kwargs['format'] = format
|
|
81
|
+
env = xt.Environment()
|
|
82
|
+
env.vars.load(**kwargs)
|
|
83
|
+
|
|
84
|
+
assert str(env.get_expr('b')) == "(3.0 * vars['a'])"
|
|
85
|
+
assert env['b'] == 15
|
|
86
|
+
assert env.get_expr('a') is None
|
|
87
|
+
assert env['a'] == 5
|
|
88
|
+
assert str(env.get_expr('c')) == "(4.0 * vars['z'])"
|
|
89
|
+
assert env['c'] == 0
|
|
90
|
+
assert env.get_expr('z') is None
|
|
91
|
+
assert env['z'] == 0
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@pytest.mark.parametrize(
|
|
95
|
+
'input_fixture,format,suffix', [
|
|
96
|
+
('madx_vars', 'madx', 'madx'),
|
|
97
|
+
('json_vars', 'json', 'json'),
|
|
98
|
+
]
|
|
99
|
+
)
|
|
100
|
+
@pytest.mark.parametrize('with_format', [True, False])
|
|
101
|
+
def test_load_http(input_fixture, format, suffix, with_format, tmpdir, request, requests_mock):
|
|
102
|
+
input_data = request.getfixturevalue(input_fixture)
|
|
103
|
+
|
|
104
|
+
url = f'http://example.com/test_input.{suffix}'
|
|
105
|
+
requests_mock.get(url, text=input_data)
|
|
106
|
+
|
|
107
|
+
kwargs = {'file': url}
|
|
108
|
+
if with_format:
|
|
109
|
+
kwargs['format'] = format
|
|
110
|
+
env = xt.Environment()
|
|
111
|
+
env.vars.load(**kwargs)
|
|
112
|
+
|
|
113
|
+
assert str(env.get_expr('b')) == "(3.0 * vars['a'])"
|
|
114
|
+
assert env['b'] == 15
|
|
115
|
+
assert env.get_expr('a') is None
|
|
116
|
+
assert env['a'] == 5
|
|
117
|
+
assert str(env.get_expr('c')) == "(4.0 * vars['z'])"
|
|
118
|
+
assert env['c'] == 0
|
|
119
|
+
assert env.get_expr('z') is None
|
|
120
|
+
assert env['z'] == 0
|
|
@@ -124,6 +124,6 @@ def test_madng_survey():
|
|
|
124
124
|
xo.assert_allclose(survey.psi, xsurvey.psi, atol=1e-5, rtol=0)
|
|
125
125
|
xo.assert_allclose(survey.s, xsurvey.s, atol=1e-5, rtol=0)
|
|
126
126
|
xo.assert_allclose(survey.angle, xsurvey.angle, atol=1e-5, rtol=0)
|
|
127
|
-
xo.assert_allclose(survey.tilt, xsurvey.
|
|
127
|
+
xo.assert_allclose(survey.tilt, xsurvey.rot_s_rad, atol=1e-5, rtol=0)
|
|
128
128
|
# Length doesn't work because of multipoles.
|
|
129
129
|
#xo.assert_allclose(survey.length, xsurvey.length, atol=1e-5, rtol=0)
|
|
@@ -992,7 +992,7 @@ def test_edge_full_model_with_dipole_component_and_angle(test_context):
|
|
|
992
992
|
# The rotation is also the other way than in the underlying map :'(
|
|
993
993
|
xt.DipoleEdge(model='full', k=3, fint=0.3, hgap=0.4),
|
|
994
994
|
xt.MultipoleEdge(kn=[0, 4, 5], order=2),
|
|
995
|
-
xt.Wedge(angle=-0.2, k=3),
|
|
995
|
+
xt.Wedge(angle=-0.2, k=3, k1=4, quad_wedge_then_dip_wedge=1),
|
|
996
996
|
]
|
|
997
997
|
|
|
998
998
|
p0 = xt.Particles(
|
|
@@ -1030,7 +1030,7 @@ def test_edge_full_model_with_dipole_component_and_angle_exit(test_context):
|
|
|
1030
1030
|
fringe_integral=0.3, half_gap=0.4, k_order=2, _context=test_context
|
|
1031
1031
|
)
|
|
1032
1032
|
e_ref = [
|
|
1033
|
-
xt.Wedge(angle=-0.2, k=3),
|
|
1033
|
+
xt.Wedge(angle=-0.2, k=3, k1=4),
|
|
1034
1034
|
xt.MultipoleEdge(kn=[0, 4, 5], is_exit=True, order=2),
|
|
1035
1035
|
xt.DipoleEdge(model='full', k=-3, fint=0.3, hgap=0.4),
|
|
1036
1036
|
xt.YRotation(angle=np.rad2deg(-0.2)),
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Checks entrance fringe for very strong quadrupole against values of PTC
|
|
2
|
+
|
|
3
|
+
import xtrack as xt
|
|
4
|
+
import numpy as np
|
|
5
|
+
from cpymad.madx import Madx
|
|
6
|
+
|
|
7
|
+
def test_quadrupole_fringe_ptc():
|
|
8
|
+
b2 = 100
|
|
9
|
+
b1 = 0
|
|
10
|
+
length=1e-20
|
|
11
|
+
|
|
12
|
+
# Initial conditions
|
|
13
|
+
x0 = 0.07
|
|
14
|
+
px0 = 0.03
|
|
15
|
+
y0 = 0.08
|
|
16
|
+
py0 = 0.06
|
|
17
|
+
zeta0 = 0.04
|
|
18
|
+
delta0=0.1
|
|
19
|
+
beta0=0.1
|
|
20
|
+
|
|
21
|
+
p0 = xt.Particles(x=x0,px=px0,y=y0,py=py0,delta=delta0,zeta=zeta0,beta0=beta0)
|
|
22
|
+
|
|
23
|
+
ptau0 = float(p0.ptau)
|
|
24
|
+
tau0 = zeta0/beta0
|
|
25
|
+
|
|
26
|
+
# XSuite
|
|
27
|
+
quadrupole = xt.Bend(length=length, k0=b1, k1=b2,
|
|
28
|
+
edge_entry_model='full', edge_exit_model='full')
|
|
29
|
+
line = xt.Line(elements=[ quadrupole])
|
|
30
|
+
line.discard_tracker()
|
|
31
|
+
line.build_tracker()
|
|
32
|
+
line.track(p0)
|
|
33
|
+
|
|
34
|
+
mat = line.compute_one_turn_matrix_finite_differences(p0)['R_matrix']
|
|
35
|
+
det = np.linalg.det(mat)
|
|
36
|
+
|
|
37
|
+
assert np.isclose(det, 1.0)
|
|
38
|
+
|
|
39
|
+
# PTC
|
|
40
|
+
madx_sequence = line.to_madx_sequence('quadrupole_fringes')
|
|
41
|
+
|
|
42
|
+
madx = Madx()
|
|
43
|
+
madx.beam(particle='proton', beta=beta0)
|
|
44
|
+
madx.input(madx_sequence)
|
|
45
|
+
madx.use('quadrupole_fringes')
|
|
46
|
+
|
|
47
|
+
madx.input(f"""
|
|
48
|
+
ptc_create_universe;
|
|
49
|
+
ptc_create_layout, exact=true;
|
|
50
|
+
ptc_setswitch, fringe=true;
|
|
51
|
+
ptc_start, x={x0}, px={px0}, y={y0}, py={py0}, t={tau0}, pt={ptau0};
|
|
52
|
+
ptc_track, icase=6, TURNS=1;
|
|
53
|
+
ptc_track_end;
|
|
54
|
+
ptc_end;
|
|
55
|
+
stop;
|
|
56
|
+
"""
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
df = madx.table.tracksumm.dframe()
|
|
60
|
+
|
|
61
|
+
assert np.isclose(p0.x, df.x[-1])
|
|
62
|
+
assert np.isclose(p0.px, df.px[-1])
|
|
63
|
+
assert np.isclose(p0.y, df.y[-1])
|
|
64
|
+
assert np.isclose(p0.py, df.py[-1])
|
|
65
|
+
assert np.isclose(p0.ptau, df.pt[-1])
|
|
66
|
+
assert np.isclose(p0.zeta/p0.beta0, df.t[-1])
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import xtrack as xt
|
|
2
|
+
import numpy as np
|
|
3
|
+
from cpymad.madx import Madx
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_quadrupole_wedge():
|
|
7
|
+
"""
|
|
8
|
+
Hardcoded test for quadrupole wedge with hard edge fringe.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
angle = 0.1
|
|
12
|
+
b2 = 5
|
|
13
|
+
b1 = 0
|
|
14
|
+
|
|
15
|
+
quadrupole = xt.Bend(length=0, k0=b1, k1=b2, edge_entry_angle=angle,
|
|
16
|
+
edge_entry_model='full')
|
|
17
|
+
line= xt.Line(elements=[quadrupole])
|
|
18
|
+
|
|
19
|
+
x=np.linspace(-1e-2, 1e-2, 5)
|
|
20
|
+
px=np.linspace(-5e-2, 5e-2, 5)
|
|
21
|
+
y=np.linspace(-2e-2, 2e-2, 5)
|
|
22
|
+
py=np.linspace(-3e-2, 3e-2, 5)
|
|
23
|
+
|
|
24
|
+
p0 = xt.Particles(x=x,px=px,y=y,py=py)
|
|
25
|
+
|
|
26
|
+
line.discard_tracker()
|
|
27
|
+
line.build_tracker()
|
|
28
|
+
line.track(p0)
|
|
29
|
+
|
|
30
|
+
x_expval = np.array([-0.0100055, -0.00500069, 0., 0.00500069, 0.01000557])
|
|
31
|
+
px_expval = np.array([-5.00952476e-02, -2.50259834e-02, 1.38777878e-17, 2.49697042e-02, 4.98702638e-02])
|
|
32
|
+
y_expval = np.array([-0.01999435, -0.00999929, 0., 0.00999928, 0.01999424])
|
|
33
|
+
py_expval = np.array([-0.0301435, -0.01503677, 0., 0.01496143, 0.02984211])
|
|
34
|
+
|
|
35
|
+
assert np.allclose(p0.x, x_expval)
|
|
36
|
+
assert np.allclose(p0.px, px_expval)
|
|
37
|
+
assert np.allclose(p0.y, y_expval)
|
|
38
|
+
assert np.allclose(p0.py, py_expval)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_quadrupole_wedge_ptc():
|
|
42
|
+
"""
|
|
43
|
+
Test against PTC with MAD8_WEDGE=False.
|
|
44
|
+
Hardcoded values since the option is not available without recompiling PTC.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
angle_in = 0.1
|
|
48
|
+
angle_out = 0.13
|
|
49
|
+
b2 = 100
|
|
50
|
+
b1 = 0
|
|
51
|
+
length=1e-20
|
|
52
|
+
|
|
53
|
+
x0 = 0.07
|
|
54
|
+
px0 = 0.03
|
|
55
|
+
y0 = 0.08
|
|
56
|
+
py0 = 0.06
|
|
57
|
+
zeta0 = 0.04
|
|
58
|
+
delta0=0.1
|
|
59
|
+
beta0=0.1
|
|
60
|
+
|
|
61
|
+
p0 = xt.Particles(x=x0,px=px0,y=y0,py=py0,delta=delta0,zeta=zeta0,beta0=beta0)
|
|
62
|
+
|
|
63
|
+
ptau0 = float(p0.ptau)
|
|
64
|
+
tau0 = zeta0/beta0
|
|
65
|
+
|
|
66
|
+
# XSuite
|
|
67
|
+
quadrupole = xt.Bend(length=length, k0=b1, k1=b2,
|
|
68
|
+
edge_entry_angle=angle_in, edge_exit_angle=angle_out,
|
|
69
|
+
edge_entry_model='full', edge_exit_model='full')
|
|
70
|
+
line = xt.Line(elements=[quadrupole])
|
|
71
|
+
|
|
72
|
+
line.discard_tracker()
|
|
73
|
+
line.build_tracker()
|
|
74
|
+
line.track(p0)
|
|
75
|
+
|
|
76
|
+
mat = line.compute_one_turn_matrix_finite_differences(p0)['R_matrix']
|
|
77
|
+
det = np.linalg.det(mat)
|
|
78
|
+
|
|
79
|
+
assert np.isclose(det, 1.0)
|
|
80
|
+
|
|
81
|
+
# PTC values
|
|
82
|
+
x_ptc = 0.07043818253
|
|
83
|
+
px_ptc = 0.1313937438
|
|
84
|
+
y_ptc = 0.07993855538
|
|
85
|
+
py_ptc = -0.07321782159
|
|
86
|
+
tau_ptc = 0.4245507041
|
|
87
|
+
ptau_ptc = 0.01049449328
|
|
88
|
+
|
|
89
|
+
assert np.isclose(p0.x, x_ptc)
|
|
90
|
+
assert np.isclose(p0.px, px_ptc)
|
|
91
|
+
assert np.isclose(p0.y, y_ptc)
|
|
92
|
+
assert np.isclose(p0.py, py_ptc)
|
|
93
|
+
assert np.isclose(p0.zeta/p0.beta0, tau_ptc)
|
|
94
|
+
assert np.isclose(p0.ptau, ptau_ptc)
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import xtrack as xt
|
|
2
|
+
import numpy as np
|
|
3
|
+
import xobjects as xo
|
|
4
|
+
from xobjects.test_helpers import for_all_test_contexts
|
|
5
|
+
|
|
6
|
+
import pathlib
|
|
7
|
+
|
|
8
|
+
test_data_folder = pathlib.Path(
|
|
9
|
+
__file__).parent.joinpath('../test_data').absolute()
|
|
10
|
+
|
|
11
|
+
@for_all_test_contexts
|
|
12
|
+
def test_rbend_straight_body_edge_full(test_context):
|
|
13
|
+
|
|
14
|
+
edge_model = 'full'
|
|
15
|
+
|
|
16
|
+
b_ref = xt.RBend(angle=0.1, k0_from_h=True, length_straight=3.)
|
|
17
|
+
b_ref.edge_entry_model = edge_model
|
|
18
|
+
b_ref.edge_exit_model = edge_model
|
|
19
|
+
b_ref.model = 'rot-kick-rot'
|
|
20
|
+
b_ref.num_multipole_kicks = 100
|
|
21
|
+
l_ref = xt.Line([b_ref])
|
|
22
|
+
l_ref.append('end', xt.Marker())
|
|
23
|
+
l_ref.particle_ref = xt.Particles(p0c=10e9)
|
|
24
|
+
l_ref.build_tracker(_context=test_context)
|
|
25
|
+
tw_ref0 = l_ref.twiss(betx=1, bety=1)
|
|
26
|
+
tw_ref = l_ref.twiss(betx=1, bety=1, x=2e-3, px=1e-3, y=2e-3, py=2e-3, delta=1e-3)
|
|
27
|
+
|
|
28
|
+
b_test = xt.RBend(
|
|
29
|
+
angle=0.1, k0_from_h=True, length_straight=3)
|
|
30
|
+
b_test.rbend_model = 'straight-body'
|
|
31
|
+
b_test.model = 'bend-kick-bend'
|
|
32
|
+
b_test.num_multipole_kicks = 100
|
|
33
|
+
b_test.edge_entry_model = edge_model
|
|
34
|
+
b_test.edge_exit_model = edge_model
|
|
35
|
+
l_test = xt.Line([b_test])
|
|
36
|
+
l_test.append('end', xt.Marker())
|
|
37
|
+
l_test.particle_ref = xt.Particles(p0c=10e9)
|
|
38
|
+
l_test.build_tracker(_context=test_context)
|
|
39
|
+
tw_test0 = l_test.twiss(betx=1, bety=1)
|
|
40
|
+
tw_test = l_test.twiss(betx=1, bety=1, x=2e-3, px=1e-3, y=2e-3, py=2e-3, delta=1e-3)
|
|
41
|
+
|
|
42
|
+
xo.assert_allclose(tw_ref0.betx, tw_test0.betx, rtol=1e-9, atol=0.0)
|
|
43
|
+
xo.assert_allclose(tw_ref0.bety, tw_test0.bety, rtol=1e-9, atol=0.0)
|
|
44
|
+
xo.assert_allclose(tw_ref0.x, tw_test0.x, rtol=0, atol=1e-12)
|
|
45
|
+
xo.assert_allclose(tw_ref0.y, tw_test0.y, rtol=0, atol=1e-12)
|
|
46
|
+
xo.assert_allclose(tw_ref0.s, tw_test0.s, rtol=0, atol=1e-12)
|
|
47
|
+
xo.assert_allclose(tw_ref0.zeta, tw_test0.zeta, rtol=0, atol=1e-11)
|
|
48
|
+
xo.assert_allclose(tw_ref0.px, tw_test0.px, rtol=0, atol=1e-12)
|
|
49
|
+
xo.assert_allclose(tw_ref0.py, tw_test0.py, rtol=0, atol=1e-12)
|
|
50
|
+
|
|
51
|
+
xo.assert_allclose(tw_ref.betx, tw_test.betx, rtol=5e-9, atol=0.0)
|
|
52
|
+
xo.assert_allclose(tw_ref.bety, tw_test.bety, rtol=5e-9, atol=0.0)
|
|
53
|
+
xo.assert_allclose(tw_ref.x, tw_test.x, rtol=0, atol=1e-12)
|
|
54
|
+
xo.assert_allclose(tw_ref.y, tw_test.y, rtol=0, atol=1e-12)
|
|
55
|
+
xo.assert_allclose(tw_ref.s, tw_test.s, rtol=0, atol=1e-12)
|
|
56
|
+
xo.assert_allclose(tw_ref.zeta, tw_test.zeta, rtol=0, atol=1e-1)
|
|
57
|
+
xo.assert_allclose(tw_ref.px, tw_test.px, rtol=0, atol=1e-12)
|
|
58
|
+
xo.assert_allclose(tw_ref.py, tw_test.py, rtol=0, atol=1e-12)
|
|
59
|
+
|
|
60
|
+
l_sliced = l_test.copy(shallow=True)
|
|
61
|
+
l_sliced.cut_at_s(np.linspace(0, l_test.get_length(), 100))
|
|
62
|
+
tw_test_sliced0 = l_sliced.twiss(betx=1, bety=1)
|
|
63
|
+
|
|
64
|
+
xo.assert_allclose(tw_test_sliced0.betx[-1], tw_test0.betx[-1], rtol=1e-9, atol=0.0)
|
|
65
|
+
xo.assert_allclose(tw_test_sliced0.bety[-1], tw_test0.bety[-1], rtol=1e-9, atol=0.0)
|
|
66
|
+
xo.assert_allclose(tw_test_sliced0.x[-1], tw_test0.x[-1], rtol=0, atol=1e-12)
|
|
67
|
+
xo.assert_allclose(tw_test_sliced0.y[-1], tw_test0.y[-1], rtol=0, atol=1e-12)
|
|
68
|
+
xo.assert_allclose(tw_test_sliced0.s[-1], tw_test0.s[-1], rtol=0, atol=1e-12)
|
|
69
|
+
xo.assert_allclose(tw_test_sliced0.zeta[-1], tw_test0.zeta[-1], rtol=0, atol=1e-11)
|
|
70
|
+
xo.assert_allclose(tw_test_sliced0.px[-1], tw_test0.px[-1], rtol=0, atol=1e-12)
|
|
71
|
+
xo.assert_allclose(tw_test_sliced0.py[-1], tw_test0.py[-1], rtol=0, atol=1e-12)
|
|
72
|
+
|
|
73
|
+
@for_all_test_contexts
|
|
74
|
+
def test_rbend_straight_body_edge_linear(test_context):
|
|
75
|
+
|
|
76
|
+
edge_model = 'linear'
|
|
77
|
+
|
|
78
|
+
b_ref = xt.RBend(angle=0.1, k0_from_h=True, length_straight=3.)
|
|
79
|
+
b_ref.edge_entry_model = edge_model
|
|
80
|
+
b_ref.edge_exit_model = edge_model
|
|
81
|
+
b_ref.model = 'rot-kick-rot'
|
|
82
|
+
b_ref.num_multipole_kicks = 100
|
|
83
|
+
l_ref = xt.Line([b_ref])
|
|
84
|
+
l_ref.append('end', xt.Marker())
|
|
85
|
+
l_ref.particle_ref = xt.Particles(p0c=10e9)
|
|
86
|
+
l_ref.build_tracker(_context=test_context)
|
|
87
|
+
tw_ref0 = l_ref.twiss(betx=1, bety=1)
|
|
88
|
+
tw_ref = l_ref.twiss(betx=1, bety=1, x=2e-3, px=1e-3, y=2e-3, py=2e-3, delta=1e-3)
|
|
89
|
+
|
|
90
|
+
b_test = xt.RBend(
|
|
91
|
+
angle=0.1, k0_from_h=True, length_straight=3)
|
|
92
|
+
b_test.rbend_model = 'straight-body'
|
|
93
|
+
b_test.model = 'bend-kick-bend'
|
|
94
|
+
b_test.num_multipole_kicks = 100
|
|
95
|
+
b_test.edge_entry_model = edge_model
|
|
96
|
+
b_test.edge_exit_model = edge_model
|
|
97
|
+
l_test = xt.Line([b_test])
|
|
98
|
+
l_test.append('end', xt.Marker())
|
|
99
|
+
l_test.particle_ref = xt.Particles(p0c=10e9)
|
|
100
|
+
l_test.build_tracker(_context=test_context)
|
|
101
|
+
tw_test0 = l_test.twiss(betx=1, bety=1)
|
|
102
|
+
tw_test = l_test.twiss(betx=1, bety=1, x=2e-3, px=1e-3, y=2e-3, py=2e-3, delta=1e-3)
|
|
103
|
+
|
|
104
|
+
xo.assert_allclose(tw_ref0.betx, tw_test0.betx, rtol=1e-9, atol=0.0)
|
|
105
|
+
xo.assert_allclose(tw_ref0.bety, tw_test0.bety, rtol=1e-9, atol=0.0)
|
|
106
|
+
xo.assert_allclose(tw_ref0.x, tw_test0.x, rtol=0, atol=1e-12)
|
|
107
|
+
xo.assert_allclose(tw_ref0.y, tw_test0.y, rtol=0, atol=1e-12)
|
|
108
|
+
xo.assert_allclose(tw_ref0.s, tw_test0.s, rtol=0, atol=1e-12)
|
|
109
|
+
xo.assert_allclose(tw_ref0.zeta, tw_test0.zeta, rtol=0, atol=1e-11)
|
|
110
|
+
xo.assert_allclose(tw_ref0.px, tw_test0.px, rtol=0, atol=1e-12)
|
|
111
|
+
xo.assert_allclose(tw_ref0.py, tw_test0.py, rtol=0, atol=1e-12)
|
|
112
|
+
|
|
113
|
+
xo.assert_allclose(tw_ref.betx, tw_test.betx, rtol=5e-6, atol=0.0)
|
|
114
|
+
xo.assert_allclose(tw_ref.bety, tw_test.bety, rtol=5e-6, atol=0.0)
|
|
115
|
+
xo.assert_allclose(tw_ref.x, tw_test.x, rtol=0, atol=1e-8)
|
|
116
|
+
xo.assert_allclose(tw_ref.y, tw_test.y, rtol=0, atol=1e-8)
|
|
117
|
+
xo.assert_allclose(tw_ref.s, tw_test.s, rtol=0, atol=1e-12)
|
|
118
|
+
xo.assert_allclose(tw_ref.zeta, tw_test.zeta, rtol=0, atol=1e-1)
|
|
119
|
+
xo.assert_allclose(tw_ref.px, tw_test.px, rtol=0, atol=1e-9)
|
|
120
|
+
xo.assert_allclose(tw_ref.py, tw_test.py, rtol=0, atol=1e-9)
|
|
121
|
+
|
|
122
|
+
tw_back = l_test.twiss(init=tw_test, init_at='end')
|
|
123
|
+
|
|
124
|
+
assert tw_back.orientation == 'backward'
|
|
125
|
+
xo.assert_allclose(tw_back.betx, tw_test.betx, rtol=5e-6, atol=0.0)
|
|
126
|
+
xo.assert_allclose(tw_back.bety, tw_test.bety, rtol=5e-6, atol=0.0)
|
|
127
|
+
xo.assert_allclose(tw_back.x, tw_test.x, rtol=0, atol=1e-8)
|
|
128
|
+
xo.assert_allclose(tw_back.y, tw_test.y, rtol=0, atol=1e-8)
|
|
129
|
+
xo.assert_allclose(tw_back.s, tw_test.s, rtol=0, atol=1e-12)
|
|
130
|
+
xo.assert_allclose(tw_back.zeta, tw_test.zeta, rtol=0, atol=1e-1)
|
|
131
|
+
xo.assert_allclose(tw_back.px, tw_test.px, rtol=0, atol=1e-9)
|
|
132
|
+
xo.assert_allclose(tw_back.py, tw_test.py, rtol=0, atol=1e-9)
|
|
133
|
+
|
|
134
|
+
l_sliced = l_test.copy(shallow=True)
|
|
135
|
+
l_sliced.cut_at_s(np.linspace(0, l_test.get_length(), 100))
|
|
136
|
+
tw_test_sliced0 = l_sliced.twiss(betx=1, bety=1)
|
|
137
|
+
|
|
138
|
+
xo.assert_allclose(tw_test_sliced0.betx[-1], tw_test0.betx[-1], rtol=1e-9, atol=0.0)
|
|
139
|
+
xo.assert_allclose(tw_test_sliced0.bety[-1], tw_test0.bety[-1], rtol=1e-9, atol=0.0)
|
|
140
|
+
xo.assert_allclose(tw_test_sliced0.x[-1], tw_test0.x[-1], rtol=0, atol=1e-12)
|
|
141
|
+
xo.assert_allclose(tw_test_sliced0.y[-1], tw_test0.y[-1], rtol=0, atol=1e-12)
|
|
142
|
+
xo.assert_allclose(tw_test_sliced0.s[-1], tw_test0.s[-1], rtol=0, atol=1e-12)
|
|
143
|
+
xo.assert_allclose(tw_test_sliced0.zeta[-1], tw_test0.zeta[-1], rtol=0, atol=1e-11)
|
|
144
|
+
xo.assert_allclose(tw_test_sliced0.px[-1], tw_test0.px[-1], rtol=0, atol=1e-12)
|
|
145
|
+
xo.assert_allclose(tw_test_sliced0.py[-1], tw_test0.py[-1], rtol=0, atol=1e-12)
|
|
146
|
+
|
|
147
|
+
tw_test_sliced_back = l_sliced.twiss(init=tw_test_sliced0, init_at='end')
|
|
148
|
+
|
|
149
|
+
assert tw_test_sliced_back.orientation == 'backward'
|
|
150
|
+
xo.assert_allclose(tw_test_sliced_back.betx, tw_test_sliced0.betx, rtol=5e-9, atol=0.0)
|
|
151
|
+
xo.assert_allclose(tw_test_sliced_back.bety, tw_test_sliced0.bety, rtol=5e-9, atol=0.0)
|
|
152
|
+
xo.assert_allclose(tw_test_sliced_back.x, tw_test_sliced0.x, rtol=0, atol=1e-12)
|
|
153
|
+
xo.assert_allclose(tw_test_sliced_back.y, tw_test_sliced0.y, rtol=0, atol=1e-12)
|
|
154
|
+
xo.assert_allclose(tw_test_sliced_back.s, tw_test_sliced0.s, rtol=0, atol=1e-12)
|
|
155
|
+
xo.assert_allclose(tw_test_sliced_back.zeta, tw_test_sliced0.zeta, rtol=0, atol=1e-11)
|
|
156
|
+
xo.assert_allclose(tw_test_sliced_back.px, tw_test_sliced0.px, rtol=0, atol=1e-12)
|
|
157
|
+
xo.assert_allclose(tw_test_sliced_back.py, tw_test_sliced0.py, rtol=0, atol=1e-12)
|
|
158
|
+
|
|
159
|
+
def test_rbend_straight_body_survey():
|
|
160
|
+
|
|
161
|
+
env = xt.Environment(particle_ref=xt.Particles(p0c=10e9))
|
|
162
|
+
|
|
163
|
+
line = env.new_line(length=5, components=[
|
|
164
|
+
env.new('mb', 'RBend', angle=0.3, k0_from_h=True, length_straight=3,
|
|
165
|
+
rbend_model='straight-body', at=2.5)])
|
|
166
|
+
|
|
167
|
+
line.cut_at_s(np.linspace(0, line.get_length(), 11))
|
|
168
|
+
line.insert('mid', xt.Marker(), at=2.5)
|
|
169
|
+
|
|
170
|
+
line['mb'].rbend_model = 'straight-body'
|
|
171
|
+
sv_straight = line.survey(element0='mid')
|
|
172
|
+
tt_straight = line.get_table(attr=True)
|
|
173
|
+
|
|
174
|
+
line['mb'].rbend_model = 'curved-body'
|
|
175
|
+
sv_curved = line.survey(element0='mid')
|
|
176
|
+
tt_curved = line.get_table(attr=True)
|
|
177
|
+
|
|
178
|
+
tt_straight.cols['s element_type angle_rad']
|
|
179
|
+
# is:
|
|
180
|
+
# Table: 18 rows, 4 cols
|
|
181
|
+
# name s element_type angle_rad
|
|
182
|
+
# drift_1..0 0 DriftSlice 0
|
|
183
|
+
# drift_1..1 0.5 DriftSlice 0
|
|
184
|
+
# mb_entry 0.99436 Marker 0
|
|
185
|
+
# mb..entry_map 0.99436 ThinSliceRBendEntry 0.15
|
|
186
|
+
# mb..0 0.99436 ThickSliceRBend 0
|
|
187
|
+
# mb..1 1 ThickSliceRBend 0
|
|
188
|
+
# mb..2 1.5 ThickSliceRBend 0
|
|
189
|
+
# mb..3 2 ThickSliceRBend 0
|
|
190
|
+
# mid 2.5 Marker 0
|
|
191
|
+
# mb..4 2.5 ThickSliceRBend 0
|
|
192
|
+
# mb..5 3 ThickSliceRBend 0
|
|
193
|
+
# mb..6 3.5 ThickSliceRBend 0
|
|
194
|
+
# mb..7 4 ThickSliceRBend 0
|
|
195
|
+
# mb..exit_map 4.00564 ThinSliceRBendExit 0.15
|
|
196
|
+
# mb_exit 4.00564 Marker 0
|
|
197
|
+
# drift_2..0 4.00564 DriftSlice 0
|
|
198
|
+
# drift_2..1 4.5 DriftSlice 0
|
|
199
|
+
# _end_point 5 0
|
|
200
|
+
|
|
201
|
+
assert np.all(tt_straight['name'] == [
|
|
202
|
+
'drift_1..0', 'drift_1..1', 'mb_entry', 'mb..entry_map', 'mb..0',
|
|
203
|
+
'mb..1', 'mb..2', 'mb..3', 'mid', 'mb..4', 'mb..5', 'mb..6', 'mb..7',
|
|
204
|
+
'mb..exit_map', 'mb_exit', 'drift_2..0', 'drift_2..1', '_end_point'
|
|
205
|
+
])
|
|
206
|
+
|
|
207
|
+
# Assert entire columns using np.all
|
|
208
|
+
assert np.all(tt_straight['element_type'] == [
|
|
209
|
+
'DriftSlice', 'DriftSlice', 'Marker', 'ThinSliceRBendEntry', 'ThickSliceRBend',
|
|
210
|
+
'ThickSliceRBend', 'ThickSliceRBend', 'ThickSliceRBend', 'Marker', 'ThickSliceRBend',
|
|
211
|
+
'ThickSliceRBend', 'ThickSliceRBend', 'ThickSliceRBend', 'ThinSliceRBendExit',
|
|
212
|
+
'Marker', 'DriftSlice', 'DriftSlice', ''
|
|
213
|
+
])
|
|
214
|
+
|
|
215
|
+
xo.assert_allclose(
|
|
216
|
+
tt_straight['angle_rad'],
|
|
217
|
+
np.array([0, 0, 0, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.15, 0, 0, 0, 0]),
|
|
218
|
+
atol=1e-12
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
xo.assert_allclose(tt_straight['s'], np.array([
|
|
222
|
+
0. , 0.5 , 0.9943602, 0.9943602, 0.9943602, 1. ,
|
|
223
|
+
1.5 , 2. , 2.5 , 2.5 , 3. , 3.5 ,
|
|
224
|
+
4. , 4.0056398, 4.0056398, 4.0056398, 4.5 , 5. ]
|
|
225
|
+
), atol=1e-5)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
tt_curved.cols['s element_type angle_rad']
|
|
229
|
+
# is:
|
|
230
|
+
# Table: 18 rows, 4 cols
|
|
231
|
+
# name s element_type angle_rad
|
|
232
|
+
# drift_1..0 0 DriftSlice 0
|
|
233
|
+
# drift_1..1 0.5 DriftSlice 0
|
|
234
|
+
# mb_entry 0.99436 Marker 0
|
|
235
|
+
# mb..entry_map 0.99436 ThinSliceRBendEntry 0
|
|
236
|
+
# mb..0 0.99436 ThickSliceRBend 0.000561868
|
|
237
|
+
# mb..1 1 ThickSliceRBend 0.0498127
|
|
238
|
+
# mb..2 1.5 ThickSliceRBend 0.0498127
|
|
239
|
+
# mb..3 2 ThickSliceRBend 0.0498127
|
|
240
|
+
# mid 2.5 Marker 0
|
|
241
|
+
# mb..4 2.5 ThickSliceRBend 0.0498127
|
|
242
|
+
# mb..5 3 ThickSliceRBend 0.0498127
|
|
243
|
+
# mb..6 3.5 ThickSliceRBend 0.0498127
|
|
244
|
+
# mb..7 4 ThickSliceRBend 0.000561868
|
|
245
|
+
# mb..exit_map 4.00564 ThinSliceRBendExit 0
|
|
246
|
+
# mb_exit 4.00564 Marker 0
|
|
247
|
+
# drift_2..0 4.00564 DriftSlice 0
|
|
248
|
+
# drift_2..1 4.5 DriftSlice 0
|
|
249
|
+
# _end_point 5 0
|
|
250
|
+
|
|
251
|
+
assert np.all(tt_curved['name'] == [
|
|
252
|
+
'drift_1..0', 'drift_1..1', 'mb_entry', 'mb..entry_map', 'mb..0',
|
|
253
|
+
'mb..1', 'mb..2', 'mb..3', 'mid', 'mb..4', 'mb..5', 'mb..6', 'mb..7',
|
|
254
|
+
'mb..exit_map', 'mb_exit', 'drift_2..0', 'drift_2..1', '_end_point'
|
|
255
|
+
])
|
|
256
|
+
|
|
257
|
+
assert np.all(tt_curved['element_type'] == [
|
|
258
|
+
'DriftSlice', 'DriftSlice', 'Marker', 'ThinSliceRBendEntry', 'ThickSliceRBend',
|
|
259
|
+
'ThickSliceRBend', 'ThickSliceRBend', 'ThickSliceRBend', 'Marker', 'ThickSliceRBend',
|
|
260
|
+
'ThickSliceRBend', 'ThickSliceRBend', 'ThickSliceRBend', 'ThinSliceRBendExit',
|
|
261
|
+
'Marker', 'DriftSlice', 'DriftSlice', ''
|
|
262
|
+
])
|
|
263
|
+
|
|
264
|
+
xo.assert_allclose(
|
|
265
|
+
tt_curved['angle_rad'],
|
|
266
|
+
np.array([0, 0, 0, 0, 0.000561868, 0.0498127, 0.0498127, 0.0498127, 0, 0.0498127,
|
|
267
|
+
0.0498127, 0.0498127, 0.000561868, 0, 0, 0, 0, 0]),
|
|
268
|
+
rtol=1e-6
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
xo.assert_allclose(tt_curved['s'], np.array([
|
|
272
|
+
0. , 0.5 , 0.9943602, 0.9943602, 0.9943602, 1. ,
|
|
273
|
+
1.5 , 2. , 2.5 , 2.5 , 3. , 3.5 ,
|
|
274
|
+
4. , 4.0056398, 4.0056398, 4.0056398, 4.5 , 5. ]
|
|
275
|
+
), atol=1e-5)
|
|
276
|
+
|
|
277
|
+
def test_rbend_straight_sps():
|
|
278
|
+
|
|
279
|
+
env = xt.load(test_data_folder / 'sps_thick/sps.seq')
|
|
280
|
+
env.vars.load(test_data_folder / 'sps_thick/lhc_q20.str')
|
|
281
|
+
|
|
282
|
+
line = env['sps']
|
|
283
|
+
line.particle_ref = xt.Particles(p0c=26e9, mass0=xt.PROTON_MASS_EV)
|
|
284
|
+
|
|
285
|
+
tt = line.get_table()
|
|
286
|
+
tt_rbend = tt.rows[tt.element_type == 'RBend']
|
|
287
|
+
|
|
288
|
+
line.slice_thick_elements(
|
|
289
|
+
slicing_strategies=[
|
|
290
|
+
xt.Strategy(None),
|
|
291
|
+
xt.Strategy(slicing=xt.Uniform(10, mode='thick'), element_type=xt.RBend),
|
|
292
|
+
])
|
|
293
|
+
|
|
294
|
+
line.set(tt_rbend, edge_entry_model='full')
|
|
295
|
+
line.set(tt_rbend, edge_exit_model='full')
|
|
296
|
+
|
|
297
|
+
line.set(tt_rbend, rbend_model='straight-body')
|
|
298
|
+
tw_straight = line.twiss4d()
|
|
299
|
+
|
|
300
|
+
line.set(tt_rbend, rbend_model='curved-body')
|
|
301
|
+
tw_curved = line.twiss4d()
|
|
302
|
+
|
|
303
|
+
xo.assert_allclose(tw_curved.x.max(), 0, rtol=0, atol=1e-9)
|
|
304
|
+
assert tw_straight.x.max() > 3e-3
|
|
305
|
+
|
|
306
|
+
xo.assert_allclose(tw_straight.qx, tw_curved.qx, rtol=0, atol=1e-8)
|
|
307
|
+
xo.assert_allclose(tw_straight.qy, tw_curved.qy, rtol=0, atol=1e-8)
|
|
308
|
+
xo.assert_allclose(tw_straight.dqx, tw_curved.dqx, rtol=0, atol=1e-3)
|
|
309
|
+
xo.assert_allclose(tw_straight.dqy, tw_curved.dqy, rtol=0, atol=1e-3)
|
|
310
|
+
xo.assert_allclose(tw_straight.rows['qf.*|qd.*'].betx,
|
|
311
|
+
tw_curved.rows['qf.*|qd.*'].betx,
|
|
312
|
+
atol=0, rtol=1e-8)
|
|
313
|
+
xo.assert_allclose(tw_straight.rows['qf.*|qd.*'].bety,
|
|
314
|
+
tw_curved.rows['qf.*|qd.*'].bety,
|
|
315
|
+
atol=0, rtol=1e-8)
|
|
316
|
+
xo.assert_allclose(tw_straight.rows['qf.*|qd.*'].x, 0, atol=1e-10, rtol=0)
|
|
317
|
+
xo.assert_allclose(tw_straight.rows['qf.*|qd.*'].y, 0, atol=1e-10, rtol=0)
|
|
318
|
+
|
|
319
|
+
# Switch to electrons to check synchrotron radiation features
|
|
320
|
+
|
|
321
|
+
# 20 GeV electrons (like in LEP times)
|
|
322
|
+
env.particle_ref = xt.Particles(energy0=20e9, mass0=xt.ELECTRON_MASS_EV)
|
|
323
|
+
line.particle_ref = env.particle_ref
|
|
324
|
+
|
|
325
|
+
line['actcse.31632'].voltage = 4.2e+08
|
|
326
|
+
line['actcse.31632'].frequency = 3e6
|
|
327
|
+
line['actcse.31632'].lag = 180.
|
|
328
|
+
|
|
329
|
+
line.configure_radiation(model='mean')
|
|
330
|
+
|
|
331
|
+
line.set(tt_rbend, rbend_model='curved-body')
|
|
332
|
+
tw_rad_curved = line.twiss(eneloss_and_damping=True,
|
|
333
|
+
radiation_integrals=True)
|
|
334
|
+
|
|
335
|
+
line.set(tt_rbend, rbend_model='straight-body')
|
|
336
|
+
tw_rad_straight = line.twiss(eneloss_and_damping=True,
|
|
337
|
+
radiation_integrals=True)
|
|
338
|
+
|
|
339
|
+
xo.assert_allclose(tw_rad_straight.eq_gemitt_x,
|
|
340
|
+
tw_rad_curved.eq_gemitt_x, rtol=1e-2)
|
|
341
|
+
xo.assert_allclose(tw_rad_straight.eq_gemitt_zeta,
|
|
342
|
+
tw_rad_curved.eq_gemitt_zeta, rtol=1e-2)
|
|
343
|
+
xo.assert_allclose(tw_rad_straight.eq_gemitt_y,
|
|
344
|
+
tw_rad_curved.eq_gemitt_y, atol=1e-20)
|
|
345
|
+
xo.assert_allclose(tw_rad_straight.rad_int_eq_gemitt_x,
|
|
346
|
+
tw_rad_curved.rad_int_eq_gemitt_x, rtol=1e-2)
|
|
347
|
+
xo.assert_allclose(tw_rad_straight.rad_int_eq_gemitt_y,
|
|
348
|
+
tw_rad_curved.rad_int_eq_gemitt_y, atol=1e-20)
|