Jpp
 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 
11 
12 /**
13  * \author mdejong
14  */
15 
16 namespace JTOOLS {}
17 namespace JPP { using namespace JTOOLS; }
18 
19 namespace JTOOLS {
20 
21  /**
22  * Multidimensional interpolation method.
23  *
24  * The template parameters respectively refer to:
25  * -# function object used for the lowest dimension(s);
26  * -# list of functional maps used for the higher dimension(s); and
27  * -# distance operator.
28  *
29  * The number of dimensions of this function object is equal to the length of
30  * the given map list plus the extra dimensions of the first function object.
31  * When converting a multidimensional histogram to a multidimensional function for
32  * subsequent interpolations, the function object used for the lowest dimension(s)
33  * is treated as a probability density function.
34  */
35  template<class JFunction_t,
36  class JMaplist_t,
39  public JMultiMap<typename JFunction_t::argument_type, JFunction_t, JMaplist_t, JDistance_t>
40  {
41  public:
42 
43  typedef JMultiMap<typename JFunction_t::argument_type,
44  JFunction_t,
45  JMaplist_t,
46  JDistance_t> multimap_type;
47 
48  enum { NUMBER_OF_DIMENSIONS = JMapLength<JMaplist_t>::value + JFunction_t::NUMBER_OF_DIMENSIONS };
49 
50  typedef JFunction_t function_type;
51 
52  typedef typename JFunction_t::value_type value_type;
53  typedef typename JFunction_t::argument_type argument_type;
54  typedef typename JFunction_t::supervisor_type supervisor_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 
68  using multimap_type::insert;
69 
70 
71  /**
72  * Default constructor.
73  */
75  {}
76 
77 
78  /**
79  * Constructor.
80  *
81  * \param input multidimensional input
82  */
83  template<class T>
84  JMultiFunction(const T& input)
85  {
86  insert(input);
87 
88  this->compile();
89  }
90 
91 
92  /**
93  * Get multidimensional function.
94  *
95  * \return this multidimensional function
96  */
98  {
99  return static_cast<const JMultiFunction&>(*this);
100  }
101 
102 
103  /**
104  * Get multidimensional function.
105  *
106  * \return this multidimensional function
107  */
109  {
110  return static_cast<JMultiFunction&>(*this);
111  }
112 
113 
114  /**
115  * Insert multidimensional input.
116  *
117  * \param input multidimensional function
118  */
119  template<class JPDF_t, class JPDFMaplist_t, class JPDFDistance_t>
121  {
122  copy(input, *this);
123  }
124 
125 
126  /**
127  * Insert multidimensional input.
128  *
129  * \param input multidimensional histogram
130  */
131  template<class JHistogram_t, class JHistogramMaplist_t, class JHistogramDistance_t>
133  {
134  this->insert(JMultiKey<0, argument_type>(), input);
135  }
136 
137 
138  /**
139  * Compilation.
140  */
141  void compile()
142  {
143  this->for_each(compiler);
144 
145  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
146  (*i).getValue().compile();
147  }
148  }
149 
150 
151  /**
152  * Set the supervisor for handling of exceptions.
153  *
154  * \param supervisor supervisor
155  */
156  void setExceptionHandler(const supervisor_type& supervisor)
157  {
158  this->for_each(supervisor);
159 
160  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
161  (*i).getValue().setExceptionHandler(supervisor);
162  }
163  }
164 
165 
166  /**
167  * Multi-dimensional interpolation method call.
168  *
169  * \param args comma seperated list of abscissa values
170  * \return function value
171  */
172  template<class ...Args>
173  result_type operator()(const Args& ...args) const
174  {
175  return this->evaluate(JArray<NUMBER_OF_DIMENSIONS, argument_type>(args...).data());
176  }
177 
178 
179  protected:
180  /**
181  * Insert multidimensional histogram at multidimensional key.
182  *
183  * \param key multidimensional key
184  * \param input multidimensional histogram
185  */
186  template<unsigned int N,
187  class __JAbscissa_t,
188  class __JContents_t,
189  template<class, class, class> class __JMap_t,
190  class __JDistance_t>
193  {
194  if (input.size() > 1) {
195 
196  for (typename JHistogramMap<__JAbscissa_t, __JContents_t, __JMap_t, __JDistance_t>::const_iterator j = input.begin(), i = j++; j != input.end(); ++i, ++j) {
197 
198  const argument_type x = 0.5 * (i->getX() + j->getX());
199 
200  insert(JMultiKey<N+1, argument_type>(key, x), i->getY());
201  }
202  }
203  }
204 
205 
206  /**
207  * Convert one-dimensional histogram to PDF and insert result at given multidimensional key.
208  *
209  * \param key multidimensional key
210  * \param input histogram
211  */
212  template<class __JValue_t>
214  const __JValue_t& input)
215  {
216  JFunction_t buffer;
217 
218  makePDF(input, buffer);
219 
220  multimap_type::insert(key, buffer);
221  }
222  };
223 
224 
225  /**
226  * Template specialisation of JMultiFunction for a JConstantFunction.
227  * The primary 2D function is reduced to a 1D function.
228  */
229  template<class JArgument_t,
230  class JResult_t,
231  template<class, class, class> class JMap_t,
232  class JDistance_t>
233  class JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>, JMapList<JMap_t>, JDistance_t> :
234  public JMap_t<JArgument_t, JResult_t, JDistance_t>,
235  public JFunction1D<JArgument_t, JResult_t>
236  {
237  public:
238 
239  typedef JMap_t<JArgument_t, JResult_t, JDistance_t> multimap_type;
240 
241  typedef typename multimap_type::abscissa_type abscissa_type;
242  typedef typename multimap_type::ordinate_type ordinate_type;
243 
244  typedef typename multimap_type::argument_type argument_type;
245  typedef typename multimap_type::result_type result_type;
246 
247  typedef typename multimap_type::const_iterator const_iterator;
248  typedef typename multimap_type::const_reverse_iterator const_reverse_iterator;
249  typedef typename multimap_type::iterator iterator;
250  typedef typename multimap_type::reverse_iterator reverse_iterator;
251 
253  typedef JMap_t<JArgument_t, JResult_t, JDistance_t> map_type;
254 
255  enum { NUMBER_OF_DIMENSIONS = 1 };
256 
257  using multimap_type::insert;
258 
259 
260  /**
261  * Insert element.
262  *
263  * \param key multidimensional key
264  * \param function function
265  */
266  void insert(const JMultiKey<1, abscissa_type>& key, const function_type& function)
267  {
268  this->insert(key.first, function.getY());
269  }
270  };
271 
272 
273  /**
274  * Template specialisation of JMultiFunction for a JConstantFunction.
275  * The number of dimensions of the primary function is reduced by one.
276  */
277  template<class JArgument_t,
278  class JResult_t,
279  class JMaplist_t,
280  class JDistance_t>
281  class JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>, JMaplist_t, JDistance_t> :
282  public JMultiFunction<JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>,
283  typename JMaplist_t::tail_type,
284  JDistance_t>,
285  typename JMaplist_t::head_list,
286  JDistance_t>
287  {
288  public:
289 
291  typename JMaplist_t::tail_type,
292  JDistance_t>,
293  typename JMaplist_t::head_list,
294  JDistance_t> multifunction_type;
295 
297 
298  typedef typename multimap_type::abscissa_type abscissa_type;
299  typedef typename multimap_type::ordinate_type ordinate_type;
300 
301  typedef typename multimap_type::argument_type argument_type;
302  typedef typename multimap_type::result_type result_type;
303 
304  typedef typename multimap_type::const_iterator const_iterator;
305  typedef typename multimap_type::const_reverse_iterator const_reverse_iterator;
306  typedef typename multimap_type::iterator iterator;
307  typedef typename multimap_type::reverse_iterator reverse_iterator;
308 
309  typedef typename multimap_type::super_iterator super_iterator;
310  typedef typename multimap_type::super_const_iterator super_const_iterator;
311 
314  typename JMaplist_t::tail_type,
315  JDistance_t> map_type;
316 
318 
319  using multimap_type::insert;
320 
321 
322  /**
323  * Insert element.
324  *
325  * \param key multidimensional key
326  * \param function function
327  */
329  {
330  this->get(key.front()).put(key.back(), function.getY());
331  }
332  };
333 
334 
335  /**
336  * Conversion of multidimensional histogram to multidimensional function.
337  *
338  * \param input multidimensional histogram
339  * \param output multidimensional function
340  */
341  template<class JHistogram_t,
342  class JHistogramMaplist_t,
343  class JHistogramDistance_t,
344  class JFunction_t,
345  class JFunctionMaplist_t,
346  class JFunctionDistance_t>
349  {
350  output.insert(input);
351  }
352 }
353 
354 #endif
JFunction_t::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
Histogram map.
key_type back() const
Get backend key.
Definition: JMultiKey.hh:169
multimap_type::super_const_iterator super_const_iterator
Template class for distance evaluation.
Definition: JDistance.hh:24
JFunction_t::value_type value_type
JFunction_t::supervisor_type supervisor_type
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
static const JCompiler compiler
Function object for functional object compilation.
Definition: JFunctional.hh:369
void insert(const JMultiKey< JMapLength< JMaplist_t >::value, argument_type > &key, const __JValue_t &input)
Convert one-dimensional histogram to PDF and insert result at given multidimensional key...
Length of map list.
Definition: JMapList.hh:45
void setExceptionHandler(const supervisor_type &supervisor)
Set the supervisor for handling of exceptions.
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
Forward declaration of template JMultiKey class.
Definition: JMultiKey.hh:29
Template implementation of function object in one dimension returning a constant value.
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).
collection_type::const_iterator const_iterator
Map list.
Definition: JMapList.hh:24
multimap_type::const_reverse_iterator const_reverse_iterator
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:158
multimap_type::result_type result_type
multimap_type::abscissa_type abscissa_type
Multidimensional histogram.
void insert(const JMultiHistogram< JHistogram_t, JHistogramMaplist_t, JHistogramDistance_t > &input)
Insert multidimensional input.
multimap_type::const_iterator const_iterator
void insert(const JMultiFunction< JPDF_t, JPDFMaplist_t, JPDFDistance_t > &input)
Insert multidimensional input.
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:153
int j
Definition: JPolint.hh:634
then usage $script[input file[working directory[option]]] nWhere option can be N
Definition: JMuonPostfit.sh:37
Multidimensional map.
Definition: JMultiMap.hh:46
JMultiFunction(const T &input)
Constructor.