151 B2INFO(
"\t Performing the hadron saturation fit...");
154 TFitter* minimizer =
new TFitter(5);
157 minimizer->SetParameter(0,
"alpha",
m_alpha, gRandom->Rndm() * 0.001, -5.0, 5.0);
158 minimizer->SetParameter(1,
"gamma",
m_gamma, gRandom->Rndm() * 0.001, -5.0, 5.0);
159 minimizer->SetParameter(2,
"delta",
m_delta, gRandom->Rndm() * 0.001, 0, 0.50);
160 minimizer->SetParameter(3,
"power",
m_power, gRandom->Rndm() * 0.01, 0.05, 2.5);
161 minimizer->SetParameter(4,
"ratio",
m_ratio, gRandom->Rndm() * 0.01, 0.5, 2);
162 minimizer->FixParameter(2);
163 minimizer->FixParameter(4);
169 minimizer->ExecuteCommand(
"SET START", &strategy, 1);
172 minimizer->ExecuteCommand(
"SET ERR", &up, 1);
176 minimizer->ExecuteCommand(
"SET PRINT", arg, 1);
178 double eps_machine(std::numeric_limits<double>::epsilon());
179 minimizer->ExecuteCommand(
"SET EPS", &eps_machine, 1);
181 double fitpar[5], fiterr[5];
183 for (
int i = 0; i < 30; ++i) {
185 minimizer->SetParameter(0,
"alpha",
m_alpha, gRandom->Rndm() * 0.001, -5.0, 5.0);
186 minimizer->SetParameter(1,
"gamma",
m_gamma, gRandom->Rndm() * 0.001, -5.0, 5.0);
187 minimizer->SetParameter(2,
"delta",
m_delta, gRandom->Rndm() * 0.001, 0, 0.50);
188 minimizer->SetParameter(3,
"power",
m_power, gRandom->Rndm() * 0.01, 0.05, 2.5);
189 minimizer->SetParameter(4,
"ratio",
m_ratio, gRandom->Rndm() * 0.01, 0.5, 2);
190 minimizer->FixParameter(2);
191 minimizer->FixParameter(4);
193 double maxcalls(5000.), tolerance(0.1);
194 double arglist[] = {maxcalls, tolerance};
195 unsigned int nargs(2);
196 minimizer->ExecuteCommand(
"MIGRAD", arglist, nargs);
197 minimizer->ExecuteCommand(
"MIGRAD", arglist, nargs);
198 int status = minimizer->ExecuteCommand(
"HESSE", arglist, nargs);
200 minimizer->PrintResults(1, 0);
201 B2INFO(
"\t iter = " << i <<
": Fit status: " << status);
204 while (status != 0 && counter < 5) {
205 minimizer->SetParameter(0,
"alpha",
m_alpha, gRandom->Rndm() * 0.001, -5.0, 5.0);
206 minimizer->SetParameter(1,
"gamma",
m_gamma, gRandom->Rndm() * 0.001, -5.0, 5.0);
207 minimizer->SetParameter(2,
"delta",
m_delta, gRandom->Rndm() * 0.001, 0, 0.50);
208 minimizer->SetParameter(3,
"power",
m_power, gRandom->Rndm() * 0.01, 0.05, 2.5);
209 minimizer->SetParameter(4,
"ratio",
m_ratio, gRandom->Rndm() * 0.01, 0.5, 2);
210 minimizer->FixParameter(2);
212 minimizer->FixParameter(4);
214 minimizer->ExecuteCommand(
"MIGRAD", arglist, nargs);
215 status = minimizer->ExecuteCommand(
"HESSE", arglist, nargs);
216 B2INFO(
"\t re-Fit iter: " << counter <<
", status code: " << status);
220 B2INFO(
"\t HadronSaturation::ERROR - BAD FIT!");
225 for (
int par = 0; par < 5; ++par) {
226 fitpar[par] = minimizer->GetParameter(par);
227 fiterr[par] = minimizer->GetParError(par);
230 B2INFO(
"\t Final Result: HadronSaturation: fit results");
231 B2INFO(
"\t alpha (" <<
m_alpha <<
"): " << fitpar[0] <<
" +- " << fiterr[0]);
232 B2INFO(
"\t gamma (" <<
m_gamma <<
"): " << fitpar[1] <<
" +- " << fiterr[1]);
233 B2INFO(
"\t delta (" <<
m_delta <<
"): " << fitpar[2] <<
" +- " << fiterr[2]);
234 B2INFO(
"\t power (" <<
m_power <<
"): " << fitpar[3] <<
" +- " << fiterr[3]);
235 B2INFO(
"\t ratio (" <<
m_ratio <<
"): " << fitpar[4] <<
" +- " << fiterr[4]);
239 double chi2, edm, errdef;
241 minimizer->GetStats(chi2, edm, errdef, nvpar, nparx);
242 B2INFO(
"\t\t Fit chi^2: " << chi2);
244 std::ofstream parfile;
245 parfile.open(
"sat-pars.fit.txt");
247 parfile << fitpar[0] << std::endl;
248 parfile << fitpar[1] << std::endl;
249 parfile << fitpar[2] << std::endl;
250 parfile << fitpar[3] << std::endl;
251 parfile << fitpar[4] << std::endl;