[ROOT] TGraphからTSpline3を作成する

ROOTTGraphでデータ列を保持していて、そのスプライン補間関数(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]