A laborvezető segítésével kapcsolja be az SBIG ST-5 CCD-kamera vezérlőegységét, majd a mérőgépen futó terminálablakban indítsa el a kamera Jupyterből való vezérlését lehetővé tevő szerverprogramot a következő paranccsal:
cd /labor/ccd/
./server.sh
A parancs futtatása után a program kiírja a képernyőre a CCD-kamera aktuális állapotát. Ezek után csatlakozzon a kamerához a Jupyterből a következő néhány cella lefuttatásával. Amennyiben a csatlakozás néhány másodpercen belül sikertelen, úgy végezze el az alábbi lépéseket:
Ügyeljen arra, hogy a kamera műveleiteinek megszakítása (interrupt kernel) a kamera újraindítását igényelheti!
Ügyeljen arra, hogy a jegyzőköny adatai a cellák újrafuttatásakor elveszhetnek. A mért adatokat mindig mentse a savetxt(file)
paranccsal!
%pylab inline
import sys
import time
import sbigpy
import scipy.optimize
st5 = sbigpy.ST5("tcp://157.181.168.75:3333")
st5.open()
st5.print_status()
Bekapcsolás után az ST5 vezérlőegysége a CCD hőmérsékletét konstans értéken tartja. Az kamera detektorának °C egységekben mért aktuális hőmérsékletét az st5.get_temperature()
függvénnyel olvashatja ki. Írjon egy rövid python scriptet, mely rövid időn keresztül, másodpercenkénti felbontással kiolvassa a kamera termisztorát! Készítsen ábrát a mérésről! Az egy másodperces várakozáshoz használja a time.sleep(sec)
függvényt!
# Hőmérséklet kiolvasása
st5.get_temperature()
# Mintavételezés
temperatures_1a = list()
for i in range(60):
temperatures_1a += [ st5.get_temperature() ]
time.sleep(1)
savetxt("temperatures_1a.txt", temperatures_1a)
# Ábrarajzolás
figsize(12, 8)
plot(temperatures_1a)
xlabel(r"idő $\left[ s \right]$", size=15)
ylabel(r"hőmérséklet $\left[^{\circ}C\right]$", size=15)
title("A CCD mért hőmérséklete az idő függvényében", size=21, y=1.03)
Néhány python parancs segítségével számítsa ki a kapott mintából az átlagos hőmérsékletet és a hőmérséklet stabilitását (szórását)!
# számolás
print("A mért hőmérsékletértékek átlaga:", "%.3f" % mean(temperatures_1a), "°C")
print("A mért hőmérsékletértékek szórása:", "%.3f" % sqrt(var(temperatures_1a)), "°C")
A termosztát kapcsolási pontját az st5.set_temperature(celsius)
függvény segítségével állíthatja be, a termosztát kikapcsolására pedig az st5.reset_temperature()
függvény szolgál. Az alábbi cella lefuttatásával kapcsolja ki a termosztátot, majd az előző feladathoz hasonlóan rövid ideig mintavételezze a hőmérsékletet. Az eredményről készítsen ábrát!
# mérés
st5.reset_temperature()
temperatures_1b = list()
for i in range(60):
temperatures_1b += [ st5.get_temperature() ]
time.sleep(1)
savetxt("temperatures_1b.txt", temperatures_1b)
# ábra
figsize(12, 8)
plot(temperatures_1b)
xlabel(r"idő $\left[ s \right]$", size=15)
ylabel(r"hőmérséklet $\left[^{\circ}C\right]$", size=15)
title("A CCD mért hőmérséklete az idő függvényében, kikapcsolt termosztát mellett", size=21, y=1.03)
Hűtse le a CCD-t -5 °C-ra! A hűtési folyamat során folyamatosan olvassa ki a termiszor pillanatnyi értékét! Ábrázolja a hőmérséklet változását a hűtési folyamat során! Mennyi idő elteltével tekinthető megfelelően stabilnak a detektor hőmérséklete? A hűtési folyamat milyen jellegzetessége figyelhető meg? Mi lehet ennek az oka?
# mérés
st5.set_temperature(-5)
temperatures_1c = list()
for i in range(180):
temperatures_1c += [ st5.get_temperature() ]
time.sleep(1)
savetxt("temperatures_1c.txt", temperatures_1c)
# ábra
figsize(12, 8)
plot(temperatures_1c)
xlabel(r"idő $\left[ s \right]$", size=15)
ylabel(r"hőmérséklet $\left[^{\circ}C\right]$", size=15)
title("A CCD mért hőmérséklete az idő függvényében a hűtés során", size=21, y=1.03)
# válaszok
avg_1c = mean(temperatures_1c[100:])
sig_1c = sqrt(var(temperatures_1c[100:]))
t_c = 0
for t in range(180):
if abs(temperatures_1c[t] - avg_1c) > 5*sig_1c:
tc = t
tc
Válaszok
Az ábráról látszik, hogy valahol 50 s utántól lesz stabil a hőmérséklet. Hogy ezt számszerűsítserm, kiszámoltam, mennyi a hőmérsékletértékek átlaga és szórása 100 s után (amikor már egész biztosan stabil), és megkerestem azt a legkésőbbi időpontot, amikor a hőmérséklet az átlagtól a szórás 5-szörösénél jobban eltér. Ez a fenti számolás alapján 69 s-nál volt, tehát azt mondhatjuk, hogy a hűtés bekapcsolása után 70 s-tól már stabilnak tekinthető a rendszer hőmérséklete.
Az ábrán az a jellegzetesség figyelhető meg, hogy a CCD először lehűl 5°C alá, és utána melegedik vissza a beállított hőmérsékletre. A jelenség valószínűleg azért van, mert a hőmérsékletet egy termosztát szabályozza, ami akkor állítja le a hűtést/fűtést, amikor a rendszer már elérte a kívánt hőmérsékletet, de mivel ekkorra a Peltier-elemben már kialakult hőmérsékletkülönbség van, ez tovább hűti a CCD-t. Amikor pedig lesüllyedt a hőmérséklet 5°C alá, a Peltier elem átáll melegítésre, de mivel ilyenkor már rövidebb ideig melegít, fölfelé már nem lesz akkora túlllépés.
Kapcsolja ki a termosztátot, és mérje ki a detektor melegedési görbéjét. Milyen időállandóval történik a melegedés?
# mérés
st5.reset_temperature()
temperatures_1d = list()
for i in range(120):
temperatures_1d += [ st5.get_temperature() ]
time.sleep(1)
savetxt("temperatures_1d.txt", temperatures_1d)
# ábra
figsize(12, 8)
plot(temperatures_1d)
xlabel(r"idő $\left[ s \right]$", size=15)
ylabel(r"hőmérséklet $\left[^{\circ}C\right]$", size=15)
title("A CCD mért hőmérséklete az idő függvényében a melegedés során", size=21, y=1.03)
# időállandó meghatározása
def convergence(t, Too, T0, tau):
"""
Implements the T(t) = Too + T0 * exp(- t/tau) function
"""
return Too + T0 * exp(-t/tau)
par, cov = scipy.optimize.curve_fit(convergence, linspace(10, 119, 110), temperatures_1d[10:])
print("Az illesztett exponenciális függvény paraméterei:\n" +
"\tToo = " + "%.2f" % par[0] + "°C \u00b1 " + "%.2f" % sqrt(cov[0, 0]) + "°C\n" +
"\tT0 = " + "%.2f" % par[1] + "°C \u00b1 " + "%.2f" % sqrt(cov[1, 1]) + "°C\n" +
"\ttau = " + "%.2f" % par[2] + "s \u00b1 " + "%.2f" % sqrt(cov[2, 2]) + "s (Tehát ennyi az időállandó)" )
A CCD-detektor termikus tulajdonságainak vizsgálatához és az ún. 'dark' képek elkészítéséhez zárja le a kamera nyílását. Felvételt az st5.take_image(cs)
függvény segítségével készíthet, ahol a cs paraméter az expozíciós időt jelenti századmásodpercben. Az elkészült képet az st5.read_image()
függvény segítsével lehet a vezérlőegységről letölteni. A detektor hőmérsékletét az st5.get_temperature()
függvénnyel lehet kiolvasni.
A termosztát kikapcsolt állapota mellett zárja le a kamera nyílását és készítsen egy néhány másodperc expozíciós idejű felvételt. Jegyezze fel az expozíciós időt, és a detektor hőmérsékletét! Az elkészült képet az imshow(img, cmap='gray')
függvény segítségével szürkeárnyalatos képként ábrázolhatja. Az ábrázolási tartomány az imshow
függvény vmin és vmax paramétereivel állítható be.
# mérés
cs = 500
T_2a = st5.get_temperature()
st5.take_image(cs)
img_2a = st5.read_image()
savetxt("img_2a.txt", img_2a)
print("Az exponálási idő: " + str(cs/100) + "s\nACCD hőmérséklete: " + "%.2f" % T_2a + "°C")
# kép ábrázolása
imshow(img_2a, cmap="gray")
title(str(cs/100) + "s exponálási idővel, " + "%.1f" % T_2a + "°C\nhőmérsékleten készült 'dark' kép", size=18, y=1.03)
Készítse el az előző feladatban felvett kép pixelintezitás-hisztogramját! Ábrázolja a hisztogramot úgy, hogy a termikus zaj, illetve a forró pixelek is látszódjanak! Határozza meg a pixelek átlagos értékét és a zaj mértékét. Végezze el a számítást a forró pixelek kiszűrésével is! A tengelyek skálázásánál ügyeljen arra, hogy a kamera A/D konvertere 14 bites.
# hisztogram készítés
_cnt, _edg = histogram(img_2a.ravel(), bins = 2**14, range = [0, 2**14-1])
# hisztogram ábra
step(.5*(_edg[1:]+_edg[:-1]), _cnt)
xlabel("beütésszám", size=13)
ylabel("pixelek száma", size=13)
title("A pixelintenzitás hisztogramja", size=18 , y=1.02)
# átlagos érték és zaj
print("A betütések átlagos értéke ", mean(img_2a.ravel()), "\nA Poisson-zaj (nem tudom, hogy ez kell-e, mert a kérdésemre sem mondták meg, de a jegyzet alapján ez tűnik legvalószínűbbnek)", sqrt(mean(img_2a.ravel())) )
print("Ha nem számoljuk a forró pixeleket, a betütések átlagos értéke ", mean(img_2a.ravel()[where(img_2a.ravel() < 1000)]), "\na Poisson-zaj", sqrt(mean(img_2a.ravel()[where(img_2a.ravel() < 1000)])) )
a = array([1, 2, 5, 3 ,7, 4,3])
a[where(a < 4)]
Ismételje meg az előző mérést különböző expozíciós időkkel, illetve a kamera termosztátjának különböző beállításai mellett. Ügyeljen arra, hogy a termosztátnak jelentős időbe telik, mire stabilizálja a detektor hőmérsékletét! A hőmérsékletet érdemes 15 °C körüli értékről indulva folyamatosan csökkenteni. Rajzolja fel a képeket, és ábrázolja a hisztogrammokat. Határozza meg az egyes képek zaját. Hogyan függ a pixelek zaja a hőmérséklettől és az expozíciós időtől?
# mérés
imgs_cs = list()
for cs in range(100, 601, 100):
st5.take_image(cs)
imgs_cs += [ st5.read_image()]
savetxt("img_cs_"+str(cs)+".txt", imgs_cs[-1])
cs = 200
imgs_T = list()
for T in range(15, -6, -5):
print(T, "a") # checking
st5.set_temperature(T)
print(T, "b") # checking
time.sleep(50)
print(T, "c") # checking
st5.take_image(cs)
imgs_T += [st5.read_image() ]
savetxt("img_T_"+str(T)+".txt", imgs_T[-1])
print(T, "d") # checking
# képek
for i in range(6):
figure()
imshow(imgs_cs[i], cmap="gray")
title("szobahőmérséklet, " + str(i + 1) + "s exponálás")
for i in range(5):
figure()
imshow(imgs_T[i], cmap="gray")
title(str(15-i*5) + "°C, 2s exponálás")
# hisztogramok
figure()
for i in range(6):
_cnt, _edg = histogram(imgs_cs[i].ravel(), bins = 2**14, range = [0, 2**14-1])
step(.5*(_edg[201:1001]+_edg[200:1000]), _cnt[200:1000], label=str(i+1)+"s exponálás")
xlabel("beütésszám", size=13)
ylabel("pixelek száma", size=13)
legend()
title("szobahőmérsékleten, különböző exponálási idők mellett", size=18 , y=1.02)
figure()
for i in range(5):
_cnt, _edg = histogram(imgs_T[i].ravel(), bins = 2**14, range = [0, 2**14-1])
step(.5*(_edg[151:451]+_edg[150:450]), _cnt[150:450], label=str(15-5*i) + "°C")
xlabel("beütésszám", size=13)
ylabel("pixelek száma", size=13)
legend()
title("különböző hőmérséklete, 2s exponálás idő mellett", size=18 , y=1.02)
# számolás
atlag_cs = [ mean(imgs_cs[i]) for i in range(6) ]
zaj_cs = [ sqrt(atlag_cs[i]) for i in range(6) ]
atlag_T = [ mean(imgs_T[i]) for i in range(5) ]
zaj_T = [ sqrt(atlag_T[i]) for i in range(5) ]
# zaj a hőmérséklet függvényében
figsize(12, 8)
plot(linspace(15, -5, 5), zaj_T, "o")
xlabel("hőmérséklet [°C]", size=13)
ylabel("Poisson-zaj", size=13)
title("Poisson-zaj a hőmérséklet függvényében", size=21, y=1.02)
# zaj az integrálási idő függvényében
plot(linspace(1, 6, 6), zaj_cs, "o")
xlabel("integrálási idő [s]", size=13)
ylabel("Poisson-zaj", size=13)
title("Poisson-zaj az integrálási idő függvényében", size=21, y=1.02)
a mérés szöveges értékelése
A hőmérséklet függvényében gondolom exponenciálisan emelkedik a zaj a Boltzman-eloszlás miatt, az integrálási idő függvényében én azt várnám, hogy gyökösen fog, ami akár lehetséges is ez alapján az ábra alapján.
Állítsa a szűrőváltot szűrő nélküli állásba és válasszon minimális (f/22) blendenyílást. Hűtse le a detektort -10 fokra, majd készítsen egy képet a méréshez tartozó apró bábuk valamelyikéről. Válasszon olyan expozíciós időt, hogy kihasználja a detektor dinamikatartományát, ugyanakkor a pixelek ne szaturálódjanak. Ha szükséges, a laborvezető segítségével állítson a fókuszon. Rajzolja fel a képet is az intenzitáshisztogramot!
A továbbiakban úgy nevezze el a változókat, hogy az összes elkészült kép a memóriában maradjon, mert szükség lesz rájuk. A képeket tartalmazó tömböket az np.save
függvénnyel bináris fájlokba is mentse el!
# hőmérséklet beállítása
# expozíció
# kép felrajzolása
# histogram felrajzolása
Helyezzen egy papírlapot a kamera elé, és a 3. a) feladatban használt expozíciós idő és hőmérséklet mellett készítsen legalább 5 fókuszálatlan felvételt az egyenletesen megvilágított papírlapról. (Egyenként töltse le a képeket, hogy a kameraprocesszor belső buffere nehogy túlcsorduljon!) Átlagolja ki a képeket, majd ábrázolja!
# felvételek készítése
# átlagolás
# a kiátlagolt flat ábrázolása
# tapasztalatok
Az előző kép még nyers, a detektor sötétáramát is tartalmazza. Ismét takarja el az objektív nyílását, és készítsen dark felvételeket az előzővel megegyező expozíciós idővel és detektorhőmérséklettel. Átlagoljon ki legalább 10 képet. Erre használhatja a kameraprocesszor belső bufferét az alábbi rövid script segítségével:
# Dark kép rögzítése
N = 10
st5.clr_buf(sbigpy.ST5.BUFFER_ACCU)
for i in range(N):
st5.take_image(50)
st5.accum_image()
dark = st5.read_image(buffer=sbigpy.ST5.BUFFER_ACCU)
dark = dark / N
# kép felrajzolása
# hisztogram
# tapasztalatok
Az előző feladathoz hasonlóan, eltakart detektorállás mellett készítsen bias felvételeket, melyből a detektor pixeleinek nullponti értékei határozhatók meg. A felvételeket minimális, 1/100 másodperces idővel készítse.
# Bias kép rögzítése
N = 10
st5.clr_buf(sbigpy.ST5.BUFFER_ACCU)
for i in range(N):
st5.take_image(1)
st5.accum_image()
bias = st5.read_image(buffer=sbigpy.ST5.BUFFER_ACCU)
bias = bias / N
# kép felrajzolása
# hisztogram
# tapasztalatok
Az $I = \frac{R - D}{F}$ formula alapján készítse el és ábrázolja a kalibrált képet. Hasonlítsa össze az eredetivel, és elemezze a tapasztalatokat!
# számolás
# ábrázolás
# hisztogram
Készítsen a báburól egy-egy felvételt a három színszűrővel. Ügyeljen arra, hogy két expozíció között se a kamera, se a modell ne mozduljon el. Az előző feladatban megismert módon kalibrálja a képeket. Mindhárom színszűrő esetében használhatja a szűrő nélküli flat képeket.
# felvételek elkészítése
# kalibráció
# a három színcsatorna ábrázolása külön-külön
Kombinálja össze a három színcsatornát színes RGB képpé! Ábrázolja a képet! Ügyeljen arra, hogy az imshow
függvény csak uint8
típusú tömbökben tárolt színes képeket tud megjeleníteni. Elemezze a tapasztalatait. Milyen módon lehet meghatározni a három színcsatorna helyes keverési arányát?
# számolás
# ábrázolás
# tapasztalatok
Kitölteni nem kötelező:
Észrevételezem, hogy 10 perc van hátra a 3 és fél órás laborból és a 43 pontnyi feladatból 25 pontnyit csináltam meg. Nem kezdek bel a hátralévőkbe, mert úgysem fejezem be, és nem akarok ezzel otthon foglalkozni. Jó lenne, ha a feladatokat jelentősen lecsökkentenék, gondolok itt elsősorban arra a részre, ahol vagy egy tucatnyi mérést kell csinálni. Én automatizáltam, hogy gyorsabb legyen, és nem is mértem sokat, mégis az utóbbi 2 órát (a laboridő több mint felét) a 2 c) feladattal töltöttem.
Ezen kívül jelentősen javítana a mérési esélyeken, ha a leírás lényegretörőbb lenne: 17 oldalas leírásból fél oldal az ami tényleg szükséges, 1-2 oldal az, ami a nem szükséges, de hasznos infó, a többin pedig amíg átrágom elsikkad minden lényeges információ (pláne, hogy az utolsó oldalakban van a lényeg).
Az előző két mérésemhez (fénysebesség, hang2) képest ez egy hatalmas visszaesés a követelmények teljesíthetősége (és a lelki nyugalmam kímélése) terén.