2次元ヒストグラムのFitSliceをするときのTips
2次元ヒストグラムのオブジェクトTH2にはX,Y方向を射影して、その各Binに対しての任意の関数でFitを行い各Binに対するFitting Parameterを1次元ヒストグラムにError付きでFillしてくれる関数があります。それがTH2::FitSlicesX(), TH2::FitSlicesY()です。 FitSlicesYはY軸方向の分布をXのBin毎にFitします。 ARTEMISでは"avx”,“avy"というコマンドで実装されております。
FitSlicesX(), FitSlicesY()の使い方はROOTのReferenceを参照してください。ただ単に
TH2D* hist = new TH2D("hist","hist",200,-50,50,200,-50,50);
/*
適当にFillする
*/
hist->FitSlicesY();
とすると,各XのBinに対してのGauss分布を計算し
- hist_0 (GaussのConstant)
- hist_1 (GaussのMean)
- hist_2 (Gaussのsigma)
- hist_chi2 (Fitしたときのカイ2乗分布)
が生成されます。ARTEMISの場合は
- histavx(y) (GaussのMean)
- histconstant_x(y) (GaussのConstant)
- histsigma_x(y) (Gausのsigma)
- histchi2_x(y) (Fitしたときのカイ2乗分布)
とRenameされています。
hist->Draw("colz");
hist_1->Draw("same");
と重ね書きするとカッチョイイY方向の平均値Plotと2次元ヒストグラムを見比べるなんてことも出来ます。
Tips
このFitSlice、とても便利なのですがSliceする方向に十分な統計がないと外れ値だったりErrorがバカでかいものを量産します。 そこで、統計があまりないヒストグラムでFitSliceする場合
- Sliceする軸のBinは粗くしてまとめる
- Fitする軸のBinはある程度細かく
するのが良いです。例えばFitSlicesY()を使う場合には X方向は粗く,Y方向はある程度細かくすると良いです。 X方向を細かくするとY方向(Fitされる方向)の統計が例えば3点(任意の関数の場合はFitting Parameterの数)未満となるとFit出来なくなってしまい、Error barがそびえ立ちます。そうした場合はX方向をまとめて、Fit出来るまで点を増やしましょう。
もちろん、何らかの物理的要請でBinを設定している場合にはこの限りではないかもしれませんが。
結論
Rebinで粗くは出来るが細かくは出来ないから描くときは細かく!(TH2DはBinの1点に対し8 byte分のメモリを確保するので、細かくしすぎるとメモリをバク食いします)
最後に
片手間の更新なので絵も検証も何もありませんあくまで備忘録なので。時間を見つけて更新します。