100 double power,
double ratio)
102 unsigned int nevt =
m_dedx.size();
104 B2ERROR(
"HadronSaturation::myFunction called with no events!");
109 B2ERROR(
"HadronSaturation::myFunction invalid cosbins = " <<
m_cosbins);
115 std::vector<double> vdedxavg;
120 for (
unsigned int i = 0; i < nevt; i++) {
121 double dedxcor = hadsat.
D2I(
124 alpha, gamma, delta, power, ratio);
126 if (!std::isfinite(dedxcor)) {
127 B2WARNING(
"Non-finite dedxcor at event " << i);
140 if (vdedxavg.empty()) {
141 B2ERROR(
"HadronSaturation::myFunction failed to compute averages!");
146 for (
unsigned int i = 0; i < nevt; i++) {
147 double dedxcor = hadsat.
D2I(
150 alpha, gamma, delta, power, ratio);
152 if (!std::isfinite(dedxcor) ||
m_dedxerror[i] <= 0)
continue;
155 if (j >=
int(vdedxavg.size())) {
156 B2WARNING(
"Index " << j <<
" out of range for vdedxavg!");
161 B2INFO(
"\t " << i <<
") " << dedxcor <<
"/" << vdedxavg[j] <<
", error was "
163 ": Final " << chisq);
180 B2ERROR(
"HadronSaturation::fitSaturation - no data to fit!");
184 B2INFO(
"\t Performing the hadron saturation fit...");
187 TFitter* minimizer =
new TFitter(5);
190 auto setPar = [&](
int idx,
const char* name,
double val,
double step,
191 double low,
double high,
bool fix =
false) {
192 minimizer->SetParameter(idx, name, val, step, low, high);
193 if (fix) minimizer->FixParameter(idx);
197 setPar(0,
"alpha",
m_alpha, gRandom->Rndm() * 0.001, -5.0, 5.0);
198 setPar(1,
"gamma",
m_gamma, gRandom->Rndm() * 0.001, -5.0, 5.0);
199 setPar(2,
"delta",
m_delta, gRandom->Rndm() * 0.001, 0, 0.50,
true);
200 setPar(3,
"power",
m_power, gRandom->Rndm() * 0.01, 0.05, 2.5);
201 setPar(4,
"ratio",
m_ratio, gRandom->Rndm() * 0.01, 0.5, 2,
true);
207 minimizer->ExecuteCommand(
"SET START", &strategy, 1);
210 minimizer->ExecuteCommand(
"SET ERR", &up, 1);
214 minimizer->ExecuteCommand(
"SET PRINT", arg, 1);
216 double eps_machine(std::numeric_limits<double>::epsilon());
217 minimizer->ExecuteCommand(
"SET EPS", &eps_machine, 1);
220 double maxcalls(5000.), tolerance(0.1);
221 double arglist[] = {maxcalls, tolerance};
222 unsigned int nargs(2);
224 for (
int i = 0; i < 30; ++i) {
226 minimizer->SetParameter(0,
"alpha",
m_alpha, gRandom->Rndm() * 0.001, -5.0, 5.0);
227 minimizer->SetParameter(1,
"gamma",
m_gamma, gRandom->Rndm() * 0.001, -5.0, 5.0);
228 minimizer->SetParameter(2,
"delta",
m_delta, gRandom->Rndm() * 0.001, 0, 0.50);
229 minimizer->SetParameter(3,
"power",
m_power, gRandom->Rndm() * 0.01, 0.05, 2.5);
230 minimizer->SetParameter(4,
"ratio",
m_ratio, gRandom->Rndm() * 0.01, 0.5, 2);
231 minimizer->FixParameter(2);
232 minimizer->FixParameter(4);
235 minimizer->ExecuteCommand(
"MIGRAD", arglist, nargs);
236 minimizer->ExecuteCommand(
"MIGRAD", arglist, nargs);
237 int status = minimizer->ExecuteCommand(
"HESSE", arglist, nargs);
239 minimizer->PrintResults(1, 0);
240 B2INFO(
"\t iter = " << i <<
": Fit status: " << status);
243 while (status != 0 && counter < 5) {
244 minimizer->SetParameter(0,
"alpha",
m_alpha, gRandom->Rndm() * 0.001, -5.0, 5.0);
245 minimizer->SetParameter(1,
"gamma",
m_gamma, gRandom->Rndm() * 0.001, -5.0, 5.0);
246 minimizer->SetParameter(2,
"delta",
m_delta, gRandom->Rndm() * 0.001, 0, 0.50);
247 minimizer->SetParameter(3,
"power",
m_power, gRandom->Rndm() * 0.01, 0.05, 2.5);
248 minimizer->SetParameter(4,
"ratio",
m_ratio, gRandom->Rndm() * 0.01, 0.5, 2);
249 minimizer->FixParameter(2);
251 minimizer->FixParameter(4);
253 minimizer->ExecuteCommand(
"MIGRAD", arglist, nargs);
254 status = minimizer->ExecuteCommand(
"HESSE", arglist, nargs);
255 B2INFO(
"\t re-Fit iter: " << counter <<
", status code: " << status);
259 B2INFO(
"\t HadronSaturation::ERROR - BAD FIT!");
265 double fitpar[5], fiterr[5];
267 for (
int par = 0; par < 5; ++par) {
268 fitpar[par] = minimizer->GetParameter(par);
269 fiterr[par] = minimizer->GetParError(par);
272 B2INFO(
"\t Final Result: HadronSaturation: fit results");
273 B2INFO(
"\t alpha (" <<
m_alpha <<
"): " << fitpar[0] <<
" +- " << fiterr[0]);
274 B2INFO(
"\t gamma (" <<
m_gamma <<
"): " << fitpar[1] <<
" +- " << fiterr[1]);
275 B2INFO(
"\t delta (" <<
m_delta <<
"): " << fitpar[2] <<
" +- " << fiterr[2]);
276 B2INFO(
"\t power (" <<
m_power <<
"): " << fitpar[3] <<
" +- " << fiterr[3]);
277 B2INFO(
"\t ratio (" <<
m_ratio <<
"): " << fitpar[4] <<
" +- " << fiterr[4]);
281 double chi2, edm, errdef;
283 minimizer->GetStats(chi2, edm, errdef, nvpar, nparx);
284 B2INFO(
"\t\t Fit chi^2: " << chi2);
287 std::ofstream parfile(
"sat-pars.fit.txt");
288 if (parfile.is_open()) {
289 for (
int i = 0; i < 5; ++i) parfile << fitpar[i] << std::endl;
292 B2WARNING(
"Unable to open sat-pars.fit.txt for writing fit parameters");