#ifndef ROOT_TMVA_MethodBase
#define ROOT_TMVA_MethodBase
#include "Riostream.h"
#include <vector>
#include <iostream>
#ifndef ROOT_TMVA_DataSet
#include "TMVA/DataSet.h"
#endif
#ifndef ROOT_TMVA_IMethod
#include "TMVA/IMethod.h"
#endif
#ifndef ROOT_TMVA_PDF
#include "TMVA/PDF.h"
#endif
#ifndef ROOT_TMVA_TSpline1
#include "TMVA/TSpline1.h"
#endif
#ifndef ROOT_TMVA_Option
#include "TMVA/Option.h"
#endif
#ifndef ROOT_TMVA_Tools
#include "TMVA/Tools.h"
#endif
#ifndef ROOT_TMVA_Configurable
#include "TMVA/Configurable.h"
#endif
#ifndef ROOT_TMVA_Types
#include "TMVA/Types.h"
#endif
#ifndef ROOT_TMVA_MsgLogger
#include "TMVA/MsgLogger.h"
#endif
#ifndef ROOT_TMVA_VariableTransformBase
#include "TMVA/VariableTransformBase.h"
#endif
class TTree;
class TDirectory;
namespace TMVA {
   class Ranking;
   class MethodBase : public IMethod, public Configurable {
      
   public:
      enum EWeightFileType { kROOT=0, kTEXT };
      
      
      MethodBase( TString jobName,
                  TString methodTitle, 
                  DataSet& theData,
                  TString theOption = "", 
                  TDirectory* theBaseDir = 0 );
      
      
      
      MethodBase( DataSet& theData,
                  TString weightFile, 
                  TDirectory* theBaseDir = 0 );
      
      virtual ~MethodBase();
      
      
      virtual void PrepareEvaluationTree( TTree* theTestTree );
      void   TrainMethod();
      Bool_t IsMVAPdfs() const { return fIsMVAPdfs; }
      void   CreateMVAPdfs();
      void   WriteStateToFile   () const;
      void   WriteStateToStream ( std::ostream& tf, Bool_t isClass = kFALSE ) const;
      void   WriteStateToStream ( TFile&        rf ) const;
      void   ReadStateFromFile  ();
      void   ReadStateFromStream( std::istream& tf );
      void   ReadStateFromStream( TFile&        rf );
      
      virtual void WriteWeightsToStream ( std::ostream& tf ) const = 0;
      virtual void WriteWeightsToStream ( TFile&       ) const {}
      virtual void ReadWeightsFromStream( std::istream& tf ) = 0;
      virtual void ReadWeightsFromStream( TFile&       ) {}
      virtual void WriteMonitoringHistosToFile() const;
      virtual Bool_t IsSignalLike() { return GetMvaValue() > GetSignalReferenceCut() ? kTRUE : kFALSE; }     
      
      virtual void TestInit( TTree* theTestTree = 0 );
      
      
      
      
      
      virtual Double_t GetMvaValue() = 0;
      virtual Double_t GetProba( Double_t mvaVal, Double_t ap_sig );
      
      virtual Double_t GetRarity( Double_t mvaVal, Types::ESBType reftype = Types::kBackground ) const;
      
      virtual void Test( TTree* theTestTree = 0 );
      
