6. Phase osztály

A Phase osztály főként az FT kiértékelési módszer miatt jött létre, itt ugyanis nem feltétlen szükséges kikötni, hogy a fázis polinommal közelíthető. A koszinusz-függvény illesztéses módszeren kívül az összes kiértékelési eljárás ezt az osztályt használja. Miután a megfelelő számolásokat elvégeztük az adott módszer attribútumaként elérhetővé válik a phase vagy a GD. Mivel a WFT és SPP módszernél a csoportkésleltetés görbét kapjuk meg, így azokon a GD, míg a Fourier-transzformáción alapuló és a minimum-maximum módszernél a fázist, így ezeken a phase válik elérhetővé. A két görbe megkülönböztetését a GD_mode argumentum szabályozza. Nézzük meg egy generikus példán:

[1]:
import numpy as np
import matplotlib.pyplot as plt
from pysprint.core.phase import Phase

Ehhez itt egy tetszőleges polinomot használok:

[2]:
x = np.linspace(1, 30, 2000)
y = 2 * x ** 3 - 3 * x ** 2 + 45 * x + 3

fazis = Phase(x, y)
fazis.plot()
_images/hu_phase_3_0.png

A fit függvénnyel ráillesztek egy harmadfokú görbét:

[3]:
fazis.fit(reference_point=0, order=3);
$\displaystyle GD = 45.00000 ± 0.00000 fs^1$
$\displaystyle GDD = -6.00000 ± 0.00000 fs^2$
$\displaystyle TOD = 12.00000 ± 0.00000 fs^3$

Itt látható, hogy a megadott együtthatókat adta vissza a megfelelő faktoriálissal szorozva. Ha ugyan ezt GD_mode=True mellett végzem el:

[4]:
GD = Phase(x, y, GD_mode=True)
GD.fit(reference_point=0, order=4);
$\displaystyle GD = 47.00000 ± 0.00000 fs^1$
$\displaystyle GDD = 45.00000 ± 0.00000 fs^2$
$\displaystyle TOD = -6.00000 ± 0.00000 fs^3$
$\displaystyle FOD = 12.00000 ± 0.00000 fs^4$

Itt megjegyezném, hogy az order kulcsszó minden esetben a keresett diszperzió rendjét és nem feltétlenül az illesztés rendjét jelenti. Ennek köszönhető, hogy a harmadfokú polinomra GD_mode=True mellett az order=4 volt a megfelelő, hiszen ekkor kerül harmadfokú görbe illeszésre. Ezeket könnyen le is kérdezhetjük az order, illetve a dispersion_order argumentumokkal:

[5]:
print(fazis.order, GD.order)
print(fazis.dispersion_order, GD.dispersion_order)
3 3
3 4

A program illesztés után a kiszámolt együtthatókat elmenti, és a megfelelő kulcsszóval ezek elérhetőek:

[6]:
fazis.TOD
[6]:
11.999999999999998
[7]:
GD.plot()
_images/hu_phase_12_0.png

A hibák az errorplot függvénnyel nézhetők meg, a hibák mint np.ndarray az errors kulcsszóval érhetők el:

[8]:
GD.errorplot(percent=True)
_images/hu_phase_14_0.png
[9]:
GD.errors
[9]:
array([-1.06581410e-13, -1.06581410e-13, -9.94759830e-14, ...,
        7.27595761e-12,  0.00000000e+00,  0.00000000e+00])

A slice, vagyis a kivágás ugyan úgy működik, mint minden kiértékelés esetén:

[10]:
fazis3 = Phase(x, y)

fig, ax = plt.subplots(figsize=(8, 8))

fazis3.plot(ax=ax, color="black", label="kivágás előtt")

fazis3.slice(5, 25)

fazis3.plot(ax=ax, color="red", label="kivágás után")
plt.grid()
plt.legend()
[10]:
<matplotlib.legend.Legend at 0x18ab34a2f88>
_images/hu_phase_17_1.png

Az objektumban tárolt adatok a data függvénnyel érhetők el:

[11]:
x, y = fazis3.data
print(x, type(x))
print(y, type(y))
[ 5.004002    5.01850925  5.03301651 ... 24.96598299 24.98049025
 24.9949975 ] <class 'numpy.ndarray'>
[  403.66076273   406.06328969   408.47722827 ... 30379.17802734
 30431.94288131 30484.76956137] <class 'numpy.ndarray'>

Természetesen a hibák nem léteznek addig, amíg nem illesztettünk görbét:

[12]:
fazis3.errors
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-2b3ede9219f4> in <module>
----> 1 fazis3.errors

c:\pyt\pysprint\pysprint\core\phase.py in errors(self)
    383         if self.fitted_curve is not None:
    384             return self.y - self.fitted_curve
--> 385         raise ValueError("Must fit a curve before requesting errors.")
    386
    387     @property

ValueError: Must fit a curve before requesting errors.

A Phase osztályban elérhető több simítási algoritmus is. Ebben a példában az alapértelmezett gaussian_filter1d függvényt mutatom be egy zajos adatsoron:

[13]:
x = np.linspace(1, 10, 1000)
y = np.cos(x) + np.random.normal(0, 0.4, 1000)

zajos = Phase(x, y)
zajos.plot()
_images/hu_phase_23_0.png
[14]:
zajos.plot(color="red", label="előtte")
zajos.smooth(method="gaussian_filter1d", sigma=25)
zajos.plot(color="blue", label="utána")
plt.legend()
[14]:
<matplotlib.legend.Legend at 0x18ab36036c8>
_images/hu_phase_24_1.png

Ha az adatsorban van egy olyan rész, amit ki szeretnénk vágni, ahhoz használhatjuk a remove_range(start, stop) függvényt. Az előbbi adatsorból töröljük ki a 4 és 6 közötti részt.

[15]:
zajos.remove_range(4, 6)
zajos.plot()
_images/hu_phase_26_0.png