def getAvgGapPhase(self):
		#------------- calculate avg. RF gap phase -----------
		if(self.active_cav_wrapper == null): return 0.
		rf_gap_arr = self.cavToGapsDict[self.active_cav_wrapper]
		phase_rf_gaps_avg = 0.
		for irfGap in rf_gap_arr:
			phase_rf_gaps_avg += makePhaseNear(irfGap.getPhase(),0.)
		phase_rf_gaps_avg /= len(rf_gap_arr)
		phase_rf_gaps_avg = makePhaseNear((phase_rf_gaps_avg*180./math.pi)%360.,0.)
		return phase_rf_gaps_avg
	def getAvgGapPhase(self,cav_wrapper):
		#------------- calculate avg. RF gap phase -----------
		if(cav_wrapper == null or not(self.cavToGapsDict.has_key(cav_wrapper))): return 0.
		rf_gap_arr = self.cavToGapsDict[cav_wrapper]
		phase_rf_gaps_avg = 0.
		for irfGap in rf_gap_arr:
			phase_rf_gaps_avg += makePhaseNear(irfGap.getPhase(),0.)
			#print "debug gap=",irfGap.getId()," phase=",irfGap.getPhase()*180./math.pi
		phase_rf_gaps_avg /= len(rf_gap_arr)
		phase_rf_gaps_avg = makePhaseNear((phase_rf_gaps_avg*180./math.pi)%360.,0.)
		return phase_rf_gaps_avg
	def calculateNewLivePhases(self):
		self.calcForNewAmpsAndPhases()
		cav_wrappers = self.scl_long_tuneup_controller.cav_wrappers
		for cav_wrapper in cav_wrappers:
			arr_time_old = cav_wrapper.rescaleBacket.arrivalTime
			irfGap = self.cavToGapsDict[cav_wrapper][0]
			cav_wrapper.rescaleBacket.designPhase = irfGap.getPhase()*180./math.pi
			state = self.scenario.getTrajectory().stateForElement(irfGap.getId())
			arr_time_new = state.getTime()
			freq = 1.0e+6*cav_wrapper.cav.getCavFreq()
			# this sign "-" is correct. It was checked experimentally. 
			delta_phase = - makePhaseNear(360.*freq*(arr_time_new - arr_time_old),0.)
			delta_phase_model = cav_wrapper.rescaleBacket.designPhase - cav_wrapper.designPhase
			cav_wrapper.rescaleBacket.livePhase = makePhaseNear(delta_phase + delta_phase_model + cav_wrapper.livePhase,0.)
	def getTrialParams(self,trial):
		#------set up harmonics function parameters from Trial map
		var_map = trial.getTrialPoint().getValueMap()
		self.param_arr[0] = math.fabs(trial.getTrialPoint().getValue(self.variables.get(0)))
		self.param_arr[1] = math.fabs(trial.getTrialPoint().getValue(self.variables.get(1)))	
		self.param_arr[2] = makePhaseNear(trial.getTrialPoint().getValue(self.variables.get(2)),0.)	
		return self.param_arr
	def run_measurement(self,bpm1_avg_phase_old,bpm2_avg_phase_old):
		scl_long_tuneup_rescale_controller = self.scl_long_tuneup_controller.scl_long_tuneup_rescale_controller
		bpms_phase_shift_panel = scl_long_tuneup_rescale_controller.bpms_phase_shift_panel
		measure_stopper = bpms_phase_shift_panel.measure_stopper
		measure_stopper.shouldStop = false		
		n_iter = int(bpms_phase_shift_panel.iter_measuremen_text.getValue())
		cav_wrapper = self.scl_long_tuneup_controller.cav0_wrapper
		bpm_wrapper1 = cav_wrapper.bpm_wrappers[0]
		bpm_wrapper2 = cav_wrapper.bpm_wrappers[1]
		ch_phase1 = ChannelFactory.defaultFactory().getChannel(bpm_wrapper1.bpm.getId()+":phaseAvg")
		ch_phase2 = ChannelFactory.defaultFactory().getChannel(bpm_wrapper2.bpm.getId()+":phaseAvg")
		ch_phase1.connectAndWait(0.5)
		ch_phase2.connectAndWait(0.5)
		phase1_arr = []
		phase2_arr = []
		count = 0
		while(count < n_iter):
			if(measure_stopper.shouldStop): break
			time.sleep(1.2)
			phase1_arr.append(ch_phase1.getValDbl())
			phase2_arr.append(ch_phase2.getValDbl())
			if(measure_stopper.shouldStop): break
			count += 1
			if(measure_stopper.shouldStop): break
			bpms_phase_shift_panel.iter_measuremen_text.setValue(float(n_iter-count))
		bpm1_avg_phase = 0.
		bpm2_avg_phase = 0.
		for phase in 	phase1_arr:
			bpm1_avg_phase += phase/len(phase1_arr)
		for phase in 	phase2_arr:
			bpm2_avg_phase += phase/len(phase2_arr)
		bpms_phase_shift_panel.new_phases_text.setText("%+4.1f  /  %+4.1f"%(bpm1_avg_phase,bpm2_avg_phase))
		bpm_numb = 0
		phase_diff = 0.
		if(bpm_wrapper1.isGood):
			phase_diff += makePhaseNear(bpm1_avg_phase - bpm1_avg_phase_old,0.)
			bpm_numb += 1
		if(bpm_wrapper2.isGood):
			phase_diff += makePhaseNear(bpm2_avg_phase - bpm2_avg_phase_old,0.)
			bpm_numb += 1	
		if(bpm_numb > 0):
			phase_diff /= bpm_numb
		bpms_phase_shift_panel.phase_shift_text.setValue(phase_diff)
		bpms_phase_shift_panel.iter_measuremen_text.setValue(float(n_iter))
		if(bpm_numb == 0 or count == 0): return false
		return true
	def makePhaseScanStep(self, cav_phase, cav_wrapper, bpm_amp_min_limit = 0.1):
		""" 
		It will add one point (cav_phase,bpm_amp) or (cav_phase,bpm_phase) to the plots in the dictonary.
		bpm_amp_phase_dict[bpm_wrapper] = (graphDataAmp,graphDataPhase)
		"""	
		scan_is_good = false
		count = 0
		bad_count_limit = 3
		while(not scan_is_good):
			scan_is_good = true
			count += 1
			if(count >bad_count_limit): return false
			if(not self.makeMeasurement()): return false
			bpm_amp_phase_dict = cav_wrapper.bpm_amp_phase_dict 
			#--------get bpm amp and phase -------------
			if(bpm_amp_phase_dict.has_key(cav_wrapper.bpm_wrapper0)):
				(ch_ampl,ch_phase) = self.bpm_ch_amp_phase_dict[cav_wrapper.bpm_wrapper0]
				bpm_amp = self.batchGetRequest.getRecord(ch_ampl).doubleValue()				
				bpm_phase = self.batchGetRequest.getRecord(ch_phase).doubleValue()
				if(bpm_amp < bpm_amp_min_limit): scan_is_good = false
			if(bpm_amp_phase_dict.has_key(cav_wrapper.bpm_wrapper1)):
				(ch_ampl,ch_phase) = self.bpm_ch_amp_phase_dict[cav_wrapper.bpm_wrapper1]
				bpm_amp = self.batchGetRequest.getRecord(ch_ampl).doubleValue()				
				bpm_phase = self.batchGetRequest.getRecord(ch_phase).doubleValue()
				if(bpm_amp < bpm_amp_min_limit): scan_is_good = false
			if(cav_wrapper.bpm_wrapper0 == null):
				#that is for "All Off" cavity wrapper
				bpm_wrapper_first_good = null
				for bpm_wrapper in self.bpm_wrappers:
					if(bpm_wrapper.isGood and bpm_amp_phase_dict.has_key(bpm_wrapper)): 
						bpm_wrapper_first_good = bpm_wrapper
						break
				if(bpm_wrapper_first_good != null):
					(ch_ampl,ch_phase) = self.bpm_ch_amp_phase_dict[bpm_wrapper_first_good]
					bpm_amp = self.batchGetRequest.getRecord(ch_ampl).doubleValue()
					if(bpm_amp < bpm_amp_min_limit): scan_is_good = false
				else:
					scan_is_good = false
			if(scan_is_good == false): continue
			for bpm_wrapper in self.bpm_wrappers:
				if(bpm_amp_phase_dict.has_key(bpm_wrapper) and self.bpm_ch_amp_phase_dict.has_key(bpm_wrapper)):
					(graphDataAmp,graphDataPhase) = bpm_amp_phase_dict[bpm_wrapper]
					(ch_ampl,ch_phase) = self.bpm_ch_amp_phase_dict[bpm_wrapper]
					#print "debug ch amp=",ch_ampl.channelName()," phase=",ch_phase.channelName()
					bpm_amp = self.batchGetRequest.getRecord(ch_ampl).doubleValue()				
					bpm_phase = self.batchGetRequest.getRecord(ch_phase).doubleValue()
					graphDataAmp.addPoint(cav_phase,bpm_amp)
					old_bpm_phase = 0.
					if(graphDataPhase.getNumbOfPoints() > 0):
						old_bpm_phase = graphDataPhase.getY(graphDataPhase.getNumbOfPoints() - 1)
					graphDataPhase.addPoint(cav_phase,makePhaseNear(bpm_phase,old_bpm_phase))
		return true
	def fakeMakePhaseScanStep(self,cav_phase,cav_wrapper):
		cav_wrappers = self.scl_long_tuneup_controller.cav_wrappers
		mass = self.scl_long_tuneup_controller.mass/1.0e+6
		bpm_freq = self.scl_long_tuneup_controller.bpm_freq
		c = self.scl_long_tuneup_controller.c_light	
		cav_pos0 = cav_wrappers[0].pos
		max_pos = cav_wrappers[len(cav_wrappers)-1].pos - cav_pos0
		cav_pos = cav_wrapper.pos
		eKin_in = 185.6+650.0*(cav_pos-cav_pos0)/max_pos
		cav_phase_offset = 30.
		phase = makePhaseNear(cav_phase + cav_phase_offset,0.)
		eKin = eKin_in
		if(self.scl_long_tuneup_controller.cav0_wrapper != cav_wrapper):
			eKin +=  8.0*math.cos(2.0*math.pi*phase/360.)
		else:
			eKin = 185.6
		gamma = (eKin+mass)/mass
		beta = math.sqrt(1.0 - 1.0/gamma**2)
		c = 2.99792458e+8
		freq = 402.5e+6
		bpm_phase_coef = 360.0*freq/(c*beta)
		#print "debug cav_phase=",cav_phase," beta=",beta," eKin=",eKin," cav_pos=",cav_pos," coeff=",bpm_phase_coef
		bpm_wrappers = cav_wrapper.bpm_wrappers
		for bpm_wrapper in bpm_wrappers:				
			if(cav_wrapper.bpm_amp_phase_dict.has_key(bpm_wrapper)):
				(graphDataAmp,graphDataPhase) = cav_wrapper.bpm_amp_phase_dict[bpm_wrapper]
				if(bpm_wrapper.pos < cav_pos):
					graphDataAmp.addPoint(cav_phase,10.0)
					graphDataPhase.addPoint(cav_phase,20.0)
					continue
				bpm_phase = makePhaseNear(bpm_phase_coef*(bpm_wrapper.pos - cav_pos),0.)
				bpm_phase += 1.0*(random.random()-0.5)
				bpm_amp = 25.0*1./(1.+(bpm_wrapper.pos-cav_pos)/20.)
				graphDataAmp.addPoint(cav_phase,bpm_amp)
				old_bpm_phase = 0.
				if(graphDataPhase.getNumbOfPoints() > 0):
					old_bpm_phase = graphDataPhase.getY(graphDataPhase.getNumbOfPoints() - 1)
				graphDataPhase.addPoint(cav_phase,makePhaseNear(bpm_phase,old_bpm_phase))
		return true
	def calcForNewAmpsAndPhases(self):
		self.setRescaledModelCavityAmplitudes()
		cav_wrappers = self.scl_long_tuneup_controller.cav_wrappers
		for cav_wrapper in cav_wrappers:
			amp = cav_wrapper.rescaleBacket.designAmp
			phase = self.new_cav_amp_phase_dict[cav_wrapper][1]
			self.new_cav_amp_phase_dict[cav_wrapper] = [amp,phase]
		self.scenario.resync()
		#---set up phases : we should reproduce the rf gap avg. phases from the proxies
		max_limit_phase_diff = 0.01
		max_phase_diff = 1.0
		min_cav_amp = 0.5
		max_iter = 30
		it = 0
		while(max_phase_diff > max_limit_phase_diff):
			it += 1
			for cav_wrapper in cav_wrappers:
				 irfGap = self.cavToGapsDict[cav_wrapper][0]
				 phase = self.new_cav_amp_phase_dict[cav_wrapper][1]
				 irfGap.setPhase(phase*math.pi/180.)
			part_probe = ParticleProbe(self.part_probe_init)
			eKin_in = self.scl_long_tuneup_controller.cav_wrappers[0].eKin_in
			part_probe.setKineticEnergy(eKin_in*1.0e+6)
			self.scenario.setProbe(part_probe)	
			self.scenario.run()
			max_phase_diff = 0.0
			for cav_wrapper in cav_wrappers:
				phase_rf_gaps_avg = self.getAvgGapPhase(cav_wrapper)
				phase_diff = phase_rf_gaps_avg - cav_wrapper.rescaleBacket.avg_gap_phase
				#print "debug cav=",cav_wrapper.alias," phase_diff=",phase_diff," phase avg =",phase_rf_gaps_avg," design avg=",cav_wrapper.avg_gap_phase
				#print "debug ======= amp=",cav_wrapper.cav.getDfltCavAmp()," phase=",self.cavToGapsDict[cav_wrapper][0].getPhase()*180./math.pi
				if(cav_wrapper.rescaleBacket.designAmp > min_cav_amp):
					self.new_cav_amp_phase_dict[cav_wrapper][1] -= phase_diff/1.3
					phase_diff = math.fabs(phase_diff)
					if(max_phase_diff < phase_diff): max_phase_diff = phase_diff
			eKin_out = self.scenario.getTrajectory().finalState().getKineticEnergy()/1.0e+6	
			#print "debug eKin_out=",eKin_out
			if(it > max_iter): break	
		#---- update the cavities' new model phases
		for cav_wrapper in cav_wrappers:
			phase = self.new_cav_amp_phase_dict[cav_wrapper][1]
			cav_wrapper.rescaleBacket.designPhase = makePhaseNear(phase,0.)
		#print "debug iter=",it
		eKin_out = self.scenario.getTrajectory().finalState().getKineticEnergy()/1.0e+6
		scl_long_tuneup_rescale_controller = self.scl_long_tuneup_controller.scl_long_tuneup_rescale_controller
		init_amp_phases_panel = scl_long_tuneup_rescale_controller.init_amp_phases_panel
		init_amp_phases_panel.energy_text.setValue(eKin_out)	
		self.restoreInitAmpPhases()
		return eKin_out
	def allBPMs_PhaseWrapper(self,cav_wrapper):
		# it will wrap all BPM phases for the cvity by iteration from the BPM closest to cavity
		if(not cav_wrapper.isGood): return
		cav_pos = cav_wrapper.pos
		bpm_wrappers = []
		for bpm_ind in range(len(cav_wrapper.bpm_wrappers)):
			bpm_wrapper = cav_wrapper.bpm_wrappers[bpm_ind]
			res_bool = cav_wrapper.bpm_amp_phase_dict.has_key(bpm_wrapper)
			res_bool = res_bool and bpm_wrapper.isGood
			res_bool = res_bool and (bpm_wrapper.pos > cav_pos)
			if(res_bool):
				bpm_wrappers.append(bpm_wrapper)
		for bpm_ind in range(len(bpm_wrappers)-1):
			(graphDataAmp0,graphDataPhase0) = cav_wrapper.bpm_amp_phase_dict[bpm_wrappers[bpm_ind]]
			(graphDataAmp1,graphDataPhase1) = cav_wrapper.bpm_amp_phase_dict[bpm_wrappers[bpm_ind+1]]
			if(graphDataPhase0.getNumbOfPoints() < 1): break
			if(graphDataPhase0.getNumbOfPoints() != graphDataPhase1.getNumbOfPoints()):
				txt = "Phase Wrapper BPM=",bpm_wrappers[bpm_ind].alias
				txt += " and BPM=",bpm_wrappers[bpm_ind+1].alias
				txt += " have different number of RF phase points n1=",graphDataPhase0.getNumbOfPoints()
				txt += " n2=",graphDataPhase1.getNumbOfPoints()
				self.scl_long_tuneup_controller.getMessageTextField().setText(txt)
				print "debug ==================="
				print txt
				time.sleep(10.)
				return false
			y_arr = []
			for ip in range(graphDataPhase1.getNumbOfPoints()):
				y_arr.append(graphDataPhase1.getY(ip))
			base_phase_diff = y_arr[0] - graphDataPhase0.getY(0)
			for ip in range(1,graphDataPhase0.getNumbOfPoints()):
				y0 = graphDataPhase0.getY(ip)
				y_arr[ip] = makePhaseNear(y_arr[ip],y0+base_phase_diff)
				base_phase_diff = y_arr[ip] - y0
			#move all data by 360. to make the avg close to 0.
			y_avg = 0.
			for y in y_arr:
				y_avg += y
			if(len(y_arr) > 1): y_avg /= len(y_arr)
			y_shift = int(y_avg/360.)*360.
			for ip in range(len(y_arr)):
				y_arr[ip] -= y_shift
			#--- update all bpm phases
			graphDataPhase1.updateValuesY(y_arr)	
		# recreate phase difference
		cav_wrapper.recalculatePhaseDiffData()
		return true
	def fit(self):
		if(self.active_cav_wrapper == null): return
		variables = ArrayList()
		delta_hint = InitialDelta()
		#----- variable eKin_in
		var = Variable("eKin_in",self.eKin_in, - Double.MAX_VALUE, Double.MAX_VALUE)
		variables.add(var)
		delta_hint.addInitialDelta(var,0.3)
		#----- variable cavity amplitude
		var = Variable("cav_amp",self.cav_amp, - Double.MAX_VALUE, Double.MAX_VALUE)
		variables.add(var)
		delta_hint.addInitialDelta(var,self.cav_amp*0.01)
		#----- variable cavity phase offset
		var = Variable("phase_offset",self.cav_phase_shift, - Double.MAX_VALUE, Double.MAX_VALUE)
		variables.add(var)
		delta_hint.addInitialDelta(var,1.0)
		#-------- solve the fitting problem
		scorer = CavAmpPhaseScorer(self,variables)
		maxSolutionStopper = SolveStopperFactory.maxEvaluationsStopper(120) 
		self.solver = Solver(SimplexSearchAlgorithm(),maxSolutionStopper)
		problem = ProblemFactory.getInverseSquareMinimizerProblem(variables,scorer,0.0001)
		problem.addHint(delta_hint)
		self.solver.solve(problem)
		#------- get results
		trial = self.solver.getScoreBoard().getBestSolution()
		err2 = scorer.score(trial,variables)	
		[self.eKin_in,self.cav_amp,self.cav_phase_shift] = scorer	.getTrialParams(trial)	
		self.active_cav_wrapper.eKin_in = self.eKin_in
		self.active_cav_wrapper.designPhase = makePhaseNear(self.active_cav_wrapper.livePhase - self.cav_phase_shift,0.)
		self.active_cav_wrapper.eKin_err = math.sqrt(err2)
		cav_phase = self.active_cav_wrapper.livePhase
		self.active_cav_wrapper.eKin_out = self.getModelEnergyOut(self.eKin_in,self.cav_amp,cav_phase,self.cav_phase_shift)
		#print "debug cav=",self.active_cav_wrapper.alias," shift=",self.cav_phase_shift," amp=",self.cav_amp," err2=",	math.sqrt(err2)," ekinOut=",	self.active_cav_wrapper.eKin_out		
		#----- this defenition of the avg. gap phase will be replaced by another with self.model_eKin_in
		self.active_cav_wrapper.avg_gap_phase = self.getAvgGapPhase()
		self.active_cav_wrapper.designAmp = self.cav_amp
		self.solver = null
		#----make theory graph plot
		x_arr = []
		y_arr = []
		for i in range(self.scan_gd.getNumbOfPoints()):
			phase = self.scan_gd.getX(i)
			y = self.scan_gd.getY(i)
			x_arr.append(phase)
			y_arr.append(y)
		self.active_cav_wrapper.eKinOutPlotTh.addPoint(x_arr,y_arr)			
	def actionPerformed(self,actionEvent):
		scl_long_tuneup_phase_scan_controller = self.scl_long_tuneup_controller.scl_long_tuneup_phase_scan_controller
		amp_limit = scl_long_tuneup_phase_scan_controller.post_scan_panel.amp_limit_text.getValue()
		cav_wrappers = self.scl_long_tuneup_controller.cav_wrappers
		bpms_table = scl_long_tuneup_phase_scan_controller.bpms_table
		for cav_wrapper in cav_wrappers:
			if((not cav_wrapper.isGood) or (not cav_wrapper.isMeasured)): continue
			self.applyBPM_AmpLimit(amp_limit,cav_wrapper)
		if(self.scl_long_tuneup_controller.cav0_wrapper.isMeasured):
			self.applyBPM_AmpLimit(amp_limit,self.scl_long_tuneup_controller.cav0_wrapper)
		bpms_table.getModel().fireTableDataChanged()	
		#wrap all BPM phase scan results in the phase analysis
		for cav_wrapper in cav_wrappers:
			if((not cav_wrapper.isGood) or (not cav_wrapper.isMeasured)): continue
			cav_pos = cav_wrapper.pos
			bpm_wrappers = []
			for bpm_ind in range(len(cav_wrapper.bpm_wrappers)):
				bpm_wrapper = cav_wrapper.bpm_wrappers[bpm_ind]
				res_bool = cav_wrapper.bpm_amp_phase_dict.has_key(bpm_wrapper)
				res_bool = res_bool and cav_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind]
				res_bool = res_bool and (bpm_wrapper.pos > cav_pos)
				if(res_bool):
					bpm_wrappers.append(bpm_wrapper)
			for bpm_ind in range(len(bpm_wrappers)-1):
				(graphDataAmp0,graphDataPhase0) = cav_wrapper.bpm_amp_phase_dict[bpm_wrappers[bpm_ind]]
				(graphDataAmp1,graphDataPhase1) = cav_wrapper.bpm_amp_phase_dict[bpm_wrappers[bpm_ind+1]]
				if(graphDataPhase0.getNumbOfPoints() < 1): break
				y_arr = []
				for ip in range(graphDataPhase1.getNumbOfPoints()):
					y_arr.append(graphDataPhase1.getY(ip))
					base_phase_diff = y_arr[0] - graphDataPhase0.getY(0)
				for ip in range(1,graphDataPhase0.getNumbOfPoints()):
					y0 = graphDataPhase0.getY(ip)
					y_arr[ip] = makePhaseNear(y_arr[ip],y0+base_phase_diff)
					base_phase_diff = y_arr[ip] - y0
				#move all data by 360. to make the avg close to 0.
				y_avg = 0.
				for y in y_arr:
					y_avg += y
				if(len(y_arr) > 1): y_avg /= len(y_arr)
				y_shift = int(y_avg/360.)*360.
				for ip in range(len(y_arr)):
					y_arr[ip] -= y_shift
				#--- update all bpm phases
				graphDataPhase1.updateValuesY(y_arr)
	def calculatePhaseOffsets(self,eKin_ring):
		mass = self.scl_long_tuneup_controller.mass/1.0e+6			
		c_light = self.scl_long_tuneup_controller.c_light	
		bpm_freq = self.scl_long_tuneup_controller.bpm_freq
		beta = math.sqrt(eKin_ring*(eKin_ring+2*mass))/(eKin_ring+mass)		
		slope = 360.0*bpm_freq/(c_light*beta)
		if(len(self.bpm_wrappers_arr) < 2): return false
		base_bpm_wrapper = self.bpm_wrappers_arr[0]
		(base_bpm_phase,base_bpm_phase_err) = calculateAvgErr(self.bpm_amp_phase_data_dict[base_bpm_wrapper][1])
		for bpm_wrapper in self.bpm_wrappers_arr:
			pos = bpm_wrapper.pos - base_bpm_wrapper.pos
			(phase,phase_err) = calculateAvgErr(self.bpm_amp_phase_data_dict[bpm_wrapper][1])
			phase_diff = makePhaseNear(phase - base_bpm_phase - slope*pos,0.)
			bpm_wrapper.right_phase_offset.phaseOffset_avg = phase_diff
			bpm_wrapper.right_phase_offset.phaseOffset_err = phase_err
			bpm_wrapper.right_phase_offset.isReady = true	
		scl_long_tuneup_bpm_offsets_controller = self.scl_long_tuneup_controller.scl_long_tuneup_bpm_offsets_controller
		scl_long_tuneup_bpm_offsets_controller.bpm_offsets_table.getModel().fireTableDataChanged()		
	def actionPerformed(self,actionEvent):
		self.scl_long_tuneup_controller.getMessageTextField().setText("This actions is not implemented yet!")
		self.scl_long_tuneup_controller.getMessageTextField().setText("")
		scl_long_tuneup_rescale_controller = self.scl_long_tuneup_controller.scl_long_tuneup_rescale_controller
		init_amp_phases_panel = scl_long_tuneup_rescale_controller.init_amp_phases_panel
		scl_tracker_model = scl_long_tuneup_rescale_controller.scl_tracker_model
		if(not scl_tracker_model.isModelReady()):
			txt = "The data for the SCL model is not ready! Go to Phase Analysis!"
			self.scl_long_tuneup_controller.getMessageTextField().setText(txt)
			return		
		if(not scl_tracker_model.modelArrivalTimesIsReady):
			txt = "The model was not initialized! Hit the Init SCL Model button!"
			self.scl_long_tuneup_controller.getMessageTextField().setText(txt)
			return		
		bpms_phase_shift_panel = scl_long_tuneup_rescale_controller.bpms_phase_shift_panel
		# the frequency of BPMs in SCL is 0.5 of the frequency of RF cavities
		phase_shift_global = 2*bpms_phase_shift_panel.phase_shift_text.getValue()
		cav_wrappers = self.scl_long_tuneup_controller.cav_wrappers
		for cav_wrapper in cav_wrappers:
			if(cav_wrapper.isGood):
				new_cav_phase = makePhaseNear(cav_wrapper.rescaleBacket.livePhase + phase_shift_global,0.)
				cav_wrapper.cav.setCavPhase(new_cav_phase)
	def harmonicsAnalysisStep(self):
		if(self.active_cav_wrapper == null): return
		self.eKin_in = self.active_cav_wrapper.eKin_in
		self.cav_amp = 14.0
		self.cav_phase_shift = 0.
		#--------- first iteration
		self.getDiff2(self.eKin_in,self.cav_amp,self.cav_phase_shift)
		err = self.harmonicsAnalyzer.analyzeData(self.scan_gd)	
		harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
		energy_amp_test = harm_function.getParamArr()[1]
		energy_amp_exp = self.active_cav_wrapper.energy_guess_harm_funcion.getParamArr()[1]
		self.cav_amp = self.cav_amp*energy_amp_exp/energy_amp_test
		#--------- second iteration	
		self.getDiff2(self.eKin_in,self.cav_amp,self.cav_phase_shift)
		err = self.harmonicsAnalyzer.analyzeData(self.scan_gd)	
		harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
		energy_amp_test = harm_function.getParamArr()[1]
		energy_amp_exp = self.active_cav_wrapper.energy_guess_harm_funcion.getParamArr()[1]
		self.cav_amp = self.cav_amp*energy_amp_exp/energy_amp_test
		max_model_energy_phase = self.harmonicsAnalyzer.getPositionOfMax()
		max_exp_energy_phase = self.active_cav_wrapper.energy_guess_harm_funcion.findMax()
		self.cav_phase_shift = makePhaseNear(-(max_model_energy_phase - max_exp_energy_phase),0.)
