コード例 #1
0
	def addExternalPoint(self,cav_phase,bpm_amp,bpm_phase):
		if(self.phase_gd.getNumbOfPoints() != 0):
			cav_phase_old = self.phase_gd.getX(self.phase_gd.getNumbOfPoints()-1)
			bpm_phase_old = self.phase_gd.getY(self.phase_gd.getNumbOfPoints()-1)
			cav_phase = makePhaseNear(cav_phase,cav_phase_old)
			bpm_phase = makePhaseNear(bpm_phase,bpm_phase_old)
		self.phase_gd.addPoint(cav_phase,bpm_phase)
		self.amp_gd.addPoint(cav_phase,bpm_amp)		
コード例 #2
0
 def makeHarmonicFit(self):
     self.phase_fit_gd.removeAllPoints()
     if (self.phase_gd.getNumbOfPoints() < 8): return false
     err = self.harmonicsAnalyzer.analyzeData(self.phase_gd)
     harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
     #-----remove bad points
     gd = self.phase_gd
     max_bad_points_count = 3
     bad_points_count = 0
     bad_index = 1
     while (bad_index >= 0):
         bad_index = -1
         for i in range(gd.getNumbOfPoints()):
             phase = gd.getX(i)
             y_appr = harm_function.getValue(phase)
             y = gd.getY(i)
             if (math.fabs(y - y_appr) > 3.0 * err):
                 bad_index = i
                 bad_points_count += 1
                 break
         if (bad_index >= 0):
             gd.removePoint(bad_index)
             self.amp_gd.removePoint(bad_index)
         # we should stop if we have too many bad points
         if (bad_points_count > max_bad_points_count):
             return false
     if (bad_points_count > 0):
         err = self.harmonicsAnalyzer.analyzeData(gd)
         harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
     #----find a new cavity phase
     min_phase = makePhaseNear(self.harmonicsAnalyzer.getPositionOfMin(),
                               0.)
     max_phase = makePhaseNear(self.harmonicsAnalyzer.getPositionOfMax(),
                               0.)
     # guess phase is -90 deg if max acceleratiom phase is 0.
     self.zero_accel_phase = makePhaseNear(min_phase - 90., 0.)
     self.max_accel_phase = min_phase
     self.min_accel_phase = max_phase
     #print "debug min_phase=",min_phase
     #print "debug max_phase=",max_phase
     #print "debug zero_accel_phase =",self.zero_accel_phase
     #----make theory graph plot
     harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
     x_arr = []
     y_arr = []
     for i in range(73):
         phase = -180.0 + 5.0 * i
         y = harm_function.getValue(phase)
         x_arr.append(phase)
         y_arr.append(y)
     self.phase_fit_gd.addPoint(x_arr, y_arr)
     #--------------------
     return true
コード例 #3
0
	def makeHarmonicFit(self):
		self.phase_fit_gd.removeAllPoints()	
		if(self.phase_gd.getNumbOfPoints() < 8): return false
		err = self.harmonicsAnalyzer.analyzeData(self.phase_gd)	
		harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()		
		#-----remove bad points
		gd = self.phase_gd
		max_bad_points_count = 3
		bad_points_count = 0
		bad_index = 1
		while(bad_index >= 0):
			bad_index = -1
			for i in range(gd.getNumbOfPoints()):
				phase = gd.getX(i)
				y_appr = harm_function.getValue(phase)
				y = gd.getY(i)
				if(math.fabs(y-y_appr) > 3.0*err):
					bad_index = i
					bad_points_count += 1
					break
			if(bad_index >= 0):
				gd.removePoint(bad_index)
				self.amp_gd.removePoint(bad_index)
			# we should stop if we have too many bad points
			if(bad_points_count > max_bad_points_count):
				return false
		if(bad_points_count > 0):
			err = self.harmonicsAnalyzer.analyzeData(gd)
			harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
		#----find a new cavity phase		
		min_phase = makePhaseNear(self.harmonicsAnalyzer.getPositionOfMin(),0.)
		max_phase = makePhaseNear(self.harmonicsAnalyzer.getPositionOfMax(),0.)
		# guess phase is -90 deg if max acceleratiom phase is 0.
		self.zero_accel_phase = makePhaseNear(min_phase - 90.,0.)
		self.max_accel_phase = min_phase
		self.min_accel_phase = max_phase 
		#print "debug min_phase=",min_phase
		#print "debug max_phase=",max_phase
		#print "debug zero_accel_phase =",self.zero_accel_phase
		#----make theory graph plot
		harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
		x_arr = []
		y_arr = []
		for i in range(73):
		 phase = -180.0 + 5.0*i
		 y = harm_function.getValue(phase)
		 x_arr.append(phase)
		 y_arr.append(y)
		self.phase_fit_gd.addPoint(x_arr,y_arr)
		#--------------------		
		return true
