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