[ROOT] TGraphからTSpline3を作成する
ROOTのTGraphでデータ列を保持していて、そのスプライン補間関数(cubic splineならTSpline3)を構築したいときは、以下のようにTSpline3::TSpline3(const char* name, const TGraph* g, …)というコンストラクタを使用しましょう。
[tmkm-amazon]9784797370997[/tmkm-amazon]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//インスタンス作成
TGraph* graph=new TGraph();
//データ点の設定
for(size_t i=0;i<nPoints;i++){ graph->SetPoint(i, x[i], y[i]); }
//TSpline3の構築
TSpline3* spline=new TSpline3("newSpline3", graph);
Double_t value = spline->Eval(3);
TGraph::Eval()の第二引数にTSpline3のインスタンスを、第三引数に”S”オプションを渡したら、結果が第二引数のオブジェクトに引き継がれるのかと思いきや、そういう仕様ではありませんでした。
Double_t Eval(Double_t x, TSpline* spline = 0, Option_t* option = "") const Interpolate points in this graph at x using a TSpline -if spline==0 and option="" a linear interpolation between the two points close to x is computed. If x is outside the graph range, a linear extrapolation is computed. -if spline==0 and option="S" a TSpline3 object is created using this graph and the interpolated value from the spline is returned. the internally created spline is deleted on return. -if spline is specified, it is used to return the interpolated value.
詳細は、TGraph::Eval()のコードをみるとわかります。
第二引数のsplineがNULLの場合は、以下のように、今のTGraphのデータを元にTSpline3を構築し、それをもとにxでの値を評価して、TSpline3インスタンスをdeleteしてからreturnしています(ここで作成されたTSpline3を取得できるのか、とぼくは勘違いしていた)。
1
2
3
4
5
// spline interpolation creating a new spline
TSpline3 *s = new TSpline3("", &xsort[0], &ysort[0], fNpoints);
Double_t result = s->Eval(x);
delete s;
return result;
第二引数のsplineがNULLでない場合は、以下のようにそのインスタンスを使ってEvalされるだけです(この部分の意味がよくわかりません。TGraphのEvalを呼ぶからには、そのデータ点を使って補完してほしいのに、わざわざ自分で別途構築したTSpline3を渡して評価してほしいようなユースケースがあるのでしょうかね?)。
1
2
//spline interpolation using the input spline</span>
return spline->Eval(x);
[tmkm-amazon]9784789830980[/tmkm-amazon]