/** * SpiceKernelMgr.hh * * Created on: 08 jul. 2016 * Author: AKKA IS */ #ifndef SPICEKERNELMGR_HH_ #define SPICEKERNELMGR_HH_ #include <string> #include "dsgpatt_Singleton.hh" #include "SpiceKernelConfig.hh" #include "SpiceKernelLogger.hh" namespace AMDA { namespace SpiceKernel { /** * @class SpiceKernelMgr * @brief Singleton to manage spice kernel * @details */ class SpiceKernelMgr : public ::Singleton<SpiceKernelMgr> { public: template<typename T> bool transform(const char* fromFrame, const char* toFrame, bool isPosition, double time, const std::vector<T>& input, std::vector<T>& output) { if (!SpiceKernelMgr::getInstance()->loadDataFilesForFrameName(fromFrame)) { LOG4CXX_ERROR(gLogger, "SpiceKernelMgr::transform - Error to load data files for frame " << fromFrame); return false; } if (!SpiceKernelMgr::getInstance()->loadDataFilesForFrameName(toFrame)) { LOG4CXX_ERROR(gLogger, "SpiceKernelMgr::transform - Error to load data files for frame " << toFrame); return false; } double et = timeStampToEt(time); double rotation[3][3]; if (!getRotationMatrix(fromFrame, toFrame, et, rotation)) return false; double translation[3] = {0,0,0}; if (!getTranslation(fromFrame, toFrame, isPosition, et, translation)) return false; double vin[3] = {(double)input[0] - translation[0], (double)input[1] - translation[1], (double)input[2] - translation[2]}; double vout[3]; if (!computeTransformation(vin, translation, rotation, vout)) return false; output.reserve(3); output[0] = (T)vout[0]; output[1] = (T)vout[1]; output[2] = (T)vout[2]; return true; } double timeStampToEt(double timeStamp); double timeStampToJulianDate(double timeStamp); protected: friend class ::Singleton<SpiceKernelMgr>; SpiceKernelMgr(); virtual ~SpiceKernelMgr(); private: void loadConfig(); int getBodyCenterFromFrameName(const char *frameName); int getFrameIdFromFrameName(const char *frameName); bool isDataFileLoaded(const char* filePath); bool loadListOfDataFiles(std::list<std::string> dataFilesList); bool loadDataFilesForFrameName(const char *frameName); bool loadGenericDataFiles(); bool getRotationMatrix(const char* fromFrame, const char* toChar, double et, double rotate[3][3]); bool getTranslation(const char* fromFrame, const char* toFrame, bool isPosition, double et, double translation[3]); bool computeTransformation(double input[3], double translation[3], double rotation[3][3], double output[3]); bool _genericDataFilesLoaded; boost::shared_ptr<SpiceKernelConfig> _config; std::list<std::string> _loadedDataFiles; std::list<std::string> _DataFilesLoadedForFrameName; std::map<std::string, int> _bodyCenterFromFrameNameMap; std::map<std::string, int> _frameIdFromFrameNameMap; }; } /* SpiceKernelMgr */ } /* AMDA */ #endif // SPICEKERNELMGR_HH_