• Ei tuloksia

4.2 Työn rakenteen luominen

4.2.2 Datan hakeminen

Teoriaosan valmistuttua siirryin työstämään osiota, jossa aloitetaan varsinainen data-analyysi (LIITE A-9). Osion alkuun kirjoitin osion tavoitteen, kerroin käy-tettävän ohjelmointikielen olevan Python sekä avasin käykäy-tettävän datan taustoja.

Kerroin myös, miten data on saatu CSV-tiedostomuotoon liittämällä mukaan linkin koodiin, jolla dataa on käsitely. Tätä linkkiä ja prosessin avaamista ei ollut työn ai-van ensimmäisessä versiossa, vaan lisäsin sen mukaan CERNissä tehtyjen testausten perusteella.

Päätin lisätä osion alkuun myös kolme teknistä huomiota työhön liittyen (LIITE A-9). Ensimmäisessä huomiossa varoitin käyttäjiä mahdollisesta TIMin laskenta-ajan ylittymisestä syntyvästä virheilmoituksesta. On mahdollista, että käytössä olevan suuren datatiedoston käsittely aiheuttaa satunnaisesti liian suuren laskenta-ajan.

Tämä voi kuitenkin korjautua ajamalla koodi uudestaan. Toisena teknisenä huo-miona korostin TIMistä löytyvän Alusta-painikkeen käyttöä (ks. alaluku 4.1). Pai-nikkeen avulla käyttäjä pääsee aina alustamaan koodikomponentin siihen tilaan, jossa se oli työtä aloitettaessa. Kolmantena huomiona päätin kertoa, että koodi-komponenttien toiminta perustuu piilossa olevaan koodiin, joka ajaa aiempia kom-ponentteja. Halusin tällä tiedolla vähentää mahdollista epätietoisuutta siitä, mitä koodikomponenteissa tapahtuu. Työn tekijä saattaisi ihmetellä, miten aiemmissa komponenteissa tehdyt asiat toimivat myös seuraavissa, vaikka komponenteissa ei näy tähän viittaavia komentoja. Tämän kolmannen huomioin lisäsin työhön vasta CERNissä tehtyjen testausten jälkeen Lassila-Perinin ehdotuksesta.

Ensimmäisessä työvaiheessa opiskelija hakee käsittelyyn tutkimusdataa sisältävän tiedoston (LIITE A-9). Tiedoston hakemista varten loin koodikomponentin, johon kirjoitin käyttäjälle valmiiksi tarvittavan Python-koodin. Käyttäjän tulee siis työ-tä tehdessä ainoastaan ajaa komponentin koodi. Komponentin sisältö on esitetty esimerkissä 1.

Esimerkki 1. Työn ensimmäinen koodikomponentti ilman piilotettua koodia.

Näkyvissä olevilla komennoilla haetaan tarvittavat moduulit ja käytettävä data-tiedosto, sekä tulostetaan tiedostossa olevien törmäystapahtumien lukumäärä.

i m p o r t p a n d a s as pd i m p o r t n u m p y as np

i m p o r t m a t p l o t l i b . p y p l o t as plt

ds = pd . r e a d _ c s v ( ’ / cs / d a t a / D o u b l e M u R u n 2 0 1 1 A . csv ’ )

p r i n t( ’ ’ T ö rm ä y s t a p a h t u m i e n l u k u m ä ä r ä = \% d ’ ’ \% len( ds ) )

Kuten alaluvussa 4.1 mainitsin, sisällytin komponentteihin myös käyttäjältä piilos-sa olevaa koodia. Piilospiilos-sa olevaan koodiin kirjoitin komentoja, joita opiskelijan ei tarvitse huomioida. Esimerkin 1 koodikomponentin sisältö kokonaisuudessaan

piilo-tetun koodin kanssa on esitetty esimerkissä 2.

Esimerkki 2. Työn ensimmäinen koodikomponentti piilotetun koodin kanssa.

