51 Double_t fpeaks(Double_t *x, Double_t *par) {
52 Double_t result = par[0] + par[1]*x[0];
53 for (Int_t p=0;p<npeaks;p++) {
54 Double_t norm = par[3*p+2];
55 Double_t mean = par[3*p+3];
56 Double_t sigma = par[3*p+4];
57 #if defined(__PEAKS_C_FIT_AREAS__)
58 norm /= sigma * (TMath::Sqrt(TMath::TwoPi()));
60 result += norm*TMath::Gaus(x[0],mean,sigma);
64 void peaks(Int_t np=10) {
65 npeaks = TMath::Abs(np);
66 TH1F *h =
new TH1F(
"h",
"test",500,0,1000);
72 for (p=0;p<npeaks;p++) {
74 par[3*p+3] = 10+gRandom->Rndm()*980;
75 par[3*p+4] = 3+2*gRandom->Rndm();
76 #if defined(__PEAKS_C_FIT_AREAS__)
77 par[3*p+2] *= par[3*p+4] * (TMath::Sqrt(TMath::TwoPi()));
80 TF1 *f =
new TF1(
"f",fpeaks,0,1000,2+3*npeaks);
82 f->SetParameters(par);
83 TCanvas *c1 =
new TCanvas(
"c1",
"c1",10,10,1000,900);
86 h->FillRandom(
"f",200000);
88 TH1F *h2 = (TH1F*)h->Clone(
"h2");
90 TSpectrum *s =
new TSpectrum(2*npeaks);
91 Int_t nfound = s->Search(h,2,
"",0.10);
92 printf(
"Found %d candidate peaks to fit\n",nfound);
94 TH1 *hb = s->Background(h,20,
"same");
100 TF1 *fline =
new TF1(
"fline",
"pol1",0,1000);
101 h->Fit(
"fline",
"qn");
103 par[0] = fline->GetParameter(0);
104 par[1] = fline->GetParameter(1);
107 xpeaks = s->GetPositionX();
108 for (p=0;p<nfound;p++) {
109 Double_t xp = xpeaks[p];
110 Int_t bin = h->GetXaxis()->FindBin(xp);
111 Double_t yp = h->GetBinContent(bin);
112 if (yp-TMath::Sqrt(yp) < fline->Eval(xp))
continue;
113 par[3*npeaks+2] = yp;
114 par[3*npeaks+3] = xp;
116 #if defined(__PEAKS_C_FIT_AREAS__)
117 par[3*npeaks+2] *= par[3*npeaks+4] * (TMath::Sqrt(TMath::TwoPi()));
121 printf(
"Found %d useful peaks to fit\n",npeaks);
122 printf(
"Now fitting: Be patient\n");
123 TF1 *fit =
new TF1(
"fit",fpeaks,0,1000,2+3*npeaks);
125 TVirtualFitter::Fitter(h2,10+3*npeaks);
126 fit->SetParameters(par);