Tässä tehtävässä tutustutaan siihen, miten kerätyn datan määrä vaikuttaa muodostettavaan histogrammiin. Havainnollistettavana suureena käytetään edellisessä esimerkissä esiteltyä invarianttia massaa. Käytettävä data on peräisin CERNin CMS-ilmaisimen mittaustuloksista.
CERNissä LHC-hiukkaskiihdyttimellä kiihdytetään hiukkassuihkuja ja törmäytetään niitä toisiinsa. CMS-ilmaisimella voidaan havaita ja mitata näissä törmäyksissä syntyneitä hiukkasia. Alla olevassa kuvassa on CMS-ilmaisin avattuna.
(Kuva: Domenico Salvagnin, https://commons.wikimedia.org/wiki/File:CMS@CERN.jpg)
Aloitetaan koodilla, joka alustaa tarvittavat muuttujat ja paketit histogrammin piirtämistä varten. Tutustu koodin seassa oleviin kommentteihin ja aja koodi klikkaamalla ensin solu aktiiviseksi ja painamalla sitten näppäinyhdistelmää Ctrl + Enter. Tämän jälkeen voit siirtyä vaiheeseen kaksi.
# Haetaan tarvittavat paketit. Pandas on data-analyysiä varten, numpy tieteellistä laskentaa ja
# matplotlib.pyplot mahdollistaa kuvaajien piirtämisen. Annetaan näille lyhyemmät nimet (pd, np ja plt),
# jotta myöhemmin niitä käytettäessä ei tarvitse kirjoittaa koko paketin nimeä.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Luodaan uusi DataFrame-rakenne CMS:n mittausdataa sisältävästä tiedostosta "Zmumu_Run2011A_massoilla.csv".
# Annetaan luodulle DataFramelle nimi 'datasetti'.
datasetti = pd.read_csv('https://raw.githubusercontent.com/cms-opendata-education/cms-jupyter-materials-finnish/master/Data/Zmumu_Run2011A_massoilla.csv')
# Mitä tallennettu tiedosto sisältää? Tarkista tulostamalla ainakin viisi ensimmäistä riviä.
# Kirjoita koodi alle.
# Luodaan Series-rakenne (joka on periaatteessa yksiulotteinen taulukko) ja annetaan sille nimi "invariantti_massa".
# Annetaan tälle arvot 'datasetti'-DataFramen sarakkeelta 'M'.
invariantti_massa = datasetti['M']
# Montako invariantin massan arvoa muuttujaan 'invariantti_massa' on tallennettu? Kirjoita koodi alle.
# Vinkki len()-funktiolla voidaan selvittää listojen ja DataFramejen pituus.
Tässä esimerkissä haluamme itse valita, kuinka montaa invariantin massan arvoa käytetään histogrammin piirtämiseksi. Alla oleva koodi kysyy käyttäjältä valittavien tapahtumien määrän ja piirtää sen jälkeen invariantin massan histogrammin valitulle datamäärälle.
Aja koodi klikkaamalla koodisolu aktiiviseksi ja painamalla näppäinyhdistelmää Ctrl + Enter. Voit ajaa koodia aina uudestaan näppäinyhdistelmällä Ctrl + Enter, jolloin voit syöttää uuden datamäärän eri ajoilla.
Tarkastele koodia. Mitä luulet tapahtuvan, jos
Kokeile, osuiko ennustuksesi oikeaan!
Tutki, miten valitun datan määrä vaikuttaa histogrammiin.
# Pyydetään käyttäjältä tapahtumien määrä ja tallennetaan sen muuttujaan 'lkm'.
# Koodi vaatii toimiakseen kokonaislukusyötteen (integer)
lkm = int(input('Syötä haluttu tapahtumien määrä: '))
# Luodaan if-silmukka, joka tutkii syötettyä tapahtumien määrää eli muuttujan 'lkm' arvoa.
if lkm > len(invariantti_massa):
print(f'''\nDatan määrä on valittu suuremmaksi kuin mitä dataa on saatavilla, joten pyytämääsi
histogrammia ei voitu piirtää. Maksimiarvo datan määrälle on {len(invariantti_massa)}.''')
else:
valitut = invariantti_massa[:lkm]
print(f'\nValitsit koko datasta {lkm} arvoa invariantille massalle.')
plt.hist(valitut, bins=120, range=(60,120))
# Mitä tapahtuu, jos muutat yllä olevia binien ja rangen arvoja?
# Nimetään x- ja y-akselit sekä annetaan histogrammille otsikko.
plt.xlabel('Invariantti massa [GeV/c²]')
plt.ylabel('Tapahtumien lukumäärä pylvästä kohti', fontsize=10)
plt.title('Invariantin massan histogrammi kahdelle myonille\n', fontsize=15)
# Asetetaan y-akseli vakioksi välille 0-800.
plt.ylim([0,800])
# Kokeile muuttaa y-akselin näytettävää väliä. Mitä tapahtuu, jos et määrittele sitä lainkaan?
# Voit kokeilla kommentoimalla koodirivin #-merkin avulla.
# Miten saat muutettua x-akselin väliä? Mistä nykyinen väli tulee?
plt.show()