Jpp  18.3.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JMultiFunction2D.cc
Go to the documentation of this file.
1 #include <string>
2 #include <iostream>
3 #include <iomanip>
4 #include <cmath>
5 
6 #include "TRandom3.h"
7 #include "TMath.h"
8 
9 #include "JTools/JMapList.hh"
10 #include "JTools/JFunction1D_t.hh"
13 #include "JTools/JMultiFunction.hh"
14 #include "JTools/JQuantile.hh"
15 #include "JTools/JToolsToolkit.hh"
16 
17 #include "Jeep/JTimer.hh"
18 #include "Jeep/JParser.hh"
19 #include "Jeep/JMessage.hh"
20 
21 namespace {
22 
23  using namespace JPP;
24 
25  /**
26  * 5D test function.
27  */
28  inline double f5(const double x0,
29  const double x1,
30  const double x2,
31  const double x3,
32  const double x4)
33  {
34  return TMath::Gaus(x4, x0+x1+x2+x3, 1.0, kTRUE);
35  }
36 }
37 
38 
39 /**
40  * \file
41  *
42  * Example program to create 2D function interpolator from multi-dimensional interpolator.
43  * \author mdejong
44  */
45 int main(int argc, char **argv)
46 {
47  using namespace std;
48  using namespace JPP;
49 
50  int numberOfEvents;
51  int numberOfBins;
52  double precision;
53  int debug;
54 
55  try {
56 
57  JParser<> zap("Example program to create 2D function interpolator from multi-dimensional interpolator.");
58 
59  zap['n'] = make_field(numberOfEvents) = 1000;
60  zap['N'] = make_field(numberOfBins) = 11;
61  zap['e'] = make_field(precision) = 1.0e-14;
62  zap['d'] = make_field(debug) = 3;
63 
64  zap(argc, argv);
65  }
66  catch(const exception &error) {
67  FATAL(error.what() << endl);
68  }
69 
70  ASSERT(numberOfEvents > 0);
71 
72  const double xmin = -1.0;
73  const double xmax = +1.0;
74  const double dx = (xmax - xmin) / (numberOfBins - 1);
75 
77  typedef JFunction1D_t::abscissa_type abscissa_type;
78  typedef JFunction1D_t::value_type value_type;
79 
80  typedef JMAPLIST<JPolint1FunctionalMap>::maplist JMaplist1D_t;
81  typedef JMultiFunction<JFunction1D_t, JMaplist1D_t> JFunction2D_t;
82 
84 
88  JPolint1FunctionalMap>::maplist JMaplist4D_t;
89 
92  JPolint1FunctionalMap>::maplist JMaplist3D_t;
93 
96 
97  for (double x0 = xmin; x0 < xmax + 0.5*dx; x0 += dx) {
98  for (double x1 = xmin; x1 < xmax + 0.5*dx; x1 += dx) {
99  for (double x2 = xmin; x2 < xmax + 0.5*dx; x2 += dx) {
100  for (double x3 = xmin; x3 < xmax + 0.5*dx; x3 += dx) {
101  for (double x4 = xmin; x4 < xmax + 0.5*dx; x4 += dx) {
102  g5[x0][x1][x2][x3][x4] = f5(x0,x1,x2,x3,x4);
103  h5[x0][x1][x2][x3][x4] = f5(x0,x1,x2,x3,x4);
104  }
105  }
106  }
107  }
108  }
109 
110  g5.compile();
111  h5.compile();
112 
113 
114  const double x0 = +0.15;
115  const double x1 = -0.25;
116  const double x2 = 0.25;
117 
118  JFunction2D_t g2;
119 
120  JTimer timer("3D interpolator");
121 
122  timer.start();
123 
124  for (int i = 0; i != 100; ++i) {
125  copy(h5(x0,x1,x2), g2); // put interpolated data into 2D functional object
126  }
127 
128  timer.stop();
129  timer.print(cout, 1.0/100, micro_t);
130 
131  g2.compile();
132 
133  JTimer t2("2D interpolator");
134  JTimer t5("5D interpolator");
135 
136  JQuantile Q2("2D interpolator");
137  JQuantile Q5("5D interpolator");
138 
139  // mini buffer to reduce overhead in timer
140 
141  const int N = 100;
142 
143  double x[N];
144  double y[N];
145  double z[N];
146  double v[N];
147  double w[N];
148 
149  for (int i = 0; i != numberOfEvents; ++i) {
150 
151  for (int __i = 0; __i != N; ++__i) {
152 
153  const double x3 = gRandom->Uniform(xmin, xmax);
154  const double x4 = gRandom->Uniform(xmin, xmax);
155 
156  x[__i] = x3;
157  y[__i] = x4;
158  z[__i] = f5(x0,x1,x2,x3,x4);
159  }
160 
161  t2.start();
162 
163  for (int __i = 0; __i != N; ++__i) {
164  v[__i] = g2(x[__i], y[__i]);
165  }
166 
167  t2.stop();
168 
169  t5.start();
170 
171  for (int __i = 0; __i != N; ++__i) {
172  w[__i] = g5(x0,x1,x2,x[__i],y[__i]);
173  }
174 
175  t5.stop();
176 
177  for (int __i = 0; __i != N; ++__i) {
178  Q2.put(v[__i] - z[__i]);
179  Q5.put(w[__i] - z[__i]);
180  }
181  }
182 
183  if (debug >= notice_t) {
184 
185  Q2.print(cout);
186  Q5.print(cout, false);
187 
188  t2.print(cout, 1.0 / (N * numberOfEvents), nano_t);
189  t5.print(cout, 1.0 / (N * numberOfEvents), nano_t);
190  }
191 
192  ASSERT(fabs(Q2.getMean() - Q5.getMean()) <= precision);
193  ASSERT(fabs(Q2.getSTDev() - Q5.getSTDev()) <= precision);
194 
195  return 0;
196 }
const double xmax
Definition: JQuadrature.cc:24
Utility class to parse command line options.
Definition: JParser.hh:1514
data_type w[N+1][M+1]
Definition: JPolint.hh:867
int main(int argc, char *argv[])
Definition: Main.cc:15
General purpose class for collection of elements, see: &lt;a href=&quot;JTools.PDF&quot;;&gt;Collection of elements...
Definition: JCollection.hh:73
micro
Definition: JScale.hh:29
void print(std::ostream &out, const JScale_t scale=milli_t) const
Print timer data.
Definition: JTimer.hh:161
notice
Definition: JMessage.hh:32
void stop()
Stop timer.
Definition: JTimer.hh:113
Various implementations of functional maps.
Template class for spline interpolation in 1D.
Definition: JSpline.hh:734
Template implementation of function object in one dimension returning a constant value.
#define ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
Multidimensional interpolation method.
Map list.
Definition: JMapList.hh:24
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
Type definition of a 1st degree polynomial interpolation based on a JMap implementation.
Auxiliary class for CPU timing and usage.
Definition: JTimer.hh:32
This include file contains various recursive methods to operate on multi-dimensional collections...
Auxiliary class for recursive map list generation.
Definition: JMapList.hh:108
General purpose messaging.
#define FATAL(A)
Definition: JMessage.hh:67
nano
Definition: JScale.hh:28
const double xmin
Definition: JQuadrature.cc:23
Auxiliary data structure for average.
Definition: JKatoomba_t.hh:76
then usage $script< input file >[option[primary[working directory]]] nWhere option can be N
Definition: JMuonPostfit.sh:40
Utility class to parse command line options.
void put(const double x)
Put value.
Definition: JKatoomba_t.hh:101
double f5(const double x0, const double x1, const double x2, const double x3, const double x4)
5D function.
void copy(const Head &from, JHead &to)
Copy header from from to to.
Definition: JHead.cc:162
long double getMean() const
Get mean value.
Definition: JKatoomba_t.hh:113
data_type v[N+1][M+1]
Definition: JPolint.hh:866
int numberOfBins
number of bins for average CDF integral of optical module
Definition: JSirene.cc:69
int debug
debug level
void start()
Start timer.
Definition: JTimer.hh:89