185 catch(
const exception& error) {
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);
210 JSimplex<model_type> simplex;
212 JSimplex<model_type>::debug =
debug;
213 JSimplex<model_type>::MAXIMUM_ITERATIONS = 10000;
215 double (*fit)(
const model_type&,
const hit_type&) = likelihood;
220 TH1D h0(
"chi2/NDF",
NULL, 200, 0.0, 10.0);
224 for (
size_t i =1; i != model.size(); ++i) {
229 for (
int counter = 0; counter != numberOfEvents; ++counter) {
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) {
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) {
275 simplex.value[2*i + 2] = 1.0 * Q[i].
getSTDev();
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);
321 if (
debug >= debug_t) {
323 for (
const auto&
hit : data) {
327 for (
int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
331 const double value = simplex.value(
hit);
334 <<
FIXED(7,3) << value <<
' '
349 for (
size_t i = 0; i !=
sizeof(
H1)/
sizeof(
H1[0]); ++i) {