Exemple #15
0
    def calculateEnergy(self, eKin_in):
        mass = self.scl_long_tuneup_controller.mass / 1.0e+6
        c_light = self.scl_long_tuneup_controller.c_light
        bpm_freq = self.scl_long_tuneup_controller.bpm_freq
        coeff_init = 360.0 * bpm_freq / c_light
        beta = math.sqrt(eKin_in * (eKin_in + 2 * mass)) / (eKin_in + mass)
        coeff = coeff_init / beta
        #------ calculate avg bpm phases
        res_arr = []
        for bpm_ind in range(len(self.em_bpm_wrpprs)):
            bpm_wrapper = self.em_bpm_wrpprs[bpm_ind]
            if (not self.use_bpms[bpm_ind]): continue
            if (not self.bpm_amp_phase_data_dict.has_key(bpm_wrapper)):
                continue
            (amp_arr, phase_arr) = self.bpm_amp_phase_data_dict[bpm_wrapper]
            (phase_avg, phase_err) = calculateAvgErr(phase_arr)
            #print "debug bpm=",bpm_wrapper.alias," (phase_avg,phase_err) =",(phase_avg,phase_err)
            res_arr.append([bpm_ind, bpm_wrapper, phase_avg, phase_err])
        n_res = len(res_arr)
        scl_long_tuneup_energy_meter_controller = self.scl_long_tuneup_controller.scl_long_tuneup_energy_meter_controller
        table_and_plots_panel = scl_long_tuneup_energy_meter_controller.table_and_plots_panel
        init_start_stop_panel = scl_long_tuneup_energy_meter_controller.init_start_stop_panel
        fixInitEenergy_RadioButton = init_start_stop_panel.fixInitEenergy_RadioButton
        buffer_size = int(init_start_stop_panel.buffer_size_text.getValue())
        if (n_res < 2): return eKin_in
        [bpm_ind0, bpm_wrapper0, phase_avg0, phase_err0] = res_arr[0]
        phase_avg0 = phase_avg0 - self.bpm_phase_offsets[0]
        res_arr[0][2] = phase_avg0
        base_pos = bpm_wrapper0.pos
        #"""
        for ind in range(n_res - 1):
            [bpm_ind0, bpm_wrapper0, phase_avg0, phase_err0] = res_arr[ind]
            [bpm_ind1, bpm_wrapper1, phase_avg1, phase_err1] = res_arr[ind + 1]
            bpm1_phase = phase_avg1 - self.bpm_phase_offsets[bpm_ind1]
            bpm1_phase_guess = phase_avg0 + coeff * (bpm_wrapper1.pos -
                                                     bpm_wrapper0.pos)
            bpm1_phase = makePhaseNear(bpm1_phase, bpm1_phase_guess)
            res_arr[ind + 1][2] = bpm1_phase
        """
		for ind in range(1,n_res):
			[bpm_ind,bpm_wrapper,phase_avg,phase_err] = res_arr[ind]
			bpm_phase = phase_avg - self.bpm_phase_offsets[bpm_ind]
			delta_pos = bpm_wrapper.pos - base_pos
			bpm_phase_guess = phase_avg0 + coeff*delta_pos
			bpm_phase = makePhaseNear(bpm_phase,bpm_phase_guess)
			res_arr[ind][2] = bpm_phase	
		"""
        #----- make phase plot
        gd = BasicGraphData()
        for ind in range(n_res):
            [bpm_ind, bpm_wrapper, phase_avg, phase_err] = res_arr[ind]
            gd.addPoint(bpm_wrapper.pos - base_pos, phase_avg, phase_err)
        res_poly_arr = GraphDataOperations.polynomialFit(
            gd, -1.e+36, +1.e+36, 1)
        if (res_poly_arr == null): return eKin_in
        slope = res_poly_arr[0][1]
        init_phase = res_poly_arr[0][0]
        if (fixInitEenergy_RadioButton.isSelected()):
            slope = coeff
            init_phase = phase_avg0
        beta = coeff_init / slope
        gamma = 1. / math.sqrt(1.0 - beta * beta)
        eKin = mass * (gamma - 1.0)
        slope_err = res_poly_arr[1][1]
        delta_eKin = mass * gamma**3 * beta**3 * slope_err / coeff_init
        #make phase error plot
        x_arr = []
        y_arr = []
        err_arr = []
        for ind in range(n_res):
            [bpm_ind, bpm_wrapper, phase_avg, phase_err] = res_arr[ind]
            x_arr.append(bpm_wrapper.pos)
            phase_diff = makePhaseNear(
                phase_avg - (init_phase + slope *
                             (bpm_wrapper.pos - base_pos)), 0.)
            self.bpm_phase_diff_arr[bpm_ind].append(phase_diff)
            if (len(self.bpm_phase_diff_arr[bpm_ind]) > buffer_size):
                self.bpm_phase_diff_arr[bpm_ind] = self.bpm_phase_diff_arr[
                    bpm_ind][1:]
            (phase_diff,
             phase_err) = calculateAvgErr(self.bpm_phase_diff_arr[bpm_ind])
            y_arr.append(phase_diff)
            err_arr.append(phase_err)
        table_and_plots_panel.bpm_phase_err_gd.removeAllPoints()
        table_and_plots_panel.bpm_phase_err_gd.addPoint(x_arr, y_arr, err_arr)
        return (eKin, delta_eKin)
