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"))
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"))
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)