class Table_and_Plots_Panel(JPanel):
	def __init__(self,scl_long_tuneup_controller):
		self.scl_long_tuneup_controller = scl_long_tuneup_controller
		self.setLayout(BorderLayout())
		#----etched border
		etched_border = BorderFactory.createEtchedBorder()
		titled_border = BorderFactory.createTitledBorder(etched_border,"BPM Table and Plots")
		self.setBorder(titled_border)	
		#----------------------------------------
		self.bpm_table = JTable(Energy_Meter_BPMs_Table_Model(self.scl_long_tuneup_controller))
		self.bpm_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
		self.bpm_table.setFillsViewportHeight(true)
		self.bpm_table.setPreferredScrollableViewportSize(Dimension(400,300))	
		scrl_panel = JScrollPane(self.bpm_table)
		scrl_panel.setBorder(etched_border)
		bpm_table_panel = JPanel(BorderLayout())
		bpm_table_panel.add(scrl_panel,BorderLayout.WEST)
		#-----------------------------------------
		self.gp_bpm_phase_err = FunctionGraphsJPanel()
		self.gp_bpm_phase_err.setLegendButtonVisible(true)
		self.gp_bpm_phase_err.setChooseModeButtonVisible(true)	
		self.gp_bpm_phase_err.setName("BPM Phase Errors")
		self.gp_bpm_phase_err.setAxisNames("position, [m]","BPM Phase Error, [deg]")	
		self.gp_bpm_phase_err.setBorder(etched_border)
		bpm_graph_panel = JPanel(BorderLayout())
		bpm_graph_panel.add(self.gp_bpm_phase_err)
		#------graph data 
		self.bpm_phase_err_gd = BasicGraphData()
		self.bpm_phase_err_gd.setGraphPointSize(8)
		self.bpm_phase_err_gd.setDrawLinesOn(false)
		self.bpm_phase_err_gd.setGraphColor(Color.BLUE)	
		self.gp_bpm_phase_err.addGraphData(self.bpm_phase_err_gd)
		#-----------------------------------------
		self.add(bpm_table_panel,BorderLayout.WEST)	
		self.add(bpm_graph_panel,BorderLayout.CENTER)	
Ejemplo n.º 2
0
class AccState:
	"""
	AccState keeps the dictionary with quad fields, cavity amp. and phases, 
	the graph plot with WS/LW sizes, the calculated beam sizes, and 
	the scenario for this quad/cavities parameters.
	"""
	def __init__(self,quad_cav_dict,linac_wizard_document):
		self.quad_cav_dict = quad_cav_dict
		self.linac_wizard_document = linac_wizard_document
		self.isOn = true
		self.size_hor_record_arr = []
		self.size_ver_record_arr = []
		self.isSelected_ = false
		#----------- graph data 
		self.gd_exp_hor =  BasicGraphData()
		self.gd_exp_ver =  BasicGraphData()
		self.gd_exp_hor.setDrawLinesOn(false)
		self.gd_exp_ver.setDrawLinesOn(false)
		self.gd_exp_hor.setGraphPointSize(11)
		self.gd_exp_ver.setGraphPointSize(11)
		self.gd_exp_hor.setGraphColor(Color.BLUE)
		self.gd_exp_ver.setGraphColor(Color.BLUE)
		self.gd_model_hor =  BasicGraphData()
		self.gd_model_ver =  BasicGraphData()
		self.gd_model_lon =  BasicGraphData()
		self.gd_model_hor.setGraphColor(Color.RED)
		self.gd_model_ver.setGraphColor(Color.RED)
		self.gd_model_lon.setGraphColor(Color.RED)
		self.gd_model_hor.setLineThick(3)
		self.gd_model_ver.setLineThick(3)
		self.gd_model_lon.setLineThick(4)
		self.gd_model_hor.setDrawPointsOn(false)
		self.gd_model_ver.setDrawPointsOn(false)
		self.gd_exp_hor.setGraphProperty(GRAPH_LEGEND_KEY,"LW/WS sizes")
		self.gd_exp_ver.setGraphProperty(GRAPH_LEGEND_KEY,"LW/WS sizes")
		self.gd_model_hor.setGraphProperty(GRAPH_LEGEND_KEY,"Model Hor. Size")
		self.gd_model_ver.setGraphProperty(GRAPH_LEGEND_KEY,"Model Ver. Size")
		self.gd_model_lon.setGraphProperty(GRAPH_LEGEND_KEY,"Model Longitudinal Size")
		#------ accelerator model set up
		accSeq = self.linac_wizard_document.getAccSeq()
		quads = self.linac_wizard_document.ws_lw_controller.quads
		cavs = self.linac_wizard_document.ws_lw_controller.cavs
		#--memorize the initial values
		self.quad_field_arr = []
		for quad in quads:
			self.quad_field_arr.append([quad,quad.getDfltField()])
		self.cav_amp_phase_arr = []
		for cav in cavs:
			self.cav_amp_phase_arr.append([cav,cav.getDfltCavAmp(),cav.getDfltCavPhase()])
		#-- set up values from dictionaries
		[quad_dict,cav_amp_phase_dict] = self.quad_cav_dict
		for quad in quads:
			if(quad_dict.has_key(quad)):
				quad.setDfltField(quad_dict[quad])
		for cav in cavs:
			if(cav_amp_phase_dict.has_key(cav)):
				cav.updateDesignAmp(cav_amp_phase_dict[cav][0])
				cav.updateDesignPhase(cav_amp_phase_dict[cav][1])
		self.env_tracker = AlgorithmFactory.createEnvTrackerAdapt(accSeq)
		self.env_tracker.setRfGapPhaseCalculation(true)
		self.env_tracker.setUseSpacecharge(true)
		self.design_probe = ProbeFactory.getEnvelopeProbe(accSeq,self.env_tracker)
		probe = EnvelopeProbe(self.design_probe)
		self.scenario = Scenario.newScenarioFor(accSeq)
		self.scenario.setProbe(probe)
		self.scenario.setSynchronizationMode(Scenario.SYNC_MODE_DESIGN)
		self.scenario.resync()
		self.scenario.run()
		self.traj = self.scenario.getTrajectory()
		#---restore the quads and cav parameters
		for [quad,field] in self.quad_field_arr:
			quad.setDfltField(field)
		for [cav,amp,phase] in self.cav_amp_phase_arr:
			cav.updateDesignAmp(amp)
			cav.updateDesignPhase(phase)

	def resyncScenario(self):
		#-- set up values from dictionaries
		[quad_dict,cav_amp_phase_dict] = self.quad_cav_dict
		for [quad,field] in self.quad_field_arr:
			if(quad_dict.has_key(quad)):
				quad.setDfltField(quad_dict[quad])
		for [cav,amp,phase] in self.cav_amp_phase_arr:
			if(cav_amp_phase_dict.has_key(cav)):
				cav.updateDesignAmp(cav_amp_phase_dict[cav][0])
				cav.updateDesignPhase(cav_amp_phase_dict[cav][1])
		self.scenario.resync()
		#---restore the quads and cav parameters
		for [quad,field] in self.quad_field_arr:
			quad.setDfltField(field)
		for [cav,amp,phase] in self.cav_amp_phase_arr:
			cav.updateDesignAmp(amp)
			cav.updateDesignPhase(phase)		

	def updateGraphData(self):
		tr_twiss_analysis_controller = self.linac_wizard_document.tr_twiss_analysis_controller
		fit_param_index = tr_twiss_analysis_controller.fit_param_index
		self.gd_exp_hor.removeAllPoints()
		self.gd_exp_ver.removeAllPoints()
		for size_record in self.size_hor_record_arr:
			if(not size_record.isOn): continue
			size = size_record.gauss_sigma
			if(fit_param_index == 1): size = size_record.custom_gauss_sigma
			if(fit_param_index == 2): size = size_record.custom_rms_sigma
			pos = size_record.pos
			self.gd_exp_hor.addPoint(pos,size)
		for size_record in self.size_ver_record_arr:
			if(not size_record.isOn): continue
			size = size_record.gauss_sigma
			if(fit_param_index == 1): size = size_record.custom_gauss_sigma
			if(fit_param_index == 2): size = size_record.custom_rms_sigma
			pos = size_record.pos
			self.gd_exp_ver.addPoint(pos,size)

	def addSizeRecord(self,size_record):
		if(size_record.ws_direction == WS_DIRECTION_HOR):
			self.size_hor_record_arr.append(size_record)
		if(size_record.ws_direction == WS_DIRECTION_VER):
			self.size_ver_record_arr.append(size_record)
		
	def getQuadCavDict(self):
		return self.quad_cav_dict
		
	def setSelection(self,selection = false):
		self.isSelected_ = selection
		
	def isSelected(self):
		return self.isSelected_
