Skip to content

Commit d00127b

Browse files
Merge remote-tracking branch 'ColasDroin/feature/update_dispersion' into release/v0.52.0
2 parents 6112ac2 + 05e8c36 commit d00127b

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

tests/test_twiss.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,30 @@ def test_crab_dispersion(test_context):
11771177
assert np.allclose(tw6d_rf_on['dx_zeta'], tw4d_rf_off['dx_zeta'], rtol=0, atol=1e-7)
11781178
assert np.allclose(tw6d_rf_on['dy_zeta'], tw4d_rf_off['dy_zeta'], rtol=0, atol=1e-7)
11791179

1180+
@for_all_test_contexts
1181+
def test_higher_order_crab_dispersion(test_context):
1182+
1183+
collider = xt.Multiline.from_json(test_data_folder /
1184+
'hllhc15_collider/collider_00_from_mad.json')
1185+
collider.build_trackers(_context=test_context)
1186+
1187+
collider.vars['vrf400'] = 16
1188+
collider.vars['on_crab1'] = -190
1189+
collider.vars['on_crab5'] = -190
1190+
1191+
line = collider.lhcb1
1192+
1193+
tw6d = line.twiss(method='6d')
1194+
dz = 1e-3
1195+
tw4d_plus = line.twiss(method='4d', zeta0=dz, freeze_longitudinal=True)
1196+
tw4d_minus = line.twiss(method='4d', zeta0=-dz, freeze_longitudinal=True)
1197+
dpx_dzeta_expected = (tw4d_plus.px - tw4d_minus.px) / (2*dz)
1198+
dpy_dzeta_expected = (tw4d_plus.py - tw4d_minus.py) / (2*dz)
1199+
1200+
assert np.allclose(tw6d['dpx_zeta'], dpx_dzeta_expected, rtol=0, atol=1e-7)
1201+
assert np.allclose(tw6d['dpy_zeta'], dpy_dzeta_expected, rtol=0, atol=1e-7)
1202+
1203+
11801204
@for_all_test_contexts
11811205
def test_twiss_group_compounds(test_context):
11821206

xtrack/twiss.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,16 @@ def twiss_line(line, particle_ref=None, method=None,
181181
- dx: horizontal dispersion (d x / d delta) in meters
182182
- dy: vertical dispersion (d y / d delta) in meters
183183
- dzeta: longitudinal dispersion (d zeta / d delta) in meters
184-
- dpx: horizontal dispersion (d px / d delta)
185-
- dpy: vertical dispersion (d y / d delta)
184+
- dpx: higher order horizontal dispersion (d px / d delta)
185+
- dpy: higher order vertical dispersion (d py / d delta)
186186
- ddx: horizontal second order dispersion (d^2 x / d delta^2) in meters
187187
- ddy: vertical second order dispersion (d^2 y / d delta^2) in meters
188188
- ddpx: horizontal second order dispersion (d^2 px / d delta^2)
189189
- ddpy: vertical second order dispersion (d^2 py / d delta^2)
190190
- dx_zeta: horizontal crab dispersion (d x / d zeta)
191191
- dy_zeta: vertical crab dispersion (d y / d zeta)
192-
- dpx_zeta: horizontal crab dispersion (d px / d zeta)
193-
- dpy_zeta: vertical crab dispersion (d py / d zeta)
192+
- dpx_zeta: higher order horizontal crab dispersion (d px / d zeta)
193+
- dpy_zeta: higher order vertical crab dispersion (d py / d zeta)
194194
- ax_chrom: chromatic function (d alfx / d delta - alfx / betx d betx / d delta)
195195
- ay_chrom: chromatic function (d alfy / d delta - alfy / bety d bety / d delta)
196196
- bx_chrom: chromatic function (d betx / d delta)
@@ -1051,11 +1051,17 @@ def _compute_lattice_functions(Ws, use_full_inverse, s_co):
10511051
muy = np.unwrap(temp_phiy) / 2 /np.pi
10521052
muzeta = np.unwrap(phizeta) / 2 / np.pi
10531053

1054+
# Crab dispersion
10541055
dx_zeta = (Ws[:, 0, 4] - Ws[:, 0, 5] * Ws[:, 5, 4] / Ws[:, 5, 5]) / (
10551056
Ws[:, 4, 4] - Ws[:, 4, 5] * Ws[:, 5, 4] / Ws[:, 5, 5])
1057+
dpx_zeta = (Ws[:, 1, 4] - Ws[:, 1, 5] * Ws[:, 5, 4] / Ws[:, 5, 5]) / (
1058+
Ws[:, 4, 4] - Ws[:, 4, 5] * Ws[:, 5, 4] / Ws[:, 5, 5])
10561059
dy_zeta = (Ws[:, 2, 4] - Ws[:, 2, 5] * Ws[:, 5, 4] / Ws[:, 5, 5]) / (
10571060
Ws[:, 4, 4] - Ws[:, 4, 5] * Ws[:, 5, 4] / Ws[:, 5, 5])
1061+
dpy_zeta = (Ws[:, 3, 4] - Ws[:, 3, 5] * Ws[:, 5, 4] / Ws[:, 5, 5]) / (
1062+
Ws[:, 4, 4] - Ws[:, 4, 5] * Ws[:, 5, 4] / Ws[:, 5, 5])
10581063

1064+
# Dispersion
10591065
dx_pzeta = (Ws[:, 0, 5] - Ws[:, 0, 4] * Ws[:, 4, 5] / Ws[:, 4, 4]) / (
10601066
Ws[:, 5, 5] - Ws[:, 5, 4] * Ws[:, 4, 5] / Ws[:, 4, 4])
10611067
dpx_pzeta = (Ws[:, 1, 5] - Ws[:, 1, 4] * Ws[:, 4, 5] / Ws[:, 4, 4]) / (
@@ -1081,7 +1087,9 @@ def _compute_lattice_functions(Ws, use_full_inverse, s_co):
10811087
'dy': dy_pzeta,
10821088
'dpy': dpy_pzeta,
10831089
'dx_zeta': dx_zeta,
1090+
'dpx_zeta': dpx_zeta,
10841091
'dy_zeta': dy_zeta,
1092+
'dpy_zeta': dpy_zeta,
10851093
'betx1': betx1,
10861094
'bety1': bety1,
10871095
'betx2': betx2,

0 commit comments

Comments
 (0)