Jpp test-rotations-new
the software that should make you happy
Loading...
Searching...
No Matches
JRootfitToGauss.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 "TH1D.h"
11
12#include "JMath/JMathlib.hh"
13
14#include "JROOT/JRootToolkit.hh"
15#include "JROOT/JRootTestkit.hh"
16#include "JROOT/JRootfit.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 = 25;
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 size_t N;
49 string option;
50 bool writeFits;
51 ULong_t seed;
52 int debug;
53
54 try {
55
56 JProperties properties;
57
58 properties.insert(gmake_property(parameters.signal));
59 properties.insert(gmake_property(parameters.background));
60 properties.insert(gmake_property(parameters.center));
61 properties.insert(gmake_property(parameters.sigma));
62
63 JParser<> zap("Program to test JRootfit algorithm.");
64
65 zap['f'] = make_field(inputFile) = "";
66 zap['o'] = make_field(outputFile);
67 zap['@'] = make_field(properties) = JPARSER::initialised();
68 zap['x'] = make_field(X) = range_type();
69 zap['n'] = make_field(N) = 0;
70 zap['O'] = make_field(option) = count_t, value_t;
71 zap['w'] = make_field(writeFits);
72 zap['S'] = make_field(seed) = 0;
73 zap['d'] = make_field(debug) = 1;
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)
99 FillRandom(h1, f0);
100 else
101 FillRandom(h1, f0, N);
102
103 } else {
104
105 TFile* in = TFile::Open(inputFile.c_str(), "exist");
106
107 in->GetObject("h1", h1);
108 }
109
110
111 // determine start values from data
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 // fit
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)) :
137 (writeFits ? Fit<m_value>(h1, f1, {}, X) : Fit<m_value>(*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 << ' '
147 << FIXED(15,9) << result.getValue(i) << " +/- "
148 << FIXED(15,9) << result.getError(i) << endl;
149 }
150 }
151
152
153 TFile out(outputFile.c_str(), "recreate");
154
155 out << *h1;
156
157 out.Write();
158 out.Close();
159}
string outputFile
I/O manipulators.
Functional algebra.
#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
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