Ejemplo n.º 3
0
class WS_Scan_Record:
	"""
	This class keeps the results of the scan in one directions for one LW or WS
	"""
	def __init__(self, ws_node, ws_direction = WS_DIRECTION_NULL):
		self.ws_node = ws_node
		self.gauss_sigma = 0.
		self.gd_wf = BasicGraphData()
		self.gd_log_wf = BasicGraphData()
		self.gd_wf.setDrawLinesOn(false)
		self.gd_log_wf.setDrawLinesOn(false)
		self.gd_wf.setGraphPointSize(5)
		self.gd_log_wf.setGraphPointSize(5)
		self.gd_wf.setGraphColor(Color.BLUE)
		self.gd_log_wf.setGraphColor(Color.BLUE)
		self.setDirection(ws_direction)
		self.left_limit = 0.
		self.right_limit = 0.
		
	def setWF(self,wf_x_arr,wf_y_arr):
		#set waive form
		self.gd_wf.removeAllPoints()
		self.gd_log_wf.removeAllPoints()
		if(len(wf_x_arr) == len(wf_y_arr) and len(wf_y_arr) > 0):
			self.left_limit = wf_x_arr[0]
			self.right_limit = wf_x_arr[len(wf_x_arr)-1]
			y_max = 0.
			for y in wf_y_arr:
				if(math.fabs(y_max) < math.fabs(y)):
					y_max = y
			if(y_max < 0):
				for i in range(len(wf_y_arr)):
					wf_y_arr[i] = - wf_y_arr[i]
				y_max = - y_max
			self.gd_wf.addPoint(wf_x_arr,wf_y_arr)
			for i in range(len(wf_y_arr)):
				if(wf_y_arr[i] > 0.):
					self.gd_log_wf.addPoint(wf_x_arr[i],math.log(wf_y_arr[i]))
					
	def setDirection(	self,ws_direction):
		self.ws_direction = ws_direction
		legendKey = GRAPH_LEGEND_KEY
		legendName = self.ws_node.getId() 
		if(self.ws_direction == WS_DIRECTION_HOR): legendName += " Hor. "
		if(self.ws_direction == WS_DIRECTION_VER): legendName += " Ver. "
		self.gd_wf.setGraphProperty(legendKey,legendName+" Data")
		self.gd_log_wf.setGraphProperty(legendKey,"Log "+legendName+" Data ")	
						
	def getName(self):
		return self.ws_node.getId()
		
	def getAccNode(self):
		return self.ws_node
		
	def getCopy(self):
		""" 
		This method will return the partial copy of the record
		"""
		cp_record = WS_Scan_Record(self.ws_node,self.ws_direction)
		cp_record.left_limit  = self.left_limit
		cp_record.right_limit = self.right_limit
		cp_record.gauss_sigma = self.gauss_sigma
		#copy Graph data
		for i in range(self.gd_wf.getNumbOfPoints()):
			cp_record.gd_wf.addPoint(self.gd_wf.getX(i),self.gd_wf.getY(i))
			cp_record.gd_log_wf.addPoint(self.gd_log_wf.getX(i),self.gd_log_wf.getY(i))
		return cp_record
