10 double sigma =
FWHM/2.3548;
11 double start =
mean - (double)Limit*sigma;
12 double stop =
mean + (double)Limit*sigma;
15 for (
int i=0; i<nSamples; ++i) {
16 double Bhf = start + (double)i*(stop-start)/(double)(nSamples-1.0);
18 RelAmps.push_back(exp(-0.5*pow(((Bhf-
mean)/sigma), 2)));
25 for (
int i=0; i<RelAmps.size(); ++i) {
28 for (
int i=0; i<RelAmps.size(); ++i) {
29 RelAmps[i] = RelAmps[i]/total;
35 for (
int i=0; i<nSamples; ++i) {
37 ratio += a*RelAmps[i]*sin(-2*Bhf*0.04789*gfac*(x-off));
47 TF1* func =
new TF1(
"GaussianRatio", *
this,
Low,
High, 3);
48 func->SetParameter(0,
amp);
49 func->SetParameter(1,
g);
50 func->SetParameter(2,
offset);
61 static void minuit(
int &npar,
double *gin,
double &f,
double *par,
int iflag) {
79 func->SetParameter(0, par[0]);
80 func->SetParameter(1, par[1]);
81 func->SetParameter(2, par[4]);
83 f = p->Hist->Chisquare(func,
"R");
85 if (!(p->FixedField)) {
delete func; }
96 auto gMinuit =
new TMinuit(npars);
98 gMinuit->Command(
"SET PRINT -1");
108 gMinuit->SetFCN(func.
minuit);
114 gMinuit->mnexcm(
"SET ERR", arglist, 1, ierflg);
116 gMinuit->mnexcm(
"SET STR", arglist, 1, ierflg);
120 std::vector<std::string> parnames = {
"Amp",
"g",
"mean",
"FWHM",
"offset"};
121 std::vector<double> pars =
GetPars();
122 for (
int i=0; i<5; ++i) {
123 double min = ParLimsLow[i];
124 double max = ParLimsHigh[i];
125 std::cout << i <<
" " << min <<
" " << max <<
" " << pars[i] << std::endl;
126 gMinuit->mnparm(parnum, parnames[i].c_str(), pars[i], ParErrs[i], min, max, ierflg);
130 for (
int i=0; i<5; ++i) {
132 gMinuit->FixParameter(i);
138 gMinuit->mnexcm(
"MIGRAD", arglist, 2, ierflg);
140 gMinuit->mnexcm(
"HESSE", arglist, 2, ierflg);
141 gMinuit->mnexcm(
"MINOS", arglist, 2, ierflg);
145 for (
int i=0; i<5; ++i) {
146 double parVal, parErr;
147 gMinuit->GetParameter(i, parVal, parErr);
148 ParVals.push_back(parVal);
149 ParErrs.push_back(parErr);
158 double sigma =
FWHM/2.3548;
159 double start =
mean - (double)Limit*sigma;
160 double stop =
mean + (double)Limit*sigma;
163 for (
int i=0; i<nSamples; ++i) {
164 double Bhf = start + (double)i*(stop-start)/(double)(nSamples-1.0);
166 RelAmps.push_back(exp(-0.5*pow(((Bhf-
mean)/sigma), 2)));
173 for (
int i=0; i<RelAmps.size(); ++i) {
176 for (
int i=0; i<RelAmps.size(); ++i) {
177 RelAmps[i] = RelAmps[i]/total;
183 for (
int i=0; i<nSamples; ++i) {
184 double Bhf = Bhfs[i];
185 double intensity1 = n/t1*exp(-(x-off)/t1)*(1+a1*sin(-2*(x-off)*0.04789*Bhf*gfac1)) +
186 1.0/t2*exp(-(x-off)/t2)*(1+a2*sin(-2*(x-off)*0.04789*Bhf*gfac2));
188 double intensity2 = n/t1*exp(-(x-off)/t1)*(1+a1*sin(2*(x-off)*0.04789*Bhf*gfac1)) +
189 1.0/t2*exp(-(x-off)/t2)*(1+a2*sin(2*(x-off)*0.04789*Bhf*gfac2));
192 if (intensity1 == 0 && intensity2 == 0) {
continue; }
194 r = ((intensity1-intensity2)/(intensity1 + intensity2));
196 ratio += RelAmps[i]*r;
202 return RatioFunc(x[0], p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
206 TF1* func =
new TF1(
"DoubleGaussianRatio", *
this,
Low,
High, 8);
207 func->SetParameter(0,
amp1);
208 func->SetParameter(1,
amp2);
209 func->SetParameter(2,
g1);
210 func->SetParameter(3,
g2);
211 func->SetParameter(4,
tau1);
212 func->SetParameter(5,
tau2);
213 func->SetParameter(6,
n1n2);
214 func->SetParameter(7,
offset);
225 static void minuit(
int &npar,
double *gin,
double &f,
double *par,
int iflag) {
237 p->SetOffset(par[9]);
247 func->SetParameter(0, par[0]);
248 func->SetParameter(1, par[1]);
249 func->SetParameter(2, par[2]);
250 func->SetParameter(3, par[3]);
251 func->SetParameter(4, par[4]);
252 func->SetParameter(5, par[5]);
253 func->SetParameter(6, par[6]);
254 func->SetParameter(7, par[9]);
256 f = p->Hist->Chisquare(func,
"R");
258 if (!(p->FixedField)) {
delete func; }
268 auto gMinuit =
new TMinuit(npars);
270 gMinuit->Command(
"SET PRINT -1");
280 gMinuit->SetFCN(func.
minuit);
287 gMinuit->mnexcm(
"SET ERR", arglist, 1, ierflg);
289 gMinuit->mnexcm(
"SET STR", arglist, 1, ierflg);
293 std::vector<std::string> parnames = {
"Amp1",
"Amp2",
"g1",
"g2",
"Tau1",
"Tau2",
"N1N2",
"mean",
"FWHM",
"offset"};
294 std::vector<double> pars =
GetPars();
295 for (
int i=0; i<10; ++i) {
296 double min = ParLimsLow[i];
297 double max = ParLimsHigh[i];
298 gMinuit->mnparm(parnum, parnames[i].c_str(), pars[i], ParErrs[i], min, max, ierflg);
302 for (
int i=0; i<10; ++i) {
304 gMinuit->FixParameter(i);
310 gMinuit->mnexcm(
"MINIGRAD", arglist, 2, ierflg);
317 for (
int i=0; i<10; ++i) {
318 double parVal, parErr;
319 gMinuit->GetParameter(i, parVal, parErr);
320 ParVals.push_back(parVal);
321 ParErrs.push_back(parErr);
static void minuit(int &npar, double *gin, double &f, double *par, int iflag)
GlobalChiSquare(DoubleGaussianDistr *parent)
double operator()(double *x, double *p)
std::vector< double > GetPars()
DoubleGaussianDistr(double L, double H, std::vector< double > pars)
double RatioFunc(double x, double a1, double a2, double gfac1, double gfac2, double t1, double t2, double n, double off)
static void minuit(int &npar, double *gin, double &f, double *par, int iflag)
GlobalChiSquare(GaussianDistr *parent)
double RatioFunc(double x, double a, double gfac, double off)
std::vector< double > GetPars()
GaussianDistr(double L, double H, std::vector< double > pars)
double operator()(double *x, double *p)