      const TString& GetJobName    () const { return fJobName; }
      const TString& GetMethodName () const { return fMethodName; }
      const char*    GetName       () const { return GetMethodName().Data(); }
      const TString& GetMethodTitle() const { return fMethodTitle; }
      Types::EMVA    GetMethodType () const { return fMethodType; }
      void    SetJobName    ( TString jobName )        { fJobName     = jobName; }
      void    SetMethodName ( TString methodName )     { fMethodName  = methodName; }
      void    SetMethodTitle( TString methodTitle )    { fMethodTitle = methodTitle; }
      void    SetMethodType ( Types::EMVA methodType ) { fMethodType  = methodType; }
      TString GetWeightFileDir() const { return fFileDir; }
      void    SetWeightFileDir( TString fileDir );
      const TString& GetInputVar( int i ) const { return Data().GetInternalVarName(i); }
      const TString& GetInputExp( int i ) const { return Data().GetExpression(i); }
      void    SetWeightFileName( TString );
      TString GetWeightFileName() const;
      Bool_t  HasTrainingTree() const { return Data().GetTrainingTree() != 0; }
      TTree*  GetTrainingTree() const { 
         if (GetVariableTransform() != Types::kNone) {
            fLogger << kFATAL << "Trying to access correlated Training tree in method " 
                    << GetMethodName() << Endl;
         }
         return Data().GetTrainingTree();
      }
      TTree*  GetTestTree() const {
         if (GetVariableTransform() != Types::kNone) {
            fLogger << kFATAL << "Trying to access correlated Training tree in method " 
                    << GetMethodName() << Endl;
         }
         return Data().GetTestTree();
      }
      Int_t   GetNvar() const { return fNvar; }
      void    SetNvar( Int_t n) { fNvar = n; }
      
      
      
      
      virtual Double_t  GetEfficiency( TString, TTree*, Double_t& err );
      virtual Double_t  GetTrainingEfficiency( TString );
      virtual Double_t  GetSignificance() const;
      virtual Double_t  GetOptimalSignificance( Double_t SignalEvents, Double_t BackgroundEvents, 
                                                Double_t& optimal_significance_value  ) const;
      virtual Double_t  GetSeparation( TH1*, TH1* ) const;
      virtual Double_t  GetSeparation( PDF* pdfS = 0, PDF* pdfB = 0 ) const;
      virtual Double_t  GetmuTransform( TTree* );
      
      Double_t GetRMS( Int_t ivar )          const { return GetVarTransform().Variable(ivar).GetRMS(); }
      Double_t GetXmin( Int_t ivar )         const { return GetVarTransform().Variable(ivar).GetMin(); }
      Double_t GetXmax( Int_t ivar )         const { return GetVarTransform().Variable(ivar).GetMax(); }
      Double_t GetXmin( const TString& var ) const { return GetVarTransform().Variable(var) .GetMin(); } 
      Double_t GetXmax( const TString& var ) const { return GetVarTransform().Variable(var) .GetMax(); } 
      void     SetXmin( Int_t ivar, Double_t x )          { GetVarTransform().Variable(ivar).SetMin(x); }
      void     SetXmax( Int_t ivar, Double_t x )          { GetVarTransform().Variable(ivar).SetMax(x); }
      void     SetXmin( const TString& var, Double_t x )  { GetVarTransform().Variable(var) .SetMin(x); }
      void     SetXmax( const TString& var, Double_t x )  { GetVarTransform().Variable(var) .SetMax(x); }
      
      Double_t Norm   ( Int_t ivar,  Double_t x ) const;
      Double_t Norm   ( TString var, Double_t x ) const;
      
      Bool_t   IsNormalised() const { return fNormalise; }
      void     SetNormalised( Bool_t norm ) { fNormalise = norm; }
      
      
      Bool_t   IsOK()  const { return fIsOK; }
      
      void WriteEvaluationHistosToFile( TDirectory* targetDir = 0 );
      Types::EVariableTransform GetVariableTransform() const { return fVariableTransform; }
      void SetVariableTransform ( Types::EVariableTransform m ) { fVariableTransform = m; }
      
