Ptrskay3/PySprint

View on GitHub
doc/hu_spp.ipynb

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. Állandó fázisú pont módszere, SPPMethod\n",
    "\n",
    "Ez a módszer alapjaiban kissé különbözik a többitől. Az előzőleg leírt globális metódusok, mint domain átváltás, kivágás, stb. itt is működnek, de másképpen kell kezelni őket. *Megjegyezném, hogy mivel ez a módszer interaktív elemet tartalmaz, az egyelőre csak Jupyter Notebook-ban stabil.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pysprint as ps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Példaként a korábban már bemutatott `ps.Generator` segítségével generálni fogok egy sorozat interferogramot, majd azon bemutatom a kiértékelés menetét. Valós méréseknél teljesen hasonlóképpen végezhető a kiértékelés. A legegyszerűbb módszer, hogy különböző karok közti időbeli késleltetésnél generáljunk és elmentsük azokat az alábbi cellában látható. A megkülönböztethetőség miatt minden fájlt a hozzá tartozó karok közti időbeli késleltetésnek megfelelően nevezem el."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "for delay in range(-200, 201, 50):\n",
    "    g = ps.Generator(1, 3, 2, delay, GDD=400, TOD=-500, normalize=True)\n",
    "    g.generate_freq()\n",
    "    np.savetxt(f'{delay}.txt', np.transpose([g.x, g.y]), delimiter=',')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A kód lefuttatásával a munkafüzet környtárában megjelent 7 új txt fájl. \n",
    "\n",
    "Ehhez a kiértékelési módszerhez először fel kell építeni egy listát a felhasználandó interferogramok fájlneveivel. Ezt manuálisan is megtehetjük, itt ezt elkerülve egy rövidítést fogok használni."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "ifg_files = [f\"{delay}.txt\" for delay in range(-200, 201, 50)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['-200.txt', '-150.txt', '-100.txt', '-50.txt', '0.txt', '50.txt', '100.txt', '150.txt', '200.txt']\n"
     ]
    }
   ],
   "source": [
    "print(ifg_files)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ha nem hasonló sémára épülnek a felhasználandó fájlok nevei, akkor természetesen a fenti trükk nem működik és egyenként kell beírnunk őket. Miután definiáltuk a fájlneveket a következő lépés a\n",
    "```python\n",
    "ps.SPPMethod(ifg_names, sam_names=None, ref_names=None, **kwargs)\n",
    "```\n",
    "meghívása:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "myspp = ps.SPPMethod(ifg_files, decimal=\".\", sep=\",\", skiprows=0, meta_len=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A `**kwargs` keyword argumentumok itt elfogadják a korábban már bemutatott `parse_raw` funkció argumentumait (a kódban belül azt is hívja meg egyesével minden interferogramon), hiszen a fájlok sémáját itt is fontos megadni a helyes betöltéshez. A tárgy- és referencianyaláb spektrumai természetesen opcionális argumentumok, mi dönthetjük el, hogy normáljuk-e az interferogramokat.\n",
    "\n",
    "Az `SPPMethod` objektum először ellenőrzi, hogy a listában lévő fájlnevek valóban léteznek-e, és ha nem, akkor hibával tér vissza. Az `SPPMethod`-nak vannak további metódusai, ilyen pl. a `len(..)`, vagy az `SPPMethod.info`. Az első visszaadja, hogy hány interferogram van jelenleg az objektumban (ez jelen esetben 9), a második pedig a kiértékelés során mutatja majd, hogy hány interferogramból rögzítettünk információt (ez jelenleg 0/9). Később talán `append` (ilyen már van a 0.12.5 verziótól), `insert` és `delete` metódusokat is beépítek."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9\n"
     ]
    }
   ],
   "source": [
    "print(len(myspp))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Progress: 0/9\n"
     ]
    }
   ],
   "source": [
    "print(myspp.info)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Az SPPMethod objektum listaszerűen viselkedik: lehet indexelni is. Mivel benne 9 darab interferogram van, ezért egy ilyen indexelés egy `ps.Dataset` objektumot ad vissza. Ez az alapja minden kiértékelési módszernek, így ez ismeri a korábban bemutatott metódusokat. Tegyük fel, hogy a 3. interferogram adatait ki szeretnénk iratni, és szeretnénk megkapni az y értékeit `np.ndarray`-ként. Ekkor a 2 indexet használva (mivel itt is 0-tól indul a számozás):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset\n",
      "----------\n",
      "Parameters\n",
      "----------\n",
      "Datapoints: 12559\n",
      "Predicted domain: frequency\n",
      "Range: from 0.99998 to 3.00000 PHz\n",
      "Normalized: False\n",
      "Delay value: Not given\n",
      "SPP position(s): Not given\n",
      "----------------------------\n",
      "Metadata extracted from file\n",
      "----------------------------\n",
      "{}\n"
     ]
    }
   ],
   "source": [
    "# a harmadik interferogram adatainak kiíratása\n",
    "print(myspp[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[4.22567237e-08 4.23424876e-08 4.24102757e-08 ... 4.41394357e-08\n",
      " 4.30227521e-08 4.18888151e-08]\n",
      "<class 'numpy.ndarray'>\n"
     ]
    }
   ],
   "source": [
    "# a harmadik interferogram y értékeinek kinyerése, mint np.array\n",
    "y_ertekek = myspp[2].data.y.values\n",
    "print(y_ertekek)\n",
    "print(type(y_ertekek))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Újra hangsúlyozom, minden eddig bemutatott metódus ezeken a kvázi listaelemeken is működik, köztük a `chdomain`, vagy `slice` is. Ezt használjuk ki a kiértékeléshez egy *for* ciklusban. A kiértékeléshez a definiált `SPPMethod`-on meg kell hívni egy for ciklust. Ez végigfut a benne lévő összes interferogramon. Azt, hogy mit akarunk csinálni adott interferogrammal, azt a cikluson belül tudjuk megadni. Az alapvető séma a következő:\n",
    "<pre>\n",
    "for ifg in myspp:\n",
    "    - előfeldolgozása az adott interferogramnak\n",
    "    - az interaktív SPP Panel megnyitása és adatok rögzítése\n",
    "    \n",
    "- a calculate metódus meghívása a cikluson kívül(!)\n",
    "</pre>\n",
    "\n",
    "Ez kód formájában az alábbi cellában látható. Itt külön jelöltem, hogy melyik rész meddig tart."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GD = -0.60975 ± 0.00000 fs^1$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GDD = -391.93908 ± 20.48631 fs^2$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle TOD = 277.28636 ± 226.70828 fs^3$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# az interaktív számításokat fontos a with blokkon belülre írni\n",
    "\n",
    "with ps.interactive():\n",
    "\n",
    "    for ifg in myspp:\n",
    "\n",
    "        # -----------------------------------Előfeldolgozás-----------------------------------------\n",
    "        # Ha valós mérésünk van, érdemes valamilyen módon kiíratni a kommentet,\n",
    "        # ami az interferogram fájlban van, hogy meg tudjuk állapítani milyen késleltetésnél készült.\n",
    "        # Jelen esetben ennek nincs értelme, mivel a szimulált fájlokkal dolgozom.\n",
    "        # Ezt legegyszerűbben az alábbi sorral tehetnénk meg: \n",
    "        # print(ifg.meta['comment'])\n",
    "        # vagy esetleg a teljes metaadatok kiíratása:\n",
    "        # print(ifg.meta)\n",
    "\n",
    "        # Ha hullámhossztartományban vagyunk, először át kell váltani.\n",
    "        # Én frekvenciatartományban szimuláltam, ezért itt kihagyom. Ha szükség van rá a\n",
    "        # következő sort kell használni.\n",
    "        # ifg.chdomain() \n",
    "\n",
    "        # Pl. 1.2 PHz alatti körfrekvenciaértékek kivágása. Mivel nem adtam meg stop értéket, így a felső\n",
    "        # határt érintetlenül hagyná, ha futtatnám. Nyilván ez is opcionális.\n",
    "        # ifg.slice(start=1.2)\n",
    "\n",
    "        # -----------------------------Az interaktív panel megnyitása-------------------------------\n",
    "        ifg.open_SPP_panel()\n",
    "\n",
    "# ---------------------------------A ciklus utáni rész------------------------------------------\n",
    "# A cikluson kívül a save_data metódus meghívása, hogy elmentsük a beírt adatainkat fájlba is.\n",
    "# Ez természetesen opcionális, de annak érdekében, hogy biztosan ne veszítsünk adatot érdemes ezt is elvégezni.\n",
    "myspp.save_data('spp.txt')\n",
    "\n",
    "\n",
    "# a cikluson kívül meghívjuk a calculate függvényt\n",
    "myspp.calculate(reference_point=2, order=3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A magyarázatok nélkül szimulált esetben az egész kód az alábbi, összesen 8 sorra egyszerűsödik. Valós mérés esetén néhány előfeldolgozási lépés és kiíratás természetesen még hozzáadódhat ehhez.\n",
    "\n",
    "```python\n",
    "import pysprint as ps\n",
    "\n",
    "ifg_files = [f\"{delay}.txt\" for delay in range(-200, 201, 50)]\n",
    "\n",
    "s = ps.SPPMethod(ifg_files, decimal=\".\", sep=\",\", skiprows=0, meta_len=0)\n",
    "\n",
    "with ps.interactive():\n",
    "    for ifg in s:\n",
    "        ifg.open_SPP_panel()\n",
    "    \n",
    "s.save_data('spp.txt')\n",
    "s.calculate(reference_point=2, order=2, show_graph=True)\n",
    "```\n",
    "Miután a számolást már elvégezte a program, akkor elérhetővé válik rajta a `GD` property. Ez az illesztett görbét reprezentálja, típusa `ps.core.phase.Phase`. Bővebben erről a `Phase` leírásában."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pysprint.core.phase.Phase at 0x2d2223e1a48>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myspp.GD"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.1 Számolás nyers adatokból\n",
    "Mivel az `spp.txt` fájlba elmentettük az bevitt adatokat, azokból egyszerűen lehet újraszámolni az illesztést. Töltsük be `np.loadtxt` segítségével, majd használjuk a `ps.SPPMethod.calculate_from_raw` függvényt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GD = -0.60975 ± 0.00000 fs^1$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GDD = -391.93908 ± 20.48631 fs^2$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle TOD = 277.28636 ± 226.70828 fs^3$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "delay, position = np.loadtxt('spp.txt', delimiter=',', unpack=True)\n",
    "\n",
    "myspp.calculate_from_raw(delay, position, reference_point=2, order=3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Az előbbi esetben látható, hogy ugyan azt az eredményt kaptuk, mint előzőleg. Ez akkor is hasznos lehet, ha már megvannak a leolvasott SPP pozícióink a hozzá tartozó késleltetésekkel és csak a számolást akarjuk elvégezni. Ekkor még létre sem kell hozni egy új objektumot, csak meghívhatjuk a függvényt következő módon:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GD = 1.99335 ± 0.00000 fs^1$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GDD = 0.00038 ± 0.00006 fs^2$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle TOD = 0.00000 ± 0.00000 fs^3$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# ehhez beírtam egy teljesen véletlenszerű adatsort\n",
    "delay_minta = [-100, 200, 500, 700, 900]\n",
    "position_minta = [2, 2.1, 2.3, 2.45, 2.6]\n",
    "\n",
    "ps.SPPMethod.calculate_from_raw(delay_minta, position_minta, reference_point=2, order=3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**FONTOS MEGJEGYZÉS:**\n",
    "\n",
    "Az `order` argumentum a program során mindig a keresett diszperzió rendjét adja meg."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.2 Számolás egy további módon"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mivel továbbra is ugyan ezekkel az adatsorokkal és a `myspp` objektummal dolgozom, most törlöm az összes rögzített adatot belőlük. Ehhez a `SPPMethod.flush` függvényt használom. (Valószínűleg ez a felhasználónak kevésszer szükséges, de elérhető.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "myspp.flush()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Korábban már észrevehettük, hogy a kiíratás során - legyen bármilyen módszerről is szó - megjelentek olyan sorok is, hogy `Delay value: Not given` és `SPP position(s): Not given`. Például a `myspp` első interferogramja esetén most ez a helyzet:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset\n",
      "----------\n",
      "Parameters\n",
      "----------\n",
      "Datapoints: 12559\n",
      "Predicted domain: frequency\n",
      "Range: from 0.99998 to 3.00000 PHz\n",
      "Normalized: False\n",
      "Delay value: Not given\n",
      "SPP position(s): Not given\n",
      "----------------------------\n",
      "Metadata extracted from file\n",
      "----------------------------\n",
      "{}\n"
     ]
    }
   ],
   "source": [
    "print(myspp[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahogyan a `Dataset` leírásában már szerepelt, lehetőségünk van megadni a betöltött interferogramokon az SPP módszerhez szükséges adatokat. Ekkor a `ps.SPPMethod.calculate_from_ifg(ifgs, reference_point, order)` függvénnyel kiértékelhetjük a benne lévő interferogramokat a következő módon:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# kicsomagolok öt interferogramot a generált 7 közül\n",
    "\n",
    "elso_ifg = myspp[0]\n",
    "masodik_ifg = myspp[1]\n",
    "harmadik_ifg = myspp[2]\n",
    "negyedik_ifg = myspp[3]\n",
    "otodik_ifg = myspp[4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# beállítok rájuk véletlenszerűen SPP adatokat\n",
    "\n",
    "elso_ifg.delay = 0\n",
    "elso_ifg.positions = 2\n",
    "\n",
    "masodik_ifg.delay = 100\n",
    "masodik_ifg.positions = 2\n",
    "\n",
    "harmadik_ifg.delay = 150\n",
    "harmadik_ifg.positions = 1.6\n",
    "\n",
    "negyedik_ifg.delay = 200\n",
    "negyedik_ifg.positions = 1.2\n",
    "\n",
    "otodik_ifg.delay = 250\n",
    "otodik_ifg.positions = 1, 3, 1.2\n",
    "\n",
    "\n",
    "# listába teszem őket\n",
    "ifgs = [elso_ifg, masodik_ifg, harmadik_ifg, negyedik_ifg, otodik_ifg]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GD = 71.99708 ± 0.00000 fs^1$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GDD = -19.90037 ± 30.07946 fs^2$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle TOD = 381.52310 ± 94.83666 fs^3$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# meghívom a calculate_from_ifg függvényt\n",
    "ps.SPPMethod.calculate_from_ifg(ifgs, reference_point=2, order=3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ez úgy lehet hasznos, hogy amikor más módszerrel több interferogramot is kiértékelünk egymás után, csak rögzítjük az SPP adatokat is, aztán a program ezekből egyenként összegyűjti a szükséges információt a kiértékeléshez, majd abból számol."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.3 Az SPPMethod működéséről mélyebben, cache, callbacks, from_log\n",
    "\n",
    "\n",
    "Az `SPPMethod` alapvető működését az adatok rögzítése közben az alábbi ábra mutatja.\n",
    "\n",
    "![SPP működése](spp_diagram.svg)\n",
    "\n",
    "A hurok az `SPPMethod`-ból indul, ahol a használandó fájlok neveit, betöltési adatokat, stb. adunk meg. Ezen a ponton még semmilyen számolás és betöltés nem történik. Ezután az `SPPMethod` bármely elemének hívására egy `Dataset` objektum jön létre. Ezen megnyitható az `SPPEditor`, amiben az állandó fázisú pont(ok) helyét és a karok közti késleltetést lehet megadni. Hitelesítés után az SPP-vel kapcsolatos információk az interaktív szerkesztőből visszakerülnek a létrehozott `Dataset` objektumba és ott rögzítődnek. Minden így létrejött `Dataset` objektum kapcsolva van az `SPPMethod`-hoz, amiből felépült, így amikor megváltozik egy SPP-vel kapcsolatos adat, az egyből megváltozik az `SPPMetod`-ban is. A `Registry` gondoskodik arról, hogy minden objektum ami a memóriában van az rögzítődjön, illetve szükség esetén elérhető legyen.\n",
    "\n",
    "\n",
    "**Cache**\n",
    "\n",
    "Ha próbálunk elérni egy adott elemet (akár a `for` ciklussal, akár indexelve, vagy egyéb módon), létrejön egy `Dataset` objektum. Ez a `Dataset` objektum miután már egyszer elértük a memóriában marad és megtart minden rajta végrehajtott változtatást, beállítást. Alapértelmezetten *128 db* interferogram marad a memóriában egyszerre, de ez a határ szükség esetén megváltoztatható. Az éppen aktuálisan a memóriában lévő interferogramok száma (az adott `SPPMethod`-hoz tartozó) a kiíratás során a `Interferograms cached` cellában látható.\n",
    "\n",
    "**Callbacks**\n",
    "\n",
    "A fenti ábrán a ciklus utolsó lépése során (ahol a `Dataset` átadja az SPP-vel kapcsolatos adatait a `SPPMethod`-nak) lehetőség van további ún. *callback* függvények meghívására. Egy ilyen beépített callback függvény a `pysprint.eager_executor`. Ez arra használható, hogy minden egyes SPP-vel kapcsolatos adat rögzítése/változtatása után a program azonnal kiszámolja az éppen meglévő adatokból a diszperziót. A korábbiakhoz teljesen hasonlóan kell eljárnunk, csupán a `callback` argumentumot kell megadnunk kiegészítésként. Itt a kötelező argumentumokon túl megadtam a `logfile` és `verbosity` értékeit is: ez minden lépés során a `\"mylog.log\"` fájlba el fogja menteni az adott illesztés eredményeit és egyéb információkat, továbbá a `verbosity=1` miatt a rögzített adatsort is. Ezzel akár könnyen nyomon követhető a kiértékelés menete."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "# a folyamatos kiértékeléshez szükséges callback függvény importálása\n",
    "from pysprint import eager_executor\n",
    "\n",
    "myspp2 = ps.SPPMethod(\n",
    "    ifg_files,\n",
    "    decimal=\".\",\n",
    "    sep=\",\",\n",
    "    skiprows=0,\n",
    "    meta_len=0,\n",
    "    callback=eager_executor(reference_point=2, order=3, logfile=\"mylog.log\", verbosity=1)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <table style=\"border:1px solid black;float:top;\">\n",
       "        <tbody>\n",
       "        <tr>\n",
       "        <td colspan=2 style=\"text-align:center\">\n",
       "        <font size=\"5\">SPPMethod</font>\n",
       "        </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Interferograms accumulated<b></td>\n",
       "            <td style=\"text-align:center\"> 9</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Interferograms cached<b></td>\n",
       "            <td style=\"text-align:center\"> 0</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Data recorded from<b></td>\n",
       "            <td style=\"text-align:center\"> 0</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Eagerly calculating<b></td>\n",
       "            <td style=\"text-align:center\"> True</td>\n",
       "        </tr>\n",
       "        </table>\n",
       "        "
      ],
      "text/plain": [
       "<pysprint.core.methods.spp_interface.SPPMethod at 0x2d226fe84c8>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myspp2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ekkor láthatjuk, hogy az `Eagerly calculating` már `True` értékre változik."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Természetesen a program csak értelmes esetekben fogja elvégezni a számolást (pl. szükséges, hogy az adatpontok száma nagyobb legyen, mint az illesztés rendje ). A teljesség kedvéért megemlítendő, hogy könnyen írható akár saját callback függvény is. Futtassuk le az újonnan létrehozott `myspp2`-n a már megismert *for* ciklust:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GD = 49.67951 ± 0.00000 fs^1$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GDD = -380.81053 ± 16.67232 fs^2$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle TOD = 402.32343 ± 179.81894 fs^3$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with ps.interactive():\n",
    "    for ifg in myspp2:\n",
    "        ifg.open_SPP_panel()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A fenti cella futtatása közben - miután rögzítettünk elég adatot - megjelentek az eredmények, és minden új adatpont hozzáadása esetén frissültek is. Az adatok rögzítését itt ugyan az interaktív felületet használva végeztem, de akár kódban is megtehető: a `myspp` elemein kell az `delay` és `positions` argumentumokat beállítani, és minden új adat hozzáadásánál újra fogja számolni a program. Az előző számolásom közben készült logfile a következő:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---------------------------------------------------------------------------------------\n",
      "Date: 2020-12-30 09:35:32.569563\n",
      "Datapoints used: 3\n",
      "R^2: 1.00000\n",
      "Results:\n",
      "GD = 50.00000 fs^1\n",
      "GDD = -378.39901 fs^2\n",
      "TOD = 368.22696 fs^3\n",
      "Values:\n",
      "x: [2.31146, 2.14193, 1.99999]\n",
      "y: [-50.,   0.,  50.]\n",
      "---------------------------------------------------------------------------------------\n",
      "Date: 2020-12-30 09:35:36.344006\n",
      "Datapoints used: 4\n",
      "R^2: 0.99987\n",
      "Results:\n",
      "GD = 50.92928 fs^1\n",
      "GDD = -398.34978 fs^2\n",
      "TOD = 481.48866 fs^3\n",
      "Values:\n",
      "x: [2.31146, 2.14193, 1.99999, 1.88565]\n",
      "y: [-50.,   0.,  50., 100.]\n",
      "---------------------------------------------------------------------------------------\n",
      "Date: 2020-12-30 09:35:42.355376\n",
      "Datapoints used: 5\n",
      "R^2: 0.99807\n",
      "Results:\n",
      "GD = 51.99789 fs^1\n",
      "GDD = -360.91805 fs^2\n",
      "TOD = 186.61942 fs^3\n",
      "Values:\n",
      "x: [2.31146, 2.14193, 1.99999, 1.88565, 1.73977]\n",
      "y: [-50.,   0.,  50., 100., 150.]\n",
      "---------------------------------------------------------------------------------------\n",
      "Date: 2020-12-30 09:35:48.140150\n",
      "Datapoints used: 6\n",
      "R^2: 0.99455\n",
      "Results:\n",
      "GD = 49.67951 fs^1\n",
      "GDD = -380.81053 fs^2\n",
      "TOD = 402.32343 fs^3\n",
      "Values:\n",
      "x: [2.31146, 2.14193, 1.99999, 1.88565, 1.73977, 1.68063]\n",
      "y: [-50.,   0.,  50., 100., 150., 200.]\n",
      "---------------------------------------------------------------------------------------\n",
      "Date: 2020-12-30 09:35:50.094888\n",
      "Datapoints used: 6\n",
      "R^2: 0.99455\n",
      "Results:\n",
      "GD = 49.67951 fs^1\n",
      "GDD = -380.81053 fs^2\n",
      "TOD = 402.32343 fs^3\n",
      "Values:\n",
      "x: [2.31146, 2.14193, 1.99999, 1.88565, 1.73977, 1.68063]\n",
      "y: [-50.,   0.,  50., 100., 150., 200.]\n"
     ]
    }
   ],
   "source": [
    "!type mylog.log"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ebből a fájlból akár be is tölthetjük a benne szerepelő adatokat. Ehhez használjuk a `from_log` konstruktort:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "spp_checkpoint = ps.SPPMethod.from_log('mylog.log')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ez visszaállította a log fájlban rögzített adatokat. Ezen az objektumon új kiértékelést is végezhetünk, sőt módosíthatjuk a korábban beírt adatokat. Az interferogram értékeit azonban csak ebből a fájlból nem ismerjük, így azok x-y értékek nélkül kerülnek felépítésre. Pl. a visszaállított `spp_checkpoint` első interferogramja:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <div id=\"header\" class=\"row\" style=\"height:10%;width:100%;\">\n",
       "        <div style='float:left' class=\"column\">\n",
       "        <table style=\"border:1px solid black;float:top;\">\n",
       "        <tbody>\n",
       "        <tr>\n",
       "        <td colspan=2 style=\"text-align:center\">\n",
       "        <font size=\"5\">MimickedDataset</font>\n",
       "        </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td colspan=2 style=\"text-align:center\">\n",
       "        <font size=\"3.5\">Parameters</font>\n",
       "        </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Datapoints<b></td>\n",
       "            <td style=\"text-align:center\"> 1</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td style=\"text-align:center\"><b>Predicted domain<b> </td>\n",
       "            <td style=\"text-align:center\"> frequency </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"> <b>Range min</b> </td>\n",
       "        <td style=\"text-align:center\">0.00000 PHz</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"> <b>Range max</b> </td>\n",
       "        <td style=\"text-align:center\">0.00000 PHz</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"> <b>Normalized</b></td>\n",
       "        <td style=\"text-align:center\"> True </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Delay value</b></td>\n",
       "        <td style=\"text-align:center\">-50.0 fs</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>SPP position(s)</b></td>\n",
       "        <td style=\"text-align:center\">2.31146 PHz</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td colspan=2 style=\"text-align:center\">\n",
       "        <font size=\"3.5\">Metadata</font>\n",
       "        </td>\n",
       "        </tr>\n",
       "        \n",
       "        \n",
       "            </tbody>\n",
       "        </table>\n",
       "        </div>\n",
       "        <div style='float:leftt' class=\"column\"><img src='data:image/png;base64,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FREvA/OBf08pvVWciSVJKq5IKRV7hqKpqalJixcvLvYYkqQSEhFLUko1xZ5jR5XFGbwkSdo+Bl6SpAwZeEmSMmTgJUnKkIGXJClDBl6SpAwZeEmSMmTgJUnKkIGXJClDBl6SpAwZeGVv/PjxRAQRQZs2bdhjjz044ogj+M53vsMbb7zRouecNGkSTz311Kc76HaYMWMG06ZNa9axEcFtt922cwfagvHjx9OtW7eSfT4pZwZerULXrl1ZsGABzz//PNOnT+e0007jvvvu49BDD2XJkiXb/XzlFPgFCxZw5pln7tyBtuDiiy/m8ccfL9nnk3JWUewBpEKoqKigX79+Ddtf+9rXuPTSSznqqKMYMWIEr7zyCm3bti3ihDtP4++70Kqrq6muri7Z55Ny5hm8Wq3dd9+dSZMmsXz5cp544omG/ddeey2HHnoonTt3prq6mnPPPXeTS/n77bcfb731Ft/97ncbLv1/fDZ/8803c8QRR9C1a1f22msvTj75ZJYvX77J6z777LN89atfpUuXLnTp0oU+ffrw0EMPbXLMz372Mw4++GB22WUX9t13XyZNmtTw2AUXXMAjjzzC008/3fD648eP3+L32fQSfXNev7EVK1YQEUyfPp0LL7yQLl26UF1dzS9+8Qug7mpGVVUVlZWVjBkzho8++qjha5teUv/ggw/41re+RY8ePdhll12oqqri1FNPZePGjQCsW7eOiy++mKqqKjp06ECPHj245JJLtvh8Tz31VMP6n3nmmXTu3JnPf/7z3HHHHZ/4Pm677Ta6d+9Op06dOOWUU3jyySc3+d9Oyo1n8GrVBg4cSEVFBQsXLmTw4MEArFmzhuuuu46qqirWrl3LzTffzKBBg3jxxRdp06YNM2fO5JhjjuGMM87g4osvBqB3794ArFq1itGjR7Pvvvvy7rvvcueddzJgwAD++Mc/0rVrV959911OOukkhg0bxg033EBKid/97nesW7euYabJkydz3XXXcc011zBw4ECWLFnC2LFj2XXXXRk9ejRjx47l9ddfZ926dQ0ha+5ZbXNef0vGjBnDueeeyyOPPMLUqVM5//zzWbp0Ka+99hpTp05lyZIlXH/99fTt25cRI0Zs9jluvPFG7r//fn70ox+x//7788YbbzB37lw+/PBDAK6++mqef/55brnlFvbee29WrlzJM888s83ZLrnkEs4//3xGjRrFAw88wOWXX05NTQ1HHnkkADNnzuSKK67gsssuY9iwYTz77LOMHDmyWWsmla2UUqu9HX744Un5GzduXNpzzz23+Pjee++dvvGNb2z2sdra2rRq1aoEpKeffrph/5577pnGjRu31detra1NGzZsSJ07d04///nPU0opLVq0KAHp3Xff3ezXrF+/PnXq1CmNHz9+k/1jx45Ne+21V6qtrU0ppXT66aeno48+equv/zEg3Xrrrc16/c3505/+lIB0wQUXbDJnRUVF6tmzZ8NMKaV0xBFHpOHDhzdsN137E088MV199dVbfK2DDz44TZkyZYuPN32++fPnJyCNHTu2Yd/GjRtTt27d0pgxYxr21dTUpCFDhmzyXJdeemkC0vz587f4emqdgMWpBBq1ozcv0avVq/v7/E+PPfYYAwYMoGvXrlRUVDScHS9btmybz7Vw4UKOP/549txzTyoqKth1113529/+1vC1X/jCF+jcuTPnnHMOs2bN+sSZ84IFC/j73//OmWeeSW1tbcNt0KBB/OUvf2HVqlU79L1u6/W35thjj22436VLFyorKzn66KM3ee9Cz549Wb169Rafo0+fPkybNo1JkybxwgsvfGLt+/Tpw+TJk7njjjuatd4fO+GEExrut2vXjl69ejWsVW1tLUuXLmXo0KGbfE3TbSk3Bl6t2vvvv89bb73FXnvtBcCiRYsYOnQo1dXV3HfffSxYsICFCxc2HLs1r7/+OieccAIpJe666y6ee+45Fi1axGc/+9mGr91jjz144okn+OCDDxg+fDiVlZWceOKJvPrqqwC8+eabABx88MG0a9eu4XbMMccAsHLlyh36frf1+luz++67b7Ldvn37ze7b2jpdf/31XH755dxxxx0cdthhdO/enZ/85CcNj992222ccsopTJgwgQMPPJBevXoxffr0Fs328RxvvvkmH374IZWVlZsc03Rbyo2BV6s2f/58amtr6d+/P1D3s9rKykoefPBBhg4dSr9+/dh7772b9Vzz5s1jw4YNzJo1izPOOIMBAwbQp08f3n777U2O69evH/PmzWPdunX88pe/ZNmyZZxzzjkAfOYznwHg0UcfZdGiRZ+4HXbYYTv8PW/t9Xe2Dh06MGHCBFasWMGyZcs466yzuOqqq5g3bx5QF+opU6bwxhtv8Nvf/pYvf/nLnHvuubz88sstfs1u3brRtm1b1q5du8n+pttSbgy8Wq1169YxZswYevbsyXHHHQfAe++9R7t27YiIhuPuv//+T3zt5s5U33vvPdq0aUNFxT/fuzpjxgxqa2s3+/odO3bk5JNP5qKLLmoIWP/+/enYsSN//vOfqamp+cRtt9122+Lrb6/NvX4h9erVi5tuuolddtlls6//xS9+kcmTJ/PRRx/xyiuvtPh1Kioq6Nu3L7Nmzdpk/+zZs1v8nFI58F30ahVqa2sbLrX/9a9/ZcmSJfz0pz9lw4YNzJs3r+HnyMcffzw//vGPueqqqzj55JN5/vnnG34drLGDDjqIOXPmMHjwYDp37syBBx7IoEGD+PDDD7nwwgsZOXIkL730EjfddNMml4/nzJnD1KlTOeWUU+jRowerV6/mrrvuYtCgQUDdGez48eO58soree211zjqqKP46KOPWLZsGfPnz2fmzJkNrz9r1ix+9atfUV1dTVVVFVVVVdtch229/s526qmncvjhh9O3b186duzIww8/TG1tLUcddRQAX/nKVzj11FM55JBDiAjuueceOnXq1PBu+Jb69re/zemnn87o0aMZOnQozz33HHPmzAGgTZt/nud8/D6DJ598codeTyoFBl6twvr16+nfvz8RQZcuXejZsyfnnXceV1xxxSaX4IcMGcLEiRO59dZbueeee+jfvz+PPvooBxxwwCbPN3nyZC6//HJOPPFENmzYwPz58xk4cCDTpk1j/PjxzJw5k8MOO4yHHnqIs846q+HrevbsSURw3XXXsWbNGiorKznppJP44Q9/2HDMNddcQ1VVFbfccgs333wzHTp04IADDtjkeS677DKWLl3KRRddxDvvvMO4ceO2+rvw2/P6O9OAAQN48MEHG87Me/fuzSOPPEJNTQ1QdwVj2rRprFixgrZt29K3b18ee+yxHf5wm9NOO40pU6YwceJEpk6dysCBA7npppsYPnw4Xbp0aTju41/Xk3IQTd/F2prU1NSkxYsXF3sMSUXw/e9/nx/84Ae8/fbbdOzYsdjjqIRExJKUUk2x59hRnsFLyt7atWu58cYbOeaYY9h111359a9/zcSJExk5cqRxV7YMvKTstW/fnldeeYV7772X9evX87nPfY4rr7yS733ve8UeTdppDLyk7HXt2pW5c+cWewypoPw1OUmSMmTgJUnKkIGXJClDBl6SpAwZeEmSMmTgJUnKkIGXJClDBl6SpAwZeEmSMmTgJUnKkIGXJClDBl6SpAwZeEmSMmTgJUnKkIGXJClDBl6SpAwZeEmSMmTgJUnKkIGXJClDZRP4iBgcEX+IiOURce1Wjjs9IlJE1BRyPkmSSklZBD4i2gK3A18HegNnR0TvzRy3G3Al8JvCTihJUmkpi8ADRwLLU0qvppQ2AtOBYZs57nvAROD9Qg4nSVKpKZfA7wOsbLS9qn5fg4j4EtA9pTSnkINJklSKyiXwWxURbYD/AL7ZjGNHRcTiiFi8du3anT+cJElFUC6BXw10b7RdXb/vY7sBhwBPRcQKoB8we3NvtEsp3Z1Sqkkp1VRWVu7EkSVJKp5yCfwioFdE7B8R7YERwOyPH0wprU8pdUsp7ZdS2g9YCAxNKS0uzriSJBVXWQQ+pVQLjAYeB34PzEgpvRQREyJiaHGnkySp9FQUe4DmSinNBeY22XfDFo4dWIiZJEkqVWVxBi9JkraPgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUMGXpKkDBl4SZIyZOAlScqQgZckKUNlE/iIGBwRf4iI5RFx7WYevzoiXo6IFyLiyYjYtxhzSpJUCsoi8BHRFrgd+DrQGzg7Ino3OWwpUJNS+iLwMDCpsFNKklQ6yiLwwJHA8pTSqymljcB0YFjjA1JK81NKG+o3FwLVBZ5RkqSSUS6B3wdY2Wh7Vf2+LRkJPLZTJ5IkqYRVFHuAT1tEnAfUAEdv4fFRwCiAHj16FHAySZIKp1zO4FcD3RttV9fv20REHAd8BxiaUvrH5p4opXR3SqkmpVRTWVm5U4aVJKnYyiXwi4BeEbF/RLQHRgCzGx8QEX2Bu6iL+5oizChJUskoi8CnlGqB0cDjwO+BGSmllyJiQkQMrT9sMtAZeCgi/m9EzN7C00mSlL2y+Rl8SmkuMLfJvhsa3T+u4ENJklSiyuIMXpIkbR8DL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlCEDL0lShgy8JEkZMvCSJGXIwEuSlKGyCXxEDI6IP0TE8oi4djOP7xIRD9Y//puI2K8IY0qSVBLKIvAR0Ra4Hfg60Bs4OyJ6NzlsJPBOSqkncAswsbBTSpJUOsoi8MCRwPKU0qsppY3AdGBYk2OGAT+vv/8wcGxERAFnlCSpZJRL4PcBVjbaXlW/b7PHpJRqgfXAngWZTpKkElNR7AEKLSJGAaPqN/8RES8Wc54y1Q14s9hDlCHXrWVct5Zx3VruwGIP8Gkol8CvBro32q6u37e5Y1ZFRAXQFXir6ROllO4G7gaIiMUppZqdMnHGXLeWcd1axnVrGdet5SJicbFn+DSUyyX6RUCviNg/ItoDI4DZTY6ZDZxff/8M4H9SSqmAM0qSVDLK4gw+pVQbEaOBx4G2wNSU0ksRMQFYnFKaDfwncF9ELAfepu4fAZIktUplEXiAlNJcYG6TfTc0uv8+cOZ2Pu3dn8JorZHr1jKuW8u4bi3jurVcFmsXXsWWJCk/5fIzeEmStB1aReD9mNuWaca6XR0RL0fECxHxZETsW4w5S8221q3RcadHRIoI3+lM89YtIobX/5l7KSL+q9AzlqJm/D3tERHzI2Jp/d/VIcWYs9RExNSIWLOlX5WOOlPq1/WFiPhSoWfcYSmlrG/UvSnv/wGfB9oDvwV6NznmMuDO+vsjgAeLPXexb81ct2OAXevvX+q6NW/d6o/bDXgGWAjUFHvuYt+a+eetF7AU2KN++7PFnrvYt2au293ApfX3ewMrij13KdyAo4AvAS9u4fEhwGNAAP2A3xR75u29tYYzeD/mtmW2uW4ppfkppQ31mwup+3yC1q45f94Avkfd/1/C+4UcroQ1Z90uAW5PKb0DkFJaU+AZS1Fz1i0BXervdwX+XMD5SlZK6RnqfuNqS4YB96Y6C4HdI+JzhZnu09EaAu/H3LZMc9atsZHU/Wu3tdvmutVf6uueUppTyMFKXHP+vB0AHBARz0XEwogYXLDpSldz1m08cF5ErKLuN5GuKMxoZW97/xtYcsrm1+RUuiLiPKAGOLrYs5S6iGgD/AdwQZFHKUcV1F2mH0jd1aJnIuLQlNK6Yg5VBs4GpqWUbo6I/tR9XsghKaWPij2Ydq7WcAa/PR9zy9Y+5raVac66ERHHAd8BhqaU/lGg2UrZttZtN+AQ4KmIWEHdz/Zm+0a7Zv15WwXMTil9kFL6E7CMuuC3Zs1Zt5HADICU0gKgA3WfU6+ta9Z/A0tZawi8H3PbMttct4joC9xFXdz9eWidra5bSml9SqlbSmm/lNJ+1L13YWhKKYvPvt4Bzfl7+ivqzt6JiG7UXbJ/tYAzlqLmrNvrwLEAEfEv1AV+bUGnLE+zgX+rfzd9P2B9Sul/iz3U9sj+En3yY25bpJnrNhnoDDxU/57E11NKQ4s2dAlo5rqpiWau2+PACRHxMvAh8O8ppVZ9pa2Z6/ZN4J6I+D/UveHuAk9gICIeoO4fjN3q358wDmgHkFK6k7r3KwwBlgMbgAuLM2nL+Ul2kiRlqDVcopckqdUx8JIkZcjAS5KUIQMvSVKGDLwkSRky8JIkZcjAS5KUIQMvSVKGDLwkSRky8JIkZcjAS5KUIQMvSVKGDLwkSRky8JIkZcjAS5KUIQMvSVKGDLwkSRky8JIkZcjAS5KUIQMvSVKGDLwkSRky8JIkZcjAS5KUIQMvSVKGDLwkSRky8JIkZcjAS5KUIQMvSVKGDLwkSRn6/zWRPRYBHBUnAAAAAElFTkSuQmCC'>"
      ],
      "text/plain": [
       "<pysprint.core.bases.dataset.MimickedDataset at 0x2d22a787ec8>"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spp_checkpoint[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ez egy ún. `MimickedDataset` objektum, amelyen megkötés nélkül módosíthatjuk az SPP-vel kapcsolatos adatokat. Az adatok változtatására továbbra is reagálni fog az `spp_checkpoint`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GD = 49.67961 ± 0.00000 fs^1$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GDD = -380.80775 ± 16.67256 fs^2$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle TOD = 402.30335 ± 179.82198 fs^3$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "spp_checkpoint.calculate(2, 3);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GD = 50.86642 ± 0.00000 fs^1$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle GDD = -407.56908 ± 18.75457 fs^2$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle TOD = 178.54695 ± 202.27753 fs^3$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# egy adat megváltoztatása\n",
    "spp_checkpoint[0].delay = -70\n",
    "\n",
    "# újraszámolás már más adatokat ad\n",
    "spp_checkpoint.calculate(2, 3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Egy ilyen `MimickedDataset` objektum visszakonvertálható igazi `Dataset` objektummá - amennyiben emlékszünk melyik interferogram fájlhoz tartozott. Ehhez használhatjuk a `to_dataset` függvényt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "mydataset = spp_checkpoint[0].to_dataset('-100.txt', parse=True, skiprows=8, meta_len=0, decimal=\".\", sep=\",\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <div id=\"header\" class=\"row\" style=\"height:10%;width:100%;\">\n",
       "        <div style='float:left' class=\"column\">\n",
       "        <table style=\"border:1px solid black;float:top;\">\n",
       "        <tbody>\n",
       "        <tr>\n",
       "        <td colspan=2 style=\"text-align:center\">\n",
       "        <font size=\"5\">Dataset</font>\n",
       "        </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td colspan=2 style=\"text-align:center\">\n",
       "        <font size=\"3.5\">Parameters</font>\n",
       "        </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Datapoints<b></td>\n",
       "            <td style=\"text-align:center\"> 12551</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td style=\"text-align:center\"><b>Predicted domain<b> </td>\n",
       "            <td style=\"text-align:center\"> frequency </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"> <b>Range min</b> </td>\n",
       "        <td style=\"text-align:center\">0.99998 PHz</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"> <b>Range max</b> </td>\n",
       "        <td style=\"text-align:center\">2.99618 PHz</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"> <b>Normalized</b></td>\n",
       "        <td style=\"text-align:center\"> False </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Delay value</b></td>\n",
       "        <td style=\"text-align:center\">-70.0 fs</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>SPP position(s)</b></td>\n",
       "        <td style=\"text-align:center\">2.31146 PHz</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td colspan=2 style=\"text-align:center\">\n",
       "        <font size=\"3.5\">Metadata</font>\n",
       "        </td>\n",
       "        </tr>\n",
       "        \n",
       "        \n",
       "            </tbody>\n",
       "        </table>\n",
       "        </div>\n",
       "        <div style='float:leftt' class=\"column\"><img src='data:image/png;base64,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'>"
      ],
      "text/plain": [
       "<pysprint.core.bases.dataset.Dataset at 0x2d22a830448>"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mydataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Egy egyszerűbb módszer a betöltésre a `from_pattern` konstruktorral történik. Itt egy mintát kell megadnunk, amire a fájlnevek épülnek. Opcionálisan a `mod` argumentummal csoportosíthatjuk őket a megadott modulo szerint (általában a mod=3 lehet hasznos, ekkor ugyanis a karok spektrumaival könnyen csoportosíthatjuk a fájlokat.) Az általam generált fájlokhoz a `\"*.txt\"` mintát használom, illetve a betöltési opciók változatlanok:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "spp2 = ps.SPPMethod.from_pattern('*.txt', skiprows=8, meta_len=0, decimal=\".\", sep=\",\" )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <table style=\"border:1px solid black;float:top;\">\n",
       "        <tbody>\n",
       "        <tr>\n",
       "        <td colspan=2 style=\"text-align:center\">\n",
       "        <font size=\"5\">SPPMethod</font>\n",
       "        </td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Interferograms accumulated<b></td>\n",
       "            <td style=\"text-align:center\"> 9</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Interferograms cached<b></td>\n",
       "            <td style=\"text-align:center\"> 0</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Data recorded from<b></td>\n",
       "            <td style=\"text-align:center\"> 0</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "        <td style=\"text-align:center\"><b>Eagerly calculating<b></td>\n",
       "            <td style=\"text-align:center\"> False</td>\n",
       "        </tr>\n",
       "        </table>\n",
       "        "
      ],
      "text/plain": [
       "<pysprint.core.methods.spp_interface.SPPMethod at 0x2d22b96c888>"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spp2"
   ]
  }
 ],
 "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.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}