3. Datan valitseminen histogrammiin#

Tässä harjoituksessa käytämme CMS-detektorin keräämää dataa törmäyksistä, joissa on havaittu kaksi myonia, joiden invariantti massa on välillä 60-120 GeV [1]. Data sisältää 10851 törmäystapahtumaa, joissa myonien invariantti massa on valmiiksi laskettu. Tämän harjoituksen tarkoituksena on tarkastella, miten valitun datan määrä vaikuttaa piirtämäämme histogrammiin.

[1] CMS collaboration (2016). DoubleMu primary dataset in AOD format from RunA of 2011 (/DoubleMu/Run2011A-12Oct2013-v1/AOD). CERN Open Data Portal. DOI: 10.7483/OPENDATA.CMS.RZ34.QR6N.

1) Tiedoston lukeminen#

  • Tuo moduulit pandas, numpy ja matplotlib.pyplot, käytä lyhenteitä pd, np ja plt

  • Lue datatiedosto pandas-moduulin avulla. Tallenna tiedot muuttujaan datasetti. Tiedoston polku on ‘https://raw.githubusercontent.com/cms-opendata-education/cms-jupyter-materials-finnish/master/Data/Zmumu_Run2011A_massoilla.csv’

  • Tallenna invariantti massa muuttujaan invariantti_massa
    $\color{purple}{\text{Kirjoita koodi alle.}}$

# Tuo moduulit pandas, numpy ja matplotlib.pyplot käyttäen import-komentoa


# Lue datatiedosto ja tallenna tiedot muuttujaan 'datasetti'


# Tallenna invariantti massa muuttujaan 'invariantti_massa'

2) Valitaan käytetyn datan määrä#

Alla oleva koodi kysyy käyttäjältä, kuinka monta tapahtumaa valitaan piirrettäväksi ja piirtää histogrammin valittujen tapahtumien invarianteista massoista. Voit ajaa koodisolun uudelleen, jolloin saat valita tapahtumien määrän uudelleen. Voit vain ajaa koodisolun kiinnittämättä sen enempää huomiota koodin sisältöön. Jos koodin sisältö kuitenkin kiinnostaa, niin koodin kommentit kertovat, mitä kullakin rivillä on tehty.

Tutki koodin avulla seuraavia asioita:

  1. Miten valitun datan määrä vaikuttaa histogrammiin?

  2. Mitä invariantin massan arvoa datasta löytyy eniten?

  3. Mitä voit päätellä kohdan 2 vastauksestasi?

Bonus: Mitä tapahtuu, jos valitset esimerkiksi 20000 tapahtumaa piirrettäväksi? Miksi?

# Luodaan tyhjä lista 'valitut', johon tallennetaan valittujen invarianttien massojen arvot.
valitut = []

# Pyydetään käyttäjää valitsemaan tapahtumien lukumäärä. Tallennetaan luku muuttujaan 'määrä'.
määrä = int(input('Kuinka monta tapahtumaa valitaan: '))

# Tarkastetaan, onko datassa tarpeeksi tapahtumia. Jos tapahtumia ei ole tarpeeksi, tulostetaan virheilmoitus.
# Muussa tapauksessa massat valitaan ja tallennetaan 'valitut'-listaan.
if määrä > len(invariantti_massa):
    print('Virhe: Histogrammin piirto epäonnistui. Ei tarpeeksi dataa. Maksimimäärä tapahtumia on ' + str(len(invariantti_massa)) + '.')
else:
    for f in range(määrä):
        M = invariantti_massa[f]
        valitut.append(M)
    print('\n Valitsit datasta {} invariantin massan arvoa.'.format(määrä))

# Piirretään histogrammi valitusta datamäärästä. Valitaan pylväiden lukumäärä 'bins' sekä x-akselin väli 'range'.
plt.hist(valitut, bins=120, range=(60,120))

# Nimetään akselit ja annetaan histogrammille otsikko.
plt.xlabel('Invariantti massa [GeV]')
plt.ylabel('Tapahtumien lukumäärä')
plt.title('Kahden myonin invariantti massa\n')

# Tyhjennetään lista 'valitut' seuraavaa ajoa varten.
valitut = []
---------------------------------------------------------------------------
StdinNotImplementedError                  Traceback (most recent call last)
Cell In[2], line 5
      2 valitut = []
      4 # Pyydetään käyttäjää valitsemaan tapahtumien lukumäärä. Tallennetaan luku muuttujaan 'määrä'.
----> 5 määrä = int(input('Kuinka monta tapahtumaa valitaan: '))
      7 # Tarkastetaan, onko datassa tarpeeksi tapahtumia. Jos tapahtumia ei ole tarpeeksi, tulostetaan virheilmoitus.
      8 # Muussa tapauksessa massat valitaan ja tallennetaan 'valitut'-listaan.
      9 if määrä > len(invariantti_massa):

File /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/ipykernel/kernelbase.py:1201, in Kernel.raw_input(self, prompt)
   1199 if not self._allow_stdin:
   1200     msg = "raw_input was called, but this frontend does not support input requests."
-> 1201     raise StdinNotImplementedError(msg)
   1202 return self._input_request(
   1203     str(prompt),
   1204     self._parent_ident["shell"],
   1205     self.get_parent("shell"),
   1206     password=False,
   1207 )

StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.

3) Animaatio histogrammista, kun datan määrä kasvaa#

Alla oleva koodi luo animaation, jossa histogrammiin lisätään dataa. Tässä kohtaa ei tarvitse ymmärtää, mitä koodisolujen tekstit tarkoittavat.

Pohdi animaation perusteella, mikä merkitys on käytetyn datan määrällä on. Aja kaikki alla olevat solut ja odota nähdäksesi animaation.

Huom! Solujen ajaminen voi kestää useita minuutteja, joten ole kärsivällinen.

import matplotlib.animation
from scipy.stats import norm

def updt_hist(num, invariantti_massa):
    plt.cla()
    plt.xlim((0,150))
    plt.hist(invariantti_massa[:num*25], bins = 150)
%%capture

fig = plt.figure(figsize=(15,10))
anim = matplotlib.animation.FuncAnimation(fig, updt_hist, frames = 100, fargs = (invariantti_massa,))

from IPython.display import HTML
HTML(anim.to_jshtml())
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[4], line 1
----> 1 fig = plt.figure(figsize=(15,10))
      2 anim = matplotlib.animation.FuncAnimation(fig, updt_hist, frames = 100, fargs = (invariantti_massa,))
      4 from IPython.display import HTML

NameError: name 'plt' is not defined
HTML(anim.to_jshtml())
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[5], line 1
----> 1 HTML(anim.to_jshtml())

NameError: name 'HTML' is not defined