def Fit_7parameterIQ1(freq, comp, tau):
    a = 1
    alpha = 0
    
    phi0 = 0#theta0-np.arctan2(x_c, y_c)+rotate_angle + np.pi
    estimateparas = [a,alpha,tau,phi0,freq[len(freq)/2],5e4,5e4]
    
    a, a_err, alpha, alpha_err, tau, tau_err, phi0, phi0_err, fr, fr_err, Qr, Qr_err, Qc, Qc_err, sevenparafittingresult = Fitter.Fit_7para(freq, comp, estimateparas)
    sevenpara_result = a, a_err, alpha, alpha_err, tau, tau_err, phi0, phi0_err, fr, fr_err, Qr, Qr_err, Qc, Qc_err, sevenparafittingresult
    #fit7paracurve = a * np.exp(1j*alpha) * np.exp(-2*np.pi*1j*freq*tau) * (1 - (Qr/Qc*np.exp(1j*phi0))/(1 + 2*1j*Qr*(freq-fr)/fr))

    #plt.plot(real,imag)
    #plt.plot(fitIQ.real, fitIQ.imag, '+')
    #plt.plot(fit7paracurve.real, fit7paracurve.imag, 'r')
    #plt.show()
    
    Qi = sevenpara_result[10] * sevenpara_result[12]/(sevenpara_result[12] - sevenpara_result[10])
    print Qi
    
    finalresult = []
    finalresult.append(a)
    finalresult.append(a_err/a)
    finalresult.append(alpha)
    finalresult.append(alpha_err/alpha)
    finalresult.append(tau)
    finalresult.append(tau_err/tau)
    finalresult.append(phi0)
    finalresult.append(phi0_err/phi0)
    finalresult.append(fr)
    finalresult.append(fr_err/fr)
    finalresult.append(Qr)
    finalresult.append(Qr_err/Qr)
    finalresult.append(Qc)
    finalresult.append(Qc_err/Qc)
    finalresult.append(Qi)
    
    return finalresult
def Fit_7parameterIQ2(freq, comp, para_guess):

    #Fit Circle
    #Rotate and move data to the origin
    n = len(freq)
    I = comp.real
    Q = comp.imag
    x_c, x_c_err, y_c, y_c_err, radius, radius_err, circle_fit_report = Fitter.Fit_Circle(I, Q)

    Z_i = [I[i] + 1j*Q[i] for i in range(0, n)]
    Z_ii = (x_c + 1j*y_c - Z_i)*np.exp(-1j * np.arctan(y_c/x_c))
    
    #Fitter.plot_data_circle(Z_ii.real, Z_ii.imag, x_c, y_c, radius)
    #plt.show()

    ### Fit Phase
    data_phase = np.arctan2(Z_ii.imag, Z_ii.real)

    rotate_angle = np.pi-np.angle(Z_ii[0] + Z_ii[len(Z_ii)-1])
    Z_iic = Z_ii*np.exp(1j * rotate_angle)
    phase_rotated = np.arctan2(Z_iic.imag, Z_iic.real)

    ### Phase fit
    theta0_guess, fr_guess, Qr_guess = 0, np.median(freq), 1e5
    para_phase = theta0_guess, fr_guess, Qr_guess
    theta0, theta0_err, fr, fr_err, Qr, Qr_err, fit_report_phase = Fitter.Fit_Phase(freq, phase_rotated, para_phase)
    print fit_report_phase
    Qc = (np.absolute(x_c + 1j*y_c) + radius)/2/radius*Qr # Ref: Gao Thesis
    Qi = Qr * Qc/(Qc - Qr)
    print Qi
    """
    fitphasecurve = [-theta0 + 2*np.arctan(2 * Qr * (1 - freq[i]/fr)) for i in range(0, n)]
    plt.plot(freq, phase_rotated)
    plt.plot(freq, fitphasecurve, 'r')
    plt.show()
    """
    a, a_err, alpha, alpha_err, tau, tau_err, phi0, phi0_err, fr, fr_err, Qr, Qr_err, Qc, Qc_err, sevenparafittingresult = Fitter.Fit_7para(freq, comp, para_guess)
    sevenpara_result = a, a_err, alpha, alpha_err, tau, tau_err, phi0, phi0_err, fr, fr_err, Qr, Qr_err, Qc, Qc_err, sevenparafittingresult
    fit7paracurve = a * np.exp(1j*alpha) * np.exp(-2*np.pi*1j*freq*tau) * (1 - (Qr/Qc*np.exp(1j*phi0))/(1 + 2*1j*Qr*(freq-fr)/fr))

    #plt.plot(comp.real, comp.imag)
    #plt.plot(fit7paracurve.real, fit7paracurve.imag, 'r')
    #plt.show()
    
    Qi = sevenpara_result[10] * sevenpara_result[12]/(sevenpara_result[12] - sevenpara_result[10])
    print Qi
    
    finalresult = []
    finalresult.append(a)
    finalresult.append(a_err/a)
    finalresult.append(alpha)
    finalresult.append(alpha_err/alpha)
    finalresult.append(tau)
    finalresult.append(tau_err/(tau+1))
    finalresult.append(phi0)
    finalresult.append(phi0_err/phi0)
    finalresult.append(fr)
    finalresult.append(fr_err/fr)
    finalresult.append(Qr)
    finalresult.append(Qr_err/Qr)
    finalresult.append(Qc)
    finalresult.append(Qc_err/Qc)
    finalresult.append(x_c)
    finalresult.append(x_c_err/x_c)
    finalresult.append(y_c)
    finalresult.append(y_c_err/y_c)
    finalresult.append(radius)
    finalresult.append(radius_err/radius)
    
    return finalresult
