31{
34
35 const char* const count_t = "count";
36 const char* const value_t = "value";
37
38 struct {
39 double signal = 25;
40 double background = 5;
41 double center = 0.0;
43 } parameters;
44
45 string inputFile;
48 size_t N;
49 string option;
50 bool writeFits;
51 ULong_t seed;
53
54 try {
55
57
62
63 JParser<> zap(
"Program to test JRootfit algorithm.");
64
70 zap[
'O'] =
make_field(option) = count_t, value_t;
74
75 zap(argc, argv);
76 }
77 catch(const exception& error) {
78 FATAL(error.what() << endl);
79 }
80
81
82 gRandom->SetSeed(seed);
83
84 const size_t nx = 20;
85 const double xmin = parameters.center - 5.0 * parameters.sigma;
86 const double xmax = parameters.center + 5.0 * parameters.sigma;
87
88 TH1D* h1 = NULL;
89
90 if (inputFile == "") {
91
92 h1 = new TH1D("h1", NULL, nx, xmin, xmax);
93
94 h1->Sumw2();
95
96 auto f0 =
JP0<1>(parameters.signal) * JGauss<1>(parameters.center, parameters.sigma) +
JP0<2>(parameters.background);
97
98 if (N == 0)
100 else
102
103 } else {
104
105 TFile* in = TFile::Open(inputFile.c_str(), "exist");
106
107 in->GetObject("h1", h1);
108 }
109
110
111
112
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;
117
118
119
120
121 auto f1 =
JP0<1>(signal) * JGauss<1>(center, sigma) +
Exp(
JP0<2>(log(background)));
122
123 typedef decltype(
f1) function_type;
124
126
127 for (size_t i = 0; i != getNumberOfParameters<function_type>(); ++i) {
128 cout << setw(2) << i << ' '
129 <<
FIXED(15,9) << getParameter(f1, i) << endl;
130 }
131
132 {
133 const chrono::steady_clock::time_point t0 = chrono::steady_clock::now();
134
135 const auto result = (option == count_t ?
136 (writeFits ? Fit<m_count>(h1, f1, {}, X) :
Fit<
m_count>(*h1,
f1, {}, X)) :
138
139 const chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
140
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;
144
145 for (
size_t i = 0; i !=
result.getNumberOfParameters(); ++i) {
146 cout << setw(2) << i << ' '
149 }
150 }
151
152
154
155 out << *h1;
156
157 out.Write();
158 out.Close();
159}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
Utility class to parse parameter values.
Utility class to parse command line options.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
JExp< JF1_t > Exp(const JF1_t &f1)
Exponent of function.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
void FillRandom(TH1 *h1, const T &f1)
Fill 1D histogram according Poisson statistics with expectation values from given 1D function.
JRootfit_t< JF1_t > Fit(const TH1 &h1, const JF1_t &f1, const index_list &ls=index_list(), const range_type &X=range_type())
Global fit fuction.
Auxiliary data structure for floating point format specification.
Termination class for polynomial function.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Data point for counting measurement.
Data point for value with error.