HEPtech     - ROOTの小技 -
トップページ | Tips | Topics
<ROOTの小技>

 ここでは、項目に分別できないような以下のROOTの小技を紹介したいと思います。
   ・ROOTでのキーボード・ショートカット
   ・TTree::Draw()で描かれるグラフを操作する
   ・マクロをROOTでコンパイルして実行する
   ・ROOTでのお約束事?
   ・ROOTのオプション


 ROOTでのキーボード・ショートカット
interactiveなROOTのセッションで、Ctrl+Rで履歴のインクリメンタルサーチができます。 更に何度かCtrl+Rを押下する事で、同じ検索文字で更に過去の履歴に遡ることができます。 インクリメンタルサーチから抜けるにはエスケープ(esc)を押します。 その他にもシェルやemacsで使えるキーバインドが色々使えます。 Ctrl+A:行頭へ移動、Ctrl+E:行末へ移動、Ctrl+K:行末まで切取、Ctrl+Y:貼付などなど。 tabキーを押す事でクラス名やメンバーをリスト化・補完する事もできます。 どこまでがROOT、どこまでがシェル、どこまでがターミナルが実装しているのかが微妙ですが、 色々試してみると思わぬ発見があるかもしれません。


 TTree::Draw()で描かれるグラフを操作する
ROOTではオブジェクトの"名前"がアドレスのようにそのオブジェクト固有のもので、 同じ名前のオブジェクトを複数生成することはできません。 TTreeで描いたグラフをみるとhtempという名前であることが分かります。 実はこの時、ヒストグラムへのポインタ : htempが"htemp"という名前のオブジェクトを指している状態になっています。 例えば以下のような使い方が考えられます。

TTree* t=new TTree("t","");
t->ReadFile("hoge.dat","x/D:y"); // ASCIIファイルの読み込み

t->Draw("x");
htemp->SetLineColor(2); // ヒストグラムの線色を赤に
htemp->Draw();

TTreeでグラフを描く時に自動で生成されるポインタとヒストグラムですが、 以下のようにする事で、変数名とヒストグラム名を自分で指定する事が可能です。

t->Draw("x >> myHist"); // 名前が"myHist"なヒストグラムとそれを指すポインタを生成
myHist->SetLineColor(2);
myHist->Draw();

さらに、変数名とヒストグラム名を指定時に、以下のように生成するヒストグラムの分割数と範囲についても指定する事もできます。

t->Draw("x >> myHist(50,0.,100.)"); // [0.,100.]を50個に分割して表示


 マクロをROOTでコンパイルして実行する
ROOTでデータ処理をする際に、主に以下の3つの方法があります。
・interactive session : 対話式セッションで実行
・ROOTマクロで実行
・ACLICでコンパイルして実行

 1つ目のinteractiveなsessionは、非常に文法に甘いです。多少どのように書こうが動きます。 tabで補完が効くので、慣れるまではこれで操作するとラクでしょう。 実行方法は、セッション内でROOTコマンドを直接入力・実行するだけです。

 2つ目のマクロについてですが、上記のinteractiveなセッションよりはやや文法に煩くなりますが、 まだかなり適当なコードでもそれなりに動きます(場合によっては、動いてしまうという方が適当かも)。 実行の仕方は、基本的にはセッション内で打ち込むコマンドをそのままマクロファイルに書く感じで良いです。 注意点としては、マクロは関数として定義し、マクロファイル名は関数名と揃えておく必要があります。 例えばMacroName.Cというマクロファイル内には、MacroName()という関数でマクロが定義されている必要があります。 そしてROOTセッション内から".x MacroName.C"で実行できます。 ROOTセッションに入らなくても、シェルから"root MacroName.C"でもOKです。 必要に応じて"root -l -b -q MacroName.C"のようにオプションを付けても吉。

 3つ目のACLICでコンパイルして実行する場合についてですが、上記の2つとは異なり文法には非常に煩いです。 というか、正しいC++の文法そのもので記述しなければなりません。 つまり必要なヘッダーや共有ライブラリは明示的に呼び出してやる必要があります。 ROOTやC++に不慣れな人にとっては面倒かもしれませんが、以下のように2つの大きなメリットがあります。 まず上記2つの方法と比べ実行速度が格段に速いことです。 コードの書き始め・開発段階ではマクロ形式の方が手軽でよいですが、 いざ本解析で大量のデータを処理させるとなると、マクロ形式では待てど暮らせど終わりません。 もう一つのメリットは、動作がより正しくなる事です。 こう言うと「ん?」と思う方もいるかもしれませんが、 やっている事自体は非常にシンプルだけど、ちょっと凝ったコードを書くと、 マクロ形式では正しい結果を返さない(或いは落ちる・ハマる)けど、 同じコードをACLICでコンパイルして実行すると正しく動くというケースをいくつか確認しています。 マクロ実行時はCINT、コンパイル時はACLICというように処理が異なるのが原因? という訳で、何度見直しても正しいと思われるコードなのにマクロでは動かない場合に、 コンパイルしてから実行・確認してみるのも良いかもしれません。 長くなりましたが、実行方法は基本的にはマクロ形式と同様ですが、先にも触れた通り文法的に正しいコードでなければなりません。 そしてROOTセッション内から"root MacroName.C+"でコンパイル&実行が行われます。 最後に付けた"+"ですが、これは必要に応じて(コードが更新されたら)コンパイルせよという意味です。 "++"とする事で強制的に再コンパイルさせることもできます。 さらに最後に"O"(オー)を付けることでコンパイル時に最適化(optimization)が行われます。


 ROOTでのお約束事?
・グローバルなオブジェクトはgで始まる。現在の状態などを司るオブジェクトもこれに該当する。
 (gROOT, gStyle, gFile, gPad, gDirectoryなど)
・ROOTの一般的なクラス名はTで始まる。(TFile, TTree, TH1F, TGraphなど)
・値やオブジェクトを取得するメンバー関数はGet〜、設定するメンバー関数はSet〜で始まる。
 (GetBinContents, SetPointErrorsなど)
・ROOT内での定数はkで始まる。(kTRUE, kFLASE, kRed, kIgnoreCaseなど)


 ROOTのオプション
・-l : 起動時にスプラッシュを表示しない。エイリアスにでも追加しておきましょう。
・-b : グラフなどを表示せず、バッチモードで実行する。
・-n : .rootrcで指定したlogon/logoffマクロを実行しない。
・-q : コマンドライン引数で渡したマクロを実行後終了する。
2005-2017 HEPtech All rights reserved. Link/Unlink free.
inserted by FC2 system