def track(self, paramsDict): """ The drift class implementation of the AccNode class track(probe) method. """ length = self.getLength(self.getActivePartIndex()) bunch = paramsDict["bunch"] TPB.drift(bunch, length)
def track(self, paramsDict): """ The OverlappingQuadsNode class implementation of the AccNode class track(paramDict) method. """ index = self.getActivePartIndex() length = self.getLength(index) if(index == 0): self.z_value = 0. bunch = paramsDict["bunch"] momentum = bunch.getSyncParticle().momentum() n_steps = int(length/self.z_step)+1 z_step = length/n_steps for z_ind in range(n_steps): z = self.z_value + z_step*(z_ind+0.5) G = self.getTotalField(z) kq = G/(3.335640952*momentum) if(abs(kq) == 0.): TPB.drift(bunch,z_step) continue #------- track through a combined quad TPB.quad1(bunch,z_step/4.0, kq) TPB.quad2(bunch,z_step/2.0) TPB.quad1(bunch,z_step/2.0, kq) TPB.quad2(bunch,z_step/2.0) TPB.quad1(bunch,z_step/4.0, kq) self.z_value += length
def track(self, paramsDict): """ The drift class implementation of the AccNodeBunchTracker class track(probe) method. """ length = self.getLength(self.getActivePartIndex()) bunch = paramsDict["bunch"] TPB.drift(bunch, length)
def track(self, paramsDict): """ The simplest RF gap class implementation of the AccNode class track(probe) method. """ index = self.getActivePartIndex() length = self.getLength(index) bunch = paramsDict["bunch"] syncPart = bunch.getSyncParticle() if (index == 0 or index == 2): gapOffset = 0. if (self.hasParam("gapOffset")): gapOffset = self.getParam("gapOffset") if (index == 2): gapOffset = -gapOffset TPB.drift(bunch, length + gapOffset) return E0TL = self.getParam("E0TL") modePhase = self.getParam("modePhase") * math.pi rfCavity = self.getRF_Cavity() frequency = rfCavity.getFrequency() rfPhase = rfCavity.getPhase() + modePhase rf_ampl = rfCavity.getAmp() phase = rfPhase arrival_time = syncPart.time() designArrivalTime = rfCavity.getDesignArrivalTime() if (self.__isFirstGap): if (rfCavity.isDesignSetUp()): #print "debug RF =",self.getName()," phase=",(phase*180./math.pi - 180.) phase = math.fmod( frequency * (arrival_time - designArrivalTime) * 2.0 * math.pi + rfPhase, 2.0 * math.pi) #print "debug RF =",self.getName()," phase=",(phase*180./math.pi - 180.) else: sequence = self.getSequence() accLattice = sequence.getLinacAccLattice() msg = "The BaseRF_Gap class. You have to run trackDesign on the LinacAccLattice first to initialize all RF Cavities' phases!" msg = msg + os.linesep msg = msg + "Lattice =" + accLattice.getName() msg = msg + os.linesep msg = msg + "Sequence =" + sequence.getName() msg = msg + os.linesep msg = msg + "RF Cavity =" + rfCavity.getName() msg = msg + os.linesep msg = msg + "Name of element=" + self.getName() msg = msg + os.linesep msg = msg + "Type of element=" + self.getType() msg = msg + os.linesep orbitFinalize(msg) else: phase = math.fmod( frequency * (arrival_time - designArrivalTime) * 2.0 * math.pi + rfPhase, 2.0 * math.pi) #------------------------------------------------------ #call rf gap with E0TL phase phase of the gap and a longitudinal shift parameter self.cppGapModel.trackBunch(bunch, frequency, E0TL, phase) self.setGapPhase(phase)
def track(self, paramsDict): """ The simplest RF gap class implementation of the AccNode class track(probe) method. """ index = self.getActivePartIndex() length = self.getLength(index) bunch = paramsDict["bunch"] syncPart = bunch.getSyncParticle() if(index == 0 or index == 2): gapOffset = 0. if(self.hasParam("gapOffset")): gapOffset = self.getParam("gapOffset") if(index == 2): gapOffset = -gapOffset TPB.drift(bunch, length + gapOffset) return E0TL = self.getParam("E0TL") modePhase = self.getParam("modePhase")*math.pi rfCavity = self.getRF_Cavity() frequency = rfCavity.getFrequency() rfPhase = rfCavity.getPhase() + modePhase rf_ampl = rfCavity.getAmp() phase = rfPhase arrival_time = syncPart.time() designArrivalTime = rfCavity.getDesignArrivalTime() if(self.__isFirstGap): if(rfCavity.isDesignSetUp()): #print "debug RF =",self.getName()," phase=",(phase*180./math.pi - 180.) phase = math.fmod(frequency*(arrival_time - designArrivalTime)*2.0*math.pi + rfPhase,2.0*math.pi) #print "debug RF =",self.getName()," phase=",(phase*180./math.pi - 180.) else: sequence = self.getSequence() accLattice = sequence.getLinacAccLattice() msg = "The BaseRF_Gap class. You have to run trackDesign on the LinacAccLattice first to initialize all RF Cavities' phases!" msg = msg + os.linesep msg = msg + "Lattice =" + accLattice.getName() msg = msg + os.linesep msg = msg + "Sequence =" + sequence.getName() msg = msg + os.linesep msg = msg + "RF Cavity =" + rfCavity.getName() msg = msg + os.linesep msg = msg + "Name of element=" + self.getName() msg = msg + os.linesep msg = msg + "Type of element=" + self.getType() msg = msg + os.linesep orbitFinalize(msg) else: phase = math.fmod(frequency*(arrival_time - designArrivalTime)*2.0*math.pi+rfPhase,2.0*math.pi) #------------------------------------------------------ #call rf gap with E0TL phase phase of the gap and a longitudinal shift parameter self.cppGapModel.trackBunch(bunch,frequency,E0TL,phase) self.setGapPhase(phase)
def track(self, paramsDict): """ The Kick TEAPOT class implementation of the AccNodeBunchTracker class track(probe) method. """ nParts = self.getnParts() index = self.getActivePartIndex() length = self.getLength(index) strength = 1.0 if (self.waveform): strength = self.waveform.getStrength() kx = strength * self.getParam("kx") / (nParts - 1) ky = strength * self.getParam("ky") / (nParts - 1) dE = self.getParam("dE") / (nParts - 1) bunch = paramsDict["bunch"] useCharge = 1 if (paramsDict.has_key("useCharge")): useCharge = paramsDict["useCharge"] if (index == 0): TPB.drift(bunch, length) TPB.kick(bunch, kx, ky, dE, useCharge) return if (index > 0 and index < (nParts - 1)): TPB.drift(bunch, length) TPB.kick(bunch, kx, ky, dE, useCharge) return if (index == (nParts - 1)): TPB.drift(bunch, length) return
def track(self, paramsDict): """ The Multipole Combined Function TEAPOT class implementation of the AccNodeBunchTracker class track(probe) method. """ nParts = self.getnParts() index = self.getActivePartIndex() length = self.getLength(index) bunch = paramsDict["bunch"] useCharge = 1 if (paramsDict.has_key("useCharge")): useCharge = paramsDict["useCharge"] poleArr = self.getParam("poles") klArr = self.getParam("kls") skewArr = self.getParam("skews") if (index == 0): TPB.drift(bunch, length) return if (index > 0 and index < (nParts - 1)): for i in xrange(len(poleArr)): pole = poleArr[i] kl = klArr[i] / (nParts - 1) skew = skewArr[i] TPB.multp(bunch, pole, kl, skew, useCharge) TPB.drift(bunch, length) return if (index == (nParts - 1)): for i in xrange(len(poleArr)): pole = poleArr[i] kl = klArr[i] / (nParts - 1) skew = skewArr[i] TPB.multp(bunch, pole, kl, skew, useCharge) TPB.drift(bunch, length) return
def track(self, paramsDict): """ The Multipole Combined Function TEAPOT class implementation of the AccNodeBunchTracker class track(probe) method. """ nParts = self.getnParts() index = self.getActivePartIndex() length = self.getLength(index) bunch = paramsDict["bunch"] useCharge = 1 if(paramsDict.has_key("useCharge")): useCharge = paramsDict["useCharge"] poleArr = self.getParam("poles") klArr = self.getParam("kls") skewArr = self.getParam("skews") if(index == 0): TPB.drift(bunch, length) return if(index > 0 and index < (nParts-1)): for i in xrange(len(poleArr)): pole = poleArr[i] kl = klArr[i]/(nParts - 1) skew = skewArr[i] TPB.multp(bunch,pole,kl,skew,useCharge) TPB.drift(bunch, length) return if(index == (nParts-1)): for i in xrange(len(poleArr)): pole = poleArr[i] kl = klArr[i]/(nParts - 1) skew = skewArr[i] TPB.multp(bunch,pole,kl,skew,useCharge) TPB.drift(bunch, length) return
def track(self, paramsDict): """ The Kick TEAPOT class implementation of the AccNodeBunchTracker class track(probe) method. """ nParts = self.getnParts() index = self.getActivePartIndex() length = self.getLength(index) strength = 1.0 if(self.waveform): strength = self.waveform.getKickFactor() kx = strength * self.getParam("kx")/(nParts-1) ky = strength * self.getParam("ky")/(nParts-1) dE = self.getParam("dE")/(nParts-1) bunch = paramsDict["bunch"] useCharge = 1 if(paramsDict.has_key("useCharge")): useCharge = paramsDict["useCharge"] if(index == 0): TPB.drift(bunch, length) TPB.kick(bunch,kx,ky,dE,useCharge) return if(index > 0 and index < (nParts-1)): TPB.drift(bunch, length) TPB.kick(bunch,kx,ky,dE,useCharge) return if(index == (nParts-1)): TPB.drift(bunch, length) return
def track(self, paramsDict): """ The Kick TEAPOT class implementation of the AccNodeBunchTracker class track(probe) method. """ nParts = self.getnParts() index = self.getActivePartIndex() length = self.getLength(index) amplitude = self.waveform.getAmplitude() if self.waveform else 1.0 kx = amplitude * self.getParam("kx") / (nParts - 1) ky = amplitude * self.getParam("ky") / (nParts - 1) dE = self.getParam("dE") / (nParts - 1) bunch = paramsDict["bunch"] useCharge = 1 if paramsDict.has_key("useCharge"): useCharge = paramsDict["useCharge"] if index == 0: TPB.drift(bunch, length) TPB.kick(bunch, kx, ky, dE, useCharge) return if index > 0 and index < nParts - 1: TPB.drift(bunch, length) TPB.kick(bunch, kx, ky, dE, useCharge) return if index == nParts - 1: TPB.drift(bunch, length) return
def trackDesign(self, paramsDict): """ The RF First Gap node setups the design time of passage of the bunch through this node. """ index = self.getActivePartIndex() length = self.getLength(index) bunch = paramsDict["bunch"] if (index == 0 or index == 2): gapOffset = 0. if (self.hasParam("gapOffset")): gapOffset = self.getParam("gapOffset") if (index == 2): gapOffset = -gapOffset TPB.drift(bunch, length + gapOffset) return E0TL = self.getParam("E0TL") rfCavity = self.getRF_Cavity() modePhase = self.getParam("modePhase") * math.pi arrival_time = bunch.getSyncParticle().time() frequency = rfCavity.getFrequency() rfPhase = rfCavity.getPhase() + modePhase rf_ampl = rfCavity.getDesignAmp() phase = rfPhase if (self.__isFirstGap): rfCavity.setDesignArrivalTime(arrival_time) rfCavity.setDesignSetUp(True) rfCavity._setDesignPhase(rfCavity.getPhase()) rfCavity._setDesignAmp(rfCavity.getAmp()) else: first_gap_arr_time = rfCavity.getDesignArrivalTime() #print "debug name=",self.getName()," delta_phase=",frequency*(arrival_time - first_gap_arr_time)*360.0," rfPhase=",rfPhase*180/math.pi phase = math.fmod( frequency * (arrival_time - first_gap_arr_time) * 2.0 * math.pi + rfPhase, 2.0 * math.pi) #print "debug name=",self.getName()," arr_time=",arrival_time," phase=",phase*180./math.pi," E0TL=",E0TL*1.0e+3," freq=",frequency #------------------------------------------------------ #call rf gap with E0TL phase phase of the gap and a longitudinal shift parameter self.cppGapModel.trackBunch(bunch, frequency, E0TL, phase) self.setGapPhase(phase)
def trackDesign(self, paramsDict): """ The RF First Gap node setups the design time of passage of the bunch through this node. """ index = self.getActivePartIndex() length = self.getLength(index) bunch = paramsDict["bunch"] if(index == 0 or index == 2): gapOffset = 0. if(self.hasParam("gapOffset")): gapOffset = self.getParam("gapOffset") if(index == 2): gapOffset = -gapOffset TPB.drift(bunch, length + gapOffset) return E0TL = self.getParam("E0TL") rfCavity = self.getRF_Cavity() modePhase = self.getParam("modePhase")*math.pi arrival_time = bunch.getSyncParticle().time() frequency = rfCavity.getFrequency() rfPhase = rfCavity.getPhase() + modePhase rf_ampl = rfCavity.getDesignAmp() phase = rfPhase if(self.__isFirstGap): rfCavity.setDesignArrivalTime(arrival_time) rfCavity.setDesignSetUp(True) rfCavity._setDesignPhase(rfCavity.getPhase()) rfCavity._setDesignAmp(rfCavity.getAmp()) else: first_gap_arr_time = rfCavity.getDesignArrivalTime() #print "debug name=",self.getName()," delta_phase=",frequency*(arrival_time - first_gap_arr_time)*360.0," rfPhase=",rfPhase*180/math.pi phase = math.fmod(frequency*(arrival_time - first_gap_arr_time)*2.0*math.pi+rfPhase,2.0*math.pi) #print "debug name=",self.getName()," arr_time=",arrival_time," phase=",phase*180./math.pi," E0TL=",E0TL*1.0e+3," freq=",frequency #------------------------------------------------------ #call rf gap with E0TL phase phase of the gap and a longitudinal shift parameter self.cppGapModel.trackBunch(bunch,frequency,E0TL,phase) self.setGapPhase(phase)