xtrack 0.65.5__tar.gz → 0.66.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.65.5/xtrack.egg-info → xtrack-0.66.1}/PKG-INFO +1 -1
- xtrack-0.66.1/tests/test_periodic_symmetric_twiss_and_match.py +154 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_twiss.py +26 -1
- xtrack-0.66.1/xtrack/_version.py +1 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/line.py +1 -2
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/match.py +2 -2
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/trajectory_correction.py +114 -39
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/twiss.py +80 -33
- {xtrack-0.65.5 → xtrack-0.66.1/xtrack.egg-info}/PKG-INFO +1 -1
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack.egg-info/SOURCES.txt +1 -0
- xtrack-0.65.5/xtrack/_version.py +0 -1
- {xtrack-0.65.5 → xtrack-0.66.1}/LICENSE +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/MANIFEST.in +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/README.md +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/base_classes.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/BB6D.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/beambeam.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/boost.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/qgauss.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/slicing.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/be_beamfields/spacecharge.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/elements.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/line.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/mathlibs.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/particles.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/ducktrack/temp_pyparticles.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/pyproject.toml +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/setup.cfg +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/setup.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_acceleration.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_amplitude_detuning.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_apertures.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_attr_replicas_and_slices.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_cavity_absolute_time.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_chromatic_functions_vs_madx.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_coasting.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_collective_tracker.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_collimation.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_element_characterization_functions.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_element_internal_record.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_elements.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_elements_classflags.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_elements_thick.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_fcc_ee_solenoid_correction.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_footprint.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_freeze_longitudinal.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_full_rings.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_hvkick.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_ions.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_lhc_match_phase_15.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_line.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_lumi.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_mad_writer.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_madloader.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_and_track_from_element.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_coupling_knob.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_nested.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_optics_and_ip_knob.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_orbit_bump.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_match_tune_chroma_cminus.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_monitor.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_multiline.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_multisetter.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_multispecies.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_particles_api.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_pipeline.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_prebuild_kernels.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_ps_against_ptc.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_ps_multiturn_twiss.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_psb_chicane.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_pyht_interface.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_radial_steering.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_radiation.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_radiation_equilibrium_emittances.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_random_gen.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_random_gen_exp.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_random_gen_gauss.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_random_gen_ruth.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_rf_track.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_rotation_signs.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_second_order_taylor_map.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_seeds.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_slice_and_insert_with_replicas.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_slice_elements.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_slicing.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_spacecharge_in_ring.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_sps_thick.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_survey.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_tapering.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_thick_lhc.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_tilt_shifts.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_tracker.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_trajectory_correcton.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_twiss_vs_madx_psb.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_var_cache.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_vs_madx.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/tests/test_xmask_orbit_correction.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/lhc_match/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/_temp/lhc_match/var_limits.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/base_element.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/beam_interaction.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/bend.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/cavity.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_elem.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/elens.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/exciter.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/multipole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/octupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/solenoid.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/srotation.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_drift.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thick_slice_solenoid.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_bend.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_multipolar_components.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_multipole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_quadrupole.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_solenoid.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/wedge.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/wire.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/exciter.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/rft_element.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/slice_elements.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/beam_elements/slice_elements_thick.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/footprint.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/general.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/atomicadd.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/checks.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/constants.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/particle_states.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/headers/synrad_spectrum.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/internal_record.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/linear_normal_form.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/loss_location_refinement/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/lumi.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/mad_loader.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/mad_writer.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_position_monitor.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_position_monitor.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_profile_monitor.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_profile_monitor.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_size_monitor.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/beam_size_monitor.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/last_turns_monitor.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/last_turns_monitor.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/particles_monitor.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/monitors/particles_monitor.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multiline/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multiline/multiline.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multiline/shared_knobs.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multisetter/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/multisetter/multisetter.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/constants.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/particles.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/rng_src/base_rng.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/particles/rng_src/particles_rng.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/pipeline/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/pipeline/core.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/pipeline/manager.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/pipeline/multitracker.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/progress_indicator.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/__init__.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_generators.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/exponential.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/normal.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/rutherford.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/uniform.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/random/random_src/uniform_accurate.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/slicing.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/survey.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/synctime.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/tapering.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/targets.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/tracker.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/tracker_data.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/tracker_src/tracker.h +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack/twissplot.py +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack.egg-info/dependency_links.txt +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack.egg-info/requires.txt +0 -0
- {xtrack-0.65.5 → xtrack-0.66.1}/xtrack.egg-info/top_level.txt +0 -0
@@ -0,0 +1,154 @@
|
|
1
|
+
|
2
|
+
import xtrack as xt
|
3
|
+
import xobjects as xo
|
4
|
+
import numpy as np
|
5
|
+
|
6
|
+
def test_periodic_symmetric_twiss_and_match():
|
7
|
+
|
8
|
+
# Build line with half a cell
|
9
|
+
half_cell = xt.Line(
|
10
|
+
elements={
|
11
|
+
'start_cell': xt.Marker(),
|
12
|
+
'drift0': xt.Drift(length=1.),
|
13
|
+
'qf1': xt.Quadrupole(k1=0.027/2, length=1.),
|
14
|
+
'drift1_1': xt.Drift(length=1),
|
15
|
+
'bend1': xt.Bend(k0=3e-4, h=3e-4, length=45.),
|
16
|
+
'drift1_2': xt.Drift(length=1.),
|
17
|
+
'qd1': xt.Quadrupole(k1=-0.0271/2, length=1.),
|
18
|
+
'drift2': xt.Drift(length=1),
|
19
|
+
'mid_cell': xt.Marker(),
|
20
|
+
}
|
21
|
+
)
|
22
|
+
half_cell.particle_ref = xt.Particles(p0c=2e9)
|
23
|
+
|
24
|
+
tw_half_cell = half_cell.twiss4d(init='periodic_symmetric', # <--- periodic-symmetric boundary
|
25
|
+
strengths=True # to get the strengths in table
|
26
|
+
)
|
27
|
+
|
28
|
+
cell = xt.Line(
|
29
|
+
elements={
|
30
|
+
'start_cell': xt.Marker(),
|
31
|
+
'drift0': xt.Drift(length=1.),
|
32
|
+
'qf1': xt.Quadrupole(k1=0.027/2, length=1.),
|
33
|
+
'drift1': xt.Drift(length=1),
|
34
|
+
'bend1': xt.Bend(k0=3e-4, h=3e-4, length=45.),
|
35
|
+
'drift2': xt.Drift(length=1.),
|
36
|
+
'qd1': xt.Quadrupole(k1=-0.0271/2, length=1.),
|
37
|
+
'drift3': xt.Drift(length=1),
|
38
|
+
'mid_cell': xt.Marker(),
|
39
|
+
'drift4': xt.Replica('drift3'),
|
40
|
+
'qd2': xt.Replica('qd1'),
|
41
|
+
'drift5': xt.Replica('drift2'),
|
42
|
+
'bend2': xt.Replica('bend1'),
|
43
|
+
'drift6': xt.Replica('drift1'),
|
44
|
+
'qf2': xt.Replica('qf1'),
|
45
|
+
'drift7': xt.Replica('drift0'),
|
46
|
+
'end_cell': xt.Marker(),
|
47
|
+
}
|
48
|
+
)
|
49
|
+
cell.particle_ref = xt.Particles(p0c=2e9)
|
50
|
+
tw_cell = cell.twiss4d(strengths=True)
|
51
|
+
|
52
|
+
xo.assert_allclose(tw_half_cell.betx[:-1], # remove '_end_point'
|
53
|
+
tw_cell.rows[:'mid_cell'].betx, atol=0, rtol=1e-8)
|
54
|
+
xo.assert_allclose(tw_half_cell.bety[:-1], # remove '_end_point'
|
55
|
+
tw_cell.rows[:'mid_cell'].bety, atol=0, rtol=1e-8)
|
56
|
+
xo.assert_allclose(tw_half_cell.alfx[:-1], # remove '_end_point'
|
57
|
+
tw_cell.rows[:'mid_cell'].alfx, atol=1e-8, rtol=0)
|
58
|
+
xo.assert_allclose(tw_half_cell.alfy[:-1], # remove '_end_point'
|
59
|
+
tw_cell.rows[:'mid_cell'].alfy, atol=1e-8, rtol=0)
|
60
|
+
xo.assert_allclose(tw_half_cell.dx[:-1], # remove '_end_point'
|
61
|
+
tw_cell.rows[:'mid_cell'].dx, atol=1e-8, rtol=0)
|
62
|
+
xo.assert_allclose(tw_half_cell.dpx[:-1], # remove '_end_point'
|
63
|
+
tw_cell.rows[:'mid_cell'].dpx, atol=1e-8, rtol=0)
|
64
|
+
|
65
|
+
xo.assert_allclose(tw_half_cell.ax_chrom[:-1], # remove '_end_point'
|
66
|
+
tw_cell.rows[:'mid_cell'].ax_chrom, atol=1e-5, rtol=0)
|
67
|
+
xo.assert_allclose(tw_half_cell.ay_chrom[:-1], # remove '_end_point'
|
68
|
+
tw_cell.rows[:'mid_cell'].ay_chrom, atol=1e-5, rtol=0)
|
69
|
+
xo.assert_allclose(tw_half_cell.bx_chrom[:-1], # remove '_end_point'
|
70
|
+
tw_cell.rows[:'mid_cell'].bx_chrom, atol=1e-5, rtol=0)
|
71
|
+
xo.assert_allclose(tw_half_cell.by_chrom[:-1], # remove '_end_point'
|
72
|
+
tw_cell.rows[:'mid_cell'].by_chrom, atol=1e-5, rtol=0)
|
73
|
+
|
74
|
+
xo.assert_allclose(tw_half_cell.qx, tw_cell.qx / 2, atol=1e-9, rtol=0)
|
75
|
+
xo.assert_allclose(tw_half_cell.qy, tw_cell.qy / 2, atol=1e-9, rtol=0)
|
76
|
+
xo.assert_allclose(tw_half_cell.dqx, tw_cell.dqx / 2, atol=1e-6, rtol=0)
|
77
|
+
xo.assert_allclose(tw_half_cell.dqy, tw_cell.dqy / 2, atol=1e-6, rtol=0)
|
78
|
+
|
79
|
+
for ll in [cell, half_cell]:
|
80
|
+
ll.vars['kqf'] = 0.027/2
|
81
|
+
ll.vars['kqd'] = -0.0271/2
|
82
|
+
ll.element_refs['qf1'].k1 = ll.vars['kqf']
|
83
|
+
ll.element_refs['qd1'].k1 = ll.vars['kqd']
|
84
|
+
|
85
|
+
tw_cell = cell.twiss4d(strengths=True)
|
86
|
+
tw_half_cell = half_cell.twiss4d(init='periodic_symmetric', strengths=True)
|
87
|
+
|
88
|
+
xo.assert_allclose(tw_cell.mux[-1], 0.231, atol=1e-3, rtol=0)
|
89
|
+
xo.assert_allclose(tw_cell.muy[-1], 0.233, atol=1e-3, rtol=0)
|
90
|
+
xo.assert_allclose(tw_half_cell.mux[-1], 0.231 / 2, atol=1e-3, rtol=0)
|
91
|
+
xo.assert_allclose(tw_half_cell.muy[-1], 0.233 / 2, atol=1e-3, rtol=0)
|
92
|
+
|
93
|
+
opt_halfcell = half_cell.match(
|
94
|
+
method='4d',
|
95
|
+
start='start_cell', end='mid_cell',
|
96
|
+
init='periodic_symmetric',
|
97
|
+
targets=xt.TargetSet(mux=0.2501/2, muy=0.2502/2, at='mid_cell'),
|
98
|
+
vary=xt.VaryList(['kqf', 'kqd'], step=1e-5),
|
99
|
+
)
|
100
|
+
|
101
|
+
tw_cell = cell.twiss4d(strengths=True)
|
102
|
+
tw_half_cell = half_cell.twiss4d(init='periodic_symmetric', strengths=True)
|
103
|
+
|
104
|
+
xo.assert_allclose(tw_half_cell.mux[-1], 0.2501 / 2, atol=1e-3, rtol=0)
|
105
|
+
xo.assert_allclose(tw_half_cell.muy[-1], 0.2502 / 2, atol=1e-3, rtol=0)
|
106
|
+
xo.assert_allclose(tw_cell.mux[-1], 0.231, atol=1e-3, rtol=0) # unaffected
|
107
|
+
xo.assert_allclose(tw_cell.muy[-1], 0.233, atol=1e-3, rtol=0) # unaffected
|
108
|
+
|
109
|
+
opt_cell = cell.match(
|
110
|
+
method='4d',
|
111
|
+
start='start_cell', end='end_cell',
|
112
|
+
init='periodic',
|
113
|
+
targets=xt.TargetSet(mux=0.2501, muy=0.2502, at='end_cell'),
|
114
|
+
vary=xt.VaryList(['kqf', 'kqd'], step=1e-5),
|
115
|
+
)
|
116
|
+
|
117
|
+
xo.assert_allclose(half_cell.vv['kqf'], cell.vv['kqf'], rtol=1e-9, atol=0)
|
118
|
+
xo.assert_allclose(half_cell.vv['kqd'], cell.vv['kqd'], rtol=1e-9, atol=0)
|
119
|
+
|
120
|
+
tw_cell = cell.twiss4d(strengths=True)
|
121
|
+
tw_half_cell = half_cell.twiss4d(init='periodic_symmetric', strengths=True)
|
122
|
+
|
123
|
+
xo.assert_allclose(tw_half_cell.mux[-1], 0.2501 / 2, atol=1e-3, rtol=0)
|
124
|
+
xo.assert_allclose(tw_half_cell.muy[-1], 0.2502 / 2, atol=1e-3, rtol=0)
|
125
|
+
xo.assert_allclose(tw_cell.mux[-1], 0.2501, atol=1e-3, rtol=0)
|
126
|
+
xo.assert_allclose(tw_cell.muy[-1], 0.2502, atol=1e-3, rtol=0)
|
127
|
+
|
128
|
+
xo.assert_allclose(tw_half_cell.betx[:-1], # remove '_end_point'
|
129
|
+
tw_cell.rows[:'mid_cell'].betx, atol=0, rtol=1e-8)
|
130
|
+
xo.assert_allclose(tw_half_cell.bety[:-1], # remove '_end_point'
|
131
|
+
tw_cell.rows[:'mid_cell'].bety, atol=0, rtol=1e-8)
|
132
|
+
xo.assert_allclose(tw_half_cell.alfx[:-1], # remove '_end_point'
|
133
|
+
tw_cell.rows[:'mid_cell'].alfx, atol=1e-8, rtol=0)
|
134
|
+
xo.assert_allclose(tw_half_cell.alfy[:-1], # remove '_end_point'
|
135
|
+
tw_cell.rows[:'mid_cell'].alfy, atol=1e-8, rtol=0)
|
136
|
+
xo.assert_allclose(tw_half_cell.dx[:-1], # remove '_end_point'
|
137
|
+
tw_cell.rows[:'mid_cell'].dx, atol=1e-8, rtol=0)
|
138
|
+
xo.assert_allclose(tw_half_cell.dpx[:-1], # remove '_end_point'
|
139
|
+
tw_cell.rows[:'mid_cell'].dpx, atol=1e-8, rtol=0)
|
140
|
+
|
141
|
+
xo.assert_allclose(tw_half_cell.ax_chrom[:-1], # remove '_end_point'
|
142
|
+
tw_cell.rows[:'mid_cell'].ax_chrom, atol=1e-5, rtol=0)
|
143
|
+
xo.assert_allclose(tw_half_cell.ay_chrom[:-1], # remove '_end_point'
|
144
|
+
tw_cell.rows[:'mid_cell'].ay_chrom, atol=1e-5, rtol=0)
|
145
|
+
xo.assert_allclose(tw_half_cell.bx_chrom[:-1], # remove '_end_point'
|
146
|
+
tw_cell.rows[:'mid_cell'].bx_chrom, atol=1e-5, rtol=0)
|
147
|
+
xo.assert_allclose(tw_half_cell.by_chrom[:-1], # remove '_end_point'
|
148
|
+
tw_cell.rows[:'mid_cell'].by_chrom, atol=1e-5, rtol=0)
|
149
|
+
|
150
|
+
xo.assert_allclose(tw_half_cell.qx, tw_cell.qx / 2, atol=1e-9, rtol=0)
|
151
|
+
xo.assert_allclose(tw_half_cell.qy, tw_cell.qy / 2, atol=1e-9, rtol=0)
|
152
|
+
xo.assert_allclose(tw_half_cell.dqx, tw_cell.dqx / 2, atol=1e-6, rtol=0)
|
153
|
+
xo.assert_allclose(tw_half_cell.dqy, tw_cell.dqy / 2, atol=1e-6, rtol=0)
|
154
|
+
|
@@ -51,7 +51,6 @@ def test_twiss_4d_fodo_vs_beta_rel(test_context):
|
|
51
51
|
xo.assert_allclose(tw.dqx, tw_4d_list[0].dqx, atol=1e-4, rtol=0)
|
52
52
|
xo.assert_allclose(tw.dqy, tw_4d_list[0].dqy, atol=1e-4, rtol=0)
|
53
53
|
|
54
|
-
|
55
54
|
@for_all_test_contexts
|
56
55
|
def test_coupled_beta(test_context):
|
57
56
|
mad = Madx(stdout=False)
|
@@ -1905,3 +1904,29 @@ def test_part_from_full_periodic(test_context, collider_for_test_twiss_range):
|
|
1905
1904
|
tw_part2[kk, 'ip2'],
|
1906
1905
|
tw[kk, 'ip2'] - tw[kk, 0] +(tw[kk, '_end_point'] - tw[kk, 'ip8']),
|
1907
1906
|
rtol=1e-12, atol=5e-7)
|
1907
|
+
|
1908
|
+
|
1909
|
+
|
1910
|
+
|
1911
|
+
@for_all_test_contexts
|
1912
|
+
def test_twiss_add_strengths(test_context):
|
1913
|
+
## Generate a simple line
|
1914
|
+
n = 6
|
1915
|
+
fodo = [
|
1916
|
+
xt.Multipole(length=0.2, knl=[0, +0.2], ksl=[0, 0]),
|
1917
|
+
xt.Drift(length=1.0),
|
1918
|
+
xt.Multipole(length=0.2, knl=[0, -0.2], ksl=[0, 0]),
|
1919
|
+
xt.Drift(length=1.0),
|
1920
|
+
xt.Multipole(length=1.0, knl=[2 * np.pi / n], hxl=[2 * np.pi / n]),
|
1921
|
+
xt.Drift(length=1.0),
|
1922
|
+
]
|
1923
|
+
line = xt.Line(elements=n * fodo + [xt.Cavity(frequency=1e9, voltage=0, lag=180)])
|
1924
|
+
line.build_tracker(_context=test_context)
|
1925
|
+
|
1926
|
+
## Twiss
|
1927
|
+
line.particle_ref = xp.Particles(mass0=xp.PROTON_MASS_EV, q0=1, p0c=1e8)
|
1928
|
+
tw = line.twiss(method="4d")
|
1929
|
+
|
1930
|
+
assert "length" not in tw.keys()
|
1931
|
+
tw.add_strengths()
|
1932
|
+
assert "length" in tw.keys()
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = '0.66.1'
|
@@ -115,8 +115,7 @@ class Line:
|
|
115
115
|
if isinstance(elements, dict):
|
116
116
|
element_dict = elements
|
117
117
|
if element_names is None:
|
118
|
-
|
119
|
-
' if `elements` is a dictionary.')
|
118
|
+
element_names = list(element_dict.keys())
|
120
119
|
else:
|
121
120
|
if element_names is None:
|
122
121
|
element_names = [f"e{ii}" for ii in range(len(elements))]
|
@@ -104,7 +104,7 @@ class ActionTwiss(xd.Action):
|
|
104
104
|
if isinstance(twinit, xt.TwissInit):
|
105
105
|
twinit_list[ii] = twinit.copy()
|
106
106
|
elif isinstance(twinit, str):
|
107
|
-
assert twinit == 'periodic'
|
107
|
+
assert twinit == 'periodic' or twinit == 'periodic_symmetric'
|
108
108
|
|
109
109
|
# Handle init_at as xt.START or xt.END
|
110
110
|
for ii, init_at in enumerate(ele_init_list):
|
@@ -126,7 +126,7 @@ class ActionTwiss(xd.Action):
|
|
126
126
|
twinit_list[ii] = twinit.get_twiss_init(at_element=init_at)
|
127
127
|
ele_init_list[ii] = None
|
128
128
|
else:
|
129
|
-
assert twinit is None or twinit
|
129
|
+
assert twinit is None or twinit in ['periodic', 'periodic_symmetric']
|
130
130
|
|
131
131
|
if not ismultiline:
|
132
132
|
# Handle case in which twiss init is defined through kwargs
|
@@ -6,14 +6,17 @@ def _compute_correction(x_iter, response_matrix, n_micado=None, rcond=None,
|
|
6
6
|
|
7
7
|
if isinstance(response_matrix, (list, tuple)):
|
8
8
|
assert len(response_matrix) == 3 # U, S, Vt
|
9
|
-
U, S,
|
9
|
+
U, S, Vh = response_matrix
|
10
10
|
if n_singular_values is not None:
|
11
11
|
U = U[:, :n_singular_values]
|
12
12
|
S = S[:n_singular_values]
|
13
|
-
|
14
|
-
response_matrix = U @ np.diag(S) @
|
13
|
+
Vh = Vh[:n_singular_values, :]
|
14
|
+
response_matrix = U @ np.diag(S) @ Vh
|
15
15
|
else:
|
16
16
|
assert n_singular_values is None
|
17
|
+
U = None
|
18
|
+
S = None
|
19
|
+
Vh = None
|
17
20
|
|
18
21
|
n_hcorrectors = response_matrix.shape[1]
|
19
22
|
|
@@ -45,8 +48,16 @@ def _compute_correction(x_iter, response_matrix, n_micado=None, rcond=None,
|
|
45
48
|
mask_corr[:] = True
|
46
49
|
|
47
50
|
# Compute the correction with least squares
|
48
|
-
|
49
|
-
|
51
|
+
if mask_corr.all() and S is not None:
|
52
|
+
# Can reuse the SVD decomposition
|
53
|
+
S_inv = np.zeros_like(S)
|
54
|
+
S_inv[S > 0] = 1 / S[S > 0]
|
55
|
+
if rcond is not None:
|
56
|
+
S_inv[S < rcond * S[0]] = 0
|
57
|
+
correction_masked = Vh.T.conj() @ (np.diag(S_inv) @ (U.T.conj() @ (-x_iter)))
|
58
|
+
else:
|
59
|
+
correction_masked, residual_x, rank_x, sval_x = np.linalg.lstsq(
|
60
|
+
response_matrix[:, mask_corr], -x_iter, rcond=rcond)
|
50
61
|
correction_x = np.zeros(n_hcorrectors)
|
51
62
|
correction_x[mask_corr] = correction_masked
|
52
63
|
|
@@ -60,11 +71,13 @@ def _build_response_matrix(tw, monitor_names, corrector_names,
|
|
60
71
|
assert plane in ['x', 'y']
|
61
72
|
|
62
73
|
# Build response matrix
|
63
|
-
|
64
|
-
|
74
|
+
mask_monitors = tw.mask[monitor_names]
|
75
|
+
mask_correctors = tw.mask[corrector_names]
|
76
|
+
bet_monitors = tw['bet' + plane][mask_monitors]
|
77
|
+
bet_correctors = tw['bet' + plane][mask_correctors]
|
65
78
|
|
66
|
-
mu_monitor = tw
|
67
|
-
mux_correctors = tw
|
79
|
+
mu_monitor = tw['mu' + plane][mask_monitors]
|
80
|
+
mux_correctors = tw['mu' + plane][mask_correctors]
|
68
81
|
|
69
82
|
n_monitors = len(monitor_names)
|
70
83
|
n_correctors = len(corrector_names)
|
@@ -159,13 +172,30 @@ class OrbitCorrectionSinglePlane:
|
|
159
172
|
self.singular_vectors_out = U
|
160
173
|
self.singular_vectors_in = Vt
|
161
174
|
|
162
|
-
|
163
|
-
|
175
|
+
# tw_table_local = self.twiss_table.rows[self.start:self.end]
|
176
|
+
# Parch: avoid issue with regular expression
|
177
|
+
if self.start is not None:
|
178
|
+
start = self.start.replace('$', '\\$')
|
179
|
+
else:
|
180
|
+
start = None
|
181
|
+
if self.end is not None:
|
182
|
+
end = self.end.replace('$', '\\$')
|
183
|
+
else:
|
184
|
+
end = None
|
185
|
+
tw_table_local = self.twiss_table.rows[start:end]
|
186
|
+
|
187
|
+
self._mask_monitors = tw_table_local.mask[self.monitor_names]
|
188
|
+
self._mask_correctors = tw_table_local.mask[self.corrector_names]
|
189
|
+
self.s_correctors = tw_table_local.s[self._mask_correctors]
|
190
|
+
self.s_monitors = tw_table_local.s[self._mask_monitors]
|
164
191
|
|
165
192
|
self._add_correction_knobs()
|
166
193
|
|
167
194
|
def correct(self, n_iter='auto', n_micado=None, n_singular_values=None,
|
168
|
-
rcond=None, stop_iter_factor=0.1, verbose=True):
|
195
|
+
rcond=None, stop_iter_factor=0.1, verbose=True, _tw_orbit=None):
|
196
|
+
|
197
|
+
if _tw_orbit is not None and n_iter !=1:
|
198
|
+
raise ValueError('`_tw_orbit` can only be used with `n_iter=1`')
|
169
199
|
|
170
200
|
assert n_iter == 'auto' or np.isscalar(n_iter)
|
171
201
|
if n_iter == 'auto':
|
@@ -177,7 +207,7 @@ class OrbitCorrectionSinglePlane:
|
|
177
207
|
i_iter = 0
|
178
208
|
while True:
|
179
209
|
try:
|
180
|
-
position = self._measure_position()
|
210
|
+
position = self._measure_position(tw_orbit=_tw_orbit)
|
181
211
|
except xt.twiss.ClosedOrbitSearchError:
|
182
212
|
raise RuntimeError('Closed orbit not found. '
|
183
213
|
'Please use the `thread(...)` method to obtain a first guess, '
|
@@ -200,13 +230,17 @@ class OrbitCorrectionSinglePlane:
|
|
200
230
|
i_iter += 1
|
201
231
|
if n_iter != 'auto' and i_iter >= n_iter:
|
202
232
|
break
|
203
|
-
position = self._measure_position()
|
204
|
-
self._position_after = position
|
205
|
-
if verbose:
|
206
|
-
print(
|
207
|
-
f'Trajectory correction - iter {i_iter}, rms: {position.std()}')
|
208
233
|
|
209
|
-
|
234
|
+
if _tw_orbit is None:
|
235
|
+
position = self._measure_position()
|
236
|
+
self._position_after = position
|
237
|
+
if verbose:
|
238
|
+
print(
|
239
|
+
f'Trajectory correction - iter {i_iter}, rms: {position.std()}')
|
240
|
+
else:
|
241
|
+
self._position_after = None
|
242
|
+
|
243
|
+
def _compute_tw_orbit(self):
|
210
244
|
if self.mode == 'open':
|
211
245
|
# Initialized with betx=1, bety=1 (use W_matrix to avoid compilation)
|
212
246
|
twinit = xt.TwissInit(W_matrix=np.eye(6),
|
@@ -217,8 +251,14 @@ class OrbitCorrectionSinglePlane:
|
|
217
251
|
twinit = None
|
218
252
|
tw_orbit = self.line.twiss4d(only_orbit=True, start=self.start, end=self.end,
|
219
253
|
init=twinit, reverse=False)
|
254
|
+
return tw_orbit
|
255
|
+
|
256
|
+
def _measure_position(self, tw_orbit=None):
|
220
257
|
|
221
|
-
|
258
|
+
if tw_orbit is None:
|
259
|
+
tw_orbit = self._compute_tw_orbit()
|
260
|
+
|
261
|
+
position = tw_orbit[self.plane][self._mask_monitors]
|
222
262
|
|
223
263
|
return position
|
224
264
|
|
@@ -387,7 +427,8 @@ class TrajectoryCorrection:
|
|
387
427
|
self.y_correction = None
|
388
428
|
|
389
429
|
def correct(self, planes=None, n_micado=None, n_singular_values=None,
|
390
|
-
rcond=None, n_iter='auto', verbose=True, stop_iter_factor=0.1
|
430
|
+
rcond=None, n_iter='auto', verbose=True, stop_iter_factor=0.1,
|
431
|
+
tol_position_std=1e-10):
|
391
432
|
|
392
433
|
'''
|
393
434
|
Correct the trajectory in the horizontal and/or vertical plane.
|
@@ -445,30 +486,58 @@ class TrajectoryCorrection:
|
|
445
486
|
i_iter = 0
|
446
487
|
stop_x = self.x_correction is None or 'x' not in planes
|
447
488
|
stop_y = self.y_correction is None or 'y' not in planes
|
489
|
+
|
490
|
+
if stop_x and stop_y:
|
491
|
+
return
|
492
|
+
|
493
|
+
if self.x_correction is not None:
|
494
|
+
a_correction = self.x_correction
|
495
|
+
if self.y_correction is not None:
|
496
|
+
a_correction = self.y_correction
|
497
|
+
|
498
|
+
tw_orbit = a_correction._compute_tw_orbit()
|
499
|
+
|
448
500
|
while True:
|
449
|
-
|
501
|
+
|
502
|
+
if self.x_correction is not None and 'x' in planes:
|
450
503
|
self.x_correction.correct(n_micado=n_micado_x,
|
451
504
|
n_singular_values=n_singular_values_x,
|
452
|
-
rcond=rcond_x, verbose=False, n_iter=1
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
if not stop_y:
|
505
|
+
rcond=rcond_x, verbose=False, n_iter=1,
|
506
|
+
_tw_orbit=tw_orbit)
|
507
|
+
|
508
|
+
if self.y_correction is not None and 'y' in planes:
|
457
509
|
self.y_correction.correct(n_micado=n_micado_y,
|
458
510
|
n_singular_values=n_singular_values_y,
|
459
|
-
rcond=rcond_y, verbose=False, n_iter=1
|
460
|
-
|
461
|
-
|
462
|
-
|
511
|
+
rcond=rcond_y, verbose=False, n_iter=1,
|
512
|
+
_tw_orbit=tw_orbit)
|
513
|
+
|
514
|
+
tw_orbit_prev = tw_orbit
|
515
|
+
tw_orbit = a_correction._compute_tw_orbit()
|
516
|
+
|
517
|
+
if n_iter == 'auto' and self.x_correction is not None and 'x' in planes:
|
518
|
+
new_position = self.x_correction._measure_position(tw_orbit)
|
519
|
+
old_position = self.x_correction._measure_position(tw_orbit_prev)
|
520
|
+
stop_x = (new_position.std() < tol_position_std or
|
521
|
+
new_position.std() > (1. - stop_iter_factor) * old_position.std())
|
522
|
+
|
523
|
+
if n_iter == 'auto' and self.y_correction is not None and 'y' in planes:
|
524
|
+
new_position = self.y_correction._measure_position(tw_orbit)
|
525
|
+
old_position = self.y_correction._measure_position(tw_orbit_prev)
|
526
|
+
stop_y = (new_position.std() < tol_position_std or
|
527
|
+
new_position.std() > (1. - stop_iter_factor) * old_position.std())
|
463
528
|
|
464
529
|
if verbose:
|
465
530
|
str_2print = f'Iteration {i_iter}, '
|
466
531
|
if self.x_correction is not None and 'x' in planes:
|
467
|
-
|
468
|
-
|
532
|
+
new_position = self.x_correction._measure_position(tw_orbit)
|
533
|
+
old_position = self.x_correction._measure_position(tw_orbit_prev)
|
534
|
+
str_2print += (f'x_rms: {old_position.std():.2e}'
|
535
|
+
f' -> {new_position.std():.2e}, ')
|
469
536
|
if self.y_correction is not None and 'y' in planes:
|
470
|
-
|
471
|
-
|
537
|
+
new_position = self.y_correction._measure_position(tw_orbit)
|
538
|
+
old_position = self.y_correction._measure_position(tw_orbit_prev)
|
539
|
+
str_2print += (f'y_rms: {old_position.std():.2e}'
|
540
|
+
f' -> {new_position.std():.2e}')
|
472
541
|
print(str_2print)
|
473
542
|
if stop_x and stop_y:
|
474
543
|
break
|
@@ -612,12 +681,15 @@ def _thread(line, ds_thread, twiss_table=None, rcond_short = None, rcond_long =
|
|
612
681
|
|
613
682
|
if verbose:
|
614
683
|
ocprint = ocorr_only_added_part
|
684
|
+
tw_orbit_print = ocprint.x_correction._compute_tw_orbit()
|
685
|
+
x_meas_print = ocprint.x_correction._measure_position(tw_orbit_print)
|
686
|
+
y_meas_print = ocprint.y_correction._measure_position(tw_orbit_print)
|
615
687
|
str_2print = f'Stop at s={s_corr_end}, '
|
616
688
|
str_2print += 'local rms = ['
|
617
689
|
str_2print += (f'x: {ocprint.x_correction._position_before.std():.2e}'
|
618
|
-
f' -> {
|
690
|
+
f' -> {x_meas_print.std():.2e}, ')
|
619
691
|
str_2print += (f'y: {ocprint.y_correction._position_before.std():.2e}'
|
620
|
-
f' -> {
|
692
|
+
f' -> {y_meas_print.std():.2e}]')
|
621
693
|
print(str_2print)
|
622
694
|
|
623
695
|
# Correct from start line to end of new added portion
|
@@ -634,12 +706,15 @@ def _thread(line, ds_thread, twiss_table=None, rcond_short = None, rcond_long =
|
|
634
706
|
|
635
707
|
if verbose:
|
636
708
|
ocprint = ocorr
|
709
|
+
tw_orbit_print = ocprint.x_correction._compute_tw_orbit()
|
710
|
+
x_meas_print = ocprint.x_correction._measure_position(tw_orbit_print)
|
711
|
+
y_meas_print = ocprint.y_correction._measure_position(tw_orbit_print)
|
637
712
|
str_2print = f'Stop at s={s_corr_end}, '
|
638
713
|
str_2print += 'global rms = ['
|
639
714
|
str_2print += (f'x: {ocprint.x_correction._position_before.std():.2e}'
|
640
|
-
f' -> {
|
715
|
+
f' -> {x_meas_print.std():.2e}, ')
|
641
716
|
str_2print += (f'y: {ocprint.y_correction._position_before.std():.2e}'
|
642
|
-
f' -> {
|
717
|
+
f' -> {y_meas_print.std():.2e}]')
|
643
718
|
print(str_2print)
|
644
719
|
|
645
720
|
s_corr_end += ds_thread
|