import numpy as np
import cmath
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import calc_sensitivity as cs
import nominal_param_values as npv

# plot diffraction efficiencies vs open fraction for vdw and non-vdw models

f = np.linspace(0.01, 0.99, 20)
e0 = np.zeros(f.size)
e1 = np.zeros(f.size)
e0_vdw = np.zeros(f.size)
e1_vdw = np.zeros(f.size)

for i in range(f.size):

    e0[i] = f[i]
    e1[i] = f[i] * np.sin(np.pi * f[i]) / (np.pi * f[i])
    e0_vdw[i] = cmath.polar(cs.calc_diffraction_eff_vdw(0, f[i], npv.d_nom, npv.l_nom, npv.v_nom, npv.C3_nom)[0])[0]
    e1_vdw[i] = cmath.polar(cs.calc_diffraction_eff_vdw(1, f[i], npv.d_nom, npv.l_nom, npv.v_nom, npv.C3_nom)[0])[0]

l1, l2, l3, l4 = plt.plot(f,e0,'bo',    f,e1,'ro',    f,e0_vdw,'bs',     f,e1_vdw,'rs')
plt.xlabel("grating open fraction")
plt.ylabel("|diffraction efficiency|")
plt.legend((l1, l2, l3, l4), ("no vdw, n=0", "no vdw, n=1", "vdw, n=0", "vdw, n=1"), loc='upper left')
plt.show()

from matplotlib import cm
import calc_sensitivity as cs
import nominal_param_values as npv

# plot sensitivity vs g1 and g2 open fractions for a given velocity and grating period

f1 = np.linspace(0.3,0.95,11)
f2 = np.linspace(0.3,0.95,11)
F1, F2 = np.meshgrid(f1,f2)
S = np.zeros([f2.size,f1.size], dtype = np.float)

for i in range(f1.size):
    for j in range(f2.size):

        # calculate diffraction efficiencies
        e0_g1 = cmath.polar(cs.calc_diffraction_eff_vdw(0, f1[i], npv.d_nom, npv.l_nom, npv.v_nom, npv.C3_nom)[0])[0]
        e1_g1 = cmath.polar(cs.calc_diffraction_eff_vdw(1, f1[i], npv.d_nom, npv.l_nom, npv.v_nom, npv.C3_nom)[0])[0]
        e1_g2 = cmath.polar(cs.calc_diffraction_eff_vdw(1, f2[j], npv.d_nom, npv.l_nom, npv.v_nom, npv.C3_nom)[0])[0]

        # calculate signal
        signal = 4.0*npv.I_inc_nom*0.23*(e0_g1*e1_g1*e1_g2)**2 / (e0_g1**2 + e1_g1**2)

        # calculate sensitivity
        S[j][i] = npv.v_nom*npv.d_nom / (4.0*np.pi*npv.L_nom**2*np.sqrt(signal))


fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(F1, F2, S, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=True)
plt.ticklabel_format(style='sci', axis='z', scilimits=(0,0))
ax.set_xlabel("g1 open fraction")
sig2 = np.zeros(f.size)
sig1_novdw = np.zeros(f.size)
sig2_novdw = np.zeros(f.size)

d = 100.0e-9
v = 1000.0

print "making graphs"

# calculate signal vs f
for i in range(f.size):

    # WITH vdW 

    # calculate diffraction efficiencies
    e0_g1 = cmath.polar(cs.calc_diffraction_eff_vdw(0, f[i], d, 150.0e-9, v, 4.8e-49)[0])[0]
    e1_g1 = cmath.polar(cs.calc_diffraction_eff_vdw(1, f[i], d, 150.0e-9, v, 4.8e-49)[0])[0]
    e1_g2 = e1_g1

    # calculate the bracketted terms
    sig1[i] = (e0_g1*e1_g1)**2 / (e0_g1**2 + e1_g1**2)
    sig2[i] = e1_g2**2

    # WITHOUT vdW

    # calculate diffraction efficiencies
    e0_g1 = cmath.polar(cs.calc_diffraction_eff_vdw(0, f[i], d, 150.0e-9, v, 0.0)[0])[0]
    e1_g1 = cmath.polar(cs.calc_diffraction_eff_vdw(1, f[i], d, 150.0e-9, v, 0.0)[0])[0]
    e1_g2 = e1_g1

    # calculate the bracketted terms