ROOT logo
// @(#)root/minuit2:$Id$
// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005  

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
 *                                                                    *
 **********************************************************************/

#ifndef ROOT_Minuit2_MinuitParameter
#define ROOT_Minuit2_MinuitParameter

#include <algorithm>
#include <memory>
#include <cassert>
#include <string> 

namespace ROOT {

   namespace Minuit2 {

//____________________________________________________________________________
/** 
    class for the individual Minuit Parameter with Name and number; 
    contains the input numbers for the minimization or the output result
    from minimization;
    possible interactions: Fix/release, set/remove limits, set Value/error; 

    From version 5.20: use string to store the name to avoid limitation of 
    name length of 20 characters 
 */

class MinuitParameter {

public:

   //default constructor standard with value/error = 0
   MinuitParameter() : 
      fNum(0), fValue(0), fError(0.), fConst(false), fFix(false), 
      fLoLimit(0.), fUpLimit(0.), fLoLimValid(false), fUpLimValid(false),
      fName("")
   {}
  
   //constructor for constant Parameter
   MinuitParameter(unsigned int num, const std::string & name, double val) : 
      fNum(num), fValue(val), fError(0.), fConst(true), fFix(false),  
      fLoLimit(0.), fUpLimit(0.), fLoLimValid(false), fUpLimValid(false),
      fName(name)
  {}
  
   //constructor for standard Parameter
   MinuitParameter(unsigned int num, const std::string & name, double val, double err) :
      fNum(num), fValue(val), fError(err), fConst(false), fFix(false), 
      fLoLimit(0.), fUpLimit(0.), fLoLimValid(false), fUpLimValid(false),
      fName(name)
   {}
  
   //constructor for limited Parameter
   MinuitParameter(unsigned int num, const std::string & name, double val, double err, 
                   double min, double max) : 
      fNum(num),fValue(val), fError(err), fConst(false), fFix(false), 
      fLoLimit(min), fUpLimit(max), fLoLimValid(true), fUpLimValid(true), 
      fName(name)    
   {
      assert(min != max);
      if(min > max) {
         fLoLimit = max;
         fUpLimit = min;
      }
   }

   ~MinuitParameter() {}

   MinuitParameter(const MinuitParameter& par) : 
      fNum(par.fNum), fValue(par.fValue), fError(par.fError),
      fConst(par.fConst), fFix(par.fFix), fLoLimit(par.fLoLimit), 
      fUpLimit(par.fUpLimit), fLoLimValid(par.fLoLimValid), 
      fUpLimValid(par.fUpLimValid), 
      fName(par.fName ) 
   {}
  
   MinuitParameter& operator=(const MinuitParameter& par) {
      if(this != &par) {
         fNum = par.fNum;
         fName = par.fName;
         fValue = par.fValue;
         fError = par.fError;
         fConst = par.fConst;
         fFix = par.fFix;
         fLoLimit = par.fLoLimit; 
         fUpLimit = par.fUpLimit;
         fLoLimValid = par.fLoLimValid; 
         fUpLimValid = par.fUpLimValid;
      }
      return *this;
   }

   //access methods
   unsigned int Number() const {return fNum;}
   // new API returning a string 
   const std::string & GetName() const { return fName; }
   // return const char * for mantaining backward compatibility
   const char * Name() const {return fName.c_str();}
 
   double Value() const {return fValue;}
   double Error() const {return fError;}

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

   void SetValue(double val) {fValue = val;}
   void SetError(double err) {fError = err;}
   void SetLimits(double low, double up) {
      assert(low != up);
      fLoLimit = low; 
      fUpLimit = up;
      fLoLimValid = true; 
      fUpLimValid = true;
      if(low > up) {
         fLoLimit = up; 
         fUpLimit = low;
      }
   }

   void SetUpperLimit(double up) {
      fLoLimit = 0.; 
      fUpLimit = up;
      fLoLimValid = false; 
      fUpLimValid = true;
   }

   void SetLowerLimit(double low) {
      fLoLimit = low; 
      fUpLimit = 0.;
      fLoLimValid = true; 
      fUpLimValid = false;
   }

   void RemoveLimits() {
      fLoLimit = 0.; 
      fUpLimit = 0.;
      fLoLimValid = false; 
      fUpLimValid = false;
   }

   void Fix() {fFix = true;}
   void Release() {fFix = false;}
  
   //state of Parameter (fixed/const/limited)
   bool IsConst() const {return fConst;}
   bool IsFixed() const {return fFix;}

   bool HasLimits() const {return fLoLimValid || fUpLimValid; }
   bool HasLowerLimit() const {return fLoLimValid; }
   bool HasUpperLimit() const {return fUpLimValid; }
   double LowerLimit() const {return fLoLimit;}
   double UpperLimit() const {return fUpLimit;}

private:

   unsigned int fNum;
   double fValue;
   double fError;
   bool fConst;
   bool fFix;
   double fLoLimit; 
   double fUpLimit;
   bool fLoLimValid; 
   bool fUpLimValid;
   std::string fName;

private:

//    void SetName(const std::string & name) {
//       int l = std::min(int(strlen(name)), 11);
//       memset(fName, 0, 11*sizeof(char));
//       memcpy(fName, name, l*sizeof(char));
//       fName[10] = '\0';
//    }

};

  }  // namespace Minuit2

}  // namespace ROOT

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