@@ -449,8 +449,8 @@ class RFSystems(LongitudinalOneTurnMap):
449449 """
450450
451451 def __init__ (self , circumference , harmonic_list , voltage_list , phi_offset_list ,
452- alpha_array , gamma_reference , p_increment = 0 ,
453- phase_lock = True , shrinking = False , slices_tuple = None ):
452+ alpha_array , gamma_reference , p_increment = 0 , phase_lock = True ,
453+ shrink_transverse = True , shrink_longitudinal = False , slices_tuple = None ):
454454 """
455455 The first entry in harmonic_list, voltage_list and
456456 phi_offset_list defines the parameters for the one
@@ -496,7 +496,9 @@ def __init__(self, circumference, harmonic_list, voltage_list, phi_offset_list,
496496
497497 super (RFSystems , self ).__init__ (alpha_array , circumference )
498498
499- self ._shrinking = shrinking
499+ self ._shrinking = shrink_longitudinal
500+ self ._shrink_transverse = shrink_transverse
501+
500502 if not len (harmonic_list ) == len (voltage_list ) == len (phi_offset_list ):
501503 print ("Warning: parameter lists for RFSystems " +
502504 "do not have the same length!" )
@@ -507,7 +509,7 @@ def __init__(self, circumference, harmonic_list, voltage_list, phi_offset_list,
507509 + self .kicks
508510 + [Drift (alpha_array , self .circumference / 2 )]
509511 )
510- self .fundamental_cavity = min (self .kicks , key = lambda kick : kick .harmonic )
512+ self .fundamental_kick = min (self .kicks , key = lambda kick : kick .harmonic )
511513 self .p_increment = p_increment
512514
513515 # Reference energy and make eta0, resp. "machine gamma_tr" available for all routines
@@ -525,10 +527,10 @@ def __init__(self, circumference, harmonic_list, voltage_list, phi_offset_list,
525527
526528 @property
527529 def p_increment (self ):
528- return self .fundamental_cavity .p_increment
530+ return self .fundamental_kick .p_increment
529531 @p_increment .setter
530532 def p_increment (self , value ):
531- self .fundamental_cavity .p_increment = value
533+ self .fundamental_kick .p_increment = value
532534 if self ._shrinking :
533535 self .elements [- 1 ].shrinkage_p_increment = value
534536
@@ -582,14 +584,14 @@ def beta_z(self):
582584
583585 @property
584586 def Qs (self ):
585- fc = self .fundamental_cavity
587+ fc = self .fundamental_kick
586588 V = fc .voltage
587589 h = fc .harmonic
588590 return np .sqrt ( e * V * np .abs (self .eta0 )* h / (2 * np .pi * self .p0_reference * self .beta_reference * c ) )
589591
590592 @property
591593 def phi_s (self ):
592- V = self .fundamental_cavity .voltage
594+ V = self .fundamental_kick .voltage
593595
594596 if self .p_increment == 0 and V == 0 :
595597 return 0
@@ -621,16 +623,39 @@ def track(self, beam):
621623 for longMap in self .elements :
622624 longMap .track (beam )
623625 if self .p_increment :
624- self .p0_reference += self .p_increment
625- if self ._shrinking : # TODO: quick fix; need to think better how to treat purely long. tracking
626+ try :
626627 self ._shrink_transverse_emittance (beam , np .sqrt (betagamma_old / beam .betagamma ))
628+ self .track = self .track_transverse_shrinking
629+ except AttributeError :
630+ self .track = self .track_no_transverse_shrinking
631+ self .p0_reference += self .p_increment
632+
627633 if self .slices_tuple :
628634 for slices in self .slices_tuple :
629635 slices .update_slices (beam )
630636
631- def track_transverse_shrinking (self ): pass
632- def track_longitudinal_shrinking (self ): pass
633- def track_shrinking (self ): pass
637+ def track_transverse_shrinking (self , beam ):
638+ if self .p_increment :
639+ betagamma_old = beam .betagamma
640+ for longMap in self .elements :
641+ longMap .track (beam )
642+ if self .p_increment :
643+ self ._shrink_transverse_emittance (beam , np .sqrt (betagamma_old / beam .betagamma ))
644+ self .p0_reference += self .p_increment
645+
646+ if self .slices_tuple :
647+ for slices in self .slices_tuple :
648+ slices .update_slices (beam )
649+
650+ def track_no_transverse_shrinking (self , beam ):
651+ for longMap in self .elements :
652+ longMap .track (beam )
653+ if self .p_increment :
654+ self .p0_reference += self .p_increment
655+
656+ if self .slices_tuple :
657+ for slices in self .slices_tuple :
658+ slices .update_slices (beam )
634659
635660 def set_voltage_list (self , voltage_list ):
636661 for i , V in enumerate (voltage_list ):
@@ -718,7 +743,7 @@ def bucket_area(self):
718743
719744 def _phaselock (self ):
720745
721- fc = self .fundamental_cavity
746+ fc = self .fundamental_kick
722747 cavities = [k for k in self .kicks if k is not fc ]
723748
724749 for c in cavities :
0 commit comments