Ejemplo n.º 4
0
class WS_Scan_and_Fit_Record:
	def __init__(self,ws_scan_Record):
		self.isOn = true
		self.index = -1
		self.pos = 0.
		self.fit_is_good = false 
		self.gauss_sigma = ws_scan_Record.gauss_sigma
		self.ws_node = ws_scan_Record.ws_node
		self.ws_direction = ws_scan_Record.ws_direction
		self.custom_gauss_sigma = 0.
		self.custom_rms_sigma = 0.
		self.gd_wf = BasicGraphData()
		self.gd_fit_wf = BasicGraphData()
		self.gd_log_wf = BasicGraphData()
		self.gd_log_fit_wf = BasicGraphData()
		self.gd_wf.setDrawLinesOn(false)
		self.gd_log_wf.setDrawLinesOn(false)
		self.gd_fit_wf.setDrawPointsOn(false)
		self.gd_log_fit_wf.setDrawPointsOn(false)
		self.gd_wf.setGraphPointSize(5)
		self.gd_log_wf.setGraphPointSize(5)
		self.gd_fit_wf.setLineThick(3)
		self.gd_log_fit_wf.setLineThick(3)
		self.gd_wf.setGraphColor(Color.BLUE)
		self.gd_log_wf.setGraphColor(Color.BLUE)
		self.gd_fit_wf.setGraphColor(Color.RED)
		self.gd_log_fit_wf.setGraphColor(Color.RED)
		legendKey = GRAPH_LEGEND_KEY
		legendName = self.ws_node.getId() 
		if(self.ws_direction == WS_DIRECTION_HOR): legendName += " Hor. "
		if(self.ws_direction == WS_DIRECTION_VER): legendName += " Ver. "
		self.gd_wf.setGraphProperty(legendKey,legendName+" Data")
		self.gd_log_wf.setGraphProperty(legendKey,"Log "+legendName+" Data ")
		self.gd_fit_wf.setGraphProperty(legendKey,"Log "+legendName+" Fit ")
		self.gd_log_fit_wf.setGraphProperty(legendKey,"Log "+legendName+" Fit ")
		#----------- copy Graph data -------------
		for i in range(ws_scan_Record.gd_wf.getNumbOfPoints()):
			self.gd_wf.addPoint(ws_scan_Record.gd_wf.getX(i),ws_scan_Record.gd_wf.getY(i))
		for i in range(ws_scan_Record.gd_log_wf.getNumbOfPoints()):
			self.gd_log_wf.addPoint(ws_scan_Record.gd_log_wf.getX(i),ws_scan_Record.gd_log_wf.getY(i))	
		self.n_fit_points = 150
		self.quad_dict = {}
		self.cav_amp_phase_dict = {}
		self.param_dict = [self.quad_dict,self.cav_amp_phase_dict]
		#-----Gauss Fitting params----------------
		self.CONST = DoubleInputTextField(0.,ScientificNumberFormat(5),10)
		self.A0 = DoubleInputTextField(0.,ScientificNumberFormat(5),10)
		self.X_CENTER = DoubleInputTextField(0.,ScientificNumberFormat(5),10)
		self.SIGMA = DoubleInputTextField(self.gauss_sigma,ScientificNumberFormat(5),10)
		self.X_MIN = DoubleInputTextField(ws_scan_Record.left_limit,ScientificNumberFormat(5),10)
		self.X_MAX = DoubleInputTextField(ws_scan_Record.right_limit,ScientificNumberFormat(5),10)
				
	def plotFitData(self):
		x_min = self.X_MIN.getValue()
		x_max = self.X_MAX.getValue()
		step = (x_max - x_min)/(self.n_fit_points - 1)
		base = self.CONST.getValue()
		a0 = self.A0.getValue()
		x0 = self.X_CENTER.getValue()
		sigma2 = (self.SIGMA.getValue())**2
		self.gd_fit_wf.removeAllPoints()
		self.gd_log_fit_wf.removeAllPoints()
		for i in range(self.n_fit_points):
			x = x_min + i*step
			y = base + a0*math.exp(-(x-x0)**2/(2*sigma2))
			self.gd_fit_wf.addPoint(x,y)
			if(y > 0.):
				self.gd_log_fit_wf.addPoint(x,math.log(y))
				
	def setParamDict(self,param_dict):
		self.param_dict = param_dict
		[self.quad_dict,self.cav_amp_phase_dict] = self.param_dict
				
	def getName(self):
		return self.ws_node.getId()
		
	def getAccNode(self):
		return self.ws_node
		
	def updateGaussParams(self):
		self.custom_gauss_sigma = self.SIGMA.getValue()
class WS_Scan_Record:
	"""
	This class keeps the results of the scan in one directions for one LW or WS
	"""
	def __init__(self, ws_node, ws_direction = WS_DIRECTION_NULL):
		self.ws_node = ws_node
		self.gauss_sigma = 0.
		self.gd_wf = BasicGraphData()
		self.gd_log_wf = BasicGraphData()
		self.gd_wf.setDrawLinesOn(false)
		self.gd_log_wf.setDrawLinesOn(false)
		self.gd_wf.setGraphPointSize(5)
		self.gd_log_wf.setGraphPointSize(5)
		self.gd_wf.setGraphColor(Color.BLUE)
		self.gd_log_wf.setGraphColor(Color.BLUE)
		self.setDirection(ws_direction)
		self.left_limit = 0.
		self.right_limit = 0.
		
	def setWF(self,wf_x_arr,wf_y_arr):
		#set waive form
		self.gd_wf.removeAllPoints()
		self.gd_log_wf.removeAllPoints()
		if(len(wf_x_arr) == len(wf_y_arr) and len(wf_y_arr) > 0):
			self.left_limit = wf_x_arr[0]
			self.right_limit = wf_x_arr[len(wf_x_arr)-1]
			y_max = 0.
			for y in wf_y_arr:
				if(math.fabs(y_max) < math.fabs(y)):
					y_max = y
			if(y_max < 0):
				for i in range(len(wf_y_arr)):
					wf_y_arr[i] = - wf_y_arr[i]
				y_max = - y_max
			self.gd_wf.addPoint(wf_x_arr,wf_y_arr)
			for i in range(len(wf_y_arr)):
				if(wf_y_arr[i] > 0.):
					self.gd_log_wf.addPoint(wf_x_arr[i],math.log(wf_y_arr[i]))
					
	def setDirection(	self,ws_direction):
		self.ws_direction = ws_direction
		legendKey = GRAPH_LEGEND_KEY
		legendName = self.ws_node.getId() 
		if(self.ws_direction == WS_DIRECTION_HOR): legendName += " Hor. "
		if(self.ws_direction == WS_DIRECTION_VER): legendName += " Ver. "
		self.gd_wf.setGraphProperty(legendKey,legendName+" Data")
		self.gd_log_wf.setGraphProperty(legendKey,"Log "+legendName+" Data ")	
						
	def getName(self):
		return self.ws_node.getId()
		
	def getAccNode(self):
		return self.ws_node
		
	def getCopy(self):
		""" 
		This method will return the partial copy of the record
		"""
		cp_record = WS_Scan_Record(self.ws_node,self.ws_direction)
		cp_record.left_limit  = self.left_limit
		cp_record.right_limit = self.right_limit
		cp_record.gauss_sigma = self.gauss_sigma
		#copy Graph data
		for i in range(self.gd_wf.getNumbOfPoints()):
			cp_record.gd_wf.addPoint(self.gd_wf.getX(i),self.gd_wf.getY(i))
			cp_record.gd_log_wf.addPoint(self.gd_log_wf.getX(i),self.gd_log_wf.getY(i))
		return cp_record
