diff --git a/mbtrack2/tracking/element.py b/mbtrack2/tracking/element.py index 0f69f6cfb391776d5f747b2230fb9a9c374df895..1575a1973bc4a1ddedc33b0318f4f464f95ff051 100644 --- a/mbtrack2/tracking/element.py +++ b/mbtrack2/tracking/element.py @@ -415,7 +415,7 @@ class TransverseMap(TransverseMapSector): 2 * np.pi * ring.tune, ring.chro, ring.adts) -def transverse_map_sector_generator(ring, positions): +def transverse_map_sector_generator(ring, positions, **kwargs): """ Convenience function which generate a list of TransverseMapSector elements from a ring: @@ -435,6 +435,8 @@ def transverse_map_sector_generator(ring, positions): 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, ...]). + + See at.physics.nonlinear.chromaticity for **kwargs Returns ------- @@ -463,8 +465,10 @@ def transverse_map_sector_generator(ring, positions): adts=adts)) else: import at + dp = kwargs.get('dp', 1e-2) + order = kwargs.get('order', 1) - def _compute_chro(ring, N_sec, dp=1e-2, order=4): + def _compute_chro(ring, N_sec, dp, order): lat = deepcopy(ring.optics.lattice) lat.append(at.Marker("END")) fit, _, _ = at.physics.nonlinear.chromaticity(lat, @@ -472,12 +476,18 @@ def transverse_map_sector_generator(ring, positions): dpm=dp, n_points=100, order=order) - Chrox, Chroy = fit[0, 1:], fit[1, 1:] - chrox = np.array([np.linspace(0, val, N_sec) for val in Chrox]) - chroy = np.array([np.linspace(0, val, N_sec) for val in Chroy]) - return np.array([chrox, chroy]) + chro_xy = [ + elem for pair in zip(fit[0, 1:], fit[1, 1:]) for elem in pair + ] + len_chro = int(order * 2) + _chro = np.zeros((len_chro, N_sec)) + for i in range(len_chro): + chro_order_splited = np.linspace(0, chro_xy[i], N_sec) + _chro[i, :] = chro_order_splited + + return _chro - _chro = _compute_chro(ring, N_sec) + _chro = _compute_chro(ring, N_sec, dp, order) for i in range(N_sec): alpha0 = ring.optics.alpha(positions[i]) beta0 = ring.optics.beta(positions[i])