/* * ParamInfo.cc * * Created on: Oct 8, 2014 * Author: m.mazel */ #include "ParamInfo.hh" #include "Parameter.hh" #include "Process.hh" #include <vector> #include <string> #include <algorithm> #include <sstream> #include <iterator> #include <iostream> namespace AMDA { namespace Info { std::ostream& operator<<(std::ostream& out, const ParamInfo& pi){ out << "[ParamInfo]" << std::endl; out << "{"<<std::endl; out << " _id = " << pi._id << std::endl; out << " _name = " << pi._name << std::endl; out << " _short_name = " << pi._short_name << std::endl; out << " _components = " << pi._components << std::endl; out << " _units = " << pi._units << std::endl; out << " _coordinates_system = " << pi._coordinates_system << std::endl; out << " _tensor_order = " << pi._tensor_order << std::endl; out << " _si_conversion = " << pi._si_conversion << std::endl; out << " _fill_value = " << pi._fill_value << std::endl; out << " _ucd = " << pi._ucd << std::endl; out << " _statusDef = "; for (auto status : pi._statusDef) out << "[" << status.getMinValue() << ", " << status.getMaxValue() << ", " << status.getName() << "]," << std::endl; out << " _processInfo = " << pi._processInfo << std::endl; out << " _processDesc = " << pi._processDesc << std::endl; out << " _linkedParamList = "; for (auto linkedParam : pi._linkedParamList) out << linkedParam << ", "; out << std::endl; out << " _dataset_id = " << pi._dataset_id << std::endl; out << " _instrument_id = " << pi._dataset_id << std::endl; out << "}" << std::endl; return out; } #define PUSHINFO(infoMap, key, value) if(!value.empty())infoMap.push_back(std::pair<std::string,std::string>(key,value)) std::vector<std::pair<std::string,std::string>> ParamInfo::getInfoMap(ParameterManager * parameterManager) { std::vector<std::pair<std::string,std::string>> infoMap; PUSHINFO(infoMap, PARAMETER_ID, getId()); PUSHINFO(infoMap, PARAMETER_NAME,getName()); PUSHINFO(infoMap, PARAMETER_SHORT_NAME,getShortName()); if (getProcessInfo().empty() ) { //not a processed param PUSHINFO(infoMap, PARAMETER_COMPONENTS, getComponents()); PUSHINFO(infoMap, PARAMETER_UNITS, getUnits()); PUSHINFO(infoMap, PARAMETER_COORDSYS, getCoordinatesSystem()); std::stringstream tensorOrder; tensorOrder << getTensorOrder(); PUSHINFO(infoMap, PARAMETER_TENSOR, tensorOrder.str()); PUSHINFO(infoMap, PARAMETER_SICONV, getSiConversion()); std::stringstream fillVal; fillVal << getFillValue(); PUSHINFO(infoMap, PARAMETER_FILLVALUE, fillVal.str()); PUSHINFO(infoMap, PARAMETER_UCD, getUcd()); //push status if defined if (!_statusDef.empty()) { for (int i = 0; i < (int)_statusDef.size(); ++i) { std::stringstream statusIndex; statusIndex << i; std::stringstream crtVal; std::stringstream infoKey; infoKey.str(""); infoKey << PARAMETER_STATUS_NAME << "[" << statusIndex.str() << "]"; PUSHINFO(infoMap, infoKey.str(),_statusDef[i].getName()); infoKey.str(""); infoKey << PARAMETER_STATUS_MIN << "[" << statusIndex.str() << "]"; crtVal.str(""); crtVal << _statusDef[i].getMinValue(); PUSHINFO(infoMap, infoKey.str(),crtVal.str()); infoKey.str(""); infoKey << PARAMETER_STATUS_MAX << "[" << statusIndex.str() << "]"; crtVal.str(""); crtVal << _statusDef[i].getMaxValue(); PUSHINFO(infoMap, infoKey.str(),crtVal.str()); } } if (_tables.empty()) { //no table defined //PUSHINFO(infoMap, PARAMETER_TABLE, std::string("None")); } else { //push tables definition for (auto table : _tables) { table.second->addTableInfo(parameterManager, table.first, infoMap); } } //adjout des info de tables ParameterSPtr param = parameterManager->getParameter(getId()); std::map<std::string, boost::shared_ptr<std::vector<double>>> infoList =param->getInfoList(); if(! infoList.empty()){ for (auto inf : infoList){ if(! inf.second->empty()){ std::ostringstream values; // Convert all but the last element to avoid a trailing "," std::copy(inf.second->begin(), inf.second->end()-1, std::ostream_iterator<double>(values, ",")); // Now add the last element with no delimiter values<< inf.second->back(); std::stringstream infoKey; infoKey.str(""); infoKey << PARAMETER_INFO<< "[" << inf.first << "]"; PUSHINFO(infoMap , infoKey.str() , values.str()); } } } } else { //processed parameter PUSHINFO(infoMap, PARAMETER_PROCESS_INFO, getProcessInfo()); PUSHINFO(infoMap, PARAMETER_PROCESS_DESC, getProcessDescription()); std::stringstream linkedParam; bool isFirst = true; for (auto param : _linkedParamList) { if (!isFirst) linkedParam << ","; isFirst = false; linkedParam << param; } PUSHINFO(infoMap, PARAMETER_LINKED_PARAM, linkedParam.str()); ParameterSPtr pParam = parameterManager->getParameter(getId()); Process* lProcess = dynamic_cast<Process*>(pParam->getDataWriterTemplate().get()); if( lProcess != NULL){ std::list<std::string>clbList= lProcess->getUsedClbInfo(); if(! clbList.empty()){ std::map<std::string, boost::shared_ptr<std::vector<double>>> infoList =pParam->getInfoList(); if(! infoList.empty()){ for (auto inf : infoList){ if(! inf.second->empty() && (std::find(clbList.begin(), clbList.end(), inf.first) != clbList.end())) { std::ostringstream values; // Convert all but the last element to avoid a trailing "," std::copy(inf.second->begin(), inf.second->end()-1, std::ostream_iterator<double>(values, ",")); // Now add the last element with no delimiter values<< inf.second->back(); std::stringstream infoKey; infoKey.str(""); infoKey << PARAMETER_INFO<< "[" << inf.first << "]"; PUSHINFO(infoMap , infoKey.str() , values.str()); } } } } } //Process* lProcess = ServicesServer::getInstance()->getProcess("sampling_classic", ¶m); } return infoMap; } } /* namespace Info */ } /* namespace AMDA */