Exemple #16
0
	def calculateOffSets(self):
		scl_long_tuneup_bpm_offsets_controller = self.scl_long_tuneup_controller.scl_long_tuneup_bpm_offsets_controller			
		bpms_offsets_from_ccl4_panel = scl_long_tuneup_bpm_offsets_controller.bpms_offsets_from_ccl4_panel	
		self.scl_long_tuneup_controller.getMessageTextField().setText("")
		#--- transform eV to MeV
		mass = self.scl_long_tuneup_controller.mass/1.0e+6			
		c_light = self.scl_long_tuneup_controller.c_light
		eKin_in = bpms_offsets_from_ccl4_panel.ccl4_energy_text.getValue()
		gamma = (mass+eKin_in)/mass
		beta = math.sqrt(1.0-1.0/(gamma*gamma))		
		bpm_freq = self.scl_long_tuneup_controller.bpm_freq	
		#--- initial parameters 
		for bpm_wrapper in self.scl_long_tuneup_controller.bpm_wrappers:
			bpm_wrapper.left_phase_offset.phaseOffset_avg = 0.
			bpm_wrapper.left_phase_offset.phaseOffset_err = 0.
			bpm_wrapper.left_phase_offset.isReady = false
			bpm_wrapper.left_phase_offset.phaseOffset_arr = []
		#---- analysis of the "All Cavities Off" case
		cav0_wrapper = self.scl_long_tuneup_controller.cav0_wrapper
		if(cav0_wrapper.isGood and cav0_wrapper.isMeasured):
			bpm_local_wrappers = []
			for bpm_ind in range(len(cav0_wrapper.bpm_wrappers)):
				bpm_wrapper = cav0_wrapper.bpm_wrappers[bpm_ind]
				if(cav0_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind]):
					bpm_local_wrappers.append(bpm_wrapper)
					(graphDataAmp,graphDataPhase) = cav0_wrapper.bpm_amp_phase_dict[bpm_wrapper]
					phase_offset_obj = bpm_wrapper.left_phase_offset
					phase_arr= []
					for ip in range(graphDataPhase.getNumbOfPoints()):
						phase_arr.append(graphDataPhase.getY(ip))
					(phase_avg, err) = calculateAvgErr(phase_arr)
					phase_offset_obj.phase_val_tmp = phase_avg
					phase_offset_obj.phase_val_err_tmp = err
			if(len(bpm_local_wrappers) == 0):
				txt = "Cavity "+cav0_wrapper.alias+" all data are bad! Cannot do anything!"
				self.scl_long_tuneup_controller.getMessageTextField().setText(txt)
				return
			#---- the average BPM phases for all cavities off are ready here ------- 
			bpm_phase_coef = 360.0*bpm_freq/(c_light*beta)
			base_bpm_wrapper = bpm_local_wrappers[0]
			base_pos = base_bpm_wrapper.pos
			base_bpm_phase = base_bpm_wrapper.left_phase_offset.phase_val_tmp
			base_bpm_phase_err = base_bpm_wrapper.left_phase_offset.phaseOffset_err
			for bpm_wrapper in bpm_local_wrappers:
				pos_delta = bpm_wrapper.pos - base_pos
				bpm_phase_th = base_bpm_phase + bpm_phase_coef*pos_delta
				phase_offset = makePhaseNear(bpm_wrapper.left_phase_offset.phase_val_tmp - bpm_phase_th,0.)
				err = math.sqrt(base_bpm_phase_err**2 + bpm_wrapper.left_phase_offset.phase_val_err_tmp**2)
				bpm_wrapper.left_phase_offset.phaseOffset_avg = phase_offset
				bpm_wrapper.left_phase_offset.phaseOffset_err = err
				bpm_wrapper.left_phase_offset.isReady = true
				bpm_wrapper.left_phase_offset.phase_val_tmp = 0.
				bpm_wrapper.left_phase_offset.phase_val_err_tmp = 0.
				#print "debug cav=",cav0_wrapper.alias," BPM=",bpm_wrapper.alias," offset= %4.1f +- %4.1f"%(phase_offset,err)
		#------ start moving along cavities -------------------
		cav_wrapper = self.scl_long_tuneup_controller.cav_wrappers[0]
		cav_wrapper.eKin_in_guess = eKin_in
		n_cavs = len(self.scl_long_tuneup_controller.cav_wrappers)
		for cav_ind in range(n_cavs):
			cav_wrapper = self.scl_long_tuneup_controller.cav_wrappers[cav_ind]
			if(cav_wrapper.isGood and (not cav_wrapper.isMeasured)): break
			if(cav_ind > 0):
				cav_wrapper.eKin_in_guess = self.scl_long_tuneup_controller.cav_wrappers[cav_ind-1].eKin_out_guess		
			if(not cav_wrapper.isGood):
				cav_wrapper.eKin_out_guess = cav_wrapper.eKin_in_guess
				continue
			# make array of BPMs already having offsets and not having ones
			bpm_wrappers_good_arr = []
			bpm_wrappers_not_done_arr = []
			for bpm_ind in range(len(cav_wrapper.bpm_wrappers)):
				bpm_wrapper = cav_wrapper.bpm_wrappers[bpm_ind]
				is_wanted = bpm_wrapper.isGood and bpm_wrapper.pos > cav_wrapper.pos
				is_wanted = is_wanted and cav_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind]
				if(is_wanted):
					if(bpm_wrapper.left_phase_offset.isReady):
						bpm_wrappers_good_arr.append(bpm_wrapper)
					else:
						bpm_wrappers_not_done_arr.append(bpm_wrapper)
			initEnergyInGuessHarmFunc(cav_wrapper,self.scl_long_tuneup_controller)
			if(len(bpm_wrappers_good_arr) < 2):
				txt = "Cavity "+cav_wrapper.alias+" does not have enough good BPMs! Cannot do anything!"
				self.scl_long_tuneup_controller.getMessageTextField().setText(txt)
				return				
			calculateOffsetsForNotDoneBPMsLeft(cav_wrapper,self.scl_long_tuneup_controller,bpm_wrappers_good_arr,bpm_wrappers_not_done_arr)
			#print "debug cav=",cav_wrapper.alias," n_bad=",len(bpm_wrappers_not_done_arr)
		#----set all BPMs that do not have offsets as not good for phase analysis
		for bpm_wrapper in self.scl_long_tuneup_controller.bpm_wrappers:
			if(bpm_wrapper.isGood):
				if(not bpm_wrapper.left_phase_offset.isReady):
					cav0_wrapper = self.scl_long_tuneup_controller.cav0_wrapper
					bpm_ind = cav0_wrapper.bpm_wrappers.index(bpm_wrapper)
					if(bpm_ind >= 0):
						cav0_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind] = false
						cav0_wrapper.bpm_wrappers_useInAmpBPMs[bpm_ind] = true
					for cav_wrapper in self.scl_long_tuneup_controller.cav_wrappers:
						bpm_ind = cav_wrapper.bpm_wrappers.index(bpm_wrapper)
						if(bpm_ind >= 0):
							cav_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind] = false
							cav_wrapper.bpm_wrappers_useInAmpBPMs[bpm_ind] = true
		#---- re-calculate phase offesets to the base BPM which is the first BPM after
		#---- the last cavity
		cav_wrapper = self.scl_long_tuneup_controller.cav_wrappers[n_cavs-1]
		base_bpm_wrapper = null
		for bpm_wrapper in self.scl_long_tuneup_controller.bpm_wrappers:
			if(bpm_wrapper.isGood):
				if(bpm_wrapper.left_phase_offset.isReady):
					if(bpm_wrapper.pos > cav_wrapper.pos):
						base_bpm_wrapper = bpm_wrapper
						break
		if(base_bpm_wrapper != null):
			base_bpm_phase_offset = base_bpm_wrapper.left_phase_offset.phaseOffset_avg
			for bpm_wrapper in self.scl_long_tuneup_controller.bpm_wrappers:
				if(bpm_wrapper.isGood):
					if(bpm_wrapper.left_phase_offset.isReady):
						phase_offset = bpm_wrapper.left_phase_offset.phaseOffset_avg
						phase_offset = makePhaseNear(phase_offset - base_bpm_phase_offset,0.)
						bpm_wrapper.left_phase_offset.phaseOffset_avg = phase_offset 
		#---- set the final energy after the last cavity
		cav_wrapper = self.scl_long_tuneup_controller.cav_wrappers[n_cavs-1]
		bpms_offsets_from_hebt1_panel = scl_long_tuneup_bpm_offsets_controller.bpms_offsets_from_hebt1_panel
		bpms_offsets_from_hebt1_panel.ring_energy_text.setValue(cav_wrapper.eKin_out_guess)
		self.scl_long_tuneup_controller.updateAllTables()
