//this file looks like plain C, but it's actually -*- c++ -*-
#ifndef __TQMULTIOBSERVABLE__
#define __TQMULTIOBSERVABLE__
#include "QFramework/TQObservable.h"
#include "TFormula.h"
#include "TObjArray.h"

class TQMultiObservable : public TQObservable {
protected:
  virtual bool initializeSelf() override;
  virtual bool finalizeSelf() override;
  
public:
  virtual int getNevaluations() const override;
  virtual double getValueAt(int index) const override;
  virtual double getValue() const override;
  
  inline virtual TQObservable::ObservableType getObservableType() const override {return this->fObservableType;}

  virtual TObjArray* getBranchNames() const override;
  virtual Long64_t getCurrentEntry() const override;
protected:
  TString fExpression = "";
  TString fActiveExpression = "";
  TString fParsedExpression = "";
  std::vector<TQObservable*> fObservables;
  TQObservable::ObservableType fObservableType = TQObservable::ObservableType::unknown;
  TFormula* fFormula = NULL; //!
  mutable Long64_t fCachedEntry; //!
  mutable std::vector<double> fCachedValue; //!

public:
  
  static bool gEvaluateSubObservablesLazily;

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

  TQMultiObservable();
  TQMultiObservable(const TString& expression);
  virtual ~TQMultiObservable();
    
  bool parseExpression(const TString& expr);
  void clearParsedExpression();
  TString getParsedExpression();
  TQObservable* getObservable(int idx);
  
  virtual TString getActiveExpression() const override;

  DECLARE_OBSERVABLE_FACTORY(TQMultiObservable,TString expression)
  
  ClassDefOverride(TQMultiObservable, 0); // meta-observable combining data from other observables

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