예제 #1
0
class Abstract_Cavity_Controller:
    def __init__(self, main_loop_controller, cav_wrapper):
        self.main_loop_controller = main_loop_controller
        self.cav_wrapper = cav_wrapper
        self.main_panel = JPanel(BorderLayout())
        self.parameters_panel = JPanel(BorderLayout())
        #---- backward cavity amplitude move params
        panel0 = JPanel(FlowLayout(FlowLayout.LEFT, 1, 3))
        cav_amp_backward_steps_mult_label = JLabel(
            "N cav. amp. backward steps multiplier =", JLabel.RIGHT)
        self.cav_amp_backward_steps_mult_text = DoubleInputTextField(
            1.0, ScientificNumberFormat(2), 5)
        panel0.add(cav_amp_backward_steps_mult_label)
        panel0.add(self.cav_amp_backward_steps_mult_text)
        #---- cavity's wait time multiplier
        panel1 = JPanel(FlowLayout(FlowLayout.LEFT, 1, 3))
        cav_amp_wait_time_mult_label = JLabel(
            "Cav. amp. time wait multiplier =", JLabel.RIGHT)
        self.cav_amp_wait_time_mult_text = DoubleInputTextField(
            3.0, ScientificNumberFormat(2), 5)
        panel1.add(cav_amp_wait_time_mult_label)
        panel1.add(self.cav_amp_wait_time_mult_text)
        #---- cavity's safe amplitude up and down limits
        panel2 = JPanel(FlowLayout(FlowLayout.LEFT, 1, 3))
        safe_relative_amp_up_label = JLabel("Cav. amp. safe Up [%]=",
                                            JLabel.RIGHT)
        self.safe_relative_amp_up_text = DoubleInputTextField(
            7.0, ScientificNumberFormat(2), 5)
        panel2.add(safe_relative_amp_up_label)
        panel2.add(self.safe_relative_amp_up_text)
        panel3 = JPanel(FlowLayout(FlowLayout.LEFT, 1, 3))
        safe_relative_amp_down_label = JLabel("Cav. amp. safe Down [%]=",
                                              JLabel.RIGHT)
        self.safe_relative_amp_down_text = DoubleInputTextField(
            7.0, ScientificNumberFormat(2), 5)
        panel3.add(safe_relative_amp_down_label)
        panel3.add(self.safe_relative_amp_down_text)
        #----- cavity's guess phase[deg] and amplitude[%] corrections after 360 deg full scan for inner BPMs
        panel4 = JPanel(FlowLayout(FlowLayout.LEFT, 1, 3))
        guess_phase_shift_label = JLabel(
            "Cav. Guess Phase Shift after Full Scan [deg]=", JLabel.RIGHT)
        self.guess_phase_shift_text = DoubleInputTextField(
            0.0, ScientificNumberFormat(2), 5)
        panel4.add(guess_phase_shift_label)
        panel4.add(self.guess_phase_shift_text)
        panel5 = JPanel(FlowLayout(FlowLayout.LEFT, 1, 3))
        guess_cav_amp_shift_label = JLabel(
            "Cav. Amp Shift after Full Scan [%]=", JLabel.RIGHT)
        self.guess_cav_amp_shift_text = DoubleInputTextField(
            0.0, ScientificNumberFormat(2), 5)
        panel5.add(guess_cav_amp_shift_label)
        panel5.add(self.guess_cav_amp_shift_text)
        #-----------------------------------------------
        params_panel = JPanel(GridLayout(6, 1, 1, 1))
        params_panel.add(panel0)
        params_panel.add(panel1)
        params_panel.add(panel2)
        params_panel.add(panel3)
        params_panel.add(panel4)
        params_panel.add(panel5)
        #------------------------------------------------
        self.parameters_panel.add(params_panel, BorderLayout.NORTH)
        #------------------------------------------------
        self.scan_progress_bar = Scan_Progress_Bar(self.main_loop_controller,
                                                   self)
        #------------------------------------------------
        cav_wrapper.safe_relative_amp_up_text = self.safe_relative_amp_up_text
        cav_wrapper.safe_relative_amp_down_text = self.safe_relative_amp_down_text

    def getMainPanel(self):
        return self.main_panel

    def getParamsPanel(self):
        return self.parameters_panel

    def getScanProgressBarPanel(self):
        return self.scan_progress_bar.scan_progress_panel

    def getScanProgressBar(self):
        return self.scan_progress_bar

    def runSetUpAlgorithm(self):
        """ Returns (true, text) in the case of the success """
        text = "Good. Cav=" + self.cav_wrapper.alias
        return (true, text)

    def init(self):
        """ reads the pv values """
        self.cav_wrapper.init()
        self.scan_progress_bar.init()

    def writeDataToXML(self, root_da):
        """ Abstract method. This method should be implemented in the subclass """
        cav_cntrl_data_da = root_da.createChild("CAVITY_CONTROLLER_" +
                                                self.cav_wrapper.alias)

    def readDataFromXML(self, cav_cntrl_data_da):
        """ Abstract method. This method should be implemented in the subclass """
        pass

    def checkBPM_Usage(self, bpm_wrapper):
        """ Abstract method. Returns True or False about this controller usage of the BPM """
        return false

    def timeSleep(self, time_sleep):
        n_parts = 5
        tm = time_sleep / n_parts
        for ind in range(n_parts):
            time.sleep(tm)
            self.scan_progress_bar.count_and_update(tm)
            if (self.main_loop_controller.loop_run_state.shouldStop):
                return

    def setMaxTimeCount(self):
        """ 
		Abstract method. It should be implemented in each subclass.
		It returns the maximal time count.
		"""
        print "Debug. Abstract_Cavity_Controller.setMaxTimeCount() This method should be implemented in a subclass."
        self.scan_progress_bar.setMaxTimeCount(100.)
        return self.scan_progress_bar.count_max

    def getPastaFittingTime(self):
        """ Abstract method. It should be implemented in each subclass. """
        return 0.

    def initProgressBar(self):
        self.scan_progress_bar.init()

    def wrtiteAbstractCntrlToXML(self, root_da):
        abstr_cntrl_data_da = root_da.createChild(
            "ABSTRACT_CAVITY_CONTROLLER_PARAMS")
        abstr_cntrl_data_da.setValue(
            "amp_steps_mult", self.cav_amp_backward_steps_mult_text.getValue())
        abstr_cntrl_data_da.setValue(
            "amp_time_mult", self.cav_amp_wait_time_mult_text.getValue())
        abstr_cntrl_data_da.setValue("amp_safe_up_percent",
                                     self.safe_relative_amp_up_text.getValue())
        abstr_cntrl_data_da.setValue(
            "amp_safe_down_percent",
            self.safe_relative_amp_down_text.getValue())
        abstr_cntrl_data_da.setValue("guess_phase_shift",
                                     self.guess_phase_shift_text.getValue())
        abstr_cntrl_data_da.setValue("guess_amp_shift_percent",
                                     self.guess_cav_amp_shift_text.getValue())

    def readAbstractCntrlFromXML(self, root_da):
        abstr_cntrl_data_da = root_da.childAdaptor(
            "ABSTRACT_CAVITY_CONTROLLER_PARAMS")
        self.cav_amp_backward_steps_mult_text.setValue(
            abstr_cntrl_data_da.doubleValue("amp_steps_mult"))
        self.cav_amp_wait_time_mult_text.setValue(
            abstr_cntrl_data_da.doubleValue("amp_time_mult"))
        if (abstr_cntrl_data_da.hasAttribute("amp_safe_up_percent")):
            self.safe_relative_amp_up_text.setValue(
                abstr_cntrl_data_da.doubleValue("amp_safe_up_percent"))
        if (abstr_cntrl_data_da.hasAttribute("amp_safe_down_percent")):
            self.safe_relative_amp_down_text.setValue(
                abstr_cntrl_data_da.doubleValue("amp_safe_down_percent"))
        if (abstr_cntrl_data_da.hasAttribute("guess_phase_shift")):
            self.guess_phase_shift_text.setValue(
                abstr_cntrl_data_da.doubleValue("guess_phase_shift"))
        if (abstr_cntrl_data_da.hasAttribute("guess_amp_shift_percent")):
            self.guess_cav_amp_shift_text.setValue(
                abstr_cntrl_data_da.doubleValue("guess_amp_shift_percent"))
