Ntuple の使い方についても、「猿にも」に書いてあるのでさらりと。 まず箱を用意する。 つまり
TNtuple *tup = new TNtuple("tupname", "tuptitle", "adc1:adc2:adc3");などとして、 例えば3つの変数 、、 、 からなる Ntuple を作る。 またもや練習なのでダミーデータを詰め込もう。
{ Int_t i; for (i=0; i<10000; i++) { Float_t mu = 100. + gRandom->Gaus(0.,30.); Float_t adc1 = gRandom->Gaus(mu,5.); Float_t adc2 = gRandom->Gaus(mu,5.); Float_t adc3 = gRandom->Gaus(mu,5.); tup->Fill(adc1,adc2,adc3); } }この Ntuple の内容をヒストグラムしたければ
tup->Draw("adc1");あるいは、カットつきなら例えば
tup->Draw("adc1","adc2>80. && adc3<150.");等とすればよい。
2次元プロットなら
tup->Draw("adc1:adc2","adc3>80.");これを などという名前の2次元プロットにしたかったら
tup->Draw("adc1:adc2 >> hadc12","adc3>80.");hadc12 は普通の2次元プロットなので自由にいじれる。
また、
tup->Draw("adc1-adc2","adc3<150."); tup->Draw("adc1-adc2:adc1","adc3<150.");等 Ntuple の内容に演算を加えてから ヒストグラムすることも可能である。 作った Ntuple をファイルに書き出すには
TFile file("testtup.root","RECREATE"); tup->Write();でよい。
まあ、ここまでは「猿にも」の受け売りであるが、 時には、イベント毎に Ntuple の内容に直接アクセスしたい場合もでてくる。 今保存した Ntuple の入った ROOT ファイルを読んで イベント毎の情報を引き出すことを考えよう。 ROOT を再起動して、 を という名前で作ったことを思いだし、
TFile *file = TFile::Open("testtup.root"); TNtuple *tup = (TNtuple *)gROOT->FindObject("tupname");として保存した Ntuple へのポインターを得る。 ここで、例えば、イベント5の変数 の値が取ってきたかったら、
Float_t a1; tup->SetBranchAddress("adc1",&a1); // link "adc1" to a1 tup->GetEntry(5); // get event 5 cerr << a1 << endl;
さて、カットされたサブサンプルに対して情報を得たい場合は を使う。 例えば、カット後の最初のイベントならば
tup->Draw(">>elist","adc3 > 80","goff"); // "goff" = graphics OFF TEventList *elist = (TEventList *)gDirectory->Get("elist"); Int_t nlist = elist->GetN(); // get No. selected events Int_t event = elist->GetEntry(1); // event No. for 1st selected tup->GetEntry(event); // get event No.event cerr << a1 << endl;等とする。