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