TTree::GetSelectedRows()とかTTree::GetV1()とかの存在を初めて知ったのでメモ。
Rootのclass referenceの”How to obtain more info from TTree::Draw”のところに色々書いてある。
tree->Draw("X:Y",Cut);//一旦Drawしておく (普段の二次元ヒストグラムを描く時とは順番が違うのに注意) const Int_t N = tree->GetSelectedRows();//Drawでselectionを通ったイベントの数を取ってくる TGraph *graph = new TGraph(N, tree->GetV1(), tree->GetV2());
TTree::GetV1() ~ TTree::GetV4() は、TTree::Draw(“V1:V2:V3:V4”,…) のV1,…,V4の Double_t 配列の先頭ポインタを返す。
あとでNを使って配列を作ろうとして、でも const Int_t N = ... としたんで怒られるので static const Int_t N = ... としたら、 Error: No memory for static N\0\0 なんてエラーが出てきた。 結局、const Int_t N = ... のままにして、配列を宣言するところで、 Double_t *X = new Double[N]; のように動的に確保することによって解決。 ※最後にdeleteを忘れないように。
N of Selected raw > 1000000 となるときは
tree->SetEstimate(tree->GetEntries()+1);
または
tree->SetEstimate(−1);
を呼んでおけとある。
TTree::GetV1()などを変数で受けたい場合には
Double_t *Val1 = tree->GetV1();
みたいにしておけばよいが、Val1は再びDrawが呼ばれたときに書き換わってしまう可能性があるため、注意が必要。 ポインタではなく値を渡すようにしていれば当然大丈夫。
パッとグラフっぽく見せたいだけなら、2次元ヒストグラムを描くノリでtreeのDrawオプションで“P”とか”PL”とかにすればいい。
Drawの第一変数で“Y:X”のように2変数を指定すると、
”htemp”という名前のTH2Fと、
”Graph”という名前のTGraphが生成されるようだ。
これを取ってくるには以下のようにすれば良い。
TGraph *graph = (TGraph*)gPad->GetPrimitive("Graph");
この辺りについて詳しくは、Drawした後に、
TList *list = gPad->GetListOfPrimitives(); list->Dump();
とかすれば見れる。
ちなみに、tree→Draw(“Y:X»hist”)みたいにしても、name=hist になるのはTH2Fの方のみで、TGraphの方はname=Graphのまま。