{
  "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"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import matplotlib.pyplot as plt\nimport numpy as np\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 = {\n    \"ox\": -200,\n    \"dx\": 2,\n    \"nx\": 201,\n    \"oy\": -100,\n    \"dy\": 2,\n    \"ny\": 101,\n    \"ot\": 0,\n    \"dt\": 0.004,\n    \"nt\": 501,\n    \"f0\": 20,\n    \"nfmax\": 210,\n}\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\"], 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, 0.6, -2.0]\n\nmlin, mlinwav = pylops.utils.seismicevents.linear2d(x, t, v, t0, 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, 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, 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(\n    mlinwav.T,\n    aspect=\"auto\",\n    interpolation=\"nearest\",\n    vmin=-2,\n    vmax=2,\n    cmap=\"gray\",\n    extent=(x.min(), x.max(), t.max(), t.min()),\n)\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(\n    mparwav.T,\n    aspect=\"auto\",\n    interpolation=\"nearest\",\n    vmin=-2,\n    vmax=2,\n    cmap=\"gray\",\n    extent=(x.min(), x.max(), t.max(), t.min()),\n)\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(\n    mhypwav.T,\n    aspect=\"auto\",\n    interpolation=\"nearest\",\n    vmin=-2,\n    vmax=2,\n    cmap=\"gray\",\n    extent=(x.min(), x.max(), t.max(), t.min()),\n)\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 = pylops.utils.seismicevents.linear3d(\n    x, y, t, v, t0, theta, phi, amp, wav\n)\n\nfig, axs = plt.subplots(1, 2, figsize=(7, 5), sharey=True)\nfig.suptitle(\"Linear events in 3d\", fontsize=12, fontweight=\"bold\", y=0.95)\naxs[0].imshow(\n    mlinwav[par[\"ny\"] // 2].T,\n    aspect=\"auto\",\n    interpolation=\"nearest\",\n    vmin=-2,\n    vmax=2,\n    cmap=\"gray\",\n    extent=(x.min(), x.max(), t.max(), t.min()),\n)\naxs[0].set_xlabel(r\"$x(m)$\")\naxs[0].set_ylabel(r\"$t(s)$\")\naxs[1].imshow(\n    mlinwav[:, par[\"nx\"] // 2].T,\n    aspect=\"auto\",\n    interpolation=\"nearest\",\n    vmin=-2,\n    vmax=2,\n    cmap=\"gray\",\n    extent=(y.min(), y.max(), t.max(), t.min()),\n)\naxs[1].set_xlabel(r\"$y(m)$\")\n\nmhyp, mhypwav = pylops.utils.seismicevents.hyperbolic3d(\n    x, y, t, t0, vrms, vrms, amp, wav\n)\n\nfig, axs = plt.subplots(1, 2, figsize=(7, 5), sharey=True)\nfig.suptitle(\"Hyperbolic events in 3d\", fontsize=12, fontweight=\"bold\", y=0.95)\naxs[0].imshow(\n    mhypwav[par[\"ny\"] // 2].T,\n    aspect=\"auto\",\n    interpolation=\"nearest\",\n    vmin=-2,\n    vmax=2,\n    cmap=\"gray\",\n    extent=(x.min(), x.max(), t.max(), t.min()),\n)\naxs[0].set_xlabel(r\"$x(m)$\")\naxs[0].set_ylabel(r\"$t(s)$\")\naxs[1].imshow(\n    mhypwav[:, par[\"nx\"] // 2].T,\n    aspect=\"auto\",\n    interpolation=\"nearest\",\n    vmin=-2,\n    vmax=2,\n    cmap=\"gray\",\n    extent=(y.min(), y.max(), t.max(), t.min()),\n)\naxs[1].set_xlabel(r\"$y(m)$\")\nplt.tight_layout()"
      ]
    }
  ],
  "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.9.15"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}