Ntuple の使い方についても、「猿にも」に書いてあるのでさらりと。 まず箱を用意する。 つまり
TNtuple *tup = new TNtuple("tupname", "tuptitle", "adc1:adc2:adc3");
などとして、
例えば3つの変数
{
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.");
これを
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;
等とする。