#include "QFramework/TQTreeObservable.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQToken.h"
#include "QFramework/TQUtils.h"
#include "TTree.h"
#include "QFramework/TQIterator.h"

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

#include <iostream>

ClassImp(TQTreeObservable)

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQTreeObservable
//
// The TQTreeObservable is a (still abstract) specialization of the abstract class TQObservable.
// It provides derived classes with an automated mechanism to access the Tree.
//
////////////////////////////////////////////////////////////////////////////////////////////////
/*@observable: [TQTreeFormulaObservable] The TQTreeObservable is a still abstract class derived from
    TQObservable which is intended to be used as a base class to (usually non-abstract) Observables
    which require access to the TTree.
*/

//______________________________________________________________________________________________

TQTreeObservable::TQTreeObservable() : 
TQObservable()
{
  // default constructor
}

//______________________________________________________________________________________________

TQTreeObservable::TQTreeObservable(const TString& expression) :
  TQObservable(expression)
{
  // constructor with expression argument
}

//______________________________________________________________________________________________

bool TQTreeObservable::initialize(TQSample * sample){
  // initialize this observable, obtain a tree token
  if(this->fIsInitialized) return true;
  /* we can't do anything if we already own a tree token */
  if (this->fTreeToken || this->fTree) return false;

  /* the sample to use has to be valid */
  if(!sample) return false;

  /* try to get a tree token */
  this->fTreeToken = sample->getTreeToken();
  if (!this->fTreeToken) return false;

  this->fSample = sample;
  this->fTreeToken->setOwner(this);
  this->fTree = static_cast<TTree*>(this->fTreeToken->getContent());
 
  this->fIsInitialized = this->initializeSelf();

  if(!this->fIsInitialized){
    if(this->fTreeToken && this->fSample) this->fSample->returnToken(this->fTreeToken);
    this->fTreeToken = 0;
    this->fSample = 0;
    this->fTree = 0;
  }

  return this->fIsInitialized;
}


//______________________________________________________________________________________________

bool TQTreeObservable::finalize() {
  // finalize this observable, return the tree token
  if(!this->fIsInitialized){
    return true;
  }
 
  if (!this->fTreeToken) return false;
  if (!this->fSample) return false;
  if (!this->fTree) return false;
 
  bool ok = this->finalizeSelf();
  this->fIsInitialized = !(this->fSample->returnToken(this->fTreeToken) && ok);
 
  this->fTreeToken = 0;
  this->fSample = 0;
  this->fTree = 0;
 
  return (!this->fIsInitialized);

}


//______________________________________________________________________________________________

TQTreeObservable::~TQTreeObservable() {
  // standard destructor
}

//______________________________________________________________________________________________

void TQTreeObservable::print() const {
  // print the contents of this observable and its associated branches
  std::cout << TQStringUtils::makeBoldYellow(this->getExpression()) << std::endl;
  TQUtils::printBranches(this->fTree);
}

//______________________________________________________________________________________________

