#include "QFramework/TQConstObservable.h"

#include "TFormula.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQTaggable.h"
#include "QFramework/TQStringUtils.h"

// #define _DEBUG_
#include "QFramework/TQLibrary.h"

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQConstObservable
//
// The TQConstObservable is a variant of TQObservable that uses a
// constant expression that does not depend on the event visited and
// does not need any tree access.
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQConstObservable)

//______________________________________________________________________________________________

bool TQConstObservable::initializeSelf(){
	// initialize self
  TString expr = this->getCompiledExpression(this->fSample);
  DEBUGclass("initializing observable with expression '%s'",expr.Data());
  if(TQStringUtils::equal(expr,"nan")){
    this->fValue = std::numeric_limits<double>::quiet_NaN();
  } else {
    TFormula f("const",expr);
    this->fValue = f.Eval(1.);
  }
  return true;
}

//______________________________________________________________________________________________

bool TQConstObservable::finalizeSelf(){
  // finalize self - nothing to do
  return true;
}

//______________________________________________________________________________________________

TQConstObservable::TQConstObservable(){
  // default constructor
}

//______________________________________________________________________________________________

TQConstObservable::TQConstObservable(const TString& expression) :
  TQObservable(expression)
{
  // constructor taking expression arguments
  DEBUGclass("constructor called with expression '%s'",expression.Data());
  this->setExpression(expression);
}

//______________________________________________________________________________________________

double TQConstObservable::getValue() const {
  // retrieve the constant value
  return this->fValue;
}

//______________________________________________________________________________________________

TObjArray* TQConstObservable::getBranchNames() const {
  // the const observable is const, it doesn't need any branches
  return NULL;
}

//______________________________________________________________________________________________

TQConstObservable::~TQConstObservable(){
  // default destructor
}

//______________________________________________________________________________________________

Long64_t TQConstObservable::getCurrentEntry() const {
  // the const observable doesn't know about the entry, this function always returns -1
  return -1;
}

//______________________________________________________________________________________________

const TString& TQConstObservable::getExpression() const {
  // retrieve the expression associated with this observable
  DEBUGclass("retrieving expression '%s'",this->fExpression.Data());
  return this->fExpression;
}

//______________________________________________________________________________________________

bool TQConstObservable::hasExpression() const {
  // check if this observable type knows expressions
  return true;
}

//______________________________________________________________________________________________

void TQConstObservable::setExpression(const TString& expr){
  // set the expression to a given string
  DEBUGclass("setting expression to '%s'",expr.Data());
  this->fExpression = TQStringUtils::compactify(expr);
}


//______________________________________________________________________________________________

DEFINE_OBSERVABLE_FACTORY(TQConstObservable,TString expression){
  // try to create an instance of this observable from the given expression
  if(TQStringUtils::removeLeadingText(expression,"Const:") || TQStringUtils::isValidIdentifier(expression,"0123456789./*+- \t<>=")){
    return new TQConstObservable(expression);
  }
  return NULL;
}
 TQConstObservable.cxx:1
 TQConstObservable.cxx:2
 TQConstObservable.cxx:3
 TQConstObservable.cxx:4
 TQConstObservable.cxx:5
 TQConstObservable.cxx:6
 TQConstObservable.cxx:7
 TQConstObservable.cxx:8
 TQConstObservable.cxx:9
 TQConstObservable.cxx:10
 TQConstObservable.cxx:11
 TQConstObservable.cxx:12
 TQConstObservable.cxx:13
 TQConstObservable.cxx:14
 TQConstObservable.cxx:15
 TQConstObservable.cxx:16
 TQConstObservable.cxx:17
 TQConstObservable.cxx:18
 TQConstObservable.cxx:19
 TQConstObservable.cxx:20
 TQConstObservable.cxx:21
 TQConstObservable.cxx:22
 TQConstObservable.cxx:23
 TQConstObservable.cxx:24
 TQConstObservable.cxx:25
 TQConstObservable.cxx:26
 TQConstObservable.cxx:27
 TQConstObservable.cxx:28
 TQConstObservable.cxx:29
 TQConstObservable.cxx:30
 TQConstObservable.cxx:31
 TQConstObservable.cxx:32
 TQConstObservable.cxx:33
 TQConstObservable.cxx:34
 TQConstObservable.cxx:35
 TQConstObservable.cxx:36
 TQConstObservable.cxx:37
 TQConstObservable.cxx:38
 TQConstObservable.cxx:39
 TQConstObservable.cxx:40
 TQConstObservable.cxx:41
 TQConstObservable.cxx:42
 TQConstObservable.cxx:43
 TQConstObservable.cxx:44
 TQConstObservable.cxx:45
 TQConstObservable.cxx:46
 TQConstObservable.cxx:47
 TQConstObservable.cxx:48
 TQConstObservable.cxx:49
 TQConstObservable.cxx:50
 TQConstObservable.cxx:51
 TQConstObservable.cxx:52
 TQConstObservable.cxx:53
 TQConstObservable.cxx:54
 TQConstObservable.cxx:55
 TQConstObservable.cxx:56
 TQConstObservable.cxx:57
 TQConstObservable.cxx:58
 TQConstObservable.cxx:59
 TQConstObservable.cxx:60
 TQConstObservable.cxx:61
 TQConstObservable.cxx:62
 TQConstObservable.cxx:63
 TQConstObservable.cxx:64
 TQConstObservable.cxx:65
 TQConstObservable.cxx:66
 TQConstObservable.cxx:67
 TQConstObservable.cxx:68
 TQConstObservable.cxx:69
 TQConstObservable.cxx:70
 TQConstObservable.cxx:71
 TQConstObservable.cxx:72
 TQConstObservable.cxx:73
 TQConstObservable.cxx:74
 TQConstObservable.cxx:75
 TQConstObservable.cxx:76
 TQConstObservable.cxx:77
 TQConstObservable.cxx:78
 TQConstObservable.cxx:79
 TQConstObservable.cxx:80
 TQConstObservable.cxx:81
 TQConstObservable.cxx:82
 TQConstObservable.cxx:83
 TQConstObservable.cxx:84
 TQConstObservable.cxx:85
 TQConstObservable.cxx:86
 TQConstObservable.cxx:87
 TQConstObservable.cxx:88
 TQConstObservable.cxx:89
 TQConstObservable.cxx:90
 TQConstObservable.cxx:91
 TQConstObservable.cxx:92
 TQConstObservable.cxx:93
 TQConstObservable.cxx:94
 TQConstObservable.cxx:95
 TQConstObservable.cxx:96
 TQConstObservable.cxx:97
 TQConstObservable.cxx:98
 TQConstObservable.cxx:99
 TQConstObservable.cxx:100
 TQConstObservable.cxx:101
 TQConstObservable.cxx:102
 TQConstObservable.cxx:103
 TQConstObservable.cxx:104
 TQConstObservable.cxx:105
 TQConstObservable.cxx:106
 TQConstObservable.cxx:107
 TQConstObservable.cxx:108
 TQConstObservable.cxx:109
 TQConstObservable.cxx:110
 TQConstObservable.cxx:111
 TQConstObservable.cxx:112
 TQConstObservable.cxx:113
 TQConstObservable.cxx:114
 TQConstObservable.cxx:115
 TQConstObservable.cxx:116
 TQConstObservable.cxx:117
 TQConstObservable.cxx:118
 TQConstObservable.cxx:119
 TQConstObservable.cxx:120