class Long_Twiss_Bucket:
    def __init__(self, cav_wrapper):
        self.cav_wrapper = cav_wrapper
        self.twiss_arr = [Twiss(), Twiss(), Twiss()]
        self.long_Twiss_fit = Twiss()
        self.long_Twiss_matrix = Twiss()
        self.long_Twiss_z2_zzp_zp2_err = [0., 0., 0]
        #---- alpha, beta, and emittance errors
        self.long_Twiss_arr_err = [0., 0., 0]
        #---- alpha, beta, and emittance steps
        self.long_Twiss_arr_steps = [0., 0., 0]
        self.fit_bpm_amp_avg_err = 0.
        self.isReady = false
        self.update()

    def update(self):
        self.bpm_amp_plotTh_arr = []
        for bpm_wrapper in self.cav_wrapper.bpm_wrappers:
            amp_plotTh = BasicGraphData()
            amp_plotTh.setDrawPointsOn(false)
            amp_plotTh.setGraphColor(Color.RED)
            amp_plotTh.setLineThick(3)
            amp_plotTh.setGraphProperty(
                GRAPH_LEGEND_KEY, "Cav: " + self.cav_wrapper.alias + " BPM: " +
                bpm_wrapper.alias)
            self.bpm_amp_plotTh_arr.append([bpm_wrapper, amp_plotTh])

    def clean(self):
        self.isReady = false
        self.long_Twiss_z2_zzp_zp2_err = [0., 0., 0]
        self.long_Twiss_arr_err = [0., 0., 0]
        self.long_Twiss_arr_steps = [0., 0., 0]
        self.fit_bpm_amp_avg_err = 0.
        for [bpm_wrapper, amp_plotTh] in self.bpm_amp_plotTh_arr:
            amp_plotTh.removeAllPoints()
        self.twiss_arr = [Twiss(), Twiss(), Twiss()]
        self.long_Twiss_fit = Twiss()
        self.long_Twiss_matrix = Twiss()

    def cleanFittingValues(self):
        self.long_Twiss_z2_zzp_zp2_err = [0., 0., 0]
        self.long_Twiss_arr_err = [0., 0., 0]
        self.fit_bpm_amp_avg_err = 0.
        for [bpm_wrapper, amp_plotTh] in self.bpm_amp_plotTh_arr:
            amp_plotTh.removeAllPoints()
        self.long_Twiss_fit = Twiss()
        self.long_Twiss_matrix = Twiss()

    def writeDataToXML(self, root_da):
        cav_long_twiss_bucket_da = root_da.createChild(
            "Cavity_Long_Twiss_Bucket")
        cav_long_twiss_bucket_da.setValue("cav", self.cav_wrapper.alias)
        cav_long_twiss_bucket_da.setValue("isReady", self.isReady)
        cav_long_twiss_bucket_da.setValue("amp_avg_fit_err",
                                          self.fit_bpm_amp_avg_err)
        twiss_arr_da = cav_long_twiss_bucket_da.createChild("Twiss_arr")
        twiss_arr = self.twiss_arr
        [alphaX, betaX, emittX] = [
            twiss_arr[0].getAlpha(), twiss_arr[0].getBeta(),
            twiss_arr[0].getEmittance()
        ]
        [alphaY, betaY, emittY] = [
            twiss_arr[1].getAlpha(), twiss_arr[1].getBeta(),
            twiss_arr[1].getEmittance()
        ]
        [alphaZ, betaZ, emittZ] = [
            twiss_arr[2].getAlpha(), twiss_arr[2].getBeta(),
            twiss_arr[2].getEmittance()
        ]
        twiss_arr_da.setValue("alphaX", alphaX)
        twiss_arr_da.setValue("betaX", betaX)
        twiss_arr_da.setValue("emittX", emittX)
        twiss_arr_da.setValue("alphaY", alphaY)
        twiss_arr_da.setValue("betaY", betaY)
        twiss_arr_da.setValue("emittY", emittY)
        twiss_arr_da.setValue("alphaZ", alphaZ)
        twiss_arr_da.setValue("betaZ", betaZ)
        twiss_arr_da.setValue("emittZ", emittZ)
        twiss_arr_da.setValue("alphaZ_err", self.long_Twiss_arr_err[0])
        twiss_arr_da.setValue("betaZ_err", self.long_Twiss_arr_err[1])
        twiss_arr_da.setValue("emittZ_err", self.long_Twiss_arr_err[2])
        twiss_arr_da.setValue("alphaZ_steps", self.long_Twiss_arr_steps[0])
        twiss_arr_da.setValue("betaZ_steps", self.long_Twiss_arr_steps[1])
        twiss_arr_da.setValue("emittZ_steps", self.long_Twiss_arr_steps[2])
        twiss_fit_da = cav_long_twiss_bucket_da.createChild("Twiss_fit")
        twiss_fit_da.setValue("alphaZ", self.long_Twiss_fit.getAlpha())
        twiss_fit_da.setValue("betaZ", self.long_Twiss_fit.getBeta())
        twiss_fit_da.setValue("emittZ", self.long_Twiss_fit.getEmittance())
        twiss_matrix_da = cav_long_twiss_bucket_da.createChild("Twiss_matrix")
        twiss_matrix_da.setValue("alphaZ", self.long_Twiss_matrix.getAlpha())
        twiss_matrix_da.setValue("betaZ", self.long_Twiss_matrix.getBeta())
        twiss_matrix_da.setValue("emittZ",
                                 self.long_Twiss_matrix.getEmittance())
        twiss_matrix_da.setValue("z2_err", self.long_Twiss_z2_zzp_zp2_err[0])
        twiss_matrix_da.setValue("z_zp_err", self.long_Twiss_z2_zzp_zp2_err[1])
        twiss_matrix_da.setValue("z2_err", self.long_Twiss_z2_zzp_zp2_err[2])
        bpm_amps_da = cav_long_twiss_bucket_da.createChild("BPM_Amplitudes")
        for [bpm_wrapper, amp_plotTh] in self.bpm_amp_plotTh_arr:
            if (amp_plotTh.getNumbOfPoints() > 0):
                bpm_amp_da = bpm_amps_da.createChild("BPM")
                bpm_amp_da.setValue("BPM", bpm_wrapper.alias)
                dumpGraphDataToDA(amp_plotTh, bpm_amp_da, "BPM_AMPL_GD",
                                  "%10.5f", "%10.5f")

    def readDataFromXML(self, cav_long_twiss_bucket_da,
                        scl_long_tuneup_controller):
        #------ read data for cavity from the XML stucture
        self.isReady = Boolean(
            cav_long_twiss_bucket_da.intValue("isReady")).booleanValue()
        self.fit_bpm_amp_avg_err = cav_long_twiss_bucket_da.doubleValue(
            "amp_avg_fit_err")
        twiss_arr_da = cav_long_twiss_bucket_da.childAdaptor("Twiss_arr")
        alphaX = twiss_arr_da.doubleValue("alphaX")
        betaX = twiss_arr_da.doubleValue("betaX")
        emittX = twiss_arr_da.doubleValue("emittX")
        alphaY = twiss_arr_da.doubleValue("alphaY")
        betaY = twiss_arr_da.doubleValue("betaY")
        emittY = twiss_arr_da.doubleValue("emittY")
        alphaZ = twiss_arr_da.doubleValue("alphaZ")
        betaZ = twiss_arr_da.doubleValue("betaZ")
        emittZ = twiss_arr_da.doubleValue("emittZ")
        self.twiss_arr[0].setTwiss(alphaX, betaX, emittX)
        self.twiss_arr[1].setTwiss(alphaY, betaY, emittY)
        self.twiss_arr[2].setTwiss(alphaZ, betaZ, emittZ)
        self.long_Twiss_arr_err[0] = twiss_arr_da.doubleValue("alphaZ_err")
        self.long_Twiss_arr_err[1] = twiss_arr_da.doubleValue("betaZ_err")
        self.long_Twiss_arr_err[2] = twiss_arr_da.doubleValue("emittZ_err")
        self.long_Twiss_arr_steps[0] = twiss_arr_da.doubleValue("alphaZ_steps")
        self.long_Twiss_arr_steps[1] = twiss_arr_da.doubleValue("betaZ_steps")
        self.long_Twiss_arr_steps[2] = twiss_arr_da.doubleValue("emittZ_steps")
        twiss_fit_da = cav_long_twiss_bucket_da.childAdaptor("Twiss_fit")
        alphaZ = twiss_fit_da.doubleValue("alphaZ")
        betaZ = twiss_fit_da.doubleValue("betaZ")
        emittZ = twiss_fit_da.doubleValue("emittZ")
        self.long_Twiss_fit.setTwiss(alphaZ, betaZ, emittZ)
        twiss_matrix_da = cav_long_twiss_bucket_da.childAdaptor("Twiss_matrix")
        alphaZ = twiss_matrix_da.doubleValue("alphaZ")
        betaZ = twiss_matrix_da.doubleValue("betaZ")
        emittZ = twiss_matrix_da.doubleValue("emittZ")
        self.long_Twiss_matrix.setTwiss(alphaZ, betaZ, emittZ)
        self.long_Twiss_z2_zzp_zp2_err[0] = twiss_matrix_da.doubleValue(
            "z2_err")
        self.long_Twiss_z2_zzp_zp2_err[1] = twiss_matrix_da.doubleValue(
            "z_zp_err")
        self.long_Twiss_z2_zzp_zp2_err[2] = twiss_matrix_da.doubleValue(
            "z2_err")
        #---- clean up and read the amp graphs
        self.update()
        bpm_amps_da = cav_long_twiss_bucket_da.childAdaptor("BPM_Amplitudes")
        for bpm_amp_da in bpm_amps_da.childAdaptors("BPM"):
            bpm_wrapper = scl_long_tuneup_controller.getBPM_Wrapper(
                bpm_amp_da.stringValue("BPM"))
            for [bpm_wrapper_tmp, amp_plotTh] in self.bpm_amp_plotTh_arr:
                if (bpm_wrapper_tmp == bpm_wrapper):
                    readGraphDataFromDA(amp_plotTh, bpm_amp_da, "BPM_AMPL_GD")
                    break
