{ "cells": [ { "cell_type": "code", "source": [ "# %matplotlib notebook\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.constants import speed_of_light" ], "outputs": [], "execution_count": 2, "metadata": {} }, { "cell_type": "code", "source": [ "def gaussian_spectrum(freq, bw):\n", " omega = 2 * np.pi * freq\n", " sigma = np.pi * bw / np.sqrt(np.log(2)) # from the paper\n", " return np.pi**(-1/4) * sigma**(-1/2) * np.exp(-omega**2 / (2 * sigma**2))\n", "\n", "def gaussian_wavepacket(t, ampl, dt):\n", " return ampl * np.exp(-t**2/(4*dt**2))\n", "\n", "# def gaussian_after_dispersion(ampl, t, dt, gdd):\n", "# envelope = np.exp(-t**2 / (4* (dt**2 - 1j*gdd/2)))\n", "# # phase_term = np.exp(1j * omega0 * t)\n", "# return ampl * envelope * phase_term\n", "\n", "# def t_width_after_dispersion(dt, gdd):\n", "# return np.sqrt(t_width**2 + (1/2 * gdd / dt)**2)\n", "\n", "def fiber_dispersion(freq, GDD):\n", " omega = 2 * np.pi * freq\n", " return np.exp(1j* 0.5 * GDD * omega**2)\n", "\n", "def quadratic_phase(time, GDD):\n", " return np.exp(1j *0.5* time**2 / GDD)\n", "\n", "def FWHM(X,Y):\n", " half_max = max(Y) / 2.\n", " d = np.sign(half_max - np.array(Y[0:-1])) - np.sign(half_max - np.array(Y[1:]))\n", " left_idx = np.where(d > 0)[0]\n", " right_idx = np.where(d < 0)[-1]\n", " return X[right_idx] - X[left_idx] # return the difference (full width half max)" ], "outputs": [], "execution_count": 115, "metadata": {} }, { "cell_type": "code", "source": [ "bw = 401e9\n", "GDD = 9.909 * 1e-12**2 # ps**2\n", "\n", "freq_vec, df = np.linspace(-1e13, 1e13, int(1e5+1), retstep = True)\n", "spectrum = gaussian_spectrum(freq_vec, bw)\n", "pulse = np.fft.fft(spectrum)\n", "\n\n", "# Fiber dispersion\n", "spectrum_after_fiber = fiber_dispersion(freq_vec, GDD) * spectrum\n", "\n\n", "#FFT to time domain\n", "new_pulse = np.fft.fft(spectrum_after_fiber)\n", "time_vec = np.fft.fftfreq(spectrum.size, df)\n", "\n\n", "# Lens pulse\n", "lensed_pulse = np.abs(new_pulse)\n", "lensed_pulse2 = new_pulse * quadratic_phase(time_vec, GDD)\n", "\n\n", "# IFFT to frequency domain\n", "new_spectrum = np.fft.ifft(lensed_pulse)\n", "new_spectrum2 = np.fft.ifft(lensed_pulse2)\n", "freq_vec2 = np.fft.fftfreq(lensed_pulse.size, np.abs(time_vec[0]-time_vec[1]))\n", "\n\n\n", "FWHM_spectrum = FWHM(freq_vec, np.abs(spectrum)**2)\n", "FWHM_new_spectrum = FWHM(freq_vec, np.abs(new_spectrum2)**2)\n", "\nprint(FWHM_spectrum/1e9, FWHM_new_spectrum/1e9, 'Compression factor:', FWHM_spectrum/FWHM_new_spectrum)" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[401.] [17.8] Compression factor: [22.52808989]\n" ] } ], "execution_count": 126, "metadata": {} }, { "cell_type": "code", "source": [ "plt.figure()\n", "plt.title('pulse spectrum')\n", "plt.subplot(1,3,1)\n", "plt.plot(freq_vec / 1e9, np.abs(spectrum)**2,'.' , label = 'input spectrum')\n", "plt.plot(freq_vec / 1e9, np.abs(spectrum_after_fiber)**2 ,'.', label = 'input pulse')\n", "plt.xlabel('frequency (GHz)')\n", "plt.xlim(-1e3, 1e3)\n", "plt.subplot(1,3,2)\n", "plt.plot(time_vec / 1e-12, np.abs(pulse)**2, '.', label = 'input pulse')\n", "# plt.plot(time_vec/1e-12, np.abs(new_pulse)**2, '.', label = 'new pulse')\n", "plt.xlabel('time(ps)')\n", "plt.xlim(-5, 5)\n", "plt.tight_layout()\n", "plt.subplot(1,3,3)\n", "plt.plot(time_vec/1e-12, np.abs(new_pulse)**2, '.', label = 'new pulse')\n", "plt.xlim(-100, 100)\n", "\n", "plt.figure()\n", "plt.plot(freq_vec/1e9, np.abs(new_spectrum2)**2 ,'.')\n", "plt.plot(freq_vec2/1e9, np.abs(new_spectrum)**2 ,'.')\n", "plt.xlim(-1e2, 1e2)\n", "# plt.title('pulse spectrum')\n", "# plt.subplot(1,2,1)\n", "# plt.plot(freq_vec / 1e9, np.abs(spectrum)**2,'.' , label = 'input spectrum')\n", "# plt.xlabel('frequency (GHz)')\n", "# plt.xlim(-1e3, 1e3)\n", "# plt.subplot(1,2,2)\n", "# plt.plot(time_vec / 1e-12, np.abs(pulse)**2 ,'.', label = 'input pulse')\n", "# plt.xlabel('time(ps)')\n", "# plt.xlim(-5, 5)\n", "# plt.tight_layout()\n", "\n", "# plt.plot(freq_vec2 / 1e9, np.abs(new_spectrum)**2 / np.max(np.abs(new_spectrum)**2), '.', label = 'new spectrum')\n", "\n", "# plt.plot(freq_vec2 / 1e9, np.abs(new_spectrum)**2 / np.max(np.abs(new_spectrum)**2), '.', label = 'new spectrum')\n", "# plt.plot(freq_vec2 / 1e9, np.abs(new_spectrum2)**2 / np.max(np.abs(new_spectrum2)**2), '.', label = 'new spectrum')\n", "# plt.xlim(-500, 500)\n", "# plt.xlabel('frequency (GHz)')\n", "# plt.legend()\n", "\n\n", "# plt.figure()\n", "# plt.title('temporal pulse shape')\n", "# plt.plot(time_vec / 1e-12, np.abs(pulse)**2 / np.max(np.abs(pulse)**2) ,'.', label = 'input pulse')\n", "# # plt.plot(time_vec / 1e-12, np.abs(lensed_pulse2)**2 / np.max(np.abs(lensed_pulse2)**2) ,'.', label = 'input pulse')\n", "# plt.plot(time_vec / 1e-12, np.abs(new_pulse)**2 / np.max(np.abs(new_pulse)**2), '.', label = 'new pulse')\n", "# plt.xlim(-5000, 5000)\n", "# plt.xlabel('time(ps)')\n", "# plt.legend()\n", "\n", "# plt.figure()\n", "# plt.title('spectral phase of new pulse')\n", "# plt.plot(time_vec / 1e-12, np.angle(new_pulse) ,'.', label = 'new pulse')\n", "\n", "# plt.xlim(-5000, 5000)\n", "# plt.xlabel('time(ps)')\n", "# plt.legend()" ], "outputs": [ { "output_type": "execute_result", "execution_count": 128, "data": { "text/plain": [ "(-100.0, 100.0)" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": [ "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\n" ] }, "metadata": { "needs_background": "light" } }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": [ "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\n" ] }, "metadata": { "needs_background": "light" } } ], "execution_count": 128, "metadata": {} }, { "cell_type": "code", "source": [ "comp_spectrum = new_spectrum[np.argsort(freq_vec2)]\n", "print(np.abs(comp_spectrum)**2 - np.abs(new_spectrum2)**2)" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[-6.89306224e-44 -9.93668561e-44 -6.93725700e-44 ... -5.54436200e-44\n", " -1.20193874e-43 -8.08921378e-44]\n" ] } ], "execution_count": 132, "metadata": {} }, { "cell_type": "code", "source": [ "freq_vec" ], "outputs": [ { "output_type": "execute_result", "execution_count": 37, "data": { "text/plain": [ "array([-1.00000e+13, -9.99998e+12, -9.99996e+12, ..., 9.99996e+12,\n", " 9.99998e+12, 1.00000e+13])" ] }, "metadata": {} } ], "execution_count": 37, "metadata": {} }, { "cell_type": "code", "source": [ "plt.figure()\n", "plt.plot(freq_vec)" ], "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n\n\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "
" ] }, "metadata": {} }, { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.7/site-packages/numpy/core/numeric.py:538: ComplexWarning: Casting complex values to real discards the imaginary part\n", " return array(a, dtype, copy=False, order=order)\n" ] }, { "output_type": "execute_result", "execution_count": 9, "data": { "text/plain": [ "(-50, 50)" ] }, "metadata": {} } ], "execution_count": 9, "metadata": {} }, { "cell_type": "code", "source": [], "outputs": [], "execution_count": null, "metadata": {} } ], "metadata": { "kernelspec": { "name": "python3", "language": "python", "display_name": "Python 3" }, "language_info": { "name": "python", "version": "3.7.3", "mimetype": "text/x-python", "codemirror_mode": { "name": "ipython", "version": 3 }, "pygments_lexer": "ipython3", "nbconvert_exporter": "python", "file_extension": ".py" }, "kernel_info": { "name": "python3" }, "nteract": { "version": "0.12.3" } }, "nbformat": 4, "nbformat_minor": 2 }