diff --git a/include/usgscsm/UsgsAstroSarSensorModel.h b/include/usgscsm/UsgsAstroSarSensorModel.h index f7cba8dbec338f74739768d55c8b3522f0cdd5b6..3855911d171b88928cd8559a1eb74ee2097f141a 100644 --- a/include/usgscsm/UsgsAstroSarSensorModel.h +++ b/include/usgscsm/UsgsAstroSarSensorModel.h @@ -9,6 +9,10 @@ class UsgsAstroSarSensorModel : public csm::RasterGM, virtual public csm::Settab { public: + enum LookDirection { + LEFT = 0, + RIGHT = 1 + }; UsgsAstroSarSensorModel(); ~UsgsAstroSarSensorModel() {} @@ -249,6 +253,7 @@ class UsgsAstroSarSensorModel : public csm::RasterGM, virtual public csm::Settab std::vector<double> m_sunPosition; std::vector<double> m_sunVelocity; double m_wavelength; + LookDirection m_lookDirection; }; #endif diff --git a/include/usgscsm/Utilities.h b/include/usgscsm/Utilities.h index 9765b269d23594a5bdb188c6aa2334204e3ebc22..51fb78d07abab4eb8cb8812a45584199a620f0ad 100644 --- a/include/usgscsm/Utilities.h +++ b/include/usgscsm/Utilities.h @@ -102,6 +102,7 @@ std::vector<double> getIntegrationStartTimes(nlohmann::json isd, csm::WarningLis std::vector<double> getIntegrationTimes(nlohmann::json isd, csm::WarningList *list=nullptr); double getExposureDuration(nlohmann::json isd, csm::WarningList *list=nullptr); double getScaledPixelWidth(nlohmann::json isd, csm::WarningList *list=nullptr); +std::string getLookDirection(nlohmann::json isd, csm::WarningList *list=nullptr); std::vector<double> getScaleConversionCoefficients(nlohmann::json isd, csm::WarningList *list=nullptr); std::vector<double> getScaleConversionTimes(nlohmann::json isd, csm::WarningList *list=nullptr); int getSampleSumming(nlohmann::json isd, csm::WarningList *list=nullptr); diff --git a/src/UsgsAstroSarSensorModel.cpp b/src/UsgsAstroSarSensorModel.cpp index b2782cfc2b77376d20940f72d979c20ba137ef1e..8f44b94c7b506436a42e20e4977f975d69633c24 100644 --- a/src/UsgsAstroSarSensorModel.cpp +++ b/src/UsgsAstroSarSensorModel.cpp @@ -116,6 +116,7 @@ string UsgsAstroSarSensorModel::constructStateFromIsd( state["m_scaleConversionCoefficients"] = getScaleConversionCoefficients(isd, parsingWarnings); state["m_scaleConversionTimes"] = getScaleConversionTimes(isd, parsingWarnings); state["m_wavelength"] = getWavelength(isd, parsingWarnings); + state["m_lookDirection"] = getLookDirection(isd, parsingWarnings); // Default to identity covariance state["m_covariance"] = @@ -188,6 +189,7 @@ void UsgsAstroSarSensorModel::reset() m_nSamples = 0; m_exposureDuration = 0; m_scaledPixelWidth = 0; + m_lookDirection = LookDirection::LEFT; m_startingEphemerisTime = 0; m_centerEphemerisTime = 0; m_endingEphemerisTime = 0; @@ -229,6 +231,19 @@ void UsgsAstroSarSensorModel::replaceModelState(const string& argState) m_nSamples = stateJson["m_nSamples"]; m_exposureDuration = stateJson["m_exposureDuration"]; m_scaledPixelWidth = stateJson["m_scaledPixelWidth"]; + std::string lookStr = stateJson["m_lookDirection"]; + if (lookStr.compare("right") == 0 ) { + m_lookDirection = UsgsAstroSarSensorModel::RIGHT; + } + else if (lookStr.compare("left") == 0) { + m_lookDirection = UsgsAstroSarSensorModel::LEFT; + } + else { + std::string message = "Could not determine look direction from state"; + throw csm::Error(csm::Error::INVALID_SENSOR_MODEL_STATE, + message, + "UsgsAstroSarSensorModel::replaceModelState"); + } m_wavelength = stateJson["m_wavelength"]; m_startingEphemerisTime = stateJson["m_startingEphemerisTime"]; m_centerEphemerisTime = stateJson["m_centerEphemerisTime"]; @@ -287,6 +302,18 @@ string UsgsAstroSarSensorModel::getModelState() const state["m_minElevation"] = m_minElevation; state["m_maxElevation"] = m_maxElevation; state["m_scaledPixelWidth"] = m_scaledPixelWidth; + if (m_lookDirection == 0) { + state["m_lookDirection"] = "left"; + } + else if (m_lookDirection == 1) { + state["m_lookDirection"] = "right"; + } + else { + std::string message = "Could not parse look direction from json state."; + throw csm::Error(csm::Error::INVALID_SENSOR_MODEL_STATE, + message, + "UsgsAstroSarSensorModel::getModelState"); + } state["m_wavelength"] = m_wavelength; state["m_scaleConversionCoefficients"] = m_scaleConversionCoefficients; state["m_scaleConversionTimes"] = m_scaleConversionTimes; diff --git a/src/Utilities.cpp b/src/Utilities.cpp index a532b8b83a075973812220f78c6a59bb9febc1cb..08101a85b3b0f719e30631dcf039969706ac7908 100644 --- a/src/Utilities.cpp +++ b/src/Utilities.cpp @@ -1215,6 +1215,23 @@ double getScaledPixelWidth(nlohmann::json isd, csm::WarningList *list) { return width; } +std::string getLookDirection(nlohmann::json isd, csm::WarningList *list) { + std::string lookDirection = ""; + try { + lookDirection = isd.at("look_direction"); + } + catch (...) { + if (list) { + list->push_back( + csm::Warning( + csm::Warning::DATA_NOT_AVAILABLE, + "Could not parse the scaled pixel width.", + "Utilities::getScaledPixelWidth()")); + } + } + return lookDirection; +} + std::vector<double> getScaleConversionTimes(nlohmann::json isd, csm::WarningList *list) { std::vector<double> time; try { diff --git a/tests/data/orbitalSar.json b/tests/data/orbitalSar.json index 95e1a9fe62de76a4f6759e7f5617e5dae0270c91..57aa104657748d3e0d33c8712574d9c4b6ee8a88 100644 --- a/tests/data/orbitalSar.json +++ b/tests/data/orbitalSar.json @@ -18,6 +18,7 @@ "scaled_pixel_width" : 7.5, "t0_ephemeris": -0.0025, "dt_ephemeris": 0.25, + "look_direction": "right", "sensor_position": { "positions": [[3737400.0, 0.0, -0.0],