コード例 #4
0
	def shiftToPhase(self,gd,bpm_phase_init):
		nP = gd.getNumbOfPoints()
		if(nP == 0): return
		x_arr = []
		y_arr = []
		err_arr = []
		for ip in range(nP):
			x_arr.append(gd.getX(ip))	
			y_arr.append(gd.getY(ip))	
			err_arr.append(gd.getErr(ip))
		gd.removeAllPoints()
		y_arr[0] = makePhaseNear(y_arr[0],bpm_phase_init)
		for ip in range(1,nP):
			y_arr[ip] = makePhaseNear(y_arr[ip],y_arr[ip-1])	
		gd.addPoint(x_arr,y_arr,err_arr)			
コード例 #5
0
	def calculateEkin(self,bpm_scan_data0,bpm_scan_data1):
		if(self.active_cav_wrapper == null): (false,0.)
		cav_wrapper = self.active_cav_wrapper
		(phase0,err0) = bpm_scan_data0.getAvgPhaseAndErr()
		(phase1,err1) = bpm_scan_data1.getAvgPhaseAndErr()
		pos0 = bpm_scan_data0.bpm_wrapper.pos
		pos1 = bpm_scan_data1.bpm_wrapper.pos
		eKinIn_guess = cav_wrapper.Ekin_in_design
		bpm_freq0 = bpm_scan_data0.bpm_wrapper.bpm.getBPMBucket().getFrequency()*1.0e+6
		bpm_freq1 = bpm_scan_data1.bpm_wrapper.bpm.getBPMBucket().getFrequency()*1.0e+6		
		mass = self.scenario.getProbe().getSpeciesRestEnergy()/1.0e+6
		c = 2.997924e+8
		beta = math.sqrt((eKinIn_guess+2*mass)*eKinIn_guess)/(eKinIn_guess+mass)
		if(math.fabs(bpm_freq0 - bpm_freq1) > 1.0e+6):
			txt = "Cav. off analysis: BPMs have different frequences!"
			txt += " BPM0=" + bpm_scan_data0.bpm_wrapper.alias
			txt += " BPM1=" + bpm_scan_data1.bpm_wrapper.alias
			self.main_loop_controller.getMessageTextField().setText(txt)
			return (false,0.)
		bpm_freq = bpm_freq0
		delta_phase_guess = 360.0*(pos1 - pos0)*bpm_freq/(beta*c)
		delta_phase = makePhaseNear(phase1 - phase0,delta_phase_guess)
		beta_res = 360.0*(pos1 - pos0)*bpm_freq/(c*delta_phase)
		if(beta_res <= 0. or beta_res >= 1.):
			txt = "Cav. off analysis: data does not make sense!"
			txt += " BPM0=" + bpm_scan_data0.bpm_wrapper.alias
			txt += " BPM1=" + bpm_scan_data1.bpm_wrapper.alias
			self.main_loop_controller.getMessageTextField().setText(txt)
			return (false,0.)
		gamma = 1.0/math.sqrt(1.0-beta_res**2)
		eKinIn = mass*(gamma - 1.)
		return (true,eKinIn)
コード例 #6
0
	def getBPM_Phases(self,eKin_in,phase,phase_shift,bpm_wrappers):
		self.setModelPhase(phase,phase_shift)
		self.trackProbe(eKin_in)
		bpm_phases_arr = []		
		if(self.active_cav_wrapper == null): return bpm_phases_arr
		first_gap = self.gap_list.get(0)
		last_gap = self.gap_list.get(self.gap_list.size()-1)
		pos_max = self.accSeq.getPosition(last_gap)
		pos_min = self.accSeq.getPosition(first_gap)
		traj = self.scenario.getTrajectory()
		ind = traj.indicesForElement(last_gap.getId())[0]	
		last_gap_tm = traj.stateWithIndex(ind).getTime()
		for bpm_wrapper in bpm_wrappers:
			phase = 0.
			if(bpm_wrapper.pos > pos_min):
				tm = 0.
				if(bpm_wrapper.pos < pos_max):
					ind = traj.indicesForElement(bpm_wrapper.bpm.getId())[0]
					state0 = traj.stateWithIndex(ind-1)
					state1 = traj.stateWithIndex(ind+1)
					tm0 = state0.getTime()
					tm1 = state1.getTime()
					pos0 = state0.getPosition()
					pos1 = state1.getPosition()
					pos = bpm_wrapper.pos - pos_min
					tm = tm0 + (tm1-tm0)*(pos-pos0)/(pos1-pos0)
				else:
					c = 2.997924e+8
					beta = traj.finalState().getBeta()
					tm = (bpm_wrapper.pos - pos_max)/(c*beta)
					tm += last_gap_tm 
				phase = bpm_wrapper.bpm.getBPMBucket().getFrequency()*1.0e+6*360.*tm
			bpm_phases_arr.append(makePhaseNear(phase,0.))					
		return bpm_phases_arr
