Jpp  test_elongated_shower_pde
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JMultiFunction.hh
Go to the documentation of this file.
1 #ifndef __JTOOLS__JMULTIFUNCTION__
2 #define __JTOOLS__JMULTIFUNCTION__
3 
4 #include "JTools/JMultiMap.hh"
5 #include "JTools/JFunctional.hh"
7 #include "JTools/JArray.hh"
10 #include "JTools/JHistogram1D.hh"
11 
12 
13 /**
14  * \author mdejong
15  */
16 
17 namespace JTOOLS {}
18 namespace JPP { using namespace JTOOLS; }
19 
20 namespace JTOOLS {
21 
22  /**
23  * Multidimensional interpolation method.
24  *
25  * The template parameters respectively refer to:
26  * -# function object used for the lowest dimension(s);
27  * -# list of functional maps used for the higher dimension(s); and
28  * -# distance operator.
29  *
30  * The number of dimensions of this function object is equal to the length of
31  * the given map list plus the extra dimensions of the first function object.
32  * When converting a multidimensional histogram to a multidimensional function for
33  * subsequent interpolations, the function object used for the lowest dimension(s)
34  * is treated as a probability density function.
35  */
36  template<class JFunction_t,
37  class JMaplist_t,
40  public JMultiMap<typename JFunction_t::argument_type, JFunction_t, JMaplist_t, JDistance_t>
41  {
42  public:
43 
44  typedef JMultiMap<typename JFunction_t::argument_type,
45  JFunction_t,
46  JMaplist_t,
47  JDistance_t> multimap_type;
48 
49  enum { NUMBER_OF_DIMENSIONS = JMapLength<JMaplist_t>::value + JFunction_t::NUMBER_OF_DIMENSIONS };
50 
51  typedef JFunction_t function_type;
52 
53  typedef typename function_type::value_type value_type;
54  typedef typename function_type::argument_type argument_type;
55 
56  typedef typename multimap_type::abscissa_type abscissa_type;
57  typedef typename multimap_type::ordinate_type ordinate_type;
58  typedef typename multimap_type::result_type result_type;
59 
60  typedef typename multimap_type::const_iterator const_iterator;
61  typedef typename multimap_type::const_reverse_iterator const_reverse_iterator;
62  typedef typename multimap_type::iterator iterator;
63  typedef typename multimap_type::reverse_iterator reverse_iterator;
64 
65  typedef typename multimap_type::super_iterator super_iterator;
66  typedef typename multimap_type::super_const_iterator super_const_iterator;
67 
69  using multimap_type::insert;
70 
71 
72  /**
73  * Default constructor.
74  */
76  {}
77 
78 
79  /**
80  * Constructor.
81  *
82  * \param input multidimensional input
83  */
84  template<class T>
85  JMultiFunction(const T& input)
86  {
87  insert(input);
88 
89  this->compile();
90  }
91 
92 
93  /**
94  * Get multidimensional function.
95  *
96  * \return this multidimensional function
97  */
99  {
100  return static_cast<const JMultiFunction&>(*this);
101  }
102 
103 
104  /**
105  * Get multidimensional function.
106  *
107  * \return this multidimensional function
108  */
110  {
111  return static_cast<JMultiFunction&>(*this);
112  }
113 
114 
115  /**
116  * Insert multidimensional input.
117  *
118  * \param input multidimensional function
119  */
120  template<class __JFunction_t, class __JMaplist_t, class __JDistance_t>
122  {
123  copy(input, *this);
124  }
125 
126 
127  /**
128  * Insert multidimensional input.
129  *
130  * \param input multidimensional histogram
131  */
132  template<class JHistogram_t, class __JMaplist_t, class __JDistance_t>
134  {
135  this->insert(JMultiKey<0, argument_type>(), input);
136  }
137 
138 
139  /**
140  * Compilation.
141  */
142  void compile()
143  {
144  this->for_each(compiler);
145 
146  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
147  (*i).getValue().compile();
148  }
149  }
150 
151 
152  /**
153  * Set the supervisor for handling of exceptions.
154  *
155  * \param supervisor supervisor
156  */
157  void setExceptionHandler(const typename function_type::supervisor_type& supervisor)
158  {
159  this->for_each(supervisor);
160 
161  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
162  (*i).getValue().setExceptionHandler(supervisor);
163  }
164  }
165 
166 
167  /**
168  * Multi-dimensional interpolation method call.
169  *
170  * \param args comma seperated list of abscissa values
171  * \return function value
172  */
173  template<class ...Args>
174  result_type operator()(const Args& ...args) const
175  {
176  return this->evaluate(JArray<NUMBER_OF_DIMENSIONS, argument_type>(args...).data());
177  }
178 
179 
180  protected:
181  /**
182  * Insert multidimensional histogram at multidimensional key.
183  *
184  * \param key multidimensional key
185  * \param input multidimensional histogram
186  */
187  template<unsigned int N,
188  class __JAbscissa_t,
189  class __JContents_t,
190  template<class, class, class> class __JMap_t,
191  class __JDistance_t>
194  {
195  if (input.size() > 1) {
196 
197  for (auto j = input.begin(), i = j++; j != input.end(); ++i, ++j) {
198 
199  const argument_type x = 0.5 * (i->getX() + j->getX());
200 
201  insert(JMultiKey<N+1, argument_type>(key, x), i->getY());
202  }
203  }
204  }
205 
206 
207  /**
208  * Convert one-dimensional histogram to PDF and insert result at given multidimensional key.
209  *
210  * \param key multidimensional key
211  * \param input histogram
212  */
213  template<class __JElement_t, template<class, class> class __JContainer_t, class __JDistance_t>
216 
217  {
218  JFunction_t buffer;
219 
220  makePDF(input, buffer);
221 
222  multimap_type::insert(key, buffer);
223  }
224 
225 
226  /**
227  * Convert multidimensional histogram to PDF and insert result at given multidimensional key.
228  *
229  * \param key multidimensional key
230  * \param input multidimensional histogram
231  */
232  template<class JHistogram_t, class __JMaplist_t, class __JDistance_t>
235  {
236  JFunction_t buffer;
237 
238  makePDF(input, buffer);
239 
240  multimap_type::insert(key, buffer);
241  }
242  };
243 
244 
245  /**
246  * Template specialisation of JMultiFunction for a JConstantFunction.
247  * The primary 2D function is reduced to a 1D function.
248  */
249  template<class JArgument_t,
250  class JResult_t,
251  template<class, class, class> class JMap_t,
252  class JDistance_t>
253  class JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>, JMapList<JMap_t>, JDistance_t> :
254  public JMap_t<JArgument_t, JResult_t, JDistance_t>,
255  public JFunction1D<JArgument_t, typename JMap_t<JArgument_t, JResult_t, JDistance_t>::result_type>
256  {
257  public:
258 
259  typedef JMap_t<JArgument_t, JResult_t, JDistance_t> multimap_type;
260 
261  typedef typename multimap_type::abscissa_type abscissa_type;
262  typedef typename multimap_type::ordinate_type ordinate_type;
263 
264  typedef typename multimap_type::argument_type argument_type;
265  typedef typename multimap_type::result_type result_type;
266 
267  typedef typename multimap_type::const_iterator const_iterator;
268  typedef typename multimap_type::const_reverse_iterator const_reverse_iterator;
269  typedef typename multimap_type::iterator iterator;
270  typedef typename multimap_type::reverse_iterator reverse_iterator;
271 
273  typedef JMap_t<JArgument_t, JResult_t, JDistance_t> map_type;
274 
275  enum { NUMBER_OF_DIMENSIONS = 1 };
276 
277  using multimap_type::insert;
278 
279 
280  /**
281  * Insert element.
282  *
283  * \param key multidimensional key
284  * \param function function
285  */
286  void insert(const JMultiKey<1, abscissa_type>& key, const function_type& function)
287  {
288  this->insert(key.first, function.getY());
289  }
290  };
291 
292 
293  /**
294  * Template specialisation of JMultiFunction for a JConstantFunction.
295  * The number of dimensions of the primary function is reduced by one.
296  */
297  template<class JArgument_t,
298  class JResult_t,
299  class JMaplist_t,
300  class JDistance_t>
301  class JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>, JMaplist_t, JDistance_t> :
302  public JMultiFunction<JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>,
303  typename JMaplist_t::tail_type,
304  JDistance_t>,
305  typename JMaplist_t::head_list,
306  JDistance_t>
307  {
308  public:
309 
311  typename JMaplist_t::tail_type,
312  JDistance_t>,
313  typename JMaplist_t::head_list,
314  JDistance_t> multifunction_type;
315 
317 
318  typedef typename multimap_type::abscissa_type abscissa_type;
319  typedef typename multimap_type::ordinate_type ordinate_type;
320 
321  typedef typename multimap_type::argument_type argument_type;
322  typedef typename multimap_type::result_type result_type;
323 
324  typedef typename multimap_type::const_iterator const_iterator;
325  typedef typename multimap_type::const_reverse_iterator const_reverse_iterator;
326  typedef typename multimap_type::iterator iterator;
327  typedef typename multimap_type::reverse_iterator reverse_iterator;
328 
329  typedef typename multimap_type::super_iterator super_iterator;
330  typedef typename multimap_type::super_const_iterator super_const_iterator;
331 
334  typename JMaplist_t::tail_type,
335  JDistance_t> map_type;
336 
338 
339  using multimap_type::insert;
340 
341 
342  /**
343  * Insert element.
344  *
345  * \param key multidimensional key
346  * \param function function
347  */
349  {
350  this->get(key.front()).put(key.back(), function.getY());
351  }
352  };
353 
354 
355  /**
356  * Conversion of multidimensional histogram to multidimensional function.
357  *
358  * \param input multidimensional histogram
359  * \param output multidimensional function
360  */
361  template<class JHistogram_t,
362  class JHistogramMaplist_t,
363  class JHistogramDistance_t,
364  class JFunction_t,
365  class JFunctionMaplist_t,
366  class JFunctionDistance_t>
369  {
370  output.insert(input);
371  }
372 }
373 
374 #endif
function_type::argument_type argument_type
void compile()
Compilation.
multimap_type::iterator iterator
JMultiMap is a general purpose multidimensional map based on a type list of maps. ...
multimap_type::super_iterator super_iterator
void insert(const JMultiKey< JMapLength< JMaplist_t >::value, argument_type > &key, const JMultiHistogram< JHistogram_t, __JMaplist_t, __JDistance_t > &input)
Convert multidimensional histogram to PDF and insert result at given multidimensional key...
Histogram map.
key_type back() const
Get backend key.
Definition: JMultiKey.hh:174
multimap_type::super_const_iterator super_const_iterator
Template class for distance evaluation.
Definition: JDistance.hh:24
void insert(const JMultiKey< 1, abscissa_type > &key, const function_type &function)
Insert element.
JMultiFunction< JConstantFunction1D< JArgument_t, JResult_t >, typename JMaplist_t::tail_type, JDistance_t > map_type
void insert(const JMultiKey< JMapLength< JMaplist_t >::value, argument_type > &key, const JHistogram1D< __JElement_t, __JContainer_t, __JDistance_t > &input)
Convert one-dimensional histogram to PDF and insert result at given multidimensional key...
static const JCompiler compiler
Function object for functional object compilation.
Definition: JFunctional.hh:369
then JShowerPostfit f $INPUT_FILE o $OUTPUT_FILE N
Length of map list.
Definition: JMapList.hh:45
void insert(const JMultiKey< NUMBER_OF_DIMENSIONS, abscissa_type > &key, const function_type &function)
Insert element.
result_type operator()(const Args &...args) const
Multi-dimensional interpolation method call.
Template definition of function object interface in one dimension.
Definition: JFunctional.hh:317
JMultiMap< typename JFunction_t::argument_type, JFunction_t, JMaplist_t, JDistance_t > multimap_type
multimap_type::reverse_iterator reverse_iterator
Multidimensional key.
Definition: JMultiKey.hh:34
Template implementation of function object in one dimension returning a constant value.
function_type::value_type value_type
Multidimensional interpolation method.
void makePDF(const JHistogram1D< JElement_t, JContainer_t, JDistance_t > &input, typename JMappable< JElement_t >::map_type &output)
Conversion of histogram to probability density function (PDF).
Map list.
Definition: JMapList.hh:24
void insert(const JMultiFunction< __JFunction_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
multimap_type::const_reverse_iterator const_reverse_iterator
Template definition of function object interface.
Definition: JFunctional.hh:32
do set_variable OUTPUT_DIRECTORY $WORKDIR T
multimap_type::ordinate_type ordinate_type
void insert(const JMultiKey< N, argument_type > &key, const JHistogramMap< __JAbscissa_t, __JContents_t, __JMap_t, __JDistance_t > &input)
Insert multidimensional histogram at multidimensional key.
const JMultiFunction & getMultiFunction() const
Get multidimensional function.
JMultiFunction & getMultiFunction()
Get multidimensional function.
JObject_t & for_each(JObject_t &object, JType< JTypeList< JHead_t, JTail_t > > typelist)
For each data type method.
Definition: JTypeList.hh:415
JMultiFunction()
Default constructor.
JMultiKey< N-1, JKey_t > front() const
Get frontend key.
Definition: JMultiKey.hh:163
multimap_type::result_type result_type
void setExceptionHandler(const typename function_type::supervisor_type &supervisor)
Set the supervisor for handling of exceptions.
multimap_type::abscissa_type abscissa_type
Multidimensional histogram.
multimap_type::const_iterator const_iterator
JMultiFunction< JMultiFunction< JConstantFunction1D< JArgument_t, JResult_t >, typename JMaplist_t::tail_type, JDistance_t >, typename JMaplist_t::head_list, JDistance_t > multifunction_type
void copy(const Head &from, JHead &to)
Copy header from from to to.
Definition: JHead.cc:139
Histogram in 1D.
int j
Definition: JPolint.hh:682
void insert(const JMultiHistogram< JHistogram_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
Multidimensional map.
Definition: JMultiMap.hh:52
JMultiFunction(const T &input)
Constructor.