GammaWare  Head Version for release 0.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FitFunctions.cpp
Go to the documentation of this file.
1 #include <iostream>
2 #include <iomanip>
3 #include <fstream>
4 #include <sstream>
5 #include <vector>
6 #include <string>
7 #include <map>
8 
9 #include "FitFunctions.h"
10 
11 using namespace std;
12 
13 
17 //ClassImp(FitFunctions);
18 
19 double FitFunctions::fnc_dscb(double*xx,double*pp)
20 {
21  double x = xx[0];
22  // gaussian core
23  double N = pp[0];//norm
24  double mu = pp[1];//mean
25  double sig = pp[2];//variance
26  // transition parameters
27  double a1 = pp[3];
28  double p1 = pp[4];
29  double a2 = pp[5];
30  double p2 = pp[6];
31 
32  double u = (x-mu)/sig;
33  double A1 = TMath::Power(p1/TMath::Abs(a1),p1)*TMath::Exp(-a1*a1/2);
34  double A2 = TMath::Power(p2/TMath::Abs(a2),p2)*TMath::Exp(-a2*a2/2);
35  double B1 = p1/TMath::Abs(a1) - TMath::Abs(a1);
36  double B2 = p2/TMath::Abs(a2) - TMath::Abs(a2);
37 
38  double result(N);
39  if (u<-a1) result *= A1*TMath::Power(B1-u,-p1);
40  else if (u<a2) result *= TMath::Exp(-u*u/2);
41  else result *= A2*TMath::Power(B2+u,-p2);
42  return result;
43 }
44 
46 
47 double FitFunctions::DinoFct(double*xx,double*pp)
48 {
49  double x = xx[0];
50 
51  int NSubPeaks = (int)pp[0]; //Number of subpeaks in the peak range
52  double BgFrom = pp[1]; //First Channel for the Bg estimation
53  double BgTo = pp[2]; //Last Channel for the Bg estimation
54  double BgdOff = pp[3]; //Bg offset
55  double BgdSlope = pp[4]; //Bg slope
56 
57  double f_tot = 0.;
58 
59  if(x<BgFrom || x>BgTo) return 0.;
60  else
61  {
62  double BGd = BgdSlope*(x-BgFrom) + BgdOff;
63  f_tot += BGd;
64  }
65 
66 // cout<<NSubPeaks<<" "<<BgFrom<<" "<<BgTo<<" "<<BgdOff<<" "<<BgdSlope<<endl;
67  for(int i=0 ; i<NSubPeaks ; i++)
68  {
69  double Ampli = pp[5+i*6+0];
70  double Mean = pp[5+i*6+1];
71  double Sigma = pp[5+i*6+2]*1./sqrt(8.*log(2.));;
72  double Lambda = pp[5+i*6+3];
73  double Rho = pp[5+i*6+4];
74  double S = pp[5+i*6+5];
75 
76 // cout<<Ampli<<" "<<Mean<<" "<<Sigma<<" "<<Lambda<<" "<<Rho<<" "<<S<<endl;
77 
78  double U = (x-Mean)/Sigma;
79  double f_g = Ampli*TMath::Exp(-U*U*0.5);
80  double f_lambda = Ampli*TMath::Exp(-0.5*Lambda*(2.*U-Lambda));
81  double f_rho = Ampli*TMath::Exp(-0.5*Rho*(2.*U-Rho));
82  double f_S = Ampli*S*1./((1+TMath::Exp(U))*(1+TMath::Exp(U)));
83 
84  if(U<Lambda) f_tot += f_lambda;
85  else if(U>Rho) f_tot += f_rho;
86  else f_tot += f_g;
87 
88  f_tot += f_S;
89  }
90 
91  return f_tot;
92 }
93 
95 
96 double FitFunctions::Gaus(double *xx, double *par)
97 {
98  double x = xx[0];
99  double N = par[0];
100  double mean = par[1];
101  double sigma = par[2];
102 
103  double f = N*exp(-0.5*((x-mean)/sigma)*((x-mean)/sigma));
104 
105  return f;
106 }
107 
109 
110 TF1 *FitFunctions::GetDinoFct(TString Name,double min, double max, int Npar)
111 {
112  TF1 *f = new TF1(Name,this,&FitFunctions::DinoFct,min,max,Npar,"FitFunctions","DinoFct");
113 
114  return f;
115 }
double fnc_dscb(double *xx, double *pp)
*/
double Gaus(double *xx, double *par)
******************************************************************************************/// ...
double DinoFct(double *xx, double *pp)
******************************************************************************************/// ...
TF1 * GetDinoFct(TString Name, double min, double max, int Npar)
******************************************************************************************/// ...