      Bool_t Verbose() const { return fVerbose; }
      Bool_t Help   () const { return fHelp; }
      void   SetVerbose( Bool_t v = kTRUE ) { fVerbose = v; }
      void   SetHelp   ( Bool_t h = kTRUE ) { fHelp    = h; }
      DataSet& Data() const { return fData; }
      virtual Bool_t ReadEvent( TTree* tr, UInt_t ievt, Types::ESBType type = Types::kMaxSBType ) const { 
         if (type == Types::kMaxSBType) type = GetVariableTransformType();
         fVarTransform->ReadEvent(tr, ievt, type);
         return kTRUE;
      }
      virtual Bool_t   ReadTrainingEvent( UInt_t ievt, Types::ESBType type = Types::kMaxSBType ) const {
         return ReadEvent( Data().GetTrainingTree(), ievt, type );
      }
      virtual Bool_t ReadTestEvent( UInt_t ievt, Types::ESBType type = Types::kMaxSBType ) const {
         return ReadEvent( Data().GetTestTree(), ievt, type );
      }
      TMVA::Event& GetEvent()                const { return GetVarTransform().GetEvent(); }
      Bool_t       IsSignalEvent()           const { return GetEvent().IsSignal(); }
      Double_t     GetEventVal( Int_t ivar ) const { 
         if (IsNormalised()) return GetEventValNormalised(ivar);
         else                return GetEvent().GetVal(ivar); 
      }
      Double_t     GetEventWeight() const { return GetEvent().GetWeight(); }
      virtual void DeclareOptions();
      virtual void ProcessOptions();
      
      const TString& GetTestvarName() const { return fTestvar; }
      const TString  GetProbaName()   const { return fTestvar + "_Proba"; }
      
      VariableTransformBase& GetVarTransform() const { return *fVarTransform; }
      
      Double_t GetSignalReferenceCut() const { return fSignalReferenceCut; }
 
      
      virtual void MakeClass( const TString& classFileName = "" ) const;
      
      void PrintHelpMessage() const;
   protected:
      
      virtual void MakeClassSpecific( std::ostream&, const TString& = "" ) const {}
      
      virtual void MakeClassSpecificHeader( std::ostream&, const TString& = "" ) const {}
   public:
      
      static MethodBase* GetThisBase() { return fgThisBase; }        
      
      TDirectory*      BaseDir() const;
      TDirectory*      MethodBaseDir() const;
   protected:
      
      enum ECutOrientation { kNegative = -1, kPositive = +1 };
      ECutOrientation GetCutOrientation() const { return fCutOrientation; }
      
      void ResetThisBase() { fgThisBase = this; }
      
      void     SetSignalReferenceCut( Double_t cut ) { fSignalReferenceCut = cut; }
      
      void     Statistics( TMVA::Types::ETreeType treeType, const TString& theVarName,
                           Double_t&, Double_t&, Double_t&, 
                           Double_t&, Double_t&, Double_t&, Bool_t norm = kFALSE );
         
      Types::ESBType GetVariableTransformType() const { return fVariableTransformType; }
      void           SetVariableTransformType( Types::ESBType t ) { fVariableTransformType = t; }
      
      
      
      
      UInt_t  GetTrainingTMVAVersionCode()   const { return fTMVATrainingVersion; }
      UInt_t  GetTrainingROOTVersionCode()   const { return fROOTTrainingVersion; }
      TString GetTrainingTMVAVersionString() const;
      TString GetTrainingROOTVersionString() const;      
      const TString& GetInternalVarName( Int_t ivar ) const { return (*fInputVars)[ivar]; }
      const TString& GetOriginalVarName( Int_t ivar ) const { return Data().GetExpression(ivar); }
   private:
      DataSet&       fData;                   
      Double_t       fSignalReferenceCut;     
      Types::ESBType fVariableTransformType;  
   protected:
      
      
      TDirectory*      LocalTDir() const { return Data().LocalRootDir(); }
      
      void SetTestvarName( const TString & v="" ) { fTestvar = (v=="")?(fTestvarPrefix + GetMethodTitle()):v; }
      
      const TString& GetTestvarPrefix() const { return fTestvarPrefix; }
      void SetTestvarPrefix( TString prefix ) { fTestvarPrefix = prefix; }
      
      
      Bool_t CheckSanity( TTree* theTree = 0 );
      
      Bool_t TxtWeightsOnly() const { return fTxtWeightsOnly; }       
      
