/**********************************************************************************
 * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
 * Package: TMVA                                                                  *
 * Class  : OptimizeConfigParameters                                              *
 * Web    : http://tmva.sourceforge.net                                           *
 *                                                                                *
 * Description: The OptimizeConfigParameters takes care of "scanning/fitting"     *
 *              different tuning parameters in order to find the best set of      *
 *              tuning paraemters which will be used in the end                   *
 *                                                                                *
 * Authors (alphabetical):                                                        *
 *      Helge Voss      <Helge.Voss@cern.ch>     - MPI-K Heidelberg, Germany      *
 *                                                                                *
 * Copyright (c) 2005:                                                            *
 *      CERN, Switzerland                                                         * 
 *      MPI-K Heidelberg, Germany                                                 * 
 *                                                                                *
 * Redistribution and use in source and binary forms, with or without             *
 * modification, are permitted according to the terms listed in LICENSE           *
 * (http://ttmva.sourceforge.net/LICENSE)                                         *
 **********************************************************************************/
#include <map>

#ifndef ROOT_TMVA_OptimizeConfigParameters
#define ROOT_TMVA_OptimizeConfigParameters


#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

#ifndef ROOT_TString
#include "TString.h"
#endif

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


#ifndef ROOT_TMVA_Interval
#include "TMVA/Interval.h"
#endif

#ifndef ROOT_TMVA_DataSet
#include "TMVA/DataSet.h"
#endif

#ifndef ROOT_TMVA_IFitterTarget
#ifndef ROOT_IFitterTarget
#include "IFitterTarget.h"
#endif
#endif

#ifndef ROOT_TH1
#include "TH1.h"
#endif

namespace TMVA {

   class MethodBase;
   class MsgLogger;
   class OptimizeConfigParameters : public IFitterTarget  {
      
   public:
      
      //default constructor
      OptimizeConfigParameters(MethodBase * const method, std::map<TString,TMVA::Interval*> tuneParameters, TString fomType="Separation", TString optimizationType = "GA"); 
      
      // destructor
      virtual ~OptimizeConfigParameters();
      // could later be changed to be set via option string... 
      // but for now it's impler like this
      std::map<TString,Double_t> optimize();
      
   private:
      std::vector< int > GetScanIndices( int val, std::vector<int> base);
      void optimizeScan();
      void optimizeFit();

      Double_t EstimatorFunction( std::vector<Double_t> & );

      Double_t GetFOM();
      
      MethodBase* GetMethod(){return fMethod;}
      
      void GetMVADists();
      Double_t GetSeparation();
      Double_t GetROCIntegral();
      Double_t GetSigEffAtBkgEff( Double_t bkgEff = 0.1);
      Double_t GetBkgEffAtSigEff( Double_t sigEff = 0.5);
      Double_t GetBkgRejAtSigEff( Double_t sigEff = 0.5);
      
     
      MethodBase* const fMethod; // The MVA method to be evaluated
      std::vector<Float_t>             fFOMvsIter; // graph showing the develompment of the Figure Of Merit values during the fit
      std::map<TString,TMVA::Interval*> fTuneParameters; // parameters included in the tuning
      std::map<TString,Double_t>       fTunedParameters; // parameters included in the tuning
      std::map< std::vector<Double_t> , Double_t>  fAlreadyTrainedParCombination; // save parameters for which the FOM is already known (GA seems to evaluate the same parameters several times)
      TString           fFOMType;    // the FOM type (Separation, ROC integra.. whaeter you implemented..
      TString           fOptimizationFitType; // which type of optimisation procedure to be used 
      TH1D             *fMvaSig; // MVA distrituion for signal events, used for spline fit
      TH1D             *fMvaBkg; // MVA distrituion for bakgr. events, used for spline fit
      
      TH1D             *fMvaSigFineBin; // MVA distrituion for signal events
      TH1D             *fMvaBkgFineBin; // MVA distrituion for bakgr. events

      Bool_t           fNotDoneYet; // flat to indicate of Method Transformations have been optained yet or not (normally done in MethodBase::TrainMethod)

      mutable MsgLogger*         fLogger;   // message logger
      MsgLogger& Log() const { return *fLogger; }

      ClassDef(OptimizeConfigParameters,0) // Interface to different separation critiera used in training algorithms
   };
} // namespace TMVA

