#include "QFramework/TQSamplePurger.h"
#include "QFramework/TQSampleFolder.h"
#include "QFramework/TQFolder.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQToken.h"
#include "QFramework/TQIterator.h"

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

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQSamplePurger:
//
// Purge a sample folder by removing all samples that do not point to a valid tree.
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQSamplePurger)

void TQSamplePurger::setCondition(TQSamplePurger::Condition c){
  // control the condition under which folders will be exempt from purging
  this->fCondition = c;
}

void TQSamplePurger::setPurgeFolders(bool purge){
  // control whether entire folders will be purged (as opposed to only their contents)
  this->fPurgeFolders = purge;
}

void TQSamplePurger::setShallow(bool shallow){
  // control whether the purger will shallowly believe the tags on the samples
  // as opposed to checking if the sample is actually (still?) available
  this->fShallow = shallow;
}

int TQSamplePurger::revisitFolder(TQSampleFolder * sampleFolder, TString& /*message*/){
  // revisit a folder, purging the contents
  TCollection* l = sampleFolder->GetListOfFolders();
  TQIterator itr(l);
  bool purge = true;
  while(itr.hasNext()){
    TObject* obj = itr.readNext();
    TQFolder* f = dynamic_cast<TQFolder*>(obj);
    TQSample* s = dynamic_cast<TQSample*>(f);
    if(s){
      if(s->getTagBoolDefault("purge",false)){
        s->detachFromBase();
        delete s;
      } else {
        purge = false;
      }
    } else if(f){
      if(fPurgeFolders && f->getTagBoolDefault("purge",false)){
        f->detachFromBase();
        delete f;
      } else {
        purge = false;
      }
    } else {
      purge = false;
    }
  }
  sampleFolder->setTagBool("purge",purge);
  return visitOK;
}
      
int TQSamplePurger::visitSample(TQSample * sample, TString& /*message*/){
  DEBUGclassargs(this->GetName(),"visiting sample '%s'",sample->getPath().Data());    
  // visit a sample to determine whether it can be purged
  if(fCondition == INITIALIZED){
    DEBUG("checking initilaization on '%s'",sample->getPath().Data());
    if(this->fShallow){
      bool purge = true;
      int nEvents = 0;
      if(sample->getTagInteger(".init.nEvents",nEvents)) {
        if (nEvents>0) purge = false; 
      } else if (sample->getTagBoolDefault("isInitialized",false)) purge = false;
      else if (sample->hasTagString(".init.filepath") || sample->hasTagString(".xsp.filepath")) purge = false;
      
      //mark samples as to-be-purged if none of conditions above indicate it should not be purged
      if (purge) sample->setTagBool("purge",true);
    } else {
      TQToken* tok = sample->getTreeToken();
      TTree* t = (TTree*)( tok ? tok->getContent() : NULL );
      int nEntries = ( t ? t->GetEntries() : 0);
      if(nEntries < 1){
        sample->setTagBool("purge",true);
      }
      sample->returnToken(tok);
    }
    return visitOK;
  } else {
    return visitSKIPPEDOK;
  }
}

int TQSamplePurger::visitFolder(TQSampleFolder * folder, TString& /*message*/){
  // visit a sample to determine whether it can be purged
  DEBUGclassargs(this->GetName(),"visiting folder '%s'",folder->getPath().Data());  
  if(fCondition == ANALYZED){
    if(folder->getFolder(".histograms") || folder->getFolder(".cutflow")){
      TQFolder* f = folder;
      while(f->getBase()){
        f->removeTag("purge");
        f = f->getBase();
      }
    } else {
      folder->setTagBool("purge",true);
    }
    return visitOK;
  } else {
    return visitOK;
  }
}

 
TQSamplePurger::TQSamplePurger(const TString& name) : TQSampleVisitor(name){
}
TQSamplePurger::~TQSamplePurger(){
}

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