class WS_Scan_and_Fit_Record:
	def __init__(self,ws_scan_Record):
		self.isOn = true
		self.index = -1
		self.pos = 0.
		self.fit_is_good = false 
		self.gauss_sigma = ws_scan_Record.gauss_sigma
		self.ws_node = ws_scan_Record.ws_node
		self.ws_direction = ws_scan_Record.ws_direction
		self.custom_gauss_sigma = 0.
		self.custom_rms_sigma = 0.
		self.gd_wf = BasicGraphData()
		self.gd_fit_wf = BasicGraphData()
		self.gd_log_wf = BasicGraphData()
		self.gd_log_fit_wf = BasicGraphData()
		self.gd_wf.setDrawLinesOn(false)
		self.gd_log_wf.setDrawLinesOn(false)
		self.gd_fit_wf.setDrawPointsOn(false)
		self.gd_log_fit_wf.setDrawPointsOn(false)
		self.gd_wf.setGraphPointSize(5)
		self.gd_log_wf.setGraphPointSize(5)
		self.gd_fit_wf.setLineThick(3)
		self.gd_log_fit_wf.setLineThick(3)
		self.gd_wf.setGraphColor(Color.BLUE)
		self.gd_log_wf.setGraphColor(Color.BLUE)
		self.gd_fit_wf.setGraphColor(Color.RED)
		self.gd_log_fit_wf.setGraphColor(Color.RED)
		legendKey = GRAPH_LEGEND_KEY
		legendName = self.ws_node.getId() 
		if(self.ws_direction == WS_DIRECTION_HOR): legendName += " Hor. "
		if(self.ws_direction == WS_DIRECTION_VER): legendName += " Ver. "
		self.gd_wf.setGraphProperty(legendKey,legendName+" Data")
		self.gd_log_wf.setGraphProperty(legendKey,"Log "+legendName+" Data ")
		self.gd_fit_wf.setGraphProperty(legendKey,"Log "+legendName+" Fit ")
		self.gd_log_fit_wf.setGraphProperty(legendKey,"Log "+legendName+" Fit ")
		#----------- copy Graph data -------------
		for i in range(ws_scan_Record.gd_wf.getNumbOfPoints()):
			self.gd_wf.addPoint(ws_scan_Record.gd_wf.getX(i),ws_scan_Record.gd_wf.getY(i))
		for i in range(ws_scan_Record.gd_log_wf.getNumbOfPoints()):
			self.gd_log_wf.addPoint(ws_scan_Record.gd_log_wf.getX(i),ws_scan_Record.gd_log_wf.getY(i))	
		self.n_fit_points = 150
		self.quad_dict = {}
		self.cav_amp_phase_dict = {}
		self.param_dict = [self.quad_dict,self.cav_amp_phase_dict]
		#-----Gauss Fitting params----------------
		self.CONST = DoubleInputTextField(0.,ScientificNumberFormat(5),10)
		self.A0 = DoubleInputTextField(0.,ScientificNumberFormat(5),10)
		self.X_CENTER = DoubleInputTextField(0.,ScientificNumberFormat(5),10)
		self.SIGMA = DoubleInputTextField(self.gauss_sigma,ScientificNumberFormat(5),10)
		self.X_MIN = DoubleInputTextField(ws_scan_Record.left_limit,ScientificNumberFormat(5),10)
		self.X_MAX = DoubleInputTextField(ws_scan_Record.right_limit,ScientificNumberFormat(5),10)
				
	def plotFitData(self):
		x_min = self.X_MIN.getValue()
		x_max = self.X_MAX.getValue()
		step = (x_max - x_min)/(self.n_fit_points - 1)
		base = self.CONST.getValue()
		a0 = self.A0.getValue()
		x0 = self.X_CENTER.getValue()
		sigma2 = (self.SIGMA.getValue())**2
		self.gd_fit_wf.removeAllPoints()
		self.gd_log_fit_wf.removeAllPoints()
		for i in range(self.n_fit_points):
			x = x_min + i*step
			y = base + a0*math.exp(-(x-x0)**2/(2*sigma2))
			self.gd_fit_wf.addPoint(x,y)
			if(y > 0.):
				self.gd_log_fit_wf.addPoint(x,math.log(y))
				
	def setParamDict(self,param_dict):
		self.param_dict = param_dict
		[self.quad_dict,self.cav_amp_phase_dict] = self.param_dict
				
	def getName(self):
		return self.ws_node.getId()
		
	def getAccNode(self):
		return self.ws_node
		
	def updateGaussParams(self):
		self.custom_gauss_sigma = self.SIGMA.getValue()
