{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ipywidgets import interact\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "plt.style.use('seaborn-v0_8-darkgrid')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "ts = np.linspace(0, 1000, 100_000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "08e1430786414dbd84e39ca7a4a1748d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=2.0, description='wavelength', max=5.0, min=0.5, step=0.5), IntSlider(…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@interact(wavelength=(0.5,5,0.5), window=(50,500,50))\n",
    "def plot1(wavelength=2, window=200):\n",
    "    sinewave = np.sin(2*np.pi*ts/wavelength)\n",
    "    tophat = np.zeros_like(ts)\n",
    "    tophat[1500-window:1500+window] = 1\n",
    "\n",
    "    fff = np.fft.fftfreq(ts.size, d=1000 / 10_000)\n",
    "    fft = np.fft.fft(sinewave)\n",
    "\n",
    "    gft = np.fft.fft(tophat)\n",
    "    fgft = np.fft.fft(sinewave*tophat)\n",
    "\n",
    "    fig, axs = plt.subplots(figsize=(16,9), nrows=3, ncols=2)\n",
    "\n",
    "    axs[0, 0].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[0,0].plot(ts, sinewave)\n",
    "    axs[0,0].set_xlim(0, 30)\n",
    "\n",
    "    axs[0,1].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[0,1].plot(fff, abs(fft)**2, color='C5')\n",
    "    axs[0,1].set_xlim(-.5,.5)\n",
    "  \n",
    "    #axs[1,0].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[1,0].plot(ts, tophat)\n",
    "    axs[1,0].set_xlim(0, 30)\n",
    "\n",
    "    axs[1,1].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[1,1].plot(fff, abs(gft)**2, '.', markersize=2, color='C5')\n",
    "    axs[1,1].set_xlim(-.5, .5)\n",
    "\n",
    "    axs[2,0].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[2,0].plot(ts, sinewave*tophat, '.', markersize=2)\n",
    "    axs[2,0].set_xlim(0, 30)\n",
    "\n",
    "    axs[2,1].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[2,1].plot(fff, abs(fgft)**2, '.', color='C5', markersize=2)\n",
    "    axs[2,1].set_xlim(-.5, .5)\n",
    "\n",
    "    plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5d45da316aa8490080f3532086526343",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=2.0, description='wavelength', max=5.0, min=0.5, step=0.5), IntSlider(…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "@interact(wavelength=(0.5,5,0.5), window=(50,500,50), spacing=(50,500,50))\n",
    "def plot(wavelength=2, window=200, spacing=200):\n",
    "    sinewave = np.sin(2*np.pi*ts/wavelength)\n",
    "    tophat = np.zeros_like(ts)\n",
    "    tophat[1500-window:1500+window] = 1\n",
    "    comb = np.zeros_like(ts)\n",
    "    comb[::spacing] = 1\n",
    "\n",
    "    fff = np.fft.fftfreq(ts.size, d=1000 / 10_000)\n",
    "    fft = np.fft.fft(sinewave)\n",
    "    fftdf = pd.DataFrame({'freq': fff, 'amp': abs(fft)**2})\n",
    "    fftdf = fftdf[fftdf.freq.between(-.5,.5)].sort_values('freq')\n",
    "\n",
    "    gft = np.fft.fft(tophat)\n",
    "    gftdf = pd.DataFrame({'freq': fff, 'amp': abs(gft)**2})\n",
    "    gftdf = gftdf[gftdf.freq.between(-.5,.5)].sort_values('freq')\n",
    "\n",
    "    fgft = np.fft.fft(sinewave*tophat)\n",
    "    fgftdf = pd.DataFrame({'freq': fff, 'amp': abs(fgft)**2})\n",
    "    fgftdf = fgftdf[fgftdf.freq.between(-.5,.5)].sort_values('freq')\n",
    "\n",
    "    hft = np.fft.fft(comb)\n",
    "    hftdf = pd.DataFrame({'freq': fff, 'amp': abs(hft)**2})\n",
    "    hftdf = hftdf[hftdf.freq.between(-.5,.5)].sort_values('freq')\n",
    "    fghft = np.fft.fft(sinewave*comb * tophat)\n",
    "    fghftdf = pd.DataFrame({'freq': fff, 'amp': abs(fghft)**2})\n",
    "    fghftdf = fghftdf[fghftdf.freq.between(-.5,.5)].sort_values('freq')\n",
    "\n",
    "    fig, axs = plt.subplots(figsize=(16,9), nrows=5, ncols=2)\n",
    "\n",
    "    axs[0, 0].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[0,0].plot(ts, sinewave)\n",
    "    axs[0,0].set_xlim(0, 30)\n",
    "\n",
    "    axs[0,1].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[0,1].plot(fftdf.freq, fftdf.amp, color='C5')\n",
    "    axs[0,1].set_xlim(-.5,.5)\n",
    "  \n",
    "    axs[1,0].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[1,0].plot(ts, tophat)\n",
    "    axs[1,0].set_xlim(0, 30)\n",
    "\n",
    "    axs[1,1].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[1,1].plot(gftdf.freq, gftdf.amp, color='C5')\n",
    "    axs[1,1].set_xlim(-.5, .5)\n",
    "\n",
    "    axs[2,0].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[2,0].plot(ts, sinewave*tophat, )\n",
    "    axs[2,0].set_xlim(0, 30)\n",
    "\n",
    "    axs[2,1].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[2,1].plot(fgftdf.freq, fgftdf.amp, color='C5')\n",
    "    axs[2,1].set_xlim(-.5, .5)\n",
    "\n",
    "    axs[3,0].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[3,0].plot(ts, comb, )\n",
    "    axs[3,0].set_xlim(0, 30)\n",
    "\n",
    "    axs[3,1].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[3,1].plot(hftdf.freq, hftdf.amp, color='C5')\n",
    "    axs[3,1].set_xlim(-.5, .5)\n",
    "\n",
    "    axs[4,0].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[4,0].plot(ts, sinewave*tophat*comb,)\n",
    "    axs[4,0].set_xlim(0, 30)\n",
    "\n",
    "    axs[4,1].tick_params( left=False, right=False, labelleft=False, labelbottom=False, bottom=False)\n",
    "    axs[4,1].plot(fghftdf.freq, fghftdf.amp, color='C5')\n",
    "    axs[4,1].set_xlim(-.5, .5)\n",
    "    plt.tight_layout()"
   ]
  },
  {
   "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.11.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
