Higgsiä metsästämässä - esimerkki tutkimuksesta#

Tässä harjoitteessa käydään läpi miten Higgsin bosonia etsittiin ja miten tieteellinen tutkimus usein toimii.

Käytetty data on aitoa, merkityksellistä mittausdataa kokeista, joissa Higgsin bosonin olemassaolo todistettiin. Tätä seurasikin sitten pian Nobelin palkinto. Nyt tuo data on myös sinun tutkittavanasi sen sijaan, että se piilottelisi jossain valmiiden kuvien takana.

Metodi on hyvin yleispätevä ja käytössä monilla tieteenaloilla. Kun meillä on jonkinlaista teoriapohjaa, voimme tehdä mittauksia ja vertailla tuloksia oletuksiimme. Ehkäpä tulokset vahvistavat odotuksemme, kenties niistä nousee uusia kysymyksiä, voi olla että joudumme korjaamaan teorioitamme tai jopa kehittämään aivan uusia selittääksemme havainnot. Tämä sykli sitten toistuu uudelleen ja uudelleen porautuessamme syvemmälle luonnon toimintaan.

Aloitetaanpa Higgsin bosonin metsästys!

# Tuodaan tarvittavat paketit
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Tässä haetaan CERN:n avoin data portaalista useita eri datatiedostoja
# Mitä enemmän dataa, sitä varmempia tuloksia Higgsin löytymisestä voimme saada!
# Tähän dataan palataan pian.

csvs = [pd.read_csv('http://opendata.cern.ch/record/5200/files/4mu_2011.csv'), pd.read_csv('http://opendata.cern.ch/record/5200/files/4e_2011.csv'), pd.read_csv('http://opendata.cern.ch/record/5200/files/2e2mu_2011.csv')]
csvs += [pd.read_csv('http://opendata.cern.ch/record/5200/files/4mu_2012.csv'), pd.read_csv('http://opendata.cern.ch/record/5200/files/4e_2012.csv'), pd.read_csv('http://opendata.cern.ch/record/5200/files/2e2mu_2012.csv')]

fourlep = pd.concat(csvs)

Standardimallin ennusteiden mukaan Higgsin bosoni voi hajota mm. siten, että siitä syntyy ensin kaksi Z-bosonia ja niistä edelleen neljä leptonia (elektroneja, myoneja…). Neljä leptonia voi kuitenkin syntyä myös monista muista prosesseista, jotka vaikeuttavat tehtäväämme Higgsin bosonin metsästyksessä. Nämä muut prosessit ovat analyysissämme siis taustakohinaa, josta meidän tulisi erottaa ne prosessit, joissa Higgsin hiukkanen on ollut osallisena. Teoria itsessään ei kerro paljoakaan siitä, mikä Higgsin hiukkasen massa voisi olla, mutta valistuneilla arvauksilla päästään aika pitkälle. Esimerkiksi hiukkasen hajoaminen neljään leptoniin on todennäköisempää tietyillä massoilla, joten kohdistetaan etsintämme näihin massoihin.

Tarkoituksenamme on siis tutkia törmäyksessä syntyneille neljälle leptonille laskettua invarianttia massaa tekemällä usean törmäyksen datasta histogrammi.

# Tutkitaan sellaisia tapahtumia, joissa neljälle leptonille laskettu invariantti massa
# on välillä 70 GeV - 181 GeV 

rmin = 70
rmax = 181
nbins = 37

hist, bins, patches = plt.hist(fourlep['M'], bins = nbins, range = (rmin,rmax))

width = 1.0*(bins[1] - bins[0])
center = (bins[:-1] + bins[1:]) / 2

plt.xlabel('4l invariantti massa (GeV)', fontsize = 15)
plt.ylabel('Tapahtumia\n', fontsize = 15)
plt.show()
../_images/b91adccc38a5734c68a4387766d721d51908e509b5a90f5f7332df9fa865b130.png

Histogrammissa näkyy joitakin massan alueita, joissa on enemmän tapahtumia kuin muissa, mutta emme pysty kuitenkaan tekemään varmoja johtopäätöksiä Higgsin olemassaolosta tästä kuvasta.

Otetaan tutkimuksemme avuksi simulaatioita. Jos tunnemme joitain prosesseja, joita törmäyksissä tapahtuu, voimme vertailla niiden odotettavia tuloksia varsinaisiin mittauksiimme. Alla on Monte Carlo-menetelmillä tuotettuja arvoja, jotka on painotettu luminositeetin, poikkileikkauksen ja tapahtumien määrän mukaan. Periaatteessa niissä on siis luotu satunnaisvaihtelulla maustettua dataa, jollaista voisi saada oikeastakin mittauksesta, niin että kyseinen joukko noudattaa samanlaista jakaumaa kuin kyseisen prosessin on mitattu tuottavan.