#endif
 OptimizeConfigParameters.h:1
 OptimizeConfigParameters.h:2
 OptimizeConfigParameters.h:3
 OptimizeConfigParameters.h:4
 OptimizeConfigParameters.h:5
 OptimizeConfigParameters.h:6
 OptimizeConfigParameters.h:7
 OptimizeConfigParameters.h:8
 OptimizeConfigParameters.h:9
 OptimizeConfigParameters.h:10
 OptimizeConfigParameters.h:11
 OptimizeConfigParameters.h:12
 OptimizeConfigParameters.h:13
 OptimizeConfigParameters.h:14
 OptimizeConfigParameters.h:15
 OptimizeConfigParameters.h:16
 OptimizeConfigParameters.h:17
 OptimizeConfigParameters.h:18
 OptimizeConfigParameters.h:19
 OptimizeConfigParameters.h:20
 OptimizeConfigParameters.h:21
 OptimizeConfigParameters.h:22
 OptimizeConfigParameters.h:23
 OptimizeConfigParameters.h:24
 OptimizeConfigParameters.h:25
 OptimizeConfigParameters.h:26
 OptimizeConfigParameters.h:27
 OptimizeConfigParameters.h:28
 OptimizeConfigParameters.h:29
 OptimizeConfigParameters.h:30
 OptimizeConfigParameters.h:31
 OptimizeConfigParameters.h:32
 OptimizeConfigParameters.h:33
 OptimizeConfigParameters.h:34
 OptimizeConfigParameters.h:35
 OptimizeConfigParameters.h:36
 OptimizeConfigParameters.h:37
 OptimizeConfigParameters.h:38
 OptimizeConfigParameters.h:39
 OptimizeConfigParameters.h:40
 OptimizeConfigParameters.h:41
 OptimizeConfigParameters.h:42
 OptimizeConfigParameters.h:43
 OptimizeConfigParameters.h:44
 OptimizeConfigParameters.h:45
 OptimizeConfigParameters.h:46
 OptimizeConfigParameters.h:47
 OptimizeConfigParameters.h:48
 OptimizeConfigParameters.h:49
 OptimizeConfigParameters.h:50
 OptimizeConfigParameters.h:51
 OptimizeConfigParameters.h:52
 OptimizeConfigParameters.h:53
 OptimizeConfigParameters.h:54
 OptimizeConfigParameters.h:55
 OptimizeConfigParameters.h:56
 OptimizeConfigParameters.h:57
 OptimizeConfigParameters.h:58
 OptimizeConfigParameters.h:59
 OptimizeConfigParameters.h:60
 OptimizeConfigParameters.h:61
 OptimizeConfigParameters.h:62
 OptimizeConfigParameters.h:63
 OptimizeConfigParameters.h:64
 OptimizeConfigParameters.h:65
 OptimizeConfigParameters.h:66
 OptimizeConfigParameters.h:67
 OptimizeConfigParameters.h:68
 OptimizeConfigParameters.h:69
 OptimizeConfigParameters.h:70
 OptimizeConfigParameters.h:71
 OptimizeConfigParameters.h:72
 OptimizeConfigParameters.h:73
 OptimizeConfigParameters.h:74
 OptimizeConfigParameters.h:75
 OptimizeConfigParameters.h:76
 OptimizeConfigParameters.h:77
 OptimizeConfigParameters.h:78
 OptimizeConfigParameters.h:79
 OptimizeConfigParameters.h:80
 OptimizeConfigParameters.h:81
 OptimizeConfigParameters.h:82
 OptimizeConfigParameters.h:83
 OptimizeConfigParameters.h:84
 OptimizeConfigParameters.h:85
 OptimizeConfigParameters.h:86
 OptimizeConfigParameters.h:87
 OptimizeConfigParameters.h:88
 OptimizeConfigParameters.h:89
 OptimizeConfigParameters.h:90
 OptimizeConfigParameters.h:91
 OptimizeConfigParameters.h:92
 OptimizeConfigParameters.h:93
 OptimizeConfigParameters.h:94
 OptimizeConfigParameters.h:95
 OptimizeConfigParameters.h:96
 OptimizeConfigParameters.h:97
 OptimizeConfigParameters.h:98
 OptimizeConfigParameters.h:99
 OptimizeConfigParameters.h:100
 OptimizeConfigParameters.h:101
 OptimizeConfigParameters.h:102
 OptimizeConfigParameters.h:103
 OptimizeConfigParameters.h:104
 OptimizeConfigParameters.h:105
 OptimizeConfigParameters.h:106
 OptimizeConfigParameters.h:107
 OptimizeConfigParameters.h:108
 OptimizeConfigParameters.h:109
 OptimizeConfigParameters.h:110
 OptimizeConfigParameters.h:111
 OptimizeConfigParameters.h:112
 OptimizeConfigParameters.h:113
 OptimizeConfigParameters.h:114
 OptimizeConfigParameters.h:115
 OptimizeConfigParameters.h:116
 OptimizeConfigParameters.h:117