      Ranking*         fRanking;        
      vector<TString>* fInputVars;      
   private:
      TString     fJobName;             
      TString     fMethodName;          
      Types::EMVA fMethodType;          
      TString     fMethodTitle;         
      TString     fTestvar;             
      TString     fTestvarPrefix;       
      UInt_t      fTMVATrainingVersion; 
      UInt_t      fROOTTrainingVersion; 
      Bool_t      fNormalise;           
   private:
      void SetBaseDir( TDirectory* d ) { fBaseDir = d; }
      Double_t GetEventValNormalised(Int_t ivar) const {         
          
         return Tools::NormVariable( GetEvent().GetVal(ivar), GetXmin(ivar), GetXmax(ivar) );
      }
      
      Int_t       fNvar;                
      
      
      
      
      
      
      TDirectory* fBaseDir;             
      TDirectory* fMethodBaseDir;       
      TString   fFileDir;               
      TString   fWeightFile;            
      VariableTransformBase* fVarTransform; 
   protected:
      Bool_t     fIsOK;                 
      TH1*       fHistS_plotbin;        
      TH1*       fHistB_plotbin;        
      TH1*       fProbaS_plotbin;       
      TH1*       fProbaB_plotbin;       
      TH1*       fRarityS_plotbin;      
      TH1*       fRarityB_plotbin;      
      TH1*       fHistS_highbin;        
      TH1*       fHistB_highbin;        
      TH1*       fEffS;                 
      TH1*       fEffB;                 
      TH1*       fEffBvsS;              
      TH1*       fRejBvsS;              
      TH1*       finvBeffvsSeff;        
      TH1*       fHistBhatS;            
      TH1*       fHistBhatB;            
      TH1*       fHistMuS;              
      TH1*       fHistMuB;              
      TH1*       fTrainEffS;            
      TH1*       fTrainEffB;            
      TH1*       fTrainEffBvsS;         
      TH1*       fTrainRejBvsS;         
      Int_t      fNbinsMVAPdf;          
      Int_t      fNsmoothMVAPdf;        
      TMVA::PDF* fMVAPdfS;              
      TMVA::PDF* fMVAPdfB;              
      
      Double_t   fX;
      Double_t   fMode;
      TGraph*    fGraphS;               
      TGraph*    fGraphB;               
      TGraph*    fGrapheffBvsS;         
      PDF*       fSplS;                 
      PDF*       fSplB;                 
      TSpline*   fSpleffBvsS;           
      TGraph*    fGraphTrainS;          
      TGraph*    fGraphTrainB;          
      TGraph*    fGraphTrainEffBvsS;    
      PDF*       fSplTrainS;            
      PDF*       fSplTrainB;            
      TSpline*   fSplTrainEffBvsS;      
   private:
      
      Double_t   fMeanS;                
      Double_t   fMeanB;                
      Double_t   fRmsS;                 
      Double_t   fRmsB;                 
      Double_t   fXmin;                 
      Double_t   fXmax;                 
      Bool_t     fUseDecorr;                         
      Types::EVariableTransform fVariableTransform;  
      TString    fVarTransformString;                
      TString    fVariableTransformTypeString;       
      Bool_t     fVerbose;              
      TString    fVerbosityLevelString; 
      EMsgType   fVerbosityLevel;       
      Bool_t     fHelp;                 
      Bool_t     fIsMVAPdfs;            
      Bool_t     fTxtWeightsOnly;       
   protected:
      Int_t      fNbins;                
      Int_t      fNbinsH;               
      
      ECutOrientation fCutOrientation;  
      
      TSpline1*  fSplRefS;              
      TSpline1*  fSplRefB;              
      TSpline1*  fSplTrainRefS;         
      TSpline1*  fSplTrainRefB;         
   public:
      
      static Double_t IGetEffForRoot( Double_t );  
      Double_t GetEffForRoot( Double_t );          
   private:
      
      static MethodBase* fgThisBase;    
      
      void Init();
      bool GetLine(std::istream& fin, char * buf );
            
   protected:
      
      mutable MsgLogger fLogger; 
      ClassDef(MethodBase,0)  
   };
} 
#endif
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.