// @(#)root/mathcore:$Id$
// Author: L. Moneta Thu Sep 21 16:21:48 2006

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
 *                                                                    *
 *                                                                    *
 **********************************************************************/

// Header file for class ParameterSettings

#ifndef ROOT_Fit_ParameterSettings
#define ROOT_Fit_ParameterSettings

#include <string>

#ifndef ROOT_Math_Error
#include "Math/Error.h"
#endif


namespace ROOT {

   namespace Fit {


//___________________________________________________________________________________
/**
   Class, describing value, limits and step size of the parameters
   Provides functionality also to set/retrieve values, step sizes, limits and fix the
   parameters.

   To be done: add constraints (equality and inequality) as functions of the parameters

   @ingroup FitMain
*/
class ParameterSettings {

public:

   /**
      Default constructor
   */
   ParameterSettings () :
    fValue(0.), fStepSize(0.1), fFix(false),
    fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
    fName("")
   {}


  ///constructor for unlimited named Parameter
   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)
   {}

   ///constructor for double limited Parameter
   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);
   }

   ///constructor for fixed Parameter
   ParameterSettings(const std::string &  name, double val) :
    fValue(val), fStepSize(0), fFix(true),
    fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
    fName(name)
   {}




   /// set value and name (unlimited parameter)
   void Set(const std::string & name, double value, double step) {
      SetName(name);
      SetValue(value);
      SetStepSize(step);
   }

   /// set a limited parameter
   void Set(const std::string & name, double value, double step, double lower, double upper ) {
      SetName(name);
      SetValue(value);
      SetStepSize(step);
      SetLimits(lower,upper);
   }

   /// set a fixed parameter
   void Set(const std::string & name, double value) {
      SetName(name);
      SetValue(value);
      Fix();
   }


   /**
      Destructor (no operations)
   */
   ~ParameterSettings ()  {}

   /// copy constructor and assignment operators (leave them to the compiler)

public:

   /// return parameter value
   double Value() const { return fValue; }
   /// return step size
   double StepSize() const { return fStepSize; }
   /// return lower limit value
   double LowerLimit() const {return fLowerLimit;}
   /// return upper limit value
   double UpperLimit() const {return fUpperLimit;}
   /// check if is fixed
   bool IsFixed() const { return fFix; }
   /// check if parameter has lower limit
   bool HasLowerLimit() const {return fHasLowerLimit; }
   /// check if parameter has upper limit
   bool HasUpperLimit() const {return fHasUpperLimit; }
   /// check if is bound
   bool IsBound() const {   return fHasLowerLimit || fHasUpperLimit;  }
   /// check if is double bound (upper AND lower limit)
   bool IsDoubleBound() const { return fHasLowerLimit && fHasUpperLimit;  }
   /// return name
   const std::string & Name() const { return fName; }

   /** interaction **/

   /// set name
   void SetName(const std::string & name ) { fName = name; }

   /// fix  the parameter
   void Fix() {fFix = true;}
   /// release the parameter
   void Release() {fFix = false;}
   /// set the value
   void SetValue(double val) {fValue = val;}
   /// set the step size
   void SetStepSize(double err) {fStepSize = err;}
   /// set a double side limit,
   /// if low == up the parameter is fixed  if low > up the limits are removed
   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;
   }
   /// set a single upper limit
   void SetUpperLimit(double up) {
    fLowerLimit = 0.;
    fUpperLimit = up;
    fHasLowerLimit = false;
    fHasUpperLimit = true;
   }
   /// set a single lower limit
   void SetLowerLimit(double low) {
      fLowerLimit = low;
      fUpperLimit = 0.;
      fHasLowerLimit = true;
      fHasUpperLimit = false;
   }

   /// remove all limit
   void RemoveLimits() {
      fLowerLimit = 0.;
      fUpperLimit = 0.;
      fHasLowerLimit = false;
      fHasUpperLimit = false;
   }



protected:


private:

   double fValue;        // parameter value
   double fStepSize;     // parameter step size (used by minimizer)
   bool fFix;            // flag to control if parameter is fixed
   double fLowerLimit;   // lower parameter limit
   double fUpperLimit;   // upper parameter limit
   bool fHasLowerLimit;  // flag to control lower parameter limit
   bool fHasUpperLimit;  // flag to control upper parameter limit

   std::string fName;    // parameter name

};

   } // end namespace Fit

} // end namespace ROOT


