De invloed van de zonneactiviteit op de 0 levensduur van het D meson PyROOT, RooFit en Massafit Tussenrapport
A.H.J. Schuringa A. Günaydın
Calandlyceum, Technasium Pieter Calandlaan 182 Postbus 96051 (postadres) 1006 EB Amsterdam
Contact: Tel
(A.H.J. Schuringa) (A. Günaydin)
Email
[email protected] (A.H.J. Schuringa)
[email protected] (A. Günaydın)
Datum
December 2014/Januari 2015
Opgesteld voor Jacco de Vries, NIKHEF de Rutger Gast, docent 6 klas O&O Calandlyceum, Technasium
PyROOT, RooFit en Massafit Tussenrapport 1 van 18
PyROOT, RooFit en Massafit Tussenrapport 2 van 18
1.
Inhoudsopgave 1. 2. 3. 4. 5. 6. 7. 8.
Inhoudsopgave Inleiding Installeren van ROOT en RooFit Eerste gebruik van PyROOT en ROOT Importeren en fitten van de histogram Te doen Conclusie Referenties 8.1. Acknowledgements 8.2. Auteurs 9. Begrippen
PyROOT, RooFit en Massafit Tussenrapport 3 van 18
2.
Inleiding
Bij de dit project wordt onderzocht of de zonneactiviteit van invloed is op de 0 0 levensduur van het D meson. Dit D meson bestaat uit een charm-quark en + - een up-antiquark. Het zal vervallen in het π meson en het K meson. 0 Het belangrijkste onderdeel van dit project is het fitten van data van het D meson. Vooral gaat dit project dus om data analyse. Voor de data analyse kunnen verschillende programma’s worden. Het programma dat de expert aanraadde was ROOT, het data analyse programma van de CERN.
Dit tussenrapport zal gaan over de verschillende oefeningen die zijn gedaan met ROOT en de fits die al zijn gemaakt. Ook zal er een overzicht gegeven worden van alles dat nog gedaan moet worden om dit onderzoek tot een succes te maken.
PyROOT, RooFit en Massafit Tussenrapport 4 van 18
3.
Installeren van ROOT en RooFit
Vooraf: enkel bij verschillende ROOT en RooFit functies zal uitleg gegeven worden. Niet alle gebruikte stukken script zullen worden uitgelegd.
Naar aanleiding van het gesprek dat met de opdrachtgever, Jacco de Vries, was gevoerd is een mail gestuurd door de opdrachtgever met enkele instructies over de installatie en het gebruik van het data analyse programma ROOT om ons op gang te krijgen. Enkele programma’s, benodigd voor het laten draaien en de installatie van ROOT, moesten alvorens het gebruik en de installatie geïnstalleerd worden. De benodigde programma’s werden op de volgende pagina bij de sectie voor Ubuntu gevonden: https://root.cern.ch/drupal/content/build-prerequisites Deze konden makkelijk geïnstalleerd worden door de volgende lijnen aan code: sudo aptget install git dpkgdev make g++ gcc binutils libx11dev libxpmdev \ libxftdev libxextdev sudo aptget install gfortran libssldev libpcre3dev \ xlibmesagludev libglew1.5dev libftgldev \ libmysqlclientdev libfftw3dev cfitsiodev \ graphvizdev libavahicompatlibdnssddev \ libldap2dev pythondev libxml2dev libkrb5dev \ libgsl0dev libqt4dev
Vervolgens kon ROOT geïnstalleerd worden. Dit werd gedaan door ROOT volledig te builden vanaf de bron. Met de volgende code kon ROOT opgehaald worden vanuit de git repository: git clone http://root.cern.ch/git/root.git
Na het binnen halen van de git repository kon ROOT gebuild worden, dit is volgens de instructies van Jacco de Vries als volgt gedaan: cd root ./configure enablepython make . bin/thisroot.sh
Even later bleek dat RooFit niet standaard mee wordt geïnstalleerd, dus moest deze nog opnieuw mee geïnstalleerd worden: ./configure enablepython enableroofit make . bin/thisroot.sh
ROOT en RooFit waren hiermee geïnstalleerd.
PyROOT, RooFit en Massafit Tussenrapport 5 van 18
4.
Eerste gebruik van PyROOT en ROOT
Vooraf: enkel bij verschillende ROOT en RooFit functies zal uitleg gegeven worden. Niet alle gebruikte stukken script zullen worden uitgelegd.
De opdrachtgever had uitleg gegeven over het eerste gebruik van ROOT in de mail waarin ook uitleg over de installatie van ROOT stond. Op het moment dat ROOT wordt geconfigureerd, wordt met enablepython aangegeven dat de ondersteuning van ROOT voor Python ingeschakeld wordt, deze wordt dan meegenomen in de installatie. De versie van ROOT voor Python wordt ook wel PyROOT genoemd. In de mail waren twee eenvoudige stukken script gegeven om het verschil tussen ROOT en PyROOT aan te geven en wat vertrouwd te raken met de manier waarop (Py)ROOT werkt. Als volgt kan een eenvoudige histogram gemaakt worden met PyROOT, dus met Python: python from ROOT import * nBins = 100 xMin = 20 xMax = 80 myHisto = TH1F(“myHisto”, “title”, nBins, xMin, xMax) myHisto.Fill(20) myHisto.Fill(20) myHisto.Fill(40) myHisto.Draw()
Dit script zal waardes op x = 20, x = 20 en x = 40 invoeren in een histogram met de logische waardes nBins , xMin en xMax . Deze zelfde histogram kan ook in de normale ROOT gemaakt worden, met C++: root int nBins = 100; float xMin = 20; float xMax = 80; TH1F* myHisto = new TH1F(“myHisto”, “title”, nBins, xMin, xMax); myHisto > Fill(20); myHisto > Fill(20); myHisto > Fill(40); myHisto > Draw();
PyROOT, RooFit en Massafit Tussenrapport 6 van 18
Zoals is te zien wordt de Python versie van ROOT “opgeroepen” met python en from ROOT import * . De C++ versie van ROOT wordt “opgeroepen” met root . Deze twee stukken code geven hetzelfde resultaat:
Afbeelding 1
Ook was uitleg gegeven in de mail voor het importeren van een histogram in ROOT en PyROOT. In PyROOT gaat dit als volgt: python from ROOT import * myFile = TFile.Open("SLB_MC2011_Bu_Dstmunu_Kpi_Pythia6_MagUp.root") myTree = myFile.Get("b2D0MuXDst_DTF/DecayTree”) myTree.Draw(“D_M”)
En in ROOT: root TFile* myFile = new TFile("SLB_MC2011_Bu_Dstmunu_Kpi_Pythia6_MagUp.root", "READONLY”); TTree* myTree = (TTree*) myFile > Get("b2D0MuXDst_DTF/DecayTree”); myTree > Draw(“D_M”);
Waar SLB_MC2011_Bu_Dstmunu_Kpi_Pythia6_MagUp.root het *.root bestand is waar de data voor de histogram in staat. Deze data is gegenereerd en gedownload van http://www.nikhef.nl/~jdevries/auke_alparslan/SLB_MC2011_Bu_Dstmunu_ Kpi_Pythia6_MagUp.root . b2D0MuXDst_DTF/DecayTree is hier waar de
PyROOT, RooFit en Massafit Tussenrapport 7 van 18
“vervalboom” in het *.root bestand staat en D_M is de waarde die de massa 0 van de verschillende gemeten D mesonen hebben. Deze twee stukken code geven de volgende histogram van de D_M:
Afbeelding 2
Uiteindelijk is gekozen verder te werken met PyROOT, vanwege Python, die net iets eenvoudiger en logischer in elkaar zit dan C++. Hierna is nog enkele dagen veel geoefend om de Python en PyROOT meer onder de knie te krijgen, deze oefeningen zullen hier niet verder toegelicht worden.
PyROOT, RooFit en Massafit Tussenrapport 8 van 18
5.
Importeren en fitten van de histogram
Vooraf: enkel bij verschillende ROOT en RooFit functies zal uitleg gegeven worden. Niet alle gebruikte stukken script zullen worden uitgelegd.
Voor het onderzoek naar de invloed van de zonneactiviteit op de levensduur 0 van het D meson moet eerst een fit gedaan worden over de massa, in dit geval de D_M. Deze fit kan worden gemaakt met het programma RooFit, die samen met ROOT is geïnstalleerd door middel van enableroofit . Als eerst werd, volgens een tutorial op het internet, om te oefenen, een fit over gegenereerde data gedaan. Hierbij werd geoefend met het maken van een frame en vooral met het gebruik van RooGaussian , benodigd voor het maken van de grafiek van de fit, ook wel de Gaussianformule. RooGaussian is een functie in RooFit die staat voor de formule e(− variabelen x , a en b worden in het script als volgt opgegeven:
(x−a)2 2b2
) , de
gaussian = RooGaussian(“gaussian”, “voorbeeld van een Gaussian”, x, a, b)
RooRealVar is ook een belangrijk onderdeel van het script. Hiermee kunnen gewone variabelen worden gegeven aan RooFit, maar ook bereiken, en variabelen die ongeveer rond een bepaald punt liggen: x = RooRealVar("x","x",10,10) mean = RooRealVar("mean","mean of gaussian",1) sigma = RooRealVar("sigma","width of gaussian",3)
Het hele script voor het fitten van gegenereerde data is als volgt: from ROOT import * x = RooRealVar("x","x",10,10) mean = RooRealVar("mean","mean of gaussian",1) sigma = RooRealVar("sigma","width of gaussian",3) gauss = RooGaussian("gauss","gaussian PDF",x,mean,sigma) data = gauss.generate(RooArgSet(x), 10000) mean.setConstant(kFALSE) sigma.setConstant(kFALSE) gauss.fitTo(data) xframe = x.frame() data.plotOn(xframe, RooLinkedList()) gauss.plotOn(xframe) xframe.Draw() mean.Print() sigma.Print()
PyROOT, RooFit en Massafit Tussenrapport 9 van 18
De fit die hiermee werd gemaakt zag er als volgt uit:
Afbeelding 3
De volgende stap was het importeren van de histogram uit het *.root bestand in RooFit. Een gedeelte van de kennis verkregen met het vorige script kon hiervoor worden gebruikt, zoals RooRealVar en de plotOn functie van RooFit. Na een tijd op internet te hebben rondgekeken werd RooDataHist gevonden als functie waarmee de histogram in RooFit geïmporteerd kan worden: hdata = RooDataHist("data","plotOn test data with x",RooArgList(x),histo)
Hier is de variabele histo de histogram en x het bereik waarover de histogram geïmporteerd moet worden. Het volledige stuk script van deze stap zag er als volgt uit: from ROOT import * htree = TFile.Open("root_data.root").Get("b2D0MuXDst_DTF/DecayTree") histo = TH1F("histo","plotOn test histo",1000,3000,100) for entry in htree: histo.Fill(entry.D_M) x = RooRealVar("x","x",1830,1900) hdata = RooDataHist("data","plotOn test data with x",RooArgList(x),histo) frame = x.frame() RooAbsData.plotOn(hdata,frame) frame.Draw() Opmerking bij bovenstaand script: de lange naam van het *.root bestand is vervangen door root_data.root, om het makkelijker te maken met dit bestand te werken.
PyROOT, RooFit en Massafit Tussenrapport 10 van 18
De histogram, geïmporteerd in RooFit krijgt automatisch onzekerheden toegewezen aan de punten door RooFit. De geïmporteerde histogram zag er als volgt uit:
Afbeelding 4
Vervolgens was het fitten van de geïmporteerde histogram aan de beurt. Dit bleek nog een heel wat langer durende klus dan verwacht, daar de grafiek op de grond bleef liggen (zie de blauwe lijn):
Afbeelding 5
PyROOT, RooFit en Massafit Tussenrapport 11 van 18
Dit probleem bleek achteraf veroorzaakt te zijn doordat bepaalde variabelen te klein waren gedefinieerd. Eén van de belangrijkste nieuwe functies in deze fase was de fitTo functie. Deze kan een RooGaussian model fitten aan data, in dit geval was deze data, hdata , de histogram: model.fitTo(hdata)
Het volledige script zag er als volgt uit: from ROOT import * htree = TFile.Open("root_data.root").Get("b2D0MuXDst_DTF/DecayTree") histo = TH1F("histo","plotOn test histo",1000,3000,100) for entry in htree: histo.Fill(entry.D_M) x = RooRealVar("x","x",1830,1900) m = RooRealVar("m","m test",300) s = RooRealVar("s","s test",500) hdata = RooDataHist("data","plotOn test data with x",RooArgList(x),histo) m.setConstant(kFALSE) s.setConstant(kFALSE) model = RooGaussian("model","gauss test",x,m,s) frame = x.frame() model.fitTo(hdata) hdata.plotOn(frame) model.plotOn(frame) frame.Draw()
Dit leverde de volgende fit op:
Afbeelding 6
PyROOT, RooFit en Massafit Tussenrapport 12 van 18
Na contact te hebben gehad over dit resultaat met de opdrachtgever, werd aangeraden te kijken naar de dubbele fit. Zoals te zien is aan de fit in afbeelding 6 is deze fit nog niet helemaal goed gefit over de histogram. Met een dubbele fit zou dit beter kunnen. Voor een dubbele fit was een nieuwe functie van RooFit en bijbehorende variabelen nodig, RooAddPdf . Met RooAddPdf kunnen twee verschillende modellen aan elkaar toegevoegd worden door middel van de fractions die ook zijn opgegeven. Wat deze fractions precies zijn en doen moet nog nader bekeken worden, maar voor nu zijn deze op vaak voorkomende waarden gehouden. Hier onder het volledige gebruikte script: from ROOT import * htree = TFile.Open("root_data.root").Get("b2D0MuXDst_DTF/DecayTree") histo = TH1F("histo","plotOn test histo",1000,3000,100) for entry in htree: histo.Fill(entry.D_M) x = RooRealVar("x","x",1830,1900) m = RooRealVar("m","m test",300) s = RooRealVar("s","s test",500) m2 = RooRealVar("m2","m2 test",200) s2 = RooRealVar("s2","s2 test",300) g1frac = RooRealVar("g1frac","g1frac test",0.5) g2frac = RooRealVar("g2frac","g2frac test",0.1) hdata = RooDataHist("data","plotOn test data with x",RooArgList(x),histo) m.setConstant(kFALSE) s.setConstant(kFALSE) m2.setConstant(kFALSE) s2.setConstant(kFALSE) model = RooGaussian("model","gauss test",x,m,s) model2 = RooGaussian("model2","gauss2 test",x,m2,s2) modelsum = RooAddPdf("modelsum","model+model2",RooArgList(model,model2),RooArgList(g1frac,g2frac)) frame = x.frame() modelsum.fitTo(hdata) hdata.plotOn(frame) hdata.statOn(frame) modelsum.paramOn(frame) modelsum.plotOn(frame,RooFit.LineColor(kRed)) frame.Draw()
Zoals misschien opvalt aan bovenstaand script zijn ook enkele andere functies geïntroduceerd. Zo is RooFit.LineColor gebruikt: modelsum.plotOn(frame,RooFit.LineColor(kRed))
, is paramOn gebruikt: modelsum.paramOn(frame)
en is statOn gebruikt: hdata.statOn(frame)
PyROOT, RooFit en Massafit Tussenrapport 13 van 18
RooFit.LineColor is gebruikt om de lijn van de fit een bepaalde kleur te geven, in dit geval kRed , dus rood. paramOn is gebruikt om de waarden in het frame uit te printen, naast de fit, van de variabelen van de twee gaussians die zijn samengebracht tot de dubbele gaussische fit:
statOn geeft de waarde van, in dit geval, de variabelen van de geïmporteerde histogram, hdata :
De gehele grafiek die was verkregen uit deze stap was als volgt:
Afbeelding 7
Later was ook een driedubbele fit gemaakt, die nog net iets beter past om de histogram. Dit was gedaan door middel van een RooAddPdf die twee fits samenvoegde en een RooAddPdf die de eerste RooAddPdf en de derde fit samenvoegde.
PyROOT, RooFit en Massafit Tussenrapport 14 van 18
6.
Te doen
Op dit moment wordt gewerkt aan de laatste fit die moet worden gedaan voordat de resultaten vergeleken kunnen worden met de data van de zonneactiviteit, de levensduur fit. Verschillende bronnen voor de data van de zonneactiviteit zijn al gevonden, evenals enkele informatiebronnen. Deze moeten nog wel op betrouwbaarheid onderzocht worden. Dit zal gedaan worden door de data van de verschillende bronnen met elkaar te vergelijken om verschillen te kunnen zien. Andere dingen die nog gedaan moeten worden is het beter begrijpen van RooAddPdf , zoals de fractions die nodig zijn en de manier waarop de twee RooGaussian modellen bij elkaar gevoegd worden. Ook moet de formule achter RooGaussian beter begrepen worden.
PyROOT, RooFit en Massafit Tussenrapport 15 van 18
7.
Conclusie
Het onderzoek is al redelijk ver gevorderd en, afgezien van de achterstand van één of twee weken, zijn wij erg tevreden over wat tot nu toe is gedaan. Het duurde even voordat we wat gewend waren aan PyROOT en RooFit en ook nu is nog niet alles helemaal helder. Vooral het uitzoeken van de manieren waarop een fit kan worden gemaakt kostte veel tijd. 19 maart 2015 om 19:30 zullen de presentaties zijn van dit project en van de andere O&O projecten. Enkele dagen daarvoor, of op de dag van de presentaties, zal het eindrapport van dit onderzoek uitgebracht worden. Daarmee zal dit project klaar zijn.
PyROOT, RooFit en Massafit Tussenrapport 16 van 18
8.
Referenties
http://web.archive.org/web/20150109160356/https://root.cern.ch/drupal/conten t/installing-root-source http://web.archive.org/web/20150109160403/https://root.cern.ch/drupal/conten t/build-prerequisites http://web.archive.org/web/20150109160500/https://root.cern.ch/download/doc /RooFit_Users_Manual_2.91-33.pdf http://web.archive.org/web/20150109160553/https://root.cern.ch/phpBB3/ http://web.archive.org/web/20150110123306/http://pdg.lbl.gov/2008/listings/s0 32.pdf
8.1. Acknowledgements LinkedIn. Rutger Robert Gast. Van http://nl.linkedin.com/pub/rutger-robert-gast/27/406/641 LinkedIn. Jacco de Vries. Van http://nl.linkedin.com/pub/jacco-de-vries/26/387/698 LinkedIn. Anton van den Berg. Van http://nl.linkedin.com/pub/anton-van-den-berg/27/a4/879
8.2. Auteurs LinkedIn. Auke Schuringa . Van https://www.linkedin.com/pub/auke-schuringa/a5/a1/196 LinkedIn. Alparslan Günaydın . Van https://www.linkedin.com/pub/alparslan-gunaydin/83/33b/128
PyROOT, RooFit en Massafit Tussenrapport 17 van 18
9.
Begrippen
Verschillende begrippen die zijn gebruikt in dit tussenrapport worden hieronder verder uitgelegd. ROOT ROOT is een data analyse programma van de CERN waarmee grote hoeveelheden data geanalyseerd kunnen worden. ROOT is het programma dat in dit verslag wordt gebruikt om de verschillende fits mee te maken. ROOT is geschreven in C++. PyROOT PyROOT is de Python versie van ROOT. RooFit RooFit is een programma om data goed te kunnen fitten en waarden uit deze data te kunnen halen. Het kan samen met ROOT geïnstalleerd worden. Git Git is het bestand met de broncode voor software. Python Python is een programmeertaal. C++ C++ is een programmeertaal. 0 Dmeson 0 Het D meson is het subatomaire deeltje waar in dit onderzoek de data analyse aan wordt verricht. Het bestaat uit een charm-quark en - + up-antiquark en vervalt in het K meson en het π meson. - Kmeson - - Een K meson is een subatomair deeltje. Het K meson ontstaat, samen + 0 met het πmeson, bij het verval van een Dmeson. Het bestaat uit een strange-quark en een up-antiquark. + πmeson + + Een π meson is een subatomair deeltje. Het π meson ontstaat, - 0 + samen met het Kmeson, bij het verval van een D meson. Het π meson bestaat uit een up-quark en een down-antiquark.
PyROOT, RooFit en Massafit Tussenrapport 18 van 18