From: Man. on
// Example to illustrate the peak finder (class TSpectrum).
// This script generates a random number of gaussian peaks
// on top of a linear background.
// The position of the peaks is found via TSpectrum
// To execute this example, do
// root > .x showpeaks.C (generate 10 peaks by default)
// root > .x showpeaks.C(20) (generates 20 peaks)
//
// Author: M. Musatov & Author(s)
#include "TCanvas.h"
#include "TH1.h"
#include "TF1.h"
#include "TRandom.h"
#include "TSpectrum.h"
Int_t npeaks;
Double_t fpeaks(Double_t *x, Double_t *par) {
Double_t result = par[0] + par[1]*x[0];
for (Int_t p=0;p<npeaks;p++) {
Double_t norm = par[3*p+2];
Double_t mean = par[3*p+3];
Double_t sigma = par[3*p+4];
result += norm*TMath::Gaus(x[0],mean,sigma);
}
return result;
}
void showpeaks(Int_t np=10) {
npeaks = np;
TH1F *h = new TH1F("h","test",500,0,1000);
//generate n peaks at random
Double_t par[3000];
par[0] = 0.8;
par[1] = -0.6/1000;
Int_t p;
for (p=0;p<npeaks;p++) {
par[3*p+2] = 1;
par[3*p+3] = 10+gRandom->Rndm()*980;
par[3*p+4] = 3+2*gRandom->Rndm();
}
TF1 *f = new TF1("f",fpeaks,0,1000,2+3*npeaks);
f->SetNpx(1000);
f->SetParameters(par);
TCanvas *c1 = new TCanvas("c1","c1",10,10,1000,600);
h->FillRandom("f",200000);
h->Draw();
//Use TSpectrum to find the peak candidates
TSpectrum *s = new TSpectrum(2*npeaks);
Int_t nfound = s->Search(h,1,"");
Float_t *xpeaks = s->GetPositionX();
TArrow arrow;
arrow.SetFillColor(kBlue);
Double_t dy = 0.1*h->GetMaximum();
for (p=0;p<nfound;p++) {
Float_t xp = xpeaks[p];
Int_t bin = h->GetXaxis()->FindBin(xp);
Float_t yp = h->GetBinContent(bin);
arrow.DrawArrow(xp,yp+dy,xp,yp+0.2*dy,0.02,"|>");
}
}