32{
35
36 const char* const count_t = "count";
37 const char* const value_t = "value";
38
39 struct {
40 double signal = 100;
41 double background = 5;
42 double center = 0.0;
43 double sigma = 1.0;
44 } parameters;
45
46 string inputFile;
50 size_t N;
51 string option;
52 bool writeFits;
53 ULong_t seed;
55
56 try {
57
59
64
65 JParser<> zap(
"Program to test JRootfit algorithm.");
66
73 zap[
'O'] =
make_field(option) = count_t, value_t;
77
78 zap(argc, argv);
79 }
80 catch(const exception& error) {
81 FATAL(error.what() << endl);
82 }
83
84
85 gRandom->SetSeed(seed);
86
88
89 const size_t nx = 20 *
ls;
90 const double xmin = -5.0 *
ls;
91 const double xmax = +5.0 *
ls;
92
93 const size_t ny = 20 *
ls;
94 const double ymin = -5.0 *
ls;
95 const double ymax = +5.0 *
ls;
96
97 TH2D* h2 = NULL;
98
99 if (inputFile == "") {
100
101 h2 = new TH2D("h2", NULL, nx, xmin, xmax, ny, ymin, ymax);
102
103 h2->Sumw2();
104
105 auto f2 = (
JGauss2X<1>(parameters.center, parameters.sigma) *
107 JP0<1>(parameters.signal) +
108 JP0<2>(parameters.background));
109
110 if (N == 0)
112 else
114
115 } else {
116
117 TFile* in = TFile::Open(inputFile.c_str(), "exist");
118
119 in->GetObject("h2", h2);
120 }
121
122
123
124
125 const double x0 = h2->GetMean(1);
126 const double y0 = h2->GetMean(2);
127 const double xs = h2->GetStdDev(1) * 0.33;
128 const double ys = h2->GetStdDev(2) * 0.33;
129 const double signal = h2->GetMaximum();
130 const double background = h2->GetMinimum() + 0.10;
131
132
133
137
138
139
140 typedef decltype(f2) function_type;
141
143
144 for (size_t i = 0; i != getNumberOfParameters<function_type>(); ++i) {
145 cout << setw(2) << i <<
' ' <<
FIXED(15,9) << f2[i] << endl;
146 }
147
148 {
149 const chrono::steady_clock::time_point t0 = chrono::steady_clock::now();
150
151 const auto result = (option == count_t ?
152 (writeFits ? Fit<m_count>(h2, f2, {}, X, Y) :
Fit<
m_count>(*h2, f2, {}, X, Y)) :
154
155 const chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
156
157 cout <<
"chi2/NDF " <<
FIXED(7,3) <<
result.getChi2() <<
"/" <<
result.getNDF() << endl;
158 cout <<
"Number of iterations " <<
result.numberOfIterations << endl;
159 cout << "Elapsed time [us] " << setw(8) << chrono::duration_cast<chrono::microseconds>(t1 - t0).count() << endl;
160
161 for (
size_t i = 0; i !=
result.getNumberOfParameters(); ++i) {
162 cout << setw(2) << i << ' '
165 }
166 }
167 {
169
170 for (Int_t ix = 1; ix <= h2->GetXaxis()->GetNbins(); ++ix) {
171 for (Int_t iy = 1; iy <= h2->GetYaxis()->GetNbins(); ++iy) {
172
173 const double x = h2->GetXaxis()->GetBinCenter(ix);
174 const double y = h2->GetYaxis()->GetBinCenter(iy);
175 const double value = h2->GetBinContent(ix, iy);
176 const double error = h2->GetBinError (ix, iy);
177
178 gs.
put(x, y, value, 0.0, 0.0, error);
179 }
180 }
181
183
184 const auto result =
Fit(g2, f2, {}, X, Y);
185
186 cout <<
"chi2/NDF " <<
FIXED(7,3) <<
result.getChi2() <<
"/" <<
result.getNDF() << endl;
187 cout <<
"Number of iterations " <<
result.numberOfIterations << endl;
188
189 for (
size_t i = 0; i !=
result.getNumberOfParameters(); ++i) {
190 cout << setw(2) << i << ' '
193 }
194 }
195
197
198 out << *h2;
199
200 out.Write();
201 out.Close();
202}
#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.
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.
Make 2D function of x from 1D function.
Make 2D function of y from 1D function.
Termination class for polynomial function.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Data structure for graph data.
void put(const Double_t x, const Double_t y, const Double_t z, const Double_t ex, const Double_t ey, const Double_t ez)
Put data.
Auxiliary data structure to build TGraph2DErrors.
Data point for counting measurement.
Data point for value with error.
Auxiliary data structure to list files in directory.