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 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 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 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 calculateEkin(self,bpm_scan_data0,bpm_scan_data1): if(self.active_cav_wrapper == null): (false,0.) cav_wrapper = self.active_cav_wrapper (phase0,err0) = bpm_scan_data0.getAvgPhaseAndErr() (phase1,err1) = bpm_scan_data1.getAvgPhaseAndErr() pos0 = bpm_scan_data0.bpm_wrapper.pos pos1 = bpm_scan_data1.bpm_wrapper.pos eKinIn_guess = cav_wrapper.Ekin_in_design bpm_freq0 = bpm_scan_data0.bpm_wrapper.bpm.getBPMBucket().getFrequency()*1.0e+6 bpm_freq1 = bpm_scan_data1.bpm_wrapper.bpm.getBPMBucket().getFrequency()*1.0e+6 mass = self.scenario.getProbe().getSpeciesRestEnergy()/1.0e+6 c = 2.997924e+8 beta = math.sqrt((eKinIn_guess+2*mass)*eKinIn_guess)/(eKinIn_guess+mass) if(math.fabs(bpm_freq0 - bpm_freq1) > 1.0e+6): txt = "Cav. off analysis: BPMs have different frequences!" txt += " BPM0=" + bpm_scan_data0.bpm_wrapper.alias txt += " BPM1=" + bpm_scan_data1.bpm_wrapper.alias self.main_loop_controller.getMessageTextField().setText(txt) return (false,0.) bpm_freq = bpm_freq0 delta_phase_guess = 360.0*(pos1 - pos0)*bpm_freq/(beta*c) delta_phase = makePhaseNear(phase1 - phase0,delta_phase_guess) beta_res = 360.0*(pos1 - pos0)*bpm_freq/(c*delta_phase) if(beta_res <= 0. or beta_res >= 1.): txt = "Cav. off analysis: data does not make sense!" txt += " BPM0=" + bpm_scan_data0.bpm_wrapper.alias txt += " BPM1=" + bpm_scan_data1.bpm_wrapper.alias self.main_loop_controller.getMessageTextField().setText(txt) return (false,0.) gamma = 1.0/math.sqrt(1.0-beta_res**2) eKinIn = mass*(gamma - 1.) return (true,eKinIn)
def getBPM_Phases(self,eKin_in,phase,phase_shift,bpm_wrappers): self.setModelPhase(phase,phase_shift) self.trackProbe(eKin_in) bpm_phases_arr = [] if(self.active_cav_wrapper == null): return bpm_phases_arr first_gap = self.gap_list.get(0) last_gap = self.gap_list.get(self.gap_list.size()-1) pos_max = self.accSeq.getPosition(last_gap) pos_min = self.accSeq.getPosition(first_gap) traj = self.scenario.getTrajectory() ind = traj.indicesForElement(last_gap.getId())[0] last_gap_tm = traj.stateWithIndex(ind).getTime() for bpm_wrapper in bpm_wrappers: phase = 0. if(bpm_wrapper.pos > pos_min): tm = 0. if(bpm_wrapper.pos < pos_max): ind = traj.indicesForElement(bpm_wrapper.bpm.getId())[0] state0 = traj.stateWithIndex(ind-1) state1 = traj.stateWithIndex(ind+1) tm0 = state0.getTime() tm1 = state1.getTime() pos0 = state0.getPosition() pos1 = state1.getPosition() pos = bpm_wrapper.pos - pos_min tm = tm0 + (tm1-tm0)*(pos-pos0)/(pos1-pos0) else: c = 2.997924e+8 beta = traj.finalState().getBeta() tm = (bpm_wrapper.pos - pos_max)/(c*beta) tm += last_gap_tm phase = bpm_wrapper.bpm.getBPMBucket().getFrequency()*1.0e+6*360.*tm bpm_phases_arr.append(makePhaseNear(phase,0.)) return bpm_phases_arr
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 getCavOffBPM_Phases(self,eKin_in,bpm_wrappers): bpm_phases_arr = [] if(self.active_cav_wrapper == null): return bpm_phases_arr first_gap = self.gap_list.get(0) pos_min = self.accSeq.getPosition(first_gap) mass = self.scenario.getProbe().getSpeciesRestEnergy()/1.0e+6 c = 2.997924e+8 beta = math.sqrt((eKin_in+2*mass)*eKin_in)/(eKin_in+mass) for bpm_wrapper in bpm_wrappers: phase = 0. if(bpm_wrapper.pos > pos_min): tm = (bpm_wrapper.pos - pos_min)/(c*beta) phase = bpm_wrapper.bpm.getBPMBucket().getFrequency()*1.0e+6*360.*tm bpm_phases_arr.append(makePhaseNear(phase,0.)) return bpm_phases_arr
def actionPerformed(self,actionEvent): messageTextField = self.main_loop_controller.getMessageTextField() messageTextField.setText("") res = self.main_loop_controller.connectAllPVs() if(not res): return cav_selected_inds = self.main_loop_controller.cav_table.getSelectedRows() if(len(cav_selected_inds) < 1 or cav_selected_inds[0] < 0): messageTextField.setText("Select one or more cavities to correct Phase Shifts for 360 deg Scans!") return for cav_ind in cav_selected_inds: cav_wrapper = self.main_loop_controller.cav_wrappers[cav_ind] cav_controller = self.main_loop_controller.cav_controllers[cav_ind] phase_shift = cav_controller.guess_phase_shift_text.getValue() initPhase = cav_wrapper.initPhase newPhase = cav_wrapper.newPhase delta_phase_shift = initPhase - newPhase phase_shift += delta_phase_shift phase_shift = makePhaseNear(phase_shift,0.) cav_controller.guess_phase_shift_text.setValue(phase_shift)
def actionPerformed(self,actionEvent): messageTextField = self.main_loop_controller.getMessageTextField() messageTextField.setText("") cav_selected_inds = self.main_loop_controller.cav_table.getSelectedRows() if(len(cav_selected_inds) < 1 or cav_selected_inds[0] < 0): messageTextField.setText("Select one or more cavities to correct Phase Shifts for 360 deg Scans!") return for cav_ind in cav_selected_inds: cav_wrapper = self.main_loop_controller.cav_wrappers[cav_ind] cav_controller = self.main_loop_controller.cav_controllers[cav_ind] initPhase = cav_wrapper.initPhase cav_wrapper.newPhase = cav_wrapper.initPhase guess_phase = cav_wrapper.cav_phase_unshifted_guess phase_shift = initPhase - guess_phase phase_shift = makePhaseNear(phase_shift,0.) cav_controller.guess_phase_shift_text.setValue(phase_shift) cav_amp_coeff = cav_wrapper.design_amp/cav_wrapper.initAmp guess_cav_amp_shift = 100.*(1.0 - cav_amp_coeff/cav_wrapper.cav_amp_coeff_unshifted_guess) cav_controller.guess_cav_amp_shift_text.setValue(guess_cav_amp_shift) self.main_loop_controller.cav_table.getModel().fireTableDataChanged() self.main_loop_controller.cav_table.setRowSelectionInterval(cav_selected_inds[0],cav_selected_inds[len(cav_selected_inds)-1])
def setLivePhase(self,phase): self.phase_pv.putVal(makePhaseNear(phase,0.)) # ?????? pass
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)