//this file looks like plain C, but it's actually -*- c++ -*-
#ifndef __TQMVA__
#define __TQMVA__

#include "QFramework/TQNamedTaggable.h"
#include "TObject.h"

#include "QFramework/TQSampleFolder.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQToken.h"
#include "QFramework/TQCut.h"

#include "RVersion.h"
#if ROOT_VERSION_CODE < ROOT_VERSION(6,07,00)
#define LEGACY_INTERFACE_PRE_607
#endif

namespace TMVA { //EXCLUDE
  class Factory;
#ifndef LEGACY_INTERFACE_PRE_607
  class DataLoader;
#endif
}

class TQSample;

class TQMVA : public TQNamedTaggable {

protected:
  std::vector<TString> fSigPaths;
  std::vector<TString> fBkgPaths;

  TMVA::Factory* fMVA = NULL;
#ifndef LEGACY_INTERFACE_PRE_607
  TMVA::DataLoader* fDataLoader = NULL;
#endif
  TQSampleFolder* fSampleFolder = NULL;
  TQCut* fBaseCut = NULL;
  TQCut* fActiveCut = NULL;
  TFile* fOutputFile = NULL;
  int fVerbose = 1;
  TQTaggable* fAliases = NULL;

  std::vector<TString> fNames;
  std::vector<TString> fExpressions;
  void init();
  void addVariable(const TString& name, const TString& title, const TString& expression, const TString& unit, char vtype, double min, double max, bool spectator);

public:

  enum SampleType { // nested
    Signal, Background
  };

  class EventSelector { // nested
    friend class TQMVA;
    virtual bool selectEvent(int evtno) const = 0;
  };
  class AllTrainEventSelector : public EventSelector { // nested
    virtual bool selectEvent(int /*evtno*/) const { return true; };
  };
  class AllTestEventSelector : public EventSelector { // nested
    virtual bool selectEvent(int /*evtno*/) const { return false; };
  };
  class EvenOddEventSelector : public EventSelector { // nested
    virtual bool selectEvent(int evtno) const { return ((evtno % 2) == 0); };
  };
  class OddEvenEventSelector : public EventSelector { // nested
    virtual bool selectEvent(int evtno) const { return ((evtno % 2) == 1); };
  };
 
  TQMVA();
  TQMVA(const TString& name_);
  TQMVA(TQSampleFolder* sf);
  TQMVA(const TString& name_, TQSampleFolder* sf);
 
  void addSignal(const TString& path);
  void addBackground(const TString& path);
  void clearSignal();
  void clearBackground();

  void setVerbose(int verbose);

  void bookVariable(const TString& name, const TString& expression, double min = 0, double max = 0);
  void bookVariable(const TString& name, const TString& expression, const TString& title, double min = 0, double max = 0);
  void bookVariable(const TString& name, const TString& expression, const TString& title, const TString& unit, double min = 0, double max = 0);

  void bookVariable(const char* name, const char* expression, double min = 0, double max = 0);
  void bookVariable(const char* name, const char* expression, const char* title, double min = 0, double max = 0);
  void bookVariable(const char* name, const char* expression, const char* title, const char* unit, double min = 0, double max = 0);

  void bookSpectator(const TString& name, const TString& expression, double min = 0, double max = 0);
  void bookSpectator(const TString& name, const TString& expression, const TString& title, double min = 0, double max = 0);
  void bookSpectator(const TString& name, const TString& expression, const TString& title, const TString& unit, double min = 0, double max = 0);

  void bookSpectator(const char* name, const char* expression, double min = 0, double max = 0);
  void bookSpectator(const char* name, const char* expression, const char* title, double min = 0, double max = 0);
  void bookSpectator(const char* name, const char* expression, const char* title, const char* unit, double min = 0, double max = 0);


  void printInternalVariables() const; 
  void printListOfVariables() const;

  TString getVariableExpression(const TString& var);
  TString getVariableExpression(const char* var);

  virtual TQCut* useCut(const TString& name);
  virtual void setBaseCut(TQCut* cut);
  virtual TQCut* getBaseCut();

  TList* getListOfSamples(TQMVA::SampleType type);
  void printListOfSamples(TQMVA::SampleType type);

  virtual ~TQMVA();
 
  TMVA::Factory* getFactory();
  void setFactory(TMVA::Factory* mva);
  TQSampleFolder* getSampleFolder();
  void setSampleFolder(TQSampleFolder* sf);
  bool createFactory(const TString& outFileName, const TString& options = "");
  void deleteFactory();
  void closeOutputFile();

  TQTaggable* getAliases();
  void setAliases(TQTaggable* aliases);
 
  int readSamplesOfType(TQMVA::SampleType type, const TQMVA::EventSelector& sel);
  int readSamplesOfType(TQMVA::SampleType type);
  int readSamples(const TQMVA::EventSelector& evtsel);
  int readSamples();
  int readSample(TQSample* s, TQMVA::SampleType type, const TQMVA::EventSelector& sel);
 
  void prepareTrees(const TString& options = "");

  ClassDefOverride(TQMVA, 1); //QFramework class
 
};

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