ROOT logo
// @(#)root/hist:$Id: TMultiDimFit.h 20882 2007-11-19 11:31:26Z rdm $
// Author: Christian Holm Christensen 07/11/2000

#ifndef ROOT_TMultiDimFit
#define ROOT_TMultiDimFit

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
#ifndef ROOT_TVectorD
#include "TVectorD.h"
#endif
#ifndef ROOT_TMatrixD
#include "TMatrixD.h"
#endif
#ifndef ROOT_TList
#include "TList.h"
#endif
#ifndef ROOT_TVirtualFitter
#include "TVirtualFitter.h"
#endif

class TBrowser;

class TMultiDimFit : public TNamed {

public:
   enum EMDFPolyType {
      kMonomials,
      kChebyshev,
      kLegendre
   };

private:
   static TMultiDimFit* fgInstance; // Static instance
protected:

   TVectorD     fQuantity;             // Training sample, dependent quantity
   TVectorD     fSqError;              // Training sample, error in quantity
   Double_t     fMeanQuantity;         // Mean of dependent quantity
   Double_t     fMaxQuantity;          // Max value of dependent quantity
   Double_t     fMinQuantity;          // Min value of dependent quantity
   Double_t     fSumSqQuantity;        // SumSquare of dependent quantity
   Double_t     fSumSqAvgQuantity;     // Sum of squares away from mean

   TVectorD     fVariables;            // Training sample, independent variables
   Int_t        fNVariables;           // Number of independent variables
   TVectorD     fMeanVariables;        // mean value of independent variables
   TVectorD     fMaxVariables;         // max value of independent variables
   TVectorD     fMinVariables;         // min value of independent variables

   Int_t        fSampleSize;           // Size of training sample

   TVectorD     fTestQuantity;         // Test sample, dependent quantity
   TVectorD     fTestSqError;          // Test sample, Error in quantity
   TVectorD     fTestVariables;        // Test sample, independent variables

   Int_t        fTestSampleSize;       // Size of test sample

   Double_t     fMinAngle;             // Min angle for acepting new function
   Double_t     fMaxAngle;             // Max angle for acepting new function
   Int_t        fMaxTerms;             // Max terms expected in final expr.
   Double_t     fMinRelativeError;     // Min relative error accepted
   Int_t       *fMaxPowers;            // [fNVariables] maximum powers
   Double_t     fPowerLimit;           // Control parameter


   TMatrixD     fFunctions;            // Functions evaluated over sample
   Int_t        fMaxFunctions;         // max number of functions
   Int_t       *fFunctionCodes;        // [fMaxFunctions] acceptance code
   Int_t        fMaxStudy;             // max functions to study
   Int_t        fMaxFuncNV;            // fMaxFunctions*fNVariables

   TMatrixD     fOrthFunctions;        // As above, but orthogonalised
   TVectorD     fOrthFunctionNorms;    // Norm of the evaluated functions


   Int_t       *fMaxPowersFinal;       // [fNVariables] maximum powers from fit;
   Int_t       *fPowers;               // [fMaxFuncNV] where fMaxFuncNV = fMaxFunctions*fNVariables
   Int_t       *fPowerIndex;           // [fMaxTerms] Index of accepted powers

   TVectorD     fResiduals;            // Vector of the final residuals
   Double_t     fMaxResidual;          // Max redsidual value
   Double_t     fMinResidual;          // Min redsidual value
   Int_t        fMaxResidualRow;       // Row giving max residual
   Int_t        fMinResidualRow;       // Row giving min residual
   Double_t     fSumSqResidual;        // Sum of Square residuals

   Int_t        fNCoefficients;        // Dimension of model coefficients
   TVectorD     fOrthCoefficients;     // The model coefficients
   TMatrixD     fOrthCurvatureMatrix;  // Model matrix
   TVectorD     fCoefficients;         // Vector of the final coefficients
   TVectorD     fCoefficientsRMS;      // Vector of RMS of coefficients
   Double_t     fRMS;                  // Root mean square of fit
   Double_t     fChi2;                 // Chi square of fit
   Int_t        fParameterisationCode; // Exit code of parameterisation

   Double_t     fError;                // Error from parameterization
   Double_t     fTestError;            // Error from test
   Double_t     fPrecision;            // Relative precision of param
   Double_t     fTestPrecision;        // Relative precision of test
   Double_t     fCorrelationCoeff;     // Multi Correlation coefficient
   TMatrixD     fCorrelationMatrix;    // Correlation matrix
   Double_t     fTestCorrelationCoeff; // Multi Correlation coefficient

   TList*       fHistograms;           // List of histograms
   Byte_t       fHistogramMask;        // Bit pattern of hisograms used
   Int_t        fBinVarX;              // Number of bin in independent variables
   Int_t        fBinVarY;              // Number of bin in dependent variables

   TVirtualFitter* fFitter;            //! Fit object (MINUIT)

   EMDFPolyType fPolyType;             // Type of polynomials to use
   Bool_t       fShowCorrelation;      // print correlation matrix
   Bool_t       fIsUserFunction;       // Flag for user defined function
   Bool_t       fIsVerbose;            //

   virtual Double_t EvalFactor(Int_t p, Double_t x) const;
   virtual Double_t EvalControl(const Int_t *powers) const;
   virtual void     MakeCoefficientErrors();
   virtual void     MakeCorrelation();
   virtual Double_t MakeGramSchmidt(Int_t function);
   virtual void     MakeCoefficients();
   virtual void     MakeCandidates();
   virtual void     MakeNormalized();
   virtual void     MakeParameterization();
   virtual void     MakeRealCode(const char *filename,
                                 const char *classname,
                                 Option_t   *option="");
   virtual Bool_t   Select(const Int_t *iv);
   virtual Bool_t   TestFunction(Double_t squareResidual,
                                 Double_t dResidur);
public:
   TMultiDimFit();
   TMultiDimFit(Int_t dimension,
                EMDFPolyType type=kMonomials,
                Option_t *option="");
   virtual ~TMultiDimFit();

