GammaWare  Head Version for release 0.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FitSpectra.cpp
Go to the documentation of this file.
1 
2 
3 
4 //typedef char __signed;
5 
6 #include <iostream>
7 #include <iomanip>
8 #include <fstream>
9 #include <sstream>
10 #include <vector>
11 #include <string>
12 #include <map>
13 
14 #include "FitSpectra.h"
15 
16 using namespace std;
17 
18 //ClassImp(FitSpectra);
19 
20 FitSpectra::FitSpectra(TString type, TString source)
21 {
22  fHistToFit = 0x0;
23  fHistName = "";
24  fSourceName = source;
25  fFitType = type;
26  fFitFctName = "";
27  fBackGroundName = "";
28  fDefinePersoBackground = false;
29  fUseOffset = false;
30 
31  fWidth = 0.;
32  fThreshold = 0.;
33 
34  InitSourceProperties();
35 
36  fxmin = 0.;
37  fxmax = 0.;
38 }
39 
40 FitSpectra::FitSpectra(TH1 *hist, TString type, TString source)
41 {
42  fHistToFit = hist;
43  fSourceName = source;
44  fFitType = type;
45  fHistName = fHistToFit->GetName();
46 
47  fDefinePersoBackground = false;
48  fUseOffset = false;
49 
50  fFitFctName = "FitFct_" + (TString)fHistToFit->GetName();
51  fBackGroundName = "BackGround_" + (TString)fHistToFit->GetName();
52 
53  InitSourceProperties();
54 }
55 
57 {
58  delete BackGroundHist;
59  delete fFitFct;
60 }
61 
63 {
64  if(fSourceName == "60Co")
65  {
66  fEPeaks.push_back(1173.238);
67  fEPeaks.push_back(1332.513);
68  }
69  else if(fSourceName == "22Na") {
70  fEPeaks.push_back( 511.006);
71  fEPeaks.push_back(1274.545);
72  }
73  else if(fSourceName == "152Eu") {
74  fEPeaks.push_back( 121.7793);
75  fEPeaks.push_back( 244.6927);
76  fEPeaks.push_back( 344.2724);
77  fEPeaks.push_back( 411.111);
78  fEPeaks.push_back( 443.979);
79  fEPeaks.push_back( 778.890);
80  fEPeaks.push_back( 867.388);
81  fEPeaks.push_back( 964.014);
82  fEPeaks.push_back(1085.793);
83  //fEPeaks.push_back(1089.700);
84  fEPeaks.push_back(1112.070);
85  fEPeaks.push_back(1212.95);
86  fEPeaks.push_back(1299.1);
87  fEPeaks.push_back(1407.993);
88  }
89  else if(fSourceName == "88Y") {
90  fEPeaks.push_back( 898.045);
91  fEPeaks.push_back(1836.062);
92  //fEPeaks.push_back(2734.087);
93  }
94  else if(fSourceName == "133Ba") {
95  fEPeaks.push_back( 53.156);
96  fEPeaks.push_back( 79.623);
97  fEPeaks.push_back( 80.999);
98  fEPeaks.push_back( 160.609);
99  fEPeaks.push_back( 223.116);
100  fEPeaks.push_back( 276.404);
101  fEPeaks.push_back( 302.858);
102  fEPeaks.push_back( 356.014);
103  fEPeaks.push_back( 383.859);
104  }
105  else if(fSourceName == "baseline") {
106  fEPeaks.push_back(4000.);
107  }
108 
109  fNPeaksToFit = fEPeaks.size();
110 }
111 
112 void FitSpectra::SetSource(TString source)
113 {
114  fSourceName = source;
115  InitSourceProperties();
116 }
117 
119 {
120  fHistToFit = hist;
121  fHistName = fHistToFit->GetName();
122 }
123 
124 void FitSpectra::SetHistogram(TString HistName)
125 {
126  fHistToFit = (TH1*)gROOT->FindObject(HistName);
127  if(fHistToFit == 0x0)
128  Warning("FitSpectra::SetHistogram","Histogram with name %s not found",HistName.Data());
129  else fHistName = fHistToFit->GetName();
130 }
131 
133 {
134  CurrentPad = gPad;
135 
136  TList *ListOfPrimitives = (TList*) CurrentPad->GetListOfPrimitives();
137 
138  if(ListOfPrimitives->GetSize())
139  {
140  TIter iter(ListOfPrimitives);
141  TObject *o;
142  TH1 *h = 0x0;
143 
144  while( (o = iter()) )
145  {
146  if(o->InheritsFrom("TH1"))
147  {
148  h = (TH1*)o;
149  break;
150  }
151  }
152  fHistToFit = h;
153  fHistName = fHistToFit->GetName();
154 
155  fFitFctName = "FitFct_" + (TString)fHistToFit->GetName();
156  fBackGroundName = "BackGround_" + (TString)fHistToFit->GetName();
157  }
158 }
159 
161 {
162 
163  FitStatus = 0;
164 
165  if(fHistToFit==0x0 || fHistToFit->Integral(2,fHistToFit->GetNbinsX()) < 100)
166  {
167  fHistToFit=0x0;
168  return;
169  }
170 
171  CurrentPad->SetEditable(true);
172 
173  gErrorIgnoreLevel = kError;
174 
175  gPad->SetLogy();
176 
177  if(fxmin==0. && fxmax == 0.) fHistToFit->SetAxisRange(0.,fHistToFit->GetXaxis()->GetXmax());
178  else fHistToFit->SetAxisRange(fxmin,fHistToFit->GetXaxis()->GetXmax());
179 
180  int peakfactor = 10;
181  if(fSourceName=="baseline") peakfactor = 1;
182 
183  TSpectrum *s = new TSpectrum(peakfactor*fNPeaksToFit);
184 
185 // if(fWidth!=0. && fThreshold!=0.)
186 // {
187 // fNFound = s->Search(fHistToFit,fWidth,"nodraw",fThreshold);
188 // }
189 // else
190 // {
191  fNFound = 100;
192  int test=0;
193  double FirstStep = fThreshold;
194  while(fNFound>(int)fNPeaksToFit*3)
195  {
196  fNFound = s->Search(fHistToFit,fWidth,"nodraw",FirstStep);
197  FirstStep += fThreshold;
198  test++;
199  if(test>100)break;
200  }
201 // }
202 
203  gPad->Update();
204  gPad->Modified();
205 
206 // float *xpeak = s->GetPositionX();
207 // float *ypeak = s->GetPositionY();
208 
209  for(int i=0 ; i<fNFound ; i++)
210  {
211  fXPeaks.push_back(/*xpeak[i]*/s->GetPositionX()[i]);
212  fYPeaks.push_back(/*ypeak[i]*/s->GetPositionY()[i]);
213  }
214 
216  for(int t=1 ; t<fNFound ; t++)
217  for(int i=0 ; i<fNFound-1 ; i++)
218  if(fXPeaks[i]>fXPeaks[i+1])
219  {
220  swap(fXPeaks[i],fXPeaks[i+1]);
221  swap(fYPeaks[i],fYPeaks[i+1]);
222  }
223 
225  if(fNFound!=fNPeaksToFit)
226  {
227  int min=0;
228  int max = fNFound-1;
229 
231 
232  double rapmaxmin = fEPeaks[fEPeaks.size()-1]/fEPeaks[0];
233  double rapmaxmin2 = fEPeaks[fEPeaks.size()-1]/964.014;
234 
235  double bestrap = 1;
236 
237  for(int i=0 ; i<fNFound ; i++)
238  {
239  for(int j=i+1 ; j<fNFound ; j++)
240  {
241  double rap = TMath::Abs((fXPeaks[j]/fXPeaks[i])/rapmaxmin-1);
242 
243  if(rap<0.005 && fYPeaks[i]>0.9*fYPeaks[j] && rap<bestrap)
244  {
245  if(fSourceName.Contains("Eu"))
246  {
248  for(int k=0 ; k<fNFound ; k++)
249  {
250  double rap2 = TMath::Abs((fXPeaks[j]/fXPeaks[k])/rapmaxmin2-1);
251  if(rap2<0.005)
252  {
253  min= i;
254  max= j;
255  bestrap=rap;
256  }
257  }
258  }
259  else
260  {
261  min= i;
262  max= j;
263  bestrap=rap;
264  }
265  }
266  }
267  }
268  if(bestrap==1)
269  {
270  Error("FitSpectra::Fit()","First and last peak not found ==> Calibration not feasible, exit Fit() method.");
271  return;
272  }
273  else
274  {
275  // cout<<" Peak at "<<fEPeaks[0]<<" kev found at canal "<<fXPeaks[min]<<endl;
276  // cout<<" Peak at "<<fEPeaks[fNPeaksToFit-1]<<" kev found at canal "<<fXPeaks[max]<<endl;
277  }
278 
279  fXPeaks.erase(fXPeaks.begin()+max+1,fXPeaks.end());
280  fYPeaks.erase(fYPeaks.begin()+max+1,fYPeaks.end());
281 
282  fXPeaks.erase(fXPeaks.begin(),fXPeaks.begin()+min);
283  fYPeaks.erase(fYPeaks.begin(),fYPeaks.begin()+min);
284 
285  fNFound = max-min+1;
286 
287  // cout<<fXPeaks.size()<<" "<<fNFound<<endl;
288  // cout<<fXPeaks[0]<<" "<<fXPeaks[fXPeaks.size()-1]<<endl;
289 
290  vector < int > BadPeaks;
291  vector < int > PeakNotFound;
292 
293  int lastgoodpeak=0;
294 
295  for(int i=1 ; i<fNPeaksToFit-1 ; i++)
296  {
297  bestrap = 1;
298  bool peakfound = false;
299 
300  double rapE = fEPeaks[i]/fEPeaks[0];
301 
302  for(int j=lastgoodpeak+1 ; j<fNFound-1 ; j++)
303  {
304  double rap = TMath::Abs((fXPeaks[j]/fXPeaks[0])/rapE-1);
305  if(rap<0.007&&rap<bestrap)
306  {
307  for(int k=lastgoodpeak+1 ; k<j ; k++) BadPeaks.push_back(k);
308  lastgoodpeak=j;
309  peakfound = true;
310  break;
311  }
312  }
313  if(!peakfound)
314  {
315  // cout<<" Peak at "<<fEPeaks[i]<<" kev not found, peak ignored"<<endl;
316  PeakNotFound.push_back(i);
317  }
318  else
319  {
320  // cout<<" Peak at "<<fEPeaks[i]<<" kev found at canal "<<fXPeaks[lastgoodpeak]<<endl;
321  }
322  }
323 
324  fXPeaks.erase(fXPeaks.begin()+lastgoodpeak+1,fXPeaks.end()-1);
325  fYPeaks.erase(fYPeaks.begin()+lastgoodpeak+1,fYPeaks.end()-1);
326 
327  for(int i=BadPeaks.size()-1 ; i>=0 ; i--)
328  {
329  fXPeaks.erase(fXPeaks.begin()+BadPeaks[i]);
330  fYPeaks.erase(fYPeaks.begin()+BadPeaks[i]);
331  fNFound--;
332  }
333  for(int i=PeakNotFound.size()-1 ; i>=0 ; i--)
334  {
335  fEPeaks.erase(fEPeaks.begin()+PeakNotFound[i]);
336  fNPeaksToFit--;
337  }
338  }
339 
340  double xmin = fXPeaks[0] - fXPeaks[fNPeaksToFit-1]*0.05;
341  double xmax = fXPeaks[fNPeaksToFit-1] + fXPeaks[fNPeaksToFit-1]*0.05;
342  fHistToFit->SetAxisRange(xmin,xmax);
343 
344  // cout<<fNPeaksToFit<<" "<<fNFound<<" "<<xmin<<" "<<xmax<<endl;
345 
346  gPad->Update();
347  gPad->Modified();
348 
349  if(fSourceName=="baseline")
350  {
351  xmin = fXPeaks[0]*(1-0.1);
352  xmax = fXPeaks[fNFound-1]*(1+0.2);
353  }
354 
355  int nbins = fHistToFit->FindBin(xmax)-fHistToFit->FindBin(xmin);
356  CurrentPad->SetLogy();
357 
358  // through histograms since TSpectrum API has been modified at some point ... I am not sure the version is exactly the right one
359 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,0,0)
360  double * source = new double[nbins];
361 #else
362  float * source = new float[nbins];
363 #endif
364 
365  for(int i=0 ; i< nbins ; i++) source[i] = fHistToFit->GetBinContent(fHistToFit->FindBin(xmin)+i+1);
366 
367  if(fDefinePersoBackground)
368  {
369  s->Background(source,nbins,fNumberIterations,fDirection,fFilterOrder,fSmoothing,fsmoothingWindow,fCompton);
370  }
371  else if(fSourceName=="152Eu")
372  {
373  s->Background(source,nbins,30,TSpectrum::kBackDecreasingWindow,TSpectrum::kBackOrder2,true,TSpectrum::kBackSmoothing3,false);
374  }
375  else if(fSourceName=="baseline")
376  {
377  s->Background(source,nbins,20,TSpectrum::kBackDecreasingWindow,TSpectrum::kBackOrder2,true,TSpectrum::kBackSmoothing3,false);
378  }
379  else if(fHistName.Contains("36") || fHistName.Contains("37"))
380  {
381  s->Background(source,nbins,90,TSpectrum::kBackDecreasingWindow,TSpectrum::kBackOrder2,true,TSpectrum::kBackSmoothing3,false);
382  }
383  else
384  {
385  s->Background(source,nbins,300,TSpectrum::kBackDecreasingWindow,TSpectrum::kBackOrder8,true,TSpectrum::kBackSmoothing3,true);
386  }
387 
388  if(gROOT->FindObject(fBackGroundName) != 0x0)
389  {
390  TH1 *h = (TH1*) gROOT->FindObject(fBackGroundName);
391  delete h;
392  }
393 
394  BackGroundHist = new TH1F(fBackGroundName,fBackGroundName,nbins,xmin,xmax);
395 
396  for (int i = 0; i < nbins; i++) BackGroundHist->SetBinContent(i+1,source[i]);
397 
398  if(gROOT->FindObject(fFitFctName) != 0x0)
399  {
400  TH1 *f = (TH1*) gROOT->FindObject(fFitFctName);
401  delete f;
402  }
403 
404  int NPar = 0;
405 
406  if(fFitType =="Gaus")
407  {
408  NPar = 3;
409 
410  fFitFct = new TF1(fFitFctName,this,&FitSpectra::BGPlusGaus,xmin,xmax,fNPeaksToFit*NPar,"FitSpectra","BGPlusGaus");
411  fFitFct->SetNpx(nbins);
412 
413  for(int i=0 ; i<fNPeaksToFit ; i++)
414  {
415  fFitFct->SetParameter(0+NPar*i,fYPeaks[i]-BackGroundHist->GetBinContent(BackGroundHist->FindBin(fXPeaks[i])));
416  fFitFct->SetParLimits(0+NPar*i,fFitFct->GetParameter(0+NPar*i)/2.,fFitFct->GetParameter(0+NPar*i)*2.);
417 
418  fFitFct->SetParameter(1+NPar*i,fXPeaks[i]);
419  fFitFct->SetParLimits(1+NPar*i,fXPeaks[i]*(1-2e-3),fXPeaks[i]*(1+2e-3));
420 
421  fFitFct->SetParameter(2+NPar*i,fXPeaks[i]*5e-4);
422  fFitFct->SetParLimits(2+NPar*i,0.,20.);
423  }
424  }
425  else if(fFitType =="CBDS")
426  {
427  NPar = 7;
428 
429  fFitFct = new TF1(fFitFctName,this,&FitSpectra::BGPlusCBDS,xmin,xmax,fNPeaksToFit*NPar,"FitSpectra","BGPlusCBDS");
430  fFitFct->SetNpx(nbins);
431 
432  for(int i=0 ; i<fNPeaksToFit ; i++)
433  {
434  fFitFct->SetParameter(0+NPar*i,fYPeaks[i]-BackGroundHist->GetBinContent(BackGroundHist->FindBin(fXPeaks[i])));
435  fFitFct->SetParLimits(0+NPar*i,fFitFct->GetParameter(0+NPar*i)*0.95,fFitFct->GetParameter(0+NPar*i)*1.05);
436 
437  fFitFct->SetParameter(1+NPar*i,fXPeaks[i]);
438  fFitFct->SetParLimits(1+NPar*i,fXPeaks[i]*(1-0.001),fXPeaks[i]*(1+0.001));
439 
440  fFitFct->SetParameter(2+NPar*i,fXPeaks[i]*5e-4);
441  //fFitFct->SetParLimits(2+NPar*i,0.,fXPeaks[i]*1e-2);
442 
443  fFitFct->SetParameter(3+NPar*i,2.);
444  fFitFct->SetParLimits(3+NPar*i,0.,5.);
445 
446  fFitFct->SetParameter(4+NPar*i,5.);
447  fFitFct->SetParLimits(4+NPar*i,0.,25.);
448 
449  fFitFct->SetParameter(5+NPar*i,2.);
450  fFitFct->SetParLimits(5+NPar*i,0.,5.);
451 
452  fFitFct->SetParameter(6+NPar*i,5.);
453  fFitFct->SetParLimits(6+NPar*i,0.,25.);
454  }
455  }
456  else if(fFitType =="Dino")
457  {
459  NPar = 3;
460  double par[fNPeaksToFit*NPar];
461 
462  for(int i=0 ; i<fNPeaksToFit ; i++)
463  {
464  TF1 *Gaus = new TF1("Gaus",this,&FitSpectra::BGPlusGaus,fXPeaks[i]-5.,fXPeaks[i]+10.,NPar,"FitSpectra","BGPlusGaus");
465 
466  Gaus->SetParameter(0,fYPeaks[i]-BackGroundHist->GetBinContent(BackGroundHist->FindBin(fXPeaks[i])));
467 
468  Gaus->SetParameter(1,fXPeaks[i]);
469  Gaus->SetParLimits(1,fXPeaks[i]-1.,fXPeaks[i]+1.);
470 
471  Gaus->SetParameter(2,fXPeaks[i]*1e-3);
472  Gaus->SetParLimits(2,0.,fXPeaks[i]*2e-3);
473 
474  fHistToFit->Fit(Gaus,"QRS0");
475 
476  par[0+NPar*i] = Gaus->GetParameter(0);
477  par[1+NPar*i] = Gaus->GetParameter(1);
478  par[2+NPar*i] = Gaus->GetParameter(2);
479 
480  delete Gaus;
481  }
482  NPar = 6;
483 
484  fFitFct = new TF1(fFitFctName,this,&FitSpectra::BGPlusDinoFct,xmin,xmax,fNPeaksToFit*NPar,"FitSpectra","BGPlusDinoFct");
485  fFitFct->SetNpx(nbins);
486 
487  for(int i=0 ; i<fNPeaksToFit ; i++)
488  {
489  fFitFct->FixParameter(0+NPar*i,par[0+3*i]);
490 
491  fFitFct->FixParameter(1+NPar*i,par[1+3*i]);
492 
493  fFitFct->SetParameter(2+NPar*i,par[2+3*i]);
494  fFitFct->SetParLimits(2+NPar*i,1./sqrt(12.),par[2+3*i]*2.35);
495 
496  fFitFct->SetParameter(3+NPar*i,-2.);
497  fFitFct->SetParLimits(3+NPar*i,-50,-0.1);
498 
499  fFitFct->SetParameter(4+NPar*i,2.);
500  fFitFct->SetParLimits(4+NPar*i,0.1,50.);
501 
502  fFitFct->FixParameter(5+NPar*i,0.);
503  }
504  }
505  fHistToFit->Fit(fFitFct,"QRS0+");
506  TF1 *FitFctClone = (TF1*)fFitFct->Clone();
507 
509 
510  for(int i=0 ; i<fNPeaksToFit ; i++)
511  {
512  TF1 *FNoBG = 0x0;
513  if(fFitType =="Gaus") FNoBG = new TF1("FNoBG",this,&FitSpectra::MyGaus,xmin,xmax,NPar,"FitSpectra","MyGaus");
514  else if(fFitType =="CBDS") FNoBG = new TF1("FNoBG",this,&FitSpectra::fnc_dscb,xmin,xmax,NPar,"FitSpectra","fnc_dscb");
515  else if(fFitType =="Dino") FNoBG = new TF1("FNoBG",this,&FitSpectra::DinoFct,xmin,xmax,NPar,"FitSpectra","DinoFct");
516 
517  for(int j=0 ; j<NPar ; j++) FNoBG->SetParameter(j,fFitFct->GetParameter(j+NPar*i));
518 
519  double mean = FNoBG->GetParameter(1);
520  double sigma = FNoBG->GetParameter(2);
521 
522  fMean.push_back(mean);
523  fSigma.push_back(sigma);
524 
525  double N = FNoBG->GetParameter(0);
526 
527  double fwhm = FNoBG->GetX(N/2.,mean,mean+5*sigma)-FNoBG->GetX(N/2.,mean-5*sigma,mean);
528 
529  fFWHM.push_back(fwhm);
530 
531  double fwhm_10 = FNoBG->GetX(N/10.,mean,mean+5*sigma)-FNoBG->GetX(N/10.,mean-5*sigma,mean);
532 
533  fFWHM_10.push_back(fwhm_10);
534 
535  double LTProp = (mean-FNoBG->GetX(N/10.,mean-5*sigma,mean))/(mean-FNoBG->GetX(N/2.,mean-5*sigma,mean));
536 
537  fLeftTailProp.push_back(LTProp);
538 
539  double RTProp = (mean-FNoBG->GetX(N/10.,mean,mean+5*sigma))/(mean-FNoBG->GetX(N/2.,mean,mean+5*sigma));
540 
541  fRightTailProp.push_back(RTProp);
542 
543  double area = FNoBG->Integral(mean-5*sigma,mean+5*sigma);
544  fArea.push_back(area);
545 
546  delete FNoBG;
547  }
548 
549  if(fNPeaksToFit>1)
550  {
551  FitStatus = 1;
552  Calib();
553  }
554 
555 
557  FitFctClone->Draw("same");
558 
559  TH1F *BackGroundHistClone = (TH1F*)BackGroundHist->Clone();
560  BackGroundHistClone->SetLineColor(kGreen);
561  BackGroundHistClone->SetLineStyle(7);
562  BackGroundHistClone->Draw("same");
563 
564  fHistToFit->SetAxisRange(xmin,xmax);
565 
566  CurrentPad->SetEditable(true);
567 
568  gPad->Update();
569  gPad->Modified();
570 
571  gErrorIgnoreLevel = kPrint;
572 
573  delete [] source;
574  delete s;
575 }
576 
578 {
579  const int n = fNPeaksToFit;
580 
581  double Raw[n];
582  double E[n];
583 
584  for(int i=0 ; i<fNPeaksToFit ; i++)
585  {
586  Raw[i] = fMean[i];
587  E[i] = fEPeaks[i];
588  }
589 
590  TGraph *g = new TGraph(fNPeaksToFit,Raw,E);
591 
592  TF1 *fpol = new TF1("f","[0]+[1]*x",0.,Raw[fNPeaksToFit-1]*1.2);
593  if(!fUseOffset) fpol->FixParameter(0,0.);
594 
595  g->Fit(fpol,"RQ0");
596 
597  fCalibOffset = fpol->GetParameter(0);
598  fCalibSlope = fpol->GetParameter(1);
599 
600  for(int i=0 ; i<fNPeaksToFit ; i++)
601  {
602  fEcal.push_back(fpol->Eval(fMean[i]));
603  fFWHMCal.push_back(fCalibSlope*fFWHM[i]);
604  fFWHM_10Cal.push_back(fCalibSlope*fFWHM_10[i]);
605  }
606 
607  delete fpol;
608 }
609 
610 double FitSpectra::fnc_dscb(double*xx,double*pp)
611 {
612  double x = xx[0];
613  // gaussian core
614  double N = pp[0];//norm
615  double mu = pp[1];//mean
616  double sig = pp[2];//variance
617  // transition parameters
618  double a1 = pp[3];
619  double p1 = pp[4];
620  double a2 = pp[5];
621  double p2 = pp[6];
622 
623  double u = (x-mu)/sig;
624  double A1 = TMath::Power(p1/TMath::Abs(a1),p1)*TMath::Exp(-a1*a1/2);
625  double A2 = TMath::Power(p2/TMath::Abs(a2),p2)*TMath::Exp(-a2*a2/2);
626  double B1 = p1/TMath::Abs(a1) - TMath::Abs(a1);
627  double B2 = p2/TMath::Abs(a2) - TMath::Abs(a2);
628 
629  double result(N);
630  if (u<-a1) result *= A1*TMath::Power(B1-u,-p1);
631  else if (u<a2) result *= TMath::Exp(-u*u/2);
632  else result *= A2*TMath::Power(B2+u,-p2);
633  return result;
634 }
635 
636 double FitSpectra::DinoFct(double*xx,double*pp)
637 {
638  double x = xx[0];
639  // gaussian core
640  double A = pp[0];//norm
641  double P = pp[1];//mean
642  double sigma = pp[2];//variance
643  // transition parameters
644  double lambda = pp[3];
645  double rho = pp[4];
646  double S = pp[5];
647 
648  double u = (x-P)/sigma;
649 
650  double f_g = A*TMath::Exp(-u*u*0.5);
651 
652  double f_lambda = A*TMath::Exp(-0.5*lambda*(2.*u-lambda));
653 
654  double f_rho = A*TMath::Exp(-0.5*rho*(2.*u-rho));
655 
656  double f_S = A*S*1./((1+TMath::Exp(u))*(1+TMath::Exp(u)));
657 
658  double f_tot = 0.;
659 
660  if(u<lambda) f_tot += f_lambda;
661  else if(u>rho) f_tot += f_rho;
662  else f_tot += f_g;
663 
664  f_tot += f_S;
665 
666  return f_tot;
667 }
668 
669 double FitSpectra::MyGaus(double *xx, double *par)
670 {
671  double x = xx[0];
672  double N = par[0];
673  double mean = par[1];
674  double sigma = par[2];
675 
676  double f = N*exp(-0.5*((x-mean)/sigma)*((x-mean)/sigma));
677 
678  return f;
679 }
680 
681 double FitSpectra::BGPlusGaus(double *xx, double *par)
682 {
683  double x = xx[0];
684 
685  double f = BackGroundHist->GetBinContent(BackGroundHist->FindBin(x));
686 
687  for(int i=0 ; i<fNFound ; i++)
688  {
689  double *p = new double[3];
690 
691  p[0] = par[3*i+0];
692  p[1] = par[3*i+1];
693  p[2] = par[3*i+2];
694 
695  f += MyGaus(xx,p);
696  delete p;
697  }
698 
699  return f;
700 }
701 
702 double FitSpectra::BGPlusCBDS(double *xx, double *par)
703 {
704  double x = xx[0];
705 
706  double f = BackGroundHist->GetBinContent(BackGroundHist->FindBin(x));
707 
708  for(int i=0 ; i<fNFound ; i++)
709  {
710  const int size = 7;
711 
712  double *p = new double[size];
713 
714  p[0] = par[size*i+0];
715  p[1] = par[size*i+1];
716  p[2] = par[size*i+2];
717  p[3] = par[size*i+3];
718  p[4] = par[size*i+4];
719  p[5] = par[size*i+5];
720  p[6] = par[size*i+6];
721 
722  f += fnc_dscb(xx,p);
723  delete p;
724  }
725 
726  return f;
727 }
728 
729 double FitSpectra::BGPlusDinoFct(double *xx, double *par)
730 {
731  double x = xx[0];
732 
733  double f = BackGroundHist->GetBinContent(BackGroundHist->FindBin(x));
734 
735  for(int i=0 ; i<fNFound ; i++)
736  {
737  const int size = 6;
738 
739  double *p = new double[size];
740 
741  p[0] = par[size*i+0];
742  p[1] = par[size*i+1];
743  p[2] = par[size*i+2];
744  p[3] = par[size*i+3];
745  p[4] = par[size*i+4];
746  p[5] = par[size*i+5];
747 
748  f += DinoFct(xx,p);
749  delete p;
750  }
751 
752  return f;
753 }
754 
755 void FitSpectra::SetPersoBackground(int NumberIterations, int Direction,int FilterOrder,bool Smoothing,int smoothingWindow,bool Compton)
756 {
757  fDefinePersoBackground = true;
758  fNumberIterations = NumberIterations;
759  fDirection = Direction;
760  fFilterOrder = FilterOrder;
761  fSmoothing = Smoothing;
762  fsmoothingWindow = smoothingWindow;
763  fCompton = Compton;
764 }
765 
767 {
768  double FirstEToKeep = 344.272;
769  int Pos=0;
770  for(int i=0 ; i<fNPeaksToFit ; i++)
771  {
772  if(fEPeaks[i] < FirstEToKeep) Pos = i;
773  }
774 
775  fEPeaks.erase(fEPeaks.begin(),fEPeaks.begin()+Pos+1);
776  fNPeaksToFit = fEPeaks.size();
777 }
void SetHistogram(TH1 *h)
Definition: FitSpectra.cpp:118
double BGPlusCBDS(double *xx, double *par)
Definition: FitSpectra.cpp:702
void SetSource(TString source)
Definition: FitSpectra.cpp:112
FitSpectra(TString type="Dino", TString source="60Co")
Definition: FitSpectra.cpp:20
void Fit()
Definition: FitSpectra.cpp:160
void InitSourceProperties()
Definition: FitSpectra.cpp:62
double BGPlusDinoFct(double *xx, double *par)
Definition: FitSpectra.cpp:729
void ReduceListOfPeak()
Definition: FitSpectra.cpp:766
double MyGaus(double *xx, double *par)
Definition: FitSpectra.cpp:669
double BGPlusGaus(double *xx, double *par)
Definition: FitSpectra.cpp:681
void SetPersoBackground(int NumberIterations=100, int Direction=TSpectrum::kBackDecreasingWindow, int FilterOrder=TSpectrum::kBackOrder8, bool Smoothing=true, int smoothingWindow=TSpectrum::kBackSmoothing3, bool Compton=false)
Definition: FitSpectra.cpp:755
Int_t A[3000]
double fnc_dscb(double *xx, double *pp)
Definition: FitSpectra.cpp:610
void GetCurrentHistogram()
Definition: FitSpectra.cpp:132
void Calib()
Definition: FitSpectra.cpp:577
const Int_t size
Definition: BenchIO.C:24
double DinoFct(double *xx, double *pp)
Definition: FitSpectra.cpp:636