ParamInfo.cc 10.8 KB
/*
 * 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())
		{
			//push tables definition
                                                            PUSHINFO(infoMap,TABLES_DESCRIPTION ,std::string(" ")); 
			for (auto table : _tables)
			{
                                                                 if(table.second != nullptr)
                                                                      table.second->addTableInfo(parameterManager, table.first, infoMap);
                                                            }
		}
                                        ParameterSPtr param = parameterManager->getParameter(getId());
                                        AMDA::Parameters::SemiVariableTable semiVariableTable = param->getSemiVariableTable();
                                        if(! semiVariableTable.tabHeader.empty()){
                                            std::stringstream head; 
                                            head.str("");
                                            head<<"mode"<<" ";
                                            for (auto h :semiVariableTable.tabHeader){
                                                head<<h<<" ";
                                            }
                                            PUSHINFO(infoMap, "",head.str());
                                        }
                                        for(auto v:semiVariableTable.tabValues){
                                            std::ostringstream values;
                                            values<<std::to_string(v.first)<<" ";
                                                             // Convert all doubles to string ","
                                                             std::copy(v.second.begin(), v.second.end(),
                                                              std::ostream_iterator<double>(values, " "));
                                                           PUSHINFO(infoMap, "",values.str());
                                                           values.str("");
                                        }
                                        
                
                                        //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()){
                                                    //Adding descripion of table info 
                                                    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());
                                                                		
                                         if (!_tables.empty())
		{
                                                             PUSHINFO(infoMap,TABLES_DESCRIPTION ,std::string(" "));
			//push tables definition
			for (auto table : _tables)
			{
                                                                 if(table.second != nullptr)
                                                                      table.second->addTableInfo(parameterManager, table.first, infoMap);
                                                            }
		}
	/**
                                        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", &param);
                    }

	return infoMap;
}

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