예제 #2
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_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 Cavity_Scan_Controller_Main_Panel(JPanel):
	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.setLayout(BorderLayout())
		self.setBorder(BorderFactory.createEtchedBorder())
		etched_border = BorderFactory.createEtchedBorder()
		#----------------------------------------------------
		scan_params_panel_1 = JPanel(FlowLayout(FlowLayout.LEFT,3,1))
		scan_params_panel_1.setBorder(BorderFactory.createEtchedBorder())
		scan_params_panel_1.setBorder(BorderFactory.createTitledBorder(etched_border,"Cavity Amplitude Scan Parameters"))
		scan_params_panel_2 = JPanel(FlowLayout(FlowLayout.LEFT,3,1))
		scan_params_panel_2.setBorder(BorderFactory.createTitledBorder(etched_border,"Cavity Phase Scan Parameters"))
		scan_params_panel_3 = JPanel(FlowLayout(FlowLayout.LEFT,3,1))
		scan_params_panel_3.setBorder(BorderFactory.createTitledBorder(etched_border,"Cavity Live Parameters"))	
		self.scan_cav_amplitude_button = JRadioButton("Scan Ampl.")
		scan_params_panel_1.add(self.scan_cav_amplitude_button)
		#------------------------------------------------------------
		min_cav_amp_label = JLabel(" Min=",JLabel.RIGHT)
		max_cav_amp_label = JLabel(" Max=",JLabel.RIGHT)
		cav_amp_points_label = JLabel(" Points=",JLabel.RIGHT)
		time_amp_scan_label = JLabel(" Ampl. Change Time[sec]=",JLabel.RIGHT)
		self.min_cav_amp_text = DoubleInputTextField(0.,DecimalFormat("#.####"),5)
		self.max_cav_amp_text = DoubleInputTextField(0.,DecimalFormat("#.####"),5)
		self.cav_amp_points_text = DoubleInputTextField(3,DecimalFormat("##"),3)
		self.time_amp_scan_text = DoubleInputTextField(20.,DecimalFormat("###"),3)
		scan_params_panel_1.add(min_cav_amp_label)
		scan_params_panel_1.add(self.min_cav_amp_text)
		scan_params_panel_1.add(max_cav_amp_label)
		scan_params_panel_1.add(self.max_cav_amp_text)
		scan_params_panel_1.add(cav_amp_points_label)
		scan_params_panel_1.add(self.cav_amp_points_text)
		scan_params_panel_1.add(time_amp_scan_label)
		scan_params_panel_1.add(self.time_amp_scan_text)
		#----------------------------------------------
		phase_step_label = JLabel("Step[deg]=",JLabel.RIGHT)
		phase_min_label = JLabel(" Min[deg]=",JLabel.RIGHT)
		phase_max_label = JLabel(" Max[deg]=",JLabel.RIGHT)
		phase_scan_time_step_label = JLabel(" Time/Step[sec]=",JLabel.RIGHT)
		self.phase_step_text = DoubleInputTextField(3.,DecimalFormat("##.##"),5)
		self.phase_min_text = DoubleInputTextField(-180.,DecimalFormat("####.#"),6)
		self.phase_max_text = DoubleInputTextField(180.,DecimalFormat("####.#"),6)
		self.phase_scan_time_step_text = DoubleInputTextField(1.5,DecimalFormat("##.#"),4)
		scan_params_panel_2.add(phase_step_label)
		scan_params_panel_2.add(self.phase_step_text)
		scan_params_panel_2.add(phase_min_label)
		scan_params_panel_2.add(self.phase_min_text)
		scan_params_panel_2.add(phase_max_label)
		scan_params_panel_2.add(self.phase_max_text)
		scan_params_panel_2.add(phase_scan_time_step_label)
		scan_params_panel_2.add(self.phase_scan_time_step_text)
		#----------------------------------------------
		cav_ampl_live_label = JLabel("Cavity Ampl.=",JLabel.RIGHT)
		cav_phase_live_label = JLabel(" Phase[deg]=",JLabel.RIGHT)
		self.cav_ampl_live_text = DoubleInputTextField(0.,DecimalFormat("#.###"),5)
		self.cav_phase_live_text = DoubleInputTextField(0.,DecimalFormat("####.##"),7)
		scan_params_panel_3.add(cav_ampl_live_label)
		scan_params_panel_3.add(self.cav_ampl_live_text)
		scan_params_panel_3.add(cav_phase_live_label)
		scan_params_panel_3.add(self.cav_phase_live_text)
		#-----------------------------------------------
		cntrl_upper_panel = JPanel(GridLayout(3,1,1,1))	
		cntrl_upper_panel.add(scan_params_panel_1)
		cntrl_upper_panel.add(scan_params_panel_2)
		cntrl_upper_panel.add(scan_params_panel_3)
		#----------------------------------------------
		scan_res_panel = JPanel(BorderLayout())
		#----------------------------------------------
		left_scan_res_panel_0 = JPanel(BorderLayout())
		scan_progress_panel = self.dtl_acc_scan_cavity_controller.scan_progress_bar.scan_progress_panel
		left_scan_res_panel_0.add(scan_progress_panel,BorderLayout.CENTER)
		#---------------------------------------------
		left_scan_res_panel_1 = JPanel(FlowLayout(FlowLayout.LEFT,3,1))
		make_analysis_button = JButton("Make Analysis")
		make_analysis_button.addActionListener(Make_Analysis_Of_Scan_Button_Listener(self.dtl_acceptance_scans_controller,self.dtl_acc_scan_cavity_controller))
		set_new_phase_button = JButton("Set New Phase to EPICS")
		set_new_phase_button.addActionListener(Set_New_Phase_Button_Listener(self.dtl_acceptance_scans_controller,self.dtl_acc_scan_cavity_controller))	
		left_scan_res_panel_1.add(make_analysis_button)
		left_scan_res_panel_1.add(set_new_phase_button)
		#----------------------------------------------
		left_scan_res_panel_2 = JPanel(FlowLayout(FlowLayout.LEFT,3,1))	
		new_cav_phase_label = JLabel("New Phase[deg]=",JLabel.RIGHT)
		self.new_cav_phase_text = DoubleInputTextField(0.,DecimalFormat("####.##"),7)
		left_scan_res_panel_2.add(new_cav_phase_label)
		left_scan_res_panel_2.add(self.new_cav_phase_text)
		#----------------------------------------------
		left_scan_res_panel_3 = JPanel(FlowLayout(FlowLayout.LEFT,3,1))
		shift_scan_button = JButton("Shift Scan by +10 deg")
		shift_scan_button.addActionListener(Shift_Scan_Button_Listener(self.dtl_acceptance_scans_controller,self.dtl_acc_scan_cavity_controller))
		make_pattern_button = JButton("Make a Pattern")
		make_pattern_button.addActionListener(Make_Pattern_Button_Listener(self.dtl_acceptance_scans_controller,self.dtl_acc_scan_cavity_controller))	
		left_scan_res_panel_3.add(shift_scan_button)
		left_scan_res_panel_3.add(make_pattern_button)
		#----------------------------------------------
		left_scan_res_panel_4 = JPanel(FlowLayout(FlowLayout.LEFT,3,1))	
		acc_scan_width_label = JLabel("Acc. Scan Width[deg]=",JLabel.RIGHT)
		self.acc_scan_width_text = DoubleInputTextField(0.,DecimalFormat("####.##"),7)
		left_scan_res_panel_4.add(acc_scan_width_label)
		left_scan_res_panel_4.add(self.acc_scan_width_text)
		#----------------------------------------------
		left_scan_res_panel_5 = JPanel(FlowLayout(FlowLayout.LEFT,3,1))	
		new_cav_amp_label = JLabel("New Cav. Amplitude  =",JLabel.RIGHT)
		self.new_cav_amp_text = DoubleInputTextField(0.,DecimalFormat("#.####"),7)
		left_scan_res_panel_5.add(new_cav_amp_label)
		left_scan_res_panel_5.add(self.new_cav_amp_text)	
		#----------------------------------------------
		scan_res_grid_panel = JPanel(GridLayout(6,1,1,1))
		scan_res_grid_panel.add(left_scan_res_panel_0)
		scan_res_grid_panel.add(left_scan_res_panel_1)
		scan_res_grid_panel.add(left_scan_res_panel_2)
		scan_res_grid_panel.add(left_scan_res_panel_3)
		scan_res_grid_panel.add(left_scan_res_panel_4)
		scan_res_grid_panel.add(left_scan_res_panel_5)
		scan_res_panel.add(scan_res_grid_panel,BorderLayout.NORTH)
		#----------------------------------------------
		self.scan_data_graph = Acceptance_Graphs_Panel_Holder(self.dtl_acceptance_scans_controller)
		self.add(cntrl_upper_panel,BorderLayout.NORTH)	
		self.add(self.scan_data_graph.getGraphsPanel(),BorderLayout.CENTER)
		self.add(scan_res_panel,BorderLayout.WEST)
		
	def getTimeScanEstimation(self):
		nAmpPoints = 1.
		time_amp_change = 0.
		if(self.scan_cav_amplitude_button.isSelected()):
			nAmpPoints = self.cav_amp_points_text.getValue()
			time_amp_change = nAmpPoints*self.time_amp_scan_text.getValue()
		nPhasePoints = (self.phase_max_text.getValue() - self.phase_min_text.getValue())/self.phase_step_text.getValue()
		time_scan = nAmpPoints*nPhasePoints*self.phase_scan_time_step_text.getValue() + time_amp_change
		return time_scan
