/* * MexVexElsDecode.hh * * Created on: Oct 13, 2016 * Author: elena / benjamin */ #ifndef MEXVEXELSDECODE_HH_ #define MEXVEXELSDECODE_HH_ #include "Parameter.hh" #include "ParamData.hh" #include "DataTypeMath.hh" #include "Operation.hh" namespace AMDA { namespace Parameters { namespace MexVexElsDecode { /** * @class MexVexElsDecode * @brief * @details This class implement the interface Operation. */ template class MexVexElsDecode : public Operation { typedef typename TInputParamData::ElementType ElemType; public: /** * @brief Constructor. * @details Create the ParamData type of the input ParamData. */ MexVexElsDecode(Process& pProcess, TInputParamData& paramInput, ParamDataScalaireShort& energyTableInput) : Operation(pProcess), _paramInput(paramInput), _energyTableInput(energyTableInput), _paramOutput(new TOutputParamData()) { _paramDataOutput=_paramOutput; } virtual ~MexVexElsDecode() { } /** * @overload Operation::write(ParamDataIndexInfo &pParamDataIndexInfo) */ void write(ParamDataIndexInfo &pParamDataIndexInfo) { for (unsigned int _index = pParamDataIndexInfo._startIndex ; _index < pParamDataIndexInfo._startIndex + pParamDataIndexInfo._nbDataToProcess; ++_index) { double crtTime = _paramInput.getTime(_index); ElemType inputElt = _paramInput.get(_index); short mode = _energyTableInput.get(_index); if (isNAN(mode)) { _paramOutput->pushTime(crtTime); inputElt << NotANumber(); pushDataForMode0Or2(inputElt); } else if (mode == 1) { for (int i = 0; i < 4; ++i){ _paramOutput->pushTime(crtTime+i); pushDataForMode1 (inputElt, i); } } else if (mode == 0 || mode == 2) { _paramOutput->pushTime(crtTime); pushDataForMode0Or2(inputElt); } } } template void pushDataForMode1(Type& elt, int /*index*/) { _paramOutput->getDataList().push_back((int)elt); } template void pushDataForMode0Or2(Type& elt) { _paramOutput->getDataList().push_back((int)elt); } template void pushDataForMode1(std::vector& elt, int index) { typename std::vector::const_iterator first = elt.begin() + 32 * index; typename std::vector::const_iterator last = elt.begin() + 32 * (index + 1) - 1; std::vector splitVec; splitVec.resize(128); splitVec << NotANumber(); int i = 0; for (typename std::vector::const_iterator it = first; it != last; ++it) { splitVec[i] = (int)(*it); ++i; } _paramOutput->getDataList().push_back(splitVec); } template void pushDataForMode0Or2(std::vector& elt) { std::vector vec; vec.resize(elt.size()); vec << NotANumber(); int i = 0; for (typename std::vector::const_iterator it = elt.begin(); it != elt.end(); ++it) { vec[i] = (int)(*it); ++i; } _paramOutput->getDataList().push_back(vec); } template void pushDataForMode1(Tab2DData& elt, int index) { Tab2DData newElt(elt.getDim1Size(),31); for(int i = 0; i < elt.getDim1Size(); ++i) { std::vector eltVector = elt[i]; typename std::vector::const_iterator first = eltVector.begin() + 32 * index; typename std::vector::const_iterator last = eltVector.begin() + 32 * (index + 1) - 1; std::vector splitVec; splitVec.resize(31); splitVec << NotANumber(); int j = 0; for (typename std::vector::const_iterator it = first; it != last; ++it) { splitVec[j] = (int)(*it); ++j; } newElt[i] = splitVec; } _paramOutput->getDataList().push_back(newElt); } template void pushDataForMode0Or2(Tab2DData& elt) { Tab2DData newElt(elt.getDim1Size(),elt.getDim2Size()); for(int i = 0; i < elt.getDim1Size(); ++i) { std::vector eltVector = elt[i]; std::vector vec; vec.resize(eltVector.size()); vec << NotANumber(); int j = 0; for (typename std::vector::const_iterator it = eltVector.begin(); it != eltVector.end(); ++it) { vec[j] = (int)(*it); ++j; } newElt[i] = vec; } _paramOutput->getDataList().push_back(newElt); } private: /**< * @brief It is the channel of data derived */ TInputParamData& _paramInput; ParamDataScalaireShort& _energyTableInput; /**< * @brief It is the channel of the data derived */ TOutputParamData* _paramOutput; }; } /* namespace MexVexElsDecode */ } /* namespace Parameters */ } /* namespace AMDA */ #endif /* MEXVEXELSDECODE_HH_ */