ROOT logo
// @(#)root/minuit2:$Id$
// Author: L. Moneta    10/2005  

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2005 ROOT Foundation,  CERN/PH-SFT                   *
 *                                                                    *
 **********************************************************************/

#ifndef ROOT_TFitterMinuit_H_
#define ROOT_TFitterMinuit_H_

#ifndef ROOT_TVirtualFitter
#include "TVirtualFitter.h"
#endif

#include "Minuit2/MnUserParameterState.h"
#include "Minuit2/MinosError.h"
#include "Minuit2/ModularFunctionMinimizer.h"
#include "Minuit2/FumiliMinimizer.h"
#include "TFcnAdapter.h"

/**
    TVirtualFitter implementation for new C++ Minuit
*/

namespace ROOT { 
   namespace Minuit2 { 
      class FunctionMinimum;
   }
}

class TFitterMinuit : public TVirtualFitter {

public:

   // enumeration specifying the minimizers
   enum EMinimizerType { 
      kMigrad, 
      kSimplex, 
      kCombined, 
      kScan,
      kFumili
   };
   

   TFitterMinuit();

   TFitterMinuit(Int_t maxpar);

   virtual ~TFitterMinuit();

public:

   // inherited interface
   virtual Double_t  Chisquare(Int_t npar, Double_t *params) const;
   virtual void      Clear(Option_t *option="");
   virtual Int_t     ExecuteCommand(const char *command, Double_t *args, Int_t nargs);
   virtual void      FixParameter(Int_t ipar);
   virtual Double_t *GetCovarianceMatrix() const;
   virtual Double_t  GetCovarianceMatrixElement(Int_t i, Int_t j) const;
   virtual Int_t     GetErrors(Int_t ipar,Double_t &eplus, Double_t &eminus, Double_t &eparab, Double_t &globcc) const;
   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
   virtual Int_t     GetNumberTotalParameters() const;
   virtual Int_t     GetNumberFreeParameters() const;

   virtual Double_t  GetParError(Int_t ipar) const;
   virtual Double_t  GetParameter(Int_t ipar) const;
   virtual Int_t     GetParameter(Int_t ipar,char *name,Double_t &value,Double_t &verr,Double_t &vlow, Double_t &vhigh) const;
   virtual const char *GetParName(Int_t ipar) const;
   virtual Int_t     GetStats(Double_t &amin, Double_t &edm, Double_t &errdef, Int_t &nvpar, Int_t &nparx) const;
   virtual Double_t  GetSumLog(Int_t i);

   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
   virtual Bool_t    IsFixed(Int_t ipar) const ;

   virtual void      PrintResults(Int_t level, Double_t amin) const;
   virtual void      ReleaseParameter(Int_t ipar);
   virtual void      SetFitMethod(const char *name);
   virtual Int_t     SetParameter(Int_t ipar,const char *parname,Double_t value,Double_t verr,Double_t vlow, Double_t vhigh);

   virtual void      SetFCN(void (*fcn)(Int_t &, Double_t *, Double_t &f, Double_t *, Int_t) );
   // this for CINT (interactive functions)
   virtual void      SetFCN(void * );

   // set FCN using Minuit interface
   // you pass to the class ownership of FCNBase pointer

   virtual void SetMinuitFCN(  ROOT::Minuit2::FCNBase * f);

   // methods needed by derived classes 
   virtual const ROOT::Minuit2::MnUserParameterState & State() const { return fState; } 

   virtual const ROOT::Minuit2::FCNBase * GetMinuitFCN() const { return fMinuitFCN; } 

   virtual const ROOT::Minuit2::ModularFunctionMinimizer * GetMinimizer() const { return fMinimizer; }


   // additional abstract methods to be implemented by derived classes 
   virtual int Minimize(  int nfcn = 0, double edmval = 0.1);

   int GetStrategy() { return fStrategy; }

   int PrintLevel() { return fDebug; }

   void SetStrategy( int stra) { fStrategy = stra; } 

   void SetPrintLevel(int level ) { fDebug = level; } 

   // set minimum tolerance to avoid having clients (as TGraf::Fit) setting tolerances too small
   void SetMinimumTolerance(double mintol) { fMinTolerance = mintol; }

   double MinimumTolerance() const { return fMinTolerance; }

   /// create the minimizer type (Migard or Simplex)
   //  can be re-implemented in the derived classes 

   virtual void CreateMinimizer(EMinimizerType = kMigrad ); 
  

protected: 

   // method to set internal data (no copying involved so - make protected )

   virtual ROOT::Minuit2::MnUserParameterState & State() { return fState; }

   virtual void SetMinimizer( ROOT::Minuit2::ModularFunctionMinimizer * m) { fMinimizer = m; }


   // functions to create FCN - re-implemented in derived class (GFumili)

   virtual void CreateChi2FCN(); 

   virtual void CreateChi2ExtendedFCN(); 

   virtual void CreateBinLikelihoodFCN();

   virtual void CreateUnbinLikelihoodFCN() {}

   // internal function to perform the actual minimization (could be implemented by derived classes)
   virtual ROOT::Minuit2::FunctionMinimum DoMinimization( int nfcn = 0, double edmval = 0.1);

   // internal funcition to study Function minimum results
   // return 0 if function minimum is OK or an error code

   virtual int ExamineMinimum(const ROOT::Minuit2::FunctionMinimum & );
  
   virtual void Initialize();
   
private:

   double fErrorDef;
   double fEDMVal;
   bool fGradient;

   ROOT::Minuit2::MnUserParameterState fState;
   std::vector<ROOT::Minuit2::MinosError> fMinosErrors;
   ROOT::Minuit2::ModularFunctionMinimizer * fMinimizer;
   ROOT::Minuit2::FCNBase * fMinuitFCN;
   int fDebug;
   int fStrategy;
   double fMinTolerance;
   mutable std::vector<double> fCovar; // cached covariance matrix (NxN)


   ClassDef(TFitterMinuit,1)  // The ROOT fitter based on new Minuit (Minuit2)

};

R__EXTERN TFitterMinuit* gMinuit2;


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