{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "59f50187-f73f-471b-b668-9126e6f48501",
   "metadata": {},
   "source": [
    "# Automated virtual spectrometer example offline analysis\n",
    "\n",
    "This is an example notebook showing how to use the `pes_to_spec` infrastructure in this package. The objective here is to calibrate the photo-electron spectrometer data automatically. This is done by using data from one \"training\" run that contains data from both the photo-electron spectrometer (PES), XGM and the grating spectrometer and then using the correlation between them to calibrate the PES data when no grating spectrometer is available.\n",
    "\n",
    "This notebook includes the main analysis to simple get a calibrated PES spectrum using this automated method, as well as further analyses on the output in a second section. The objective of the second sections are only to validate results and may probably be skipped in most cases, if one needs only the PES spectrum.\n",
    "\n",
    "We start by importing some modules. The key module here is called `pes_to_spec`. It can be cloned from its repository using the following command (for example) in Maxwell:\n",
    "\n",
    "`git clone https://git.xfel.eu/machineLearning/pes_to_spec.git`\n",
    "\n",
    "After that the notebook in the directory `pes_to_spec/notebook` can be opened and executed using the kernel `xfel (current)`. The specialized environment mentioned in the `README.md` file of the package may offer a slightly better performance and allow for expert features, but this is not necessary for the standard analysis."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d0003a3-4165-447d-bdb5-758c323a3fbf",
   "metadata": {},
   "source": [
    "## Core automated virtual spectromater usage"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aadd23ab-b894-467c-bb28-c1d25b8e94a2",
   "metadata": {},
   "source": [
    "Here we expand on the usage of the virtual spectrometer. We assume that 2 runs of data have been collected. A first run contains both XGM, PES and grating spectrometer data.\n",
    "\n",
    "A test run may contain only the XGM and PES data. If the test run contains also the grating spectrometer, it can be used also for validation, but in a real use-case this may not be available."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d44af0b6-9c00-4e70-b49b-d74ed562e92f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "# add the pes_to_spec main directory\n",
    "# (change this depending on where you started the notebook if needed, or comment it out if you have done pip install in pes_to_spec)\n",
    "sys.path.append('..')\n",
    "\n",
    "# you meay need to do pip install matplotlib seaborn extra_data for this notebook, additionally\n",
    "# for this notebook the following packages are needed:\n",
    "# pip install \"numpy>=1.21\" \"scipy>=1.6\" \"scikit-learn>=1.2.0\" torch torchbnn  matplotlib seaborn extra_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "da002d3e-c0da-419b-922b-0ab5c6deece8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.gridspec import GridSpec \n",
    "import seaborn as sns\n",
    "\n",
    "import lmfit\n",
    "import scipy\n",
    "from extra_data import open_run, by_id\n",
    "from itertools import product\n",
    "from pes_to_spec.model import get_model_with_resolution, Model, matching_ids, matching_two_ids\n",
    "from pes_to_spec.config import VSConfig\n",
    "\n",
    "from typing import Any, Dict"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "494a729c-dff4-4501-b828-fba2aaae5a23",
   "metadata": {},
   "source": [
    "### Input data\n",
    "\n",
    "Note that the data in the training run must be large enough, compared to the number of model parameters.\n",
    "\n",
    "Only the grating spectrometer, PES and XGM data is used for training, while only the PES and XGM data is needed for testing.\n",
    "However, more data is collected here to validate the results.\n",
    "\n",
    "Please adjust the proposal number, run number and name of the devices below as needed. Specifically, note that the grating spectrometer name changes depending on where the data has been collected. If unsure, try `run.info()` to check if the it contains `SPECTROMETER_SCS_NAVITAR`, `SPECTROMETER_SQS_NAVITAR` or `SPECTROMETER_SXP_NAVITAR`, etc.\n",
    "\n",
    "Additionally, please check that the list of PES channels includes the channels active during the runs. It may be that data from all channels are written to disk, but not all channels are active (in which case they contain only noise). This would not hurt the procedure, but could lead to erroneous comparison between the results."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09a19717-df4a-4b97-aec7-9006e3340c77",
   "metadata": {},
   "source": [
    "First check the test and train run settings. Are they compatible? If not, this cannot be used"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "04c7d64d-cb05-4de7-82bd-9d7368144e1c",
   "metadata": {},
   "outputs": [],
   "source": [
    "mean_values_train, _ = VSConfig.load(proposalNumber=900331, runNumbers=[69]).to_dict()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "198d1a19-03b3-4b9d-a736-be37e382eccb",
   "metadata": {},
   "outputs": [],
   "source": [
    "mean_values_test, _ = VSConfig.load(proposalNumber=900331, runNumbers=[70]).to_dict()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "1dfc504f-2b7a-4764-bd29-47f4c3d538e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'pressure': 1.2898001386929536e-06,\n",
       " 'gas': 'NEON',\n",
       " 'u115': 1.1454888761509676,\n",
       " 'u105': 2300.0055902671165,\n",
       " 'u211': -104.39928315803095,\n",
       " 'u201': -0.11178184300661087,\n",
       " 'u104': 2299.9981578569123,\n",
       " 'u213': -116.00666335973898,\n",
       " 'u214': -116.00175377627951,\n",
       " 'u208': -104.40358778573192,\n",
       " 'u3': 0.0,\n",
       " 'u113': 2300.0057625901563,\n",
       " 'u111': 2300.0001825791983,\n",
       " 'u212': -115.99998056087796,\n",
       " 'u210': -104.39860634108643,\n",
       " 'u109': 2300.010335759694,\n",
       " 'u202': -0.10682301968336105,\n",
       " 'u207': -75.39458266541837,\n",
       " 'u108': 2300.0107558705367,\n",
       " 'u112': 2300.0073988267936,\n",
       " 'u200': -0.10179182142019272,\n",
       " 'u103': 2299.997899249964,\n",
       " 'u107': 2299.9994651866336,\n",
       " 'u203': -0.10790964215993881,\n",
       " 'u206': -75.40136683869271,\n",
       " 'u215': -115.99884806086645,\n",
       " 'u110': 2300.000035027595,\n",
       " 'u106': 2299.9994651866336,\n",
       " 'u204': -75.4030248505428,\n",
       " 'u114': 2300.0026486100187,\n",
       " 'u102': 2299.9974047268993,\n",
       " 'u209': -104.40387487784402,\n",
       " 'u205': -75.40492121098107}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean_values_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6a3b3f88-d4c6-4bba-8807-510c4eb4be51",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'pressure': 1.289217266275955e-06,\n",
       " 'gas': 'NEON',\n",
       " 'u115': 1.1511293109861325,\n",
       " 'u105': 2300.0083986739373,\n",
       " 'u211': -104.4027864348326,\n",
       " 'u201': -0.11178184300661087,\n",
       " 'u104': 2300.0002679750346,\n",
       " 'u213': -115.99890199879935,\n",
       " 'u214': -116.00527901070001,\n",
       " 'u208': -104.3962428168333,\n",
       " 'u3': 0.0,\n",
       " 'u113': 2300.0031018672753,\n",
       " 'u111': 2299.9981553310977,\n",
       " 'u212': -116.00380941556044,\n",
       " 'u210': -104.402747417904,\n",
       " 'u109': 2299.9960031792434,\n",
       " 'u202': -0.10682301968336105,\n",
       " 'u207': -75.39357704417625,\n",
       " 'u108': 2300.007998942286,\n",
       " 'u112': 2300.0047992204586,\n",
       " 'u200': -0.10179182142019272,\n",
       " 'u103': 2300.00078058645,\n",
       " 'u107': 2300.0017183655987,\n",
       " 'u203': -0.10790964215993881,\n",
       " 'u206': -75.40099537785967,\n",
       " 'u215': -116.00220764789384,\n",
       " 'u110': 2299.9972946610314,\n",
       " 'u106': 2300.0017183655987,\n",
       " 'u204': -75.4021661049945,\n",
       " 'u114': 2300.0000518636753,\n",
       " 'u102': 2299.9999249502107,\n",
       " 'u209': -104.40318841406868,\n",
       " 'u205': -75.40451795464193}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean_values_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "4a301f2a-dedb-46e4-b096-fc9c6cf5b23a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# change these settings\n",
    "run = open_run(proposal=900331, run=69) # train\n",
    "run_test = open_run(proposal=900331, run=70) # inference\n",
    "\n",
    "# change this to SQS if working in SQS\n",
    "grating_name = \"SA3_XTD10_SPECT/MDL/SPECTROMETER_SCS_NAVITAR:output\"\n",
    "pes_name = \"SA3_XTD10_PES/ADC/1:network\"\n",
    "xgm_name = \"SA3_XTD10_XGM/XGM/DOOCS:output\"\n",
    "\n",
    "# PES channels\n",
    "# change this to the channels available\n",
    "# Note: if a channel is not available, often it contains only noise\n",
    "# this causes an error later\n",
    "# check the logs or the dimensions of the pes with data[\"pes\"].shape to be sure which ones are active\n",
    "channels = tuple([f\"channel_{i}_{l}\" for i, l in product([1, 3, 4], [\"A\", \"B\", \"C\", \"D\"])])\n",
    "\n",
    "\n",
    "def get_tids(run, with_grating=True) -> np.ndarray:\n",
    "    \"\"\"Get which train IDs contain all necessary inputs for training.\"\"\"\n",
    "    if grating_name in run.all_sources and with_grating:\n",
    "        spec_tid = run[grating_name, \"data.trainId\"].ndarray()\n",
    "    else:\n",
    "        spec_tid = None\n",
    "    pes_tid = run[pes_name, \"digitizers.trainId\"].ndarray()\n",
    "    xgm_tid = run[xgm_name, \"data.trainId\"].ndarray()\n",
    "\n",
    "    # match tids to be sure we have all inputs:\n",
    "    if spec_tid is None:\n",
    "        tids = matching_two_ids(pes_tid, xgm_tid)\n",
    "    else:\n",
    "        tids = matching_ids(spec_tid, pes_tid, xgm_tid)\n",
    "\n",
    "    return tids\n",
    "\n",
    "def get_data(run, tids, with_grating=True) -> Dict[str, Any]:\n",
    "    \"\"\"Get all relevant data.\"\"\"\n",
    "    data = dict()\n",
    "    data[\"intensity\"] = run[xgm_name, \"data.intensitySa3TD\"].select_trains(by_id[tids]).ndarray()[:, 0][:, np.newaxis]\n",
    "    data[\"pes\"] = {ch: run.select_trains(by_id[tids]).get_dask_array(pes_name,\n",
    "                           f\"digitizers.{ch}.raw.samples\")\n",
    "                    for ch in channels}\n",
    "    # this may not be available in testing\n",
    "    if grating_name in run.all_sources and with_grating:\n",
    "        data[\"grating\"] = run[grating_name, \"data.intensityDistribution\"].select_trains(by_id[tids]).ndarray()\n",
    "        data[\"energy\"] = run[grating_name, \"data.photonEnergy\"].select_trains(by_id[tids]).ndarray()\n",
    "    return data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "210c0550-1abb-43a0-99a5-7c35d2766be0",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# get the matched train IDs\n",
    "tids = get_tids(run)\n",
    "test_tids = get_tids(run_test, with_grating=False)\n",
    "\n",
    "# get the data\n",
    "data = get_data(run, tids)\n",
    "data_test = get_data(run_test, test_tids, with_grating=False)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "017865a1-057f-48c7-8bef-a6e40490de2c",
   "metadata": {},
   "source": [
    "Now the `data` and `data_test` dictionaries contain the necessary information about the training and test runs.\n",
    "The code above also selected only entries with train IDs on which at least SPEC, PES and XGM were present.\n",
    "\n",
    "Note that for training, it is assumed that only one pulse is present. For testing there is no such requirement.\n",
    "\n",
    "First output some general information about the conditions of the measurement device."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9b62e3a-aff9-4436-905d-ea02c11aecf6",
   "metadata": {},
   "source": [
    "### Using the virtual spectrometer"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5962e483-60da-4c70-bb09-dce5fc9745e0",
   "metadata": {},
   "source": [
    "Now we will actually train the model. We do that by creating a `Model` object (from `pes_to_spec`) and fitting the data. It requires the PES intensity, the grating spec. intensity, the energy axis from grating spec., as well as the energy measured in the XGM (which has better resolution than the integral of the PES).\n",
    "\n",
    "We actually do this twice: in the first time we do it without any preprocessing on the grating spectrometer data. After that step, we record the maximum resolution achievable with the virtual spectrometer and then redo the estimate using the discovered resolution to pre-process the grating spectrometer data, so that this information is taken into account in the uncertainty estimate.\n",
    "\n",
    "The work of calculating the expected resolution and adapting to it is done by the `get_model_with_resolution`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "70c4e386-61b2-49e7-b759-8c0175ee457a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Checking data quality in high-resolution data.\n",
      "Finding region-of-interest\n",
      "Excluding outliers\n",
      "Selected 6448 of 7165 samples.\n",
      "Fitting PCA on low-resolution data.\n",
      "Using 600 comp. for PES PCA.\n",
      "Fitting PCA on high-resolution data.\n",
      "Using 24 comp. for grating spec. PCA.\n",
      "Fitting outlier detection\n",
      "Fitting model.\n",
      "Calculate PCA unc. on high-resolution data.\n",
      "Calculate transfer function\n",
      "Resolution = 0.77 eV, S/R = 5.69\n",
      "Calculate PCA on channel_1_A\n",
      "Calculate PCA on channel_1_B\n",
      "Calculate PCA on channel_1_C\n",
      "Calculate PCA on channel_1_D\n",
      "Calculate PCA on channel_3_A\n",
      "Calculate PCA on channel_3_B\n",
      "Calculate PCA on channel_3_C\n",
      "Calculate PCA on channel_3_D\n",
      "Calculate PCA on channel_4_A\n",
      "Calculate PCA on channel_4_B\n",
      "Calculate PCA on channel_4_C\n",
      "Calculate PCA on channel_4_D\n",
      "End of fit.\n",
      "Resolution: 0.77 eV\n"
     ]
    }
   ],
   "source": [
    "model, resolution = get_model_with_resolution(data['pes'],\n",
    "                                              data['grating'],\n",
    "                                              data['energy'],\n",
    "                                              data['intensity'],\n",
    "                                              channels=channels,\n",
    "                                              )\n",
    "print(f\"Resolution: {resolution:.2f} eV\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f6c9d0a-29af-42c9-ba3c-08aae561232b",
   "metadata": {},
   "source": [
    "We can save the resulting model for later usage using the `save` method and then reload it later with the `load` function as shown below. This can be useful if one wants to reuse information at a later stage."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "a0adb57b-7496-4781-9511-ac2a8d05658d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# save it for later usage:\n",
    "model.save(\"model.joblib\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "67616041-4239-48f0-a4f7-2caf5d896652",
   "metadata": {},
   "outputs": [],
   "source": [
    "# load a model -- you can skip the fit above if you just start from this line\n",
    "#model = Model.load(\"model.joblib\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de6cf667-2f50-47c2-983a-a6c0b2d17714",
   "metadata": {},
   "source": [
    "Now we can use this mapping on new data. In this example, we try it in the test dataset mentioned."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "917156f3-9476-48e0-9121-5f75f185045f",
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = model.predict(data_test['pes'], pulse_energy=data_test['intensity'])\n",
    "\n",
    "# add the references in this array in the same array format, so we can plot them later\n",
    "pred[\"energy\"] = model.get_energy_values()\n",
    "# for inference the grating is not available, but if it was ...\n",
    "#pred['grating'] = data_test['grating'][:, np.newaxis, :]\n",
    "# let us show also how the virtual spectrometer looks like smeared by the virtual spectrometer resolution\n",
    "#pred['grating_smooth'] = model.preprocess_high_res(data_test['grating'], resolution=model.resolution)[:, np.newaxis, :]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3edc3d2d-de97-4b37-b714-bb856ec4d586",
   "metadata": {},
   "source": [
    "Let's plot some train-pulse:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "0d42f1ec-7f05-4af5-b056-75af1c53742d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Text(0.5, 0, 'Photon energy [eV]'),\n",
       " Text(0, 0.5, 'Intensity'),\n",
       " (0.0, 197.21617969869132)]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtQAAAHgCAYAAACFLvrWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAB9+ElEQVR4nO3dd5hcZ333//c9bXuVVl2yiqvcZFt2bLCNwQEbTOiEEnonISHJQwikAQ+EhxRCTSCmkx+hGogJzYAbYBtbcpWLbPUu7Urbd6ee+/fHOTM7M3um7c7Mzu5+Xtela2fPnHPm6Hg8+ux3v/d9G2stIiIiIiIyM4G5vgARERERkflMgVpEREREZBYUqEVEREREZkGBWkRERERkFhSoRURERERmQYFaRERERGQWQnN9AbOxdOlSu379+rm+DBERERFZ4LZv3z5gre3ze25eB+r169ezbdu2ub4MEREREVngjDH7Cz2nlg8RERERkVlQoBYRERERmQUF6lkKBoNs2bKF8847j5e//OVMTEzM+FxveMMb+N73vgfAW97yFh577LGC+95+++3cddddFb/G+vXrGRgYmPE1ioiIiEguBepZamlp4cEHH2THjh1EIhE+//nP5zyfSqVmdN4vfvGLbN68ueDzMw3UIiIiIlJdCtRVdNVVV7Fr1y5uv/12nvnMZ/LqV7+a888/n1QqxV/91V9x6aWXcsEFF/Cf//mfAFhrede73sXmzZu54YYbOHHiROZc11xzTWbA5c9+9jMuvvhiLrzwQq699lr27dvH5z//eT7xiU+wZcsWfv3rX9Pf389LX/pSLr30Ui699FJ++9vfAnDy5Eme85zncNFFF/H2t78da239b4yIiIjIAjavZ/nItv59P67Jefd97Iay9ksmk/z0pz/l+uuvB+Dee+9lx44dbNiwgRtvvJGuri7uu+8+YrEYT3/603nOc57DAw88wM6dO3nkkUc4fvw4mzdv5k1velPOefv7+3nrW9/KnXfeyYYNGzh16hS9vb284x3voL29nfe85z0AvPrVr+Yv/uIvuPLKKzlw4ADXXXcdjz/+OB/60Ie48sor+Yd/+Ad+/OMfc+ONN1b3BomIiIgscgsmUM+VyclJtmzZArgV6je/+c3cddddXHbZZWzYsAGAW265hYcffjjTHz08PMxTTz3FnXfeyate9SqCwSCrVq3iWc961rTz33PPPVx99dWZc/X29vpexy9/+cucnuuRkRFGR0e58847+f73vw/ADTfcQE9PT9X+7iIiIiKygAJ1uZXkakv3UOdra2vLPLbW8pnPfIbrrrsuZ5+f/OQnGGOKnt9aW3IfAMdxuPvuu2lpaZn2XDnHi4iIiMjMqIe6Dq677jo+97nPkUgkAHjyyScZHx/n6quv5lvf+hapVIqjR49y2223TTv2iiuu4I477mDv3r0AnDp1CoCOjg5GR0cz+z3nOc/hs5/9bOb7dMi/+uqr+cY3vgHAT3/6UwYHB2vydxQRERFZrBSo6+Atb3kLmzdv5uKLL+a8887j7W9/O8lkkhe/+MWcccYZnH/++bzzne/kGc94xrRj+/r6uPHGG3nJS17ChRdeyCte8QoA/uAP/oAf/OAHmUGJn/70p9m2bRsXXHABmzdvzsw28oEPfIA777yTiy++mFtuuYV169bV9e8uIiIistCZ+Tzrw9atW62WHhcRERGRWjPGbLfWbvV7ThVqEREREZFZUKAWEREREZkFBWoRERERkVlQoBYRERERmQUFahERERGRWVCgFhERERGZBQXqWRoaGuJlL3sZZ599Nueccw5333034C6scvnll7Nlyxa2bt3KvffeC8Bvf/tbLrjgAi699FJ27dqVOcd1113HfJ7CUERERGSxWjBLjwPQ/8Hqnq+v9Pne/e53c/311/O9732PeDzOxMQEAO9973v5wAc+wHOf+1x+8pOf8N73vpfbb7+dj3/849x0003s27ePz33uc3z84x/nwx/+MH/zN3+jJcJFpPpSIxDsnOurEBFZ0FShnoWRkRHuvPNO3vzmNwMQiUTo7u4GwBjDyMgIAMPDw6xatQqAcDjM5OQkExMThMNhdu/ezeHDh31XSUxbv349AwMDAGzbto1rrrkGgA9+8IO86U1v4pprrmHjxo18+tOfzhzz9a9/nQsuuIALL7yQ1772tdX+q4vIfJE8CM7YXF+FiMiCtrAq1HW2Z88e+vr6eOMb38hDDz3EJZdcwqc+9Sna2tr45Cc/yXXXXcd73vMeHMfhrrvuAuD9738/b3vb22hpaeG//uu/eM973sOHP/zhGV/DE088wW233cbo6ChnnXUW73znO3nyySf5x3/8R37729+ydOlSTp06Va2/sojMN4n9EOiAQPtcX4mIyIKlCvUsJJNJ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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_idx = 0\n",
    "pulse_idx = 0\n",
    "plt.figure(figsize=(12, 8))\n",
    "plt.plot(pred[\"energy\"], pred[\"expected\"][train_idx, pulse_idx], lw=2, label=\"Predicted\")\n",
    "plt.fill_between(pred[\"energy\"],\n",
    "                 pred[\"expected\"][train_idx, pulse_idx] - pred[\"total_unc\"][train_idx, pulse_idx],\n",
    "                 pred[\"expected\"][train_idx, pulse_idx] + pred[\"total_unc\"][train_idx, pulse_idx],\n",
    "                 facecolor='gold', alpha=0.5, label=\"68% unc.\")\n",
    "plt.legend(frameon=False, borderaxespad=0, loc='upper left')\n",
    "plt.gca().set(\n",
    "            xlabel=\"Photon energy [eV]\",\n",
    "            ylabel=\"Intensity\",\n",
    "            ylim=(0, None))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "32d10835-3849-49a4-9c4c-fff1f84c35d0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "xfel (current)",
   "language": "python",
   "name": "xfel-current"
  },
  "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
}