31{
   34 
   35  const char* const count_t = "count";
   36  const char* const value_t = "value";
   37 
   38  struct {
   39    double signal     = 25;
   40    double background =  5;
   41    double center     = 0.0;
   42    double sigma      = 1.0;
   43  } parameters;
   44 
   45  string     inputFile;
   48  size_t     N;
   49  string     option;
   50  bool       writeFits;
   51  ULong_t    seed;
   53 
   54  try { 
   55 
   57 
   62    
   63    JParser<> zap(
"Program to test JRootfit algorithm.");
 
   64 
   70    zap[
'O'] = 
make_field(option)              = count_t, value_t;
 
   74    
   75    zap(argc, argv);
   76  }
   77  catch(const exception& error) {
   78    FATAL(error.what() << endl);
 
   79  }
   80 
   81 
   82  gRandom->SetSeed(seed);
   83 
   84  const size_t nx   = 20;
   85  const double xmin = parameters.center  -  5.0 * parameters.sigma;
   86  const double xmax = parameters.center  +  5.0 * parameters.sigma;
   87 
   88  TH1D* h1 = NULL;
   89 
   90  if (inputFile == "") {
   91 
   92    h1 = new TH1D("h1", NULL, nx, xmin, xmax);
   93 
   94    h1->Sumw2();
   95 
   96    auto f0 = 
JP0<1>(parameters.signal) * JGauss<1>(parameters.center, parameters.sigma)  +  
JP0<2>(parameters.background);
 
   97 
   98    if (N == 0)
  100    else
  102 
  103  } else {
  104 
  105    TFile* in = TFile::Open(inputFile.c_str(), "exist");
  106 
  107    in->GetObject("h1", h1);
  108  }
  109 
  110 
  111  
  112 
  113  const double center     = h1->GetMean();
  114  const double sigma      = h1->GetStdDev()  * 0.66;
  115  const double signal     = h1->GetMaximum();
  116  const double background = h1->GetMinimum() + 0.10;
  117 
  118 
  119  
  120 
  121  auto f1 = 
JP0<1>(signal) * JGauss<1>(center, sigma)  +  
Exp(
JP0<2>(log(background)));
 
  122 
  123  typedef decltype(f1)  function_type;
  124 
  126 
  127  for (size_t i = 0; i != getNumberOfParameters<function_type>(); ++i) {
  128    cout << setw(2)     << i                   << ' ' 
  129         << 
FIXED(15,9) << getParameter(f1, i) << endl;
 
  130  }
  131 
  132  {
  133    const chrono::steady_clock::time_point t0 = chrono::steady_clock::now();
  134 
  135    const auto result = (option == count_t ?
 
  136                         (writeFits ? Fit<m_count>(h1, f1, {}, X) : 
Fit<
m_count>(*h1, f1, {}, X)) :
 
  138 
  139    const chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
  140 
  141    cout << 
"chi2/NDF " << 
FIXED(7,3) << 
result.getChi2() << 
"/" << 
result.getNDF() << endl;
 
  142    cout << 
"Number of iterations " << 
result.numberOfIterations << endl;
 
  143    cout << "Elapsed time [us] " << setw(8) << chrono::duration_cast<chrono::microseconds>(t1 - t0).count() << endl;
  144 
  145    for (
size_t i = 0; i != 
result.getNumberOfParameters(); ++i) {
 
  146      cout << setw(2)     << i                  << ' ' 
  149    }
  150  }
  151  
  152 
  154 
  155  out << *h1;
  156 
  157  out.Write();
  158  out.Close();
  159}
#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.
 
Termination class for polynomial function.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Data point for counting measurement.
 
Data point for value with error.