110{
113
115 int numberOfEvents;
119
120 try {
121
122 JParser<> zap(
"Program to test JGandalf algorithm.");
123
129
130 zap(argc, argv);
131 }
132 catch(const exception& error) {
133 FATAL(error.what() << endl);
134 }
135
136 using namespace JFIT;
137
138 ASSERT(numberOfEvents > 0);
139
141
142 TF1 fs("fs", "exp(-0.5 * (x-[0])*(x-[0]) / ([1]*[1]))");
143 TF1 fb("fb", "1.0");
144
145 fs.FixParameter(0,
gauss[0]);
146 fs.FixParameter(1,
gauss[1]);
147
148 const Int_t nx = 21;
149 const Double_t
xmin = -5.0;
150 const Double_t
xmax = +5.0;
151
156
157 TH1D
H[] = { TH1D(
"ha",
"", 101, -0.1, +0.1),
158 TH1D("hb", "", 101, -0.1, +0.1),
159 TH1D("hc", "", 101, -100.0, +100.0),
160 TH1D("hd", "", 101, -100.0, +100.0) };
161
163
164 for (int i = 0; i != numberOfEvents; ++i) {
165
166 STATUS(
"event: " << setw(10) << i <<
'\r');
DEBUG(endl);
167
168 TH1D h0("h0", NULL, nx, xmin, xmax);
169
170 h0.Sumw2();
171
172 h0.FillRandom(
"fs", (Int_t)
gauss[2]);
173 h0.FillRandom(
"fb", (Int_t)
gauss[3]);
174
176
177 for (Int_t i = 1; i <= h0.GetNbinsX(); ++i) {
178 data.push_back(JElement_t(h0.GetBinCenter (i),
179 h0.GetBinContent(i)));
180 }
181
183
184 fit.parameters.resize(4);
185
186 for (size_t i = 0; i != 4; ++i) {
187 fit.parameters[i] = i;
188 }
189
190 fit.value =
JGauss(h0.GetMean(),
191 h0.GetRMS(),
192 h0.GetEntries() * (xmax - xmin) / nx - h0.GetMinimum(),
193 h0.GetMinimum());
194
195 DEBUG(
"Start value " << fit.value << endl);
196
198
199 const double chi2 = fit(
g1,
data.begin(),
data.end());
200
202
203 DEBUG(
"Final value " << fit.value << endl);
204 DEBUG(
"Chi2 " << chi2 << endl);
205
206 const double Y[] = { fit.value[0] -
gauss[0],
207 fit.value[1] -
gauss[1],
209 fit.value[3] * nx -
gauss[3] };
210
211 for (int i = 0; i != sizeof(Q)/sizeof(Q[0]); ++i) {
214 }
215 }
216
217 for (int i = 0; i != sizeof(Q)/sizeof(Q[0]); ++i) {
219 }
220
223 }
224
226
228
229 for (
int i = 0; i !=
sizeof(
H)/
sizeof(
H[0]); ++i) {
231 }
232
233 out.Write();
234 out.Close();
235 }
236
237 for (int i = 0; i != sizeof(Q)/sizeof(Q[0]); ++i) {
239 }
240
241 ASSERT(Q[0].getSTDev() < precision[0]);
242 ASSERT(Q[1].getSTDev() < precision[1]);
243 ASSERT(Q[2].getSTDev() < precision[2]);
244 ASSERT(Q[3].getSTDev() < precision[3]);
245
246 return 0;
247}
double getMean(vector< double > &v)
get mean of vector content
std::ostream & longprint(std::ostream &out)
Set long printing.
std::ostream & shortprint(std::ostream &out)
Set short printing.
#define DEBUG(A)
Message macros.
#define ASSERT(A,...)
Assert macro.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Double_t g1(const Double_t x)
Function.
Place holder for custom implementation.
Auxiliary class for CPU timing and usage.
void print(std::ostream &out, const JScale_t scale=milli_t) const
Print timer data.
Utility class to parse command line options.
Auxiliary classes and methods for linear and iterative data regression.
double gauss(const double x, const double sigma)
Gauss function (normalised to 1 at x = 0).
static const double H
Planck constant [eV s].
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).