Exemple #17
0
	def calculateOffSets(self):
		scl_long_tuneup_bpm_offsets_controller = self.scl_long_tuneup_controller.scl_long_tuneup_bpm_offsets_controller			
		bpms_offsets_from_hebt1_panel = scl_long_tuneup_bpm_offsets_controller.bpms_offsets_from_hebt1_panel
		self.scl_long_tuneup_controller.getMessageTextField().setText("")
		#--- transform eV to MeV
		mass = self.scl_long_tuneup_controller.mass/1.0e+6			
		c_light = self.scl_long_tuneup_controller.c_light
		eKin_out = bpms_offsets_from_hebt1_panel.ring_energy_text.getValue()
		if(eKin_out == 0.):
			self.scl_long_tuneup_controller.getMessageTextField().setText("The Ring Energy is 0 GeV! Cannot calculate BPM phase offsets!")
			return
		gamma = (mass+eKin_out)/mass
		beta = math.sqrt(1.0-1.0/(gamma*gamma))		
		bpm_freq = self.scl_long_tuneup_controller.bpm_freq	
		n_cavs = len(self.scl_long_tuneup_controller.cav_wrappers)
		cav_wrapper = self.scl_long_tuneup_controller.cav_wrappers[n_cavs-1]
		#--- initial parameters 
		for bpm_wrapper in self.scl_long_tuneup_controller.bpm_wrappers:
			if(bpm_wrapper.pos < cav_wrapper.pos):
				bpm_wrapper.right_phase_offset.phaseOffset_avg = 0.
				bpm_wrapper.right_phase_offset.phaseOffset_err = 0.
				bpm_wrapper.right_phase_offset.isReady = false
				bpm_wrapper.right_phase_offset.phaseOffset_arr = []
		cav_wrapper.eKin_out_guess = eKin_out
		#------ start moving along cavities -------------------
		for cav_ind in range(n_cavs-1,-1,-1):
			cav_wrapper = self.scl_long_tuneup_controller.cav_wrappers[cav_ind]
			if(cav_wrapper.isGood and (not cav_wrapper.isMeasured)): break
			if(cav_ind != n_cavs-1):
				cav_wrapper.eKin_out_guess = self.scl_long_tuneup_controller.cav_wrappers[cav_ind+1].eKin_in_guess
			if(not cav_wrapper.isGood):
				cav_wrapper.eKin_in_guess = cav_wrapper.eKin_out_guess
				continue				
			# make array of BPMs already having offsets and not having ones
			bpm_wrappers_good_arr = []
			bpm_wrappers_not_done_arr = []
			for bpm_ind in range(len(cav_wrapper.bpm_wrappers)):
				bpm_wrapper = cav_wrapper.bpm_wrappers[bpm_ind]
				is_wanted = bpm_wrapper.isGood and bpm_wrapper.pos > cav_wrapper.pos
				is_wanted = is_wanted and cav_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind]
				if(is_wanted):
					if(bpm_wrapper.right_phase_offset.isReady):
						bpm_wrappers_good_arr.append(bpm_wrapper)
					else:
						bpm_wrappers_not_done_arr.append(bpm_wrapper)
			initEnergyOutGuessHarmFunc(cav_wrapper,self.scl_long_tuneup_controller)
			if(len(bpm_wrappers_good_arr) < 2):
				txt = "Cavity "+cav_wrapper.alias+" does not have enough good BPMs! Cannot do anything!"
				self.scl_long_tuneup_controller.getMessageTextField().setText(txt)
				return				
			calculateOffsetsForNotDoneBPMsRight(cav_wrapper,self.scl_long_tuneup_controller,bpm_wrappers_good_arr,bpm_wrappers_not_done_arr)
			#print "debug cav=",cav_wrapper.alias," n_bad=",len(bpm_wrappers_not_done_arr)," eKin_in=",cav_wrapper.eKin_in_guess," eKin_out=",cav_wrapper.eKin_out_guess
		#---- analysis of the "All Cavities Off" case
		cav_wrapper = self.scl_long_tuneup_controller.cav_wrappers[0]
		cav0_wrapper = self.scl_long_tuneup_controller.cav0_wrapper
		param_arr = [cav_wrapper.eKin_in_guess,]
		cav0_wrapper.energy_guess_harm_funcion.setParamArr(param_arr)
		cav0_wrapper.eKin_in_guess = cav_wrapper.eKin_in_guess
		cav0_wrapper.eKin_out_guess = cav_wrapper.eKin_in_guess
		if(cav0_wrapper.isGood and cav0_wrapper.isMeasured):
			# make array of BPMs already having offsets and not having ones
			bpm_wrappers_good_arr = []
			bpm_wrappers_not_done_arr = []
			for bpm_ind in range(len(cav0_wrapper.bpm_wrappers)):
				bpm_wrapper = cav0_wrapper.bpm_wrappers[bpm_ind]
				is_wanted = bpm_wrapper.isGood
				is_wanted = is_wanted and cav0_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind]
				if(is_wanted):
					if(bpm_wrapper.right_phase_offset.isReady):
						bpm_wrappers_good_arr.append(bpm_wrapper)
					else:
						bpm_wrappers_not_done_arr.append(bpm_wrapper)
			if(len(bpm_wrappers_good_arr) < 2):
				txt = "Cavity "+cav_wrapper.alias+" does not have enough good BPMs! Cannot do anything!"
				self.scl_long_tuneup_controller.getMessageTextField().setText(txt)
				return
			calculateOffsetsForNotDoneBPMsRight(cav0_wrapper,self.scl_long_tuneup_controller,bpm_wrappers_good_arr,bpm_wrappers_not_done_arr)
			#print "debug cav=",cav0_wrapper.alias," n_bad=",len(bpm_wrappers_not_done_arr)," eKin_in=",cav0_wrapper.eKin_in_guess," eKin_out=",cav0_wrapper.eKin_out_guess
		else:
			txt = "All cavities Off Case does not have the measured data!"
			self.scl_long_tuneup_controller.getMessageTextField().setText(txt)
		#---- set the calculated energy at CCL4 exit
		bpms_offsets_from_hebt1_panel.init_energy_text.setValue(cav0_wrapper.eKin_out_guess)
		#----set all BPMs that do not have offsets as not good for phase analysis
		for bpm_wrapper in self.scl_long_tuneup_controller.bpm_wrappers:
			if(bpm_wrapper.isGood):
				if(not bpm_wrapper.right_phase_offset.isReady):
					cav0_wrapper = self.scl_long_tuneup_controller.cav0_wrapper
					bpm_ind = cav0_wrapper.bpm_wrappers.index(bpm_wrapper)
					if(bpm_ind >= 0):
						cav0_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind] = false
						cav0_wrapper.bpm_wrappers_useInAmpBPMs[bpm_ind] = true
					for cav_wrapper in self.scl_long_tuneup_controller.cav_wrappers:
						bpm_ind = cav_wrapper.bpm_wrappers.index(bpm_wrapper)
						if(bpm_ind >= 0):
							cav_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind] = false
							cav_wrapper.bpm_wrappers_useInAmpBPMs[bpm_ind] = true
		#---- recalculate phase offesets to the base BPM which is the first BPM after
		#---- the last cavity
		cav_wrapper = self.scl_long_tuneup_controller.cav_wrappers[n_cavs-1]
		base_bpm_wrapper = null
		for bpm_wrapper in self.scl_long_tuneup_controller.bpm_wrappers:
			if(bpm_wrapper.isGood):
				if(bpm_wrapper.right_phase_offset.isReady):
					if(bpm_wrapper.pos > cav_wrapper.pos):
						base_bpm_wrapper = bpm_wrapper
						break
		if(base_bpm_wrapper != null):
			base_bpm_phase_offset = base_bpm_wrapper.right_phase_offset.phaseOffset_avg
			for bpm_wrapper in self.scl_long_tuneup_controller.bpm_wrappers:
				if(bpm_wrapper.isGood):
					if(bpm_wrapper.right_phase_offset.isReady):
						phase_offset = bpm_wrapper.right_phase_offset.phaseOffset_avg
						phase_offset = makePhaseNear(phase_offset - base_bpm_phase_offset,0.)
						bpm_wrapper.right_phase_offset.phaseOffset_avg = phase_offset 
		self.scl_long_tuneup_controller.updateAllTables()		
	def setUpCavityPhase(self,cav_wrapper):
		#--- wrap all BPMs phase scans at once
		if(self.wrapPhases): 
			res_phase_wrap = self.allBPMs_PhaseWrapper(cav_wrapper)	
			if(not res_phase_wrap): return false
		max_bad_points_count = 2
		gd = cav_wrapper.phaseDiffPlot
		gdTh = cav_wrapper.phaseDiffPlotTh
		gdTh.removeAllPoints()
		if(gd.getNumbOfPoints() < 8): return false
		err = self.harmonicsAnalyzer.analyzeData(gd)	
		harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
		#-----remove bad points
		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)
				bpm_wrappers = cav_wrapper.bpm_wrappers
				for bpm_wrapper in bpm_wrappers:				
					if(cav_wrapper.bpm_amp_phase_dict.has_key(bpm_wrapper)):
						(graphDataAmp,graphDataPhase) = cav_wrapper.bpm_amp_phase_dict[bpm_wrapper]
						graphDataAmp.removePoint(bad_index)
						graphDataPhase.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 = self.harmonicsAnalyzer.getPositionOfMin()
		new_phase = cav_wrapper.initLivePhase
		if(self.keepCavPhases):
			cav_wrapper.scanPhaseShift = makePhaseNear(new_phase - min_phase,0.)
		else:
			new_phase = makePhaseNear(min_phase + cav_wrapper.scanPhaseShift,0.)
		# ?????? should be tested with CA
		cav_wrapper.livePhase = new_phase
		if(not self.fake_scan):
			cav_wrapper.cav.setCavPhase(cav_wrapper.livePhase)
		cav_wrapper.livePhase = new_phase
		cav_wrapper.phase_scan_harm_amp = harm_function.getParamArr()[1]
		cav_wrapper.phase_scan_harm_err = err
		cav_wrapper.phase_scan_harm_funcion.setParamArr(self.harmonicsAnalyzer.getHrmonicsFunction().getParamArr())
		#----make theory graph plot
		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)
		gdTh.addPoint(x_arr,y_arr)
		return true
