diff --git a/Modules/ModelFit/include/mitkLinearModel.h b/Modules/ModelFit/include/mitkLinearModel.h index fe12b0d16b..aa9d191d21 100644 --- a/Modules/ModelFit/include/mitkLinearModel.h +++ b/Modules/ModelFit/include/mitkLinearModel.h @@ -1,89 +1,140 @@ /*============================================================================ 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 mitkLinearModel_h #define mitkLinearModel_h #include "mitkModelBase.h" #include "MitkModelFitExports.h" namespace mitk { class MITKMODELFIT_EXPORT LinearModel : public mitk::ModelBase { public: typedef LinearModel 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(LinearModel, ModelBase); - std::string GetModelDisplayName() const override; + static const std::string NAME_PARAMETER_y0; + static const std::string NAME_PARAMETER_b; - 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_b; + + static const unsigned int POSITION_PARAMETER_y0; + static const unsigned int POSITION_PARAMETER_b; + + static const std::string NAME_DERIVED_PARAMETER_x_intercept; + + static const unsigned int NUMBER_OF_DERIVED_PARAMETERS; + + static const std::string UNIT_DERIVED_PARAMETER_x_intercept; + + 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; - std::string GetXName() const override; 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; - ParameterNamesType GetDerivedParameterNames() 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; - ParametersSizeType GetNumberOfDerivedParameters() const override; protected: LinearModel() {}; ~LinearModel() 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; DerivedParameterMapType ComputeDerivedParameters(const mitk::ModelBase::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 LinearModel(const Self& source); void operator=(const Self&); //purposely not implemented }; } #endif diff --git a/Modules/ModelFit/src/Models/mitkLinearModel.cpp b/Modules/ModelFit/src/Models/mitkLinearModel.cpp index 25e6ed786a..e6a6c950ee 100644 --- a/Modules/ModelFit/src/Models/mitkLinearModel.cpp +++ b/Modules/ModelFit/src/Models/mitkLinearModel.cpp @@ -1,125 +1,219 @@ /*============================================================================ 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 "mitkLinearModel.h" +const std::string mitk::LinearModel::NAME_PARAMETER_b = "b"; +const std::string mitk::LinearModel::NAME_PARAMETER_y0 = "y0"; + +const unsigned int mitk::LinearModel::NUMBER_OF_PARAMETERS = 2; + +const std::string mitk::LinearModel::UNIT_PARAMETER_b = "[y]/[x]"; +const std::string mitk::LinearModel::UNIT_PARAMETER_y0 = "[y]"; + +const unsigned int mitk::LinearModel::POSITION_PARAMETER_b = 0; +const unsigned int mitk::LinearModel::POSITION_PARAMETER_y0 = 1; + +const std::string mitk::LinearModel::NAME_DERIVED_PARAMETER_x_intercept = "x-intercept"; + +const unsigned int mitk::LinearModel::NUMBER_OF_DERIVED_PARAMETERS = 1; + +const std::string mitk::LinearModel::UNIT_DERIVED_PARAMETER_x_intercept = "[x]"; + +const unsigned int mitk::LinearModel::NUMBER_OF_STATIC_PARAMETERS = 0; + +const std::string mitk::LinearModel::MODEL_DISPLAY_NAME = "Linear Model"; + +const std::string mitk::LinearModel::MODEL_TYPE = "Generic"; + +const std::string mitk::LinearModel::FUNCTION_STRING = "y(x) = y0 + b*x"; + +const std::string mitk::LinearModel::X_NAME = "x"; + +const std::string mitk::LinearModel::X_AXIS_NAME = "x"; + +const std::string mitk::LinearModel::X_AXIS_UNIT = "[x]"; + +const std::string mitk::LinearModel::Y_AXIS_NAME = "y"; + +const std::string mitk::LinearModel::Y_AXIS_UNIT = "[y]"; + + std::string mitk::LinearModel::GetModelDisplayName() const { - return "Linear Model"; + return MODEL_DISPLAY_NAME; }; std::string mitk::LinearModel::GetModelType() const { - return "Generic"; + return MODEL_TYPE; }; mitk::LinearModel::FunctionStringType mitk::LinearModel::GetFunctionString() const { - return "slope*x+offset"; + return FUNCTION_STRING; }; std::string mitk::LinearModel::GetXName() const { - return "x"; + return X_NAME; +}; + +std::string mitk::LinearModel::GetXAxisName() const +{ + return X_AXIS_NAME; +}; + +std::string mitk::LinearModel::GetXAxisUnit() const +{ + return X_AXIS_UNIT; +} + +std::string mitk::LinearModel::GetYAxisName() const +{ + return Y_AXIS_NAME; }; +std::string mitk::LinearModel::GetYAxisUnit() const +{ + return Y_AXIS_UNIT; +} + mitk::LinearModel::ParameterNamesType mitk::LinearModel::GetParameterNames() const { ParameterNamesType result; - result.push_back("slope"); - result.push_back("offset"); + result.push_back(NAME_PARAMETER_b); + result.push_back(NAME_PARAMETER_y0); return result; }; +mitk::LinearModel::ParamterUnitMapType mitk::LinearModel::GetParameterUnits() const +{ + ParamterUnitMapType result; + + result.insert(std::make_pair(NAME_PARAMETER_b, UNIT_PARAMETER_b)); + result.insert(std::make_pair(NAME_PARAMETER_y0, UNIT_PARAMETER_y0)); + + return result; +} + mitk::LinearModel::ParametersSizeType mitk::LinearModel::GetNumberOfParameters() const { - return 2; + return NUMBER_OF_PARAMETERS; }; mitk::LinearModel::ParameterNamesType mitk::LinearModel::GetDerivedParameterNames() const { ParameterNamesType result; - result.push_back("x-intercept"); + result.push_back(NAME_DERIVED_PARAMETER_x_intercept); return result; }; mitk::LinearModel::ParametersSizeType mitk::LinearModel::GetNumberOfDerivedParameters() const { - return 1; + return NUMBER_OF_DERIVED_PARAMETERS; +}; + +mitk::LinearModel::ParamterUnitMapType mitk::LinearModel::GetDerivedParameterUnits() const +{ + ParamterUnitMapType result; + + result.insert(std::make_pair(NAME_DERIVED_PARAMETER_x_intercept, UNIT_DERIVED_PARAMETER_x_intercept)); + + return result; }; mitk::LinearModel::ModelResultType mitk::LinearModel::ComputeModelfunction(const ParametersType& parameters) const { + //Model Parameters + double b = parameters[POSITION_PARAMETER_b]; + double y0 = parameters[POSITION_PARAMETER_y0]; + ModelResultType signal(m_TimeGrid.GetSize()); TimeGridType::const_iterator timeGridEnd = m_TimeGrid.end(); ModelResultType::iterator signalPos = signal.begin(); for (TimeGridType::const_iterator gridPos = m_TimeGrid.begin(); gridPos != timeGridEnd; ++gridPos, ++signalPos) { - *signalPos = parameters[0] * (*gridPos) + parameters[1]; + *signalPos = b * (*gridPos) + y0; } return signal; }; mitk::LinearModel::ParameterNamesType mitk::LinearModel::GetStaticParameterNames() const { ParameterNamesType result; return result; } mitk::LinearModel::ParametersSizeType mitk::LinearModel::GetNumberOfStaticParameters() const { - return 0; + return NUMBER_OF_STATIC_PARAMETERS; } void mitk::LinearModel::SetStaticParameter(const ParameterNameType& /*name*/, const StaticParameterValuesType& /*values*/) { //do nothing }; mitk::LinearModel::StaticParameterValuesType mitk::LinearModel::GetStaticParameterValue( const ParameterNameType& /*name*/) const { StaticParameterValuesType result; //do nothing return result; }; +mitk::LinearModel::ParamterUnitMapType mitk::LinearModel::GetStaticParameterUnits() const +{ + ParamterUnitMapType result; + + //do nothing + + return result; +}; + + mitk::ModelBase::DerivedParameterMapType mitk::LinearModel::ComputeDerivedParameters( const mitk::ModelBase::ParametersType& parameters) const { DerivedParameterMapType result; - double intercept = -1 * parameters[1] / parameters[0]; - result.insert(std::make_pair("x-intercept", intercept)); + + //Model Parameters + double b = parameters[POSITION_PARAMETER_b]; + double y0 = parameters[POSITION_PARAMETER_y0]; + + double intercept = -1 * y0 / b; + result.insert(std::make_pair(NAME_DERIVED_PARAMETER_x_intercept, intercept)); return result; }; itk::LightObject::Pointer mitk::LinearModel::InternalClone() const { LinearModel::Pointer newClone = LinearModel::New(); newClone->SetTimeGrid(this->m_TimeGrid); return newClone.GetPointer(); };