class Long_Twiss_Bucket:
	def __init__(self,cav_wrapper):
		self.cav_wrapper = cav_wrapper
		self.twiss_arr = [Twiss(),Twiss(),Twiss()]
		self.long_Twiss_fit = Twiss()
		self.long_Twiss_matrix = Twiss()
		self.long_Twiss_z2_zzp_zp2_err = [0.,0.,0]
		#---- alpha, beta, and emittance errors 
		self.long_Twiss_arr_err = [0.,0.,0]
		#---- alpha, beta, and emittance steps
		self.long_Twiss_arr_steps = [0.,0.,0]
		self.fit_bpm_amp_avg_err = 0.
		self.isReady = false
		self.update()

	def update(self):
		self.bpm_amp_plotTh_arr = []
		for bpm_wrapper in self.cav_wrapper.bpm_wrappers:
			amp_plotTh = BasicGraphData()
			amp_plotTh.setDrawPointsOn(false)
			amp_plotTh.setGraphColor(Color.RED)
			amp_plotTh.setLineThick(3)
			amp_plotTh.setGraphProperty(GRAPH_LEGEND_KEY,"Cav: "+self.cav_wrapper.alias+" BPM: "+bpm_wrapper.alias)
			self.bpm_amp_plotTh_arr.append([bpm_wrapper,amp_plotTh])			

	def clean(self):
		self.isReady = false
		self.long_Twiss_z2_zzp_zp2_err = [0.,0.,0]
		self.long_Twiss_arr_err = [0.,0.,0]	
		self.long_Twiss_arr_steps = [0.,0.,0]
		self.fit_bpm_amp_avg_err = 0.
		for [bpm_wrapper,amp_plotTh] in self.bpm_amp_plotTh_arr:
			amp_plotTh.removeAllPoints()
		self.twiss_arr = [Twiss(),Twiss(),Twiss()]
		self.long_Twiss_fit = Twiss()
		self.long_Twiss_matrix = Twiss()	
		
	def cleanFittingValues(self):
		self.long_Twiss_z2_zzp_zp2_err = [0.,0.,0]
		self.long_Twiss_arr_err = [0.,0.,0]	
		self.fit_bpm_amp_avg_err = 0.
		for [bpm_wrapper,amp_plotTh] in self.bpm_amp_plotTh_arr:
			amp_plotTh.removeAllPoints()
		self.long_Twiss_fit = Twiss()
		self.long_Twiss_matrix = Twiss()			
		
	def writeDataToXML(self,root_da):
		cav_long_twiss_bucket_da = root_da.createChild("Cavity_Long_Twiss_Bucket")
		cav_long_twiss_bucket_da.setValue("cav",self.cav_wrapper.alias)
		cav_long_twiss_bucket_da.setValue("isReady",self.isReady)
		cav_long_twiss_bucket_da.setValue("amp_avg_fit_err",self.fit_bpm_amp_avg_err)			
		twiss_arr_da = cav_long_twiss_bucket_da.createChild("Twiss_arr")
		twiss_arr = self.twiss_arr	
		[alphaX,betaX,emittX] = [twiss_arr[0].getAlpha(),twiss_arr[0].getBeta(),twiss_arr[0].getEmittance()]
		[alphaY,betaY,emittY] = [twiss_arr[1].getAlpha(),twiss_arr[1].getBeta(),twiss_arr[1].getEmittance()]
		[alphaZ,betaZ,emittZ] = [twiss_arr[2].getAlpha(),twiss_arr[2].getBeta(),twiss_arr[2].getEmittance()]
		twiss_arr_da.setValue("alphaX",alphaX)
		twiss_arr_da.setValue("betaX",betaX)
		twiss_arr_da.setValue("emittX",emittX)
		twiss_arr_da.setValue("alphaY",alphaY)
		twiss_arr_da.setValue("betaY",betaY)
		twiss_arr_da.setValue("emittY",emittY)
		twiss_arr_da.setValue("alphaZ",alphaZ)
		twiss_arr_da.setValue("betaZ",betaZ)
		twiss_arr_da.setValue("emittZ",emittZ)
		twiss_arr_da.setValue("alphaZ_err",self.long_Twiss_arr_err[0])
		twiss_arr_da.setValue("betaZ_err",self.long_Twiss_arr_err[1])
		twiss_arr_da.setValue("emittZ_err",self.long_Twiss_arr_err[2])	
		twiss_arr_da.setValue("alphaZ_steps",self.long_Twiss_arr_steps[0])
		twiss_arr_da.setValue("betaZ_steps",self.long_Twiss_arr_steps[1])
		twiss_arr_da.setValue("emittZ_steps",self.long_Twiss_arr_steps[2])			
		twiss_fit_da = cav_long_twiss_bucket_da.createChild("Twiss_fit")
		twiss_fit_da.setValue("alphaZ",self.long_Twiss_fit.getAlpha())			
		twiss_fit_da.setValue("betaZ",self.long_Twiss_fit.getBeta())			
		twiss_fit_da.setValue("emittZ",self.long_Twiss_fit.getEmittance())			
		twiss_matrix_da = cav_long_twiss_bucket_da.createChild("Twiss_matrix")
		twiss_matrix_da.setValue("alphaZ",self.long_Twiss_matrix.getAlpha())			
		twiss_matrix_da.setValue("betaZ",self.long_Twiss_matrix.getBeta())			
		twiss_matrix_da.setValue("emittZ",self.long_Twiss_matrix.getEmittance())
		twiss_matrix_da.setValue("z2_err",self.long_Twiss_z2_zzp_zp2_err[0])
		twiss_matrix_da.setValue("z_zp_err",self.long_Twiss_z2_zzp_zp2_err[1])
		twiss_matrix_da.setValue("z2_err",self.long_Twiss_z2_zzp_zp2_err[2])
		bpm_amps_da = cav_long_twiss_bucket_da.createChild("BPM_Amplitudes")
		for [bpm_wrapper,amp_plotTh] in self.bpm_amp_plotTh_arr:
			if(amp_plotTh.getNumbOfPoints() > 0):
				bpm_amp_da = bpm_amps_da.createChild("BPM")
				bpm_amp_da.setValue("BPM",bpm_wrapper.alias)
				dumpGraphDataToDA(amp_plotTh,bpm_amp_da,"BPM_AMPL_GD","%10.5f","%10.5f")
	
	def readDataFromXML(self,cav_long_twiss_bucket_da,scl_long_tuneup_controller):		
		#------ read data for cavity from the XML stucture
		self.isReady = Boolean(cav_long_twiss_bucket_da.intValue("isReady")).booleanValue()
		self.fit_bpm_amp_avg_err = cav_long_twiss_bucket_da.doubleValue("amp_avg_fit_err")
		twiss_arr_da = cav_long_twiss_bucket_da.childAdaptor("Twiss_arr")
		alphaX = twiss_arr_da.doubleValue("alphaX")
		betaX = twiss_arr_da.doubleValue("betaX")
		emittX = twiss_arr_da.doubleValue("emittX")
		alphaY = twiss_arr_da.doubleValue("alphaY")
		betaY = twiss_arr_da.doubleValue("betaY")
		emittY = twiss_arr_da.doubleValue("emittY")		
		alphaZ = twiss_arr_da.doubleValue("alphaZ")
		betaZ = twiss_arr_da.doubleValue("betaZ")
		emittZ = twiss_arr_da.doubleValue("emittZ")			
		self.twiss_arr[0].setTwiss(alphaX,betaX,emittX)
		self.twiss_arr[1].setTwiss(alphaY,betaY,emittY)
		self.twiss_arr[2].setTwiss(alphaZ,betaZ,emittZ)
		self.long_Twiss_arr_err[0] = twiss_arr_da.doubleValue("alphaZ_err")
		self.long_Twiss_arr_err[1] = twiss_arr_da.doubleValue("betaZ_err")
		self.long_Twiss_arr_err[2] = twiss_arr_da.doubleValue("emittZ_err")
		self.long_Twiss_arr_steps[0] = twiss_arr_da.doubleValue("alphaZ_steps")
		self.long_Twiss_arr_steps[1] = twiss_arr_da.doubleValue("betaZ_steps")
		self.long_Twiss_arr_steps[2] = twiss_arr_da.doubleValue("emittZ_steps")
		twiss_fit_da = cav_long_twiss_bucket_da.childAdaptor("Twiss_fit")
		alphaZ = twiss_fit_da.doubleValue("alphaZ")
		betaZ = twiss_fit_da.doubleValue("betaZ")
		emittZ = twiss_fit_da.doubleValue("emittZ")
		self.long_Twiss_fit.setTwiss(alphaZ,betaZ,emittZ)
		twiss_matrix_da = cav_long_twiss_bucket_da.childAdaptor("Twiss_matrix")
		alphaZ = twiss_matrix_da.doubleValue("alphaZ")
		betaZ = twiss_matrix_da.doubleValue("betaZ")
		emittZ = twiss_matrix_da.doubleValue("emittZ")
		self.long_Twiss_matrix.setTwiss(alphaZ,betaZ,emittZ)
		self.long_Twiss_z2_zzp_zp2_err[0] =twiss_matrix_da.doubleValue("z2_err")
		self.long_Twiss_z2_zzp_zp2_err[1] =twiss_matrix_da.doubleValue("z_zp_err")
		self.long_Twiss_z2_zzp_zp2_err[2] =twiss_matrix_da.doubleValue("z2_err")
		#---- clean up and read the amp graphs
		self.update()
		bpm_amps_da = cav_long_twiss_bucket_da.childAdaptor("BPM_Amplitudes")
		for bpm_amp_da in bpm_amps_da.childAdaptors("BPM"):
			bpm_wrapper = scl_long_tuneup_controller.getBPM_Wrapper(bpm_amp_da.stringValue("BPM"))
			for [bpm_wrapper_tmp,amp_plotTh] in self.bpm_amp_plotTh_arr:
				if(bpm_wrapper_tmp == bpm_wrapper):
					readGraphDataFromDA(amp_plotTh,bpm_amp_da,"BPM_AMPL_GD")
					break