Jpp test-rotations-new
the software that should make you happy
Loading...
Searching...
No Matches
JRootfitToGauss2D.cc
Go to the documentation of this file.
1#include <string>
2#include <iostream>
3#include <iomanip>
4#include <vector>
5#include <type_traits>
6#include <chrono>
7
8#include "TROOT.h"
9#include "TFile.h"
10#include "TH2D.h"
11
12#include "JROOT/JRootToolkit.hh"
13#include "JROOT/JRootTestkit.hh"
14#include "JROOT/JRootfit.hh"
15
16#include "JMath/JMathlib2D.hh"
17
18#include "JLang/JManip.hh"
19
20#include "Jeep/JProperties.hh"
21#include "Jeep/JParser.hh"
22
23
24/**
25 * \file
26 *
27 * Program to test JRootfit algorithm.
28 * \author mdejong
29 */
30int main(int argc, char **argv)
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 ULong_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
I/O manipulators.
Functional algebra in 2D.
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
Utility class to parse parameter values.
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
int main(int argc, char **argv)
Utility class to parse parameter values.
Utility class to parse command line options.
Definition JParser.hh:1698
ROOT Fit.
Definition JRootfit.hh:940
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
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:68
Auxiliary data structure to list files in directory.