TF1の諸々

基本

TF1 *func = new TF1(“func”, ”x*sin(x)”, r1, r2);//r1,r2は定義範囲。フィット範囲とは別。
func->Draw();//表示する。

システム定義関数の利用方法

"TMath::..."を指定すれば良い。
例えば、
expo - exp([0]+[1]*x) //これ間違いやすい。注意!
gaus - [0]*exp(-0.5*( (x-[1])/[2])**2) //規格化とかしてくれてはいない。注意!
gausn- [0]*exp(-0.5*( (x-[1])/[2])**2) /(sqrt(2*pi)*[2]) ) //normalized が欲しいときはこっちを使おう。
polN - [0]+[1]*x+[2]*x**2+…+[N]*x**N

TF1 *func = new TF1(“func”, ”TMath::BreitWigner(x,0,1)”, -3, 3);

追記:
こんなことせずとも、
"expo+gaus+pol2"
などとして設定できるらしい。
(ウソ。正しくは、expo(0)+gaus(2)+pol2(5)などとして、変数の開始番号をしていしてやらなくてはいけない。)

自分で関数を詳しく定義する方法

"..."の中に#defineマクロは使えないので、rootマクロ内で何度も同じ値を使いたい場合は面倒くさい。そこで次のように設定をすると良い。この中ではきちんと#defineの値を使える。

//definition of myfunc
Double_t myfunc(Double_t *x,Double_t *par)
{
  //x is the pointer to the array which contains x[0],x[1],x[2],...
  //par is the pointer to the array which contains p[0],p[1],p[2],...  
  return (par[0]*sin(par[1]*x[0]);
}
//main function
void macro()
{
  ....
  ....
  TF1 *func = new TF1(“func”, myfunc, 0, 1, 2);//The last value is always 2.
  
}

TF1の表示、その他

func->Draw();//TCanvasに表示
func->Print();//パラメータをCUIに出力
func->Eval(x);//xを与えてyを得る
func->Integral(x1,x2);//x1からx2まで積分
func->Derivative(x);//xにおける微分を得る
func->SetLineColor(color);//色をcolorにする。なんか使えなかった。
func->SetLineStyle(style);//線の種類をstyleにする
func->SetLineWidth(1);//線の太さを変える
func->SetTitle(FunctionName);//タイトルをFunctionNameにする
func->GetXaxis()->SetTitle(XAxisName);//X軸の名前をXAxisNameに変える
func->GetYaxis()->SetTitle(YAxisName);//Y軸の名前をYAxisNameに変える
func->SetParameters(p0,p1,...);//パラメーターの初期値を変える
func->SetParameters((*Double_t)pointer_to_parameters);//パラメーターの値を"いっき"に設定する。
func->SetParNames(p0_name,p1_name,...);//パラメーターに名前を"いっきに"付ける
func->SetParName(p_num,p_name);//パラメーターに名前を"ひとつずつ"付ける

フィットの奥義

hist->Fit("func",option,graphic_option,x_min,x_max);

optionは、フィッティングオプション。

"W" Set all errors to 1
"I" Use integral of function in bin instead of value at bin center。時間がかかるが精度がいいらしい。
"L" Use Loglikelihood method (default is chisquare method)
"LL" Use Loglikelihood method and bin contents are not integers)
"U" Use a User specified fitting algorithm (via SetFCN)
"Q" Quiet mode (minimum printing)
"V" Verbose mode (default is between Q and V)
"E" Perform better Errors estimation using Minos technique
"B" Use this option when you want to fix one or more parameters
and the fitting function is like "gaus","expo","poln","landau".
“M" More. Improve fit results
"R" Use the Range specified in the function range
"N" Do not store the graphics function, do not draw
"0" Do not plot the result of the fit.
"+" Add this new fitted function to the list of fitted functions.

だそうです。
x_min,x_maxに関しては、SetRange()の値が無視されるのでここできちんと設定しなくてはいけない。

フィットパラメータの取得

func->GetParameter(N);//get Nth value
func->GetParameters((*Double_t)pointer_to_container));//パラメータを配列に入れる。
func->GetParError(N);//get Nth error
func->GetChisquare();//get chi scuare
func->GetNDF();//get Number Of Freedom
func->GetParameters();

フィット時に使える関数

めちゃくちゃになってしまったのでまとめておく。

TH1::GetFunction(“fitFunction”);//Histogramをフィットした関数を得る
TF1::GetNpar();//パラメーターの数を得る
TF1::SetParameter(parNo,value);//パラメーターの設定
TF1::SetParameters(val1,val2,…);//パラメーターの設定(これは配列で与えることも出来る
TF1::GetParameter(parNo);//パラメーターの取得
TF1::GetParameters(parArray);//パラメーターの取得
TF1::SetParError(parNo,value);//エラーの設定(何に使うのか分からない)
TF1::SetParErrors(val1,val2,…);//エラーの設定(意味が分からない)
TF1::GetParError(parNo);//パラメーターに付いているエラーの取得
TF1::GetParErrors(eParArray);//パラメーターに付いているエラーの取得。ウソ。こんな関数無い。変な継承先の関数で使い勝手が違うらしい。無難にparNoをループで変えるのが吉。
TF1::GetChisquare();//χ二乗を得る
TF1::GetNDF();//自由度を得る
TF1::FixParameter(parNo);//パラメーターを固定してしまう(フィット時に動かさない)
TF1::SetParLimits(parNo,min,max);//パラメーターの可動範囲を制限する(フィット時はこの範囲内でフィットする)