@@ -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