40 TH1F *FitAwmi_Create_Spectrum(
void) {
42 Double_t xmin = -10., xmax = 10.;
43 delete gROOT->FindObject(
"h");
44 TH1F *h =
new TH1F(
"h",
"simulated spectrum", nbins, xmin, xmax);
46 TF1 f(
"f",
"TMath::Gaus(x, [0], [1], 1)", xmin, xmax);
51 Double_t sigma = (xmax - xmin) / Double_t(nbins) * Int_t(gRandom->Uniform(2., 6.));
53 while (xmax > (xmin + 6. * sigma)) {
56 f.SetParameters(xmin, sigma);
57 Double_t area = 1. * Int_t(gRandom->Uniform(1., 11.));
59 std::cout <<
"created "
61 << (area / sigma / TMath::Sqrt(TMath::TwoPi())) <<
" "
65 std::cout <<
"the total number of created peaks = " << npeaks
66 <<
" with sigma = " << sigma << std::endl;
72 TH1F *h = FitAwmi_Create_Spectrum();
74 TCanvas *cFit = ((TCanvas *)(gROOT->GetListOfCanvases()->FindObject(
"cFit")));
75 if (!cFit) cFit =
new TCanvas(
"cFit",
"cFit", 10, 10, 1000, 700);
79 Int_t nbins = h->GetNbinsX();
81 Double_t *source =
new Double_t[nbins];
82 Double_t *dest =
new Double_t[nbins];
84 for (i = 0; i < nbins; i++) source[i] = h->GetBinContent(i + 1);
85 TSpectrum *s =
new TSpectrum();
87 nfound = s->SearchHighRes(source, dest, nbins, 2., 2., kFALSE, 10000, kFALSE, 0);
89 Bool_t *FixPos =
new Bool_t[nfound];
90 Bool_t *FixAmp =
new Bool_t[nfound];
91 for(i = 0; i < nfound; i++) FixAmp[i] = FixPos[i] = kFALSE;
93 Double_t *Pos, *Amp =
new Double_t[nfound];
95 Pos = s->GetPositionX();
96 for (i = 0; i < nfound; i++) {
97 bin = 1 + Int_t(Pos[i] + 0.5);
98 Amp[i] = h->GetBinContent(bin);
100 TSpectrumFit *pfit =
new TSpectrumFit(nfound);
101 pfit->SetFitParameters(0, (nbins - 1), 1000, 0.1, pfit->kFitOptimChiCounts,
102 pfit->kFitAlphaHalving, pfit->kFitPower2,
103 pfit->kFitTaylorOrderFirst);
104 pfit->SetPeakParameters(2., kFALSE, Pos, FixPos, Amp, FixAmp);
106 pfit->FitAwmi(source);
107 Double_t *Positions = pfit->GetPositions();
108 Double_t *PositionsErrors = pfit->GetPositionsErrors();
109 Double_t *Amplitudes = pfit->GetAmplitudes();
110 Double_t *AmplitudesErrors = pfit->GetAmplitudesErrors();
111 Double_t *Areas = pfit->GetAreas();
112 Double_t *AreasErrors = pfit->GetAreasErrors();
113 delete gROOT->FindObject(
"d");
114 TH1F *d =
new TH1F(*h); d->SetNameTitle(
"d",
""); d->Reset(
"M");
115 for (i = 0; i < nbins; i++) d->SetBinContent(i + 1, source[i]);
116 Double_t x1 = d->GetBinCenter(1), dx = d->GetBinWidth(1);
117 Double_t sigma, sigmaErr;
118 pfit->GetSigma(sigma, sigmaErr);
121 sigma /= TMath::Sqrt2(); sigmaErr /= TMath::Sqrt2();
123 sigma *= dx; sigmaErr *= dx;
125 std::cout <<
"the total number of found peaks = " << nfound
126 <<
" with sigma = " << sigma <<
" (+-" << sigmaErr <<
")"
128 std::cout <<
"fit chi^2 = " << pfit->GetChi() << std::endl;
129 for (i = 0; i < nfound; i++) {
130 bin = 1 + Int_t(Positions[i] + 0.5);
131 Pos[i] = d->GetBinCenter(bin);
132 Amp[i] = d->GetBinContent(bin);
135 Positions[i] = x1 + Positions[i] * dx;
136 PositionsErrors[i] *= dx;
138 AreasErrors[i] *= dx;
140 std::cout <<
"found "
141 << Positions[i] <<
" (+-" << PositionsErrors[i] <<
") "
142 << Amplitudes[i] <<
" (+-" << AmplitudesErrors[i] <<
") "
143 << Areas[i] <<
" (+-" << AreasErrors[i] <<
")"
146 d->SetLineColor(kRed); d->SetLineWidth(1);
148 TPolyMarker *pm = ((TPolyMarker*)(h->GetListOfFunctions()->FindObject(
"TPolyMarker")));
150 h->GetListOfFunctions()->Remove(pm);
153 pm =
new TPolyMarker(nfound, Pos, Amp);
154 h->GetListOfFunctions()->Add(pm);
155 pm->SetMarkerStyle(23);
156 pm->SetMarkerColor(kRed);
157 pm->SetMarkerSize(1);