ROOT logo
// @(#)root/tmva $Id: MethodFisher.h 29122 2009-06-22 06:51:30Z brun $
// Author: Andreas Hoecker, Xavier Prudent, Joerg Stelzer, Helge Voss, Kai Voss 

/**********************************************************************************
 * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
 * Package: TMVA                                                                  *
 * Class  : MethodFisher                                                          *
 * Web    : http://tmva.sourceforge.net                                           *
 *                                                                                *
 * Description:                                                                   *
 *      Analysis of Fisher discriminant (Fisher or Mahalanobis approach)          *
 *                                                                                *
 * Original author of this Fisher-Discriminant implementation:                    *
 *      Andre Gaidot, CEA-France;                                                 *
 *      (Translation from FORTRAN)                                                *
 *                                                                                *
 * Authors (alphabetical):                                                        *
 *      Andreas Hoecker <Andreas.Hocker@cern.ch> - CERN, Switzerland              *
 *      Xavier Prudent  <prudent@lapp.in2p3.fr>  - LAPP, France                   *
 *      Helge Voss      <Helge.Voss@cern.ch>     - MPI-K Heidelberg, Germany      *
 *      Kai Voss        <Kai.Voss@cern.ch>       - U. of Victoria, Canada         *
 *                                                                                *
 * Copyright (c) 2005:                                                            *
 *      CERN, Switzerland                                                         * 
 *      U. of Victoria, Canada                                                    * 
 *      MPI-K Heidelberg, Germany                                                 * 
 *      LAPP, Annecy, France                                                      *
 *                                                                                *
 * Redistribution and use in source and binary forms, with or without             *
 * modification, are permitted according to the terms listed in LICENSE           *
 * (http://tmva.sourceforge.net/LICENSE)                                          *
 **********************************************************************************/

#ifndef ROOT_TMVA_MethodFisher
#define ROOT_TMVA_MethodFisher

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// MethodFisher                                                         //
//                                                                      //
// Analysis of Fisher discriminant (Fisher or Mahalanobis approach)     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include <vector>

#ifndef ROOT_TMVA_MethodBase
#include "TMVA/MethodBase.h"
#endif
#ifndef ROOT_TMatrixDfwd
#include "TMatrixDfwd.h"
#endif

class TH1D;

namespace TMVA {

   class MethodFisher : public MethodBase {

   public:
      
      MethodFisher( const TString& jobName, 
                    const TString& methodTitle, 
                    DataSetInfo& dsi,
                    const TString& theOption = "Fisher",
                    TDirectory* theTargetDir = 0 );

      MethodFisher( DataSetInfo& dsi, 
                    const TString& theWeightFile,  
                    TDirectory* theTargetDir = NULL );

      virtual ~MethodFisher( void );

      virtual Bool_t HasAnalysisType( Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets );

    
      // training method
      void Train( void );

      using MethodBase::WriteWeightsToStream;
      using MethodBase::ReadWeightsFromStream;

      // write weights to stream
      void WriteWeightsToStream( std::ostream & o) const;
      void AddWeightsXMLTo     ( void* parent ) const;

      // read weights from stream
      void ReadWeightsFromStream( std::istream & i );
      void ReadWeightsFromXML   ( void* wghtnode );

      // calculate the MVA value
      Double_t GetMvaValue( Double_t* err = 0 );

      enum EFisherMethod { kFisher, kMahalanobis };
      EFisherMethod GetFisherMethod( void ) { return fFisherMethod; }

      // ranking of input variables
      const Ranking* CreateRanking();

   protected:

      // make ROOT-independent C++ class for classifier response (classifier-specific implementation)
      void MakeClassSpecific( std::ostream&, const TString& ) const;

      // get help message text
      void GetHelpMessage() const;

   private:

      // the option handling methods
      void DeclareOptions();
      void ProcessOptions();
  
      // Initialization and allocation of matrices
      void InitMatrices( void );

      // get mean value of variables
      void GetMean( void );

      // get matrix of covariance within class
      void GetCov_WithinClass( void );

      // get matrix of covariance between class
      void GetCov_BetweenClass( void );

      // and the full covariance matrix
      void GetCov_Full( void );

      // get discriminating power
      void GetDiscrimPower( void );

      // nice output
      void PrintCoefficients( void );

      // get Fisher coefficients
      void GetFisherCoeff( void );

      // matrix of variables means: S, B, S+B vs. variables
      TMatrixD *fMeanMatx;
      
      // method to be used
      TString       fTheMethod;       // Fisher or Mahalanobis
      EFisherMethod fFisherMethod;    // Fisher or Mahalanobis 

      // covariance matrices
      TMatrixD *fBetw;                // between-class matrix
      TMatrixD *fWith;                // within-class matrix
      TMatrixD *fCov;                 // full covariance matrix

      // number of events (sumOfWeights)
      Double_t fSumOfWeightsS;        // sum-of-weights for signal training events
      Double_t fSumOfWeightsB;        // sum-of-weights for background training events
      
      std::vector<Double_t>* fDiscrimPow;  // discriminating power
      std::vector<Double_t>* fFisherCoeff; // Fisher coefficients
      Double_t fF0;                   // offset

      // default initialisation called by all constructors
      void Init( void );

      ClassDef(MethodFisher,0) // Analysis of Fisher discriminant (Fisher or Mahalanobis approach) 
   };

} // namespace TMVA

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