Jpp  19.1.0-rc.1
the software that should make you happy
Functions
JRootfitToGauss2D.cc File Reference

Program to test JRootfit algorithm. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <type_traits>
#include <chrono>
#include "TROOT.h"
#include "TFile.h"
#include "TH2D.h"
#include "JROOT/JRootToolkit.hh"
#include "JROOT/JRootTestkit.hh"
#include "JROOT/JRootfit.hh"
#include "JMath/JMathlib2D.hh"
#include "JLang/JManip.hh"
#include "Jeep/JProperties.hh"
#include "Jeep/JParser.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Program to test JRootfit algorithm.

Author
mdejong

Definition in file JRootfitToGauss2D.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 30 of file JRootfitToGauss2D.cc.

31 {
32  using namespace std;
33  using namespace JPP;
34 
35  const char* const count_t = "count";
36  const char* const value_t = "value";
37 
38  struct {
39  double signal = 100;
40  double background = 5;
41  double center = 0.0;
42  double sigma = 1.0;
43  } parameters;
44 
45  string inputFile;
46  string outputFile;
47  range_type X;
48  range_type Y;
49  size_t N;
50  string option;
51  bool writeFits;
52  UInt_t seed;
53  int debug;
54 
55  try {
56 
57  JProperties properties;
58 
59  properties.insert(gmake_property(parameters.signal));
60  properties.insert(gmake_property(parameters.background));
61  properties.insert(gmake_property(parameters.center));
62  properties.insert(gmake_property(parameters.sigma));
63 
64  JParser<> zap("Program to test JRootfit algorithm.");
65 
66  zap['f'] = make_field(inputFile) = "";
67  zap['o'] = make_field(outputFile);
68  zap['@'] = make_field(properties) = JPARSER::initialised();
69  zap['x'] = make_field(X) = range_type();
70  zap['y'] = make_field(Y) = range_type();
71  zap['n'] = make_field(N) = 0;
72  zap['O'] = make_field(option) = count_t, value_t;
73  zap['w'] = make_field(writeFits);
74  zap['S'] = make_field(seed) = 0;
75  zap['d'] = make_field(debug) = 1;
76 
77  zap(argc, argv);
78  }
79  catch(const exception& error) {
80  FATAL(error.what() << endl);
81  }
82 
83 
84  gRandom->SetSeed(seed);
85 
86  const size_t ls = 2;
87 
88  const size_t nx = 20 * ls;
89  const double xmin = -5.0 * ls;
90  const double xmax = +5.0 * ls;
91 
92  const size_t ny = 20 * ls;
93  const double ymin = -5.0 * ls;
94  const double ymax = +5.0 * ls;
95 
96  TH2D* h2 = NULL;
97 
98  if (inputFile == "") {
99 
100  h2 = new TH2D("h2", NULL, nx, xmin, xmax, ny, ymin, ymax);
101 
102  h2->Sumw2();
103 
104  auto f2 = (JGauss2X<1>(parameters.center, parameters.sigma) *
105  JGauss2Y<2>(parameters.center, parameters.sigma) *
106  JP0<1>(parameters.signal) +
107  JP0<2>(parameters.background));
108 
109  if (N == 0)
110  FillRandom(h2, f2);
111  else
112  FillRandom(h2, f2, N);
113 
114  } else {
115 
116  TFile* in = TFile::Open(inputFile.c_str(), "exist");
117 
118  in->GetObject("h2", h2);
119  }
120 
121 
122  // determine start values from data
123 
124  const double x0 = h2->GetMean(1);
125  const double y0 = h2->GetMean(2);
126  const double xs = h2->GetStdDev(1) * 0.33;
127  const double ys = h2->GetStdDev(2) * 0.33;
128  const double signal = h2->GetMaximum();
129  const double background = h2->GetMinimum() + 0.10;
130 
131  // fit
132 
133  auto f2 = (JGauss2X<1>(x0, xs) *
134  JGauss2Y<2>(y0, ys) *
135  JP0<1>(signal)) + Exp(JP0<2>(log(background)));
136 
137  //auto f2 = JGauss2D<1>(sqrt(x0*y0), sqrt(xs*ys)) * JP0<1>(signal) + JP0<2>(background);
138 
139  typedef decltype(f2) function_type;
140 
142 
143  for (size_t i = 0; i != getNumberOfParameters<function_type>(); ++i) {
144  cout << setw(2) << i << ' '
145  << FIXED(15,9) << getParameter(f2, i) << endl;
146  }
147 
148  {
149  const chrono::steady_clock::time_point t0 = chrono::steady_clock::now();
150 
151  const auto result = (option == count_t ?
152  (writeFits ? Fit<m_count>(h2, f2, {}, X, Y) : Fit<m_count>(*h2, f2, {}, X, Y)) :
153  (writeFits ? Fit<m_value>(h2, f2, {}, X, Y) : Fit<m_value>(*h2, f2, {}, X, Y)));
154 
155  const chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
156 
157  cout << "chi2/NDF " << FIXED(7,3) << result.getChi2() << "/" << result.getNDF() << endl;
158  cout << "Number of iterations " << result.numberOfIterations << endl;
159  cout << "Elapsed time [us] " << setw(8) << chrono::duration_cast<chrono::microseconds>(t1 - t0).count() << endl;
160 
161  for (size_t i = 0; i != result.getNumberOfParameters(); ++i) {
162  cout << setw(2) << i << ' '
163  << FIXED(15,9) << result.getValue(i) << " +/- "
164  << FIXED(15,9) << result.getError(i) << endl;
165  }
166  }
167 
168  TFile out(outputFile.c_str(), "recreate");
169 
170  out << *h2;
171 
172  out.Write();
173  out.Close();
174 }
string outputFile
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
Utility class to parse parameter values.
Definition: JProperties.hh:501
Utility class to parse command line options.
Definition: JParser.hh:1714
ROOT Fit.
Definition: JRootfit.hh:940
const double sigma[]
Definition: JQuadrature.cc:74
const double xmax
Definition: JQuadrature.cc:24
const double xmin
Definition: JQuadrature.cc:23
int getParameter(const std::string &text)
Get parameter number from text string.
JExp< JF1_t > Exp(const JF1_t &f1)
Exponent of function.
Definition: JMathlib.hh:2545
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.
Definition: JRootTestkit.hh:33
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.
Definition: JRootfit.hh:1247
JRange< int > range_type
Definition: JSTDTypes.hh:14
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:448
Make 2D function of x from 1D function.
Definition: JMathlib2D.hh:25
Make 2D function of y from 1D function.
Definition: JMathlib2D.hh:95
Termination class for polynomial function.
Definition: JMathlib.hh:1487
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:84
Data point for value with error.
Definition: JRootfit.hh:127
Auxiliary data structure to list files in directory.
Definition: JFilesystem.hh:20