   virtual void     AddRow(const Double_t *x, Double_t D, Double_t E=0);
   virtual void     AddTestRow(const Double_t *x, Double_t D, Double_t E=0);
   virtual void     Browse(TBrowser* b);
   virtual void     Clear(Option_t *option=""); // *MENU*
   virtual void     Draw(Option_t * ="d") { }
   virtual Double_t Eval(const Double_t *x, const Double_t *coeff=0) const;
   virtual Double_t EvalError(const Double_t *x, const Double_t *coeff=0) const;
   virtual void     FindParameterization(Option_t* option=""); // *MENU*
   virtual void     Fit(Option_t *option=""); // *MENU*

   Double_t         GetChi2()              const { return fChi2; }
   const TMatrixD*  GetCorrelationMatrix() const { return &fCorrelationMatrix; }
   const TVectorD*  GetCoefficients()      const { return &fCoefficients; }
   Double_t         GetError()             const { return fError; }
   Int_t*           GetFunctionCodes()     const { return fFunctionCodes; }
   const TMatrixD*  GetFunctions()         const { return &fFunctions; }
   virtual TList*   GetHistograms()        const { return fHistograms; }
   Double_t         GetMaxAngle()          const { return fMaxAngle; }
   Int_t            GetMaxFunctions()      const { return fMaxFunctions; }
   Int_t*           GetMaxPowers()         const { return fMaxPowers; }
   Double_t         GetMaxQuantity()       const { return fMaxQuantity; }
   Int_t            GetMaxStudy()          const { return fMaxStudy; }
   Int_t            GetMaxTerms()          const { return fMaxTerms; }
   const TVectorD*  GetMaxVariables()      const { return &fMaxVariables; }
   Double_t         GetMeanQuantity()      const { return fMeanQuantity; }
   const TVectorD*  GetMeanVariables()     const { return &fMeanVariables; }
   Double_t         GetMinAngle()          const { return fMinAngle; }
   Double_t         GetMinQuantity()       const { return fMinQuantity; }
   Double_t         GetMinRelativeError()  const { return fMinRelativeError; }
   const TVectorD*  GetMinVariables()      const { return &fMinVariables; }
   Int_t            GetNVariables()        const { return fNVariables; }
   Int_t            GetNCoefficients()     const { return fNCoefficients; }
   Int_t            GetPolyType()          const { return fPolyType; }
   Int_t*           GetPowerIndex()        const { return fPowerIndex; }
   Double_t         GetPowerLimit()        const { return fPowerLimit; }
   const Int_t*     GetPowers()            const { return fPowers; }
   Double_t         GetPrecision()         const { return fPrecision; }
   const TVectorD*  GetQuantity()          const { return &fQuantity; }
   Double_t         GetResidualMax()       const { return fMaxResidual; }
   Double_t         GetResidualMin()       const { return fMinResidual; }
   Int_t            GetResidualMaxRow()    const { return fMaxResidualRow; }
   Int_t            GetResidualMinRow()    const { return fMinResidualRow; }
   Double_t         GetResidualSumSq()     const { return fSumSqResidual; }
   Double_t         GetRMS()               const { return fRMS; }
   Int_t            GetSampleSize()        const { return fSampleSize; }
   const TVectorD*  GetSqError()           const { return &fSqError; }
   Double_t         GetSumSqAvgQuantity()  const { return fSumSqAvgQuantity; }
   Double_t         GetSumSqQuantity()     const { return fSumSqQuantity; }
   Double_t         GetTestError()         const { return fTestError; }
   Double_t         GetTestPrecision()     const { return fTestPrecision; }
   const TVectorD*  GetTestQuantity()      const { return &fTestQuantity; }
   Int_t            GetTestSampleSize()    const { return fTestSampleSize; }
   const TVectorD*  GetTestSqError()       const { return &fTestSqError; }
   const TVectorD*  GetTestVariables()     const { return &fTestVariables; }
   const TVectorD*  GetVariables()         const { return &fVariables; }

   static TMultiDimFit* Instance();
   virtual Bool_t   IsFolder()             const { return kTRUE; }
   virtual Double_t MakeChi2(const Double_t* coeff=0);
   virtual void     MakeCode(const char *functionName="MDF", Option_t *option=""); // *MENU*
   virtual void     MakeHistograms(Option_t* option="A"); // *MENU*
   virtual void     MakeMethod(const Char_t* className="MDF", Option_t* option=""); // *MENU*
   virtual void     Print(Option_t *option="ps") const; // *MENU*

   void             SetBinVarX(Int_t nbbinvarx) {fBinVarX = nbbinvarx;}
   void             SetBinVarY(Int_t nbbinvary) {fBinVarY = nbbinvary;} 
   void             SetMaxAngle(Double_t angle=0);
   void             SetMaxFunctions(Int_t n) { fMaxFunctions = n; }
   void             SetMaxPowers(const Int_t *powers);
   void             SetMaxStudy(Int_t n) { fMaxStudy  = n; }
   void             SetMaxTerms(Int_t terms) { fMaxTerms = terms; }
   void             SetMinRelativeError(Double_t error);
   void             SetMinAngle(Double_t angle=1);
   void             SetPowerLimit(Double_t limit=1e-3);
   virtual void     SetPowers(const Int_t *powers, Int_t terms);

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