23 Mayıs 2016 Pazartesi

Yeni Başlayanlar İçin ROOT

ROOT Nedir?
ROOT veri analizi için tasarlanmış nesne yönelimli bir yapıdır. Önemli özellikleri arasında sizlere grafiksel ara yüz, interaktif veri analizi ve bu analizleri C/C++ dili kullanarak derlemenizi sağlar. Aynı zaman da CINT eklentisinden faydalanarak size komutlarla kullanabileceğiniz bir ortam sağlar. ROOT çok yönlü ve popüler bir programlama dili olan Pyhton kullanımı için class dosyaları ile erişim sağlar. İlgilenenler için CMS analizlerinde Python tercih etmektedir.



Peki ROOT ile neler yapabiliriz? Veri analizi adına yapabileceğiniz pek çok şeyden önce nümerik analizden bahsetmek istiyorum. ROOT'u bir hesap makinesi gibi kullanabilir, matematiksel hesaplamalar yapabilir integral alma, fonksiyon çözdürme, diferansiyel hesaplar, pek çok matemaitksel nümerik analiz yöntemleri kullanabilirsiniz. Ayrıca fonksiyonlar çizdirebilir, histogram ve grafikler oluşturabilir ve bunlara fit yöntemleri uygulayabilirsiniz. ROOT tüm bunları N-tuple içerisine kaydederek interaktif olarak veri analizi yapabilmenizi sağlar.

Tüm bunları öğrenmenin en kolay yolu örneklerle çalışmaktır. Bu yüzden, bu ve bundan sonraki yazılarım mümkün olduğunca fiziksel örnekler ile devam edecektir. Yalnız örneklere geçmeden önce bir kaç kavramı açıklamakta, birazda Linux'ten bahsetmekte yarar var. Veri analizinde en önemli kavram histogramlardır. Gerek iş dünyasında gerekse bilim dünyasında histogramlar size pek çok şeyi anlatmak için yeterlidir. Kısaca açıklamak gerekirse histogram tekrarlı verilerin gruplandırılmış halindeki grafiğidir. Örneğin, 14 yaşında 1 kişi, 15 yaşında 1 kişi, 16 yaşında 3 kişi, 22 yaşında 2 kişi, 24 yaşında 2 kişi, 25 yaşında 5 kişi olsun[1]. Bu dağılımın histogramına bakarsak şekildeki gibi olacaktır.
[1] David J. Griffiths Introduction to Quantum Mechanics Figure 1.4
Diğer bir önemli kavram ise N-tuple'lar dır. N-tuple içerisine bilgi kayıt etmek ve okumak için düzenlenmiş bir ortamdır. İçerisine ASCII dosyalarınızı, histogram, grafik gibi bir çok şeyi kaydederek interaktif analiz yapmanızı sağlar.

ROOT ve Linux ortamı: ROOT daha çok Linux platformunu desteklemektedir. Bir önceki yazımda da bahsettiğim gibi CERN kendi Linux dağıtımını yapmaktadır ve SL ( Scientific Linux) olarak geçen bu işletim sistemi önerilerim arasındadır. Ben şu an Fedora 21 kullanmaktayım ve bunu tercih etmemin bir kaç sebebi var tabiki. Öncelikle Fedora 21 Gnome masaüstünü kullanmaktadır. Dizaynı ve kullanışlığı açısından hoşuma gittiği için tercihlerim arasında. Diğer bir sebep ise SL, centOS ve Fedora'nın RedHat temelli olması ve yum paketini kullanmaları. Fedora 21 için root kurmak istiyorsanız, terminale "root" yazıp bir süre bekledikten sonra "root kurulsun mu?" şeklinde çıkan yazıyı "y/yes" yazarak onaylamanız yeterlidir.

Hesap Makinası Olarak Root: Uzun bir girişten sonra artık basit örneklerimize başlayabiliriz. Öncelikle terminale bağlanıp 'root -l' komutu ile root ortamına bağlanalım. Aşağıdaki örneği hesaplatalım (Bu küçük alıştırmayı öncelikle matematiksel sembollere alışmak için yapıyoruz):
5\times(5+2)-\frac{(5-3)}{2}+e^{2/3}+1.9\times10^2-1^{36}+1^{36}