Ejemplo n.º 7
0
class Orbit_Diff_Graphs_Panel(JPanel):
	def __init__(self,mebt_main_orbit_diff_cntrl):
		self.mebt_main_orbit_diff_cntrl = mebt_main_orbit_diff_cntrl
		self.setLayout(BorderLayout())
		tabbedPane = JTabbedPane()
		#----etched border
		etched_border = BorderFactory.createEtchedBorder()
		#---- plots for Hor-Ver and Longitudinal
		self.hor_plot = FunctionGraphsJPanel()
		self.hor_plot.setLegendButtonVisible(true)
		self.hor_plot.setChooseModeButtonVisible(true)
		self.hor_plot.setName("Horizontal Plane (Vert.Lns.: Black:quads Blue:DC Red:Cavs)")
		self.hor_plot.setAxisNames("Position, m","X[mm]")	
		self.hor_plot.setBorder(etched_border)		
		self.ver_plot = FunctionGraphsJPanel()
		self.ver_plot.setLegendButtonVisible(true)
		self.ver_plot.setChooseModeButtonVisible(true)
		self.ver_plot.setName("Vertical Plane (Vert.Lns.: Black:quads Blue:DC Red:Cavs)")
		self.ver_plot.setAxisNames("Position, m","Y[mm]")	
		self.ver_plot.setBorder(etched_border)		
		#------------------------------------------------
		self.hor_diff_plot = FunctionGraphsJPanel()
		self.hor_diff_plot.setLegendButtonVisible(true)
		self.hor_diff_plot.setChooseModeButtonVisible(true)
		self.hor_diff_plot.setName("Horizontal Plane (Vert.Lns.: Black:quads Blue:DC Red:Cavs)")
		self.hor_diff_plot.setAxisNames("Position, m","Diff X[mm]")	
		self.hor_diff_plot.setBorder(etched_border)		
		self.ver_diff_plot = FunctionGraphsJPanel()
		self.ver_diff_plot.setLegendButtonVisible(true)
		self.ver_diff_plot.setChooseModeButtonVisible(true)
		self.ver_diff_plot.setName("Vertical Plane (Vert.Lns.: Black:quads Blue:DC Red:Cavs)")
		self.ver_diff_plot.setAxisNames("Position, m","Diff Y[mm]")	
		self.ver_diff_plot.setBorder(etched_border)	
		#--------------------------------------------------------------------
		quad_wrappers = self.mebt_main_orbit_diff_cntrl.quad_wrappers
		dc_wrappers = self.mebt_main_orbit_diff_cntrl.dc_wrappers
		mebt_cav_wrappers = self.mebt_main_orbit_diff_cntrl.mebt_cav_wrappers
		for wrapper in quad_wrappers:
			self.hor_plot.addVerticalLine(wrapper.pos,Color.BLACK)
			self.ver_plot.addVerticalLine(wrapper.pos,Color.BLACK)
			self.hor_diff_plot.addVerticalLine(wrapper.pos,Color.BLACK)
			self.ver_diff_plot.addVerticalLine(wrapper.pos,Color.BLACK)
		for wrapper in dc_wrappers:
			self.hor_plot.addVerticalLine(wrapper.pos,Color.BLUE)
			self.ver_plot.addVerticalLine(wrapper.pos,Color.BLUE)
			self.hor_diff_plot.addVerticalLine(wrapper.pos,Color.BLUE)
			self.ver_diff_plot.addVerticalLine(wrapper.pos,Color.BLUE)
		for wrapper in mebt_cav_wrappers:
			self.hor_plot.addVerticalLine(wrapper.pos,Color.RED)
			self.ver_plot.addVerticalLine(wrapper.pos,Color.RED)
			self.hor_diff_plot.addVerticalLine(wrapper.pos,Color.RED)
			self.ver_diff_plot.addVerticalLine(wrapper.pos,Color.RED)
		#---------------------------------------------------------------------
		#--------------------------------------------------
		#---- panels
		graph_diff_panel = JPanel(GridLayout(2,1))
		graph_diff_panel.add(self.hor_diff_plot)
		graph_diff_panel.add(self.ver_diff_plot)
		#----------------------------------
		graph_panel = JPanel(GridLayout(2,1))
		graph_panel.add(self.hor_plot)
		graph_panel.add(self.ver_plot)
		#----------------------------------
		tabbedPane.add("Orbit Difference",graph_diff_panel)
		tabbedPane.add("Orbit",graph_panel)
		#-------------------------------------
		self.x_model_gd = BasicGraphData()
		self.x_model_gd.setLineThick(3)
		self.x_model_gd.setGraphPointSize(7)
		self.x_model_gd.setGraphColor(Color.BLUE)
		self.x_model_gd.setGraphProperty(GRAPH_LEGEND_KEY,"X Model [mm]")
		self.x_model_gd.setDrawLinesOn(true)
		self.x_model_gd.setDrawPointsOn(false)
		#-------------------------------------
		self.y_model_gd = BasicGraphData()
		self.y_model_gd.setLineThick(3)
		self.y_model_gd.setGraphPointSize(7)
		self.y_model_gd.setGraphColor(Color.RED)
		self.y_model_gd.setGraphProperty(GRAPH_LEGEND_KEY,"Y Model [mm]")
		self.y_model_gd.setDrawLinesOn(true)
		self.y_model_gd.setDrawPointsOn(false)
		#-------------------------------------
		self.x_model_diff_gd = BasicGraphData()
		self.x_model_diff_gd.setLineThick(3)
		self.x_model_diff_gd.setGraphPointSize(7)
		self.x_model_diff_gd.setGraphColor(Color.BLUE)
		self.x_model_diff_gd.setGraphProperty(GRAPH_LEGEND_KEY,"X Diff Model [mm]")
		self.x_model_diff_gd.setDrawLinesOn(true)
		self.x_model_diff_gd.setDrawPointsOn(false)
		#-------------------------------------
		self.y_model_diff_gd = BasicGraphData()
		self.y_model_diff_gd.setLineThick(3)
		self.y_model_diff_gd.setGraphPointSize(7)
		self.y_model_diff_gd.setGraphColor(Color.RED)
		self.y_model_diff_gd.setGraphProperty(GRAPH_LEGEND_KEY,"Y Diff Model [mm]")
		self.y_model_diff_gd.setDrawLinesOn(true)
		self.y_model_diff_gd.setDrawPointsOn(false)
		#-------------------------------------
		#-------------------------------------
		self.x_bpm_gd = BasicGraphData()
		self.x_bpm_gd.setLineThick(3)
		self.x_bpm_gd.setGraphPointSize(7)
		self.x_bpm_gd.setGraphColor(Color.BLUE)
		self.x_bpm_gd.setGraphProperty(GRAPH_LEGEND_KEY,"X BPM [mm]")
		self.x_bpm_gd.setDrawLinesOn(false)
		self.x_bpm_gd.setDrawPointsOn(true)
		#-------------------------------------
		self.y_bpm_gd = BasicGraphData()
		self.y_bpm_gd.setLineThick(3)
		self.y_bpm_gd.setGraphPointSize(7)
		self.y_bpm_gd.setGraphColor(Color.RED)
		self.y_bpm_gd.setGraphProperty(GRAPH_LEGEND_KEY,"Y BPM [mm]")
		self.y_bpm_gd.setDrawLinesOn(false)
		self.y_bpm_gd.setDrawPointsOn(true)
		#-------------------------------------
		self.x_bpm_diff_gd = BasicGraphData()
		self.x_bpm_diff_gd.setLineThick(3)
		self.x_bpm_diff_gd.setGraphPointSize(7)
		self.x_bpm_diff_gd.setGraphColor(Color.BLUE)
		self.x_bpm_diff_gd.setGraphProperty(GRAPH_LEGEND_KEY,"X Diff BPM [mm]")
		self.x_bpm_diff_gd.setDrawLinesOn(false)
		self.x_bpm_diff_gd.setDrawPointsOn(true)
		#-------------------------------------
		self.y_bpm_diff_gd = BasicGraphData()
		self.y_bpm_diff_gd.setLineThick(3)
		self.y_bpm_diff_gd.setGraphPointSize(7)
		self.y_bpm_diff_gd.setGraphColor(Color.RED)
		self.y_bpm_diff_gd.setGraphProperty(GRAPH_LEGEND_KEY,"Y Diff BPM [mm]")
		self.y_bpm_diff_gd.setDrawLinesOn(false)
		self.y_bpm_diff_gd.setDrawPointsOn(true)
		#-------------------------------------		
		self.index0_button = JRadioButton("Orbit #0")
		self.index1_button = JRadioButton("Orbit #1")
		self.button_group = ButtonGroup()
		self.button_group.add(self.index0_button)
		self.button_group.add(self.index1_button)
		self.index0_button.setSelected(true)
		replot_button = JButton("Replot Graphs")
		replot_button.addActionListener(Replot_Button_Listener(self.mebt_main_orbit_diff_cntrl))
		button_panel = JPanel(FlowLayout(FlowLayout.LEFT,3,3))
		button_panel.add(self.index0_button)
		button_panel.add(self.index1_button)
		button_panel.add(replot_button)
		#-----------------------------------------------
		self.add(tabbedPane,BorderLayout.CENTER)
		self.add(button_panel,BorderLayout.SOUTH)
				
	def removeAllGraphData(self):
		self.hor_plot.removeAllGraphData()
		self.ver_plot.removeAllGraphData()
		self.hor_diff_plot.removeAllGraphData()
		self.ver_diff_plot.removeAllGraphData()
		#--------------------------------------
		self.x_model_gd.removeAllPoints()
		self.y_model_gd.removeAllPoints()
		self.x_model_diff_gd.removeAllPoints()
		self.y_model_diff_gd.removeAllPoints()
		#--------------------------------------
		self.x_bpm_gd.removeAllPoints()
		self.y_bpm_gd.removeAllPoints()
		self.x_bpm_diff_gd.removeAllPoints()
		self.y_bpm_diff_gd.removeAllPoints()
								
	def updateGraphData(self):
		self.removeAllGraphData()
		orb_index = 0
		if(self.index1_button.isSelected()):
			orb_index = 1
		#print "debug orb_index=",orb_index
		#==== update graph data from calculator and measurer
		orbit_measurer = self.mebt_main_orbit_diff_cntrl.orbit_measurer
		mebt_orbit_holder_0 = orbit_measurer.mebt_orbit_holder_0
		mebt_orbit_holder_1 = orbit_measurer.mebt_orbit_holder_1
		bpm_orbit_holder_0 = orbit_measurer.bpm_orbit_holder_0
		bpm_orbit_holder_1 = orbit_measurer.bpm_orbit_holder_1
		bpm_wrappers = self.mebt_main_orbit_diff_cntrl.bpm_wrappers
		max_pos = 0.
		for bpm_wrapper in bpm_wrappers:
			if(bpm_wrapper.use):
				if(max_pos < bpm_wrapper.pos):
					max_pos = bpm_wrapper.pos
		#----------------------------------------
		pos_step = 0.1
		pos_old = -1.
		traj0 = mebt_orbit_holder_0.getTrajectory()
		traj1 = mebt_orbit_holder_1.getTrajectory()
		for ind in range(traj0.numStates()):
			state0 = traj0.stateWithIndex(ind)
			pos = state0.getPosition()
			state1 = traj1.stateNearestPosition(pos)
			if(pos > (pos_old + pos_step) and pos_old < max_pos):
				x0 = state0.getPhaseCoordinates().getx()*1000.
				y0 = state0.getPhaseCoordinates().gety()*1000.
				x1 = state1.getPhaseCoordinates().getx()*1000.
				y1 = state1.getPhaseCoordinates().gety()*1000.
				pos_old = pos
				if(orb_index == 0):
					self.x_model_gd.addPoint(pos,x0)
					self.y_model_gd.addPoint(pos,y0)
				else:
					self.x_model_gd.addPoint(pos,x1)
					self.y_model_gd.addPoint(pos,y1)					
				self.x_model_diff_gd.addPoint(pos,x1-x0)
				self.y_model_diff_gd.addPoint(pos,y1-y0)
		#----------------------------------------------
		#bpm_orbit_holder_0.calcStatistics()
		#bpm_orbit_holder_1.calcStatistics()
		for bpm_wrapper in bpm_wrappers:
			if(bpm_wrapper.use):		
				(x0,x0_err,y0,y0_err) = bpm_orbit_holder_0.getXY_and_Err(bpm_wrapper)
				(x1,x1_err,y1,y1_err) = bpm_orbit_holder_1.getXY_and_Err(bpm_wrapper)
				if(orb_index == 0):
					self.x_bpm_gd.addPoint(bpm_wrapper.pos,x0,x0_err)
					self.y_bpm_gd.addPoint(bpm_wrapper.pos,y0,y0_err)
				else:
					self.x_bpm_gd.addPoint(bpm_wrapper.pos,x1,x1_err)
					self.y_bpm_gd.addPoint(bpm_wrapper.pos,y1,y1_err)					
				self.x_bpm_diff_gd.addPoint(bpm_wrapper.pos,x1-x0,math.sqrt(x0_err**2+x1_err**2))
				self.y_bpm_diff_gd.addPoint(bpm_wrapper.pos,y1-y0,math.sqrt(y0_err**2+y1_err**2))
		#-------------------------------------
		self.hor_plot.addGraphData(self.x_model_gd)
		self.hor_plot.addGraphData(self.x_bpm_gd)
		self.ver_plot.addGraphData(self.y_model_gd)
		self.ver_plot.addGraphData(self.y_bpm_gd)
		#-------------------------------------
		self.hor_diff_plot.addGraphData(self.x_model_diff_gd)
		self.hor_diff_plot.addGraphData(self.x_bpm_diff_gd)
		self.ver_diff_plot.addGraphData(self.y_model_diff_gd)
		self.ver_diff_plot.addGraphData(self.y_bpm_diff_gd)
