Skip to content
Snippets Groups Projects
Commit e0b23f39 authored by Alexis GAMELIN's avatar Alexis GAMELIN
Browse files

Split correctly the chromaticity

Now split correctly the chromaticity in transverse_map_sector_generator function.
Clarify usage for transverse_map_sector_generator.
parent d8075bf9
No related branches found
No related tags found
No related merge requests found
...@@ -6,8 +6,10 @@ included in the tracking. ...@@ -6,8 +6,10 @@ included in the tracking.
""" """
import numpy as np import numpy as np
import at
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from functools import wraps from functools import wraps
from copy import deepcopy
from mbtrack2.tracking.particles import Beam from mbtrack2.tracking.particles import Beam
class Element(metaclass=ABCMeta): class Element(metaclass=ABCMeta):
...@@ -368,6 +370,8 @@ def transverse_map_sector_generator(ring, positions): ...@@ -368,6 +370,8 @@ def transverse_map_sector_generator(ring, positions):
positions : array positions : array
List of longitudinal positions in [m] to use as starting and end points List of longitudinal positions in [m] to use as starting and end points
of the TransverseMapSector elements. of the TransverseMapSector elements.
The array should contain the initial position (s=0) but not the end
position (s=ring.L), so like position = np.array([0, pos1, pos2, ...]).
Returns Returns
------- -------
...@@ -376,28 +380,52 @@ def transverse_map_sector_generator(ring, positions): ...@@ -376,28 +380,52 @@ def transverse_map_sector_generator(ring, positions):
""" """
def _compute_chro(ring, pos, dp=1e-4):
lat = deepcopy(ring.optics.lattice)
lat.append(at.Marker("END"))
N=len(lat)
refpts=np.arange(N)
*elem_neg_dp, = at.linopt2(lat, refpts=refpts, dp=-dp)
*elem_pos_dp, = at.linopt2(lat, refpts=refpts, dp=dp)
s = elem_neg_dp[2]["s_pos"]
mux0 = elem_neg_dp[2]['mu'][:,0]
mux1 = elem_pos_dp[2]['mu'][:,0]
muy0 = elem_neg_dp[2]['mu'][:,1]
muy1 = elem_pos_dp[2]['mu'][:,1]
Chrox=(mux1-mux0)/(2*dp)/2/np.pi
Chroy=(muy1-muy0)/(2*dp)/2/np.pi
chrox = np.interp(pos, s, Chrox)
chroy = np.interp(pos, s, Chroy)
return np.array([chrox, chroy])
if ring.optics.use_local_values: if ring.optics.use_local_values:
raise ValueError("The Synchrotron object must be loaded from an AT lattice") raise ValueError("The Synchrotron object must be loaded from an AT lattice")
N_sec = len(positions) N_sec = len(positions)
sectors = [] sectors = []
chro_diff = ring.chro/N_sec
for i in range(N_sec): for i in range(N_sec):
alpha0 = ring.optics.alpha(positions[i]) alpha0 = ring.optics.alpha(positions[i])
beta0 = ring.optics.beta(positions[i]) beta0 = ring.optics.beta(positions[i])
dispersion0 = ring.optics.dispersion(positions[i]) dispersion0 = ring.optics.dispersion(positions[i])
mu0 = ring.optics.mu(positions[i]) mu0 = ring.optics.mu(positions[i])
chro0 = _compute_chro(ring, positions[i])
if i != (N_sec - 1): if i != (N_sec - 1):
alpha1 = ring.optics.alpha(positions[i+1]) alpha1 = ring.optics.alpha(positions[i+1])
beta1 = ring.optics.beta(positions[i+1]) beta1 = ring.optics.beta(positions[i+1])
dispersion1 = ring.optics.dispersion(positions[i+1]) dispersion1 = ring.optics.dispersion(positions[i+1])
mu1 = ring.optics.mu(positions[i+1]) mu1 = ring.optics.mu(positions[i+1])
chro1 = _compute_chro(ring, positions[i+1])
else: else:
alpha1 = ring.optics.alpha(positions[0]) alpha1 = ring.optics.alpha(positions[0])
beta1 = ring.optics.beta(positions[0]) beta1 = ring.optics.beta(positions[0])
dispersion1 = ring.optics.dispersion(positions[0]) dispersion1 = ring.optics.dispersion(positions[0])
mu1 = ring.optics.mu(ring.L) mu1 = ring.optics.mu(ring.L)
chro1 = _compute_chro(ring, ring.L)
phase_diff = mu1 - mu0 phase_diff = mu1 - mu0
chro_diff = chro1 - chro0
sectors.append(TransverseMapSector(ring, alpha0, beta0, dispersion0, sectors.append(TransverseMapSector(ring, alpha0, beta0, dispersion0,
alpha1, beta1, dispersion1, phase_diff, chro_diff)) alpha1, beta1, dispersion1, phase_diff, chro_diff))
return sectors return sectors
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment