Skip to content

Commit 2532b80

Browse files
authored
Adding loco beta beating and coupling correction iterations
1 parent 36ca4b7 commit 2532b80

File tree

1 file changed

+52
-34
lines changed

1 file changed

+52
-34
lines changed

pySC/example.py

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -185,44 +185,44 @@ def _marker(name):
185185
nTurns=200)
186186
# LOCO
187187

188-
cor_ords = sc_tools.ords_from_regex(SC.RING, 'CXY')
189188
used_correctors1 = loco.select_equally_spaced_elements(SC.ORD.CM[0], 20)
190189
used_correctors2 = loco.select_equally_spaced_elements(SC.ORD.CM[1], 20)
191190
used_cor_ords = [used_correctors1, used_correctors2]
192191
used_bpms_ords = loco.select_equally_spaced_elements(SC.ORD.BPM, len(SC.ORD.BPM))
193192
cav_ords = sc_tools.ords_from_regex(SC.RING, 'RFC')
194193
quads_ords = [sc_tools.ords_from_regex(SC.RING, 'QF'), sc_tools.ords_from_regex(SC.RING, 'QD')]
195194
sext_ords = [sc_tools.ords_from_regex(SC.RING, 'SF'), sc_tools.ords_from_regex(SC.RING, 'SD')]
196-
195+
197196
CMstep = np.array([1.e-4]) # correctors change [rad]
198197
dk = 1.e-4 # quads change
199198
RFstep = 1e3
200-
199+
200+
201201
orbit_response_matrix_model = SCgetModelRM(SC, used_bpms_ords, used_cor_ords, trackMode='ORB', useIdealRing=True, dkick=CMstep)
202202
_, _, twiss = at.get_optics(SC.IDEALRING, SC.ORD.BPM)
203203
dx = twiss.dispersion[:, 0]
204204
dy = twiss.dispersion[:, 2]
205205
dispersion_meas = np.column_stack((dx, dy))
206206
orbit_response_matrix_model2 = np.hstack(
207207
(orbit_response_matrix_model, ((dispersion_meas) / CMstep).reshape(-1, 1)))
208-
208+
print('Optics parameters before LOCO')
209209
loco.analyze_ring(SC, twiss, SC.ORD.BPM, useIdealRing=False, makeplot=False)
210210

211211
Jn = loco.calculate_jacobian(SC, orbit_response_matrix_model, CMstep, used_cor_ords, used_bpms_ords, np.concatenate(quads_ords), dk,
212212
trackMode='ORB', useIdealRing=False, skewness=False, order=1, method='add',
213-
includeDispersion=False, rf_step=RFstep, cav_ords=cav_ords)
213+
includeDispersion=False, rf_step=RFstep, cav_ords=cav_ords, full_jacobian=True)
214214