Long64_t TQTreeObservable::getCurrentEntry() const {
  // retrieve the current entry from the tree
  if(!this->fTree) return -1;
  return this->fTree->GetReadEntry();
}
 TQTreeObservable.cxx:1
 TQTreeObservable.cxx:2
 TQTreeObservable.cxx:3
 TQTreeObservable.cxx:4
 TQTreeObservable.cxx:5
 TQTreeObservable.cxx:6
 TQTreeObservable.cxx:7
 TQTreeObservable.cxx:8
 TQTreeObservable.cxx:9
 TQTreeObservable.cxx:10
 TQTreeObservable.cxx:11
 TQTreeObservable.cxx:12
 TQTreeObservable.cxx:13
 TQTreeObservable.cxx:14
 TQTreeObservable.cxx:15
 TQTreeObservable.cxx:16
 TQTreeObservable.cxx:17
 TQTreeObservable.cxx:18
 TQTreeObservable.cxx:19
 TQTreeObservable.cxx:20
 TQTreeObservable.cxx:21
 TQTreeObservable.cxx:22
 TQTreeObservable.cxx:23
 TQTreeObservable.cxx:24
 TQTreeObservable.cxx:25
 TQTreeObservable.cxx:26
 TQTreeObservable.cxx:27
 TQTreeObservable.cxx:28
 TQTreeObservable.cxx:29
 TQTreeObservable.cxx:30
 TQTreeObservable.cxx:31
 TQTreeObservable.cxx:32
 TQTreeObservable.cxx:33
 TQTreeObservable.cxx:34
 TQTreeObservable.cxx:35
 TQTreeObservable.cxx:36
 TQTreeObservable.cxx:37
 TQTreeObservable.cxx:38
 TQTreeObservable.cxx:39
 TQTreeObservable.cxx:40
 TQTreeObservable.cxx:41
 TQTreeObservable.cxx:42
 TQTreeObservable.cxx:43
 TQTreeObservable.cxx:44
 TQTreeObservable.cxx:45
 TQTreeObservable.cxx:46
 TQTreeObservable.cxx:47
 TQTreeObservable.cxx:48
 TQTreeObservable.cxx:49
 TQTreeObservable.cxx:50
 TQTreeObservable.cxx:51
 TQTreeObservable.cxx:52
 TQTreeObservable.cxx:53
 TQTreeObservable.cxx:54
 TQTreeObservable.cxx:55
 TQTreeObservable.cxx:56
 TQTreeObservable.cxx:57
 TQTreeObservable.cxx:58
 TQTreeObservable.cxx:59
 TQTreeObservable.cxx:60
 TQTreeObservable.cxx:61
 TQTreeObservable.cxx:62
 TQTreeObservable.cxx:63
 TQTreeObservable.cxx:64
 TQTreeObservable.cxx:65
 TQTreeObservable.cxx:66
 TQTreeObservable.cxx:67
 TQTreeObservable.cxx:68
 TQTreeObservable.cxx:69
 TQTreeObservable.cxx:70
 TQTreeObservable.cxx:71
 TQTreeObservable.cxx:72
 TQTreeObservable.cxx:73
 TQTreeObservable.cxx:74
 TQTreeObservable.cxx:75
 TQTreeObservable.cxx:76
 TQTreeObservable.cxx:77
 TQTreeObservable.cxx:78
 TQTreeObservable.cxx:79
 TQTreeObservable.cxx:80
 TQTreeObservable.cxx:81
 TQTreeObservable.cxx:82
 TQTreeObservable.cxx:83
 TQTreeObservable.cxx:84
 TQTreeObservable.cxx:85
 TQTreeObservable.cxx:86
 TQTreeObservable.cxx:87
 TQTreeObservable.cxx:88
 TQTreeObservable.cxx:89
 TQTreeObservable.cxx:90
 TQTreeObservable.cxx:91
 TQTreeObservable.cxx:92
 TQTreeObservable.cxx:93
 TQTreeObservable.cxx:94
 TQTreeObservable.cxx:95
 TQTreeObservable.cxx:96
 TQTreeObservable.cxx:97
 TQTreeObservable.cxx:98
 TQTreeObservable.cxx:99
 TQTreeObservable.cxx:100
 TQTreeObservable.cxx:101
 TQTreeObservable.cxx:102
 TQTreeObservable.cxx:103
 TQTreeObservable.cxx:104
 TQTreeObservable.cxx:105
 TQTreeObservable.cxx:106
 TQTreeObservable.cxx:107
 TQTreeObservable.cxx:108
 TQTreeObservable.cxx:109
 TQTreeObservable.cxx:110
 TQTreeObservable.cxx:111
 TQTreeObservable.cxx:112
 TQTreeObservable.cxx:113
 TQTreeObservable.cxx:114
 TQTreeObservable.cxx:115
 TQTreeObservable.cxx:116
 TQTreeObservable.cxx:117
 TQTreeObservable.cxx:118
 TQTreeObservable.cxx:119
 TQTreeObservable.cxx:120
 TQTreeObservable.cxx:121