30int main(
int argc,
char **argv)
35 const char*
const count_t =
"count";
36 const char*
const value_t =
"value";
40 double background = 5;
63 JParser<> zap(
"Program to test JRootfit algorithm.");
70 zap[
'O'] =
make_field(option) = count_t, value_t;
77 catch(
const exception& error) {
78 FATAL(error.what() << endl);
82 gRandom->SetSeed(seed);
85 const double xmin = parameters.center - 5.0 * parameters.sigma;
86 const double xmax = parameters.center + 5.0 * parameters.sigma;
90 if (inputFile ==
"") {
92 h1 =
new TH1D(
"h1", NULL, nx, xmin, xmax);
96 auto f0 =
JP0<1>(parameters.signal) * JGauss<1>(parameters.center, parameters.sigma) +
JP0<2>(parameters.background);
101 FillRandom(h1, f0, N);
105 TFile* in = TFile::Open(inputFile.c_str(),
"exist");
107 in->GetObject(
"h1", h1);
113 const double center = h1->GetMean();
114 const double sigma = h1->GetStdDev() * 0.66;
115 const double signal = h1->GetMaximum();
116 const double background = h1->GetMinimum() + 0.10;
121 auto f1 =
JP0<1>(signal) * JGauss<1>(center, sigma) + Exp(
JP0<2>(log(background)));
123 typedef decltype(f1) function_type;
127 for (
size_t i = 0; i != getNumberOfParameters<function_type>(); ++i) {
128 cout << setw(2) << i <<
' '
129 <<
FIXED(15,9) << getParameter(f1, i) << endl;
133 const chrono::steady_clock::time_point t0 = chrono::steady_clock::now();
135 const auto result = (option == count_t ?
136 (writeFits ? Fit<m_count>(h1, f1, {}, X) : Fit<m_count>(*h1, f1, {}, X)) :
137 (writeFits ? Fit<m_value>(h1, f1, {}, X) : Fit<m_value>(*h1, f1, {}, X)));
139 const chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
141 cout <<
"chi2/NDF " <<
FIXED(7,3) << result.getChi2() <<
"/" << result.getNDF() << endl;
142 cout <<
"Number of iterations " << result.numberOfIterations << endl;
143 cout <<
"Elapsed time [us] " << setw(8) << chrono::duration_cast<chrono::microseconds>(t1 - t0).count() << endl;
145 for (
size_t i = 0; i != result.getNumberOfParameters(); ++i) {
146 cout << setw(2) << i <<
' '
147 <<
FIXED(15,9) << result.getValue(i) <<
" +/- "
148 <<
FIXED(15,9) << result.getError(i) << endl;