diff --git a/Modules/ModelFit/include/mitkExpDecayOffsetModel.h b/Modules/ModelFit/include/mitkExpDecayOffsetModel.h index 33d286984b..cc20cb5dcd 100644 --- a/Modules/ModelFit/include/mitkExpDecayOffsetModel.h +++ b/Modules/ModelFit/include/mitkExpDecayOffsetModel.h @@ -1,87 +1,139 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef mitkExpDecayOffsetModel_h #define mitkExpDecayOffsetModel_h #include "mitkModelBase.h" #include "MitkModelFitExports.h" namespace mitk { /** @class ExpDecayOffsetModel * @brief Implementation of a general exponential decay model with offset, * following the function: f(x) = a * exp(-1.0 * x * b) + c. */ class MITKMODELFIT_EXPORT ExpDecayOffsetModel : public mitk::ModelBase { public: typedef ExpDecayOffsetModel Self; typedef mitk::ModelBase Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef Superclass::ParameterNameType ParameterNameType; typedef Superclass::ParametersSizeType ParametersSizeType; /** Method for creation through the object factory. */ itkFactorylessNewMacro(Self); itkCloneMacro(Self); /** Run-time type information (and related methods). */ itkTypeMacro(ExpDecayOffsetModel, ModelBase); - std::string GetModelDisplayName() const override; + static const std::string NAME_PARAMETER_y0; + static const std::string NAME_PARAMETER_k; + static const std::string NAME_PARAMETER_y_bl; - std::string GetModelType() const override; + static const unsigned int NUMBER_OF_PARAMETERS; - FunctionStringType GetFunctionString() const override; + static const std::string UNIT_PARAMETER_y0; + static const std::string UNIT_PARAMETER_k; + static const std::string UNIT_PARAMETER_y_bl; - std::string GetXName() const override; + static const unsigned int POSITION_PARAMETER_y0; + static const unsigned int POSITION_PARAMETER_k; + static const unsigned int POSITION_PARAMETER_y_bl; + + static const unsigned int NUMBER_OF_DERIVED_PARAMETERS; + + static const unsigned int NUMBER_OF_STATIC_PARAMETERS; + + static const std::string MODEL_DISPLAY_NAME; + + static const std::string MODEL_TYPE; + + static const std::string FUNCTION_STRING; + + static const std::string X_NAME; + + static const std::string X_AXIS_NAME; + + static const std::string X_AXIS_UNIT; + + static const std::string Y_AXIS_NAME; + + static const std::string Y_AXIS_UNIT; ParameterNamesType GetParameterNames() const override; ParametersSizeType GetNumberOfParameters() const override; + ParamterUnitMapType GetParameterUnits() const override; + + ParameterNamesType GetDerivedParameterNames() const override; + + ParametersSizeType GetNumberOfDerivedParameters() const override; + + ParamterUnitMapType GetDerivedParameterUnits() const override; + ParameterNamesType GetStaticParameterNames() const override; ParametersSizeType GetNumberOfStaticParameters() const override; + ParamterUnitMapType GetStaticParameterUnits() const override; + + std::string GetModelDisplayName() const override; + + std::string GetModelType() const override; + + FunctionStringType GetFunctionString() const override; + + std::string GetXName() const override; + + std::string GetXAxisName() const override; + + std::string GetXAxisUnit() const override; + + std::string GetYAxisName() const override; + + std::string GetYAxisUnit() const override; + protected: ExpDecayOffsetModel() {}; ~ExpDecayOffsetModel() override {}; /** * Actual implementation of the clone method. This method should be reimplemeted * in subclasses to clone the extra required parameters. */ itk::LightObject::Pointer InternalClone() const override; ModelResultType ComputeModelfunction(const ParametersType& parameters) const override; void SetStaticParameter(const ParameterNameType& name, const StaticParameterValuesType& values) override; StaticParameterValuesType GetStaticParameterValue(const ParameterNameType& name) const override; private: //No copy constructor allowed ExpDecayOffsetModel(const Self& source); void operator=(const Self&); //purposely not implemented }; } #endif diff --git a/Modules/ModelFit/src/Models/mitkExpDecayOffsetModel.cpp b/Modules/ModelFit/src/Models/mitkExpDecayOffsetModel.cpp index 4b9a687d65..e174825320 100644 --- a/Modules/ModelFit/src/Models/mitkExpDecayOffsetModel.cpp +++ b/Modules/ModelFit/src/Models/mitkExpDecayOffsetModel.cpp @@ -1,101 +1,205 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkExpDecayOffsetModel.h" + +const std::string mitk::ExpDecayOffsetModel::NAME_PARAMETER_y0 = "y0"; +const std::string mitk::ExpDecayOffsetModel::NAME_PARAMETER_k = "k"; +const std::string mitk::ExpDecayOffsetModel::NAME_PARAMETER_y_bl = "y_bl"; + +const unsigned int mitk::ExpDecayOffsetModel::NUMBER_OF_PARAMETERS = 3; + +const std::string mitk::ExpDecayOffsetModel::UNIT_PARAMETER_y0 = "[y]"; +const std::string mitk::ExpDecayOffsetModel::UNIT_PARAMETER_k = "1/[x]"; +const std::string mitk::ExpDecayOffsetModel::UNIT_PARAMETER_y_bl = "[y]"; + +const unsigned int mitk::ExpDecayOffsetModel::POSITION_PARAMETER_y0 = 0; +const unsigned int mitk::ExpDecayOffsetModel::POSITION_PARAMETER_k = 1; +const unsigned int mitk::ExpDecayOffsetModel::POSITION_PARAMETER_y_bl = 2; + +const unsigned int mitk::ExpDecayOffsetModel::NUMBER_OF_DERIVED_PARAMETERS = 0; + +const unsigned int mitk::ExpDecayOffsetModel::NUMBER_OF_STATIC_PARAMETERS = 0; + +const std::string mitk::ExpDecayOffsetModel::MODEL_DISPLAY_NAME = "Exponential Decay Offset Model"; + +const std::string mitk::ExpDecayOffsetModel::MODEL_TYPE = "Generic"; + +const std::string mitk::ExpDecayOffsetModel::FUNCTION_STRING = "y(x) = y0 * exp(-k*x) + y_bl"; + +const std::string mitk::ExpDecayOffsetModel::X_NAME = "x"; + +const std::string mitk::ExpDecayOffsetModel::X_AXIS_NAME = "x"; + +const std::string mitk::ExpDecayOffsetModel::X_AXIS_UNIT = "[x]"; + +const std::string mitk::ExpDecayOffsetModel::Y_AXIS_NAME = "y"; + +const std::string mitk::ExpDecayOffsetModel::Y_AXIS_UNIT = "[y]"; + +/////////// + std::string mitk::ExpDecayOffsetModel::GetModelDisplayName() const { - return "Exponential Decay Offset Model"; + return MODEL_DISPLAY_NAME; }; std::string mitk::ExpDecayOffsetModel::GetModelType() const { - return "Generic"; + return MODEL_TYPE; }; mitk::ExpDecayOffsetModel::FunctionStringType mitk::ExpDecayOffsetModel::GetFunctionString() const { - return "a*exp(-1.0*x*b)+c"; + return FUNCTION_STRING; }; std::string mitk::ExpDecayOffsetModel::GetXName() const { - return "x"; + return X_NAME; }; +std::string mitk::ExpDecayOffsetModel::GetXAxisName() const +{ + return X_AXIS_NAME; +}; + +std::string mitk::ExpDecayOffsetModel::GetXAxisUnit() const +{ + return X_AXIS_UNIT; +} + +std::string mitk::ExpDecayOffsetModel::GetYAxisName() const +{ + return Y_AXIS_NAME; +}; + +std::string mitk::ExpDecayOffsetModel::GetYAxisUnit() const +{ + return Y_AXIS_UNIT; +} + mitk::ExpDecayOffsetModel::ParameterNamesType mitk::ExpDecayOffsetModel::GetParameterNames() const { ParameterNamesType result; - result.push_back("a"); - result.push_back("b"); - result.push_back("c"); + result.push_back(NAME_PARAMETER_y0); + result.push_back(NAME_PARAMETER_k); + result.push_back(NAME_PARAMETER_y_bl); return result; }; +mitk::ExpDecayOffsetModel::ParamterUnitMapType mitk::ExpDecayOffsetModel::GetParameterUnits() const +{ + ParamterUnitMapType result; + + result.insert(std::make_pair(NAME_PARAMETER_y0, UNIT_PARAMETER_y0)); + result.insert(std::make_pair(NAME_PARAMETER_k, UNIT_PARAMETER_k)); + result.insert(std::make_pair(NAME_PARAMETER_y_bl, UNIT_PARAMETER_y_bl)); + + return result; +} + mitk::ExpDecayOffsetModel::ParametersSizeType mitk::ExpDecayOffsetModel::GetNumberOfParameters() const { - return 3; + return NUMBER_OF_PARAMETERS; +}; + +mitk::ExpDecayOffsetModel::ParameterNamesType +mitk::ExpDecayOffsetModel::GetDerivedParameterNames() const +{ + ParameterNamesType result; + + //do nothing + + return result; +}; + +mitk::ExpDecayOffsetModel::ParametersSizeType +mitk::ExpDecayOffsetModel::GetNumberOfDerivedParameters() const +{ + return NUMBER_OF_DERIVED_PARAMETERS; }; +mitk::ExpDecayOffsetModel::ParamterUnitMapType mitk::ExpDecayOffsetModel::GetDerivedParameterUnits() const +{ + ParamterUnitMapType result; + + //do nothing + + return result; +}; + + + mitk::ExpDecayOffsetModel::ModelResultType mitk::ExpDecayOffsetModel::ComputeModelfunction(const ParametersType& parameters) const { ModelResultType signal(m_TimeGrid.GetSize()); const auto timeGridEnd = m_TimeGrid.end(); ModelResultType::iterator signalPos = signal.begin(); for (auto gridPos = m_TimeGrid.begin(); gridPos != timeGridEnd; ++gridPos, ++signalPos) { *signalPos = parameters[0] * exp(-1.0 * (*gridPos) * parameters[1]) + parameters[2]; } return signal; }; mitk::ExpDecayOffsetModel::ParameterNamesType mitk::ExpDecayOffsetModel::GetStaticParameterNames() const { return {}; } mitk::ExpDecayOffsetModel::ParametersSizeType mitk::ExpDecayOffsetModel::GetNumberOfStaticParameters() const { - return 0; + return NUMBER_OF_STATIC_PARAMETERS; } +mitk::ExpDecayOffsetModel::ParamterUnitMapType mitk::ExpDecayOffsetModel::GetStaticParameterUnits() const +{ + ParamterUnitMapType result; + + //do nothing + + return result; +}; + void mitk::ExpDecayOffsetModel::SetStaticParameter(const ParameterNameType& /*name*/, const StaticParameterValuesType& /*values*/) { //do nothing }; mitk::ExpDecayOffsetModel::StaticParameterValuesType mitk::ExpDecayOffsetModel::GetStaticParameterValue( const ParameterNameType& /*name*/) const { StaticParameterValuesType result; //do nothing return result; }; itk::LightObject::Pointer mitk::ExpDecayOffsetModel::InternalClone() const { ExpDecayOffsetModel::Pointer newClone = ExpDecayOffsetModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); };