Exemple #19
0
 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)
Exemple #20
0
def calculateOffsetsForNotDoneBPMsLeft(cav_wrapper,scl_long_tuneup_controller,bpm_wrappers_good_arr,bpm_wrappers_not_done_arr):
	# this function will calculate offsets for "left" offsets of 
	# "Not yet Done" BPMs by using "good" (already done) BPMs
	eKin_in = cav_wrapper.eKin_in_guess
	mass = scl_long_tuneup_controller.mass/1.0e+6			
	c_light = scl_long_tuneup_controller.c_light	
	bpm_freq = scl_long_tuneup_controller.bpm_freq
	coeff_init = 360.0*bpm_freq/c_light
	for bpm_wrapper in bpm_wrappers_not_done_arr:
		bpm_wrapper.left_phase_offset.phaseOffset_arr = []
	phaseDiffPlot = cav_wrapper.phaseDiffPlot
	cav_wrapper.eKinOutPlot.removeAllPoints()
	cav_wrapper.eKinOutPlotTh.removeAllPoints()
	for ip in range(phaseDiffPlot.getNumbOfPoints()):
		cav_phase = phaseDiffPlot.getX(ip)
		ekin_guess =  cav_wrapper.energy_guess_harm_funcion.getValue(cav_phase)
		beta_guess = math.sqrt(ekin_guess*(ekin_guess+2*mass))/(ekin_guess+mass)
		coeff = coeff_init/beta_guess
		# let's make bpm_phase(z) points for good BPMs
		gd = BasicGraphData()
		base_bpm_wrapper = bpm_wrappers_good_arr[0]
		(graphDataAmp,graphDataPhase) = cav_wrapper.bpm_amp_phase_dict[base_bpm_wrapper]
		base_bpm_offset = base_bpm_wrapper.left_phase_offset.phaseOffset_avg	
		base_bpm_phase = graphDataPhase.getY(ip) - base_bpm_offset
		#print "debug ==== ip=",ip," cav_phase=",cav_phase," eKin_guess=",ekin_guess	
		gd.addPoint(base_bpm_wrapper.pos,base_bpm_phase)
		for bpm_ind in range(1,len(bpm_wrappers_good_arr)):
			bpm_wrapper = bpm_wrappers_good_arr[bpm_ind]
			(graphDataAmp,graphDataPhase) = cav_wrapper.bpm_amp_phase_dict[bpm_wrapper]
			bpm_phase = graphDataPhase.getY(ip) - bpm_wrapper.left_phase_offset.phaseOffset_avg
			bpm_pos = bpm_wrapper.pos
			bpm_phase_guess = gd.getY(bpm_ind-1) + coeff*(bpm_pos-gd.getX(bpm_ind-1))
			bpm_phase = makePhaseNear(bpm_phase,bpm_phase_guess)
			gd.addPoint(bpm_pos,bpm_phase)
			#print "debug bpm=",bpm_wrapper.alias," pos=",bpm_pos," phase=",bpm_phase
		res_arr = GraphDataOperations.polynomialFit(gd,-1.e+36,+1.e+36,1)
		slope = res_arr[0][1]
		slope_err = res_arr[1][1]
		init_phase = res_arr[0][0]
		init_phase_err = res_arr[1][0]
		beta = coeff_init/slope
		gamma = 1./math.sqrt(1.0-beta*beta)
		eKin = mass*(gamma-1.0)	
		delta_eKin = mass*gamma**3*beta**3*slope_err/coeff_init
		cav_wrapper.eKinOutPlot.addPoint(cav_phase,eKin,delta_eKin)
		#print "debug cav_phase=",cav_phase,"eKin_guess=",ekin_guess," eKin=",eKin," delta_E=",delta_eKin
		# let's go over the bad BPMs and calculate offsets for particular cavity phase
		for bpm_wrapper in bpm_wrappers_not_done_arr:
			bpm_pos = bpm_wrapper.pos
			bpm_phase_th = init_phase + slope*bpm_pos
			(graphDataAmp,graphDataPhase) = cav_wrapper.bpm_amp_phase_dict[bpm_wrapper]
			bpm_phase = graphDataPhase.getY(ip)
			bpm_offset = makePhaseNear(bpm_phase - bpm_phase_th,0.)
			bpm_wrapper.left_phase_offset.phaseOffset_arr.append(bpm_offset)
	#----set up the output energy guess
	cav_wrapper.eKin_out_guess = cav_wrapper.eKinOutPlot.getValueY(cav_wrapper.livePhase)
	# let's calculate statistics for "not done" BPMs' offsets
	for bpm_wrapper in bpm_wrappers_not_done_arr:
		phase_arr = bpm_wrapper.left_phase_offset.phaseOffset_arr
		(phase0_avg, phase0_err) = calculateAvgErr(phase_arr)
		phase_arr = []
		for phase in bpm_wrapper.left_phase_offset.phaseOffset_arr:
			phase_arr.append(makePhaseNear(phase-180.,0.))
		(phase1_avg, phase1_err) = calculateAvgErr(phase_arr)
		phase1_avg = makePhaseNear(phase1_avg+180.,0.)
		if(phase1_err < phase0_err):
			bpm_wrapper.left_phase_offset.phaseOffset_avg = phase1_avg
			bpm_wrapper.left_phase_offset.phaseOffset_err = phase1_err
		else:
			bpm_wrapper.left_phase_offset.phaseOffset_avg = phase0_avg
			bpm_wrapper.left_phase_offset.phaseOffset_err = phase0_err
		bpm_wrapper.left_phase_offset.isReady = true
	def run(self):
		cav_wrappers = self.scl_long_tuneup_controller.cav_wrappers	
		# this is a guess energy here
		cav_wrappers[0].eKin_in = 185.6
		n_cavs = len(cav_wrappers)
		messageTextField = self.scl_long_tuneup_controller.getMessageTextField()
		if(messageTextField != null):
			messageTextField.setText("")	
		scl_long_tuneup_phase_analysis_controller = self.scl_long_tuneup_controller.scl_long_tuneup_phase_analysis_controller
		scl_one_cavity_tracker_model = scl_long_tuneup_phase_analysis_controller.scl_one_cavity_tracker_model
		analysis_state_controller = scl_long_tuneup_phase_analysis_controller.analysis_state_controller
		analysis_state_controller.setIsRunning(true)
		cavs_table = scl_long_tuneup_phase_analysis_controller.cavs_table
		analysis_status_text = scl_long_tuneup_phase_analysis_controller.start_stop_analysis_panel.analysis_status_text
		#---------start deal with selected cavities
		cav_selected_inds = cavs_table.getSelectedRows()
		if(len(cav_selected_inds) < 1 or cav_selected_inds[0] < 0): 
			if(messageTextField != null):
				messageTextField.setText("Select one or more cavities to start Phase Analysis!")
				analysis_state_controller.setIsRunning(false)
			return
		# these are the table model indexes
		cav_wrapper = null
		start_ind = cav_selected_inds[0]
		last_ind = cav_selected_inds[len(cav_selected_inds)-1]
		if(self.run_to_end): last_ind = n_cavs - 1
		#----- set isAnalyzed=false for all downstream cavities
		cav_wrapper = cav_wrappers[start_ind]
		cav_wrapper.isAnalyzed = false
		for cav_table_ind in range(start_ind+1,n_cavs):
			cav_wrapper = cav_wrappers[cav_table_ind]
			cav_wrapper.isAnalyzed = false
			cav_wrapper.eKin_err = 0.
			cav_wrapper.model_eKin_out = 0.
			cav_wrapper.bpm_eKin_out = 0.
			cav_wrapper.real_scanPhaseShift = 0.
			cav_wrapper.eKinOutPlot.removeAllPoints()
			cav_wrapper.eKinOutPlotTh.removeAllPoints()
		cavs_table.getModel().fireTableDataChanged()
		#-------start loop over cavities in the table
		time_start = time.time()
		n_total = last_ind - start_ind + 1
		n_count = 0
		for cav_table_ind in range(start_ind,last_ind+1):
			#print "debug cav_table_index=",cav_table_ind
			cav_wrapper = cav_wrappers[cav_table_ind]
			if(cav_wrapper.eKin_in == 0.):
				if(messageTextField != null):
					messageTextField.setText("Cavity "+cav_wrapper.alias+" has 0. inpit energy. Fix it!")
					analysis_state_controller.setIsRunning(false)
				return					
			if(not cav_wrapper.isGood):
				cav_wrapper.eKin_out = cav_wrapper.eKin_in
				cav_wrapper.model_eKin_out = cav_wrapper.eKin_out
				if(cav_table_ind != 0):
					cav_wrapper.model_eKin_out = cav_wrappers[cav_table_ind-1].model_eKin_out
				#-----set the eKin_in  for the next cavity
				if(cav_table_ind != len(cav_wrappers)-1):
					cav_wrappers[cav_table_ind+1].eKin_in = cav_wrapper.eKin_out						
				continue
			if(not cav_wrapper.isMeasured):
				if(messageTextField != null):
					messageTextField.setText("Cavity "+cav_wrapper.alias+" does not have measured data! Stop analysis.")
					analysis_state_controller.setIsRunning(false)
				return				
			cavs_table.setRowSelectionInterval(cav_table_ind,cav_table_ind)
			txt = "Analysis is running! Cavity="+cav_wrapper.alias
			if(start_ind != last_ind): txt = txt + " to Cavity="+cav_wrappers[last_ind-1].alias
			if(n_count > 1):
				run_time = time.time() - time_start
				run_time_sec = int(run_time % 60)
				run_time_min = int(run_time/60.)
				eta_time = ((run_time/n_count)*(n_total - n_count))
				eta_time_sec = int(eta_time % 60)
				eta_time_min = int(eta_time/60.)
				txt = txt + "  ETA= %3d min  %2d sec "%(eta_time_min,eta_time_sec)
				txt = txt + "  Elapse= %3d min  %2d sec "%(run_time_min,run_time_sec)
			analysis_status_text.setText(txt)
			if(analysis_state_controller.getShouldStop()): break
			#calculate the out energy vs. cav. phase
			bpm_wrappers_good_arr = []
			for bpm_ind in range(len(cav_wrapper.bpm_wrappers)):
				bpm_wrapper = cav_wrapper.bpm_wrappers[bpm_ind]
				# make array of BPMs already having offsets and good for phase analysis
				is_wanted = bpm_wrapper.isGood and bpm_wrapper.pos > cav_wrapper.pos
				is_wanted = is_wanted and cav_wrapper.bpm_wrappers_useInPhaseAnalysis[bpm_ind]
				if(is_wanted):
					if(bpm_wrapper.final_phase_offset.isReady):
						bpm_wrappers_good_arr.append(bpm_wrapper)
			#print "debug start E(rf phase) calculation"
			if(len(bpm_wrappers_good_arr) < 3):
				if(messageTextField != null):
					n_good_bpms = len(bpm_wrappers_good_arr)
					messageTextField.setText("Cavity "+cav_wrapper.alias+" does not enough BPMs with offsets! Stop analysis. N BPMs="+str(n_good_bpms))
					analysis_state_controller.setIsRunning(false)
				return						
			calculateEneregyVsPhase(cav_wrapper,self.scl_long_tuneup_controller,bpm_wrappers_good_arr)
			#print "debug stop E(rf phase) calculation"
			if(analysis_state_controller.getShouldStop()): break
			#fit the harmonics function to the energy gain
			cav_wrapper.eKin_err = self.harmonicsAnalyzer.analyzeData(cav_wrapper.eKinOutPlot)
			harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
			#-----check fitting quality - remove bad points
			bad_point_ind = 0
			bad_points_count = 0
			while(bad_point_ind >= 0):
				bad_point_ind = -1
				for ibp in range(cav_wrapper.eKinOutPlot.getNumbOfPoints()):
					exp_val = cav_wrapper.eKinOutPlot.getY(ibp)
					harm_val = harm_function.getValue(cav_wrapper.eKinOutPlot.getX(ibp))
					diff = math.fabs(exp_val-harm_val)
					if(math.fabs(exp_val-harm_val) > 2.8*cav_wrapper.eKin_err):
						bad_point_ind = ibp
						break
				if(bad_point_ind >= 0):
					bad_points_count += 1 
					cav_wrapper.eKinOutPlot.removePoint(bad_point_ind)
					cav_wrapper.eKin_err = self.harmonicsAnalyzer.analyzeData(cav_wrapper.eKinOutPlot)
					harm_function = self.harmonicsAnalyzer.getHrmonicsFunction()
				if(bad_points_count > int(0.2*cav_wrapper.eKinOutPlot.getNumbOfPoints())):
					analysis_status_text.setText("Analysis stopped! Bad scan! Cav="+cav_wrapper.alias)
					return
			cav_wrapper.bpm_eKin_out = harm_function.getValue(cav_wrapper.livePhase)
			cav_wrapper.real_scanPhaseShift =  makePhaseNear(cav_wrapper.livePhase - harm_function.findMax(),0.)
			cav_wrapper.energy_guess_harm_funcion.setParamArr(harm_function.getParamArr())
			if(analysis_state_controller.getShouldStop()): break
			# put model based analysis here
			scl_one_cavity_tracker_model.setActiveCavity(cav_wrapper)
			scl_one_cavity_tracker_model.harmonicsAnalysisStep()
			scl_one_cavity_tracker_model.fit()
			model_eKin_in = cav_wrapper.eKin_in
			if(cav_table_ind != 0):
				model_eKin_in = cav_wrappers[cav_table_ind-1].model_eKin_out
			cav_amp = scl_one_cavity_tracker_model.cav_amp
			cav_phase = cav_wrapper.livePhase
			cav_phase_shift = scl_one_cavity_tracker_model.cav_phase_shift
			cav_wrapper.model_eKin_out = scl_one_cavity_tracker_model.getModelEnergyOut(model_eKin_in,cav_amp,cav_phase,cav_phase_shift)
			cav_wrapper.avg_gap_phase = scl_one_cavity_tracker_model.getAvgGapPhase()
			if(analysis_state_controller.getShouldStop()): break
			cav_wrapper.isAnalyzed = true
			cavs_table.getModel().fireTableDataChanged()
			#-----set the eKin_in  for the next cavity
			if(cav_table_ind != len(cav_wrappers)-1):
				cav_wrappers[cav_table_ind+1].eKin_in = cav_wrapper.eKin_out			
			n_count += 1
		#------end of cavities loop
		txt = ""
		if(cav_wrapper != null):
			txt = " The last cavity was "+cav_wrapper.alias+" ."
		run_time = time.time() - time_start
		run_time_sec = int(run_time % 60)
		run_time_min = int(run_time/60.)
		txt = txt + "  Total time= %3d min  %2d sec "%(run_time_min,run_time_sec)
		if(analysis_state_controller.getShouldStop()):
			analysis_status_text.setText("Analysis was interrupted!"+txt)
		else:
			analysis_status_text.setText("Analysis finished!"+txt)
		analysis_state_controller.setIsRunning(false)
		scl_one_cavity_tracker_model.restoreInitAmpPhases()
	def addPhaseDiffToOffsets(self):
		for bpm_ind in range(len(self.em_bpm_wrpprs)):
			bpm_wrapper = self.em_bpm_wrpprs[bpm_ind]
			if(self.use_bpms[bpm_ind]):
				self.bpm_phase_offsets[bpm_ind] += calculateAvgErr(self.bpm_phase_diff_arr[bpm_ind])[0]
				self.bpm_phase_offsets[bpm_ind] = makePhaseNear(self.bpm_phase_offsets[bpm_ind],0.)