def Fit_7parameter(folder, filename, span):
    ### Read data from file
    result, MeasState = Read_File(folder, filename)
    freq, linear, phase, mag = Get_Data(result, span)
    n = len(freq)
    real = [linear[i] * np.cos(np.deg2rad(phase[i])) for i in range(0, n)]
    imag = [linear[i] * np.sin(np.deg2rad(phase[i])) for i in range(0, n)]
    comp = [real[i]+imag[i]*1j for i in range(0, n)]

    """
    Fit Circle
    Rotate and move data  to the origin
    """
    x_c, x_c_err, y_c, y_c_err, radius, radius_err, circle_fit_report = Fitter.Fit_Circle(real, imag)

    Z_i = [real[i] + 1j*imag[i] for i in range(0, n)]
    Z_ii = (x_c + 1j*y_c - Z_i)*np.exp(-1j * np.arctan(y_c/x_c))
    
    #Fitter.plot_data_circle(Z_ii.real, Z_ii.imag, x_c, y_c, radius)
    #plt.show()

    ### Fit Phase
    data_phase = np.arctan2(Z_ii.imag, Z_ii.real)

    rotate_angle = np.pi-np.angle(Z_ii[0] + Z_ii[len(Z_ii)-1])
    Z_iic = Z_ii*np.exp(1j * rotate_angle)
    phase_rotated = np.arctan2(Z_iic.imag, Z_iic.real)

    ### Phase fit
    theta0_guess, fr_guess, Qr_guess = 0, np.median(freq), 1e5
    para_phase = theta0_guess, fr_guess, Qr_guess
    theta0, theta0_err, fr, fr_err, Qr, Qr_err, fit_report_phase = Fitter.Fit_Phase(freq, phase_rotated, para_phase)
    print fit_report_phase
    Qc = (np.absolute(x_c + 1j*y_c) + radius)/2/radius*Qr # Ref: Gao Thesis
    Qi = Qr * Qc/(Qc - Qr)
    print Qi
    """
    fitphasecurve = [-theta0 + 2*np.arctan(2 * Qr * (1 - freq[i]/fr)) for i in range(0, n)]
    plt.plot(freq, phase_rotated)
    plt.plot(freq, fitphasecurve, 'r')
    plt.show()
    """
    #print "theta0", params['theta0'].value    
    #print "Temperature (mK)", MeasState[0], "fr from MagS21 (GHz)", MeasState[1], "fr from phase fit (GHz)", fr
    #print "Qr", Qr, "Qi", Qi, "Qc", Qc
    #print "Circle fit residue", circle_residue #, "Phase fit residue", result.residual
    a = 3.636
    alpha = 0.381
    tau = 0
    phi0 = theta0-np.arctan2(x_c, y_c)+rotate_angle + np.pi
    estimateparas = [a,alpha,tau,phi0,fr,Qr,Qc]
    
    a, a_err, alpha, alpha_err, tau, tau_err, phi0, phi0_err, fr, fr_err, Qr, Qr_err, Qc, Qc_err, sevenparafittingresult = Fitter.Fit_7para(freq, comp, estimateparas)
    sevenpara_result = a, a_err, alpha, alpha_err, tau, tau_err, phi0, phi0_err, fr, fr_err, Qr, Qr_err, Qc, Qc_err, sevenparafittingresult
    fit7paracurve = sevenpara_result[0]*np.exp(1j*sevenpara_result[2]) * np.exp(-2*np.pi*1j*freq*sevenpara_result[4]) * (1 - (sevenpara_result[10]/sevenpara_result[12]*np.exp(1j*sevenpara_result[6]))/(1 + 2*1j*sevenpara_result[10]*(freq-sevenpara_result[8])/sevenpara_result[8]))
    #plt.plot(real,imag)
    #plt.plot(fit7paracurve.real, fit7paracurve.imag, 'r')
    #plt.show()
    
    Qi = sevenpara_result[10] * sevenpara_result[12]/(sevenpara_result[12] - sevenpara_result[10])
    print Qi
    
    finalresult = []
    finalresult.append(MeasState[2])
    finalresult.append(MeasState[0])
    finalresult.append(MeasState[1])
    finalresult.append(fr/1e9)
    finalresult.append(fr_err/fr)
    finalresult.append(Qr)
    finalresult.append(Qr_err/Qr)
    finalresult.append(Qc)
    finalresult.append(Qi)
    finalresult.append(filename)
    
    return finalresult