Advertisement
Guest User

Untitled

a guest
Dec 7th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.25 KB | None | 0 0
  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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement