Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import ikkunasto
- import matplotlib.pyplot as plt
- import numpy
- import os
- tila = {
- "tekstilaatikko": None,
- "xdata": [],
- "ydata": [],
- "instensiteettikeskiarvot": [],
- "pisteet": [],
- "ikkunan_tila": None,
- "piirtoalue": None,
- "kehys": None,
- "datan_tila": False,
- "kuvaajan_tila": False,
- "kohinan_tila": False,
- "kuvaaja": None,
- "data_luettu": False
- }
- def lue_data(kansio):
- """Lukee kaikki datatiedostot annetusta kansiosta.
- Ohittaa tiedostot, jotka eivät ole päätteeltään .mydat sekä tiedostot,
- joiden sisältämässä datassa on virheitä. Rikkinäisten tiedostojen nimet ilmoitetaan käyttäjälle."""
- tiedot= []
- virheelliset = []
- tiedostot = os.listdir(kansio)
- for nimi in tiedostot:
- if nimi.endswith(".txt"): #testaa onko tiedosto tekstitiedosto
- sopivuus = True
- oikeapolku = os.path.join(kansio, nimi)
- rivintiedot = []
- with open(oikeapolku, "r") as kohde:
- for rivi in kohde.readlines():
- rivinsisalto = rivi.strip().split(" ")
- if len(rivinsisalto) == 2:
- try:
- rivinsisalto[0] = float(rivinsisalto[0])
- rivinsisalto[1] = float(rivinsisalto[1])
- rivintiedot.append(rivinsisalto)
- except ValueError:
- sopivuus = False
- break
- else:
- sopivuus = False
- break
- if sopivuus == True:
- for k in rivintiedot:
- tiedot.append(k)
- else:
- virheelliset.append(nimi)
- else:
- polku = os.path.join(kansio, nimi)
- if os.path.isdir(polku):
- tiedot.append(lue_data(polku))
- print(tiedot)
- return tiedot, virheelliset, tiedostot
- #tämä funktio ottaa tiedoista energian ja intensiteetin arvot ja palauttaa intensiteetit summina
- def avaa_kansio():
- if tila["data_luettu"] == True:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Data on jo luettu")
- else:
- kansio = ikkunasto.avaa_hakemistoikkuna("hakemisto","C:\\Users\\Keränen\\Desktop\\koodit")
- tiedot, virheelliset, tiedostot = lue_data(kansio)
- viesti0 = "luettiin {} riviä dataa.".format(len(tiedostot))
- for datapari in tiedot:
- tila["xdata"].append(datapari[0])
- tila["ydata"].append(datapari[1])
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], viesti0)
- listatesti = tila["ydata"]
- datakirjastot = []
- #tämä käy läpi 500 alkion joukkoja tiedot listasta ja lisää ne uuteen listaan
- for i in range(int(len(tiedot)/500 + 0.95)):
- alku = i*500
- loppu = (i + 1) * 500
- datakirjastot.append(listatesti[alku:loppu])
- instensiteettikeskiarvot = []
- n = 20
- for i in range(500):
- s = 0
- for y in datakirjastot:
- s += y[i]
- tila["instensiteettikeskiarvot"].append(s/n)
- tila["datan_tila"] = True
- tila["data_luettu"] = True
- def piirra_spektri():
- if tila["datan_tila"] is False:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Dataa ei ole luettu")
- elif tila["kuvaajan_tila"] == False:
- xdata = tila["xdata"]
- kehys = ikkunasto.luo_kehys(tila["ikkunan_tila"], ikkunasto.YLA)
- piirtoalue, kuvaaja = ikkunasto.luo_kuvaaja(kehys, valitse_datapiste, 600, 400)
- kuva = kuvaaja.add_subplot(111)
- kuva.plot(xdata[0:500], tila["instensiteettikeskiarvot"])
- kuva.set_xlabel("Sidosenergia (eV)")
- kuva.set_ylabel("Intensiteetti")
- kuva.set_title("spektri")
- tila["kuvaaja"] = kuvaaja
- tila["kehys"] = kehys
- tila["piirtoalue"] = piirtoalue
- piirtoalue.show()
- tila["kuvaajan_tila"] = True
- elif tila["kuvaajan_tila"] == True:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kuvaaja on jo piirretty")
- def valitse_datapiste(button_press_event):
- """Ottaa vastaan hiiren klikkaustapahtuman ja lukee siitä datapisteen
- x- ja y-arvot. Arvot tulosteetaan tekstilaatikkoon sekä talletetaan
- ohjelman tilasanakirjassa olevaan pisteet-listaan."""
- if button_press_event.xdata == None or button_press_event.ydata == None:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Klikkasit kuvaajan ulkopuolelta idiootti")
- else:
- tila["pisteet"].append((button_press_event.xdata, button_press_event.ydata))
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Klikatussa pisteessä ({:.6f}),({:.6f})".format(button_press_event.xdata, button_press_event.ydata))
- def laske_parametrit(x1, y1, x2, y2):
- """Laskee annettujen pisteiden välisen suoran kulmakertoimen ja vakiotermin."""
- k = (y2 - y1) / (x2 - x1)
- b = (x2 * y1 - x1 * y2) / (x2 - x1)
- return k, b
- def poista_kohina():
- """Poistaa kohinan spektristä klikkaamalla kahta pistettä"""
- pisteet = tila["pisteet"]
- ydata = tila["instensiteettikeskiarvot"]
- xdata = tila["xdata"]
- xdata = xdata[0:500]
- if tila["kohinan_tila"] == True:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kohina on jo poistettu")
- else:
- try:
- if len(pisteet) == 2:
- piste_1 = pisteet[0]
- piste_2 = pisteet[1]
- x_1 = float(piste_1[0])
- x_2 = float(piste_2[0])
- y_1 = float(piste_1[1])
- y_2 = float(piste_2[1])
- k, b = laske_parametrit(x_1, y_1, x_2, y_2)
- lista = []
- for i, datay in enumerate(ydata):
- x = xdata[i]
- y = k * x + b
- a = datay - y
- lista.append(a)
- ikkunasto.poista_elementti(tila["kehys"])
- kehys = ikkunasto.luo_kehys(tila["ikkunan_tila"], ikkunasto.YLA)
- piirtoalue, kuvaaja = ikkunasto.luo_kuvaaja(kehys, valitse_datapiste, 600, 400)
- kuva = kuvaaja.add_subplot(111)
- xdata = tila["xdata"]
- kuva.plot(xdata[0:500], lista)
- kuva.set_xlabel("Sidosenergia (eV)")
- kuva.set_ylabel("Intensiteetti")
- kuva.set_title("Spektri ilman taustakohinaa")
- ikkunasto.luo_vaakaerotin(kehys)
- piirtoalue.show()
- tila["kohinan_tila"] = True
- else:
- pass
- except:
- pass
- else:
- tila["pisteet"] = []
- if tila["datan_tila"] == False:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Dataa ei ole luettu")
- elif tila["kuvaajan_tila"] == False:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kuvaajaa ei ole piirretty")
- elif pisteet != 2:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Valitse kaksi pistettä lineaarisen kohinan positamiseksit")
- def pyyda_vali():
- """Pyytää käyttäjältä kaksi pistettä
- Syötettä kysytään kunnes käyttäjä antaa kaksi kelvollista pistettä.
- Syötetyt luvut palautetaan liukulukuina."""
- pisteet = tila["pisteet"]
- while True:
- if len(pisteet) != 2:
- if tila["datan_tila"] == False and tila["kuvaajan_tila"] == False:
- break
- elif tila["datan_tila"] == True and tila["kuvaajan_tila"] == False:
- break
- elif tila["datan_tila"] == True and tila["kuvaajan_tila"] == True:
- tila["pisteet"] = []
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Anna tasan kaksi pistettä intensiteetipiikin arvon laskemiseksi!!!")
- break
- elif len(pisteet) == 2:
- return pisteet[0], pisteet[1]
- def etsi_indeksit(data, minimi, maksimi):
- """Etsii annetusta numeerista dataa sisältävästä listasta alku- ja päätepisteet siten,
- että alueen arvot ovat annettujen minimi- ja maksimiarvojen välissä.
- Palauttaa näiden pisteiden indeksit."""
- totuus = True
- loppuindeksi = 0
- alkuindeksi = -1
- for i in range(len(data)):
- if data[i] >= minimi[0] and totuus:
- totuus = False
- alkuindeksi = i
- if data[i] > maksimi[0]:
- loppuindeksi = i
- break
- if loppuindeksi == 0:
- loppuindeksi = len(data)
- if alkuindeksi == -1:
- alkuindeksi = len(data)
- return alkuindeksi, loppuindeksi
- def kysy_valeja(data_1, data_2):
- """Kysyy käyttäjältä datavälejä yhdestä datalistasta ja
- tulostaa mitkä arvot ovat vastaavalla alueella toisessa datalistassa.
- Kyselyfunktio lopetetaan tyhjällä syötteellä."""
- while True:
- index1, index2 = pyyda_vali()
- if index1 == None:
- break
- vali1, vali2 = etsi_indeksit(data_1, min(index1, index2), max(index1, index2))
- vali_1 = data_1[int(vali1):int(vali2)]
- vali_2 = data_2[int(vali1):int(vali2)]
- return vali_1, vali_2
- def laske_piikin_arvo():
- """laskee yhden intensiteettipiikin arvon integroimalla"""
- pisteet = tila["pisteet"]
- try:
- vali_1, vali_2 = kysy_valeja(tila["xdata"], tila["instensiteettikeskiarvot"])
- vastaus = numpy.trapz(vali_2, x = vali_1)
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Piikin intensiteetin arvo on {}".format(vastaus))
- tila["pisteet"] = []
- print(pisteet)
- except TypeError:
- tila["pisteet"] = []
- if tila["datan_tila"] == False:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Dataa ei ole luettu")
- elif tila["kuvaajan_tila"] == False:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kuvaajaa ei ole piirretty")
- def tallenna_kuvaaja():
- """tämä funktio tallentaa kuvaajan jonka käyttäjä on piirtänyt"""
- """tämä funktio tallentaa kuvaajan jonka käyttäjä on piirtänyt"""
- if tila["datan_tila"] is False:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Dataa ei ole luettu")
- elif tila["datan_tila"] == True and tila["kuvaajan_tila"] == False:
- ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kuvaajaa ei ole piirretty")
- elif tila["kuvaajan_tila"] == True:
- tila["kuvaaja"].savefig(ikkunasto.avaa_tallennusikkuna("tallenna"))
- def undo():
- ikkunasto.poista_elementti(tila["kehys"])
- piirra_spektri()
- def main():
- """Luo käyttöliittymäikkunan, jossa on vasemmalla kaksi nappia
- ja oikealla tekstilaatikko, johon nappia painamalla voidaan tulostaa tekstiä."""
- akkuna = ikkunasto.luo_ikkuna("spektri")
- tila["ikkunan_tila"] = akkuna
- nappikehys = ikkunasto.luo_kehys(akkuna, ikkunasto.VASEN) #tähän napit
- kehys = ikkunasto.luo_kehys(akkuna, ikkunasto.YLA) #tähän spektrien kuvaajat
- tila["kehys"] = kehys
- kehys2 = ikkunasto.luo_kehys(akkuna, ikkunasto.ALA) #tähän ilmoitukset
- nappi_lataa = ikkunasto.luo_nappi(nappikehys, "lataa data", avaa_kansio) #ei valmis
- nappi_piirra = ikkunasto.luo_nappi(nappikehys, "piirrä kuvaaja", piirra_spektri)
- nappi_poista_kohina = ikkunasto.luo_nappi(nappikehys, "poista taustakohina", poista_kohina)
- nappi_laske_intensiteeti = ikkunasto.luo_nappi(nappikehys, "laske intensiteetti", laske_piikin_arvo)
- nappi_tallenna_kuvaaja = ikkunasto.luo_nappi(nappikehys, "tallenna kuvaaja", tallenna_kuvaaja)
- nappi_resetoi_pisteet = ikkunasto.luo_nappi(nappikehys, "undo", undo)
- nappi_lopeta = ikkunasto.luo_nappi(nappikehys, "lopeta", ikkunasto.lopeta)
- tekstilaatikko = ikkunasto.luo_tekstilaatikko(kehys2, 68, 20)
- tila["tekstilaatikko"] = tekstilaatikko
- ikkunasto.kaynnista()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement