Jpp
JTransformableMultiFunction.hh
Go to the documentation of this file.
1 #ifndef __JTOOLS__JTRANSFORMABLEMULTIFUNCTION__
2 #define __JTOOLS__JTRANSFORMABLEMULTIFUNCTION__
3 
4 #include <stdarg.h>
5 
6 #include "JIO/JSerialisable.hh"
8 
11 #include "JTools/JFunctional.hh"
12 #include "JTools/JArray.hh"
15 
16 
17 /**
18  * \author mdejong
19  */
20 
21 namespace JTOOLS {}
22 namespace JPP { using namespace JTOOLS; }
23 
24 namespace JTOOLS {
25 
26  using JIO::JReader;
27  using JIO::JWriter;
28 
29 
30  /**
31  * Transformable multidimensional function.
32  *
33  * This class implements the JTransformable interface.
34  */
35  template<class JFunction_t,
36  class JMaplist_t,
39  public JMultiFunction<JFunction_t, JMaplist_t, JDistance_t>,
40  public JTransformable<JMapLength<JMaplist_t>::value, typename JFunction_t::argument_type>
41  {
42  public:
43 
44  typedef JMultiFunction<JFunction_t,
45  JMaplist_t,
46  JDistance_t> multifunction_type;
47 
49 
50  typedef JFunction_t function_type;
51 
55 
59 
64 
67 
70 
72 
73 
74  /**
75  * Default constructor.
76  */
78  transformer(transformer_type::getClone())
79  {}
80 
81 
82  /**
83  * Constructor.
84  *
85  * \param input multidimensional input
86  */
87  template<class T>
88  JTransformableMultiFunction(const T& input)
89  {
90  insert(input);
91 
92  this->compile();
93  }
94 
95 
96  /**
97  * Get transformable multidimensional function.
98  *
99  * \return this transformable multidimensional function
100  */
102  {
103  return static_cast<const JTransformableMultiFunction&>(*this);
104  }
105 
106 
107  /**
108  * Get transformable multidimensional function.
109  *
110  * \return this transformable multidimensional function
111  */
113  {
114  return static_cast<JTransformableMultiFunction&>(*this);
115  }
116 
117 
118  /**
119  * Insert multidimensional input.
120  *
121  * \param input multidimensional function
122  */
123  template<class JPDF_t, class JPDFMaplist_t, class JPDFDistance_t>
125  {
126  this->transformer.reset(input.transformer->clone());
127 
129  }
130 
131 
132  /**
133  * Insert multidimensional input.
134  *
135  * \param input multidimensional histogram
136  */
137  template<class JHistogram_t, class JHistogramMaplist_t, class JHistogramDistance_t>
139  {
140  this->transformer.reset(input.transformer->clone());
141 
143  }
144 
145 
146  /**
147  * Add function.
148  *
149  * Note that the summation is made via iteration of the elements in this multidimensional function.
150  *
151  * \param input multidimensional function
152  */
153  template<class JMultiFunction_t>
154  void add(const JMultiFunction_t& input)
155  {
156  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
157 
158  const array_type array = (*i).getKey();
159  function_type& f1 = (*i).getValue();
160 
161  if (!f1.empty()) {
162 
164  const JMultiMapPutTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> put(*(this->transformer), array);
165 
166  f1.transform(get);
167 
168  for (typename function_type::iterator j = f1.begin(); j != f1.end(); ++j) {
169 
171 
172  j->getY() += get_value(input.evaluate(buffer.data()));
173  }
174 
175  f1.transform(put);
176  f1.compile();
177  }
178  }
179  }
180 
181 
182  /**
183  * Multidimensional interpolation method call.
184  *
185  * \param x comma seperated list of abscissa values
186  * \return function value
187  */
189  {
190  va_start(this->ap, x);
191 
192  this->buffer[0] = x;
193 
194  for (int i = 1; i != NUMBER_OF_DIMENSIONS; ++i) {
195  this->buffer[i] = va_arg(this->ap, argument_type);
196  }
197 
198  va_end(this->ap);
199 
200  return this->evaluate(this->buffer.data());
201  }
202 
203 
204  /**
205  * Recursive function value evaluation.
206  *
207  * \param pX pointer to abscissa values
208  * \return function value
209  */
210  virtual result_type evaluate(const argument_type* pX) const
211  {
212  for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
213  this->buffer[i] = pX[i];
214  }
215 
216  this->buffer[NUMBER_OF_DIMENSIONS - 1] = transformer->putXn(this->buffer, this->buffer[NUMBER_OF_DIMENSIONS - 1]);
217 
218  const result_type y = multifunction_type::evaluate(this->buffer.data());
219  const double W = transformer->getWeight(this->buffer);
220 
222  }
223 
224 
225  /**
226  * Application of weight function and coordinate transformation.
227  *
228  * \param transformer function transformer
229  */
231  {
232  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
233 
234  const array_type array = (*i).getKey();
235  function_type& function = (*i).getValue();
236 
237  const JMultiMapGetTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> get(*(this->transformer), array);
239 
240  function.transform(get);
241  function.transform(put);
242  }
243 
244  this->transformer.reset(transformer.clone());
245  this->compile();
246  }
247 
248 
249  /**
250  * Read transformable multidimensional function.
251  *
252  * \param in reader
253  * \param object transformable multidimensional function.
254  * \return reader
255  */
257  {
258  in >> static_cast<multifunction_type&>(object);
259 
260  return object.transformer->read(in);
261  }
262 
263 
264  /**
265  * Write transformable multidimensional function.
266  *
267  * \param out writer
268  * \param object transformable multidimensional function
269  * \return writer
270  */
271  friend inline JWriter& operator<<(JWriter& out, const JTransformableMultiFunction& object)
272  {
273  out << static_cast<const multifunction_type&>(object);
274 
275  return object.transformer->write(out);
276  }
277 
278 
280  };
281 
282 
283  /**
284  * Conversion of multidimensional histogram to multidimensional function.
285  *
286  * \param input multidimensional histogram
287  * \param output multidimensional function
288  */
289  template<class JHistogram_t,
290  class JHistogramMaplist_t,
291  class JHistogramDistance_t,
292  class JFunction_t,
293  class JFunctionMaplist_t,
294  class JFunctionDistance_t>
297  {
298  output.insert(input);
299  }
300 }
301 
302 #endif
JTOOLS::JMultiMapGetTransformer
Auxiliary class to convert JMultiMapTransformer to JCollectionElementTransformer.
Definition: JMultiMapTransformer.hh:291
JIO::JReader
Interface for binary input.
Definition: JSerialisable.hh:62
JTOOLS::JTransformableMultiFunction::operator<<
friend JWriter & operator<<(JWriter &out, const JTransformableMultiFunction &object)
Write transformable multidimensional function.
Definition: JTransformableMultiFunction.hh:271
JTOOLS::JTransformableMultiFunction::iterator
multifunction_type::iterator iterator
Definition: JTransformableMultiFunction.hh:62
JTOOLS::JTransformableMultiFunction::multifunction_type
JMultiFunction< JFunction_t, JMaplist_t, JDistance_t > multifunction_type
Definition: JTransformableMultiFunction.hh:46
JTOOLS::JTransformableMultiFunction::transform
virtual void transform(const transformer_type &transformer)
Application of weight function and coordinate transformation.
Definition: JTransformableMultiFunction.hh:230
JTOOLS::pX
pX
Definition: JPolint.hh:625
JResultTransformer.hh
JTOOLS::JTransformableMultiFunction
Transformable multidimensional function.
Definition: JTransformableMultiFunction.hh:38
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::function_type
JFunction1D_t function_type
Definition: JMultiFunction.hh:52
JTOOLS::makePDF
void makePDF(const JTransformableMultiHistogram< JHistogram_t, JHistogramMaplist_t, JHistogramDistance_t > &input, JTransformableMultiFunction< JFunction_t, JFunctionMaplist_t, JFunctionDistance_t > &output)
Conversion of multidimensional histogram to multidimensional function.
Definition: JTransformableMultiFunction.hh:295
JTOOLS::JTransformableMultiFunction::NUMBER_OF_DIMENSIONS
Definition: JTransformableMultiFunction.hh:48
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::super_const_iterator
multimap_type::super_const_iterator super_const_iterator
Definition: JMultiFunction.hh:68
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::ordinate_type
multimap_type::ordinate_type ordinate_type
Definition: JMultiFunction.hh:59
JTOOLS::JMultiFunction::ap
va_list ap
Definition: JMultiFunction.hh:235
JSharedPointer.hh
JTOOLS::JTransformableMultiFunction::operator()
result_type operator()(const argument_type x,...) const
Multidimensional interpolation method call.
Definition: JTransformableMultiFunction.hh:188
JTOOLS::JTransformableMultiFunction::abscissa_type
multifunction_type::abscissa_type abscissa_type
Definition: JTransformableMultiFunction.hh:56
JTOOLS::JArray< N, argument_type >
JTOOLS::j
int j
Definition: JPolint.hh:634
JTOOLS::JArray::data
const_pointer data() const
Get pointer to data.
Definition: JArray.hh:263
JTOOLS::get_value
JResultEvaluator< JResult_t >::result_type get_value(const JResult_t &value)
Helper method to recursively evaluate a to function value.
Definition: JResult.hh:936
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JAAnetToolkit.hh:37
JTransformableMultiHistogram.hh
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::const_reverse_iterator
multimap_type::const_reverse_iterator const_reverse_iterator
Definition: JMultiFunction.hh:63
JTOOLS::JTransformableMultiFunction::array_type
transformer_type::array_type array_type
Definition: JTransformableMultiFunction.hh:69
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::super_iterator
multimap_type::super_iterator super_iterator
Definition: JMultiFunction.hh:67
JTOOLS::JTransformableMultiFunction::super_iterator
multifunction_type::super_iterator super_iterator
Definition: JTransformableMultiFunction.hh:65
JTOOLS::JMultiFunction::buffer
JArray< NUMBER_OF_DIMENSIONS, argument_type > buffer
Definition: JMultiFunction.hh:236
JSerialisable.hh
JTOOLS::JTransformableMultiFunction::JTransformableMultiFunction
JTransformableMultiFunction(const T &input)
Constructor.
Definition: JTransformableMultiFunction.hh:88
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::const_iterator
multimap_type::const_iterator const_iterator
Definition: JMultiFunction.hh:62
JTOOLS::JTransformableMultiFunction::value_type
multifunction_type::value_type value_type
Definition: JTransformableMultiFunction.hh:52
JTOOLS::JMultiMapTransformer
Interface for weight application and coordinate transformation of function.
Definition: JMultiMapTransformer.hh:35
JIO::JWriter
Interface for binary output.
Definition: JSerialisable.hh:131
JTOOLS::JMultiMapPutTransformer
Auxiliary class to convert JMultiMapTransformer to JCollectionElementTransformer.
Definition: JMultiMapTransformer.hh:240
JMultiMapTransformer.hh
JTOOLS::JTransformableMultiFunction::operator>>
friend JReader & operator>>(JReader &in, JTransformableMultiFunction &object)
Read transformable multidimensional function.
Definition: JTransformableMultiFunction.hh:256
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::value_type
JFunction1D_t ::value_type value_type
Definition: JMultiFunction.hh:54
JTOOLS::JTransformableMultiFunction::add
void add(const JMultiFunction_t &input)
Add function.
Definition: JTransformableMultiFunction.hh:154
JTOOLS::JTransformableMultiFunction::reverse_iterator
multifunction_type::reverse_iterator reverse_iterator
Definition: JTransformableMultiFunction.hh:63
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::argument_type
JFunction1D_t ::argument_type argument_type
Definition: JMultiFunction.hh:55
JTOOLS::JTransformableMultiFunction::transformer_type
JMultiMapTransformer< JMapLength< JMaplist_t >::value, argument_type > transformer_type
Definition: JTransformableMultiFunction.hh:68
JTOOLS::JTransformableMultiFunction::super_const_iterator
multifunction_type::super_const_iterator super_const_iterator
Definition: JTransformableMultiFunction.hh:66
JTOOLS::JResultTransformer::transform
static result_type transform(const JMultiMapTransformer< N, JArgument_t > &transformer, typename JMultiMapTransformer< N, JArgument_t >::const_array_type array, const result_type &result)
Definition: JResultTransformer.hh:26
JTOOLS::JMultiFunction::NUMBER_OF_DIMENSIONS
Definition: JMultiFunction.hh:50
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::iterator
multimap_type::iterator iterator
Definition: JMultiFunction.hh:64
JTOOLS::JTransformableMultiFunction::ordinate_type
multifunction_type::ordinate_type ordinate_type
Definition: JTransformableMultiFunction.hh:57
JTOOLS::JTransformableMultiFunction::transformer
JLANG::JSharedPointer< transformer_type > transformer
Definition: JTransformableMultiFunction.hh:279
JTOOLS::JTransformableMultiFunction::const_iterator
multifunction_type::const_iterator const_iterator
Definition: JTransformableMultiFunction.hh:60
JMultiFunction.hh
JTOOLS::JMultiFunction::compile
void compile()
Compilation.
Definition: JMultiFunction.hh:143
JFunctional.hh
JTOOLS::JTransformableMultiFunction::supervisor_type
multifunction_type::supervisor_type supervisor_type
Definition: JTransformableMultiFunction.hh:54
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::abscissa_type
multimap_type::abscissa_type abscissa_type
Definition: JMultiFunction.hh:58
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::result_type
multimap_type::result_type result_type
Definition: JMultiFunction.hh:60
JTOOLS::JTransformable
Abstract interface for transformable multidimensional map.
Definition: JMultiMapTransformer.hh:342
JTOOLS::JTransformableMultiHistogram
Transformable multidimensional histogram.
Definition: JTransformableMultiHistogram.hh:37
JTOOLS::JTransformableMultiFunction::insert
void insert(const JTransformableMultiHistogram< JHistogram_t, JHistogramMaplist_t, JHistogramDistance_t > &input)
Insert multidimensional input.
Definition: JTransformableMultiFunction.hh:138
JTOOLS::JDistance
Template class for distance evaluation.
Definition: JDistance.hh:24
JTOOLS::JTransformableMultiFunction::evaluate
virtual result_type evaluate(const argument_type *pX) const
Recursive function value evaluation.
Definition: JTransformableMultiFunction.hh:210
JTOOLS::JMultiFunction::insert
void insert(const JMultiFunction< JPDF_t, JPDFMaplist_t, JPDFDistance_t > &input)
Insert multidimensional input.
Definition: JMultiFunction.hh:122
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::supervisor_type
JFunction1D_t ::supervisor_type supervisor_type
Definition: JMultiFunction.hh:56
JTOOLS::JTransformableMultiHistogram::transformer
JLANG::JSharedPointer< transformer_type > transformer
Definition: JTransformableMultiHistogram.hh:183
JTOOLS::JTransformableMultiFunction::result_type
multifunction_type::result_type result_type
Definition: JTransformableMultiFunction.hh:58
JTOOLS::JTransformableMultiFunction::getTransformableMultiFunction
JTransformableMultiFunction & getTransformableMultiFunction()
Get transformable multidimensional function.
Definition: JTransformableMultiFunction.hh:112
JAANET::get
T get(const JHead &header)
Get object from header.
Definition: JHeadToolkit.hh:295
JTOOLS
Auxiliary classes and methods for multi-dimensional interpolations and histograms.
Definition: JAbstractCollection.hh:9
JTOOLS::JTransformableMultiFunction::const_reverse_iterator
multifunction_type::const_reverse_iterator const_reverse_iterator
Definition: JTransformableMultiFunction.hh:61
JTOOLS::JMultiFunction
Multidimensional interpolation method.
Definition: JMultiFunction.hh:40
JTOOLS::JTransformableMultiFunction::insert
void insert(const JTransformableMultiFunction< JPDF_t, JPDFMaplist_t, JPDFDistance_t > &input)
Insert multidimensional input.
Definition: JTransformableMultiFunction.hh:124
JTOOLS::JTransformableMultiFunction::getTransformableMultiFunction
const JTransformableMultiFunction & getTransformableMultiFunction() const
Get transformable multidimensional function.
Definition: JTransformableMultiFunction.hh:101
JLANG::JSharedPointer
The template JSharedPointer class can be used to share a pointer to an object.
Definition: JSharedPointer.hh:28
JTOOLS::JTransformableMultiFunction::JTransformableMultiFunction
JTransformableMultiFunction()
Default constructor.
Definition: JTransformableMultiFunction.hh:77
JTOOLS::JTransformableMultiFunction::function_type
JFunction_t function_type
Definition: JTransformableMultiFunction.hh:50
JTOOLS::JMultiFunction< JFunction1D_t, JPDFMaplist_t, JTOOLS::JDistance< typename JFunction1D_t::argument_type > >::reverse_iterator
multimap_type::reverse_iterator reverse_iterator
Definition: JMultiFunction.hh:65
JTOOLS::JTransformableMultiFunction::argument_type
multifunction_type::argument_type argument_type
Definition: JTransformableMultiFunction.hh:53
JArray.hh