Blame view

src/Info/ParamTable.cc 11.5 KB
fbe3c2bb   Benjamin Renard   First commit
1
2
3
4
5
6
7
8
9
/**
 * ParamTable.cc
 *
 *  Created on: 10 oct. 2014
 *  Author: AKKA
 */
#include "ParamTable.hh"

#include "Parameter.hh"
f2db3c16   Benjamin Renard   Support variable ...
10
#include "ParamData.hh"
fbe3c2bb   Benjamin Renard   First commit
11
12
13
14
15
16
17
18
19

using namespace log4cxx;

namespace AMDA {
namespace Info {

LoggerPtr ParamTable::_logger(Logger::getLogger("AMDA-Kernel.ParamTable"));

ParamTable::ParamTable(const char *paramId) : _paramId(paramId),
f2db3c16   Benjamin Renard   Support variable ...
20
		_tableName(""), _tableUnits(""), _variable("false")
fbe3c2bb   Benjamin Renard   First commit
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{
}

ParamTable::~ParamTable()
{
}

/*
 * @brief Set name of the table
 */
void ParamTable::setName(std::string name)
{
	_tableName = name;
}

/*
 * @brief Get name of the table
 */
std::string ParamTable::getName(void)
{
	return _tableName;
}

/*
 * @brief Set units
 */
void ParamTable::setUnits(std::string units)
{
	_tableUnits = units;
}

/*
 * @brief Get units of the table
 */
std::string ParamTable::getUnits(void)
{
	return _tableUnits;
}

f2db3c16   Benjamin Renard   Support variable ...
60
61
62
63
/*
 * @brief Set isVariable attribute
 */
void ParamTable::setIsVariable(bool isVariable)
fbe3c2bb   Benjamin Renard   First commit
64
{
f2db3c16   Benjamin Renard   Support variable ...
65
	_variable = isVariable;
fbe3c2bb   Benjamin Renard   First commit
66
67
68
}

/*
f2db3c16   Benjamin Renard   Support variable ...
69
 * @brief Get if it's a variable table
fbe3c2bb   Benjamin Renard   First commit
70
 */
f2db3c16   Benjamin Renard   Support variable ...
71
bool ParamTable::isVariable(void)
fbe3c2bb   Benjamin Renard   First commit
72
{
f2db3c16   Benjamin Renard   Support variable ...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
	return _variable;
}

void ParamTable::addTableParam(std::string key, std::string name)
{
	_tableParams[key] = name;
}

std::string ParamTable::getTableParamByKey(std::string key)
{
	return _tableParams[key];
}

std::map<std::string, std::string>& ParamTable::getTableParams()
{
	return _tableParams;
}

std::vector<double> ParamTable::getConstantTableParamValuesByKey(ParameterManager *parameterManager, std::string key)
{
	std::vector<double> paramValues;
fbe3c2bb   Benjamin Renard   First commit
94
	ParameterSPtr tmpParam = parameterManager->getParameter(_paramId);
f2db3c16   Benjamin Renard   Support variable ...
95
96
	if (tmpParam == nullptr)
		return paramValues;
fbe3c2bb   Benjamin Renard   First commit
97
	AMDA::Parameters::Parameter::InfoList lInfoList = tmpParam->getInfoList();
f2db3c16   Benjamin Renard   Support variable ...
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
	if (_tableParams.find(key) == _tableParams.end())
		return paramValues;
	std::string tableParamName = _tableParams[key];
	if (lInfoList.find(tableParamName) == lInfoList.end())
		return paramValues;
	paramValues = *lInfoList[tableParamName].get();
	return paramValues;
}

std::vector<double> ParamTable::getVariableTableParamValuesByKey(std::map<std::string, std::vector<double>>* paramsTableData, std::string key)
{
	std::vector<double> paramValues;
	if (paramsTableData == NULL)
		return paramValues;
	if (paramsTableData->find(key) == paramsTableData->end())
		return paramValues;
	return (*paramsTableData)[key];
}

std::vector<double> ParamTable::getTableParamValuesByKey(ParameterManager *parameterManager, std::map<std::string, std::vector<double>>* paramsTableData, std::string key)
{
	if (_variable)
		return getVariableTableParamValuesByKey(paramsTableData, key);
	else
		return getConstantTableParamValuesByKey(parameterManager, key);
}

std::string ParamBoundsTable::_boundsParamKey = "TABLEPARAM_BOUNDS";

ParamBoundsTable::ParamBoundsTable(const char *paramId) :
		ParamTable(paramId)
{
fbe3c2bb   Benjamin Renard   First commit
130
131
132
}

/*
f2db3c16   Benjamin Renard   Support variable ...
133
 * @brief Get size of the table
fbe3c2bb   Benjamin Renard   First commit
134
 */
f2db3c16   Benjamin Renard   Support variable ...
135
int ParamBoundsTable::getSize(ParameterManager *parameterManager)
fbe3c2bb   Benjamin Renard   First commit
136
{
f2db3c16   Benjamin Renard   Support variable ...
137
138
139
140
141
142
143
144
145
146
	if (!_variable)
	{
		std::vector<double> boundsValues = getConstantTableParamValuesByKey(parameterManager, ParamBoundsTable::_boundsParamKey);
		return boundsValues.size() - 1;
	}
	else
	{
		return 0;
	}
}
fbe3c2bb   Benjamin Renard   First commit
147

f2db3c16   Benjamin Renard   Support variable ...
148
149
150
151
152
/*
 * @brief Get a bounds for a specified index
 */
t_TableBound ParamBoundsTable::getBound(ParameterManager *parameterManager, unsigned int index, std::map<std::string, std::vector<double>>* paramsTableData)
{
fbe3c2bb   Benjamin Renard   First commit
153
154
	t_TableBound bound;
	bound.index = index;
fbe3c2bb   Benjamin Renard   First commit
155

f2db3c16   Benjamin Renard   Support variable ...
156
157
158
	std::vector<double> boundsValues = getTableParamValuesByKey(parameterManager, paramsTableData, ParamBoundsTable::_boundsParamKey);

	if (index >= boundsValues.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
159
160
161
162
163
164
	{
		LOG4CXX_ERROR(_logger, "Index " << index << " outside of table definition => Cannot get real bound" );
		bound.min = index;
		bound.max = index+1;
		return bound;
	}
f2db3c16   Benjamin Renard   Support variable ...
165
166
	bound.min = std::min(boundsValues[index], boundsValues[index+1]);
	bound.max = std::max(boundsValues[index], boundsValues[index+1]);
fbe3c2bb   Benjamin Renard   First commit
167
168
169
170

	return bound;
}

f2db3c16   Benjamin Renard   Support variable ...
171
172
173
174
std::string ParamCenterTable::_centersParamKey = "TABLEPARAM_CENTERS";

ParamCenterTable::ParamCenterTable(const char *paramId, double size) :
		ParamTable(paramId), _size(size)
fbe3c2bb   Benjamin Renard   First commit
175
176
177
178
179
180
181
182
{
}

/*
 * @brief Get size of the table
 */
int ParamCenterTable::getSize(ParameterManager *parameterManager)
{
f2db3c16   Benjamin Renard   Support variable ...
183
184
185
186
187
188
189
190
191
	if (!_variable)
	{
		std::vector<double> centersValues = getConstantTableParamValuesByKey(parameterManager, ParamCenterTable::_centersParamKey);
		return centersValues.size();
	}
	else
	{
		return 0;
	}
fbe3c2bb   Benjamin Renard   First commit
192
193
194
195
196
}

/*
 * @brief Get a bound for a specified index
 */
f2db3c16   Benjamin Renard   Support variable ...
197
t_TableBound ParamCenterTable::getBound(ParameterManager *parameterManager, unsigned int index, std::map<std::string, std::vector<double>>* paramsTableData)
fbe3c2bb   Benjamin Renard   First commit
198
{
fbe3c2bb   Benjamin Renard   First commit
199
200
201
	t_TableBound bound;
	bound.index = index;

f2db3c16   Benjamin Renard   Support variable ...
202
	std::vector<double> centersValues = getTableParamValuesByKey(parameterManager, paramsTableData, ParamCenterTable::_centersParamKey);
fbe3c2bb   Benjamin Renard   First commit
203

f2db3c16   Benjamin Renard   Support variable ...
204
	if (index >= centersValues.size())
fbe3c2bb   Benjamin Renard   First commit
205
206
207
208
209
210
211
	{
		LOG4CXX_ERROR(_logger, "Index " << index << " outside of table definition => Cannot get real bound" );
		bound.min = index;
		bound.max = index+1;
		return bound;
	}

ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
212
213
214
215
216
217
218
219
220
221
	if (!std::isnan(centersValues[index]))
	{
		bound.min = centersValues[index] - _size/2.;
		bound.max = centersValues[index] + _size/2.;
	}
	else
	{
		bound.min = NAN;
		bound.max = NAN;
	}
fbe3c2bb   Benjamin Renard   First commit
222
223
224
225

	return bound;
}

f2db3c16   Benjamin Renard   Support variable ...
226
227
228
229
230
std::string ParamCenterWidthTable::_centersParamKey = "TABLEPARAM_CENTERS";
std::string ParamCenterWidthTable::_widthsParamKey = "TABLEPARAM_WIDTHS";

ParamCenterWidthTable::ParamCenterWidthTable(const char *paramId) :
		ParamTable(paramId)
f5c53312   Benjamin Renard   Get calib info in...
231
232
233
234
235
236
237
238
{
}

/*
 * @brief Get size of the table
 */
int ParamCenterWidthTable::getSize(ParameterManager *parameterManager)
{
f2db3c16   Benjamin Renard   Support variable ...
239
240
241
242
243
244
245
246
247
	if (!_variable)
	{
		std::vector<double> centersValues = getConstantTableParamValuesByKey(parameterManager, ParamCenterWidthTable::_centersParamKey);
		return centersValues.size();
	}
	else
	{
		return 0;
	}
f5c53312   Benjamin Renard   Get calib info in...
248
249
250
251
252
}

/*
 * @brief Get a bound for a specified index
 */
f2db3c16   Benjamin Renard   Support variable ...
253
t_TableBound ParamCenterWidthTable::getBound(ParameterManager *parameterManager, unsigned int index, std::map<std::string, std::vector<double>>* paramsTableData)
f5c53312   Benjamin Renard   Get calib info in...
254
{
f5c53312   Benjamin Renard   Get calib info in...
255
256
257
	t_TableBound bound;
	bound.index = index;

f2db3c16   Benjamin Renard   Support variable ...
258
259
	std::vector<double> centersValues = getTableParamValuesByKey(parameterManager, paramsTableData, ParamCenterWidthTable::_centersParamKey);
	std::vector<double> widthsValues = getTableParamValuesByKey(parameterManager, paramsTableData, ParamCenterWidthTable::_centersParamKey);
f5c53312   Benjamin Renard   Get calib info in...
260

f2db3c16   Benjamin Renard   Support variable ...
261
	if ((index >= centersValues.size()) || (index >= widthsValues.size()))
f5c53312   Benjamin Renard   Get calib info in...
262
263
264
265
266
267
268
	{
		LOG4CXX_ERROR(_logger, "Index " << index << " outside of table definition => Cannot get real bound" );
		bound.min = index;
		bound.max = index+1;
		return bound;
	}

ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
269
270
271
272
273
274
275
276
277
278
	if (!std::isnan(centersValues[index]) && !std::isnan(widthsValues[index]))
	{
		bound.min = centersValues[index] - widthsValues[index]/2.;
		bound.max = centersValues[index] + widthsValues[index]/2.;
	}
	else
	{
		bound.min = NAN;
		bound.max = NAN;
	}
f5c53312   Benjamin Renard   Get calib info in...
279
280
281
282

	return bound;
}

f2db3c16   Benjamin Renard   Support variable ...
283
284
285
286
std::string ParamCenterAutoTable::_centersParamKey = "TABLEPARAM_CENTERS";

ParamCenterAutoTable::ParamCenterAutoTable(const char *paramId, bool log) :
		ParamTable(paramId), _log(log)
65c661e8   Benjamin Renard   Table definition ...
287
288
289
290
291
292
293
294
{
}

/*
 * @brief Get size of the table
 */
int ParamCenterAutoTable::getSize(ParameterManager *parameterManager)
{
f2db3c16   Benjamin Renard   Support variable ...
295
296
297
298
299
300
301
302
303
	if (!_variable)
	{
		std::vector<double> centersValues = getConstantTableParamValuesByKey(parameterManager, ParamCenterAutoTable::_centersParamKey);
		return centersValues.size();
	}
	else
	{
		return 0;
	}
65c661e8   Benjamin Renard   Table definition ...
304
305
306
307
308
}

/*
 * @brief Get a bound for a specified index
 */
f2db3c16   Benjamin Renard   Support variable ...
309
t_TableBound ParamCenterAutoTable::getBound(ParameterManager *parameterManager, unsigned int index, std::map<std::string, std::vector<double>>* paramsTableData)
65c661e8   Benjamin Renard   Table definition ...
310
{
65c661e8   Benjamin Renard   Table definition ...
311
312
313
	t_TableBound bound;
	bound.index = index;

f2db3c16   Benjamin Renard   Support variable ...
314
	std::vector<double> centersValues = getTableParamValuesByKey(parameterManager, paramsTableData, ParamCenterAutoTable::_centersParamKey);
65c661e8   Benjamin Renard   Table definition ...
315

f2db3c16   Benjamin Renard   Support variable ...
316
	if (index >= centersValues.size())
65c661e8   Benjamin Renard   Table definition ...
317
318
319
320
321
322
323
324
325
	{
		LOG4CXX_ERROR(_logger, "Index " << index << " outside of table definition => Cannot get real bound" );
		bound.min = index;
		bound.max = index+1;
		return bound;
	}

	//Compute bounds

f2db3c16   Benjamin Renard   Support variable ...
326
	if (centersValues.size() <= 1)
65c661e8   Benjamin Renard   Table definition ...
327
328
329
330
331
332
333
334
335
336
337
338
	{
		LOG4CXX_ERROR(_logger, "Table dimension too small to compute bound" );
		bound.min = index;
		bound.max = index+1;
		return bound;
	}

	double minus = 0.;
	double plus  = 0.;

	if (index == 0)
	{
ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
339
340
341
342
343
344
345
		if (!std::isnan(centersValues[1]) && !std::isnan(centersValues[0]))
		{
			if (_log)
				plus  = (log10(centersValues[1]) - log10(centersValues[0]))/2.;
			else
				plus  = (centersValues[1] - centersValues[0])/2.;
		}
65c661e8   Benjamin Renard   Table definition ...
346
		else
ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
347
			plus = NAN;
65c661e8   Benjamin Renard   Table definition ...
348
349
		minus = plus;
	}
f2db3c16   Benjamin Renard   Support variable ...
350
	else if (index == centersValues.size() - 1)
65c661e8   Benjamin Renard   Table definition ...
351
	{
ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
352
353
354
355
356
357
358
		if (!std::isnan(centersValues[centersValues.size() - 1]) && !std::isnan(centersValues[centersValues.size() - 2]))
		{
			if (_log)
				minus = (log10(centersValues[centersValues.size() - 1]) - log10(centersValues[centersValues.size() - 2]))/2.;
			else
				minus = (centersValues[centersValues.size() - 1] - centersValues[centersValues.size() - 2])/2.;
		}
65c661e8   Benjamin Renard   Table definition ...
359
		else
ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
360
			minus = NAN;
65c661e8   Benjamin Renard   Table definition ...
361
362
363
364
365
366
367
		plus  = minus;

	}
	else
	{
		if (_log)
		{
ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
368
369
370
371
372
373
374
375
			if (!std::isnan(centersValues[index]) && !std::isnan(centersValues[index-1]) && (centersValues[index] > 0) && (centersValues[index-1] > 0))
				minus = (log10(centersValues[index]) - log10(centersValues[index-1]))/2.;
			else
				minus = NAN;
			if (!std::isnan(centersValues[index+1]) && !std::isnan(centersValues[index]) && (centersValues[index+1] > 0) && (centersValues[index] > 0))
				plus  = (log10(centersValues[index+1]) - log10(centersValues[index]))/2.;
			else
				plus = NAN;
65c661e8   Benjamin Renard   Table definition ...
376
377
378
		}
		else
		{
ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
379
380
381
382
383
384
385
386
			if (!std::isnan(centersValues[index]) && !std::isnan(centersValues[index-1]))
				minus = (centersValues[index] - centersValues[index-1])/2.;
			else
				minus = NAN;
			if (!std::isnan(centersValues[index+1]) && !std::isnan(centersValues[index]))
				plus  = (centersValues[index+1] - centersValues[index])/2.;
			else
				plus = NAN;
65c661e8   Benjamin Renard   Table definition ...
387
388
389
		}
	}

f2db3c16   Benjamin Renard   Support variable ...
390
391
	if (_log)
	{
ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
392
393
394
395
396
397
398
399
		if (!std::isnan(minus))
			bound.min = exp(log10(centersValues[index]) - minus);
		else
			bound.min = NAN;
		if (!std::isnan(plus))
			bound.max = exp(log10(centersValues[index]) + plus);
		else
			bound.max = NAN;
f2db3c16   Benjamin Renard   Support variable ...
400
401
402
	}
	else
	{
ed9a1eaf   Benjamin Renard   Add Maven STATIC ...
403
404
405
406
407
408
409
410
		if (!std::isnan(minus))
			bound.min = centersValues[index] - minus;
		else
			bound.min = NAN;
		if (!std::isnan(plus))
			bound.max = centersValues[index] + plus;
		else
			bound.max = NAN;
f2db3c16   Benjamin Renard   Support variable ...
411
	}
65c661e8   Benjamin Renard   Table definition ...
412
413
414
415
416
417
418
419
420
421
422

	if (bound.min > bound.max)
	{
		double temp = bound.max;
		bound.max = bound.min;
		bound.min = temp;
	}

	return bound;
}

f2db3c16   Benjamin Renard   Support variable ...
423
424
425
426
std::string ParamMinMaxTable::_minParamKey = "TABLEPARAM_MIN";
std::string ParamMinMaxTable::_maxParamKey = "TABLEPARAM_MAX";

ParamMinMaxTable::ParamMinMaxTable(const char *paramId) : ParamTable(paramId)
fbe3c2bb   Benjamin Renard   First commit
427
428
429
430
431
432
433
434
{
}

/*
 * @brief Get size of the table
 */
int ParamMinMaxTable::getSize(ParameterManager *parameterManager)
{
f2db3c16   Benjamin Renard   Support variable ...
435
436
437
438
439
440
441
442
443
	if (!_variable)
	{
		std::vector<double> minValues = getConstantTableParamValuesByKey(parameterManager, ParamMinMaxTable::_minParamKey);
		return minValues.size();
	}
	else
	{
		return 0;
	}
fbe3c2bb   Benjamin Renard   First commit
444
445
446
447
448
}

/*
 * @brief Get bound for a specified index
 */
f2db3c16   Benjamin Renard   Support variable ...
449
t_TableBound ParamMinMaxTable::getBound(ParameterManager *parameterManager, unsigned int index, std::map<std::string, std::vector<double>>* paramsTableData)
fbe3c2bb   Benjamin Renard   First commit
450
{
fbe3c2bb   Benjamin Renard   First commit
451
452
453
	t_TableBound bound;
	bound.index = index;

f2db3c16   Benjamin Renard   Support variable ...
454
455
	std::vector<double> minValues = getTableParamValuesByKey(parameterManager, paramsTableData, ParamMinMaxTable::_minParamKey);
	std::vector<double> maxValues = getTableParamValuesByKey(parameterManager, paramsTableData, ParamMinMaxTable::_maxParamKey);
fbe3c2bb   Benjamin Renard   First commit
456

f2db3c16   Benjamin Renard   Support variable ...
457
	if ((index >= minValues.size()) || (index >= maxValues.size()))
fbe3c2bb   Benjamin Renard   First commit
458
459
460
461
462
463
464
	{
		LOG4CXX_ERROR(_logger, "Index " << index << " outside of table definition => Cannot get real bound" );
		bound.min = index;
		bound.max = index+1;
		return bound;
	}

f2db3c16   Benjamin Renard   Support variable ...
465
466
	bound.min = std::min(minValues[index], maxValues[index]);
	bound.max = std::max(minValues[index], maxValues[index]);
fbe3c2bb   Benjamin Renard   First commit
467
468
469
470
471
472

	return bound;
}

} /* namespace Info */
} /* namespace AMDA */