Deprecated: Array and string offset access syntax with curly braces is deprecated in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/init.php on line 542
ja:root:ttree [GiriWiki]

ユーザ用ツール

サイト用ツール


ja:root:ttree

TTree


読み込むBranchを限定する

方法1 --- SetBranchStatus

デフォルトではGetEntryすると、SetBranchAddressで指定されていないBranchまでも読みにいく。
というかすべてのbranchのデータをメモリに乗せるが、SetBranchAddressすると そのbranchに対応するメモリのポインタが指定した変数に割り当てられる。

treeに多数のBranchが入っていて、その一部だけを使う場合、毎回全branchをメモリに乗せるのは無駄。 Branchを読み込む・読み込まないを指定するメソッドが、SetBranchStatus である。

tree->SetBranchStatus("*",0);              //まず全体を読み込まない様に指定
tree->SetBranchStatus("Detector.nHit",1);  //次いで、使用するものを順次読み込む設定に変えていく
tree->SetBranchStatus("Detector.hits.*",1);//クラス化されているものはワイルドカードで指定したりもできる

このとき、先にGetEntryを呼んでやらなくてはならないらしい。http://root.cern.ch/root/roottalk/roottalk03/4900.html (GetEntryの前にSetBranchAddressを呼んでやっておく必要があるっぽい)

理由はあまりよくわからない。 具体的には以下のようにする。

tree->SetBranchAddress("hoge",&hoge);
tree->SetBranchAddress("hogehoge.",&hogehoge);
・
・
・
tree->GetEntry(0);
tree->SetBranchStatus("*",0);
tree->SetBranchStatus("Detector.nHit",1);
tree->SetBranchStatus("Detector.hits.*",1);
・
・
・
以下 event loop

方法2 --- TBranch::GetEntry

TBranch のGetEntryを用いることで、Branch毎に読み込むことができる。
ただし、TChainを用いている時、気をつけなければならないことが1つ。
TBranch::GetEntryは、引数として”当該イベントが含まれているTree内でのEntry Number”を取らなくてはならない。
具体的には次のようにする。

TChain *chain = ...;
Long64_t localEntry = chain->LoadTree(entry);
branch->GetEntry(localEntry);

Long64_t TChain::LoadTree(Long64_t entry)は TChainで結びつけられたTreeの全エントリにつけられた通し番号(entry)を引数にとり、 そのentryが含まれるTreeをCurrent Treeとし、 Current Tree内でのEntry Numberを返り値とする関数。
Errorがあると-1~-4の値を返すので、 if( localEntry < 0 ) でError判定ができる。

元treeから条件を満たすイベントの、必要なbranchだけを抽出したtreeを作る

TTree* TTree::CopyTree(const char *selection, Option_t *option="", Long64_t nentries=kMaxEntries, Long64_t firstentry=0)

を用いる。 さらに

void TTree::SetBranchStatus (const char *bname, Bool_t status=1, UInt_t *found=0)

を用いることで、必要なbranchだけを取り出してくることができる。

こんな感じで使う:

  TChain* chain = new TChain("T");//上の話はTChainでも同じ
  chain->Add(....);
 
  std::string branchname[] = {"brA","br2","br3",...};//抜き出すbranchをリストアップ
  const Int_t nBranch = sizeof(branchname)/sizeof(branchname[0]);
  chain->SetBranchStatus("*",0);//一旦全てのbranchをdeactiveに
  for(Int_t iBranch = 0 ; iBranch < nBranch ; ++iBranch)
    chain->SetBranchStatus(branchname[iBranch].c_str(),1);//リストされたbranchだけをactiveにしていく
 
  TFile* ofile = new TFile("file.root","RECREATE");
  TTree* newtree = chain->CopyTree("(SelectBit&0x4)>0");// とある変数"SelectBit"の0x4 Bitが立っていることを要求
 
  ofile->cd();
  newtree->Write();
  ofile->Close();
ja/root/ttree.txt · 最終更新: 2017/08/19 09:27 by kota