Jpp master_rocky-44-g75b7c4f75
the software that should make you happy
Loading...
Searching...
No Matches
JTransformableMultiFunction.hh
Go to the documentation of this file.
1#ifndef __JTOOLS__JTRANSFORMABLEMULTIFUNCTION__
2#define __JTOOLS__JTRANSFORMABLEMULTIFUNCTION__
3
6
10#include "JTools/JArray.hh"
16
17
18/**
19 * \author mdejong
20 */
21
22namespace JTOOLS {}
23namespace JPP { using namespace JTOOLS; }
24
25namespace 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 */
81
82
83 /**
84 * Constructor.
85 *
86 * \param input multidimensional input
87 */
88 template<class T>
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 */
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
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>
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::super_iterator super_iterator
multimap_type::super_const_iterator super_const_iterator
multimap_type::result_type result_type
multimap_type::ordinate_type ordinate_type
void compile()
Compilation.
multimap_type::const_iterator const_iterator
multimap_type::iterator iterator
void insert(const JMultiFunction< __JFunction_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
multimap_type::reverse_iterator reverse_iterator
multimap_type::const_reverse_iterator const_reverse_iterator
JArray< NUMBER_OF_DIMENSIONS, argument_type > buffer
function_type::value_type value_type
function_type::argument_type argument_type
multimap_type::abscissa_type abscissa_type
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::ordinate_type ordinate_type
multifunction_type::const_iterator const_iterator
multifunction_type::result_type result_type
JLANG::JSharedPointer< transformer_type > transformer
JMultiFunction< JFunction_t, JMaplist_t, JDistance_t > multifunction_type
multifunction_type::super_const_iterator super_const_iterator
void add(const JMultiFunction_t &input)
Add function.
multifunction_type::argument_type argument_type
JMultiMapTransformer< JMapLength< JMaplist_t >::value, argument_type > transformer_type
multifunction_type::super_iterator super_iterator
multifunction_type::abscissa_type abscissa_type
friend JWriter & operator<<(JWriter &out, const JTransformableMultiFunction &object)
Write transformable multidimensional function.
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::supervisor_type supervisor_type
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.
friend JReader & operator>>(JReader &in, JTransformableMultiFunction &object)
Read transformable multidimensional function.
multifunction_type::reverse_iterator reverse_iterator
const JTransformableMultiFunction & getTransformableMultiFunction() const
Get transformable multidimensional function.
void insert(const JTransformableMultiFunction< __JFunction_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
JTransformableMultiFunction & getTransformableMultiFunction()
Get transformable multidimensional function.
multifunction_type::const_reverse_iterator const_reverse_iterator
Transformable multidimensional histogram.
JLANG::JSharedPointer< transformer_type > transformer
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 JHistogram1D< JElement_t, JContainer_t, JDistance_t > &input, typename JMappable< JElement_t >::map_type &output)
Conversion of histogram to probability density function (PDF).
int j
Definition JPolint.hh:792
JResultEvaluator< JResult_t >::result_type get_value(const JResult_t &value)
Helper method to recursively evaluate a to function value.
Definition JResult.hh:998
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.