Ejemplo n.º 8
0
class BPM_Scan_Data:
	def __init__(self,main_loop_controller,cav_controller,bpm_wrapper):
		self.main_loop_controller = main_loop_controller
		self.cav_controller = cav_controller
		self.bpm_wrapper = bpm_wrapper
		self.cav_amp = 0.
		self.derivative = 0.
		self.zero_accel_phase = 0.
		self.max_accel_phase = 0.
		self.min_accel_phase = 0.
		#------ for MEBT measurements for Iteration process only
		self.cav_off_bpm_phase = 0.
		self.cav_off_bpm_phase_err = 0.
		self.cav_on_bpm_phase = 0.
		self.cav_on_bpm_phase_err = 0.
		self.cav_off_bpm_amp = 0.
		self.cav_off_bpm_amp_err = 0.
		self.cav_on_bpm_amp = 0.
		self.cav_on_bpm_amp_err = 0.
		#-----------------------------------------------------		
		self.harmonicsAnalyzer = HarmonicsAnalyzer(2)		
		self.phase_gd = BasicGraphData()
		self.phase_gd.setLineThick(3)
		self.phase_gd.setGraphPointSize(7)
		self.phase_gd.setGraphColor(Color.BLUE)
		self.phase_gd.setGraphProperty(GRAPH_LEGEND_KEY,self.bpm_wrapper.alias)
		self.phase_gd.setDrawLinesOn(true)
		self.phase_gd.setDrawPointsOn(true)
		#------------------------------
		self.amp_gd = BasicGraphData()
		self.amp_gd.setLineThick(3)
		self.amp_gd.setGraphPointSize(7)
		self.amp_gd.setGraphColor(Color.BLUE)
		self.amp_gd.setGraphProperty(GRAPH_LEGEND_KEY,self.bpm_wrapper.alias)
		self.amp_gd.setDrawLinesOn(true)
		self.amp_gd.setDrawPointsOn(true)		
		#------------------------------------
		self.phase_fit_gd = BasicGraphData()
		self.phase_fit_gd.setLineThick(3)
		self.phase_fit_gd.setGraphPointSize(3)
		self.phase_fit_gd.setGraphColor(Color.RED)
		self.phase_fit_gd.setGraphProperty(GRAPH_LEGEND_KEY,"Fit "+self.bpm_wrapper.alias)
		self.phase_fit_gd.setDrawLinesOn(true)
		self.phase_fit_gd.setDrawPointsOn(false)		
		
	def clean(self):
		self.phase_gd.removeAllPoints()	
		self.amp_gd.removeAllPoints()	
		self.phase_fit_gd.removeAllPoints()
		self.derivative = 0.
		self.zero_accel_phase = 0.
		self.max_accel_phase = 0.
		self.min_accel_phase = 0.		
		#------ for MEBT measurements for Iteration process only
		self.cav_off_bpm_phase = 0.
		self.cav_off_bpm_phase_err = 0.
		self.cav_on_bpm_phase = 0.
		self.cav_on_bpm_phase_err = 0.
		self.cav_off_bpm_amp = 0.
		self.cav_off_bpm_amp_err = 0.
		self.cav_on_bpm_amp = 0.
		self.cav_on_bpm_amp_err = 0.		

	def addPoint(self,cav_phase):
		if(not self.bpm_wrapper.isOn): return
		bpm_amp = self.bpm_wrapper.bpm.getAmpAvg()		
		bpm_phase = self.bpm_wrapper.bpm.getPhaseAvg()
		self.addExternalPoint(cav_phase,bpm_amp,bpm_phase)
		
	def getAmpAndPhase(self):
		if(not self.bpm_wrapper.isOn): return (0.,0.)
		bpm_amp = self.bpm_wrapper.bpm.getAmpAvg()		
		bpm_phase = self.bpm_wrapper.bpm.getPhaseAvg()
		return (bpm_amp,bpm_phase)		

	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)		
		
	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)			
			
	def makeLinearFit(self):
		self.phase_fit_gd.removeAllPoints()	
		self.derivative = 0.
		if(self.phase_gd.getNumbOfPoints() > 1):
			GraphDataOperations.polynomialFit(self.phase_gd,self.phase_fit_gd,1)
			self.phase_fit_gd.setGraphColor(Color.RED)
			nP = self.phase_fit_gd.getNumbOfPoints()
			self.derivative = 0.
			if(nP > 1):
				X0 = self.phase_fit_gd.getX(0)
				X1 = self.phase_fit_gd.getX(nP-1)
				self.derivative = self.phase_fit_gd.getValueDerivativeY((X0+X1)/2.0)
			return true
		return false
				
	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
				
	def setCavAmplitudeParam(self,cav_amp):
		self.cav_amp = cav_amp
		self.phase_fit_gd.setGraphProperty(GRAPH_LEGEND_KEY,"Fit "+self.bpm_wrapper.alias+" CavAmp= %6.4f "%self.cav_amp)
		self.phase_gd.setGraphProperty(GRAPH_LEGEND_KEY,self.bpm_wrapper.alias+" CavAmp= %6.4f "%self.cav_amp)
		self.amp_gd.setGraphProperty(GRAPH_LEGEND_KEY,self.bpm_wrapper.alias+" CavAmp= %6.4f "%self.cav_amp)
		
	def checkLastDataPoint(self,min_bpm_amp):
		if(not self.bpm_wrapper.isOn): return false
		res = true
		nP = self.phase_gd.getNumbOfPoints()
		if(nP > 1):
			if(math.fabs(self.phase_gd.getY(nP-2) - self.phase_gd.getY(nP-1)) < 0.000000001):
				return false
		if(nP > 0):
			if(self.amp_gd.getY(nP-1) < min_bpm_amp):
				return false
		return res
				
	def removeLastPoint(self):
		if(not self.bpm_wrapper.isOn): return
		nP = self.phase_gd.getNumbOfPoints()
		if(nP < 1): return
		self.phase_gd.removePoint(nP-1)
		self.amp_gd.removePoint(nP-1)
		
	def getAvgPhaseAndErr(self):
		nP = self.phase_gd.getNumbOfPoints()
		if(nP < 1): return (0.,0.)
		phase_arr = []
		for ind in range(nP):
			phase_arr.append(self.phase_gd.getY(ind))
		(avg_phase,avg_phase_err) = calculateAvgErr(phase_arr)
		return (avg_phase,avg_phase_err)
	
	def writeDataToXML(self,root_da):
		bpm_scan_data_da = root_da.createChild("bpm_scan_data")
		bpm_scan_data_da.setValue("cav",self.cav_controller.cav_wrapper.alias)	
		bpm_scan_data_da.setValue("bpm",self.bpm_wrapper.alias)	
		bpm_scan_data_da.setValue("cav_amp",self.cav_amp)
		bpm_scan_data_da.setValue("derivative","%7.5f"%self.derivative)
		bpm_scan_data_da.setValue("zero_accel_phase","%7.3f"%self.zero_accel_phase)
		bpm_scan_data_da.setValue("max_accel_phase", "%7.3f"%self.max_accel_phase)
		if(self.cav_controller.cav_wrapper.alias.find("MEBT") >= 0):
			mebt_cav_off_on_da = bpm_scan_data_da.createChild("cav_off_on_data")
			mebt_cav_off_on_da.setValue("cav_off_bpm_phase",self.cav_off_bpm_phase)
			mebt_cav_off_on_da.setValue("cav_off_bpm_phase_err",self.cav_off_bpm_phase_err)
			mebt_cav_off_on_da.setValue("cav_on_bpm_phase",self.cav_on_bpm_phase)
			mebt_cav_off_on_da.setValue("cav_on_bpm_phase_err",self.cav_on_bpm_phase_err)
			mebt_cav_off_on_da.setValue("cav_off_bpm_amp",self.cav_off_bpm_amp)
			mebt_cav_off_on_da.setValue("cav_off_bpm_amp_err",self.cav_off_bpm_amp_err)
			mebt_cav_off_on_da.setValue("cav_on_bpm_amp",self.cav_on_bpm_amp)
			mebt_cav_off_on_da.setValue("cav_on_bpm_amp_err",self.cav_on_bpm_amp_err)
		dumpGraphDataToDA(self.phase_gd,bpm_scan_data_da,"phase_scan_gd")
		dumpGraphDataToDA(self.amp_gd,bpm_scan_data_da,"amp_scan_gd")
		dumpGraphDataToDA(self.phase_fit_gd,bpm_scan_data_da,"phase_scan_fit_gd")
		
	def readDataFromXML(self,bpm_scan_data_da):
		self.cav_amp = bpm_scan_data_da.doubleValue("cav_amp")
		self.derivative = bpm_scan_data_da.doubleValue("derivative")
		self.zero_accel_phase = bpm_scan_data_da.doubleValue("zero_accel_phase")
		self.max_accel_phase = bpm_scan_data_da.doubleValue("max_accel_phase")
		mebt_cav_off_on_da = bpm_scan_data_da.childAdaptor("cav_off_on_data")
		if(mebt_cav_off_on_da != null):
			self.cav_off_bpm_phase	= mebt_cav_off_on_da.doubleValue("cav_off_bpm_phase")
			self.cav_off_bpm_phase_err	= mebt_cav_off_on_da.doubleValue("cav_off_bpm_phase_err")
			self.cav_on_bpm_phase	= mebt_cav_off_on_da.doubleValue("cav_on_bpm_phase")
			self.cav_on_bpm_phase_err	= mebt_cav_off_on_da.doubleValue("cav_on_bpm_phase_err")
			self.cav_off_bpm_amp	= mebt_cav_off_on_da.doubleValue("cav_off_bpm_amp")
			self.cav_off_bpm_amp_err	= mebt_cav_off_on_da.doubleValue("cav_off_bpm_amp_err")
			self.cav_on_bpm_amp	= mebt_cav_off_on_da.doubleValue("cav_on_bpm_amp")
			self.cav_on_bpm_amp_err	= mebt_cav_off_on_da.doubleValue("cav_on_bpm_amp_err")
		readGraphDataFromDA(self.phase_gd,bpm_scan_data_da,"phase_scan_gd")
		readGraphDataFromDA(self.amp_gd,bpm_scan_data_da,"amp_scan_gd")
		readGraphDataFromDA(self.phase_fit_gd,bpm_scan_data_da,"phase_scan_fit_gd")