コード例 #7
0
 def shiftCavPhase(self, gd, phase_shift):
     self.cav_phase_shift += phase_shift
     self.cav_init_phase += phase_shift
     self.cav_phase_shift = makePhaseNear(self.cav_phase_shift, 0.)
     self.cav_init_phase = makePhaseNear(self.cav_init_phase, 0.)
     nP = gd.getNumbOfPoints()
     if (nP == 0): return
     x_arr = []
     y_arr = []
     err_arr = []
     for ip in range(nP):
         x_arr.append(gd.getX(ip) + phase_shift)
         y_arr.append(gd.getY(ip))
         err_arr.append(gd.getErr(ip))
     gd.removeAllPoints()
     for ip in range(nP):
         x_arr[ip] = makePhaseNear(x_arr[ip], 0.)
     gd.addPoint(x_arr, y_arr, err_arr)
コード例 #8
0
	def getCavOffBPM_Phases(self,eKin_in,bpm_wrappers):
		bpm_phases_arr = []		
		if(self.active_cav_wrapper == null): return bpm_phases_arr
		first_gap = self.gap_list.get(0)
		pos_min = self.accSeq.getPosition(first_gap)
		mass = self.scenario.getProbe().getSpeciesRestEnergy()/1.0e+6
		c = 2.997924e+8
		beta = math.sqrt((eKin_in+2*mass)*eKin_in)/(eKin_in+mass)		
		for bpm_wrapper in bpm_wrappers:
			phase = 0.
			if(bpm_wrapper.pos > pos_min):
				tm = (bpm_wrapper.pos - pos_min)/(c*beta) 
				phase = bpm_wrapper.bpm.getBPMBucket().getFrequency()*1.0e+6*360.*tm
			bpm_phases_arr.append(makePhaseNear(phase,0.))					
		return bpm_phases_arr	
コード例 #9
0
	def actionPerformed(self,actionEvent):
		messageTextField = self.main_loop_controller.getMessageTextField()
		messageTextField.setText("")
		res = self.main_loop_controller.connectAllPVs()
		if(not res):
			return	
		cav_selected_inds = self.main_loop_controller.cav_table.getSelectedRows()
		if(len(cav_selected_inds) < 1 or cav_selected_inds[0] < 0):
			messageTextField.setText("Select one or more cavities to correct Phase Shifts for 360 deg Scans!")	
			return
		for cav_ind in cav_selected_inds:
			cav_wrapper = self.main_loop_controller.cav_wrappers[cav_ind]
			cav_controller = self.main_loop_controller.cav_controllers[cav_ind]
			phase_shift = cav_controller.guess_phase_shift_text.getValue()
			initPhase = cav_wrapper.initPhase
			newPhase = cav_wrapper.newPhase
			delta_phase_shift = initPhase -  newPhase
			phase_shift += delta_phase_shift
			phase_shift = makePhaseNear(phase_shift,0.)
			cav_controller.guess_phase_shift_text.setValue(phase_shift)
コード例 #10
0
	def actionPerformed(self,actionEvent):
		messageTextField = self.main_loop_controller.getMessageTextField()
		messageTextField.setText("")
		cav_selected_inds = self.main_loop_controller.cav_table.getSelectedRows()
		if(len(cav_selected_inds) < 1 or cav_selected_inds[0] < 0):
			messageTextField.setText("Select one or more cavities to correct Phase Shifts for 360 deg Scans!")	
			return
		for cav_ind in cav_selected_inds:
			cav_wrapper = self.main_loop_controller.cav_wrappers[cav_ind]
			cav_controller = self.main_loop_controller.cav_controllers[cav_ind]
			initPhase = cav_wrapper.initPhase
			cav_wrapper.newPhase = cav_wrapper.initPhase
			guess_phase = cav_wrapper.cav_phase_unshifted_guess
			phase_shift = initPhase -  guess_phase
			phase_shift = makePhaseNear(phase_shift,0.)
			cav_controller.guess_phase_shift_text.setValue(phase_shift)
			cav_amp_coeff = cav_wrapper.design_amp/cav_wrapper.initAmp
			guess_cav_amp_shift = 100.*(1.0 - cav_amp_coeff/cav_wrapper.cav_amp_coeff_unshifted_guess)
			cav_controller.guess_cav_amp_shift_text.setValue(guess_cav_amp_shift)
		self.main_loop_controller.cav_table.getModel().fireTableDataChanged()
		self.main_loop_controller.cav_table.setRowSelectionInterval(cav_selected_inds[0],cav_selected_inds[len(cav_selected_inds)-1])
コード例 #11
0
	def setLivePhase(self,phase):
		self.phase_pv.putVal(makePhaseNear(phase,0.))
		# ??????
		pass
コード例 #12
0
 def addExternalPoint(self, cav_phase, fc_charge):
     if (self.fc_scan_gd.getNumbOfPoints() != 0):
         cav_phase_old = self.fc_scan_gd.getX(
             self.fc_scan_gd.getNumbOfPoints() - 1)
         cav_phase = makePhaseNear(cav_phase, cav_phase_old)
     self.fc_scan_gd.addPoint(cav_phase, fc_charge)