Çıktınız resimdeki gibi olmalıdır. Burada sayılardan sonra nokta koymamızın amacı onun bir reel sayı olduğunu belirtmek içindir.

Fonksiyonlar: Fonksiyonları bir kaç farklı şekilde tanımlayarak bunları grafiksel olarak çizdirebilir ve bir çok işlem yapabilirsiniz. Yapabileceğiniz işlemlerin listesi için burayı, kaynak kodu için burayı tıklayın. Bu yazımda kaynak kodları yerine terminal üzerinden yapabileceğiniz basit komutlar vereceğim. Kaynak kodları ile derleme için daha ayrıntılı bir yazım olacak.

Öncelikle root'un kendi içinde tanımladığı fonksiyonlarla başlayalım, Örneğin Eksponaniyel fonksiyon:
  TF1 *f = new TF1("f","expo",0,5)
Burada TF1(isim,fonksiyon,xmin,xmax) olarak kullanılır ve root içerisinde expo 'exp([0]+[1]*x)' şeklinde [0], [1] parametreleri ile tanımlıdır. Bu parametrelere,
  f->SetParameters(5,-10);
komutu ile değerler atayabiliriz. Bu fonksiyonu çizdirmek için Kullanmamız gereken komut:
  f->Draw();
expo fonksiyonunun çıktısı.
Kendimiz eksponansiyel+bir sabit şeklinde fonksiyon tanımlarsak:

  TF1 *f = new TF1("f","[0]*exp([1]*x)+[2]",0,5); f->SetParameters(100,-40,20); 
  f->Draw();
Komutlarınızı ';' satır atlama komutu ile tek bir satırda yazabilirsiniz. Burada parametreleri fonksiyonun içerisine direk yazabileceğimiz gibi (100*exp(-40*x)+20) dışardan da ayarlayabiliriz. Ayrıca tanımlı olan fonksiyonları kendi parametrelerimizden sonra başlayacak şekilde ayarlayabiliriz. Örneğin en son kullandığımız fonksiyon için ROOT içerisinde tanımlı olan gaus '[0]*exp(-0.5*((x-[1])/[2])**2)' fonksiyonunu ekleyelim.

  TF1 *f = new TF1("f","[0]*exp([1]*x)+[2]+gaus(3)",0,5);
  f->SetParameters(200,-40,20,50,1.293,0.03); 
  f->Draw();
Çıktınız şekildeki gibi olacaktır. Burada 'gaus' olarak tanımlı gaussian fonksiyon üç parametreye bağlıdır. Bunlar sırasıyla, constant (sabit), mean (ortalama), sigma/width (genişlik) olarak tanımlıdır. Bu üç parametreyi değiştirerek gaussian şekliniz üzerinde değişiklikler yapabilirsiniz.

Histogramlar: Histogram tanımından hatırlayacak olursanız, histogram oluşturmak için belirli bir veriye ihtiyacımız vardır. Bu yüzden öncelikle bu veriyi oluşturmalıyız. Bir üstteki örneğe bakacak olursanız eksponansiyel + sabitten oluşan terimimizi bir dedektördeki background spektrumu olarak düşünebiliriz, gaus ile tanımlı olan fonksiyon ise bize belirli bir kaynaktan gelen enerji çizgisini (peak,line) gösterir. Kabaca çok ideal bir background ile gamma kaynağı kullanarak ölçüm aldığınızda üstteki gibi bir grafiğiniz olur. X-eksenindeki sayılar(enerji bilgisi) doğada size rastgele bir şekilde gelir ve kaynağınızdan gelen enerji bilgisi histogramınızda dik bir zirve oluşturur. Şimdi bizde bunun küçük bir simulasyonunu yapalım ve üstteki fonksiyonun olasılık yoğunluğunu bularak rastgele sayılar üretelim. Bu fikir gözünüzü korkutabilir ancak root bunu 'f->GetRandom()' komutu ile basit bir şekilde yapabilmektedir. (Simulasyona giriş olarak bu konuyu daha sonra ayrıca inceleyeceğim.)