class Abstract_Cavity_Controller:
	def __init__(self,main_loop_controller,cav_wrapper):
		self.main_loop_controller = main_loop_controller
		self.cav_wrapper = cav_wrapper
		self.main_panel = JPanel(BorderLayout())
		self.parameters_panel = JPanel(BorderLayout())
		#---- backward cavity amplitude move params
		panel0 = JPanel(FlowLayout(FlowLayout.LEFT,1,3))
		cav_amp_backward_steps_mult_label = JLabel("N cav. amp. backward steps multiplier =",JLabel.RIGHT)
		self.cav_amp_backward_steps_mult_text =  DoubleInputTextField(1.0,ScientificNumberFormat(2),5)
		panel0.add(cav_amp_backward_steps_mult_label)
		panel0.add(self.cav_amp_backward_steps_mult_text)
		#---- cavity's wait time multiplier
		panel1 = JPanel(FlowLayout(FlowLayout.LEFT,1,3))
		cav_amp_wait_time_mult_label = JLabel("Cav. amp. time wait multiplier =",JLabel.RIGHT)
		self.cav_amp_wait_time_mult_text =  DoubleInputTextField(3.0,ScientificNumberFormat(2),5)
		panel1.add(cav_amp_wait_time_mult_label)
		panel1.add(self.cav_amp_wait_time_mult_text)
		#---- cavity's safe amplitude up and down limits		
		panel2 = JPanel(FlowLayout(FlowLayout.LEFT,1,3))
		safe_relative_amp_up_label = JLabel("Cav. amp. safe Up [%]=",JLabel.RIGHT)
		self.safe_relative_amp_up_text = DoubleInputTextField(7.0,ScientificNumberFormat(2),5)
		panel2.add(safe_relative_amp_up_label)
		panel2.add(self.safe_relative_amp_up_text)
		panel3 = JPanel(FlowLayout(FlowLayout.LEFT,1,3))
		safe_relative_amp_down_label = JLabel("Cav. amp. safe Down [%]=",JLabel.RIGHT)
		self.safe_relative_amp_down_text = DoubleInputTextField(7.0,ScientificNumberFormat(2),5)
		panel3.add(safe_relative_amp_down_label)
		panel3.add(self.safe_relative_amp_down_text)
		#----- cavity's guess phase[deg] and amplitude[%] corrections after 360 deg full scan for inner BPMs
		panel4 = JPanel(FlowLayout(FlowLayout.LEFT,1,3))
		guess_phase_shift_label = JLabel("Cav. Guess Phase Shift after Full Scan [deg]=",JLabel.RIGHT)
		self.guess_phase_shift_text =  DoubleInputTextField(0.0,ScientificNumberFormat(2),5)
		panel4.add(guess_phase_shift_label)
		panel4.add(self.guess_phase_shift_text)
		panel5 = JPanel(FlowLayout(FlowLayout.LEFT,1,3))
		guess_cav_amp_shift_label = JLabel("Cav. Amp Shift after Full Scan [%]=",JLabel.RIGHT)
		self.guess_cav_amp_shift_text =  DoubleInputTextField(0.0,ScientificNumberFormat(2),5)
		panel5.add(guess_cav_amp_shift_label)
		panel5.add(self.guess_cav_amp_shift_text)		
		#-----------------------------------------------
		params_panel = JPanel(GridLayout(6,1,1,1))
		params_panel.add(panel0)
		params_panel.add(panel1)
		params_panel.add(panel2)
		params_panel.add(panel3)
		params_panel.add(panel4)
		params_panel.add(panel5)
		#------------------------------------------------
		self.parameters_panel.add(params_panel,BorderLayout.NORTH)
		#------------------------------------------------
		self.scan_progress_bar = Scan_Progress_Bar(self.main_loop_controller,self)
		#------------------------------------------------
		cav_wrapper.safe_relative_amp_up_text = self.safe_relative_amp_up_text
		cav_wrapper.safe_relative_amp_down_text = self.safe_relative_amp_down_text

	def getMainPanel(self):
		return self.main_panel	
		
	def getParamsPanel(self):
		return self.parameters_panel		
		
	def getScanProgressBarPanel(self):
		return self.scan_progress_bar.scan_progress_panel
		
	def getScanProgressBar(self):
		return self.scan_progress_bar
	
	def runSetUpAlgorithm(self):
		""" Returns (true, text) in the case of the success """
		text = "Good. Cav="+self.cav_wrapper.alias
		return (true,text)
		
	def init(self):
		""" reads the pv values """ 
		self.cav_wrapper.init()
		self.scan_progress_bar.init()
		
	def writeDataToXML(self,root_da):
		""" Abstract method. This method should be implemented in the subclass """
		cav_cntrl_data_da = root_da.createChild("CAVITY_CONTROLLER_"+self.cav_wrapper.alias)
		
	def readDataFromXML(self,cav_cntrl_data_da):
		""" Abstract method. This method should be implemented in the subclass """
		pass
	
	def checkBPM_Usage(self,bpm_wrapper):
		""" Abstract method. Returns True or False about this controller usage of the BPM """
		return false
	
	def timeSleep(self, time_sleep):
		n_parts = 5
		tm = time_sleep/n_parts
		for ind in range(n_parts):
			time.sleep(tm)
			self.scan_progress_bar.count_and_update(tm)
			if(self.main_loop_controller.loop_run_state.shouldStop):
				return
			
	def setMaxTimeCount(self):
		""" 
		Abstract method. It should be implemented in each subclass.
		It returns the maximal time count.
		"""
		print "Debug. Abstract_Cavity_Controller.setMaxTimeCount() This method should be implemented in a subclass."
		self.scan_progress_bar.setMaxTimeCount(100.)
		return self.scan_progress_bar.count_max
		
	def getPastaFittingTime(self):
		""" Abstract method. It should be implemented in each subclass. """
		return 0.
		
	def initProgressBar(self):
		self.scan_progress_bar.init()
			
	def wrtiteAbstractCntrlToXML(self,root_da):
		abstr_cntrl_data_da = root_da.createChild("ABSTRACT_CAVITY_CONTROLLER_PARAMS")	
		abstr_cntrl_data_da.setValue("amp_steps_mult",self.cav_amp_backward_steps_mult_text.getValue())
		abstr_cntrl_data_da.setValue("amp_time_mult",self.cav_amp_wait_time_mult_text.getValue())
		abstr_cntrl_data_da.setValue("amp_safe_up_percent",self.safe_relative_amp_up_text.getValue())
		abstr_cntrl_data_da.setValue("amp_safe_down_percent",self.safe_relative_amp_down_text.getValue())
		abstr_cntrl_data_da.setValue("guess_phase_shift",self.guess_phase_shift_text.getValue())
		abstr_cntrl_data_da.setValue("guess_amp_shift_percent",self.guess_cav_amp_shift_text.getValue())
		
	def readAbstractCntrlFromXML(self,root_da):
		abstr_cntrl_data_da = root_da.childAdaptor("ABSTRACT_CAVITY_CONTROLLER_PARAMS")
		self.cav_amp_backward_steps_mult_text.setValue(abstr_cntrl_data_da.doubleValue("amp_steps_mult"))
		self.cav_amp_wait_time_mult_text.setValue(abstr_cntrl_data_da.doubleValue("amp_time_mult"))
		if(abstr_cntrl_data_da.hasAttribute("amp_safe_up_percent")):
			self.safe_relative_amp_up_text.setValue(abstr_cntrl_data_da.doubleValue("amp_safe_up_percent"))
		if(abstr_cntrl_data_da.hasAttribute("amp_safe_down_percent")):
			self.safe_relative_amp_down_text.setValue(abstr_cntrl_data_da.doubleValue("amp_safe_down_percent"))
		if(abstr_cntrl_data_da.hasAttribute("guess_phase_shift")):
			self.guess_phase_shift_text.setValue(abstr_cntrl_data_da.doubleValue("guess_phase_shift"))
		if(abstr_cntrl_data_da.hasAttribute("guess_amp_shift_percent")):
			self.guess_cav_amp_shift_text.setValue(abstr_cntrl_data_da.doubleValue("guess_amp_shift_percent"))
