#include "TTree.h"
#include "TTreeFormula.h"
#include "TH1F.h"

#include "QFramework/TQSampleVisitor.h"
#include "QFramework/TQAnalysisSampleVisitorBase.h"
#include "QFramework/TQCounter.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQIterator.h"

#include "TList.h"
#include "TObjString.h"
#include "TStopwatch.h"

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

#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQAnalysisSampleVisitorBase:
//
// An abstract base class for various types of analysis sample visitors.
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQAnalysisSampleVisitorBase)

//__________________________________________________________________________________|___________


TQAnalysisSampleVisitorBase::TQAnalysisSampleVisitorBase(const TString& name, bool verbose) : 
  TQSampleVisitor(name),
  fUseBranches(UseBranches::ReducedBranches),
  fDebugMode(false),
  fMaxEvents(LLONG_MAX),
  fSkipEvents(0)  
{
  // constructor with name and verbosity setting
  this->setVerbose(verbose);
}


//__________________________________________________________________________________|___________

int TQAnalysisSampleVisitorBase::initialize(TQSampleFolder */*sampleFolder*/, TString& message) {
  // initialize a sample folder
  message.Append(" ");
  message.Append(TQStringUtils::fixedWidth("# Entries", 12,"r"));
  message.Append(TQStringUtils::fixedWidth("Time [sec]", 12,"r"));
  message.Append(" ");
  message.Append(TQStringUtils::fixedWidth("Message", 40, "l")); 

  return visitOK;
 
}

//__________________________________________________________________________________|___________

void TQAnalysisSampleVisitorBase::setUseBranches(UseBranches branchSetting){
  // set the branch policy
  this->fUseBranches = branchSetting;
}

//__________________________________________________________________________________|___________

void TQAnalysisSampleVisitorBase::setDebugMode(bool debug){
  // enable debugging mode
  this->fDebugMode = debug;
}

//__________________________________________________________________________________|___________

void TQAnalysisSampleVisitorBase::setMaxEvents(Long64_t max){
  // set the maximum number of events to analyse per sample
  this->fMaxEvents = max;
}

//__________________________________________________________________________________|___________

void TQAnalysisSampleVisitorBase::setSkipEvents(Long64_t skip){
  // set the number of events to skip at the beginning of each sample
  this->fSkipEvents = skip;
}

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

