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

#include "TTreeFormula.h"
#include "QFramework/TQTreeObservable.h"

class TQTreeFormulaObservable : public TQTreeObservable {

protected:
  TString fExpression = "";
  TTreeFormula * fFormula = NULL;
  bool fcallGetNdata = false;
  bool fVectorObs = false;
  mutable TString fFullExpression; //helper variable for getExpression since we need to prepend the prefix

  virtual double getValueAt(int index) const override;
  virtual int getNevaluations() const override;
  inline virtual TQObservable::ObservableType
    getObservableType() const override {
        if (this->fVectorObs) {
          return TQObservable::ObservableType::vector;
        } else {
          return TQObservable::ObservableType::scalar;
        }
    }

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

public:

  TQTreeFormulaObservable();
  TQTreeFormulaObservable(const TString& expression, bool vectorObs=false);

  virtual double getValue() 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;

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

  DECLARE_OBSERVABLE_FACTORY(TQTreeFormulaObservable, TString expr)
  
  ClassDefOverride(TQTreeFormulaObservable, 0); // observable to access data from a tree using a TTreeFormula

};

#endif
 TQTreeFormulaObservable.h:1
 TQTreeFormulaObservable.h:2
 TQTreeFormulaObservable.h:3
 TQTreeFormulaObservable.h:4
 TQTreeFormulaObservable.h:5
 TQTreeFormulaObservable.h:6
 TQTreeFormulaObservable.h:7
 TQTreeFormulaObservable.h:8
 TQTreeFormulaObservable.h:9
 TQTreeFormulaObservable.h:10
 TQTreeFormulaObservable.h:11
 TQTreeFormulaObservable.h:12
 TQTreeFormulaObservable.h:13
 TQTreeFormulaObservable.h:14
 TQTreeFormulaObservable.h:15
 TQTreeFormulaObservable.h:16
 TQTreeFormulaObservable.h:17
 TQTreeFormulaObservable.h:18
 TQTreeFormulaObservable.h:19
 TQTreeFormulaObservable.h:20
 TQTreeFormulaObservable.h:21
 TQTreeFormulaObservable.h:22
 TQTreeFormulaObservable.h:23
 TQTreeFormulaObservable.h:24
 TQTreeFormulaObservable.h:25
 TQTreeFormulaObservable.h:26
 TQTreeFormulaObservable.h:27
 TQTreeFormulaObservable.h:28
 TQTreeFormulaObservable.h:29
 TQTreeFormulaObservable.h:30
 TQTreeFormulaObservable.h:31
 TQTreeFormulaObservable.h:32
 TQTreeFormulaObservable.h:33
 TQTreeFormulaObservable.h:34
 TQTreeFormulaObservable.h:35
 TQTreeFormulaObservable.h:36
 TQTreeFormulaObservable.h:37
 TQTreeFormulaObservable.h:38
 TQTreeFormulaObservable.h:39
 TQTreeFormulaObservable.h:40
 TQTreeFormulaObservable.h:41
 TQTreeFormulaObservable.h:42
 TQTreeFormulaObservable.h:43
 TQTreeFormulaObservable.h:44
 TQTreeFormulaObservable.h:45
 TQTreeFormulaObservable.h:46
 TQTreeFormulaObservable.h:47
 TQTreeFormulaObservable.h:48
 TQTreeFormulaObservable.h:49
 TQTreeFormulaObservable.h:50
 TQTreeFormulaObservable.h:51
 TQTreeFormulaObservable.h:52
 TQTreeFormulaObservable.h:53