Öncelikle histogram oluşturma komutumuz: TH1F *h = new TH1F(isim,başlık,adım sayısı,min,maks)
ve 'h->Fill(sayı)' komutu ile üreteceğimiz rastgele sayıları histograma doldurabiliriz. 
  
  TH1F *h = new TH1F("h","Spectrum Example",500,0,5);
  for(int i=0;i<5000;i++) {h->Fill(f->GetRandom());} h->Draw();
Çıktınız yukarıdaki gibi olacaktır. Burada for döngüsü kullandım ve 5000 defa rastgele sayı ürettim. Eğer bir deney üzerinden düşünecek olursak bu dedektörünüzün 5000 tane olay kaydetmesi demek olacaktır. Bu dedektörünüzün pmt/rate -ine bağlı olarak çok fazla zaman almayacaktır. Eğer biz bu sayıyı '50000' e çıkarırsak;

  
  for(int i=0;i<50000;i++) {h->Fill(f->GetRandom());} h->Draw();
Sayımız arttıkça istatistiksel olarak daha güçlü bir dağılım elde ederiz. Burada dikkatinizi çekmek istediğim şey histogramın sağ üst kösesindeki panelde Entries (girdi) bilgisinin 50000 değilde 55000 olmasıdır. Bir önceki histogram bilgisinden yaralandığımız için ürettiğimiz 50000 tane rastgele sayı bir önce ürettiğimiz sayıların üstüne kaydolmuştur.

Grafik:  Grafilk için root iki sınıf barındırmaktadır, TGraph ve TGraphErrors ve (x,y) verilerinin birleşmesi ile oluşan grafiklerdir. ikisinin de kullanımı aynı olduğu için ben direk olarak TGraphErrors ile örnek vereceğim.

TGraph(n,x,y), TGraphErrors(n,x,y,x_error,y_error) komutları ile çalışırlar.

Tahmin edeceğiniz gibi bu grafiği oluşturabilmemiz için (x,y) verilerine ve onların hata bilgilerine ihtiyacımız var. Bu bilgileri yukarıdaki histogramdan elde edicez.
  
  const int n = 500; float x[n]; float y[n]; float y_err[n];
  for (int i=0;i<n;i++) {x[i]=h->GetBinCenter(i+1);y[i]=h->GetBinContent(i+1);}
  for (int i=0;i<n;i++) {y_err[i]=h->GetBinError(i+1);}
  TGraphErrors *g = new TGraphErrors(n,x,y,0,y_err)
  g->Draw()
Histogramdaki her bir nokta için karşılık gelen y-eksenindeki değeri ve y ekseni için hata değerlerini toplayarak şekildeki grafiği elde ettik. Burada sırasıyla, 'GetBinCenter(i+1)', 'GetBinContent(i+1)', 'GetBinError(i+1)', i+1'nci değerin x-ekseni, y-ekseni ve y-ekseninin hatasını veren komutlardır. i+1'nci değerelere bakma sebebimiz ise döngümüzün 0'dan başlamasıdır. Takdir edersinizki sayma sayıları 1'den başlar.

NTuple: Örneğin elinizde 50 TB boyutunda bir raw(çıplak) data var. Bu hiç işlenmemiş ve deneyinizden taze taze çıkmış olan bilgileri elbette herhangi bir programlama dili kullanarak inceleyebilirsiniz ancak dosya boyutunu düşünürsek bu oldukça zamanınızı alacaktır 1 hafta belki daha fazla. Analiziniz bittikten sonra her şey çok yolunda bile gitse mutlaka elde ettiğiniz sonuçların detaylarını öğrenmek istiyeceksiniz ve genelde bu süreç kendini sürekli tekrarlar. Her bir analiz için bir hafta beklediğinizi düşünürsek bu oldukça zaman alacaktır. Bunun yerine her bir analizinizi bir yerde saklamanız ve bu sakladığınız ortamın tekrardan incelenebilir bir interaktif ortam olması çok önemlidir. Bunu ROOT'ta N-tuple ile sağlayacağız. Örneğin bu incelememiz boyunca size çıkış komutunu hiç söylemedim. Eğer çıkış yaparsanız yaptığımız tüm grafikler kaybolacaktır ve bu analizleri yapmak için en baştan bütün komutları tekrarlamanız gerekir. Bunun yerine size bu verileri nasıl saklayıp tekrardan bunlara nasıl ulaşacağınızı basit bir şekilde anlatacağım. TNtuple class'ı ile daha fazla detay alabilirsiniz.

