TTreeFormula(ROOTでの評価式)で配列を扱うときの便利コマンド

TTreeFormula(tree::Draw, tree::Scanなどの関数の第一、二引数で書く式)で、便利な書き方を紹介します。まぁ、Referenceに書いてあるんですけどね。

扱うデータの例

今回では、例として

std::vector<Double_t> a;
a.push_back(2);
a.push_back(10);
a.push_back(-1);
a.push_back(5);

というvectorを持ったBranchを一つ、同じものを1 EventだけFillしたTreeを想定します。 出力例はScanの結果を示します。現在の結果は

root [] tree->Scan()
***********************************
*    Row   * Instance *         a *
***********************************
*        0 *        0 *         2 *
*        0 *        1 *        10 *
*        0 *        2 *        -1 *
*        0 *        3 *         5 *
***********************************
(long long) 4

となっております。

Alt$

このコマンドは、値が入っている場合はその値を、入っていない場合は自分の指定した値を返すように出来ます。

root [6] tree->Scan("a[5]:Alt$(a[5],-1000)") //通常だと空(nanではなく、未定義の場合)になるが、Alt$をつけると空のところに指定した値(-1000)を返してくれる
************************************
*    Row   *      a[5] * Alt$(a[5] *
************************************
*        0 *           *     -1000 *
************************************
(long long) 1

これ結構便利で、通常は未定義の部分はDrawをする時にEntryから捨てられてしまうのですが、Alt$を使って未定義のときはUnder flowさせておくなりすると、とそのEventも拾って数を表示させることが出来るので、Efficiencyの勘定などがやりやすくなります。

Sum$

このコマンドは配列の総和を返してくれます。

root [] tree->Scan("Sum$(a)") // 配列の和が返ってきます
************************
*    Row   *   Sum$(a) *
************************
*        0 *        16 * 
************************
(long long) 1

Max$ (Min$)

このコマンドでは配列の中でのMax (Min)を返してくれます。

root [7] tree->Scan("Max$(a):Min$(a)")
************************************
*    Row   *   Max$(a) *   Min$(a) *
************************************
*        0 *        10 *        -1 *
************************************
(long long) 1

MaxIf$ (MinIf$)

その名の通り、条件をかけたMax, Minを返してくれます。

root [12] tree->Scan("MaxIf$(a,a<8):MinIf$(a,a>0)")
************************************
*    Row   * MaxIf$(a, * MinIf$(a, *
************************************
*        0 *         5 *         2 *
************************************
(long long) 1

Length$

配列のサイズを返してくれます。

root [13] tree->Scan("Length$(a)")
************************
*    Row   * Length$(a *
************************
*        0 *         4 *
************************
(long long) 1

おわりに

今回の例では1 Eventのみしか扱っていないのでイマイチ便利さが伝わらないかもしれませんが、データをDrawする時には効果を発揮してくれます。 配列Beanchを扱う場合には知っていて損はないと思います。

Shoichiro Masuoka

CNS, the Univ. of Tokyo. Dcotoral student

関連項目