예제 #6
0
class SCL_Scan_Data_CleanUp_Controller:
    def __init__(self, scl_long_tuneup_controller):
        #--- scl_long_tuneup_controller the parent document for all SCL tune up controllers
        self.scl_long_tuneup_controller = scl_long_tuneup_controller
        #----etched border
        etched_border = BorderFactory.createEtchedBorder()
        #----main panel
        self.main_panel = JPanel(BorderLayout())
        #------top params panel-----------------------
        right_info_panel = JPanel(BorderLayout())
        right_top_control_panel = JPanel(FlowLayout(FlowLayout.LEFT, 1, 1))
        analysis_button = JButton("Find BAD Points")
        analysis_button.addActionListener(Analyze_Data_Button_Listener(self))
        right_top_control_panel.add(analysis_button)
        #------ maximal bpm phase error after the scan
        max_phase_err_lbl = JLabel("Max BPM Phase Err = ", JLabel.RIGHT)
        self.max_phase_err_text = DoubleInputTextField(10.0,
                                                       DecimalFormat("##.#"),
                                                       5)
        right_top_control_panel.add(max_phase_err_lbl)
        right_top_control_panel.add(self.max_phase_err_text)
        #-----------------------------------------------
        right_bottom_control_panel = JPanel(BorderLayout())
        right_bottom_control_panel0 = JPanel(BorderLayout())
        right_bottom_control_panel1 = JPanel(FlowLayout(FlowLayout.LEFT, 1, 1))
        right_bottom_control_panel.add(right_bottom_control_panel0,
                                       BorderLayout.NORTH)
        right_bottom_control_panel.add(right_bottom_control_panel1,
                                       BorderLayout.SOUTH)
        statistics_of_errors_lbl = JLabel("Statistics:", JLabel.RIGHT)
        self.statistics_of_errors_txt = JTextField()
        right_bottom_control_panel0.add(statistics_of_errors_lbl,
                                        BorderLayout.WEST)
        right_bottom_control_panel0.add(self.statistics_of_errors_txt,
                                        BorderLayout.CENTER)
        remove_worst_points_button = JButton("Remove Worst Points")
        remove_worst_points_button.addActionListener(
            CleanUp_Worst_Phase_Points_Data_Button_Listener(self))
        remove_all_bad_bpms_button = JButton("Remove All Bad BPMs")
        remove_all_bad_bpms_button.addActionListener(
            CleanUp_All_Bad_BPMs_Button_Listener(self))
        right_bottom_control_panel1.add(remove_worst_points_button)
        right_bottom_control_panel1.add(remove_all_bad_bpms_button)
        #-----------------------------------------------
        right_tables_panel = JPanel(GridLayout(1, 3))
        right_info_panel.add(right_top_control_panel, BorderLayout.NORTH)
        right_info_panel.add(right_tables_panel, BorderLayout.CENTER)
        right_info_panel.add(right_bottom_control_panel, BorderLayout.SOUTH)
        self.main_panel.add(right_info_panel, BorderLayout.EAST)
        #------cavities scan table panel --------
        self.bad_bpms_amp_phase_graphs_panel = Bad_BPMs_Amp_Phase_Graphs_Panel(
            self)
        self.main_panel.add(self.bad_bpms_amp_phase_graphs_panel,
                            BorderLayout.CENTER)
        #------ let's make tables for a list of cavities, bpms, and bad points indexes
        self.cavs_with_bad_data_table_model = Cavs_with_Bad_PhaseScan_Table_Model(
            self)
        self.cavs_table = JTable(self.cavs_with_bad_data_table_model)
        self.cavs_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
        self.cavs_table.setFillsViewportHeight(true)
        self.cavs_table.setPreferredScrollableViewportSize(Dimension(180, 300))
        self.cavs_table.getSelectionModel().addListSelectionListener(
            Cavs_Table_Selection_Listener(self))
        self.bpms_table_model = Bad_PhaseScan_BPMs_Table_Model(self)
        self.bpms_table = JTable(self.bpms_table_model)
        self.bpms_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
        self.bpms_table.setFillsViewportHeight(true)
        self.bpms_table.getSelectionModel().addListSelectionListener(
            BPMs_Table_Selection_Listener(self))
        self.bpms_table.setPreferredScrollableViewportSize(Dimension(180, 300))
        self.points_table_model = Bad_Points_Table_Model(self)
        self.points_table = JTable(self.points_table_model)
        self.points_table.setFillsViewportHeight(true)
        self.points_table.setPreferredScrollableViewportSize(
            Dimension(180, 300))
        #----- set scroll panes
        scrl_panel0 = JScrollPane(self.cavs_table)
        scrl_panel1 = JScrollPane(self.bpms_table)
        scrl_panel2 = JScrollPane(self.points_table)
        scrl_panel0.setBorder(
            BorderFactory.createTitledBorder(etched_border, "Cavs"))
        scrl_panel1.setBorder(
            BorderFactory.createTitledBorder(etched_border, "BPMs"))
        scrl_panel2.setBorder(
            BorderFactory.createTitledBorder(etched_border, "Bad Points"))
        right_tables_panel.setBorder(etched_border)
        right_tables_panel.add(scrl_panel0)
        right_tables_panel.add(scrl_panel1)
        right_tables_panel.add(scrl_panel2)
        #----- dictionary with the bad data self.cavs_to_bpm_dict[cav_wrapper] = [bpm_wrappers,bpms_to_points_dict]
        self.cavs_to_bpm_dict = {}
        #----- arrays with bad data for the tables
        self.cavs_with_bad_data_arr = []
        self.bpms_arr = []
        self.points_arr = []

    def cleanUp_All_Bad_BPMs_Method(self):
        scl_long_tuneup_controller = self.scl_long_tuneup_controller
        cav_wrappers = scl_long_tuneup_controller.cav_wrappers[1:]
        #----- dictionary with the bad data
        cavs_to_bpm_dict = self.cavs_to_bpm_dict
        #----- let's go through all cavities to find the bad bpms
        for cav_wrapper in cav_wrappers:
            if (cav_wrapper.isGood and cav_wrapper.isMeasured):
                if (cavs_to_bpm_dict.has_key(cav_wrapper)):
                    [bpm_wrappers,
                     bpms_to_points_dict] = cavs_to_bpm_dict[cav_wrapper]
                    for bpm_wrapper_bad in bpm_wrappers:
                        for bpm_ind in range(len(cav_wrapper.bpm_wrappers)):
                            bpm_wrapper = cav_wrapper.bpm_wrappers[bpm_ind]
                            if (bpm_wrapper_bad == bpm_wrapper):
                                cav_wrapper.bpm_wrappers_useInAmpBPMs[
                                    bpm_ind] = false
                                cav_wrapper.bpm_wrappers_useInPhaseAnalysis[
                                    bpm_ind] = false

    def cleanUp_Worst_Phase_Points_Data_Method(self):
        scl_long_tuneup_controller = self.scl_long_tuneup_controller
        cav_wrappers = scl_long_tuneup_controller.cav_wrappers[1:]
        #----- dictionary with the bad data
        cavs_to_bpm_dict = self.cavs_to_bpm_dict
        #----- let's go through all cavities to find the worst phase scan points
        #----- worst points means maximal number of bad bpms with it
        n_total_removed_points = 0
        for cav_wrapper in cav_wrappers:
            if (cav_wrapper.isGood and cav_wrapper.isMeasured):
                if (cavs_to_bpm_dict.has_key(cav_wrapper)):
                    [bpm_wrappers,
                     bpms_to_points_dict] = cavs_to_bpm_dict[cav_wrapper]
                    #----- numb_of_points_dict[point_scan_ind] = [bpm1,...]
                    numb_of_points_dict = {}
                    for bpm_wrapper in bpm_wrappers:
                        bad_points_arr = bpms_to_points_dict[bpm_wrapper]
                        for [ind, x, y] in bad_points_arr:
                            if (numb_of_points_dict.has_key(ind)):
                                numb_of_points_dict[ind].append(bpm_wrapper)
                            else:
                                numb_of_points_dict[ind] = [
                                    bpm_wrapper,
                                ]
                    max_bpms_ind = -1
                    max_numb_of_bpms = 0
                    for ind in numb_of_points_dict.keys():
                        n_bpms = len(numb_of_points_dict[ind])
                        if (n_bpms > max_numb_of_bpms):
                            max_bpms_ind = ind
                    if (max_bpms_ind >= 0):
                        #---- the phase scan data with this index should be removed
                        n_bpms = len(numb_of_points_dict[max_bpms_ind])
                        if (n_bpms > 1):
                            n_total_removed_points += n_bpms
                            gd = cav_wrapper.phaseDiffPlot
                            gd.removePoint(max_bpms_ind)
                            for bpm_wrapper in cav_wrapper.bpm_wrappers:
                                (graphDataAmp, graphDataPhase
                                 ) = cav_wrapper.getAmpPhaseGraphs(bpm_wrapper)
                                if (graphDataAmp != null):
                                    graphDataAmp.removePoint(max_bpms_ind)
                                if (graphDataPhase != null):
                                    graphDataPhase.removePoint(max_bpms_ind)
                            #print "debug cav=",cav_wrapper.alias," n bpms=",n_bpms
        #print "debug 	n_total_removed_points=",n_total_removed_points

    def analyze_Data_Method(self):
        scl_long_tuneup_controller = self.scl_long_tuneup_controller
        max_phase_diff0 = self.max_phase_err_text.getValue()
        cav_wrappers = scl_long_tuneup_controller.cav_wrappers[1:]
        #----- dictionary with the bad data
        self.cavs_to_bpm_dict = {}
        cavs_to_bpm_dict = self.cavs_to_bpm_dict
        #----- arrays with bad data for the tables
        self.cavs_with_bad_data_arr = []
        self.bpms_arr = []
        self.points_arr = []
        #---- data analysis for bad points
        total_nPoints = 0
        for cav_wrapper in cav_wrappers:
            if (cav_wrapper.isGood and cav_wrapper.isMeasured):
                bpm_wrapper0 = cav_wrapper.bpm_wrapper0
                bpm_wrapper1 = cav_wrapper.bpm_wrapper1
                pos0 = bpm_wrapper0.pos
                pos1 = bpm_wrapper1.pos
                phaseDiffPlot = cav_wrapper.phaseDiffPlot
                (graphDataAmp0, graphDataPhase0
                 ) = cav_wrapper.bpm_amp_phase_dict[bpm_wrapper0]
                if (phaseDiffPlot.getNumbOfPoints() == 0): continue
                for bpm_wrapper_ind in range(len(cav_wrapper.bpm_wrappers)):
                    bpm_wrapper = cav_wrapper.bpm_wrappers[bpm_wrapper_ind]
                    pos = bpm_wrapper.pos
                    if (pos < pos0): continue
                    pos_coeff = (pos - pos0) / (pos1 - pos0)
                    max_phase_diff = max_phase_diff0
                    if (pos_coeff >= 1.0):
                        max_phase_diff = pos_coeff * max_phase_diff0
                    if (cav_wrapper.
                            bpm_wrappers_useInPhaseAnalysis[bpm_wrapper_ind]):
                        (graphDataAmp, graphDataPhase
                         ) = cav_wrapper.bpm_amp_phase_dict[bpm_wrapper]
                        nPoints = phaseDiffPlot.getNumbOfPoints()
                        bpm_phase_delta = graphDataPhase.getY(
                            nPoints - 1) - graphDataPhase0.getY(
                                nPoints - 1
                            ) - pos_coeff * phaseDiffPlot.getY(nPoints - 1)
                        bad_points_arr = []
                        for ind in range(phaseDiffPlot.getNumbOfPoints()):
                            total_nPoints += 1
                            y = graphDataPhase.getY(
                                ind) - graphDataPhase0.getY(
                                    ind) - pos_coeff * phaseDiffPlot.getY(
                                        ind) - bpm_phase_delta
                            y = makePhaseNear(y, 0.)
                            if (abs(y) > max_phase_diff):
                                bad_points_arr.append(
                                    [ind, graphDataPhase.getX(ind), y])
                        if (len(bad_points_arr) > 0):
                            if (not cavs_to_bpm_dict.has_key(cav_wrapper)):
                                cavs_to_bpm_dict[cav_wrapper] = [[], {}]
                            [bpm_wrappers, bpms_to_points_dict
                             ] = cavs_to_bpm_dict[cav_wrapper]
                            bpm_wrappers.append(bpm_wrapper)
                            bpms_to_points_dict[bpm_wrapper] = bad_points_arr
        for cav_wrapper in cav_wrappers:
            if (cavs_to_bpm_dict.has_key(cav_wrapper)):
                self.cavs_with_bad_data_arr.append(cav_wrapper)
        #--------------------------------------------------------------------
        nCavs = 0
        nBPMs = 0
        nPoints = 0
        for cav_wrapper in self.cavs_with_bad_data_arr:
            [bpm_wrappers, bpms_to_points_dict] = cavs_to_bpm_dict[cav_wrapper]
            nCavs += 1
            nBPMs += len(bpm_wrappers)
            for bpm_wrapper in bpm_wrappers:
                points_arr = bpms_to_points_dict[bpm_wrapper]
                nPoints += len(points_arr)
        st = "N Bad:  Cavs= " + str(nCavs) + "  BPMs= " + str(
            nBPMs) + "  Phase Points=" + str(nPoints) + "/" + str(
                total_nPoints)
        self.statistics_of_errors_txt.setText(st)
        self.cavs_table.getModel().fireTableDataChanged()
        self.bpms_table.getModel().fireTableDataChanged()
        self.points_table.getModel().fireTableDataChanged()
        nCavs = len(self.cavs_with_bad_data_arr)