Ezt az eljárást szimulált interferogramon mutatom be. Példaként generálok egyet:
import numpy as np
import matplotlib.pyplot as plt
import pysprint as ps
g = ps.Generator(1, 4, 2.5, delay=900, GDD=400, FOD=40000, pulse_width=3, resolution=0.05)
g.generate()
mywft = ps.WFTMethod(*g.data)
mywft.plot()
Ablakfüggvény sorozatot adok hozzá az interferogramhoz:
mywft.add_window_linspace(2.2, 3.1, 1000, fwhm=0.04, order=2)
FONTOS!
Ha a fenti add_window_linspace
lefutott, akkor az ablakfüggvény sorozat már hozzáadódott az interferogramhoz. Ha később megváltoztatnánk bármelyik paraméterét (pl. inkább más fwhm
-ot szeretnénk beállítani), akkor az előző ablakfüggvények is megmaradak. Emiatt ajánlott a fenti cellát a következőképpen használni:
# az összes hozzáadott ablakfüggvény eltávolítása függetlenül attól, hogy korábban voltak-e
mywft.remove_all_windows()
# ezután adom hozzá az ablakfüggvény sorozatot
mywft.add_window_linspace(2.2, 3.1, 1000, fwhm=0.05, order=2)
Az aktuálisan hozzáadott ablakfüggvényeket a WFTMethod.windows
paraméterrel érjük el, ami egy dictionary
-t ad vissza, amelyben a key az ablakfüggvény központi helye, a hozzá tartozó value pedig maga az ablakfüggvény reprezentációja (ps.core.method.wft.Window
).
len(mywft.windows)
1000
Ablakfüggvényt törölni a remove_window_at(center)
függvénnyel lehetséges. Ennek az ablakfüggvény központi helyét kell megadni. Ha nincs olyan ablakfüggvény, akkor a hibaüzenetben segítséget nyújt: kiiírja a legközelebbi ablakfüggvényt.
mywft.remove_window_at(2.25)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-6-09040b9a91a3> in <module> ----> 1 mywft.remove_window_at(2.25) c:\pyt\pysprint\pysprint\utils\decorators.py in wrapper(self, *args, **kwds) 78 inplace = kwds.pop("inplace", True) 79 if inplace: ---> 80 method(self, *args, **kwds) 81 else: 82 return method(copy(self), *args, **kwds) c:\pyt\pysprint\pysprint\core\methods\wft.py in remove_window_at(self, center) 359 ) 360 raise ValueError( --> 361 f"There is no window with center {center}. " 362 f"Did you mean {c[0]}?" 363 ) ValueError: There is no window with center 2.25. Did you mean 2.24954954954955?
Mivel ez a módszer ún. embarrassingly parallel számítás, ezért lehetőség van több szálon futtatni a kiértékelést.
Ehhez a Dask csomagnak telepítve kell lennie (Anaconda-ban alapértelmezetten benne van). Ezt a parallel
argumentummal szabályozhatjuk. A többszálas futás általában 50-70% gyorsulást eredményez a single-core módhoz képest. A kiértékelést most parallel=True
módon fogom futtatni:
mywft.calculate(reference_point=2.5, order=4, fastmath=False, parallel=True);
[########################################] | 100% Completed | 10.1s Errors found: 0
A fenti calculate
függvény ha már egyszer lefutott és megpróbáljuk újra lefuttatni más referencia ponttal vagy más illesztési renddel, akkor a gyorsítótárazás miatt azok már azonnal végrehajtódnak (csak az illesztést számolja újra).
mywft.heatmap()
mywft.errorplot(percent=True)
Példa tetszőleges plotok készítésére:
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(13, 11))
mywft.plot(ax=ax1)
ax1.set(title="Eredeti ifg")
mywft.view_windows(ax=ax2, maxsize=200, alpha=0.3)
ax2.set(title="Eredeti ifg ablakfüggvényekkel")
mywft.heatmap(ax=ax3, include_ridge=True)
ax3.set(title="Contourplot");
mywft.errorplot(ax=ax4, percent=True)
c:\pyt\pysprint\pysprint\core\methods\wft.py:311: PySprintWarning: Image seems crowded, displaying only a subsample of the given windows. PySprintWarning [ legend.py:1193 - _parse_legend_args() ] No handles with labels found to put in legend.
Egy másik szimulált interferogram kiértékelését most parallel=False
módon fogom elvégezni, és csak a build_GD
függvényt használom, amivel a GD görbét kapom vissza (ps.core.phase.Phase
).
f = ps.Generator(1, 4, 2.5, delay=1900, GDD=-600, TOD=4000, pulse_width=3, resolution=0.05)
f.generate()
mywft2 = ps.WFTMethod(*f.data)
mywft2.add_window_arange(1.5, 3.5, 0.01, std=0.04)
GD_gorbe = mywft2.build_GD()
Progress : [==============================] 100% (Errors: 0)
GD_gorbe.plot()
GD_gorbe.fit(reference_point=2.5, order=3);
GD_gorbe.errorplot(percent=True)
A fastmath
opciót itt nem adtam meg. Ez alapértelmezetten True
, ilyenkor a heatmap
nem hívható, mivel ekkor az ahhoz szükséges adatokat nem építi fel a program.
mywft2.heatmap()
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-21-a73a1c58c8ce> in <module> ----> 1 mywft2.heatmap() c:\pyt\pysprint\pysprint\core\methods\wft.py in heatmap(self, ax, levels, cmap, include_ridge) 689 if self.fastmath: 690 raise ValueError( --> 691 "You need to recalculate with `fastmath=False` to plot the heatmap." 692 ) 693 # Only construct if we need to.. ValueError: You need to recalculate with `fastmath=False` to plot the heatmap.
Néhány hiányosság:
A gerincvonalat a program automatikusan keresi meg, jelenleg még nincs lehetőség manuálisan állítani. Ez jól működik szimulált példákon, viszont rosszul is teljesíthet valós mérések esetén. Jelenleg ez a része a programnak fejlesztés alatt van (manuális állítás, különböző filterezése a detektált gerincvonalnak, pl. moving avarage validation.)
Csak egyetlen egy gerincvonalat keres meg, így nem alkalmas pl. kettősen törő optikai szálak esetén, amikor mindkét polarizációs tengelye mentén terjedő módus egyidejűleg gerjesztve van. Szintén fejlesztés alatt van.