Simulaatiodata vastaa siis eri “hajoamiskanavista” peräisin olevien neljän leptonin massajakaumia.

dy = np.array([0,0,0,0,0,0.354797,0.177398,2.60481,0,0,0,0,0,0,0,0,0,0.177398,0.177398,0,0.177398,0,0,0,0,0,0,0,0,0,0,0,0.177398,0,0,0,0])
ttbar = np.array([0.00465086,0,0.00465086,0,0,0,0,0,0,0,0.00465086,0,0,0,0,0,0.00465086,0,0,0,0,0.00465086,0.00465086,0,0,0.0139526,0,0,0.00465086,0,0,0,0.00465086,0.00465086,0.0139526,0,0])
zz = np.array([0.181215,0.257161,0.44846,0.830071,1.80272,4.57354,13.9677,14.0178,4.10974,1.58934,0.989974,0.839775,0.887188,0.967021,1.07882,1.27942,1.36681,1.4333,1.45141,1.41572,1.51464,1.45026,1.47328,1.42899,1.38757,1.33561,1.3075,1.29831,1.31402,1.30672,1.36442,1.39256,1.43472,1.58321,1.85313,2.19304,2.95083])
hzz = np.array([0.00340992,0.00450225,0.00808944,0.0080008,0.00801578,0.0108945,0.00794274,0.00950757,0.0130648,0.0163568,0.0233832,0.0334813,0.0427229,0.0738129,0.13282,0.256384,0.648352,2.38742,4.87193,0.944299,0.155005,0.0374193,0.0138906,0.00630364,0.00419265,0.00358719,0.00122527,0.000885718,0.000590479,0.000885718,0.000797085,8.86337e-05,0.000501845,8.86337e-05,0.000546162,4.43168e-05,8.86337e-05])

Vilkaistaas millaisia muotoja nämä tuottavat ja miten ne suhtautuvat kiihdyttimessä mitattuihin tuloksiin.

# ZZ, pari raskaampaa bosonia.

plt.figure(figsize = (15,3))
plt.bar(center, zz, align = 'center', width = width, color = 'b', linewidth = 0, edgecolor = 'black', alpha = 0.5)

plt.xlabel('4l invariantti massa (GeV)', fontsize = 15)
plt.ylabel('Tapahtumia / 3 GeV\n', fontsize = 15)
plt.xlim(rmin,rmax)
plt.show()
../_images/c698af07d499e0165e9d93e13b99c7d5efb889ae700b7a734111ef0f6f81e472.png
# DY, yksittäisistä Z-bosoneista koostuvia tapahtumia.

plt.figure(figsize = (15,3))
plt.bar(center, dy, align = 'center', width = width, color = 'g', linewidth = 0, edgecolor = 'black', alpha = 0.5)

plt.xlabel('4l invariantti massa (GeV)', fontsize = 15)
plt.ylabel('Tapahtumia / 3 GeV\n', fontsize = 15)
plt.xlim(rmin,rmax)
plt.show()
../_images/a8a72ce031b0678b232307f3716baebc038423534b10e25f7d6d8363a3c81786.png
# ttbar, top- ja antitopkvarkkien pari.

plt.figure(figsize = (15,3))
plt.bar(center, ttbar, align = 'center', width = width, color = 'gray', linewidth = 0, edgecolor = 'b', alpha = 0.5)

plt.xlabel('4l invariantti massa (GeV)', fontsize = 15)
plt.ylabel('Tapahtumia / 3 GeV \n', fontsize = 15)
plt.xlim(rmin,rmax)
plt.show()
../_images/3fdc0f2a620f8ba382df543bceb16c34645fbc58c0b541a41bbb2500eaa26746.png

Lyödään askeiset päällekäin ja tarkastellaan, miltä voisimme olettaa tulostemme näyttävän.

plt.figure(figsize = (15,5))

# ttbar 
ttbar_bar = plt.bar(center, ttbar, align = 'center', width = width, color = 'gray', linewidth = 0, edgecolor = 'b',
                    alpha = 0.5, label = r'$t\bar{t}$')

# DY
dy_bar = plt.bar(center, dy, align = 'center', width = width, color = 'g', linewidth = 0, edgecolor = 'black',
                 alpha = 0.5, bottom = ttbar, label = 'Z/$\gamma^{*}$ + X')

# ZZ
zz_bar = plt.bar(center, zz, align = 'center', width = width, color = 'b', linewidth = 0, edgecolor = 'black',
                 alpha = 0.5, bottom = ttbar+dy, label = r'ZZ $\rightarrow$ 4l')

