daily pastebin goal
4%
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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top