(旧)研究メモ

kennkyuumemo

Canvasに描画したはずなのに白紙で、クリックしてみたら描画される、みたいなとき

http://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:root:graphic

の、

「Styleの変更とModifiedとUpdateとDrawの関係」

を読む。

おおまかには、Drawの位置を変えるか、いろいろDraw optionやgStyleをいじった最後に

canvas->Update();

とやるといいかもしれない。canvasはTCanvasのインスタンス

TGraphを大量に描く

TGraphをfor文使って大量に描きたいときは、二次元配列を使うとうまいことできる

x[3][5] = {{…..}, {…..}, {…..}};
y[3][5] = {{…..}, {…..}, {…..}};

TGraph *g[3];

for(int i=0;i<3;i++){
    g[i] = new TGraph(5, x[i], y[i]);
    g[i]->Draw();
}

2次元ヒストグラムのピークのところでの軸の値をそれぞれもってきたいとき

二次元ヒストグラムでなんかの分布を見て、一番データが集中してるところでのx, yの値がほしいときがよくある
ヒストグラムの名前をhist1とすると、

int maxbin;          
int maximum_xbin;
int maximum_ybin;
int dammyz;
double maximum_x;
double maximum_y;

maxbin = hist1->GetMaximumBin();                      //グローバルなbinの値をとってくる
hist1->GetBinXYZ(maxbin, maximum_xbin, maximum_ybin, dammyz); //グローバルなbinの値を、x,y,z軸それぞれのbin番号に変える(今は二次元なのでzはダミー)
maximum_x = hist1->GetXaxis()->GetBinCenter(maximum_xbin); //bin番号を、その軸上での値に変える
maximum_y = hist1->GetYaxis()->GetBinCenter(maximum_ybin);

とする。Hough変換とかで便利

コンパイルして使用している場合、これらの関数はTH1で定義されているので、TH1.hをincludeする

vectorにデータを入れてて、TGraphでグラフ描きたいとき

普通、配列にデータ入れてグラフ描くときは

int x[3] = {1,2,3};
int y[3] = {1,2,3};

TGraph *g1 = new TGraph(3, x, y);
g1->Draw("AP");

的な感じでTGraphの引数には配列の名前を入れる

vectorでこれをやるとエラーでるけど、引数を

vector<int> x;
vector<int> y;
…

TGraph *g1 = new TGraph(3, &x[0], &y[0]);

とすればいける