plt.title('$ \sqrt{s} = 7$ TeV, L = 2.3 $fb^{-1}$; $\sqrt{s} = 8$ TeV, L = 11.6 $fb^{-1}$ \n', fontsize = 12)
plt.xlabel('$m_{4l}$ (GeV)', fontsize = 15)
plt.ylabel('Tapahtumia / 3 GeV\n', fontsize = 15)
plt.ylim(0,25)
plt.xlim(rmin,rmax)
plt.legend(fontsize = 15)

plt.show()
../_images/f37fe6de14e0db2637af2bbbe439ef490366c43ee0100b97804d2c12f26e9332.png

Selvästi ainakin 90 GeVin tietämillä on tapahtumia, mikä käy järkeen huomioiden suurimman osan tuloksista syntyvän Z-bosonien kautta, joiden massa on noin 90 GeV. Otetaanpa sitten mukaan myös itse mittaukset. Miten hyvin kuvat vastaavat toisiaan?

plt.figure(figsize = (15,5))

xerrs = [width*0.5 for i in range(0, nbins)]
yerrs = np.sqrt(hist)

# ttbar 
ttbar_bar = plt.bar(center, ttbar, align = 'center', width = width, color = 'gray', linewidth = 0, edgecolor = 'b',
                    alpha = 0.5, label = r'$t\bar{t}$')

# DY
dy_bar = plt.bar(center, dy, align = 'center', width = width, color = 'g', linewidth = 0, edgecolor = 'black',
                 alpha = 0.5, bottom = ttbar, label = 'Z/$\gamma^{*}$ + X')

# ZZ
zz_bar = plt.bar(center, zz, align = 'center', width = width, color = 'b', linewidth = 0, edgecolor = 'black',
                 alpha = 0.5, bottom = ttbar+dy, label = r'ZZ $\rightarrow$ 4l')

# Mittaukset.
data_bar = plt.errorbar(center, hist, xerr = xerrs, yerr = yerrs, linestyle = 'None', color = 'black',
                        marker = 'o', label = 'Data')

plt.title('$ \sqrt{s} = 7$ TeV, L = 2.3 $fb^{-1}$; $\sqrt{s} = 8$ TeV, L = 11.6 $fb^{-1}$ \n', fontsize = 12)
plt.xlabel('$m_{4l}$ (GeV)', fontsize = 15)
plt.ylabel('Tapahtumia / 3 GeV\n', fontsize = 15)
plt.ylim(0,25)
plt.xlim(rmin,rmax)
plt.legend(fontsize = 15)

plt.show()
../_images/5ad4a0cbed9a991c0e14c5314c11d83b6265f4bad46df6a40ae50e51f881aa56.png

Kaikki mittapisteet eivät selvästikään selity tuntemillamme taustaprosesseilla. Vertailua varten fyysikot laskivat hajontoja Higgsin bosonille lähtien eri massaisista oletuksista. Tässä näytetään, millainen hajonta tuolla hiukkasella olisi, jos Higgsin massa olisi suunnilleen 125 GeV.

# HZZ, teoreettinen oletus Higgsin bosonin muodolle 125 GeVin kohdalla.

plt.figure(figsize = (15,3))
plt.bar(center, hzz, align = 'center', width = width, color = 'w', linewidth = 1, edgecolor = 'r')

plt.xlabel('4l invariantti massa (GeV)', fontsize = 15)
plt.ylabel('Tapahtumia / 3 GeV\n', fontsize = 15)
plt.xlim(rmin,rmax)
plt.show()
../_images/a83256b374ca1dd1ffe2ef51c38e7c67dd3ac627cf86c531f5587bd2f8a5da1f.png

Bonuskysymys: miten jokin, jolla on 125 GeVin massa, voi hajota kahdeksi Z-bosoniksi, jonka massa on yli 90 GeViä?

Lisätääs tämäkin tulos kokonaiskuvaan.

plt.figure(figsize = (15,5))

# ttbar 
ttbar_bar = plt.bar(center, ttbar, align = 'center', width = width, color = 'gray', linewidth = 0, edgecolor = 'b',
                    alpha = 0.5, label = r'$t\bar{t}$')

# DY
dy_bar = plt.bar(center, dy, align = 'center', width = width, color = 'g', linewidth = 0, edgecolor = 'black',
                 alpha = 0.5, bottom = ttbar, label = 'Z/$\gamma^{*}$ + X')

# ZZ
zz_bar = plt.bar(center, zz, align = 'center', width = width, color = 'b', linewidth = 0, edgecolor = 'black',
                 alpha = 0.5, bottom = ttbar+dy, label = r'ZZ $\rightarrow$ 4l')

# HZZ
hzz_bar = plt.bar(center, hzz, align = 'center', width = width, color = 'w', linewidth = 1, edgecolor = 'r',
                  bottom = ttbar+dy+zz, label = '$m_{H}$ = 125 GeV')