#endif /* ROOT_Fit_ParameterSettings */
 ParameterSettings.h:1
 ParameterSettings.h:2
 ParameterSettings.h:3
 ParameterSettings.h:4
 ParameterSettings.h:5
 ParameterSettings.h:6
 ParameterSettings.h:7
 ParameterSettings.h:8
 ParameterSettings.h:9
 ParameterSettings.h:10
 ParameterSettings.h:11
 ParameterSettings.h:12
 ParameterSettings.h:13
 ParameterSettings.h:14
 ParameterSettings.h:15
 ParameterSettings.h:16
 ParameterSettings.h:17
 ParameterSettings.h:18
 ParameterSettings.h:19
 ParameterSettings.h:20
 ParameterSettings.h:21
 ParameterSettings.h:22
 ParameterSettings.h:23
 ParameterSettings.h:24
 ParameterSettings.h:25
 ParameterSettings.h:26
 ParameterSettings.h:27
 ParameterSettings.h:28
 ParameterSettings.h:29
 ParameterSettings.h:30
 ParameterSettings.h:31
 ParameterSettings.h:32
 ParameterSettings.h:33
 ParameterSettings.h:34
 ParameterSettings.h:35
 ParameterSettings.h:36
 ParameterSettings.h:37
 ParameterSettings.h:38
 ParameterSettings.h:39
 ParameterSettings.h:40
 ParameterSettings.h:41
 ParameterSettings.h:42
 ParameterSettings.h:43
 ParameterSettings.h:44
 ParameterSettings.h:45
 ParameterSettings.h:46
 ParameterSettings.h:47
 ParameterSettings.h:48
 ParameterSettings.h:49
 ParameterSettings.h:50
 ParameterSettings.h:51
 ParameterSettings.h:52
 ParameterSettings.h:53
 ParameterSettings.h:54
 ParameterSettings.h:55
 ParameterSettings.h:56
 ParameterSettings.h:57
 ParameterSettings.h:58
 ParameterSettings.h:59
 ParameterSettings.h:60
 ParameterSettings.h:61
 ParameterSettings.h:62
 ParameterSettings.h:63
 ParameterSettings.h:64
 ParameterSettings.h:65
 ParameterSettings.h:66
 ParameterSettings.h:67
 ParameterSettings.h:68
 ParameterSettings.h:69
 ParameterSettings.h:70
 ParameterSettings.h:71
 ParameterSettings.h:72
 ParameterSettings.h:73
 ParameterSettings.h:74
 ParameterSettings.h:75
 ParameterSettings.h:76
 ParameterSettings.h:77
 ParameterSettings.h:78
 ParameterSettings.h:79
 ParameterSettings.h:80
 ParameterSettings.h:81
 ParameterSettings.h:82
 ParameterSettings.h:83
 ParameterSettings.h:84
 ParameterSettings.h:85
 ParameterSettings.h:86
 ParameterSettings.h:87
 ParameterSettings.h:88
 ParameterSettings.h:89
 ParameterSettings.h:90
 ParameterSettings.h:91
 ParameterSettings.h:92
 ParameterSettings.h:93
 ParameterSettings.h:94
 ParameterSettings.h:95
 ParameterSettings.h:96
 ParameterSettings.h:97
 ParameterSettings.h:98
 ParameterSettings.h:99
 ParameterSettings.h:100
 ParameterSettings.h:101
 ParameterSettings.h:102
 ParameterSettings.h:103
 ParameterSettings.h:104
 ParameterSettings.h:105
 ParameterSettings.h:106
 ParameterSettings.h:107
 ParameterSettings.h:108
 ParameterSettings.h:109
 ParameterSettings.h:110
 ParameterSettings.h:111
 ParameterSettings.h:112
 ParameterSettings.h:113
 ParameterSettings.h:114
 ParameterSettings.h:115
 ParameterSettings.h:116
 ParameterSettings.h:117
 ParameterSettings.h:118
 ParameterSettings.h:119
 ParameterSettings.h:120
 ParameterSettings.h:121
 ParameterSettings.h:122
 ParameterSettings.h:123
 ParameterSettings.h:124
 ParameterSettings.h:125
 ParameterSettings.h:126
 ParameterSettings.h:127
 ParameterSettings.h:128
 ParameterSettings.h:129
 ParameterSettings.h:130
 ParameterSettings.h:131
 ParameterSettings.h:132
 ParameterSettings.h:133
 ParameterSettings.h:134
 ParameterSettings.h:135
 ParameterSettings.h:136
 ParameterSettings.h:137
 ParameterSettings.h:138
 ParameterSettings.h:139
 ParameterSettings.h:140
 ParameterSettings.h:141
 ParameterSettings.h:142
 ParameterSettings.h:143
 ParameterSettings.h:144
 ParameterSettings.h:145
 ParameterSettings.h:146
 ParameterSettings.h:147
 ParameterSettings.h:148
 ParameterSettings.h:149
 ParameterSettings.h:150
 ParameterSettings.h:151
 ParameterSettings.h:152
 ParameterSettings.h:153
 ParameterSettings.h:154
 ParameterSettings.h:155
 ParameterSettings.h:156
 ParameterSettings.h:157
 ParameterSettings.h:158
 ParameterSettings.h:159
 ParameterSettings.h:160
 ParameterSettings.h:161
 ParameterSettings.h:162
 ParameterSettings.h:163
 ParameterSettings.h:164
 ParameterSettings.h:165
 ParameterSettings.h:166
 ParameterSettings.h:167
 ParameterSettings.h:168
 ParameterSettings.h:169
 ParameterSettings.h:170
 ParameterSettings.h:171
 ParameterSettings.h:172
 ParameterSettings.h:173
 ParameterSettings.h:174
 ParameterSettings.h:175
 ParameterSettings.h:176
 ParameterSettings.h:177
 ParameterSettings.h:178
 ParameterSettings.h:179
 ParameterSettings.h:180
 ParameterSettings.h:181
 ParameterSettings.h:182
 ParameterSettings.h:183
 ParameterSettings.h:184
 ParameterSettings.h:185
 ParameterSettings.h:186
 ParameterSettings.h:187
 ParameterSettings.h:188
 ParameterSettings.h:189
 ParameterSettings.h:190
 ParameterSettings.h:191
 ParameterSettings.h:192
 ParameterSettings.h:193
 ParameterSettings.h:194
 ParameterSettings.h:195
 ParameterSettings.h:196
 ParameterSettings.h:197
 ParameterSettings.h:198
 ParameterSettings.h:199
 ParameterSettings.h:200
 ParameterSettings.h:201
 ParameterSettings.h:202
 ParameterSettings.h:203
 ParameterSettings.h:204
 ParameterSettings.h:205
 ParameterSettings.h:206
 ParameterSettings.h:207
 ParameterSettings.h:208
 ParameterSettings.h:209
 ParameterSettings.h:210
 ParameterSettings.h:211
 ParameterSettings.h:212
 ParameterSettings.h:213