Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-15 09:11:11

0001 // @(#)root/mathcore:$Id$
0002 // Author: L. Moneta Thu Sep 21 16:21:48 2006
0003 
0004 /**********************************************************************
0005  *                                                                    *
0006  * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
0007  *                                                                    *
0008  *                                                                    *
0009  **********************************************************************/
0010 
0011 // Header file for class ParameterSettings
0012 
0013 #ifndef ROOT_Fit_ParameterSettings
0014 #define ROOT_Fit_ParameterSettings
0015 
0016 #include <string>
0017 
0018 namespace ROOT {
0019 
0020    namespace Fit {
0021 
0022 
0023 //___________________________________________________________________________________
0024 /**
0025    Class, describing value, limits and step size of the parameters
0026    Provides functionality also to set/retrieve values, step sizes, limits and fix the
0027    parameters.
0028 
0029    To be done: add constraints (equality and inequality) as functions of the parameters
0030 
0031    @ingroup FitMain
0032 */
0033 class ParameterSettings {
0034 
0035 public:
0036 
0037    /**
0038       Default constructor
0039    */
0040    ParameterSettings () {}
0041 
0042 
0043   ///constructor for unlimited named Parameter
0044    ParameterSettings(const std::string & name, double val, double err) :
0045     fValue(val), fStepSize(err),
0046     fName(name)
0047    {}
0048 
0049    ///constructor for double limited Parameter. The given value should be within the given limits [min,max]
0050    ParameterSettings(const std::string &  name, double val, double err,
0051                      double min, double max) :
0052       fValue(val), fStepSize(err),
0053       fName(name)
0054    {
0055       SetLimits(min,max);
0056    }
0057 
0058    ///constructor for fixed Parameter
0059    ParameterSettings(const std::string &  name, double val) :
0060     fValue(val), fStepSize(0), fFix(true),
0061     fName(name)
0062    {}
0063 
0064 
0065 
0066 
0067    /// set value and name (unlimited parameter)
0068    void Set(const std::string & name, double value, double step) {
0069       SetName(name);
0070       SetValue(value);
0071       SetStepSize(step);
0072    }
0073 
0074    /// set a limited parameter. The given value should be within the given limits [min,max]
0075    void Set(const std::string & name, double value, double step, double lower, double upper ) {
0076       SetName(name);
0077       SetValue(value);
0078       SetStepSize(step);
0079       SetLimits(lower,upper);
0080    }
0081 
0082    /// set a fixed parameter
0083    void Set(const std::string & name, double value) {
0084       SetName(name);
0085       SetValue(value);
0086       Fix();
0087    }
0088 
0089    /// return parameter value
0090    double Value() const { return fValue; }
0091    /// return step size
0092    double StepSize() const { return fStepSize; }
0093    /// return lower limit value
0094    double LowerLimit() const {return fLowerLimit;}
0095    /// return upper limit value
0096    double UpperLimit() const {return fUpperLimit;}
0097    /// check if is fixed
0098    bool IsFixed() const { return fFix; }
0099    /// check if parameter has lower limit
0100    bool HasLowerLimit() const {return fHasLowerLimit; }
0101    /// check if parameter has upper limit
0102    bool HasUpperLimit() const {return fHasUpperLimit; }
0103    /// check if is bound
0104    bool IsBound() const {   return fHasLowerLimit || fHasUpperLimit;  }
0105    /// check if is double bound (upper AND lower limit)
0106    bool IsDoubleBound() const { return fHasLowerLimit && fHasUpperLimit;  }
0107    /// return name
0108    const std::string & Name() const { return fName; }
0109 
0110    /** interaction **/
0111 
0112    /// set name
0113    void SetName(const std::string & name ) { fName = name; }
0114 
0115    /// fix  the parameter
0116    void Fix() {fFix = true;}
0117    /// release the parameter
0118    void Release() {fFix = false;}
0119    /// set the value
0120    void SetValue(double val) {fValue = val;}
0121    /// set the step size
0122    void SetStepSize(double err) {fStepSize = err;}
0123    void SetLimits(double low, double up);
0124    /// set a single upper limit
0125    void SetUpperLimit(double up) {
0126     fLowerLimit = 0.;
0127     fUpperLimit = up;
0128     fHasLowerLimit = false;
0129     fHasUpperLimit = true;
0130    }
0131    /// set a single lower limit
0132    void SetLowerLimit(double low) {
0133       fLowerLimit = low;
0134       fUpperLimit = 0.;
0135       fHasLowerLimit = true;
0136       fHasUpperLimit = false;
0137    }
0138 
0139    /// remove all limit
0140    void RemoveLimits() {
0141       fLowerLimit = 0.;
0142       fUpperLimit = 0.;
0143       fHasLowerLimit = false;
0144       fHasUpperLimit = false;
0145    }
0146 
0147 private:
0148 
0149    double fValue = 0.0;          ///< parameter value
0150    double fStepSize = 0.1;       ///< parameter step size (used by minimizer)
0151    bool fFix = false;            ///< flag to control if parameter is fixed
0152    double fLowerLimit = 0.0;     ///< lower parameter limit
0153    double fUpperLimit = 0.0;     ///< upper parameter limit
0154    bool fHasLowerLimit = false;  ///< flag to control lower parameter limit
0155    bool fHasUpperLimit = false;  ///< flag to control upper parameter limit
0156 
0157    std::string fName;    ///< parameter name
0158 
0159 };
0160 
0161    } // end namespace Fit
0162 
0163 } // end namespace ROOT
0164 
0165 
0166 #endif /* ROOT_Fit_ParameterSettings */