diff --git a/include/usgscsm/UsgsAstroPlugin.h b/include/usgscsm/UsgsAstroPlugin.h index 0ab4f6cc6b8c6873d933b3566423566a9bc7b363..3536875b04c6ea25bb83e378bcba6e1ae50f9501 100644 --- a/include/usgscsm/UsgsAstroPlugin.h +++ b/include/usgscsm/UsgsAstroPlugin.h @@ -59,6 +59,7 @@ private: typedef csm::Model* (*sensorConstructor)(void); static std::map<std::string, sensorConstructor> MODELS; + std::shared_ptr<spdlog::logger> m_logger; }; #endif diff --git a/include/usgscsm/UsgsAstroSarSensorModel.h b/include/usgscsm/UsgsAstroSarSensorModel.h index 98f436ac892671ab75c2641a16d8c52ded7f6cf4..17e27db6ea2f81731648ede905b021ae4b8df9a9 100644 --- a/include/usgscsm/UsgsAstroSarSensorModel.h +++ b/include/usgscsm/UsgsAstroSarSensorModel.h @@ -5,6 +5,8 @@ #include <SettableEllipsoid.h> #include <CorrelationModel.h> +#include "spdlog/spdlog.h" + class UsgsAstroSarSensorModel : public csm::RasterGM, virtual public csm::SettableEllipsoid { @@ -23,9 +25,9 @@ class UsgsAstroSarSensorModel : public csm::RasterGM, virtual public csm::Settab virtual std::string getModelState() const; - static std::string constructStateFromIsd(const std::string imageSupportData, csm::WarningList *list); + std::string constructStateFromIsd(const std::string imageSupportData, csm::WarningList *list); - static std::string getModelNameFromModelState(const std::string& model_state); + std::string getModelNameFromModelState(const std::string& model_state); virtual csm::ImageCoord groundToImage( const csm::EcefCoord& groundPt, @@ -264,6 +266,8 @@ class UsgsAstroSarSensorModel : public csm::RasterGM, virtual public csm::Settab std::vector<double> m_sunVelocity; double m_wavelength; LookDirection m_lookDirection; + + std::shared_ptr<spdlog::logger> m_logger = spdlog::get("usgscsm_logger"); }; #endif diff --git a/src/UsgsAstroFrameSensorModel.cpp b/src/UsgsAstroFrameSensorModel.cpp index dce4c645f84aecab3cd5de155892f5be64f3a6bf..ca49a6b7d188b9b3477153f2200e10c8dae02284 100644 --- a/src/UsgsAstroFrameSensorModel.cpp +++ b/src/UsgsAstroFrameSensorModel.cpp @@ -31,10 +31,12 @@ const std::string UsgsAstroFrameSensorModel::m_parameterName[] = { }; UsgsAstroFrameSensorModel::UsgsAstroFrameSensorModel() { - reset(); + MESSAGE_LOG("Creating UsgsAstroFrameSensorModel"); + reset(); } void UsgsAstroFrameSensorModel::reset() { + MESSAGE_LOG("Resetting UsgsAstroFrameSensorModel"); m_modelName = _SENSOR_MODEL_NAME; m_platformName = ""; m_sensorName = ""; @@ -161,6 +163,10 @@ csm::ImageCoord UsgsAstroFrameSensorModel::groundToImage( &m_iTransS[0], &m_iTransL[0], line, sample); + + MESSAGE_LOG("Computed groundToImage for {}, {}, {} as line, sample: {}, {}", + groundPt.x, groundPt.y, groundPt.z, line, sample); + return csm::ImageCoord(line, sample); } @@ -169,7 +175,7 @@ csm::ImageCoordCovar UsgsAstroFrameSensorModel::groundToImage(const csm::EcefCoo double desiredPrecision, double *achievedPrecision, csm::WarningList *warnings) const { - MESSAGE_LOG("Computeing groundToImage(Covar) for {}, {}, {}, with desired precision {}", + MESSAGE_LOG("Computing groundToImage(Covar) for {}, {}, {}, with desired precision {}", groundPt.x, groundPt.y, groundPt.z, desiredPrecision); csm::EcefCoord gp; @@ -182,6 +188,8 @@ csm::ImageCoordCovar UsgsAstroFrameSensorModel::groundToImage(const csm::EcefCoo csm::ImageCoordCovar result(ip.line, ip.samp); // This is a partial, incorrect implementation to test if SocetGXP needs // this method implemented in order to load the sensor. + MESSAGE_LOG("Computed groundToImage(Covar) for {}, {}, {}, as line, sample: {}, {}", + groundPt.x, groundPt.y, groundPt.z, ip.line, ip.samp); return result; } @@ -242,6 +250,8 @@ csm::EcefCoord UsgsAstroFrameSensorModel::imageToGround(const csm::ImageCoord &i double x, y, z; losEllipsoidIntersect(height, xc, yc, zc, xl, yl, zl, x, y, z); + MESSAGE_LOG("Resulting EcefCoordinate: {}, {}, {}", x, y, z); + return csm::EcefCoord(x, y, z); } @@ -251,9 +261,12 @@ csm::EcefCoordCovar UsgsAstroFrameSensorModel::imageToGround(const csm::ImageCoo double *achievedPrecision, csm::WarningList *warnings) const { - MESSAGE_LOG("Computeing imageToGround(Covar) for {}, {}, {}, with desired precision {}", + MESSAGE_LOG("Computing imageToGround(Covar) for {}, {}, {}, with desired precision {}", imagePt.line, imagePt.samp, height, desiredPrecision); // This is an incomplete implementation to see if SocetGXP needs this method implemented. + + MESSAGE_LOG("This is an incomplete implementation to see if SocetGXP needs this method implemented"); + csm::EcefCoordCovar result; return result; } @@ -265,7 +278,7 @@ csm::EcefLocus UsgsAstroFrameSensorModel::imageToProximateImagingLocus(const csm double *achievedPrecision, csm::WarningList *warnings) const { // Ignore the ground point? - MESSAGE_LOG("Computeing imageToProximateImagingLocus(No ground) for point {}, {}, {}, with desired precision {}", + MESSAGE_LOG("Computing imageToProximateImagingLocus(No ground) for point {}, {}, {}, with desired precision {}", imagePt.line, imagePt.samp, desiredPrecision); return imageToRemoteImagingLocus(imagePt); } @@ -275,7 +288,7 @@ csm::EcefLocus UsgsAstroFrameSensorModel::imageToRemoteImagingLocus(const csm::I double desiredPrecision, double *achievedPrecision, csm::WarningList *warnings) const { - MESSAGE_LOG("Computeing imageToProximateImagingLocus for {}, {}, {}, with desired precision {}", + MESSAGE_LOG("Computing imageToProximateImagingLocus for {}, {}, {}, with desired precision {}", imagePt.line, imagePt.samp, desiredPrecision); // Find the line,sample on the focal plane (mm) double focalPlaneX, focalPlaneY; @@ -343,6 +356,8 @@ std::pair<csm::ImageCoord, csm::ImageCoord> UsgsAstroFrameSensorModel::getValidI MESSAGE_LOG("Accessing Image Range"); csm::ImageCoord min_pt(m_startingDetectorLine, m_startingDetectorSample); csm::ImageCoord max_pt(m_nLines, m_nSamples); + MESSAGE_LOG("Valid image range: min {}, {} max: {}, {}", min_pt.samp, min_pt.line, + max_pt.samp, max_pt.line) return std::pair<csm::ImageCoord, csm::ImageCoord>(min_pt, max_pt); } @@ -391,6 +406,9 @@ csm::EcefCoord UsgsAstroFrameSensorModel::getSensorPosition(const csm::ImageCoor return sensorPosition; } else { + MESSAGE_LOG("ERROR: UsgsAstroFrameSensorModel::getSensorPosition: " + "Image Coordinate {},{} out of Bounds", + imagePt.line, imagePt.samp); throw csm::Error(csm::Error::BOUNDS, "Image Coordinate out of Bounds", "UsgsAstroFrameSensorModel::getSensorPosition"); @@ -408,6 +426,7 @@ csm::EcefCoord UsgsAstroFrameSensorModel::getSensorPosition(double time) const { return sensorPosition; } else { + MESSAGE_LOG("ERROR: UsgsAstroFrameSensorModel::getSensorPosition: Valid image time is 0.0"); std::string aMessage = "Valid image time is 0.0"; throw csm::Error(csm::Error::BOUNDS, aMessage, @@ -422,6 +441,7 @@ csm::EcefVector UsgsAstroFrameSensorModel::getSensorVelocity(const csm::ImageCoo // Make sure the passed coordinate is with the image dimensions. if (imagePt.samp < 0.0 || imagePt.samp > m_nSamples || imagePt.line < 0.0 || imagePt.line > m_nLines) { + MESSAGE_LOG("ERROR: Image coordinate out of bounds.") throw csm::Error(csm::Error::BOUNDS, "Image coordinate out of bounds.", "UsgsAstroFrameSensorModel::getSensorVelocity"); } @@ -548,7 +568,7 @@ std::vector<csm::RasterGM::SensorPartials> UsgsAstroFrameSensorModel::computeAll desiredPrecision, achievedPrecision, warnings); return computeAllSensorPartials(imagePt, groundPt, pset, desiredPrecision, achievedPrecision, warnings); - } + } std::vector<double> UsgsAstroFrameSensorModel::computeGroundPartials(const csm::EcefCoord &groundPt) const { @@ -643,19 +663,19 @@ void UsgsAstroFrameSensorModel::setImageIdentifier(const std::string& imageId, std::string UsgsAstroFrameSensorModel::getSensorIdentifier() const { - MESSAGE_LOG("Accessing sensor ID"); + MESSAGE_LOG("Accessing sensor ID: {}", m_sensorName); return m_sensorName; } std::string UsgsAstroFrameSensorModel::getPlatformIdentifier() const { - MESSAGE_LOG("Accessing platform ID"); + MESSAGE_LOG("Accessing platform ID: {}", m_platformName); return m_platformName; } std::string UsgsAstroFrameSensorModel::getCollectionIdentifier() const { - MESSAGE_LOG("Accessing collection ID"); + MESSAGE_LOG("Accessing collection ID: {}", m_collectionIdentifier); return m_collectionIdentifier; } @@ -782,9 +802,12 @@ bool UsgsAstroFrameSensorModel::isValidModelState(const std::string& stringState if (!missingKeywords.empty() && warnings) { std::ostringstream oss; std::copy(missingKeywords.begin(), missingKeywords.end(), std::ostream_iterator<std::string>(oss, " ")); + + MESSAGE_LOG("State has missing keywords: {} ", oss.str()); + warnings->push_back(csm::Warning( csm::Warning::DATA_NOT_AVAILABLE, - "State has missing keywrods: " + oss.str(), + "State has missing keywords: " + oss.str(), "UsgsAstroFrameSensorModel::isValidModelState" )); } @@ -792,6 +815,9 @@ bool UsgsAstroFrameSensorModel::isValidModelState(const std::string& stringState std::string modelName = jsonState.value<std::string>("m_modelName", ""); if (modelName != _SENSOR_MODEL_NAME && warnings) { + MESSAGE_LOG("Incorrect model name in state, expected {} but got {}", + _SENSOR_MODEL_NAME, modelName); + warnings->push_back(csm::Warning( csm::Warning::DATA_NOT_AVAILABLE, "Incorrect model name in state, expected " + _SENSOR_MODEL_NAME + " but got " + modelName, @@ -822,7 +848,7 @@ bool UsgsAstroFrameSensorModel::isValidIsd(const std::string& Isd, csm::WarningL void UsgsAstroFrameSensorModel::replaceModelState(const std::string& stringState) { json state = json::parse(stringState); - MESSAGE_LOG("Replaceing model state"); + MESSAGE_LOG("Replacing model state"); // The json library's .at() will except if key is missing try { m_modelName = state.at("m_modelName").get<std::string>(); @@ -856,6 +882,7 @@ void UsgsAstroFrameSensorModel::replaceModelState(const std::string& stringState m_currentParameterCovariance = state.at("m_currentParameterCovariance").get<std::vector<double>>(); } catch(std::out_of_range& e) { + MESSAGE_LOG("State keywords required to generate sensor model missing: " + std::string(e.what()) + "\nUsing model string: " + stringState + "UsgsAstroFrameSensorModel::replaceModelState"); throw csm::Error(csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE, "State keywords required to generate sensor model missing: " + std::string(e.what()) + "\nUsing model string: " + stringState, "UsgsAstroFrameSensorModel::replaceModelState"); @@ -913,6 +940,8 @@ std::string UsgsAstroFrameSensorModel::constructStateFromIsd(const std::string& } if (!positions.empty() && positions.size() != 3) { + MESSAGE_LOG("Sensor position does not have 3 values, " + "UsgsAstroFrameSensorModel::constructStateFromIsd()"); parsingWarnings->push_back( csm::Warning( csm::Warning::DATA_NOT_AVAILABLE, @@ -928,6 +957,8 @@ std::string UsgsAstroFrameSensorModel::constructStateFromIsd(const std::string& // get sensor_velocity if (!velocities.empty() && velocities.size() != 3) { + MESSAGE_LOG("Sensor velocity does not have 3 values, " + "UsgsAstroFrameSensorModel::constructStateFromIsd()"); parsingWarnings->push_back( csm::Warning( csm::Warning::DATA_NOT_AVAILABLE, @@ -975,6 +1006,8 @@ std::string UsgsAstroFrameSensorModel::constructStateFromIsd(const std::string& } if (quaternions.size() != 4) { + MESSAGE_LOG("Sensor quaternion does not have 4 values, " + "UsgsAstroFrameSensorModel::constructStateFromIsd()"); parsingWarnings->push_back( csm::Warning( csm::Warning::DATA_NOT_AVAILABLE, @@ -1032,6 +1065,7 @@ std::string UsgsAstroFrameSensorModel::constructStateFromIsd(const std::string& state["m_transY"][2].get<double>() * state["m_iTransS"][0].get<double>()); } catch (...) { + MESSAGE_LOG("Could not compute detector pixel to focal plane coordinate transformation."); parsingWarnings->push_back( csm::Warning( csm::Warning::DATA_NOT_AVAILABLE, @@ -1053,6 +1087,8 @@ std::string UsgsAstroFrameSensorModel::constructStateFromIsd(const std::string& } delete parsingWarnings; parsingWarnings = nullptr; + MESSAGE_LOG("ISD is invalid for creating the sensor model."); + throw csm::Error(csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE, "ISD is invalid for creating the sensor model.", "UsgsAstroFrameSensorModel::constructStateFromIsd"); diff --git a/src/UsgsAstroPlugin.cpp b/src/UsgsAstroPlugin.cpp index 7933d89f909130d22084df8ccf88192bab892be0..7b6b290cdc8000a67ac994b178a21869e7a64b75 100644 --- a/src/UsgsAstroPlugin.cpp +++ b/src/UsgsAstroPlugin.cpp @@ -25,6 +25,7 @@ using json = nlohmann::json; # define DIR_DELIMITER_STR "/" #endif +#define MESSAGE_LOG(...) if (m_logger) { m_logger->info(__VA_ARGS__); } // Declaration of static variables const std::string UsgsAstroPlugin::_PLUGIN_NAME = "UsgsAstroPluginCSM"; @@ -37,17 +38,17 @@ const UsgsAstroPlugin UsgsAstroPlugin::m_registeredPlugin; UsgsAstroPlugin::UsgsAstroPlugin() { - // Build and register the USGSCSM logger on pluggin creation + // Build and register the USGSCSM logger on plugin creation char * logFilePtr = getenv("ALE_LOG_FILE"); if (logFilePtr != NULL) { std::string logFile(logFilePtr); if (logFile != "") { - std::shared_ptr<spdlog::logger> logger = spdlog::get("usgscsm_logger"); + std::shared_ptr<spdlog::logger> m_logger = spdlog::get("usgscsm_logger"); - if (!logger) { - std::shared_ptr<spdlog::logger> new_logger = spdlog::basic_logger_mt("usgscsm_logger", logFile); + if (!m_logger) { + std::shared_ptr<spdlog::logger> m_logger = spdlog::basic_logger_mt("usgscsm_logger", logFile); } } } @@ -59,26 +60,31 @@ UsgsAstroPlugin::~UsgsAstroPlugin() { std::string UsgsAstroPlugin::getPluginName() const { + MESSAGE_LOG("Get Plugin Name: {}", _PLUGIN_NAME); return _PLUGIN_NAME; } std::string UsgsAstroPlugin::getManufacturer() const { + MESSAGE_LOG("Get Manufacturer Name: {}", _MANUFACTURER_NAME); return _MANUFACTURER_NAME; } std::string UsgsAstroPlugin::getReleaseDate() const { + MESSAGE_LOG("Get Release Date: {}", _RELEASE_DATE); return _RELEASE_DATE; } csm::Version UsgsAstroPlugin::getCsmVersion() const { + MESSAGE_LOG("Get Current CSM Version"); return CURRENT_CSM_VERSION; } size_t UsgsAstroPlugin::getNumModels() const { + MESSAGE_LOG("Get Number of Sensor Models: {}", _N_SENSOR_MODELS); return _N_SENSOR_MODELS; } @@ -89,16 +95,19 @@ std::string UsgsAstroPlugin::getModelName(size_t modelIndex) const { UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME, UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME }; + MESSAGE_LOG("Get Model Name: {}. Used index: {}", supportedModelNames[modelIndex], modelIndex); return supportedModelNames[modelIndex]; } std::string UsgsAstroPlugin::getModelFamily(size_t modelIndex) const { + MESSAGE_LOG("Get Model Familey: {}", CSM_RASTER_FAMILY); return CSM_RASTER_FAMILY; } csm::Version UsgsAstroPlugin::getModelVersion(const std::string &modelName) const { + MESSAGE_LOG("Get Model Version"); return csm::Version(1, 0, 0); } @@ -116,6 +125,7 @@ bool UsgsAstroPlugin::canModelBeConstructedFromState(const std::string &modelNam msg += "] with error ["; msg += e.what(); msg += "]"; + MESSAGE_LOG(msg); if(warnings) { warnings->push_back( csm::Warning( @@ -129,6 +139,7 @@ bool UsgsAstroPlugin::canModelBeConstructedFromState(const std::string &modelNam std::string msg = "Could not create model ["; msg += modelName; msg += "] with an unknown error."; + MESSAGE_LOG(msg); if(warnings) { warnings->push_back( csm::Warning( @@ -155,6 +166,7 @@ bool UsgsAstroPlugin::canModelBeConstructedFromISD(const csm::Isd &imageSupportD msg += "] with error ["; msg += e.what(); msg += "]"; + MESSAGE_LOG(msg); warnings->push_back( csm::Warning( csm::Warning::UNKNOWN_WARNING, @@ -167,6 +179,7 @@ bool UsgsAstroPlugin::canModelBeConstructedFromISD(const csm::Isd &imageSupportD std::string msg = "Could not create model ["; msg += modelName; msg += "] with an unknown error."; + MESSAGE_LOG(msg); warnings->push_back( csm::Warning( csm::Warning::UNKNOWN_WARNING, @@ -190,7 +203,8 @@ std::string UsgsAstroPlugin::loadImageSupportData(const csm::Isd &imageSupportDa lastIndex = baseName.find_last_of(DIR_DELIMITER_STR); std::string filename = baseName.substr(lastIndex + 1); std::string isdFilename = baseName.append(".json"); - + MESSAGE_LOG("Load Image Support Data using: {}, {}, {}, {}, {}", + imageFilename, lastIndex, baseName, filename, isdFilename); try { std::ifstream isd_sidecar(isdFilename); json jsonisd; @@ -205,6 +219,7 @@ std::string UsgsAstroPlugin::loadImageSupportData(const csm::Isd &imageSupportDa errorMessage += "] with error ["; errorMessage += e.what(); errorMessage += "]"; + MESSAGE_LOG(errorMessage); throw csm::Error(csm::Error::FILE_READ, errorMessage, "UsgsAstroPlugin::loadImageSupportData"); } @@ -216,11 +231,12 @@ std::string UsgsAstroPlugin::getModelNameFromModelState(const std::string &model auto state = json::parse(modelState); std::string name = state.value<std::string>("name_model", ""); - + MESSAGE_LOG("Get model name from model state. State: {}, Name: {}", modelState, name); if (name == "") { csm::Error::ErrorType aErrorType = csm::Error::INVALID_SENSOR_MODEL_STATE; std::string aMessage = "No 'name_model' key in the model state object."; std::string aFunction = "UsgsAstroPlugin::getModelNameFromModelState"; + MESSAGE_LOG(aMessage); csm::Error csmErr(aErrorType, aMessage, aFunction); throw(csmErr); } @@ -232,6 +248,7 @@ std::string UsgsAstroPlugin::getModelNameFromModelState(const std::string &model bool UsgsAstroPlugin::canISDBeConvertedToModelState(const csm::Isd &imageSupportData, const std::string &modelName, csm::WarningList *warnings) const { + MESSAGE_LOG("Running canISDBeConvertedToModelState"); try { convertISDToModelState(imageSupportData, modelName, warnings); } @@ -242,6 +259,7 @@ bool UsgsAstroPlugin::canISDBeConvertedToModelState(const csm::Isd &imageSupport msg += "] state with error ["; msg += e.what(); msg += "]"; + MESSAGE_LOG(msg); warnings->push_back( csm::Warning( csm::Warning::UNKNOWN_WARNING, @@ -255,16 +273,18 @@ bool UsgsAstroPlugin::canISDBeConvertedToModelState(const csm::Isd &imageSupport std::string UsgsAstroPlugin::getStateFromISD(csm::Isd imageSupportData) const { - std::string stringIsd = loadImageSupportData(imageSupportData); - json jsonIsd = json::parse(stringIsd); - return convertISDToModelState(imageSupportData, jsonIsd.at("name_model")); + MESSAGE_LOG("Running getStateFromISD"); + std::string stringIsd = loadImageSupportData(imageSupportData); + MESSAGE_LOG("ISD string: {}", stringIsd); + json jsonIsd = json::parse(stringIsd); + return convertISDToModelState(imageSupportData, jsonIsd.at("name_model")); } std::string UsgsAstroPlugin::convertISDToModelState(const csm::Isd &imageSupportData, const std::string &modelName, csm::WarningList *warnings) const { - + MESSAGE_LOG("Running convertISDToModelState"); csm::Model* sensor_model = constructModelFromISD(imageSupportData, modelName, warnings); return sensor_model->getModelState(); } @@ -273,97 +293,108 @@ std::string UsgsAstroPlugin::convertISDToModelState(const csm::Isd &imageSupport csm::Model *UsgsAstroPlugin::constructModelFromISD(const csm::Isd &imageSupportDataOriginal, const std::string &modelName, csm::WarningList *warnings) const { - std::string stringIsd = loadImageSupportData(imageSupportDataOriginal); - - if (modelName == UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME) { - UsgsAstroFrameSensorModel *model = new UsgsAstroFrameSensorModel(); - try { - model->replaceModelState(model->constructStateFromIsd(stringIsd, warnings)); - std::shared_ptr<spdlog::logger> logger = model->getLogger(); - if (logger) { - logger->info("Constructed model: {}", modelName); - } - } - catch (std::exception& e) { - csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE; - std::string aMessage = "Could not construct model ["; - aMessage += modelName; - aMessage += "] with error ["; - aMessage += e.what(); - aMessage += "]"; - std::string aFunction = "UsgsAstroPlugin::constructModelFromISD()"; - throw csm::Error(aErrorType, aMessage, aFunction); - } - return model; + MESSAGE_LOG("Running constructModelFromISD"); + std::string stringIsd = loadImageSupportData(imageSupportDataOriginal); + + MESSAGE_LOG("ISD String: {}", stringIsd); + if (modelName == UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME) { + UsgsAstroFrameSensorModel *model = new UsgsAstroFrameSensorModel(); + try { + MESSAGE_LOG("Trying to construct a UsgsAstroFrameSensorModel"); + model->replaceModelState(model->constructStateFromIsd(stringIsd, warnings)); + MESSAGE_LOG("Constructed model: {}", modelName); } - else if (modelName == UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME) { - UsgsAstroLsSensorModel *model = new UsgsAstroLsSensorModel(); - try { - model->replaceModelState(model->constructStateFromIsd(stringIsd, warnings)); - } - catch (std::exception& e) { - csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE; - std::string aMessage = "Could not construct model ["; - aMessage += modelName; - aMessage += "] with error ["; - aMessage += e.what(); - aMessage += "]"; - std::string aFunction = "UsgsAstroPlugin::constructModelFromISD()"; - throw csm::Error(aErrorType, aMessage, aFunction); - } - return model; + catch (std::exception& e) { + csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE; + std::string aMessage = "Could not construct model ["; + aMessage += modelName; + aMessage += "] with error ["; + aMessage += e.what(); + aMessage += "]"; + MESSAGE_LOG(aMessage); + std::string aFunction = "UsgsAstroPlugin::constructModelFromISD()"; + throw csm::Error(aErrorType, aMessage, aFunction); } - else if (modelName == UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME) { - UsgsAstroSarSensorModel *model = new UsgsAstroSarSensorModel(); - try { - model->replaceModelState(model->constructStateFromIsd(stringIsd, warnings)); - } - catch (std::exception& e) { - csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE; - std::string aMessage = "Could not construct model ["; - aMessage += modelName; - aMessage += "] with error ["; - aMessage += e.what(); - aMessage += "]"; - std::string aFunction = "UsgsAstroPlugin::constructModelFromISD()"; - throw csm::Error(aErrorType, aMessage, aFunction); - } - return model; + return model; + } + else if (modelName == UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME) { + UsgsAstroLsSensorModel *model = new UsgsAstroLsSensorModel(); + try { + MESSAGE_LOG("Trying to construct a UsgsAstroLsSensorModel"); + model->replaceModelState(model->constructStateFromIsd(stringIsd, warnings)); + } + catch (std::exception& e) { + csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE; + std::string aMessage = "Could not construct model ["; + aMessage += modelName; + aMessage += "] with error ["; + aMessage += e.what(); + aMessage += "]"; + std::string aFunction = "UsgsAstroPlugin::constructModelFromISD()"; + MESSAGE_LOG(aMessage); + throw csm::Error(aErrorType, aMessage, aFunction); } - else { - csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_SUPPORTED; - std::string aMessage = "Model [" + modelName + "] not supported: "; + return model; + } + else if (modelName == UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME) { + UsgsAstroSarSensorModel *model = new UsgsAstroSarSensorModel(); + MESSAGE_LOG("Trying to construct a UsgsAstroSarSensorModel"); + try { + model->replaceModelState(model->constructStateFromIsd(stringIsd, warnings)); + } + catch (std::exception& e) { + csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE; + std::string aMessage = "Could not construct model ["; + aMessage += modelName; + aMessage += "] with error ["; + aMessage += e.what(); + aMessage += "]"; std::string aFunction = "UsgsAstroPlugin::constructModelFromISD()"; + MESSAGE_LOG(aMessage); throw csm::Error(aErrorType, aMessage, aFunction); } + return model; + } + else { + csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_SUPPORTED; + std::string aMessage = "Model [" + modelName + "] not supported: "; + std::string aFunction = "UsgsAstroPlugin::constructModelFromISD()"; + MESSAGE_LOG(aMessage); + throw csm::Error(aErrorType, aMessage, aFunction); + } } csm::Model *UsgsAstroPlugin::constructModelFromState(const std::string& modelState, csm::WarningList *warnings) const { - - json state = json::parse(modelState); - std::string modelName = state["m_modelName"]; - - if (modelName == UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME) { - UsgsAstroFrameSensorModel* model = new UsgsAstroFrameSensorModel(); - model->replaceModelState(modelState); - return model; - } - else if (modelName == UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME) { - UsgsAstroLsSensorModel* model = new UsgsAstroLsSensorModel(); - model->replaceModelState(modelState); - return model; - } - else if (modelName == UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME) { - UsgsAstroSarSensorModel* model = new UsgsAstroSarSensorModel(); - model->replaceModelState(modelState); - return model; - } - else { - csm::Error::ErrorType aErrorType = csm::Error::ISD_NOT_SUPPORTED; - std::string aMessage = "Model" + modelName + " not supported: "; - std::string aFunction = "UsgsAstroPlugin::constructModelFromState()"; - throw csm::Error(aErrorType, aMessage, aFunction); - } + MESSAGE_LOG("Runing constructModelFromState with modelState: {}", modelState); + json state = json::parse(modelState); + std::string modelName = state["m_modelName"]; + MESSAGE_LOG("Using model name: {}", modelName); + + if (modelName == UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME) { + MESSAGE_LOG("Constructing a UsgsAstroFrameSensorModel"); + UsgsAstroFrameSensorModel* model = new UsgsAstroFrameSensorModel(); + model->replaceModelState(modelState); + return model; + } + else if (modelName == UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME) { + MESSAGE_LOG("Constructing a UsgsAstroLsSensorModel"); + UsgsAstroLsSensorModel* model = new UsgsAstroLsSensorModel(); + model->replaceModelState(modelState); + return model; + } + else if (modelName == UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME) { + MESSAGE_LOG("Constructing a UsgsAstroSarSensorModel"); + UsgsAstroSarSensorModel* model = new UsgsAstroSarSensorModel(); + model->replaceModelState(modelState); + return model; + } + else { + csm::Error::ErrorType aErrorType = csm::Error::ISD_NOT_SUPPORTED; + std::string aMessage = "Model" + modelName + " not supported: "; + std::string aFunction = "UsgsAstroPlugin::constructModelFromState()"; + MESSAGE_LOG(aMessage); + throw csm::Error(aErrorType, aMessage, aFunction); + } } diff --git a/src/UsgsAstroSarSensorModel.cpp b/src/UsgsAstroSarSensorModel.cpp index 87745417ea17ebc49e5c05b3356810c9152c5fd7..b1fff63392741bdf5a88c2b8012748c0602f0668 100644 --- a/src/UsgsAstroSarSensorModel.cpp +++ b/src/UsgsAstroSarSensorModel.cpp @@ -11,7 +11,7 @@ using json = nlohmann::json; using namespace std; -#define MESSAGE_LOG(logger, ...) if (logger) { logger->info(__VA_ARGS__); } +#define MESSAGE_LOG(...) if (m_logger) { m_logger->info(__VA_ARGS__); } const string UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME = "USGS_ASTRO_SAR_SENSOR_MODEL"; const int UsgsAstroSarSensorModel::NUM_PARAMETERS = 6; @@ -44,8 +44,9 @@ const csm::param::Type string UsgsAstroSarSensorModel::constructStateFromIsd( const string imageSupportData, - csm::WarningList *warnings) -{ + csm::WarningList *warnings){ + + MESSAGE_LOG("UsgsAstroSarSensorModel constructing state from ISD, with {}", imageSupportData); json isd = json::parse(imageSupportData); json state = {}; @@ -76,10 +77,12 @@ string UsgsAstroSarSensorModel::constructStateFromIsd( state["m_dtEphem"] = isd.at("dt_ephemeris"); } catch(...) { + std::string msg = "dt_ephemeris not in ISD"; + MESSAGE_LOG(msg); parsingWarnings->push_back( csm::Warning( csm::Warning::DATA_NOT_AVAILABLE, - "dt_ephemeris not in ISD", + msg, "UsgsAstroSarSensorModel::constructStateFromIsd()")); } @@ -87,10 +90,12 @@ string UsgsAstroSarSensorModel::constructStateFromIsd( state["m_t0Ephem"] = isd.at("t0_ephemeris"); } catch(...) { + std::string msg = "t0_ephemeris not in ISD"; + MESSAGE_LOG(msg); parsingWarnings->push_back( csm::Warning( csm::Warning::DATA_NOT_AVAILABLE, - "t0_ephemeris not in ISD", + msg, "UsgsAstroSarSensorModel::constructStateFromIsd()")); } @@ -135,6 +140,7 @@ string UsgsAstroSarSensorModel::constructStateFromIsd( message += "]"; parsingWarnings = nullptr; delete parsingWarnings; + MESSAGE_LOG(message); throw csm::Error(csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE, message, "UsgsAstroSarSensorModel::constructStateFromIsd"); @@ -148,40 +154,41 @@ string UsgsAstroSarSensorModel::constructStateFromIsd( return state.dump(); } -string UsgsAstroSarSensorModel::getModelNameFromModelState(const string& model_state) -{ - // Parse the string to JSON - auto j = json::parse(model_state); - // If model name cannot be determined, return a blank string - string model_name; - - if (j.find("m_modelName") != j.end()) { - model_name = j["m_modelName"]; - } else { - csm::Error::ErrorType aErrorType = csm::Error::INVALID_SENSOR_MODEL_STATE; - string aMessage = "No 'm_modelName' key in the model state object."; - string aFunction = "UsgsAstroSarSensorModel::getModelNameFromModelState"; - csm::Error csmErr(aErrorType, aMessage, aFunction); - throw(csmErr); - } - if (model_name != _SENSOR_MODEL_NAME){ - csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_SUPPORTED; - string aMessage = "Sensor model not supported."; - string aFunction = "UsgsAstroSarSensorModel::getModelNameFromModelState()"; - csm::Error csmErr(aErrorType, aMessage, aFunction); - throw(csmErr); - } - return model_name; - -} - -UsgsAstroSarSensorModel::UsgsAstroSarSensorModel() -{ +string UsgsAstroSarSensorModel::getModelNameFromModelState(const string& model_state) { + MESSAGE_LOG("Getting model name from model state: {}", model_state); + // Parse the string to JSON + auto j = json::parse(model_state); + // If model name cannot be determined, return a blank string + string model_name; + + if (j.find("m_modelName") != j.end()) { + model_name = j["m_modelName"]; + } else { + csm::Error::ErrorType aErrorType = csm::Error::INVALID_SENSOR_MODEL_STATE; + string aMessage = "No 'm_modelName' key in the model state object."; + string aFunction = "UsgsAstroSarSensorModel::getModelNameFromModelState"; + MESSAGE_LOG(aMessage); + csm::Error csmErr(aErrorType, aMessage, aFunction); + throw(csmErr); + } + if (model_name != _SENSOR_MODEL_NAME){ + csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_SUPPORTED; + string aMessage = "Sensor model not supported."; + string aFunction = "UsgsAstroSarSensorModel::getModelNameFromModelState()"; + MESSAGE_LOG(aMessage); + csm::Error csmErr(aErrorType, aMessage, aFunction); + throw(csmErr); + } + return model_name; +} + +UsgsAstroSarSensorModel::UsgsAstroSarSensorModel() { + MESSAGE_LOG("Constructing UsgsAstroSarSensorModel"); reset(); } -void UsgsAstroSarSensorModel::reset() -{ +void UsgsAstroSarSensorModel::reset() { + MESSAGE_LOG("Resetting UsgsAstroSarSensorModel"); m_imageIdentifier = "Unknown"; m_sensorName = "Unknown"; m_platformIdentifier = "Unknown"; @@ -218,10 +225,10 @@ void UsgsAstroSarSensorModel::reset() m_wavelength = 0; } -void UsgsAstroSarSensorModel::replaceModelState(const string& argState) -{ +void UsgsAstroSarSensorModel::replaceModelState(const string& argState){ reset(); - + + MESSAGE_LOG("Replacing model state with: {}", argState); auto stateJson = json::parse(argState); m_imageIdentifier = stateJson["m_imageIdentifier"].get<string>(); @@ -240,6 +247,7 @@ void UsgsAstroSarSensorModel::replaceModelState(const string& argState) } else { std::string message = "Could not determine look direction from state"; + MESSAGE_LOG(message); throw csm::Error(csm::Error::INVALID_SENSOR_MODEL_STATE, message, "UsgsAstroSarSensorModel::replaceModelState"); @@ -269,8 +277,7 @@ void UsgsAstroSarSensorModel::replaceModelState(const string& argState) m_sunVelocity = stateJson["m_sunVelocity"].get<vector<double>>(); } -string UsgsAstroSarSensorModel::getModelState() const -{ +string UsgsAstroSarSensorModel::getModelState() const { json state = {}; state["m_modelName"] = _SENSOR_MODEL_NAME; @@ -310,6 +317,7 @@ string UsgsAstroSarSensorModel::getModelState() const } else { std::string message = "Could not parse look direction from json state."; + MESSAGE_LOG(message); throw csm::Error(csm::Error::INVALID_SENSOR_MODEL_STATE, message, "UsgsAstroSarSensorModel::getModelState"); @@ -329,8 +337,8 @@ csm::ImageCoord UsgsAstroSarSensorModel::groundToImage( double* achievedPrecision, csm::WarningList* warnings) const { - //MESSAGE_LOG(this->m_logger, "Computing groundToImage(ImageCoord) for {}, {}, {}, with desired precision {}", - // groundPt.x, groundPt.y, groundPt.z, desiredPrecision); + MESSAGE_LOG("Computing groundToImage(ImageCoord) for {}, {}, {}, with desired precision {}", + groundPt.x, groundPt.y, groundPt.z, desiredPrecision); // Find time of closest approach to groundPt and the corresponding slant range by finding // the root of the doppler shift frequency @@ -351,6 +359,7 @@ csm::ImageCoord UsgsAstroSarSensorModel::groundToImage( std::string message = "Could not calculate groundToImage, with error ["; message += error.what(); message += "]"; + MESSAGE_LOG(message); throw csm::Error(csm::Error::UNKNOWN_ERROR, message, "groundToImage"); } } @@ -358,19 +367,20 @@ csm::ImageCoord UsgsAstroSarSensorModel::groundToImage( // Calculate the root double UsgsAstroSarSensorModel::dopplerShift( csm::EcefCoord groundPt, - double tolerance) const -{ - csm::EcefVector groundVec(groundPt.x ,groundPt.y, groundPt.z); - std::function<double(double)> dopplerShiftFunction = [this, groundVec](double time) { - csm::EcefVector spacecraftPosition = getSpacecraftPosition(time); - csm::EcefVector spacecraftVelocity = getSensorVelocity(time); - csm::EcefVector lookVector = spacecraftPosition - groundVec; - - double slantRange = norm(lookVector); - - double dopplerShift = -2.0 * dot(lookVector, spacecraftVelocity) / (slantRange * m_wavelength); - - return dopplerShift; + double tolerance) const { + MESSAGE_LOG("Calculating doppler shift with: {}, {}, {}, and tolerance {}.", + groundPt.x, groundPt.y, groundPt.z, tolerance); + csm::EcefVector groundVec(groundPt.x ,groundPt.y, groundPt.z); + std::function<double(double)> dopplerShiftFunction = [this, groundVec](double time) { + csm::EcefVector spacecraftPosition = getSpacecraftPosition(time); + csm::EcefVector spacecraftVelocity = getSensorVelocity(time); + csm::EcefVector lookVector = spacecraftPosition - groundVec; + + double slantRange = norm(lookVector); + + double dopplerShift = -2.0 * dot(lookVector, spacecraftVelocity) / (slantRange * m_wavelength); + + return dopplerShift; }; // Do root-finding for "dopplerShift" @@ -379,8 +389,9 @@ double UsgsAstroSarSensorModel::dopplerShift( double UsgsAstroSarSensorModel::slantRange(csm::EcefCoord surfPt, - double time) const -{ + double time) const { + MESSAGE_LOG("Calculating slant range with: {}, {}, {}, and time {}.", + surfPt.x, surfPt.y, surfPt.z, time); csm::EcefVector surfVec(surfPt.x ,surfPt.y, surfPt.z); csm::EcefVector spacecraftPosition = getSpacecraftPosition(time); return norm(spacecraftPosition - surfVec); @@ -390,8 +401,10 @@ double UsgsAstroSarSensorModel::slantRangeToGroundRange( const csm::EcefCoord& groundPt, double time, double slantRange, - double tolerance) const -{ + double tolerance) const { + MESSAGE_LOG("Calculating slant range to ground range with: {}, {}, {}, {}, {}, {}", + groundPt.x, groundPt.y, groundPt.z, time, slantRange, tolerance); + std::vector<double> coeffs = getRangeCoefficients(time); // Calculates the ground range from the slant range. @@ -415,8 +428,7 @@ double UsgsAstroSarSensorModel::slantRangeToGroundRange( return brentRoot(minGroundRangeGuess, maxGroundRangeGuess, slantRangeToGroundRangeFunction, tolerance); } -double UsgsAstroSarSensorModel::groundRangeToSlantRange(double groundRange, const std::vector<double> &coeffs) const -{ +double UsgsAstroSarSensorModel::groundRangeToSlantRange(double groundRange, const std::vector<double> &coeffs) const { return coeffs[0] + groundRange * (coeffs[1] + groundRange * (coeffs[2] + groundRange * coeffs[3])); } @@ -425,8 +437,9 @@ csm::ImageCoordCovar UsgsAstroSarSensorModel::groundToImage( const csm::EcefCoordCovar& groundPt, double desiredPrecision, double* achievedPrecision, - csm::WarningList* warnings) const -{ + csm::WarningList* warnings) const { + MESSAGE_LOG("Calculating groundToImage with: {}, {}, {}, {}", groundPt.x, groundPt.y, groundPt.z, + desiredPrecision); // Ground to image with error propagation // Compute corresponding image point csm::EcefCoord gp(groundPt); @@ -489,8 +502,9 @@ csm::EcefCoord UsgsAstroSarSensorModel::imageToGround( double height, double desiredPrecision, double* achievedPrecision, - csm::WarningList* warnings) const -{ + csm::WarningList* warnings) const { + MESSAGE_LOG("Calculating imageToGround with: {}, {}, {}, {}", imagePt.samp, imagePt.line, height, + desiredPrecision); double time = m_startingEphemerisTime + (imagePt.line - 0.5) * m_exposureDuration; double groundRange = imagePt.samp * m_scaledPixelWidth; std::vector<double> coeffs = getRangeCoefficients(time); @@ -544,8 +558,9 @@ csm::EcefCoordCovar UsgsAstroSarSensorModel::imageToGround( double heightVariance, double desiredPrecision, double* achievedPrecision, - csm::WarningList* warnings) const -{ + csm::WarningList* warnings) const { + MESSAGE_LOG("Calculating imageToGroundWith: {}, {}, {}, {}, {}", imagePt.samp, imagePt.line, + height, heightVariance, desiredPrecision); // Image to ground with error propagation // Use numerical partials const double DELTA_IMAGE = 1.0; @@ -624,8 +639,7 @@ csm::EcefLocus UsgsAstroSarSensorModel::imageToProximateImagingLocus( const csm::EcefCoord& groundPt, double desiredPrecision, double* achievedPrecision, - csm::WarningList* warnings) const -{ + csm::WarningList* warnings) const { // Compute the slant range double time = m_startingEphemerisTime + (imagePt.line - 0.5) * m_exposureDuration; double groundRange = imagePt.samp * m_scaledPixelWidth; diff --git a/tests/SarTests.cpp b/tests/SarTests.cpp index 60a859c9d4ec85d1491c169d7e3bfa00038bc050..9180650e691e034b959f3b0442ef2e6a93feb365 100644 --- a/tests/SarTests.cpp +++ b/tests/SarTests.cpp @@ -15,7 +15,7 @@ using json = nlohmann::json; -TEST(SarTests, stateFromIsd) { +TEST_F(SarSensorModel, stateFromIsd) { std::ifstream isdFile("data/orbitalSar.json"); json isdJson; isdFile >> isdJson; @@ -23,7 +23,7 @@ TEST(SarTests, stateFromIsd) { csm::WarningList warnings; std::string stateString; try { - stateString = UsgsAstroSarSensorModel::constructStateFromIsd(isdString, &warnings); + stateString = sensorModel->constructStateFromIsd(isdString, &warnings); } catch(...) { for (auto &warn: warnings) {