bool TQAnalysisSampleVisitorBase::setupBranches(TTree* tree, TCollection* branchNames){
	// setup all the branches in the given tree, depending on the branch policy and the given list of branch names
  if(!tree || !branchNames) return false;
  if (fUseBranches == UseBranches::ReducedBranches) {
    // use only branches found in cuts and jobs 
    DEBUGclass("enabling requested branches");
    TQIterator itr(branchNames);
    while(itr.hasNext()){
      TObject* bName = itr.readNext();
      if(!bName) continue;
      TString name(bName->GetName());
      if (name.First('*') != kNPOS || tree->FindBranch(name)){
        tree->SetBranchStatus(name, 1);
      }
    }
    return true;
  } else if(fUseBranches == UseBranches::TTreeCache){
    // use TTreeCache 
    WARNclass("TTreeCache branch management is not yet implemented!");
    // TODO!
    tree->SetBranchStatus("*", 1);
    return true;
  } else {
    /* use all branches */
    DEBUGclass("enabling all branches");
    tree->SetBranchStatus("*", 1);
    return true;
  }
}
 TQAnalysisSampleVisitorBase.cxx:1
 TQAnalysisSampleVisitorBase.cxx:2
 TQAnalysisSampleVisitorBase.cxx:3
 TQAnalysisSampleVisitorBase.cxx:4
 TQAnalysisSampleVisitorBase.cxx:5
 TQAnalysisSampleVisitorBase.cxx:6
 TQAnalysisSampleVisitorBase.cxx:7
 TQAnalysisSampleVisitorBase.cxx:8
 TQAnalysisSampleVisitorBase.cxx:9
 TQAnalysisSampleVisitorBase.cxx:10
 TQAnalysisSampleVisitorBase.cxx:11
 TQAnalysisSampleVisitorBase.cxx:12
 TQAnalysisSampleVisitorBase.cxx:13
 TQAnalysisSampleVisitorBase.cxx:14
 TQAnalysisSampleVisitorBase.cxx:15
 TQAnalysisSampleVisitorBase.cxx:16
 TQAnalysisSampleVisitorBase.cxx:17
 TQAnalysisSampleVisitorBase.cxx:18
 TQAnalysisSampleVisitorBase.cxx:19
 TQAnalysisSampleVisitorBase.cxx:20
 TQAnalysisSampleVisitorBase.cxx:21
 TQAnalysisSampleVisitorBase.cxx:22
 TQAnalysisSampleVisitorBase.cxx:23
 TQAnalysisSampleVisitorBase.cxx:24
 TQAnalysisSampleVisitorBase.cxx:25
 TQAnalysisSampleVisitorBase.cxx:26
 TQAnalysisSampleVisitorBase.cxx:27
 TQAnalysisSampleVisitorBase.cxx:28
 TQAnalysisSampleVisitorBase.cxx:29
 TQAnalysisSampleVisitorBase.cxx:30
 TQAnalysisSampleVisitorBase.cxx:31
 TQAnalysisSampleVisitorBase.cxx:32
 TQAnalysisSampleVisitorBase.cxx:33
 TQAnalysisSampleVisitorBase.cxx:34
 TQAnalysisSampleVisitorBase.cxx:35
 TQAnalysisSampleVisitorBase.cxx:36
 TQAnalysisSampleVisitorBase.cxx:37
 TQAnalysisSampleVisitorBase.cxx:38
 TQAnalysisSampleVisitorBase.cxx:39
 TQAnalysisSampleVisitorBase.cxx:40
 TQAnalysisSampleVisitorBase.cxx:41
 TQAnalysisSampleVisitorBase.cxx:42
 TQAnalysisSampleVisitorBase.cxx:43
 TQAnalysisSampleVisitorBase.cxx:44
 TQAnalysisSampleVisitorBase.cxx:45
 TQAnalysisSampleVisitorBase.cxx:46
 TQAnalysisSampleVisitorBase.cxx:47
 TQAnalysisSampleVisitorBase.cxx:48
 TQAnalysisSampleVisitorBase.cxx:49
 TQAnalysisSampleVisitorBase.cxx:50
 TQAnalysisSampleVisitorBase.cxx:51
 TQAnalysisSampleVisitorBase.cxx:52
 TQAnalysisSampleVisitorBase.cxx:53
 TQAnalysisSampleVisitorBase.cxx:54
 TQAnalysisSampleVisitorBase.cxx:55
 TQAnalysisSampleVisitorBase.cxx:56
 TQAnalysisSampleVisitorBase.cxx:57
 TQAnalysisSampleVisitorBase.cxx:58
 TQAnalysisSampleVisitorBase.cxx:59
 TQAnalysisSampleVisitorBase.cxx:60
 TQAnalysisSampleVisitorBase.cxx:61
 TQAnalysisSampleVisitorBase.cxx:62
 TQAnalysisSampleVisitorBase.cxx:63
 TQAnalysisSampleVisitorBase.cxx:64
 TQAnalysisSampleVisitorBase.cxx:65
 TQAnalysisSampleVisitorBase.cxx:66
 TQAnalysisSampleVisitorBase.cxx:67
 TQAnalysisSampleVisitorBase.cxx:68
 TQAnalysisSampleVisitorBase.cxx:69
 TQAnalysisSampleVisitorBase.cxx:70
 TQAnalysisSampleVisitorBase.cxx:71
 TQAnalysisSampleVisitorBase.cxx:72
 TQAnalysisSampleVisitorBase.cxx:73
 TQAnalysisSampleVisitorBase.cxx:74
 TQAnalysisSampleVisitorBase.cxx:75
 TQAnalysisSampleVisitorBase.cxx:76
 TQAnalysisSampleVisitorBase.cxx:77
 TQAnalysisSampleVisitorBase.cxx:78
 TQAnalysisSampleVisitorBase.cxx:79
 TQAnalysisSampleVisitorBase.cxx:80
 TQAnalysisSampleVisitorBase.cxx:81
 TQAnalysisSampleVisitorBase.cxx:82
 TQAnalysisSampleVisitorBase.cxx:83
 TQAnalysisSampleVisitorBase.cxx:84
 TQAnalysisSampleVisitorBase.cxx:85
 TQAnalysisSampleVisitorBase.cxx:86
 TQAnalysisSampleVisitorBase.cxx:87
 TQAnalysisSampleVisitorBase.cxx:88
 TQAnalysisSampleVisitorBase.cxx:89
 TQAnalysisSampleVisitorBase.cxx:90
 TQAnalysisSampleVisitorBase.cxx:91
 TQAnalysisSampleVisitorBase.cxx:92
 TQAnalysisSampleVisitorBase.cxx:93
 TQAnalysisSampleVisitorBase.cxx:94
 TQAnalysisSampleVisitorBase.cxx:95
 TQAnalysisSampleVisitorBase.cxx:96
 TQAnalysisSampleVisitorBase.cxx:97
 TQAnalysisSampleVisitorBase.cxx:98
 TQAnalysisSampleVisitorBase.cxx:99
 TQAnalysisSampleVisitorBase.cxx:100
 TQAnalysisSampleVisitorBase.cxx:101
 TQAnalysisSampleVisitorBase.cxx:102
 TQAnalysisSampleVisitorBase.cxx:103
 TQAnalysisSampleVisitorBase.cxx:104
 TQAnalysisSampleVisitorBase.cxx:105
 TQAnalysisSampleVisitorBase.cxx:106
 TQAnalysisSampleVisitorBase.cxx:107
 TQAnalysisSampleVisitorBase.cxx:108
 TQAnalysisSampleVisitorBase.cxx:109
 TQAnalysisSampleVisitorBase.cxx:110
 TQAnalysisSampleVisitorBase.cxx:111
 TQAnalysisSampleVisitorBase.cxx:112
 TQAnalysisSampleVisitorBase.cxx:113
 TQAnalysisSampleVisitorBase.cxx:114
 TQAnalysisSampleVisitorBase.cxx:115
 TQAnalysisSampleVisitorBase.cxx:116
 TQAnalysisSampleVisitorBase.cxx:117
 TQAnalysisSampleVisitorBase.cxx:118
 TQAnalysisSampleVisitorBase.cxx:119
 TQAnalysisSampleVisitorBase.cxx:120
 TQAnalysisSampleVisitorBase.cxx:121
 TQAnalysisSampleVisitorBase.cxx:122
 TQAnalysisSampleVisitorBase.cxx:123
 TQAnalysisSampleVisitorBase.cxx:124
 TQAnalysisSampleVisitorBase.cxx:125
 TQAnalysisSampleVisitorBase.cxx:126
 TQAnalysisSampleVisitorBase.cxx:127
 TQAnalysisSampleVisitorBase.cxx:128