175 JParser<> zap(
"Program to test JSimplex algorithm.");
185 catch(
const exception& error) {
186 FATAL(error.what() << endl);
190 gRandom->SetSeed(seed);
193 const double top = parameters[0];
194 const double sigma = parameters[1];
200 for (
int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
201 model[i*2 + 1] = gRandom->Uniform(-sigma, +sigma);
202 model[i*2 + 2] = gRandom->Gaus(sigma, 0.2*sigma);
205 DEBUG(
"model values " << model << endl);
215 double (*fit)(
const model_type&,
const hit_type&) = likelihood;
220 TH1D h0(
"chi2/NDF", NULL, 200, 0.0, 10.0);
222 H1.push_back(
new TH1D(
MAKE_CSTRING(
"p" << 0), NULL, 101, -20.0, +20.0));
224 for (
size_t i =1; i != model.size(); ++i) {
225 H1.push_back(
new TH1D(
MAKE_CSTRING(
"p" << i), NULL, 101, -0.1, +0.1));
229 for (
int counter = 0; counter != numberOfEvents; ++counter) {
231 STATUS(
"event: " << setw(10) << counter <<
'\r');
DEBUG(endl);
242 const double value = gRandom->Poisson(model(
p1));
243 const double sigma = (value > 1.0 ? sqrt(value) : 0.7);
245 data.push_back(hit_type(
p1, value, sigma));
250 JStats Q[NUMBER_OF_DIMENSIONS];
254 for (
const auto& hit : data) {
256 for (
int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
257 if (hit.value > 0.0) {
258 Q[i].
put(hit[i], hit.value);
262 if (hit.value > value) {
264 simplex.
value[0] = hit.value;
266 for (
int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
267 simplex.
value[2*i + 1] = hit[i];
274 for (
int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
281 simplex.
step.resize(2*NUMBER_OF_DIMENSIONS + 1);
285 simplex.
step[0] = model_type();
286 simplex.
step[0][0] = 1.0;
288 for (
int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
290 simplex.
step[2*i + 1] = model_type();
291 simplex.
step[2*i + 1][2*i + 1] = 0.1;
293 simplex.
step[2*i + 2] = model_type();
294 simplex.
step[2*i + 2][2*i + 2] = 0.1;
297 DEBUG(
"start values " << simplex.
value << endl);
299 for (
size_t i = 0; i != simplex.
step.size(); ++i) {
300 DEBUG(
"step: " << setw(2) << i <<
' ' << simplex.
step[i] << endl);
306 const double chi2 = simplex(fit, data.begin(), data.end());
307 const int ndf = data.size() - simplex.
step.size();
312 for (
size_t i = 0; i != model.size(); ++i) {
313 H1[i]->Fill(model[i] - simplex.
value[i]);
316 DEBUG(
"chi2 / NDF" <<
FIXED(12,3) << chi2 <<
" / " << ndf << endl);
318 DEBUG(
"final values " << simplex.
value << endl);
319 DEBUG(
"model values " << model << endl);
321 if (
debug >= debug_t) {
323 for (
const auto& hit : data) {
327 for (
int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
328 cout <<
FIXED(7,3) << hit[i] <<
' ';
331 const double value = simplex.
value(hit);
333 cout <<
FIXED(7,3) << hit.value <<
' '
334 <<
FIXED(7,3) << value <<
' '
335 <<
FIXED(7,3) << (hit.value - value) / hit.sigma << endl;
349 for (
size_t i = 0; i !=
sizeof(H1)/
sizeof(H1[0]); ++i) {