161{
  164 
  166 
  168  int         numberOfEvents;
  170  ULong_t     seed;
  172 
  173  try {
  174 
  175    JParser<> zap(
"Program to test JSimplex algorithm.");
 
  176 
  182 
  183    zap(argc, argv);
  184  }
  185  catch(const exception& error) {
  186    FATAL(error.what() << endl);
 
  187  }
  188 
  189 
  190  gRandom->SetSeed(seed);
  191 
  192 
  193  const double top   = parameters[0];
  194  const double sigma = parameters[1];
 
  195 
  197  
  199 
  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);
 
  203  }
  204 
  206 
  207 
  209 
  212 
  213  double (*fit)(const model_type&, const hit_type&) = likelihood;  
  214 
  215 
  217 
  218  TH1D h0("chi2/NDF", NULL, 200, 0.0, 10.0);
  219 
  220  H1.push_back(
new TH1D(
MAKE_CSTRING(
"p" << 0), NULL, 101, -20.0, +20.0));
 
  221 
  222  for (
size_t i =1; i != 
model.size(); ++i) {
 
  223    H1.push_back(
new TH1D(
MAKE_CSTRING(
"p" << i), NULL, 101, -0.1, +0.1));
 
  224  }
  225 
  226 
  227  for (int counter = 0; counter != numberOfEvents; ++counter) {
  228 
  229    STATUS(
"event: " << setw(10) << counter << 
'\r'); 
DEBUG(endl);
 
  230 
  231 
  232    
  233    
  235 
  237 
  239 
  240      const double value = gRandom->Poisson(
model(
p1));
 
  241      const double sigma = (value > 1.0 ? sqrt(value) : 0.7);
 
  242 
  243      data.push_back(hit_type(
p1, value, sigma));         
 
  244    }
  245 
  246 
  247    
  248 
  250 
  251    double value = 0.0;
  252 
  253    for (const auto& hit : data) {
  254 
  255      for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
  256        Q[i].
put(hit[i], hit.value);
 
  257      }
  258 
  259      if (hit.value > value) {
  260 
  261        simplex.
value[0] = hit.value;
 
  262 
  263        for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
  264          simplex.
value[2*i + 1] = hit[i];
 
  265        }
  266 
  267        value = hit.value;
  268      }
  269    }
  270 
  271    for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
  273    }
  274 
  275 
  276    
  277 
  278    simplex.
step.resize(2*NUMBER_OF_DIMENSIONS + 1);
 
  279 
  280    model_type step;
  281 
  282    simplex.
step[0]    = model_type();
 
  283    simplex.
step[0][0] = 1.0;
 
  284 
  285    for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
  286 
  287      simplex.
step[2*i + 1]          = model_type();
 
  288      simplex.
step[2*i + 1][2*i + 1] = 0.1;
 
  289 
  290      simplex.
step[2*i + 2]          = model_type();
 
  291      simplex.
step[2*i + 2][2*i + 2] = 0.1;
 
  292    }
  293 
  294    DEBUG(
"start values " << simplex.
value << endl);
 
  295 
  296    for (
size_t i = 0; i != simplex.
step.size(); ++i) {
 
  297      DEBUG(
"step: " << setw(2) << i << 
' ' << simplex.
step[i] << endl);
 
  298    }
  299 
  300 
  301    
  302 
  303    const double chi2 = simplex(fit, 
data.begin(), 
data.end());
 
  304    const int    ndf  = 
data.size()  -  simplex.
step.size();
 
  305 
  306 
  307    h0.Fill(chi2 / ndf);
  308 
  309    for (
size_t i = 0; i != 
model.size(); ++i) {
 
  310      H1[i]->Fill(model[i] - simplex.
value[i]);
 
  311    }
  312 
  313    DEBUG(
"chi2 / NDF" << 
FIXED(12,3) << chi2 << 
" / " << ndf << endl);
 
  314 
  315    DEBUG(
"final values " << simplex.
value << endl);
 
  316    DEBUG(
"model values " << model         << endl);
 
  317 
  318    if (
debug >= debug_t) {
 
  319 
  320      for (const auto& hit : data) {
  321 
  322        cout << "hit: ";
  323 
  324        for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
  325          cout << 
FIXED(7,3) << hit[i] << 
' ';
 
  326        }
  327 
  328        const double value = simplex.
value(hit);
 
  329 
  330        cout << 
FIXED(7,3) << hit.value << 
' ' 
  331             << 
FIXED(7,3) << value  << 
' ' 
  332             << 
FIXED(7,3) << (hit.value - value) / hit.sigma << endl;
 
  333      }
  334    }
  335 
  336  }
  338  
  339 
  341 
  343 
  344    out << h0;
  345 
  346    for (size_t i = 0; i != sizeof(H1)/sizeof(H1[0]); ++i) {
  347      out << *(H1[i]);
  348    }
  349 
  350    out.Write();
  351    out.Close();
  352  }
  353}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
#define MAKE_CSTRING(A)
Make C-string.
 
Double_t g1(const Double_t x)
Function.
 
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++,...
 
std::vector< JModel_t > step
 
Utility class to parse command line options.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Auxiliary data structure for floating point format specification.
 
Auxiliary data structure for return type of make methods.