TSpectrum を使うと簡単にpeak searchができた。
の中のサンプルプログラムを動かしたら大体分かる。
ピークの最大数を適当に決めてTSpecrumのインスタンスをつくる。
Int_t maxpeaks = 10;
TSpectrum *s = new TSpectrum(maxpeaks);
ちなみにこれだとresolutionは1になる。今はピークが探せさえすればいいので気にしない。あとからTSpectum::SetResolution
で変えれる。resolution=1はピーク間の距離は3 sigmaに対応するのだとか。詳しくはTSpectrum::SetResolutionを参照。
TSpectrum::Searchを使う。h1
というTH1Fオブジェクトがあったら、
s->Search(h1, 1, "new");
をするだけでいい。めっちゃ簡単。2つ目の引数はsigma。詳しくはマニュアルって書いてあるのであとで読む。3つ目はオプション。4つ目は省略してるけどthresholdを設定する。ピークサーチが終わるとfNPeaks
, fPositionX
などの変数に情報が入ってるので、TSpectrum::GetNPeaks
, TSpectrum::GetPositionX
とかで取ってくる。
Float_t *xpeaks = s->GetPositionX();
あとはresolutionやthresholdをいじってoptimizeしたり、それはピークじゃないってやつをfitできるかどうかで除けばよいのかな。あとsmoothingしたりも。
コンパイルするときのオプションに、-lSpectrum
が必要。これは
root-config --libs
しても出てこないので自分でMakefile
に書いておく必要がある(?)。
に書いてあったけどもっと分かりやすいところに書いて欲しい。