部門 > ROOT > その他


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

その他思いついたことなど。分量が多くなったら個別記事に昇格させる感じで。

ROOTにおけるクラスの名前の役割

1次元のヒストグラムを宣言するとき、
TH1F("h1","title", 100, 0, 1000);
みたいに書いてnameがヒストグラム名前、titleがグラフの上につくタイトル、100が何個に分けるか、0が最小値、100が最大値。
こう宣言したあとは、
h1->Draw();
のようにしてこのヒストグラムに対する操作を行える。
配列を使ってると、いちいちsprintfして名前をつけるのが面倒で、同じヒストグラムを使って別のことをやりたいときは、
h[i]=h1;
として、
h[i+10]=h[i];
というように乱暴にコピーできるつもりだった。けれど、たとえばh[i+10]に対して
h[i+10]->SetBin(100,0,10);
などとすると、どうもh[i]のほうにも同じ操作が適用されてしまう。なんでかな、と考えた結果、多分名前を変えてないからなんじゃないかな、と思った。ROOTは
h[i+10]->SetBin(100,0,10);
という命令を読んだときに、h[i+10]というのはh1という名前のヒストグラムで、そのヒストグラムにSetBinというメソッドを適用して、、という風に解釈してるんじゃなかろうか。だから、
h[i+10]=h[i];
のようにやってしまうと、結局はh1というヒストグラムに別の呼び方を与えたに過ぎない模様。ということで、これを解決するには、
TH1F* h2 = (TH1F*)h1->Clone("h2");
というように、新たなヒストグラムをつくって名前をつけてやればいい? これでうまくいったので、たぶんそういうこと。そういわけで、ちゃんと名前をつけてあげることが大事ですね。




TChain

便利そうなクラスを見つけたのでめも。

TTree::Scanを途中で止めない

500行だったら
tree->SetScanField(500);
とかってする。
tree->SetScanField(0);
だと全部。あと、コマンドラインの時に
tree->Scan(???);>scan.log
ってするとファイルに書き込める。マクロ中に書きたい場合はgROOT->ProcessLine()を使えばいい。

ディスプレイのサイズを取得する

TCanvasをフルスクリーンで表示したい時、左上じゃなく右上に表示したいときなどに使える。

TCanvasを右上に表示する例。

Mac OS X Mavericksで二画面使ってる時に、右画面で作業してるのに左にキャンバスが出力されてうざかったので。時にVNCで使ってる時。以下をrootlogon.Cに加えた。なお、キャンバスを一回開いて閉じてるのは、そうしないとgClient->GetRoot()の部分が動かないので(そのせいでrootlogon.Cの読み込みが少し遅くなる)。詳しいことは知らない。ついでにキャンバスデフォルトサイズも設定→部門/ROOT/TCanvas/キャンバスの出力
TCanvas c;
c.Close();
Int_t x, y;
UInt_t w, h;
gVirtualX->GetWindowSize(gClient->GetRoot()->GetId(),x,y,w,h);
gStyle->SetCanvasDefW(1024+4);
gStyle->SetCanvasDefH(768+28);
gStyle->SetCanvasDefX( w - gStyle->GetCanvasDefW());
//  gStyle->SetCanvasDefY( h - gStyle->GetCanvasDefH());