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

class TQVectorAuxObservable : public TQObservable {
protected:
  // put here any data members your class might need
  TQObservable* fSubObservable = NULL; //!
  TQObservable* fIndexObservable = NULL; //! //only to be used for 'AT' mode indicating the index of fSubObservable to be returned
  
  mutable Long64_t fCachedEntry; //!
  mutable double fCachedValue; //!
  mutable TString fFullExpression; //helper variable for getExpression since we need to prepend the prefix
  
public:
  virtual int getNevaluations() const override;
  virtual double getValue() const override;
  virtual double getValueAt(int index) const override;
  inline virtual TQObservable::ObservableType getObservableType() const override {return this->fObservableType;}
  virtual TObjArray* getBranchNames() const override;
  virtual Long64_t getCurrentEntry() const override;
  
  enum Operation {AND,OR,SUM,SUMABS,AVG,AVGABS,LEN,MAX,MIN,MAXABS,MINABS,NORM,PROD,NTRUE,NFALSE,AT,INDICES,invalid};

protected:
  virtual bool initializeSelf() override;
  virtual bool finalizeSelf() override;
  
  //vector valued evaluation methods
  double getValueAtINDICES(int index) const;  
  
protected:
  TString fExpression = ""; //full, "raw" expression
  TString fVecExpression = ""; //in any case the first sub-expression
  TString fIndexExpression = ""; //only used for 'AT' mode
  TQVectorAuxObservable::Operation fOperation = TQVectorAuxObservable::Operation::invalid;
  TQObservable::ObservableType fObservableType = TQObservable::ObservableType::unknown;
public:
  inline TQVectorAuxObservable::Operation getOperation() const {return this->fOperation;}
  void setOperation(TQVectorAuxObservable::Operation op); // {this->fOperation = op; return;}
  static TString getOperationName(TQVectorAuxObservable::Operation op);
  static TString getPrefix(TQVectorAuxObservable::Operation op);
  static TQVectorAuxObservable::Operation readPrefix(TString& expression);
  
  virtual bool hasExpression() const override;
  virtual const TString& getExpression() const override;
  virtual void setExpression(const TString& expr) override;
  
  inline virtual bool isPrefixRequired() const override {return true;} ; //needs to be overridden if an observable (with a factory) should only be matched if it's prefix is present. In this case the observable must ensure to include its prefix in strings returned by getExpression, getActiveExpression,...
  
  TQVectorAuxObservable();
  TQVectorAuxObservable(const TString& expression);
  virtual ~TQVectorAuxObservable();
public:

  virtual TString getActiveExpression() const override;
  
  
public:
  DECLARE_OBSERVABLE_FACTORY(TQVectorAuxObservable,TString expr)

  ClassDefOverride(TQVectorAuxObservable, 0); //QFramework class

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