{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-23T11:26:50.137170Z",
     "start_time": "2018-10-23T11:26:50.024678Z"
    }
   },
   "outputs": [],
   "source": [
    "import snlay as sn \n",
    "import numpy as np \n",
    "from scipy import interpolate\n",
    "\n",
    "\n",
    "#make a materials dictionary\n",
    "matsdict = {\n",
    "  1: './materials/gold.dat',\n",
    "  2: './materials/silicon.dat',\n",
    "  3: './materials/silica.dat',\n",
    "  4: './materials/tio2.dat',\n",
    "  5: './materials/silver.dat'\n",
    "}\n",
    "\n",
    "def get_nk(datafile, wavelengths):\n",
    "    \"\"\"Reads the given file and returns the n+ik complex at\n",
    "    the given wavelength after suitable interpolation\n",
    "    :datafile: TODO\n",
    "    :wavelength: TODO\n",
    "    :returns: TODO\n",
    "    \"\"\"\n",
    "    rawdisp = np.loadtxt(datafile)\n",
    "    f_r = interpolate.interp1d(rawdisp[:,0], rawdisp[:,1])\n",
    "    f_i = interpolate.interp1d(rawdisp[:,0], rawdisp[:,2])\n",
    "    return f_r(wavelengths) + 1j*f_i(wavelengths)\n",
    "\n",
    "def nk_2_eps(n):\n",
    "    \"\"\"TODO: Docstring for nk_2_epsnk_2_eps.\n",
    "    :returns: complex epsilon given n and kappa \n",
    "    \"\"\"\n",
    "    eps_r = n.real**2 - n.imag**2\n",
    "    eps_i = 2*n.real*n.imag\n",
    "    return eps_r + 1j*eps_i\n",
    "\n",
    "def eps_2_nk(eps):\n",
    "    \"\"\"TODO: Docstring for nk_2_epsnk_2_eps.\n",
    "    :returns: complex epsilon given n and kappa \n",
    "    \"\"\"\n",
    "    modeps = np.abs(eps)\n",
    "    n_r = np.sqrt(0.5*(modeps + eps.real)) \n",
    "    n_i = np.sqrt(0.5*(modeps - eps.real)) \n",
    "    return n_r + 1j*n_i\n",
    "\n",
    "\n",
    "def LL_mixing(fH, n_H, n_L):\n",
    "    \"\"\"TODO: Docstring for brugg_mixingbrugg_mixing.\n",
    "    Given the volumne fraction of the higher index material, give the effective\n",
    "    index of the layer\n",
    "    :fH: volumne fraction from 0 to 1 \n",
    "    :n_H: ri  of the higher index material \n",
    "    :n_L: ri of the lower index material \n",
    "    :returns: TODO\n",
    "    \"\"\"\n",
    "    eH = nk_2_eps(n_H)\n",
    "    eL = nk_2_eps(n_L)\n",
    "    bigK = fH*(eH - 1)/(eH + 2) + (1 - fH)*(eL - 1)/(eL + 2)\n",
    "    e_eff = (1 + 2*bigK)/(1 - bigK)\n",
    "    return eps_2_nk(e_eff)\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-23T11:26:52.626198Z",
     "start_time": "2018-10-23T11:26:52.480239Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f9dcacb29e8>]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from jupyterthemes import jtplot\n",
    "jtplot.style(grid=False, fscale=0.8)\n",
    "\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "n_arr1 = np.array(  100*[1.45]                )\n",
    "n_arr2 = np.array(  100*[1.33]              )\n",
    "fracs = np.linspace(0,1, 101, endpoint=True)\n",
    "neff = np.array([LL_mixing(f, 2.5, 1.45 ) for f in fracs])\n",
    "plt.plot(fracs, neff.real)\n",
    "plt.plot(fracs, neff.imag)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-10-23T11:27:55.453162Z",
     "start_time": "2018-10-23T11:27:55.286316Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    },
    {
     "data": {
      "image/png": "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hYqIGKVQERGjFCoiYpRCRUSMUqiIiFEKFRExSqEiIkYpVETEKIWKiBilUBERoxQqImKULS8TM8GRkIzjlouj3YbIl4rDGnkk3LCh4lr2PBfDN2x7IjelWMdF4N8jW4eZVgazLIuSkhJCoRCBQICKioohp1+J/3+foa9PIxWR68myYuGB+0a0DltCJScnh7q6OmpqatiwYQNOp5NgMHjV6VdsrD9IuL/PjvZE5CpiY6yRr8NAH5/jdrupr68HwOfz4XK5CAaDV53+aZZ1aaPWrVtnR2siEgXLsujrG95/6raEit/vx+Px0NjYiMvlIhAIDDn904LBIGVlZcPeIBEZGcuyrroHEQ1HWlpa2GA/AMTFxVFcXExPTw/d3d3ExcVRWVmJz+cbNP3tt982XVpERpktoSIiX166+E1EjFKoiIhRo351WUxMDI899hhHjx6lsbGRJUuW4HA4eO+992hubqawsJCEhATi4uIoKytjYGBg2LXS09O59957+eSTT2hoaODs2bO21gNYtWoVTqeTQCDAsWPHbK03b9487rjjDgCysrLYunWrrfXcbjfFxcV0dnbS09PD/v37bavn9XopLCykq6uLM2fOcPjwYb797W8zMDBAVVUVhw4dIi8vD6/XS0JCAn/+85+HdbAxKSmJwsJCUlJSeO6555gzZ84XbtOECRO4//77CYVCNDY28u9/R3/x2Gfr3X777SxatIj6+nreffddAFvrrVmzhnHjxpGUlMRrr72Gz+cbcb1bPB7P/0TdkQ2+9a1v0dzcjGVZ3H777Wzbto1Dhw5x3333ceLECTIyMigvLycpKYnk5GTOnDkz7Foej4cZM2bQ29vLxx9/zPLly22tt2DBAubOnUswGKStrY1FixbZWu/cuXMcPHiQUChET08PCxYssLXezJkzCYVC7Ny5k9zcXGbPnm1bvbvuuotDhw7x/vvvk5eXR2pqKm+99Rb/+c9/KCoqoqamhvz8fLZt20YoFOKrX/0qJ06cuOY6oVCIAwcOkJ2dTVVVFffff/8XblNWVhZVVVV89NFHrFq1iqqqqmHXO336NIFAAJfLRUNDA26329Z6H3/8MQcOHKCvr49p06bR1dU14nqjuvszd+5curu7aWtrA+CWW26hv7+fUChEXFwcLpeLjo4O4NIXxuPxjKjef//7X373u99RXl7OypUrba+XkpJCU1MTO3bsICMjg7i4OFvrXZabm8vu3btt377m5mYWLFjAD37wA06dOmVrvT179nDbbbexZs0axo8fz8SJE+ns7AQgHA4zYcIEurq6jG3bZdFsk9vtjky7cOEC8fHxRmoD16VeQkICd955JzU1NUbqjeruT2ZmJnFxcWRmZpKYmMjAwAAxMTHExsbS29uL3+/H7XYDl0YZPp/PSN2LFy9d/m93PZ/PR0zMpdzu6ekhPj7e9u1LSkrC4XDg9/tt377Fixeza9cuDh8+zIYNG0hISLCt3vnz5/nLX/4CwOOPP05nZyeJiYl0dXXhcDg4f/48EyZMMLZtl0XzN3Q6nXg8Hjo7O0lISCAUChmpDdheLykpiaKiIt544w16enqM1LshTimnp6eTmppKU1MTixYtIiYmhn/+8580NTVx7733YlkWCQkJIz4GsHDhQrKysrAsi6NHj3Lu3Dlb61mWRXFxMcFgkIGBAerq6mytB3DPPfdw/Phxjhw5Qnp6uq31UlJSWL16NZ2dnViWxZ49e2yr53a7ueeee4iNjaWuro5Tp05RUFBAf38/tbW1HDx4kGXLljFp0iScTuewj6lYlkVRURFZWVkcOnSI6urqL9ymCRMmsGbNGi5cuMDJkyfZvXv3sOvV1NSQl5dHYmIiH374IXv27LG1XmpqKufOnaO7u5t9+/Zx+PDhEde7IUJFRG4eOqUsIkYpVETEKIWKiBilUBERoxQqY9yDDz7IzJkzAVi6dClPPPFEZN5Pf/rTEa//oYceYurUqSNez8SJE8nIyIj8/pOf/GTI5RMTEykuLh52PbfbTVFR0bA/L8OnUBnjGhsbmT17NgCpqamRU7aTJk2ivb19NFsbZOLEiWRmZka9/JIlS9i7d++w6/l8PpKSkhg3btyw1yHDM+r3/sjINDQ0sGLFCgDi4+M5efIkXq+X1NRUGhoaANi4cSMulwuHw8HLL79McnIyixcv5rXXXgPgxz/+Mc8//zwZGRmsWLGCmJgY3n//faqrqwfV+u53v8vUqVMZGBigtLQUv9/Pz372MxoaGkhNTeXdd99l7969TJ8+nfXr10cewvXee+/xjW98g9mzZ5OamspLL72EZVmsX79+0Oc+LSMjI/IM46effpqGhgbS0tI4deoU5eXlLFq0iMzMTOLj4xk3bhz/+te/+PrXv47D4eA3v/kNAwMDHDt2jMzMTGpqamz9N5DBNFIZ406fPk1KSgpOp5Pu7u7IyGXmzJk0NjYCsH37dl544YXIl7upqYnp06cTExPDrFmzaGpqIhwOs3LlSjZv3swvf/lL7r77bhwOR6TObbfdRk9PD7/61a/YuXMnBQUFACQnJ/PGG2+wadMm7r77buDSTZQvv/wyL774IuPHjwfgww8/pKamhhdeeIFgMHjFz32aZVmEw/9/CVVdXR2bNm1ixowZJCQkAJfuY/n973/PsWPHmDVrFps3b6alpYW5c+cC0N7eTkpKig1/dRmKRipjXDgcpquri+zsbJqamjhx4gSrVq1i2rRp/PWvf8XhcPCd73yHadOmYVkWLS0tABw9epR58+Yxf/58qqurSUxMZPLkyfzwhz8EYNy4cSQmJkbqpKSkkJ2dzZw5cwAil8GfPXuWCxcuAERuSUhKSorcz9Xc3HzFvq/0uc9u16edPHkSuHTZutPpBOCTTz4BIBAIRC4dDwQCkfmfDkW5fhQqN4ETJ06Ql5fH1q1b6e7uxuPx4HA46O3tZcaMGSQmJrJp0yZycnJYsGABAFVVVSxfvhyv18vrr7+Ow+GgtbWVzZs309/fT0xMzKBL6ltbW6mpqYk8AvRKQXBZZ2cnU6ZMoa2tjRkzZlBbWxtZZ7QuXryIw+H4XLjAF4fF5fmTJk2itbU16ppihnZ/bgINDQ1MnjyZ06dPA0Tu0YBLYZCcnMyTTz5Jenp65DMtLS1Mnz6d48ePA5dGBhUVFTz55JM89dRTPPzww4NqHDhwgPHjx/PUU0/xox/9iLvuuuuq/fz973/n4Ycf5vHHH+fChQv09/dz6tQpZsyYwaOPPhrVwdMjR44wa9asa/5bfNqcOXM4fPjwiNYh1073/ohxl0c5DoeDp59+mi1btkQeUxCtxMREVq5cGTmYfK3cbjfLly/n9ddfH9bnZfgUKmJcWloahYWFxMfHs2/fviHfRCk3H4WKiBilYyoiYpRCRUSMUqiIiFEKFRExSqEiIkYpVETEqP8DeeMyb382/hsAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 288x216 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "import numpy as np\n",
    "import pylab as plt\n",
    "from tmm import coh_tmm\n",
    "from numpy import pi, linspace, inf, array\n",
    "from scipy.interpolate import interp1d\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from jupyterthemes import jtplot\n",
    "# # # #currently installed theme will be used to\n",
    "# # # #set plot style if no arguments provided\n",
    "jtplot.style(grid=False, fscale=0.7)\n",
    "# \"5 * degree\" is 5 degrees expressed in radians\n",
    "# \"1.2 / degree\" is 1.2 radians expressed in degrees\n",
    "degree = pi/180\n",
    "#index of refraction of my material: wavelength in nm versus index.\n",
    "d_list = [inf,300,inf] #in nm\n",
    "lambda_list = linspace(400,1200,400) #in nm\n",
    "T_list = []\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "for lambda_vac in lambda_list:\n",
    "    n_list = [1, 1.33, 1.33]\n",
    "    T_list.append(coh_tmm('s',n_list,d_list,0*degree,lambda_vac)['R'])\n",
    "plt.figure(figsize=(4,3))\n",
    "plt.plot(lambda_list,T_list)\n",
    "plt.xlim([400,1200])\n",
    "plt.ylim([0,1])\n",
    "plt.xlabel('Wavelength (nm)')\n",
    "plt.ylabel('Reflection')\n",
    "#plt.spines['top'].set_visible(False)\n",
    "#plt.spines['right'].set_visible(False)\n",
    "plt.show()\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}