まずbinを指定する配列を定義する
int bins[x] = {xxx, xxxx, xxxx, xxx, ....}
ヒストグラムの定義を以下のように、「配列の要素」、「配列」で定義する。
TH1F * h = new TH1F( "hist" , "histname" , x - 1 , bins );
後はいつものように詰めるだけ。
解析をするときにはMakeClass?をする。 Ntupleに詰められている変数などを自動的に読んでくれてヘッダファイルを作成してくれる。
tree -> MakeClass( "name" );
でname.C name.h ができる。 ヘッダファイルの行列要素は読み込んだNtupleによるので適に変更する。 segmentation violation の場合はここが問題のことが多い。
Ntupleをいくつもまとめて解析したいときに使う。
TChain ch( "tree" ); ch.Add( "filename" );
でつなげられる。 MakeClass?で作ったコードを使うときには
.L name.C+g; name a( &ch ); a.Loop();
でコードが走る。
これらの tuple をまとめるためには
ch.Merge( "filename.root" )
とするとまとまったtuple ができる
Long64_t nentries = fChain -> GetEntries();
の様に Fast を抜く
教えていただいた方法。
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void MyRootAna::progress(Long64_t num){ num++; if(num % 100000 == 0){ std::cerr << " --> " << num << " events analized (" << now() << ")." << std::endl; INFO(" run:" << m_run << " event:" << m_event << " lumi:" << m_lumiblock << " globalBC:" << m_globalBcid); }else if(num % 10000 == 0){ std::cerr << "*"; } }
ミソは cout ではなく cerr を使うこと。 これによってスムースに表示される
ヒストグラムの統計情報を重ねて表示するには
h1 -> Draw( "sames" );
と s を付ける。 統計情報 BOX の調整は
gPad -> SetStatX(); gPad -> SetStatY();
などを利用してずらす。
自分の好きなようにカットをしたあとにNtupleに詰めると解析がはかどる。
TTree * tree = new TTree( "tree" , "tree" ); int integer = 0; float float = 0.; vector<int> vector; tree -> Branch( "Integer" , &integer , "Integer/I" ); tree -> Branch( "Float" , &float , "Float/F" ); tree -> Branch( "vector" , &vector );
と定義する。
この時rootファイルの圧縮を定義することができる。
圧縮は 0 - 9 で定義でき、デフォルトでは 1 が指定されている。
遅くなるらしいがまだよくわからない。。
ベクターはクリアしなければならないので、
vector.clear();
とする。 int float はいつも通りで良いが、ベクターは
vector.push_back( argument );
のようにして詰める。 最後に
tree->Fill();
で詰め終わり。
まず、ファイルを読み込む。
TFile f( "filename.root" );
名前を変えてそれぞれ読み込む。 次にそれぞれの Tree に名前をつける。
TTree * tr = f -> Get( "tree" );
これで tr で tree にアクセスすることができる。 あとは普段と同じようにして描画する。
実は上の TChain で異なる名前を指定すると簡単にできる
複数のデータを重ねるときにあると便利な方法。 まず、レジェンドのポインタを作る
TLegend * l = new TLegend( x , y , X' , Y' );
位置は右上と左下の点を指定する。 次に表に内容の設定をする。
l -> AddEntry( histo , "display name" , "lp" );
3つ目の表示オプションは TGraph と同じようになる。 最後にこれを表示させる。
l -> Draw();
この際に "same" オプションは必要ない。 背景は灰色になってしまうので、
l -> SetFillColor( 0 );
で白にするとすっきりする。 枠線が必要なければ
l -> SetBorderSize( 0 );
で枠線を設定できる。
デフォルトではカラースケールは 20 になっている。 例えば 30 に変更するためには
gStyle -> SetNumberContours( 30 );
とする。 また、以下のを使用すると濃い青->濃い赤のグラデーションになる
void set_plot_style() { const Int_t NRGBs = 5; const Int_t NCont = 255; Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 }; Double_t red[NRGBs] = { 0.00, 0.00, 0.87, 1.00, 0.51 }; Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 }; Double_t blue[NRGBs] = { 0.51, 1.00, 0.12, 0.00, 0.00 }; TColor::CreateGradientColorTable( NRGBs, stops, red, green, blue, NCont ); gStyle -> SetNumberContours( NCont ); }
簡単な解説
const Int_t NRGBs = 5; const Int_t NCont = 255;
色の区切りとグラデーションの数を指定する。
Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 }; Double_t red[NRGBs] = { 0.00, 0.00, 0.87, 1.00, 0.51 }; Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 }; Double_t blue[NRGBs] = { 0.51, 1.00, 0.12, 0.00, 0.00 };
グラデーションの色を配列で指定する。 1行目はかカラーバーの位置を比率で表したもの。 2-4行目はそれぞれの彩度 R = 1 , G = 1 , B = 1 で白になる。
TColor::CreateGradientColorTable( NRGBs, stops, red, green, blue, NCont );
上で作った色を指定して色を作る。
エラーバーは mean の Error、RMS、Statistics Error の3つが指定できる。 それぞれの詳細は以下
' ' (Default) Errors are Spread/SQRT(N) for Spread.ne.0. , " " SQRT(Y)/SQRT(N) for Spread.eq.0,N.gt.0 , " " 0. for N.eq.0 's' Errors are Spread for Spread.ne.0. , " " SQRT(Y) for Spread.eq.0,N.gt.0 , " " 0. for N.eq.0 'i' Errors are Spread/SQRT(N) for Spread.ne.0. , " " 1./SQRT(12.*N) for Spread.eq.0,N.gt.0 , " " 0. for N.eq.0
書式は以下のようにする。
TProfile * h_pfx = h -> ProfileX( "name" , firstbin,lastbin , "option" );
この時に firstbin = 1 lastbin = -1 を指定するとすべtの bin を指定できる。
x,y,zのデカルト座標系から他の座標系に変換する際には TVectorを利用する。
TVector v( x , y , z ) rho = v.Perp(); phi = v.Phi(); …
等が使える。