{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Synthetic seismic\nThis example shows how to use the :py:mod:`pylops.utils.seismicevents` module\nto quickly create synthetic seismic data to be used for toy examples and tests.\n\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import numpy as np\nimport matplotlib.pyplot as plt\n\nimport pylops\n\nplt.close('all')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Let's first define the time and space axes as well as some auxiliary input\nparameters that we will use to create a Ricker wavelet\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "par = {'ox':-200, 'dx':2, 'nx':201,\n       'oy':-100, 'dy':2, 'ny':101,\n       'ot':0, 'dt':0.004, 'nt':501,\n       'f0': 20, 'nfmax': 210}\n\n# Create axis\nt, t2, x, y = pylops.utils.seismicevents.makeaxis(par)\n\n# Create wavelet\nwav = pylops.utils.wavelets.ricker(np.arange(41) * par['dt'],\n                                   f0=par['f0'])[0]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "We want to create a 2d data with a number of crossing linear events using the\n:py:func:`pylops.utils.seismicevents.linear2d` routine.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "v = 1500\nt0 = [0.2, 0.7, 1.6]\ntheta = [40, 0, -60]\namp = [1., 0.6, -2.]\n\nmlin, mlinwav = pylops.utils.seismicevents.linear2d(x, t, v, t0,\n                                                    theta, amp, wav)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "We can also create a 2d data with a number of crossing parabolic events using the\n:py:func:`pylops.utils.seismicevents.parabolic2d` routine.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "px = [0, 0, 0]\npxx = [1e-5, 5e-6, 1e-6]\n\nmpar, mparwav = pylops.utils.seismicevents.parabolic2d(x, t, t0, px,\n                                                       pxx, amp, wav)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "And similarly we can create a 2d data with a number of crossing hyperbolic\nevents using the :py:func:`pylops.utils.seismicevents.hyperbolic2d` routine.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "vrms = [500, 700, 1700]\n\nmhyp, mhypwav = pylops.utils.seismicevents.hyperbolic2d(x, t, t0,\n                                                        vrms, amp, wav)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "We can now visualize the different events\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# sphinx_gallery_thumbnail_number = 2\nfig, axs = plt.subplots(1, 3, figsize=(9, 5))\naxs[0].imshow(mlinwav.T, aspect='auto', interpolation='nearest',\n              vmin=-2, vmax=2, cmap='gray',\n              extent=(x.min(), x.max(), t.max(), t.min()))\naxs[0].set_title('Linear events', fontsize=12, fontweight='bold')\naxs[0].set_xlabel(r'$x(m)$')\naxs[0].set_ylabel(r'$t(s)$')\naxs[1].imshow(mparwav.T, aspect='auto', interpolation='nearest',\n              vmin=-2, vmax=2, cmap='gray',\n              extent=(x.min(), x.max(), t.max(), t.min()))\naxs[1].set_title('Parabolic events', fontsize=12, fontweight='bold')\naxs[1].set_xlabel(r'$x(m)$')\naxs[1].set_ylabel(r'$t(s)$')\naxs[2].imshow(mhypwav.T, aspect='auto', interpolation='nearest',\n              vmin=-2, vmax=2, cmap='gray',\n              extent=(x.min(), x.max(), t.max(), t.min()))\naxs[2].set_title('Hyperbolic events', fontsize=12, fontweight='bold')\naxs[2].set_xlabel(r'$x(m)$')\naxs[2].set_ylabel(r'$t(s)$')\nplt.tight_layout()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Let's finally repeat the same exercise in 3d\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "phi = [20, 0, -10]\n\nmlin, mlinwav = \\\n    pylops.utils.seismicevents.linear3d(x, y, t, v, t0,\n                                        theta, phi, amp, wav)\n\nfig, axs = plt.subplots(1, 2, figsize=(7, 5), sharey=True)\nfig.suptitle('Linear events in 3d', fontsize=12,\n             fontweight='bold', y=0.95)\naxs[0].imshow(mlinwav[par['ny']//2].T, aspect='auto',\n              interpolation='nearest', vmin=-2, vmax=2,\n              cmap='gray', extent=(x.min(), x.max(), t.max(), t.min()))\naxs[0].set_xlabel(r'$x(m)$')\naxs[0].set_ylabel(r'$t(s)$')\naxs[1].imshow(mlinwav[:, par['nx']//2].T, aspect='auto',\n              interpolation='nearest', vmin=-2, vmax=2,\n              cmap='gray', extent=(y.min(), y.max(), t.max(), t.min()))\naxs[1].set_xlabel(r'$y(m)$')\n\nmhyp, mhypwav = \\\n    pylops.utils.seismicevents.hyperbolic3d(x, y, t, t0, vrms, vrms, amp, wav)\n\nfig, axs = plt.subplots(1, 2, figsize=(7, 5), sharey=True)\nfig.suptitle('Hyperbolic events in 3d', fontsize=12,\n             fontweight='bold', y=0.95)\naxs[0].imshow(mhypwav[par['ny']//2].T, aspect='auto',\n              interpolation='nearest', vmin=-2, vmax=2,\n              cmap='gray', extent=(x.min(), x.max(), t.max(), t.min()))\naxs[0].set_xlabel(r'$x(m)$')\naxs[0].set_ylabel(r'$t(s)$')\naxs[1].imshow(mhypwav[:, par['nx']//2].T, aspect='auto',\n              interpolation='nearest', vmin=-2, vmax=2,\n              cmap='gray', extent=(y.min(), y.max(), t.max(), t.min()))\naxs[1].set_xlabel(r'$y(m)$');"
      ]
    }
  ],
  "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.6.12"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}