Skip to content
Snippets Groups Projects
Virtual spectrometer SCS Viking.ipynb 73.8 KiB
Newer Older
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6386344d-b7ac-440d-9926-f03af4ff9d6f",
   "metadata": {},
   "source": [
    "# Training the Virtual Spectrometer with Viking and PES data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1711c3b9-5065-4a44-8b1b-a3e861b92bc5",
   "metadata": {},
   "source": [
    "The objective here is to use the Viking detector to train the Virtual Spectrometer. This means that we will fit (\"train\") a model, which maps the PES measurements with the Viking measurements and use their correlation to interpolate in cases where the Viking is not available.\n",
    "\n",
    "The following conditions must be satisfied for this to be possible:\n",
    "* The PES settings are the same in the \"training\" run and interesting run.\n",
    "* The photon energies of the beam in \"training\" and in the interesting run are similar.\n",
    "* The beam intensities are similar.\n",
    "* The sample between PES and Viking is transparent.\n",
    "* 1 pulse trains in \"training\".\n",
    "\n",
    "The following software implements:\n",
    "1. retrieve data and calibrate Viking using the SCS toolbox;\n",
    "2. the Virtual Spectrometer training excluding the last 10 trains avalable so that we can use them for validation;\n",
    "3. the Virtual Spectrometer resolution function plotting;\n",
    "4. comparison of the Virtual spectrometer results in a selected set in which the Viking data was available.\n",
    "\n",
    "Finally, the model is applied in data without the grating. This last part may be applied independently from the rest if the modal has been written in a `joblib` file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4a627555-522a-4c9d-b6b2-6ff77148eaab",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "# replace this\n",
    "sys.path.append('/home/danilo/scratch/karabo/devices/pes_to_spec')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "78bbc433-ac5e-44c3-8740-3e93800c4532",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cupy is not installed in this environment, no access to the GPU\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import dask.array as da\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from pes_to_spec.model import Model\n",
    "\n",
    "import toolbox_scs as tb\n",
    "from euxfel_bunch_pattern import indices_at_sase\n",
    "\n",
    "from scipy.signal import fftconvolve"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7609899-5bc0-4211-ae97-010b3edcf676",
   "metadata": {},
   "source": [
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "95da5231-e454-4f7f-a1ce-eef7e52fe457",
   "metadata": {},
   "outputs": [],
   "source": [
    "# pes channel names to be used for reference later\n",
    "pes_map = dict(channel_1_A=\"PES_S_raw\",\n",
    "                channel_1_B=\"PES_SSW_raw\",\n",
    "                channel_1_C=\"PES_SW_raw\",\n",
    "                channel_1_D=\"PES_WSW_raw\",\n",
    "                channel_2_A=\"PES_W_raw\",\n",
    "                channel_2_B=\"PES_WNW_raw\",\n",
    "                channel_2_C=\"PES_NW_raw\",\n",
    "                channel_2_D=\"PES_NNW_raw\",\n",
    "                channel_3_A=\"PES_E_raw\",\n",
    "                channel_3_B=\"PES_ESE_raw\",\n",
    "                channel_3_C=\"PES_SE_raw\",\n",
    "                channel_3_D=\"PES_SSE_raw\",\n",
    "                channel_4_A=\"PES_N_raw\",\n",
    "                channel_4_B=\"PES_NNE_raw\",\n",
    "                channel_4_C=\"PES_NE_raw\",\n",
    "                channel_4_D=\"PES_ENE_raw\",\n",
    "               )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "48bb4c8c-04ad-44d5-b123-643ce3253ceb",
   "metadata": {},
   "outputs": [],
   "source": [
    "proposal = 2953\n",
    "runTrain = 322  # run containing the data without sample\n",
    "darkNB = 375  # dark run"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0a467b2f-5f99-4ed8-bb1d-cb429454d3ce",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "newton: only 50.0% of trains (629 out of 1259) contain data.\n"
     ]
    }
   ],
   "source": [
    "v = tb.Viking(proposal)\n",
    "fields = ['XTD10_SA3',\n",
    "          *list(pes_map.values()) # add PES\n",
    "         ]\n",
    "v.FIELDS += fields\n",
    "v.X_RANGE = slice(0, 1500) # define the dispersive axis range of interest (in pixels)\n",
    "v.Y_RANGE = slice(29, 82) # define the non-dispersive axis range of interest (in pixels)\n",
    "v.ENERGY_CALIB = [1.47802667e-06, 2.30600328e-02, 5.15884589e+02] # energy calibration, see further below\n",
    "v.BL_POLY_DEG = 1 # define the polynomial degree for baseline subtraction\n",
    "v.BL_SIGNAL_RANGE = [500, 545] # define the range containing the signal, to be excluded for baseline subtraction\n",
    "\n",
    "v.load_dark(darkNB)  # load a dark image (averaged over the dark run number)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4f6124d9-8c1b-44f8-a078-07475a9674fc",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "data_train = v.from_run(runTrain)  # load refNB. The `newton` variable contains the CCD images.\n",
    "v.integrate(data_train)  # integrate over the non-dispersive dimension \n",
    "v.removePolyBaseline(data_train)  # remove baseline\n",
    "data_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "294b5f3a-1d59-444e-80ab-4834d26d62dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# transform PES data into the format expected\n",
    "pes_data = {k: da.from_array(data_train[item].to_numpy())\n",
    "            for k, item in pes_map.items() if item in data_train}\n",
    "xgm = data_train.XTD10_SA3.isel(sa3_pId=0).to_numpy()[:, np.newaxis]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b477bf49-f5ca-4df0-b6ed-a270ee35cd28",
   "metadata": {},
   "outputs": [],
   "source": [
    "channels = tuple(pes_data.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8f154e38-d208-477e-9d9c-ef2a632514c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "energy = data_train.newt_x.to_numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0c5ff2a0-0737-417d-9f57-158d4fbd8090",
   "metadata": {},
   "outputs": [],
   "source": [
    "vik = data_train.spectrum.to_numpy()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "995e2ac0-1898-46dd-b95f-f65a24496871",
   "metadata": {},
   "source": [
    "## Train Virtual Spectrometer"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9cbf75c8-fbe0-42ec-af85-6194aede91f5",
   "metadata": {},
   "source": [
    "So far we have only done pre-processing due to experimental problems with some data not being available in certain train IDs.\n",
    "\n",
    "Let's finally take a look at the data before training the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63b35dac-ad50-4124-b6f8-e1ceea667b4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.plot(energy, vik[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d0b70fef-5e27-4cb1-90e7-2653989cf48a",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.plot(-pes_data[\"channel_1_A\"][0,31400:31700])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a6606c28-28c8-4d27-9f38-4a7ca88ee397",
   "metadata": {},
   "source": [
    "Now, let's fit the model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5690cf09-4fed-497d-a09d-0f3cdceea04d",
   "metadata": {},
   "outputs": [],
   "source": [
    "n_test = 10 # exclude some trains to validate the training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cb86aa32-dc1d-4684-bd62-25aa77a97245",
   "metadata": {},
   "outputs": [],
   "source": [
    "# exclude the last n_test train IDs so we can use them for validation later\n",
    "pes_train = {ch: pes_data[ch][:-n_test, :] for ch in pes_data.keys()}\n",
    "vik_train = vik[:-n_test, :]\n",
    "xgm_train = xgm[:-n_test,:]\n",
    "\n",
    "model = Model(channels=channels)\n",
    "model.fit(pes_train,\n",
    "          vik_train,\n",
    "          np.broadcast_to(energy, (vik_train.shape[0], vik_train.shape[-1])),\n",
    "          pulse_energy=xgm_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "52c038c5-d86e-4e5a-9214-5e1878dd77e8",
   "metadata": {},
   "source": [
    "The resolution of the Virtual Spectrometer relative to the Viking has also been estimated (in eV):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a084b920-0006-4859-80f9-ff81f3c1f6b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.resolution"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1f47e6e-3b62-4c8a-8573-8eb4bd40f2ff",
   "metadata": {},
   "source": [
    "We can look at the Virtual Spectrometer to Viking response function as well."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f752a9e0-8484-4381-8bb5-5eb27bd82670",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.figure(figsize=(12, 8))\n",
    "plt.plot(model.impulse_axis, model.impulse_response)\n",
    "plt.xlabel('Energy [eV]')\n",
    "plt.ylabel('Intensity [a.u.]')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3842cb23-a961-4a60-9e9e-d341256e1bb7",
   "metadata": {},
   "source": [
    "## Save model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4e612338-401e-4fd5-bef7-a6579af0d3d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save(\"VS_p5576_viking.joblib\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d7f95c2-e16d-43b2-a0c5-28a968490bb0",
   "metadata": {},
   "source": [
    "# Validation: Apply model in data not used in training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dc56d30b-7db8-49ce-82ed-d01d8b6670d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "pes_test = {ch: pes_data[ch][n_test:, :] for ch in pes_data.keys()}\n",
    "vik_test = vik[n_test:, :]\n",
    "xgm_test = xgm[n_test:,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0d8054bb-8ad6-4ee4-8d0c-8ac4ee990179",
   "metadata": {},
   "outputs": [],
   "source": [
    "vs_test = model.predict(pes_test, pulse_energy=xgm_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e087883a-43e3-4e19-9041-6740704d7df7",
   "metadata": {},
   "outputs": [],
   "source": [
    "vs_test[\"energy\"] = model.get_energy_values()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4f0861c-a124-4812-beb1-0b8cd56d89c1",
   "metadata": {},
   "source": [
    "Add Viking in the same dictionary for convinience. In practice this would not be done in inference: it is done here to validate the results obtained."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a5bd5573-afc9-45b3-9f25-7c713e08dfa9",
   "metadata": {},
   "outputs": [],
   "source": [
    "vs_test[\"viking\"] = vik_test"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e30cc51-41e0-4458-8867-f43605324fc6",
   "metadata": {},
   "source": [
    "Now we can plot it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "44e5df6a-dfc9-47ab-9f37-03fdd0687698",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot(data, i):\n",
    "    \"\"\"Plot prediction and expectation.\"\"\"\n",
    "    from matplotlib.gridspec import GridSpec\n",
    "    fig = plt.figure(figsize=(24, 8))\n",
    "    gs = GridSpec(1, 2)\n",
    "    ax = fig.add_subplot(gs[0, 0])\n",
    "    ax.plot(data[\"energy\"], data[\"viking\"][i], c='b', lw=3, label=\"Viking\")\n",
    "    ax.plot(data[\"energy\"], data[\"expected\"][i,0], c='r', ls='--', lw=3, label=\"Prediction\")\n",
    "    ax.fill_between(data[\"energy\"],\n",
    "                    data[\"expected\"][i,0] - data[\"residual\"][i,0],\n",
    "                    data[\"expected\"][i,0] + data[\"residual\"][i,0],\n",
    "                    facecolor='gold', alpha=0.5, label=\"68% unc.\")\n",
    "    ax.legend(frameon=False, borderaxespad=0, loc='upper left')\n",
    "    ax.spines['top'].set_visible(False)\n",
    "    ax.spines['right'].set_visible(False)\n",
    "    ax.set(\n",
    "            xlabel=\"Photon energy [eV]\",\n",
    "            ylabel=\"Intensity [a.u.]\",\n",
    "            title=\"Comparing with the original Viking\",\n",
    "    )\n",
    "    ax = fig.add_subplot(gs[0, 1])\n",
    "    viking_smooth = fftconvolve(data[\"viking\"][i], model.impulse_response, mode=\"same\")\n",
    "    ax.plot(data[\"energy\"], viking_smooth, c='b', lw=3, label=\"Viking (convolved to VS resolution)\")\n",
    "    ax.plot(data[\"energy\"], data[\"expected\"][i,0], c='r', ls='--', lw=3, label=\"Prediction\")\n",
    "    ax.fill_between(data[\"energy\"],\n",
    "                    data[\"expected\"][i,0] - data[\"residual\"][i,0],\n",
    "                    data[\"expected\"][i,0] + data[\"residual\"][i,0],\n",
    "                    facecolor='gold', alpha=0.5, label=\"68% unc.\")\n",
    "    ax.legend(frameon=False, borderaxespad=0, loc='upper left')\n",
    "    ax.spines['top'].set_visible(False)\n",
    "    ax.spines['right'].set_visible(False)\n",
    "    ax.set(\n",
    "            xlabel=\"Photon energy [eV]\",\n",
    "            ylabel=\"Intensity [a.u.]\",\n",
    "            title=\"Same, with smoothened Viking\",\n",
    "    )\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9bb6495-51db-4775-ba91-c7b936dc0b33",
   "metadata": {},
   "source": [
    "These are the last 10 train IDs, which were not used in training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c8ffc289-c10a-48bb-b1e0-1ebeb61880dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "plot(vs_test, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8c61b6fe-111f-4c2f-91b6-2fb83c56c9d7",
   "metadata": {},
   "outputs": [],
   "source": [
    "plot(vs_test, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "373ca950-0378-4d7d-96ca-57ad951ebbf3",
   "metadata": {},
   "outputs": [],
   "source": [
    "plot(vs_test, 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f0f3f20-060a-488a-9f61-6b4cb3cf1614",
   "metadata": {},
   "source": [
    "# Inference: Apply it in new data without Viking"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "377c6993-a1a4-45c7-ae6b-2b533d893b6f",
   "metadata": {},
   "source": [
    "The configuration for inference must be the same as in training. This can be checked as follows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "3aecfa9c-6335-4c92-9483-d2192ca159c1",
   "metadata": {},
   "outputs": [],
   "source": [
    "runTest = 321"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "9e2388e6-5b88-4c10-901b-1538d9fa0870",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pes_to_spec.config import VSConfig\n",
    "\n",
    "training_config = VSConfig.load(proposal, runTrain)\n",
    "inference_config = VSConfig.load(proposal, runTest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "8b916fa4-e1ef-43b0-93a5-0967892c2d70",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_u110</th>\n",
       "      <th>mean_u108</th>\n",
       "      <th>mean_u114</th>\n",
       "      <th>mean_u115</th>\n",
       "      <th>mean_u113</th>\n",
       "      <th>mean_u205</th>\n",
       "      <th>mean_u203</th>\n",
       "      <th>mean_u213</th>\n",
       "      <th>mean_u112</th>\n",
       "      <th>mean_u3</th>\n",
       "      <th>...</th>\n",
       "      <th>std_u206</th>\n",
       "      <th>std_u204</th>\n",
       "      <th>std_u201</th>\n",
       "      <th>std_u208</th>\n",
       "      <th>std_u209</th>\n",
       "      <th>std_u215</th>\n",
       "      <th>std_u104</th>\n",
       "      <th>pressure_mean</th>\n",
       "      <th>pressure_std</th>\n",
       "      <th>gas_active</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2249.998207</td>\n",
       "      <td>-78.010137</td>\n",
       "      <td>-0.10791</td>\n",
       "      <td>-120.001891</td>\n",
       "      <td>2249.992845</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.001</td>\n",
       "      <td>0.001089</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000763</td>\n",
       "      <td>0.000995</td>\n",
       "      <td>0.000626</td>\n",
       "      <td>0.002382</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>4.456064e-08</td>\n",
       "      <td>NITROGEN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1 rows × 65 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   mean_u110  mean_u108  mean_u114  mean_u115    mean_u113  mean_u205  \\\n",
       "0        0.0        0.0        0.0        0.0  2249.998207 -78.010137   \n",
       "\n",
       "   mean_u203   mean_u213    mean_u112  mean_u3  ...  std_u206  std_u204  \\\n",
       "0   -0.10791 -120.001891  2249.992845      0.0  ...     0.001  0.001089   \n",
       "\n",
       "   std_u201  std_u208  std_u209  std_u215  std_u104  pressure_mean  \\\n",
       "0       0.0  0.000763  0.000995  0.000626  0.002382       0.000001   \n",
       "\n",
       "   pressure_std  gas_active  \n",
       "0  4.456064e-08    NITROGEN  \n",
       "\n",
       "[1 rows x 65 columns]"
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "training_config.to_pandas()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "84ece2bd-c11a-42a5-9cd9-9f253c850562",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_u110</th>\n",
       "      <th>mean_u108</th>\n",
       "      <th>mean_u114</th>\n",
       "      <th>mean_u115</th>\n",
       "      <th>mean_u113</th>\n",
       "      <th>mean_u205</th>\n",
       "      <th>mean_u203</th>\n",
       "      <th>mean_u213</th>\n",
       "      <th>mean_u112</th>\n",
       "      <th>mean_u3</th>\n",
       "      <th>mean_u105</th>\n",
       "      <th>mean_u212</th>\n",
       "      <th>mean_u103</th>\n",
       "      <th>mean_u207</th>\n",
       "      <th>mean_u210</th>\n",
       "      <th>mean_u102</th>\n",
       "      <th>mean_u106</th>\n",
       "      <th>mean_u107</th>\n",
       "      <th>mean_u109</th>\n",
       "      <th>mean_u111</th>\n",
       "      <th>mean_u200</th>\n",
       "      <th>mean_u214</th>\n",
       "      <th>mean_u211</th>\n",
       "      <th>mean_u202</th>\n",
       "      <th>mean_u206</th>\n",
       "      <th>mean_u204</th>\n",
       "      <th>mean_u201</th>\n",
       "      <th>mean_u208</th>\n",
       "      <th>mean_u209</th>\n",
       "      <th>mean_u215</th>\n",
       "      <th>mean_u104</th>\n",
       "      <th>std_u110</th>\n",
       "      <th>std_u108</th>\n",
       "      <th>std_u114</th>\n",
       "      <th>std_u115</th>\n",
       "      <th>std_u113</th>\n",
       "      <th>std_u205</th>\n",
       "      <th>std_u203</th>\n",
       "      <th>std_u213</th>\n",
       "      <th>std_u112</th>\n",
       "      <th>std_u3</th>\n",
       "      <th>std_u105</th>\n",
       "      <th>std_u212</th>\n",
       "      <th>std_u103</th>\n",
       "      <th>std_u207</th>\n",
       "      <th>std_u210</th>\n",
       "      <th>std_u102</th>\n",
       "      <th>std_u106</th>\n",
       "      <th>std_u107</th>\n",
       "      <th>std_u109</th>\n",
       "      <th>std_u111</th>\n",
       "      <th>std_u200</th>\n",
       "      <th>std_u214</th>\n",
       "      <th>std_u211</th>\n",
       "      <th>std_u202</th>\n",
       "      <th>std_u206</th>\n",
       "      <th>std_u204</th>\n",
       "      <th>std_u201</th>\n",
       "      <th>std_u208</th>\n",
       "      <th>std_u209</th>\n",
       "      <th>std_u215</th>\n",
       "      <th>std_u104</th>\n",
       "      <th>pressure_mean</th>\n",
       "      <th>pressure_std</th>\n",
       "      <th>gas_active</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.002567</td>\n",
       "      <td>-0.003455</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.001019</td>\n",
       "      <td>0.002316</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000926</td>\n",
       "      <td>-0.001261</td>\n",
       "      <td>0.001064</td>\n",
       "      <td>-0.003332</td>\n",
       "      <td>-0.001361</td>\n",
       "      <td>0.000324</td>\n",
       "      <td>-0.000565</td>\n",
       "      <td>-0.000565</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.002359</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.000705</td>\n",
       "      <td>-0.000744</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.002291</td>\n",
       "      <td>-0.003028</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.000272</td>\n",
       "      <td>-0.000004</td>\n",
       "      <td>-0.001626</td>\n",
       "      <td>0.001178</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001599</td>\n",
       "      <td>0.001134</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000927</td>\n",
       "      <td>0.001987</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.003332</td>\n",
       "      <td>0.000681</td>\n",
       "      <td>0.003028</td>\n",
       "      <td>0.000873</td>\n",
       "      <td>0.000777</td>\n",
       "      <td>0.002459</td>\n",
       "      <td>0.002144</td>\n",
       "      <td>0.002144</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001425</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000929</td>\n",
       "      <td>0.000788</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001</td>\n",
       "      <td>0.001089</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000763</td>\n",
       "      <td>0.000995</td>\n",
       "      <td>0.000626</td>\n",
       "      <td>0.002382</td>\n",
       "      <td>1.268518e-09</td>\n",
       "      <td>4.456064e-08</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   mean_u110  mean_u108  mean_u114  mean_u115  mean_u113  mean_u205  \\\n",
       "0        0.0        0.0        0.0        0.0   0.002567  -0.003455   \n",
       "\n",
       "   mean_u203  mean_u213  mean_u112  mean_u3  mean_u105  mean_u212  mean_u103  \\\n",
       "0        0.0  -0.001019   0.002316      0.0   0.000926  -0.001261   0.001064   \n",
       "\n",
       "   mean_u207  mean_u210  mean_u102  mean_u106  mean_u107  mean_u109  \\\n",
       "0  -0.003332  -0.001361   0.000324  -0.000565  -0.000565        0.0   \n",
       "\n",
       "   mean_u111  mean_u200  mean_u214  mean_u211  mean_u202  mean_u206  \\\n",
       "0   0.002359        0.0  -0.000705  -0.000744        0.0  -0.002291   \n",
       "\n",
       "   mean_u204  mean_u201  mean_u208  mean_u209  mean_u215  mean_u104  std_u110  \\\n",
       "0  -0.003028        0.0  -0.000272  -0.000004  -0.001626   0.001178       0.0   \n",
       "\n",
       "   std_u108  std_u114  std_u115  std_u113  std_u205  std_u203  std_u213  \\\n",
       "0       0.0       0.0       0.0  0.001599  0.001134       0.0  0.000927   \n",
       "\n",
       "   std_u112  std_u3  std_u105  std_u212  std_u103  std_u207  std_u210  \\\n",
       "0  0.001987     0.0  0.003332  0.000681  0.003028  0.000873  0.000777   \n",
       "\n",
       "   std_u102  std_u106  std_u107  std_u109  std_u111  std_u200  std_u214  \\\n",
       "0  0.002459  0.002144  0.002144       0.0  0.001425       0.0  0.000929   \n",
       "\n",
       "   std_u211  std_u202  std_u206  std_u204  std_u201  std_u208  std_u209  \\\n",
       "0  0.000788       0.0     0.001  0.001089       0.0  0.000763  0.000995   \n",
       "\n",
       "   std_u215  std_u104  pressure_mean  pressure_std gas_active  \n",
       "0  0.000626  0.002382   1.268518e-09  4.456064e-08             "
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "pd.set_option('display.max_columns', 500)\n",
    "(training_config - inference_config).to_pandas()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "d05998c1-7b30-4eaa-adb6-c041c247797a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "training_config == inference_config"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d99852b3-ec27-44e7-bd63-056fa3804810",
   "metadata": {},
   "source": [
    "Retrieve PES and XGM data into the expected format.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "371f7583-5d0d-44d0-b41b-20cf4279da45",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# bunch pattern table\n",
    "             'bunchPatternTable',\n",
    "             #{'bunchPatternTable': {'source': 'SCS_RR_UTC/TSYS/TIMESERVER:outputBunchPattern',\n",
    "             #                      'key': 'data.bunchPatternTable',\n",
    "             #                      'dim': ['pulses'],\n",
    "             #                     },\n",
    "             #},\n",
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "83fe11bc-aa8b-4037-aa15-4a36e3104bf5",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pes_to_spec.model import Model\n",
    "model = Model.load(\"VS_p5576_viking.joblib\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "6115d454-d695-441e-b70f-40ac4a336355",
   "metadata": {},
   "source": [
    "_, data_inf = tb.load(proposal, runTest, fields + field_bpt)\n",
    "\n",
    "# transform PES data into the format expected\n",
    "pes_data_inf = {k: da.from_array(data_inf[item].to_numpy())\n",
    "            for k, item in pes_map.items() if item in data_inf}\n",
    "xgm_inf = data_inf.XTD10_SA3.to_numpy()\n",
    "\n",
    "# assume it does not change:\n",
    "bpt_inf = data_inf.bunchPatternTable.isel(trainId=0).to_numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "056c231d-49cf-4280-b7b2-8884b50e710e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# assume the same bunch pattern structure throughout the run!\n",
    "fel_pos = indices_at_sase(bpt_inf, sase=3)\n",
    "fel_pos -= fel_pos[0]\n",
    "freq_ratio = {ch: 220 for ch in channels}\n",
    "sample_pos = {ch: fel_pos * 2 * freq for ch, freq in freq_ratio.items()}\n",
    "pulse_spacing = sample_pos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "938f91a8-ab92-407e-a679-c5ce2c8589e5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'channel_1_A': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_1_B': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_1_C': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_1_D': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_2_A': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_2_B': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_2_C': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_2_D': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_3_A': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_3_B': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_3_C': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_3_D': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_4_A': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_4_B': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_4_C': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360]),\n",
       " 'channel_4_D': array([     0,  14080,  28160,  42240,  56320,  70400,  84480,  98560,\n",
       "        112640, 126720, 140800, 154880, 168960, 183040, 197120, 211200,\n",
       "        225280, 239360, 253440, 267520, 281600, 295680, 309760, 323840,\n",
       "        337920, 352000, 366080, 380160, 394240, 408320, 422400, 436480,\n",
       "        450560, 464640, 478720, 492800, 506880, 520960, 535040, 549120,\n",
       "        563200, 577280, 591360])}"
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pulse_spacing"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cec450da-e557-4b39-a00c-39b55eb6b28b",
   "metadata": {},
   "source": [
    "If there are multiple pulses in a train, the pulse spacing above tells us about how many samples there are between them. The first item in the list above is always zero, as the task of identifying the position of the first pulse is taken care through the Virtual Spectrometer itself.\n",
    "\n",
    "Now we can do the prediction itself. To get each pulse in a train, the `pulse_spacing` should be specified as the one above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "d9f267f7-3e0d-4101-97f0-019c837b5e5e",
   "metadata": {},
   "outputs": [],
   "source": [
    "vs_inf = model.predict(pes_data_inf, pulse_energy=xgm_inf, pulse_spacing=pulse_spacing)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "2be3b1ac-5e21-4503-b763-ba7723b808c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "vs_inf[\"energy\"] = model.get_energy_values()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cdd39379-bb88-4717-bcf5-beb4440daf78",
   "metadata": {},
   "source": [
    "Now we can plot it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "c9ea5c57-cdf3-4268-856f-44b48cd3fb69",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_new(data, i, pulse=0):\n",
    "    \"\"\"Plot prediction and expectation.\"\"\"\n",
    "    from matplotlib.gridspec import GridSpec\n",
    "    fig = plt.figure(figsize=(12, 8))\n",
    "    gs = GridSpec(1, 1)\n",
    "    ax = fig.add_subplot(gs[0, 0])\n",
    "    ax.plot(data[\"energy\"], data[\"expected\"][i,pulse], c='r', ls='--', lw=3, label=\"Prediction\")\n",
    "    ax.fill_between(data[\"energy\"],\n",
    "                    data[\"expected\"][i,pulse] - data[\"residual\"][i,pulse],\n",
    "                    data[\"expected\"][i,pulse] + data[\"residual\"][i,pulse],\n",
    "                    facecolor='gold', alpha=0.5, label=\"68% unc.\")\n",
    "    ax.legend(frameon=False, borderaxespad=0, loc='upper left')\n",
    "    ax.spines['top'].set_visible(False)\n",
    "    ax.spines['right'].set_visible(False)\n",
    "    ax.set(\n",
    "            xlabel=\"Photon energy [eV]\",\n",
    "            ylabel=\"Intensity [a.u.]\",\n",
    "            title=\"\",\n",
    "    )\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "99256b0f-780d-4a20-bc70-6e0b894c584c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtoAAAHgCAYAAACb58plAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABk4klEQVR4nO3dd3gc1bnH8e/ZVW/uvSD33o0xxsaAAdO7Cd0EE2oCJBcSSANC4AYSLi10CBgCONTQq8E0N9y7jXvvtmRbstqe+8eMmJWtLu3OSvp9nmefPXNmZvfVeC29OnrnHGOtRUREREREalfA7wBEREREROojJdoiIiIiIhGgRFtEREREJAKUaIuIiIiIRIASbRERERGRCFCiLSIiIiISAXF+BxApp5xyiv3kk0/8DkNERERE6jdT1o56O6K9c+dOv0MQERERkQas3ibaIiIiIiJ+UqItIiIiIhIBSrQjKBgMMnDgQPr27cu4cePIycmp9mtdeeWVvPnmmwBcffXVLFmypMxjp0yZwtSpU3/afuqpp3jppZeq/d4iIiIiUnVKtCMoOTmZefPmsWjRIhISEnjqqadK7C8qKqrW6z733HP07t27zP2HJtrXXXcdV1xxRbXeS0RERESqR4l2lIwaNYqVK1cyZcoUjj/+eC655BL69etHUVERt912G0ceeST9+/fn6aefBsBayy9/+Ut69+7N6aefzvbt2396reOOO45Zs2YB8MknnzB48GAGDBjAmDFjWLt2LU899RQPPfQQAwcO5Ntvv+Wuu+7iH//4BwDz5s1j+PDh9O/fn3PPPZc9e/b89Jq/+93vGDZsGN27d+fbb7+N8hUSERERqV8aTqJ9111gTOUe11xz+PnXXFPymLvuqvRbFxYW8vHHH9OvXz8AZs6cyb333suSJUt4/vnnadSoET/88AM//PADzz77LGvWrOGdd95h+fLlLFy4kGeffbbECHWxHTt28Itf/IK33nqL+fPn88Ybb5CZmcl1113Hr3/9a+bNm8eoUaNKnHPFFVdw//33s2DBAvr168fdd99dIs6ZM2fy8MMPl+gXERERkaqrt/Nox4Lc3FwGDhwIOCPaEyZMYOrUqQwbNoxOnToB8Nlnn7FgwYKf6q+zsrL48ccf+eabb7j44osJBoO0bduWE0444bDXnz59Oscee+xPr9W0adNy48nKymLv3r2M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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_new(vs_inf, 0, pulse=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2ae94611-5d71-4c11-806c-04905607be1d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SCS Toolbox (p005576)",
   "language": "python",
   "name": "toolbox_p005576"
  },
  "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.10.13"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {},
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}