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

#include "QFramework/TQObservable.h"
#include "TMVA/Reader.h"
#include "QFramework/TQNamedTaggable.h"

class TQMVAObservable : public TQObservable {
 
public:
  static TQTaggable globalAliases;
  
  class Reader { //nested
  protected:
    TString fFileName = "";
    TString fMethodName = "";
    TMVA::Reader* fMVAReader = NULL;
    TMVA::IMethod* fMVAMethod = NULL;
    TObjArray* fVariables = NULL;
    mutable std::vector<float> fValues;
    std::vector<TString> fExpressions;

    int parseVariables();
    void assignVariables();
    void clearVariables();
    void printVariables() const;
    void print() const;

  public:
    Reader(const char* filename, const char* methodname);

    size_t size() const;
    const TString& getExpression(size_t i) const;
    double getValue() const;
    void fillValue(size_t i,double val) const ;
      
    static bool getExpression(TQTaggable* var, TString& result);
  };

protected:
  Reader* fReader = NULL;
  
  TString fExpression = "";
  std::vector<TQObservable*> fObservables;
  mutable Long64_t fCachedEntry = -1; //!
  mutable double fCachedValue = -1; //!

  virtual bool initializeSelf() override;
  virtual bool finalizeSelf() override;

public:
  static TQMVAObservable::Reader* getReader(const TString& expression);

  virtual Long64_t getCurrentEntry() const override;

  virtual bool hasExpression() const override;
  virtual const TString& getExpression() const override;
  virtual void setExpression(const TString& expr) override;
  virtual TString getActiveExpression() const override;

  TQMVAObservable();
  TQMVAObservable(const TString& expression);

  virtual double getValue() const override;

  virtual TObjArray* getBranchNames() const override;
 
  virtual ~TQMVAObservable();

  DECLARE_OBSERVABLE_FACTORY(TQMVAObservable,TString expression)
  
  ClassDefOverride(TQMVAObservable, 0);

};

#endif
 TQMVAObservable.h:1
 TQMVAObservable.h:2
 TQMVAObservable.h:3
 TQMVAObservable.h:4
 TQMVAObservable.h:5
 TQMVAObservable.h:6
 TQMVAObservable.h:7
 TQMVAObservable.h:8
 TQMVAObservable.h:9
 TQMVAObservable.h:10
 TQMVAObservable.h:11
 TQMVAObservable.h:12
 TQMVAObservable.h:13
 TQMVAObservable.h:14
 TQMVAObservable.h:15
 TQMVAObservable.h:16
 TQMVAObservable.h:17
 TQMVAObservable.h:18
 TQMVAObservable.h:19
 TQMVAObservable.h:20
 TQMVAObservable.h:21
 TQMVAObservable.h:22
 TQMVAObservable.h:23
 TQMVAObservable.h:24
 TQMVAObservable.h:25
 TQMVAObservable.h:26
 TQMVAObservable.h:27
 TQMVAObservable.h:28
 TQMVAObservable.h:29
 TQMVAObservable.h:30
 TQMVAObservable.h:31
 TQMVAObservable.h:32
 TQMVAObservable.h:33
 TQMVAObservable.h:34
 TQMVAObservable.h:35
 TQMVAObservable.h:36
 TQMVAObservable.h:37
 TQMVAObservable.h:38
 TQMVAObservable.h:39
 TQMVAObservable.h:40
 TQMVAObservable.h:41
 TQMVAObservable.h:42
 TQMVAObservable.h:43
 TQMVAObservable.h:44
 TQMVAObservable.h:45
 TQMVAObservable.h:46
 TQMVAObservable.h:47
 TQMVAObservable.h:48
 TQMVAObservable.h:49
 TQMVAObservable.h:50
 TQMVAObservable.h:51
 TQMVAObservable.h:52
 TQMVAObservable.h:53
 TQMVAObservable.h:54
 TQMVAObservable.h:55
 TQMVAObservable.h:56
 TQMVAObservable.h:57
 TQMVAObservable.h:58
 TQMVAObservable.h:59
 TQMVAObservable.h:60
 TQMVAObservable.h:61
 TQMVAObservable.h:62
 TQMVAObservable.h:63
 TQMVAObservable.h:64
 TQMVAObservable.h:65
 TQMVAObservable.h:66
 TQMVAObservable.h:67
 TQMVAObservable.h:68
 TQMVAObservable.h:69
 TQMVAObservable.h:70
 TQMVAObservable.h:71
 TQMVAObservable.h:72
 TQMVAObservable.h:73
 TQMVAObservable.h:74
 TQMVAObservable.h:75
 TQMVAObservable.h:76
 TQMVAObservable.h:77