Aşağıdaki komutları tekrarlayarak yaptıklarımızı kaydedebiliriz:

  
  TFile *fo= new TFile("~/example1.root","recreate");
  f->Write("func");
  h->Write("hist");
  g->Write("grap");
  fo->Close();

TFile(dosya_ismi.root,Seçenekler); -- Dosya yaratma.
Write(isim)                                     -- Dosya içine yazdırma.
Close()                                           -- Dosyayı kapatma.

Yarattığımız tüm grafikleri kaydettikten sonra artık ROOT'tan gönül rahatlığıyla '.q' komutunu kullanarak çıkış yapabiliriz.

Kaydettiğimiz dosyaya tekrar bağlanmak için terminalde;

 
  root -l ~/example1.root

yazarak bağlanıyoruz. '.ls' komutunu kullanarak root dosyamızın içeriğini görebiliriz ya da 'TBrowser t' komutunu kullanarak root'un arayüzünü etkinleştirip içerisindeki bilgilere ulaşabiliriz.


Bu komut ile ROOT'un grafiksel arayüzünü etkinleştirdikten sonra oluşturduğunuz root dosyasını, ROOT Files klasörünün altındaki listede göreceksiniz. Buna çift tıklayarak içerdiği verilere kolaylıkla ulaşabilirsiniz.


Her bir veriye çift tıklayarak içeriğini görüntüleyebiliriz. Ben özel olarak son yaptığımız grafik dosyası ile ilgilenip 1 ile 1.5 arasında ki gaussian şeklimize fit yapmak istiyorum.


öncelikle x-ekseninde rakamların üzerinden bir bölge seçimi yaparak zoom yapıyoruz.


Daha sonra Tools sekmesinden Fit Panelini seçiyoruz. Burada açılan yeni pencerede fit ile ilgili bazı ayarlamalar bulunmakta. ROOT varsayılan olarak gaus foknsiyonunu tanımlamakta ancak bizim fit yapmak istediğimiz alan gaus+bir sabit olduğu için fonksiyonun üstündeki panelden 'add' seçeneğini seçtikten sonra
'+[3]' fonksiyona ilave edip hemen altından Set Parameters düğmesine tıklıyoruz. Yeni açılan pencerede, resimdeki gibi ayarlamaları girin. Min, Max ve Value girdilerini girdikten sonra bound'u işaretliyerek aralığımızı ayarlamış oluyoruz. Siz girdileri girdikçe, girdiğiniz veriler doğrultusunda grafikte kırmızı şekil oluşacaktır. Programa kabaca tahminimizi söyledikten sonra programa fit yapmasını söylüyoruz ve Set Parameters penceresini OK ile onayladıktan sonra Fit Panelinde en altta 'Fit' düğmesine basarak aşağıdaki fit sonucunu elde ediyoruz.


Gördüğünüz gibi fit şekliniz grafiğiniz ile tam uyumlu bir hal aldı. Eğer terminale bakarsanız fit parametrelerinin çıktılarını göreceksiniz. Burada dikkatinizi çekmek istediğim şey p1 (mean) ve p2 (sigma) parametresi başta yarattığımız fonksiyonla aynıdır. Rastgele sayılar üreterek bu grafiği elde ettiğimiz için diğer parametreler aynı olmak zorunda değildir. Fit işlemini histogram üzerinden tekrarlayabilirsiniz. Histogramın değerlerini kullandığımız için birebir aynı sonuçları elde etmeniz gerekir.

Browser sekmesi üzerinden Quit Root'a tıklayarak ya da terminalden '.q' komutunu kullanarak çıkış yapabiliriz.

Bir sonraki yazımda görüşmek üzere...

Faydalı Linkler:


Hiç yorum yok :

Yorum Gönder