# Mittaukset.
data_bar = plt.errorbar(center, hist, xerr = xerrs, yerr = yerrs, linestyle = 'None', color = 'black',
                        marker = 'o', label = 'Data')

plt.title('$ \sqrt{s} = 7$ TeV, L = 2.3 $fb^{-1}$; $\sqrt{s} = 8$ TeV, L = 11.6 $fb^{-1}$ \n', fontsize = 12)
plt.xlabel('$m_{4l}$ (GeV)', fontsize = 15)
plt.ylabel('Tapahtumia / 3 GeV\n', fontsize = 15)
plt.ylim(0,25)
plt.xlim(rmin,rmax)
plt.legend(fontsize = 15)

plt.show()
../_images/feaa1add03b7d08674303c011a59b836465e967428f530a0ef45e189ed0749aa.png

Otos vaikuttaa hitusen pieneltä, mitä se toki puhtaasti numeromäärältään onkin, mutta se antaa silti valaisevan vilkaisun siihen, kuinka tutkimustyötä tehdään. Kovin moni hajoamisprosessi ei tuota lopputilassa neljää leptonia, joten edes näin monen pisteen saaminen käsittää suunnilleen puolet kaikesta julkisesti saatavilla olevasta datasta vuoden 2011-2012 kokeesta. Lisäinfoa mittauksista voi löytää täältä.

# Jos dataa haluaa tarkastella lähemmin, siitä löytää tietoja kaikista havainnoiduista neljästä hiukkasesta.

pd.options.display.max_columns = 50
fourlep.head()
Run Event PID1 E1 px1 py1 pz1 pt1 eta1 phi1 Q1 PID2 E2 px2 py2 pz2 pt2 eta2 phi2 Q2 PID3 E3 px3 py3 pz3 pt3 eta3 phi3 Q3 PID4 E4 px4 py4 pz4 pt4 eta4 phi4 Q4 mZ1 mZ2 M
0 173657 34442568 13 35.9978 32.7631 -4.41922 -14.2436 33.0598 -0.418519 -0.134075 -1 -13 29.0804 -19.31050 -5.31425 21.0837 20.0284 0.918146 -2.873040 1 13 17.3154 -10.87010 -3.64596 12.9753 11.46530 0.971505 -2.81797 -1 -13 11.49390 -1.20978 11.35650 1.29029 11.42070 0.112739 1.676920 1 62.5513 20.5205 91.4517
1 166512 337493970 13 52.9826 -49.9170 8.17082 15.7696 50.5813 0.306925 2.979340 -1 13 72.1018 15.32840 21.35470 -67.1392 26.2866 -1.667150 0.948222 -1 -13 89.7552 10.34670 -20.27240 86.8214 22.76010 2.048740 -1.09888 1 -13 30.21620 2.32913 -13.06840 27.14400 13.27430 1.463510 -1.394420 1 92.1352 90.2049 235.8800
2 171091 69105221 13 165.9750 -12.6280 -30.22890 162.7100 32.7605 2.305880 -1.966510 -1 -13 68.1611 6.93837 22.85760 63.8382 23.8875 1.709440 1.276090 1 -13 19.5056 4.71517 8.50412 16.9087 9.72383 1.320370 1.06454 1 13 24.83870 -8.09683 3.05681 23.28190 8.65464 1.715610 2.780600 -1 58.3874 14.3541 79.3858
3 172952 559839432 13 110.2600 -69.1510 68.83630 -51.3524 97.5720 -0.504613 2.358470 -1 13 88.3199 85.94400 -16.81970 -11.4510 87.5743 -0.130388 -0.193263 -1 -13 45.0987 -19.98280 -29.14080 -28.0247 35.33410 -0.727298 -2.17188 1 -13 9.79377 3.02072 8.34856 -4.13324 8.87824 -0.450186 1.223630 1 91.1877 37.3758 232.9290
4 167282 44166176 -13 54.3881 -27.4999 -43.86520 -16.6628 51.7726 -0.316533 -2.130770 1 13 39.8417 31.53530 18.85330 15.4088 36.7413 0.407975 0.538835 -1 -13 20.3208 3.30081 16.01250 12.0677 16.34910 0.683619 1.36750 1 13 6.83735 4.64276 -2.38618 4.41465 5.22007 0.767963 -0.474752 -1 90.7513 14.7350 119.2900

Huomaamme selvästi, että 125 GeVin kieppeillä tapahtuu jotain oletustemme lisäksi. Tuloksemme ovat melko samansuuntaisia kuin varsinaiset CMS:n analyysitkin, erojen noustessa pääasiassa käyttämiemme menetelmien karkeudesta.