215-
Jn2 = loco.calculate_jacobian(SC, orbit_response_matrix_model, CMstep, used_cor_ords, used_bpms_ords, np.concatenate(quads_ords), dk,
215+
Jn2 = loco.calculate_jacobian(SC, orbit_response_matrix_model2, CMstep, used_cor_ords, used_bpms_ords, np.concatenate(quads_ords), dk,
216216
trackMode='ORB', useIdealRing=False, skewness=False, order=1, method='add',
217217
includeDispersion=True, rf_step=RFstep, cav_ords=cav_ords, full_jacobian=False)
218218

219-
Js = loco.calculate_jacobian(SC, orbit_response_matrix_model, CMstep, used_cor_ords, used_bpms_ords, np.concatenate(sext_ords), 1.e-3,
219+
Js = loco.calculate_jacobian(SC, orbit_response_matrix_model2, CMstep, used_cor_ords, used_bpms_ords, np.concatenate(sext_ords), 1.e-3,
220220
trackMode='ORB', useIdealRing=False, skewness=True, order=1, method='add',
221-
includeDispersion=True, rf_step=RFstep, cav_ords=cav_ords, full_jacobian=False)
221+
includeDispersion=True, rf_step=RFstep, cav_ords=cav_ords, full_jacobian=True)
222222

223223
Jc = np.concatenate((Jn2, Js), axis=0)
224-
225-
# Beta correction iterations
224+
225+
226226

227227
#Jn = np.transpose(Jn, (0, 2, 1))
228228
#weights = 1
@@ -231,14 +231,13 @@ def _marker(name):
231231
A = tmp @ weights @ tmp.T
232232
u, s, v = np.linalg.svd(A, full_matrices=True)
233233
import matplotlib.pyplot as plt
234-
235234
plt.plot(np.log(s), 'd--')
236235
plt.title('singular value')
237236
plt.xlabel('singular values')
238237
plt.ylabel('$\log(\sigma_i)$')
239238
plt.show()
240239

241-
n_singular_values = 40
240+
n_singular_values = 80
242241

243242
#Jt = loco_test.get_inverse(Jn, n_singular_values, weights)
244243

@@ -247,13 +246,14 @@ def _marker(name):
247246
info_tab = 14 * " "
248247
LOGGER.info("RMS Beta-beating before LOCO:\n"
249248
f"{info_tab}{bx_rms_err * 100:04.2f}% horizontal\n{info_tab}{by_rms_err * 100:04.2f}% vertical ")
250-
n_iter = 3
251-
249+
n_iter = 2
250+
# beta beating iterations
252251
for x in range(n_iter): # optics correction using QF and QD
253252
LOGGER.info(f'LOCO iteration {x}')
254-
orbit_response_matrix_measured = loco.measure_closed_orbit_response_matrix(SC, used_bpms_ords, used_cor_ords, CMstep)
253+
orbit_response_matrix_measured = loco.measure_closed_orbit_response_matrix(SC, used_bpms_ords, used_cor_ords, CMstep, includeDispersion=False)
255254
n_quads, n_corrs, n_bpms = len(np.concatenate(quads_ords)), len(np.concatenate(used_cor_ords)), len(used_bpms_ords) * 2
256255
bx_rms_err, by_rms_err = loco.model_beta_beat(SC.RING, twiss, SC.ORD.BPM, plot=False)
256+
dx_rms_err, dy_rms_err = loco.getDispersionErr(SC.RING, twiss, SC.ORD.BPM)
257257
total_length = n_bpms + n_corrs + n_quads
258258
lengths = [n_quads, n_corrs, n_bpms]
259259
including_fit_parameters = ['quads', 'cor', 'bpm']
@@ -263,11 +263,11 @@ def _marker(name):
263263
initial_guess[lengths[0]:lengths[0] + lengths[1]] = 1e-6
264264
initial_guess[lengths[0] + lengths[1]:] = 1e-6
265265

266+
266267
# method lm (least squares)
267268
#fit_parameters = loco.loco_correction_lm(initial_guess, (orbit_response_matrix_model),
268-
# (orbit_response_matrix_measured), Jn, lengths,
269+
# (orbit_response_matrix_measured), np.array(Jn), lengths,
269270
# including_fit_parameters, bounds=(-0.03, 0.03), weights=weights, verbose=2)
270-
271271
# method ng
272272
fit_parameters = loco.loco_correction_ng(initial_guess, orbit_response_matrix_model,
273273
orbit_response_matrix_measured, np.array(Jn), lengths,
@@ -276,36 +276,48 @@ def _marker(name):
276276
dg = fit_parameters[:lengths[0]] if len(fit_parameters) > n_quads else fit_parameters
277277
SC = loco.set_correction(SC, dg, np.concatenate(quads_ords))
278278
bx_rms_cor, by_rms_cor = loco.model_beta_beat(SC.RING, twiss, SC.ORD.BPM, plot=False)
279+
dx_rms_cor, dy_rms_cor = loco.getDispersionErr(SC.RING, twiss, SC.ORD.BPM)
279280
LOGGER.info(f"RMS Beta-beating after {x + 1} LOCO iterations:\n"
280281
f"{info_tab}{bx_rms_cor * 100:04.2f}% horizontal\n{info_tab}{by_rms_cor * 100:04.2f}% vertical ")
281282
LOGGER.info(f"Correction reduction: \n"
282283
f" beta_x: {(1 - bx_rms_cor / bx_rms_err) * 100:.2f}%\n"
283284
f" beta_y: {(1 - by_rms_cor / by_rms_err) * 100:.2f}%\n")
285+
LOGGER.info(f"RMS dispersion after {x + 1} LOCO iterations:\n"
286+
f"{info_tab}{dx_rms_cor * 100:04.2f}% horizontal\n{info_tab}{dy_rms_cor * 100:04.2f}% vertical ")
287+
LOGGER.info(f"Correction reduction: \n"
288+
f" dispersion_x: {(1 - dx_rms_cor / dx_rms_err) * 100:.2f}%\n"
289+
f" dispersion_y: {(1 - dy_rms_cor / dy_rms_err) * 100:.2f}%\n")
290+
print('Optics parameters after LOCO')
291+
loco.analyze_ring(SC, twiss, SC.ORD.BPM, useIdealRing=False, makeplot=False)
284292

285-
# Coupling correction iterations
293+
# dispersion correction iterations
286294
weights = np.eye(len(used_bpms_ords) * 2)
287295
tmp = np.sum(Jc, axis=2)
288296
A = tmp @ weights @ tmp.T
289-
u, s, v = np.linalg.svd(A, full_matrices=True)
297+
u, s, v = np.linalg.svd(A, full_matrices=True)
298+
import matplotlib.pyplot as plt
299+
290300
plt.plot(np.log(s), 'd--')
291301
plt.title('singular value')
292302
plt.xlabel('singular values')
293303
plt.ylabel('$\log(\sigma_i)$')
294304
plt.show()
295305

296-
n_singular_values = 60
297-
n_iter = 2
306+
n_singular_values = 75
307+
308+
n_iter = 1
298309

299310
for x in range(n_iter): # optics correction using QF and QD
300311
LOGGER.info(f'LOCO iteration {x}')
312+
print('Optics parameters after LOCO')
313+
loco.analyze_ring(SC, twiss, SC.ORD.BPM, useIdealRing=False, makeplot=False)
314+
301315
orbit_response_matrix_measured = loco.measure_closed_orbit_response_matrix(SC, used_bpms_ords, used_cor_ords, CMstep, includeDispersion=True)
302-
_, _, twiss_ = at.get_optics(SC.RING, used_bpms_ords)
303-
dx = twiss_.dispersion[:, 0]
304-
dy = twiss_.dispersion[:, 2]
305-
dispersion_meas = np.column_stack((dx, dy))
306-
orbit_response_matrix_measured = loco.measure_closed_orbit_response_matrix(SC, used_bpms_ords, used_cor_ords, CMstep)
307-
n_quads, n_corrs, n_bpms = len(np.concatenate(quads_ords)), len(np.concatenate(used_cor_ords)), len(used_bpms_ords) * 2
316+
317+
n_quads, n_corrs, n_bpms = len(np.concatenate(quads_ords)) + len(np.concatenate(sext_ords)), len(np.concatenate(used_cor_ords)), len(used_bpms_ords) * 2
308318
bx_rms_err, by_rms_err = loco.model_beta_beat(SC.RING, twiss, SC.ORD.BPM, plot=False)
319+
dx_rms_err, dy_rms_err = loco.getDispersionErr(SC.RING, twiss, SC.ORD.BPM)
320+
309321
total_length = n_bpms + n_corrs + n_quads
310322
lengths = [n_quads, n_corrs, n_bpms]
311323
including_fit_parameters = ['quads', 'cor', 'bpm']
@@ -316,26 +328,32 @@ def _marker(name):
316328
initial_guess[lengths[0] + lengths[1]:] = 1e-6
317329

318330
# method lm (least squares)
319-
#fit_parameters = loco.loco_correction_lm(initial_guess, (orbit_response_matrix_model),
320-
# (orbit_response_matrix_measured), Jn, lengths,
331+
#fit_parameters = loco.loco_correction_lm(initial_guess, (orbit_response_matrix_model2),
332+
# (orbit_response_matrix_measured), Jc, lengths,
321333
# including_fit_parameters, bounds=(-0.03, 0.03), weights=weights, verbose=2)
322334

323335
# method ng
324336
fit_parameters = loco.loco_correction_ng(initial_guess, orbit_response_matrix_model2,
325-
orbit_response_matrix_measured, Jc, lengths,
326-
including_fit_parameters, n_singular_values, weights=weights)
337+
orbit_response_matrix_measured, Jc, lengths,
338+
including_fit_parameters, n_singular_values, weights=weights)
327339

328340
dgn = fit_parameters[:len(np.concatenate(quads_ords))] #if len(fit_parameters) > n_quads else fit_parameters
329-
dgs = fit_parameters[len(np.concatenate(quads_ords))::] #if len(fit_parameters) > n_quads else fit_parameters
341+
dgs = fit_parameters[len(np.concatenate(quads_ords)):len(np.concatenate(sext_ords))+len(np.concatenate(quads_ords))] #if len(fit_parameters) > n_quads else fit_parameters
330342

331343
SC = loco.set_correction(SC, dgn, np.concatenate(quads_ords))
332344
SC = loco.set_correction(SC, dgs, np.concatenate(sext_ords), skewness=True)
333345

334346
bx_rms_cor, by_rms_cor = loco.model_beta_beat(SC.RING, twiss, SC.ORD.BPM, plot=False)
347+
dx_rms_cor, dy_rms_cor = loco.getDispersionErr(SC.RING, twiss, SC.ORD.BPM)
335348
LOGGER.info(f"RMS Beta-beating after {x + 1} LOCO iterations:\n"
336349
f"{info_tab}{bx_rms_cor * 100:04.2f}% horizontal\n{info_tab}{by_rms_cor * 100:04.2f}% vertical ")
337350
LOGGER.info(f"Correction reduction: \n"
338351
f" beta_x: {(1 - bx_rms_cor / bx_rms_err) * 100:.2f}%\n"
339352
f" beta_y: {(1 - by_rms_cor / by_rms_err) * 100:.2f}%\n")
340-
341-
loco.analyze_ring(SC, twiss, SC.ORD.BPM, useIdealRing=False, makeplot=False)
353+
LOGGER.info(f"RMS dispersion after {x + 1} LOCO iterations:\n"
354+
f"{info_tab}{dx_rms_cor * 100:04.2f}% horizontal\n{info_tab}{dy_rms_cor * 100:04.2f}% vertical ")
355+
LOGGER.info(f"Correction reduction: \n"
356+
f" dispersion_x: {(1 - dx_rms_cor / dx_rms_err) * 100:.2f}%\n"
357+
f" dispersion_y: {(1 - dy_rms_cor / dy_rms_err) * 100:.2f}%\n")
358+
print('Optics parameters after LOCO')
359+
loco.analyze_ring(SC, twiss, SC.ORD.BPM, useIdealRing=False, makeplot=False)

0 commit comments

Comments
 (0)