class FaradayCup_Scan_Data:
    def __init__(self, dtl_acceptance_scans_controller,
                 dtl_acc_scan_cavity_controller):
        self.dtl_acceptance_scans_controller = dtl_acceptance_scans_controller
        self.main_loop_controller = self.dtl_acceptance_scans_controller.main_loop_controller
        self.dtl_acc_scan_cavity_controller = dtl_acc_scan_cavity_controller
        self.cav_wrapper = self.dtl_acc_scan_cavity_controller.cav_wrapper
        self.cav_amp = 0.
        self.cav_init_phase = 0.
        self.cav_phase_shift = 0.
        #-----------------------------------------------------
        self.fc_scan_gd = BasicGraphData()
        self.fc_scan_gd.setLineThick(3)
        self.fc_scan_gd.setGraphPointSize(7)
        self.fc_scan_gd.setGraphColor(Color.BLUE)
        self.fc_scan_gd.setGraphProperty(GRAPH_LEGEND_KEY,
                                         self.cav_wrapper.alias)
        self.fc_scan_gd.setDrawLinesOn(true)
        self.fc_scan_gd.setDrawPointsOn(true)

    def clean(self):
        self.fc_scan_gd.removeAllPoints()
        #------ for MEBT measurements for Iteration process only
        self.cav_amp = 0.
        self.cav_init_phase = 0.
        self.cav_phase_shift = 0.

    def addPoint(self):
        cav_phase = self.dtl_acc_scan_cavity_controller.getCavPhase()
        fc_charge = self.dtl_acc_scan_cavity_controller.getFC_Charge()
        self.addExternalPoint(cav_phase, fc_charge)

    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)

    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)

    def setCavAmplitudeParam(self, cav_amp):
        self.cav_amp = cav_amp
        self.fc_scan_gd.setGraphProperty(
            GRAPH_LEGEND_KEY,
            self.cav_wrapper.alias + " CavAmp= %6.4f " % self.cav_amp)

    def checkLastDataPoint(self, min_charge):
        res = true
        nP = self.fc_scan_gd.getNumbOfPoints()
        if (nP > 1):
            if (math.fabs(self.amp_gd.getY(nP - 1)) > min_charge):
                if (math.fabs(
                        self.fc_scan_gd.getY(nP - 2) -
                        self.fc_scan_gd.getY(nP - 1)) < 0.000000001):
                    return false
        return res

    def removeLastPoint(self):
        nP = self.fc_scan_gd.getNumbOfPoints()
        if (nP < 1): return
        self.fc_scan_gd.removePoint(nP - 1)

    def writeDataToXML(self, root_da):
        fc_scan_data_da = root_da.createChild("fc_scan_data")
        fc_scan_data_da.setValue("cav_amp", self.cav_amp)
        fc_scan_data_da.setValue("cav_phase", self.cav_init_phase)
        fc_scan_data_da.setValue("phase_shift", self.cav_phase_shift)
        dumpGraphDataToDA(self.fc_scan_gd, fc_scan_data_da,
                          "fc_acceptance_scan_gd")

    def readDataFromXML(self, fc_scan_data_da):
        self.cav_amp = fc_scan_data_da.doubleValue("cav_amp")
        self.cav_init_phase = fc_scan_data_da.doubleValue("cav_phase")
        self.cav_phase_shift = fc_scan_data_da.doubleValue("phase_shift")
        readGraphDataFromDA(self.fc_scan_gd, fc_scan_data_da,
                            "fc_acceptance_scan_gd")