66from PyHEADTAIL .general .element import Element
77import PyHEADTAIL .particles .generators as gen
88
9- try :
10- from PyHEADTAIL .trackers .transverse_tracking_cython import TransverseMap
11- from PyHEADTAIL .trackers .detuners_cython import (Chromaticity ,
12- AmplitudeDetuning )
13- except ImportError as e :
14- print ("*** Warning: could not import cython variants of trackers, "
15- "did you cythonize (use the following command)?\n "
16- "$ ./install \n "
17- "Falling back to (slower) python version." )
18- from PyHEADTAIL .trackers .transverse_tracking import TransverseMap
19- from PyHEADTAIL .trackers .detuners import Chromaticity , AmplitudeDetuning
20-
219from PyHEADTAIL .trackers .simple_long_tracking import LinearMap , RFSystems
2210
2311class BasicSynchrotron (Element ):
@@ -26,7 +14,8 @@ def __init__(self, optics_mode, circumference=None, n_segments=None, s=None, nam
2614 accQ_x = None , accQ_y = None , Qp_x = 0 , Qp_y = 0 , app_x = 0 , app_y = 0 , app_xy = 0 ,
2715 alpha_mom_compaction = None , longitudinal_mode = None , Q_s = None ,
2816 h_RF = None , V_RF = None , dphi_RF = None , p0 = None , p_increment = None ,
29- charge = None , mass = None , ** kwargs ):
17+ charge = None , mass = None , RF_at = 'middle' , other_detuners = [],
18+ use_cython = True , ** kwargs ):
3019
3120
3221 self .optics_mode = optics_mode
@@ -36,23 +25,16 @@ def __init__(self, optics_mode, circumference=None, n_segments=None, s=None, nam
3625 self .p0 = p0
3726
3827 self .one_turn_map = []
39-
40- detuners = []
41- if Qp_x != 0 or Qp_y != 0 :
42- detuners .append (Chromaticity (Qp_x , Qp_y ))
43- if app_x != 0 or app_y != 0 or app_xy != 0 :
44- detuners .append (AmplitudeDetuning (app_x , app_y , app_xy ))
4528
4629 # construct transverse map
4730 self ._contruct_transverse_map (optics_mode = optics_mode , circumference = circumference , n_segments = n_segments , s = s , name = name ,
4831 alpha_x = alpha_x , beta_x = beta_x , D_x = D_x , alpha_y = alpha_y , beta_y = beta_y , D_y = D_y ,
49- accQ_x = accQ_x , accQ_y = accQ_y , detuners = detuners )
32+ accQ_x = accQ_x , accQ_y = accQ_y , Qp_x = Qp_x , Qp_y = Qp_y , app_x = app_x , app_y = app_y , app_xy = app_xy , other_detuners = other_detuners ,
33+ use_cython = use_cython )
5034
5135 # construct longitudinal map
5236 self ._contruct_longitudinal_map (alpha_mom_compaction = alpha_mom_compaction , longitudinal_mode = longitudinal_mode , Q_s = Q_s ,
53- h_RF = h_RF , V_RF = V_RF , dphi_RF = dphi_RF , p_increment = p_increment )
54-
55-
37+ h_RF = h_RF , V_RF = V_RF , dphi_RF = dphi_RF , p_increment = p_increment , RF_at = RF_at )
5638
5739 @property
5840 def gamma (self ):
@@ -176,8 +158,27 @@ def generate_6D_Gaussian_bunch_matched(
176158
177159 def _contruct_transverse_map (self , optics_mode = None , circumference = None , n_segments = None , s = None , name = None ,
178160 alpha_x = None , beta_x = None , D_x = None , alpha_y = None , beta_y = None , D_y = None ,
179- accQ_x = None , accQ_y = None , detuners = []):
180-
161+ accQ_x = None , accQ_y = None , Qp_x = None , Qp_y = None , app_x = None , app_y = None , app_xy = None , other_detuners = None ,
162+ use_cython = None ):
163+
164+ if use_cython :
165+ try :
166+ from PyHEADTAIL .trackers .transverse_tracking_cython import TransverseMap
167+ from PyHEADTAIL .trackers .detuners_cython import (Chromaticity ,
168+ AmplitudeDetuning )
169+ except ImportError as e :
170+ print ("*** Warning: could not import cython variants of trackers, "
171+ "did you cythonize (use the following command)?\n "
172+ "$ make \n "
173+ "Falling back to (slower) python version." )
174+ from PyHEADTAIL .trackers .transverse_tracking import TransverseMap
175+ from PyHEADTAIL .trackers .detuners import Chromaticity , AmplitudeDetuning
176+ else :
177+ "Transverse tracking: forcing python implementation."
178+ from PyHEADTAIL .trackers .transverse_tracking import TransverseMap
179+ from PyHEADTAIL .trackers .detuners import Chromaticity , AmplitudeDetuning
180+
181+
181182 if optics_mode == 'smooth' :
182183 if circumference is None :
183184 raise ValueError ('circumference has to be specified if optics_mode = "smooth"' )
@@ -211,6 +212,13 @@ def _contruct_transverse_map(self, optics_mode=None, circumference=None, n_segme
211212
212213 else :
213214 raise ValueError ('optics_mode not recognized' )
215+
216+ detuners = []
217+ if Qp_x != 0 or Qp_y != 0 :
218+ detuners .append (Chromaticity (Qp_x , Qp_y ))
219+ if app_x != 0 or app_y != 0 or app_xy != 0 :
220+ detuners .append (AmplitudeDetuning (app_x , app_y , app_xy ))
221+ detuners += other_detuners
214222
215223 self .transverse_map = TransverseMap (s = s ,
216224 alpha_x = alpha_x ,
@@ -247,15 +255,24 @@ def _contruct_transverse_map(self, optics_mode=None, circumference=None, n_segme
247255 self .one_turn_map .append (m )
248256
249257 def _contruct_longitudinal_map (self , alpha_mom_compaction = None , longitudinal_mode = None , Q_s = None ,
250- h_RF = None , V_RF = None , dphi_RF = None , p_increment = None ):
258+ h_RF = None , V_RF = None , dphi_RF = None , p_increment = None , RF_at = None ):
251259
252- # compute the index of the element before which to insert
253- # the longitudinal map
254- if longitudinal_mode is not None :
255- for insert_before , si in enumerate (self .transverse_map .s ):
256- if si > 0.5 * self .circumference :
257- break
260+ if longitudinal_mode is None :
261+ return
258262
263+ if RF_at == 'middle' :
264+ # compute the index of the element before which to insert
265+ # the longitudinal map
266+ if longitudinal_mode is not None :
267+ for insert_before , si in enumerate (self .transverse_map .s ):
268+ if si > 0.5 * self .circumference :
269+ break
270+ elif RF_at == 'end_of_transverse' :
271+ insert_before = - 1
272+ else :
273+ raise ValueError ('RF_at=%s not recognized!' )
274+
275+
259276 if longitudinal_mode == 'linear' :
260277
261278 eta = alpha_mom_compaction - self .gamma ** - 2
@@ -272,8 +289,7 @@ def _contruct_longitudinal_map(self, alpha_mom_compaction=None, longitudinal_mod
272289 self .circumference , Q_s ,
273290 D_x = self .transverse_map .D_x [insert_before ],
274291 D_y = self .transverse_map .D_y [insert_before ])
275-
276-
292+
277293 elif longitudinal_mode == 'non-linear' :
278294 self .longitudinal_map = RFSystems (
279295 self .circumference , np .atleast_1d (h_RF ),
@@ -286,5 +302,8 @@ def _contruct_longitudinal_map(self, alpha_mom_compaction=None, longitudinal_mod
286302 else :
287303 raise NotImplementedError (
288304 'Something wrong with longitudinal_mode' )
289-
290- self .one_turn_map .insert (insert_before , self .longitudinal_map )
305+
306+ if insert_before == - 1 :
307+ self .one_turn_map .append (self .longitudinal_map )
308+ else :
309+ self .one_turn_map .insert (insert_before , self .longitudinal_map )
0 commit comments