#ifndef ROOT_Fit_ParameterSettings
#define ROOT_Fit_ParameterSettings
#include <string>
#ifndef ROOT_Math_Error
#include "Math/Error.h"
#endif
namespace ROOT {
namespace Fit {
class ParameterSettings {
public:
ParameterSettings () :
fValue(0.), fStepSize(0.1), fFix(false),
fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
fName("")
{}
ParameterSettings(const std::string & name, double val, double err) :
fValue(val), fStepSize(err), fFix(false),
fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
fName(name)
{}
ParameterSettings(const std::string & name, double val, double err,
double min, double max) :
fValue(val), fStepSize(err), fFix(false),
fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
fName(name)
{
SetLimits(min,max);
}
ParameterSettings(const std::string & name, double val) :
fValue(val), fStepSize(0), fFix(true),
fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
fName(name)
{}
void Set(const std::string & name, double value, double step) {
SetName(name);
SetValue(value);
SetStepSize(step);
}
void Set(const std::string & name, double value, double step, double lower, double upper ) {
SetName(name);
SetValue(value);
SetStepSize(step);
SetLimits(lower,upper);
}
void Set(const std::string & name, double value) {
SetName(name);
SetValue(value);
Fix();
}
~ParameterSettings () {}
public:
double Value() const { return fValue; }
double StepSize() const { return fStepSize; }
double LowerLimit() const {return fLowerLimit;}
double UpperLimit() const {return fUpperLimit;}
bool IsFixed() const { return fFix; }
bool HasLowerLimit() const {return fHasLowerLimit; }
bool HasUpperLimit() const {return fHasUpperLimit; }
bool IsBound() const { return fHasLowerLimit || fHasUpperLimit; }
bool IsDoubleBound() const { return fHasLowerLimit && fHasUpperLimit; }
const std::string & Name() const { return fName; }
void SetName(const std::string & name ) { fName = name; }
void Fix() {fFix = true;}
void Release() {fFix = false;}
void SetValue(double val) {fValue = val;}
void SetStepSize(double err) {fStepSize = err;}
void SetLimits(double low, double up) {
if ( low > up ) {
RemoveLimits();
return;
}
if (low == up && low == fValue) {
Fix();
return;
}
if (low > fValue || up < fValue) {
MATH_INFO_MSG("ParameterSettings","lower/upper bounds outside current parameter value. The value will be set to (low+up)/2 ");
fValue = 0.5 * (up+low);
}
fLowerLimit = low;
fUpperLimit = up;
fHasLowerLimit = true;
fHasUpperLimit = true;
}
void SetUpperLimit(double up) {
fLowerLimit = 0.;
fUpperLimit = up;
fHasLowerLimit = false;
fHasUpperLimit = true;
}
void SetLowerLimit(double low) {
fLowerLimit = low;
fUpperLimit = 0.;
fHasLowerLimit = true;
fHasUpperLimit = false;
}
void RemoveLimits() {
fLowerLimit = 0.;
fUpperLimit = 0.;
fHasLowerLimit = false;
fHasUpperLimit = false;
}
protected:
private:
double fValue;
double fStepSize;
bool fFix;
double fLowerLimit;
double fUpperLimit;
bool fHasLowerLimit;
bool fHasUpperLimit;
std::string fName;
};
}
}
#endif /* ROOT_Fit_ParameterSettings */