HEPtech     - TTreeの解析を劇的に速くする(!?)方法 -
トップページ | Tips | Topics
<TTreeの解析を劇的に速くする(!?)方法>

 ROOTのTTreeを用いた解析をしている時、CPUは100%使い切っているのに処理速度が何か遅いなぁと感じた事はありませんか? もちろん様々な原因があるかとは思いますが、ROOTを使っていると起こりがちな原因の一つとして、 多重継承したクラスを Branch していたり、自分が実際に使いたい数よりもずっと多くの Branch が存在することが挙げられます。 ここでは、このような場合の処理速度を劇的に(!?)速くする方法を紹介します。

 簡単な例として、1000個くらいの Branch をもった TTree を考えます。 ところが、興味があるのはその中の一つ jetEnergy という Branch のみだったとします。 このような場合以下のようにすると、処理速度が速くなる可能性があります。

tree->SetBranchStatus("*",0);
tree->SetBranchStatus("jetEnergy");

TTree::SetBranchStatus は、1つ目の引数が Branch の名前、2つ目が有効無効のフラグです。 まず1行目で全てのブランチを無効にしています。 2行目で興味のある jetEnergy の Branch のみアクティブにしてます(2つ目の引数はデフォルトが1)。 Branch のひとつがクラスである場合は、以下のような事もできます。

class Track{
...
    TVector3 Momentum;
    int PID;
    double Timing;
...
};

{
    ...
    tree->SetBranchStatus("*",0);
    tree->SetBranchStatus("Track.Momentum.fZ");
    tree->SetBranchStatus("Track.PID");
    tree->SetBranchStatus("Track.Timing");
    
    Track* trk=new Track();
    tree->SetBranchAddress("Track.",&trk);
    ...
}

Tree で Branch している変数単位ではなく、クラスのメンバー単位での有効/無効を切り替える事ができます。 有効/無効を切り替えても以降の SetBranchAddress などは通常とおり行えます。 昨今の高エネルギー実験において、検出器の多様化・大型化/多ch化やクラスの多重継承で大きく成りすぎた ROOT ファイルを取り扱うなら試してみる価値は十分あると思います。


2005-2017 HEPtech All rights reserved. Link/Unlink free.
inserted by FC2 system