37 Double_t fpeaks2(Double_t *x, Double_t *par) {
38 Double_t result = 0.1;
39 for (Int_t p=0;p<npeaks;p++) {
40 Double_t norm = par[5*p+0];
41 Double_t mean1 = par[5*p+1];
42 Double_t sigma1 = par[5*p+2];
43 Double_t mean2 = par[5*p+3];
44 Double_t sigma2 = par[5*p+4];
45 result += norm*TMath::Gaus(x[0],mean1,sigma1)*TMath::Gaus(x[1],mean2,sigma2);
50 printf(
"Generating histogram with %d peaks\n",npeaks);
54 Double_t xmax = (Double_t)nbinsx;
56 Double_t ymax = (Double_t)nbinsy;
57 Double_t dx = (xmax-xmin)/nbinsx;
58 Double_t dy = (ymax-ymin)/nbinsy;
60 h2 =
new TH2F(
"h2",
"test",nbinsx,xmin,xmax,nbinsy,ymin,ymax);
65 for (p=0;p<npeaks;p++) {
66 par[5*p+0] = gRandom->Uniform(0.2,1);
67 par[5*p+1] = gRandom->Uniform(xmin,xmax);
68 par[5*p+2] = gRandom->Uniform(dx,5*dx);
69 par[5*p+3] = gRandom->Uniform(ymin,ymax);
70 par[5*p+4] = gRandom->Uniform(dy,5*dy);
72 TF2 *f2 =
new TF2(
"f2",fpeaks2,xmin,xmax,ymin,ymax,5*npeaks);
75 f2->SetParameters(par);
76 TCanvas *c1 = (TCanvas*)gROOT->GetListOfCanvases()->FindObject(
"c1");
77 if (!c1) c1 =
new TCanvas(
"c1",
"c1",10,10,1000,700);
78 h2->FillRandom(
"f2",500000);
81 Int_t nfound = s->Search(h2,2,
"col");
85 Double_t *xpeaks = s->GetPositionX();
86 Double_t *ypeaks = s->GetPositionY();
87 for (p=0;p<npeaks;p++) {
88 for (pf=0;pf<nfound;pf++) {
89 Double_t diffx = TMath::Abs(xpeaks[pf] - par[5*p+1]);
90 Double_t diffy = TMath::Abs(ypeaks[pf] - par[5*p+3]);
91 if (diffx < 2*dx && diffy < 2*dy) ngood++;
94 if (ngood > nfound) ngood = nfound;
97 for (pf=0;pf<nfound;pf++) {
99 for (p=0;p<npeaks;p++) {
100 Double_t diffx = TMath::Abs(xpeaks[pf] - par[5*p+1]);
101 Double_t diffy = TMath::Abs(ypeaks[pf] - par[5*p+3]);
102 if (diffx < 2*dx && diffy < 2*dy) nf++;
104 if (nf == 0) nghost++;
109 printf(
"Gener=%d, Found=%d, Good=%d, Ghost=%d\n",npeaks,nfound,ngood,nghost);
110 if (!gROOT->IsBatch()) {
111 printf(
"\nDouble click in the bottom right corner of the pad to continue\n");
115 void peaks2(Int_t maxpeaks=50) {
116 s =
new TSpectrum2(2*maxpeaks);
117 for (
int i=0; i<10; ++i) {
118 npeaks = (Int_t)gRandom->Uniform(5,maxpeaks);