‘ ‘ ‘ { p l u g i n = ’ ’ c s P l u g i n ’ ’ # pl1 }

Tässä ennen // BYCODEBEGIN -komentoa piilossa on ainoastaan koodikomponentin luomiseen TIMissä tavittavia komentoja. Komennoilla mm. määritetään komponen-tin kieleksi Python sekä annetaan sille nimi. Nimeämisen avulla tämä ensimmäinen komponentti voidaan ajaa käyttäjältä piilossa seuraavia komponentteja ajettaessa.

Varsinainen ohjelma alkaa aina komennostafullprogram: |!!.

Komentoa // BYCODEEND seuraava piilossa oleva rivi poistaa haetusta CSV -tiedostosta sarakkeen M, joka sisältää jo valmiiksi datatiedostoon laskettuna my-oniparien invariantit massat. Sarakkeen poistamisella halusin estää tilanteen, jossa käyttäjä saisi massat suoraan tiedostosta, sillä työssä tavoitteena on laskea massat itse.

Korostin ensimmäisen koodikomponentin yhteydessä, että muuttujan ds nimeä ei saa vaihtaa (LIITE A-9). Mikäli näin tekee, niin mm. esimerkin 2 lopussa oleva sarakkeenM poistaminen ei toimi, sillä se olettaa muuttujan nimen olevan ds.

Käyttäjälle näkyvissä olevassa osassaimport-alkuiset rivit hakevat käyttöön työssä tarvittavat kolme Python-moduulia. Moduulit ovat kooditiedostoja, jotka sisältävät erilaisia valmiiksi laadittuja funktiota. Moduulien avulla käyttäjän ei siis tarvitse itse luoda kaikkia tarvitsemiaan funktioita. Työssä käytetyistä moduuleista pandas sisältää data-analyysissa tarvittavia funktioita, numpy numeerisen laskennan funk-tioita ja matplotlib.pyplot kuvaajien luomisessa tarvittavia funktioita.

Rivillä ds = pd.read_csv(’/cs/data/DoubleMuRun2011A.csv’) haetaan työssä

käytettävä CSV-tiedosto pandas-moduulin avulla. Tämän jälkeen vielä tulostetaan komennollaprint()tiedostossa olevien törmäystapahtumien lukumäärä. Tulostuk-sella halusin korostaa opiskelijalle sitä, että tiedostossa todella on runsas määrä dataa (yhteensä 475 465 riviä).

Työn ensimmäisessä versiossa olin valinnut muuttujan ds nimeksi datasetti.

CERNin testauksissa tekemieni havaintojen perusteella päädyin lyhentämään ni-men. Ainakin yksi työtä CERNissä testanneista pareista koki pitkän nimen kirjoit-tamisen turhana toistona.

Esimerkissä 1 kuvatun koodikomponentin suunnittelun yhteydessä törmäsin tekni-seen haasteetekni-seen. Yritin suunnitteluvaiheessa samassa komponentissa ladata CSV-tiedoston ja tarkastella sen sisältöä, mutta sain TIMissä virheilmoituksen ”Runti-me exceeded, maybe loop forever.” Virheilmoitus tarkoitti, että koodin ajaminen oli kestänyt kauemmin kuin TIMille asetettu suurin laskenta-aika sallii. Kokeilin myös jakaa koodia eri komponentteihin, mutta sain myös tällä tapaa saman virheilmoi-tuksen. Tiedostokooltaan pienempien CSV-tiedostojen käyttäminen toimi ilman vir-heilmoitusta, joten ajattelin ongelman johtuvan liian suuresta tiedostokoosta. Ky-syin ongelmaan apua TIMin kehittäjätiimiltä. He ratkaisivat tilanteen lataamalla työssä käytössä olevan CSV-tiedoston apuhakemistoon, josta TIM lukee tiedoston nopeammin. Tämän jälkeen tiedoston ajaminen toimi hyvin.

Datan hakemista seuraavaksi osioksi loin tyhjän koodikomponentin, johon opiskeli-jan tulee itse kirjoittaa koodi, joka tulostaa haetun tiedoston viisi ensimmäistä riviä (LIITE A-10). Ohjeistin tarvittavat komennot osion yhteydessä. Tulostuksen avulla opiskelijalle tulee näkyviin, mitä eri arvoja datatiedoston rivit sisältävät. Näitä ar-voja tullaan käyttämään työn seuraavassa vaiheessa suoritettavassa laskussa. Tällä osiolla sain myös itse varmistettua, että koodikomponenttien ketjutus toimii. Mikäli ketjutus toimii, eli myöhemmät komponentit ajavat aina kaikki edelliset, tulostuu myös tapahtumien lukumäärä aina seuraavissa komponenteissa, sillä ensimmäinen komponentti tekee tulostamisen. Tämä oli suunnitteluvaiheessa hyvä testi työn toi-mivuudesta.

Työn rakennetta luodessa tajusin, että kehittämisessä olisi hyvä varmistaa, ettei käyttäjä voi jäädä täysin jumiin mahdollisten ohjelmointiongelmien kanssa. Keksin, että työhön voisi lisätä vihjeitä, jotka auttavat tarvittaessa eteenpäin. Löysin TIMis-tä ominaisuuden, jolla dokumenttiin voi luoda klikattaessa aukeavia tekstiosioita.

Tätä ominaisuutta hyödyntäen loin työhön ensimmäisen vinkin (LIITE A-10). Vink-kiä klikatessa esiin tulee teksti ”Vinkki: print(tiedostonimi.head())”, joka on tiedostonimeä lukuun ottamatta valmis koodi edellä mainitun osion komponenttiin.

Korostin vihjeen yhteydessä, että käyttäjän tulisi avata vihje vasta itse yrittämisen jälkeen. Liitteenä olevassa työn PDF-vedoksessa vinkki näkyy jo valmiiksi avattuna ja ilman graafista painiketta.

Tein vastaavanlaiset vihjeet muihinkin työn koodikomponentteihin, joissa opiskeli-jan tulee itse kirjoittaa koodia. Komponentista riippuen loin 1–4 asteittain enem-män ratkaisua paljastavaa vihjettä. Tällä halusin varmistaa työn sujuvuuden. Työtä

tehdessä opiskelija ei voi saada välittömästi apua, sillä työ tehdään ilman ohjaajan avustusta. Myös muut vinkit näkyvät aiemmin mainitulla tavalla liitteenä olevassa PDF-vedoksessa eri tavalla kuin oikeassa työssä.