daily pastebin goal
26%
SHARE
TWEET

Untitled

a guest Dec 7th, 2017 63 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import ikkunasto
  2. import matplotlib.pyplot as plt
  3. import numpy
  4. import os
  5.  
  6.  
  7. tila = {
  8.     "tekstilaatikko": None,
  9.     "xdata": [],
  10.     "ydata": [],
  11.     "instensiteettikeskiarvot": [],
  12.     "pisteet": [],
  13.     "ikkunan_tila": None,
  14.     "piirtoalue": None,
  15.     "kehys": None,
  16.     "datan_tila": False,
  17.     "kuvaajan_tila": False,
  18.     "kohinan_tila": False,
  19.     "kuvaaja": None,
  20.     "data_luettu": False
  21. }
  22.  
  23.  
  24.    
  25.  
  26. def lue_data(kansio):
  27.     """Lukee kaikki datatiedostot annetusta kansiosta.
  28.     Ohittaa tiedostot, jotka eivät ole päätteeltään .mydat sekä tiedostot,
  29.     joiden sisältämässä datassa on virheitä. Rikkinäisten tiedostojen nimet ilmoitetaan käyttäjälle."""
  30.     tiedot= []
  31.     virheelliset = []
  32.     tiedostot = os.listdir(kansio)
  33.    
  34.     for nimi in tiedostot:
  35.    
  36.         if nimi.endswith(".txt"): #testaa onko tiedosto tekstitiedosto
  37.             sopivuus = True
  38.             oikeapolku = os.path.join(kansio, nimi)
  39.             rivintiedot = []
  40.            
  41.             with open(oikeapolku, "r") as kohde:
  42.            
  43.                 for rivi in kohde.readlines():
  44.                     rivinsisalto = rivi.strip().split(" ")
  45.                     if len(rivinsisalto) == 2:
  46.                         try:
  47.                            
  48.                             rivinsisalto[0] = float(rivinsisalto[0])
  49.                             rivinsisalto[1] = float(rivinsisalto[1])
  50.                             rivintiedot.append(rivinsisalto)
  51.                         except ValueError:
  52.                             sopivuus = False
  53.                             break
  54.                     else:
  55.                         sopivuus = False
  56.                         break
  57.             if sopivuus == True:
  58.                 for k in rivintiedot:
  59.                     tiedot.append(k)
  60.             else:
  61.                 virheelliset.append(nimi)
  62.         else:
  63.             polku = os.path.join(kansio, nimi)
  64.             if os.path.isdir(polku):
  65.                 tiedot.append(lue_data(polku))
  66.             print(tiedot)
  67.     return tiedot, virheelliset, tiedostot
  68.  
  69.  
  70. #tämä funktio ottaa tiedoista energian ja intensiteetin arvot ja palauttaa intensiteetit summina
  71. def avaa_kansio():
  72.     if tila["data_luettu"] == True:
  73.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Data on jo luettu")
  74.     else:
  75.         kansio = ikkunasto.avaa_hakemistoikkuna("hakemisto","C:\\Users\\Keränen\\Desktop\\koodit")
  76.         tiedot, virheelliset, tiedostot = lue_data(kansio)
  77.         viesti0 = "luettiin {} riviä dataa.".format(len(tiedostot))
  78.  
  79.         for datapari in tiedot:
  80.             tila["xdata"].append(datapari[0])
  81.             tila["ydata"].append(datapari[1])
  82.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], viesti0)
  83.         listatesti = tila["ydata"]
  84.         datakirjastot = []
  85.         #tämä käy läpi 500 alkion joukkoja tiedot listasta ja lisää ne uuteen listaan
  86.         for i in range(int(len(tiedot)/500 + 0.95)):
  87.             alku = i*500
  88.             loppu = (i + 1) * 500
  89.             datakirjastot.append(listatesti[alku:loppu])
  90.         instensiteettikeskiarvot = []
  91.         n = 20
  92.  
  93.        
  94.         for i in range(500):
  95.             s = 0
  96.             for y in datakirjastot:
  97.                 s += y[i]
  98.        
  99.  
  100.             tila["instensiteettikeskiarvot"].append(s/n)
  101.         tila["datan_tila"] = True
  102.         tila["data_luettu"] = True
  103.  
  104.  
  105.  
  106. def piirra_spektri():
  107.     if tila["datan_tila"] is False:
  108.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Dataa ei ole luettu")
  109.     elif tila["kuvaajan_tila"] == False:
  110.         xdata = tila["xdata"]
  111.         kehys = ikkunasto.luo_kehys(tila["ikkunan_tila"], ikkunasto.YLA)
  112.         piirtoalue, kuvaaja = ikkunasto.luo_kuvaaja(kehys, valitse_datapiste, 600, 400)
  113.         kuva = kuvaaja.add_subplot(111)
  114.         kuva.plot(xdata[0:500], tila["instensiteettikeskiarvot"])
  115.         kuva.set_xlabel("Sidosenergia (eV)")
  116.         kuva.set_ylabel("Intensiteetti")
  117.         kuva.set_title("spektri")
  118.         tila["kuvaaja"] = kuvaaja
  119.         tila["kehys"] = kehys
  120.         tila["piirtoalue"] = piirtoalue
  121.         piirtoalue.show()
  122.         tila["kuvaajan_tila"] = True
  123.     elif tila["kuvaajan_tila"] == True:
  124.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kuvaaja on jo piirretty")
  125.    
  126.  
  127.  
  128.  
  129.  
  130.    
  131. def valitse_datapiste(button_press_event):
  132.     """Ottaa vastaan hiiren klikkaustapahtuman ja lukee siitä datapisteen
  133.     x- ja y-arvot. Arvot tulosteetaan tekstilaatikkoon sekä talletetaan
  134.     ohjelman tilasanakirjassa olevaan pisteet-listaan."""
  135.     if button_press_event.xdata == None or button_press_event.ydata == None:
  136.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Klikkasit kuvaajan ulkopuolelta idiootti")
  137.     else:
  138.         tila["pisteet"].append((button_press_event.xdata, button_press_event.ydata))
  139.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Klikatussa pisteessä ({:.6f}),({:.6f})".format(button_press_event.xdata, button_press_event.ydata))
  140.  
  141.  
  142. def laske_parametrit(x1, y1, x2, y2):
  143.     """Laskee annettujen pisteiden välisen suoran kulmakertoimen ja vakiotermin."""
  144.  
  145.     k = (y2 - y1) / (x2 - x1)
  146.     b = (x2 * y1 - x1 * y2) / (x2 - x1)
  147.     return k, b
  148.    
  149.  
  150. def poista_kohina():
  151.     """Poistaa kohinan spektristä klikkaamalla kahta pistettä"""
  152.     pisteet = tila["pisteet"]
  153.     ydata = tila["instensiteettikeskiarvot"]
  154.     xdata = tila["xdata"]
  155.     xdata = xdata[0:500]
  156.     if tila["kohinan_tila"] == True:
  157.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kohina on jo poistettu")
  158.     else:
  159.         try:
  160.             if len(pisteet) == 2:
  161.                 piste_1 = pisteet[0]
  162.                 piste_2 = pisteet[1]
  163.                 x_1 = float(piste_1[0])
  164.                 x_2 = float(piste_2[0])
  165.                 y_1 = float(piste_1[1])
  166.                 y_2 = float(piste_2[1])
  167.                 k, b = laske_parametrit(x_1, y_1, x_2, y_2)
  168.                 lista = []
  169.                 for i, datay in enumerate(ydata):
  170.                     x = xdata[i]
  171.                     y = k * x + b
  172.                     a = datay - y
  173.                     lista.append(a)
  174.                 ikkunasto.poista_elementti(tila["kehys"])
  175.                 kehys = ikkunasto.luo_kehys(tila["ikkunan_tila"], ikkunasto.YLA)
  176.                 piirtoalue, kuvaaja = ikkunasto.luo_kuvaaja(kehys, valitse_datapiste, 600, 400)
  177.                 kuva = kuvaaja.add_subplot(111)
  178.                 xdata = tila["xdata"]
  179.                 kuva.plot(xdata[0:500], lista)
  180.                 kuva.set_xlabel("Sidosenergia (eV)")
  181.                 kuva.set_ylabel("Intensiteetti")
  182.                 kuva.set_title("Spektri ilman taustakohinaa")
  183.                 ikkunasto.luo_vaakaerotin(kehys)
  184.                 piirtoalue.show()
  185.                 tila["kohinan_tila"] = True
  186.             else:
  187.                 pass
  188.         except:
  189.             pass
  190.         else:
  191.             tila["pisteet"] = []
  192.             if tila["datan_tila"] == False:
  193.                 ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Dataa ei ole luettu")
  194.             elif tila["kuvaajan_tila"] == False:
  195.                 ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kuvaajaa ei ole piirretty")
  196.             elif pisteet != 2:
  197.                 ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Valitse kaksi pistettä lineaarisen kohinan positamiseksit")
  198.  
  199.  
  200.  
  201. def pyyda_vali():
  202.     """Pyytää käyttäjältä kaksi pistettä
  203.     Syötettä kysytään kunnes käyttäjä antaa kaksi kelvollista pistettä.
  204.     Syötetyt luvut palautetaan liukulukuina."""
  205.     pisteet = tila["pisteet"]
  206.     while True:
  207.         if len(pisteet) != 2:
  208.             if tila["datan_tila"] == False and tila["kuvaajan_tila"] == False:
  209.                 break
  210.             elif tila["datan_tila"] == True and tila["kuvaajan_tila"] == False:
  211.                 break
  212.             elif tila["datan_tila"] == True and tila["kuvaajan_tila"] == True:
  213.                 tila["pisteet"] = []
  214.                 ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Anna tasan kaksi pistettä intensiteetipiikin arvon laskemiseksi!!!")
  215.                 break
  216.            
  217.            
  218.  
  219.         elif len(pisteet) == 2:
  220.             return pisteet[0], pisteet[1]
  221.  
  222. def etsi_indeksit(data, minimi, maksimi):
  223.     """Etsii annetusta numeerista dataa sisältävästä listasta alku- ja päätepisteet siten,
  224.     että alueen arvot ovat annettujen minimi- ja maksimiarvojen välissä.
  225.     Palauttaa näiden pisteiden indeksit."""
  226.     totuus = True
  227.     loppuindeksi = 0
  228.     alkuindeksi = -1
  229.     for i in range(len(data)):
  230.         if data[i] >= minimi[0] and totuus:
  231.             totuus = False
  232.             alkuindeksi = i
  233.         if data[i] > maksimi[0]:
  234.             loppuindeksi = i
  235.             break
  236.     if loppuindeksi == 0:
  237.         loppuindeksi = len(data)
  238.     if alkuindeksi == -1:
  239.         alkuindeksi = len(data)
  240.    
  241.     return alkuindeksi, loppuindeksi
  242.  
  243.  
  244. def kysy_valeja(data_1, data_2):
  245.     """Kysyy käyttäjältä datavälejä yhdestä datalistasta ja
  246.     tulostaa mitkä arvot ovat vastaavalla alueella toisessa datalistassa.
  247.     Kyselyfunktio lopetetaan tyhjällä syötteellä."""
  248.     while True:
  249.         index1, index2 = pyyda_vali()
  250.         if index1 == None:
  251.             break
  252.        
  253.    
  254.         vali1, vali2 = etsi_indeksit(data_1, min(index1, index2), max(index1, index2))
  255.         vali_1 = data_1[int(vali1):int(vali2)]
  256.         vali_2 = data_2[int(vali1):int(vali2)]
  257.         return vali_1, vali_2
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.        
  265. def laske_piikin_arvo():
  266.     """laskee yhden intensiteettipiikin arvon integroimalla"""
  267.     pisteet = tila["pisteet"]
  268.     try:
  269.         vali_1, vali_2 = kysy_valeja(tila["xdata"], tila["instensiteettikeskiarvot"])
  270.         vastaus = numpy.trapz(vali_2, x = vali_1)
  271.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Piikin intensiteetin arvo on {}".format(vastaus))
  272.         tila["pisteet"] = []
  273.         print(pisteet)
  274.     except TypeError:
  275.         tila["pisteet"] = []
  276.         if tila["datan_tila"] == False:
  277.             ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Dataa ei ole luettu")
  278.  
  279.         elif tila["kuvaajan_tila"] == False:
  280.             ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kuvaajaa ei ole piirretty")
  281.  
  282. def tallenna_kuvaaja():
  283.     """tämä funktio tallentaa kuvaajan jonka käyttäjä on piirtänyt"""
  284.     """tämä funktio tallentaa kuvaajan jonka käyttäjä on piirtänyt"""
  285.     if tila["datan_tila"] is False:
  286.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Dataa ei ole luettu")
  287.     elif tila["datan_tila"] == True and tila["kuvaajan_tila"] == False:
  288.         ikkunasto.kirjoita_tekstilaatikkoon(tila["tekstilaatikko"], "Kuvaajaa ei ole piirretty")
  289.     elif tila["kuvaajan_tila"] == True:
  290.         tila["kuvaaja"].savefig(ikkunasto.avaa_tallennusikkuna("tallenna"))
  291.  
  292. def undo():
  293.     ikkunasto.poista_elementti(tila["kehys"])
  294.     piirra_spektri()
  295.    
  296. def main():
  297.     """Luo käyttöliittymäikkunan, jossa on vasemmalla kaksi nappia
  298.     ja oikealla tekstilaatikko, johon nappia painamalla voidaan tulostaa tekstiä."""
  299.     akkuna = ikkunasto.luo_ikkuna("spektri")
  300.     tila["ikkunan_tila"] = akkuna
  301.     nappikehys = ikkunasto.luo_kehys(akkuna, ikkunasto.VASEN) #tähän napit
  302.     kehys = ikkunasto.luo_kehys(akkuna, ikkunasto.YLA)  #tähän spektrien kuvaajat
  303.     tila["kehys"] = kehys
  304.     kehys2 = ikkunasto.luo_kehys(akkuna, ikkunasto.ALA) #tähän ilmoitukset
  305.     nappi_lataa = ikkunasto.luo_nappi(nappikehys, "lataa data", avaa_kansio) #ei valmis
  306.     nappi_piirra = ikkunasto.luo_nappi(nappikehys, "piirrä kuvaaja", piirra_spektri)
  307.     nappi_poista_kohina = ikkunasto.luo_nappi(nappikehys, "poista taustakohina", poista_kohina)
  308.     nappi_laske_intensiteeti = ikkunasto.luo_nappi(nappikehys, "laske intensiteetti", laske_piikin_arvo)
  309.     nappi_tallenna_kuvaaja = ikkunasto.luo_nappi(nappikehys, "tallenna kuvaaja", tallenna_kuvaaja)
  310.     nappi_resetoi_pisteet = ikkunasto.luo_nappi(nappikehys, "undo", undo)
  311.     nappi_lopeta = ikkunasto.luo_nappi(nappikehys, "lopeta", ikkunasto.lopeta)
  312.     tekstilaatikko = ikkunasto.luo_tekstilaatikko(kehys2, 68, 20)
  313.     tila["tekstilaatikko"] = tekstilaatikko
  314.     ikkunasto.kaynnista()
RAW Paste Data
Top