#include "QFramework/TQMultiChannelAnalysisSampleVisitor.h"

#include "QFramework/TQCounter.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQCut.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQToken.h"

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

#ifdef HAS_XAOD
//#include "xAODRootAccess/TEvent.h"
#include "xAODRootAccess/TActiveStore.h"
#include "xAODRootAccess/TStore.h"
#endif


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

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

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQMultiChannelAnalysisSampleVisitor:
//
// Visit samples and execute analysis jobs at cuts in a parallelized way.
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQMultiChannelAnalysisSampleVisitor)


//__________________________________________________________________________________|___________

TQMultiChannelAnalysisSampleVisitor::TQMultiChannelAnalysisSampleVisitor() :
TQAnalysisSampleVisitorBase("mcasv",false)
{
  // Default constructor of the TQMultiChannelAnalysisSampleVisitor class
  this->setVisitTraceID("analysis");
  this->setTagString("tagKey","~.mcasv.channel");
}

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

int TQMultiChannelAnalysisSampleVisitor::visitFolder(TQSampleFolder * sampleFolder, TString&/*message*/) {
  //if this was already visited, we don't need to do so again
  if(!sampleFolder) return visitFAILED;
  DEBUGclass("visiting '%s'",sampleFolder->getPath().Data());

  //only perform an early exit, if all friends have already been processed
  if (this->checkVisitFriends(sampleFolder)){
    DEBUGclass("folder '%s' and all of its friends have been visited before...",sampleFolder->getPath().Data());
    //    return visitSKIPPEDOK;
    return visitIGNORE;    
  }

  std::vector<TQSampleFolder*> sampleFolders;
  const bool requireRestrictionTag = TQSampleVisitor::checkRestrictionTag(sampleFolder);
  const TString tagKey = this->getTagStringDefault("tagKey","~.mcasv.channel");
  updateFriends(sampleFolder);
  std::set<TString> foundChannels;
  std::shared_ptr<std::set<TQSampleFolder*>> friends = sampleFolder->getFriends();
  for (auto sf : (*friends)) {
    if(!sf) continue;
    DEBUGclass("checking if '%s' has been visited before...",sf->getPath().Data());
    if(this->checkVisit(sf)){
      // this line highly depends on the correct implementation of the
      // friend finding. We skip initialization of cuts (and
      // subsequent objects) without knowing if really all samples
      // further down the hierarchy have been visited before (via
      // friends). If the friend finding works correctly two sample
      // folders can be friends if their substructure is identical
      DEBUGclass("skipping - has been visited before!");
      continue;
    }
    //-> additional safe guard in revisitFolder: check if all subfolders have been visited!
    if (requireRestrictionTag && !TQSampleVisitor::checkRestrictionTag(sf)) continue; //don't process friends which are not selected
    TString channel = "";
    if (!sf->getTagString(tagKey,channel) ) {
      DEBUGclass("skipping '%s' due to missing channel tag (might not be a channel specific folder)",sf->getPath().Data());
      continue;
    }
    if(foundChannels.find(channel) != foundChannels.end()){
      DEBUGclass("skipping '%s' due to channel conflict in channel '%s'...",sf->getPath().Data(),channel.Data());
      continue;
    }
    TQCut* cut = this->fChannels[channel];
    if(!cut){
      DEBUGclass("no cut avialable for channel '%s' required by '%s'- skipping",channel.Data(),sf->getPath().Data());
      return visitFAILED;
    }
    sampleFolders.push_back(sf);
    if (!cut->canInitialize(sf)) continue; //don't use this friend if it is on a different path than one the cut was previously intitialized on (prevent cross-talk between different paths!)
    DEBUGclass("trying to initialize SampleFolder with path '%s'",sf->getPath().Data());
    if(!cut->initializeSampleFolder(sf)) return visitFAILED;
    foundChannels.insert(channel);
  }


  this->initializeClonedAlgorithms(sampleFolders,tagKey);

  return visitLISTONLY;
}

//__________________________________________________________________________________|___________

int TQMultiChannelAnalysisSampleVisitor::revisitSample(TQSample */*sample*/, TString&/*message*/) {
  // revisit an instance of TQSample on the way out
  return visitIGNORE;
}



//__________________________________________________________________________________|___________

int TQMultiChannelAnalysisSampleVisitor::revisitFolder(TQSampleFolder * sampleFolder, TString&/*message*/) {
  // revisit a folder upon exit
  if (!sampleFolder) return visitFAILED;
  DEBUGclass("revisiting '%s'",sampleFolder->getPath().Data());  
  std::vector<TQSampleFolder*> sampleFolders;
  const TString tagKey = this->getTagStringDefault("tagKey","~.mcasv.channel");
  bool finalized = true;
  const bool requireRestrictionTag = TQSampleVisitor::checkRestrictionTag(sampleFolder);
  //TQSampleFolderIterator itr(sampleFolder->getFriends());
  std::shared_ptr<std::set<TQSampleFolder*>> friends = sampleFolder->getFriends();

  for (auto sf : (*friends) ) {
    TString channel = sf->getTagStringDefault(tagKey,"");
    TQCut* cut = this->fChannels[channel];
    if(!cut) continue;
    if (!cut->canFinalize(sf)) continue; //only finalize on sample folders which we have actually initialized before
    sampleFolders.push_back(sf);
    DEBUGclass("finalizing '%s'",sf->getPath().Data());	      
    bool thisFinalized = cut->finalizeSampleFolder(sf);
    //check if all subfolders have been visited
    std::vector<TQSampleFolder*> variantSubs;
    if ( thisFinalized ) {
      TQSampleFolderIterator itr(sf->getListOfSampleFolders("?"), true);
      while (itr.hasNext()) {
        TQSampleFolder* sub = itr.readNext();
        if (sub->isVariant(false)) {
          variantSubs.push_back(sub);
        }
        bool subFinalized = ( this->checkVisit(sub)/*either visited*/ || (requireRestrictionTag && !TQSampleVisitor::checkRestrictionTag(sub))  /*or not scheduled for processing*/ || sub->isVariant(false)  ) ; //check if the subfolder has been visited
        
        if (!subFinalized) WARNclass("This sample(folder) '%s' was apparently not visited despite being scheduled. Please verify that it was processed at a later point!",sub->getPath().Data());
        thisFinalized = thisFinalized && subFinalized;
      }
      if (  thisFinalized ) {
	DEBUGclass("stamping '%s' on revisit",sf->getPath().Data());
        this->stamp(sf); //stamp if everything is still fine
        //also stamp Variant subFolders if everything else (i.e. we can be sure all nominal Folders received their stamp).
        //note that this relies on the root sampleFolder level not being supported to be turned into variants and, hence, we can afford to "look back" in time by one layer here
        for (TQSampleFolder* varSub : variantSubs) {
	  DEBUGclass("stamping variant '%s' on revisit",varSub->getPath().Data());
          this->stamp(varSub);
	  // here, we need to deviate from the visitor pattern somewhat
	  // since we stamp all the variants manually, and since this is a revisit, we have to rely on all the subfolders of the variants being visited already
	  // in order to avoid them being visited *again* later, which can happen if the visitor later visits a part of the sample folder that has friends of this one,
	  // we need to stamp not only the variants, but also all their subfolders.
	  auto subfolders = varSub->getListOfFolders("*");
	  for(auto* sf:*subfolders){
	    TQSampleFolder* f = static_cast<TQSampleFolder*>(sf);
	    this->stamp(f);
	  }
	  delete subfolders;
        }
      }
      
    }

    finalized = finalized && thisFinalized;

    //generalization of objects is not ported to TQMultiChannelAnalysisSampleVisitor, pooling to be used instead
  }
  finalized = this->finalizeClonedAlgorithms(sampleFolders,tagKey) && finalized;
  if (finalized) {
    //if everything went well we optionally purge parts of the SF structure (i.e. nominal folders if variants were used. Or folders flagged for any other reason
    std::vector<TQSampleFolder*> toRemove; //because TLists are fancier than one might want we first collect pointers in a vector...
    for (auto sf : (*friends) ) {
      //we can't delete the current sf (it's still, e.g., in some TLists calling this function)
      //so we rely again on the fact that variants can't be created for the root node!
      TQSampleFolderIterator itr(sf->getListOfSampleFolders(),true); //iterator owns list
      while (itr.hasNext()) {
        TQSampleFolder* subSF = itr.readNext();
        if (subSF->getTagBoolDefault(".asv.revisit.purge",false)) {
          toRemove.push_back(subSF);
        }
      }
    }
    for (TQSampleFolder* subSF : toRemove) {
      //somehow this still causes an ERROR from TList where some (seemingly) random SF pointer is still in such a TList... (neither the first nor the last one, but some SF in between..?)
      subSF->detachFromBase();
      delete subSF;
    }
  }
  return finalized ? visitLISTONLY : visitWARN;

}


//__________________________________________________________________________________|___________

int TQMultiChannelAnalysisSampleVisitor::visitSample(TQSample * sample, TString& message) {
  // Run the analysis jobs on a sample
  if(!sample) return visitFAILED;

  if(this->checkVisitFriends(sample)){
    //only skip if all friends have already been visited (the processing order between friends is not guaranteed, not even the one instance we're currently crawling through is guaranteed to be processed in this iteration. Instead while crawling through FriendA we might process FriendB and vice-versa!
    std::shared_ptr<std::set<TQSampleFolder*> > friends = sample->getFriends();
    for (auto fr: *friends.get()){
      int status = this->getStatusID(fr, ".sv.visit.");
      if (status == visitSTATUS::visitFAILED){
        message.Append("A friend sample failed earlier (");
        message.Append(fr->getPath());
        message.Append(")");
        return visitSKIPPED;
      }
    }
    return visitSKIPPEDOK;
  } 

  TStopwatch * timer = new TStopwatch();

  /* analyse the tree */
  TString analysisMessage;
  DEBUGclass("analysing tree");
  int nEntries = this->analyseTree(sample, analysisMessage);

  /* stop the timer */
  timer->Stop();

  /* compile the message */
  message.Append(" ");

  /* save the number of entries in tree analyzed */
  sample->setTagInteger(TString::Format(".%s.analysis.nentries",this->GetName()),nEntries);

  if (nEntries >= 0) {
    message.Append(TQStringUtils::fixedWidth(TQStringUtils::getThousandsSeparators(nEntries), 12,"r"));
  } else {
    message.Append(TQStringUtils::fixedWidth("--", 12,"r"));
  }

  message.Append(TQStringUtils::fixedWidth(TString::Format("%.2f", timer->RealTime()), 12,"r"));
  message.Append(" ");
  message.Append(TQStringUtils::fixedWidth(analysisMessage, 40, "l"));

  /* delete the timer */
  delete timer;

  if(nEntries > 0){
    return visitOK;
  }
  else if (nEntries == 0)
    return visitWARN;

  return visitFAILED;

}

//__________________________________________________________________________________|___________

bool TQMultiChannelAnalysisSampleVisitor::checkCut(TQCut * baseCut) {
  // checks if a given cut is already added to some channel
  for (auto it=this->fChannels.begin(); it!=this->fChannels.end(); ++it){
    if(it->second == baseCut) return true;
  }
  return false;
}

//__________________________________________________________________________________|___________

bool TQMultiChannelAnalysisSampleVisitor::checkChannel(const TString& channelName) {
  // checks if a channel is already added to the iterator
  auto it= this->fChannels.find(channelName);
  if(it==this->fChannels.end()){
    return false;
  }
  return true;
}

//__________________________________________________________________________________|___________

void TQMultiChannelAnalysisSampleVisitor::printChannels() {
  // print the currently scheduled channel
  for (auto it=this->fChannels.begin(); it!=this->fChannels.end(); ++it){
    std::cout << TQStringUtils::fixedWidth(it->first,40) << " " << TQStringUtils::fixedWidth(it->second->GetName(),20) << " @" << it->second << std::endl;
  }
}

//__________________________________________________________________________________|___________

void TQMultiChannelAnalysisSampleVisitor::addChannel(const TString& channelName, TQCut * baseCut) {
  // add a new channel to this visitor, scheduling the visit of the given channelName with the given basecut
  if(channelName.IsNull()){
    ERRORclass("unable to use empty channel name");
    return;
  }
  if(baseCut){
    if(this->checkCut(baseCut)){
      ERRORclass("not adding basecut '%s' -- this cut was already scheduled for another channel!",baseCut->GetName());
      return;
    }
    if(this->checkChannel(channelName)){
      WARNclass("channel '%s' already added to this visitor! Not adding channel.",channelName.Data());
      return;
    }
    this->fChannels[channelName] = baseCut;
  } else {
    if(this->checkChannel(channelName)){
      this->fChannels.erase(channelName);
      return;
    } else {
      WARNclass("attempt to add new channel '%s' with baseCut=NULL",channelName.Data());
      return;
    }
  }
}


//__________________________________________________________________________________|___________

TQCut * TQMultiChannelAnalysisSampleVisitor::getBaseCut(const TString& channelName) {
  // retrieve the basecut corresponding to that channelName
  if(this->checkChannel(channelName)){
    return this->fChannels[channelName];
  } else {
    return NULL;
  }
}


//__________________________________________________________________________________|___________

bool TQMultiChannelAnalysisSampleVisitor::stampAllFriends(TQSample* sample) const {
  // stamps all friends as being visited. Note: this should only be used when there
  // is no chance that any of the friends can be visited successfully as it will
  // stamp ALL friends! (i.e. potentially also ones that weren't explicitly checked/
  // visited)
  if (!sample) return false;
  if(!sample->hasFriends()){
    sample->findFriends();
  }
  if(!sample->hasFriends()){
    return false;
  }
  WARNclass("No events could be read for the sample with path '%s'. All samples using the same data source (same input file and tree) will be ignored!",sample->getPath().Data());
  std::shared_ptr<std::set<TQSampleFolder*>> friends = sample->getFriends();
  if (!friends) return false;
  for (auto fr : (*friends)) {
    if (!fr) continue;
    DEBUGclass("stamping friend '%s' of '%s'",fr->getPath().Data(),sample->getPath().Data());    
    this->stamp(fr);
  }
  return true;
}

//__________________________________________________________________________________|___________

int TQMultiChannelAnalysisSampleVisitor::analyseTree(TQSample * sample, TString& message) {
  // analyse the tree in this sample
  DEBUGclass("entering function");
  DEBUGclass("testing sample");
  if (!sample) {
    message = "sample is NULL";
    DEBUGclass(message);
    return -1;
  }

  // let the sample find some friends
  if(!sample->hasFriends()){
    sample->findFriends();
  }
  if(!sample->hasFriends()){
    message = "no friends found";
    WARN("Sample '%s' has no friends. Please check for problems in your setup!",sample->getPath().Data());
  }
  TQToken* tok = sample->getTreeToken();
  TQToken* fileTok = sample->getFileToken();
  if(!tok && !fileTok){

    // .xsp.filepath should exist for data, .init.filepath for mc
    if( sample->hasTagString(".xsp.filepath") || sample->hasTagString(".init.filepath") ) {
      // we have a true error where the file was expected to be retrieved ok
      throw std::runtime_error(TString::Format("Sample '%s' has a .filepath, but file and tree tokens can't be read!",sample->getPath().Data()).Data());
    }

    message="failed to obtain tree and file token, probably because file was never found for the sample";
    this->stampAllFriends(sample); //mark all friends as done
    return -1;
  }
  TTree* tree = nullptr;
  if (tok) tree = static_cast<TTree*>(tok->getContent());
  if(!tree){
    message="failed to retrieve shared tree but sample is readable (it might just be empty)";
  }
  //WARNING: we do not perform an early exit if there is not tree available (we have to initialize everything in case meta data handling is required in some algorithm for example!). This also means, that 'tree' might be a nullptr at this point!
  
  #ifdef HAS_XAOD
    bool isxAOD = sample->getTagBoolDefault("isxAOD",false); // set by QFramework/Root/TQSampleInitializerBase.cxx
  #endif
  //check if we should try to initialize cuts (and therefore observables). If the tree is empty, we should not do so as there are likely no branches (i.e. TQTreeFormulaObservables will cause an error)

  const bool requireRestrictionTag = TQSampleVisitor::checkRestrictionTag(sample);

  //TQSampleIterator itr(sample->getFriends());
  std::shared_ptr<std::set<TQSampleFolder*>> friends = sample->getFriends();
  DEBUGclass("retrieving number of entries");
  const Long64_t nEntries = std::min(tree?tree->GetEntries():0,this->fSkipEvents + this->fMaxEvents);

  //@tag:tagKey: control which tag on the sample folders will be used to identify the cut set to be used (default: ~.mcasv.channel)
  const TString tagKey = this->getTagStringDefault("tagKey","~.mcasv.channel");
  if (tree && nEntries>0) tree->SetBranchStatus("*", 1);
  //while(itr.hasNext()){
    //TQSample* s = itr.readNext();

  //ensure that for all friends a matching channel exists and create the coresponding observable sets if needed
  for (auto sf : (*friends)) {
    if (!sf || !sf->InheritsFrom(TQSample::Class()) ) continue;
    //if(!s) continue;
    TQSample* s = static_cast<TQSample*>(sf);
    if(requireRestrictionTag && !TQSampleVisitor::checkRestrictionTag(s)) continue; //ignore samples which are not selected

    TString channel;
    if(!s->getTagString(tagKey,channel)){
      message = TString::Format("sample '%s' has no channel set as tag with key '%s'.",s->getPath().Data(),tagKey.Data());
      throw std::runtime_error(message.Data()); //critical error, abort!
      return -1;
    }
    if(!this->checkChannel(channel)){
      message = TString::Format("channel '%s' is unknown from %s:%s",channel.Data(),s->getPath().Data(),tagKey.Data());
      throw std::runtime_error(message.Data()); //critical error, abort!
      return -1;
    }
    if(this->fUseObservableSets){
      if(!TQObservable::manager.setActiveSet(channel)){
        TQObservable::manager.cloneActiveSet(channel);
      }
    }
  }

  //itr.reset();
  std::vector<bool> useMCweights;
  std::vector<TQCut*> cuts;

  std::set<TString> foundChannels;
  std::vector<TQSample*> runningSamples; //all samples being activated for the upcoming event loop
  //while(itr.hasNext()){
    //TQSample* s = itr.readNext();
    //if(!s) continue;
  for (auto sf : (*friends)) {
    if (!sf || !sf->InheritsFrom(TQSample::Class()) ) continue;
    //if(!s) continue;
    TQSample* s = static_cast<TQSample*>(sf);
    if (this->checkVisit(s)) continue;
    if(requireRestrictionTag && !TQSampleVisitor::checkRestrictionTag(s)) continue; //ignore samples which are not selected
    TString channel;
    if(!s->getTagString(tagKey,channel)){
      throw std::runtime_error(TString::Format("no channel information set on sample '%s'",s->getPath().Data()).Data());
    }
    if(foundChannels.find(channel)!=foundChannels.end()){
      continue;
    }
    TQObservable::manager.setActiveSet(channel);
    TQCut* basecut = this->fChannels[channel];
    //consistency check
    if (!basecut->canInitialize(s)) continue; //check if this sample can currently be initialized (validates that the sample is a subfolder of the TQSampleFolder the cut was last initialized on if any)
    DEBUGclass("initializing sample '%s' with basecut '%p' for channel '%s'",s->getPath().Data(),basecut,channel.Data());
    if (tree && nEntries>0 && !basecut->initialize(s)) { //only initialize if we actually have a tree (but still set the sample!!! (will early exit if tree is a nullptr, i.e., won't attempt to initialize cut)
      throw std::runtime_error(TString::Format("failed to initialize cuts for channel '%s' on sample '%s'",channel.Data(),s->getPath().Data()).Data());
    }
    // check wether to use MC weights
    DEBUGclass("testing for usemcweights tag");
    bool useWeights = false;
    s->getTagBool("usemcweights", useWeights, true);
    
    DEBUGclass("retrieving number of entries");
    //we only need to care about adjusting the normalization due to limited number of events to be processed when there actually are events to process    
    if (tree && fDebugMode && useWeights){
      Long64_t nEntriesOrig = tree->GetEntries();
      // due to popular request, we want to normalization be correct even when *only doing debugging*
      double norm = double(nEntriesOrig)/double(nEntries);
      s->setNormalisation(s->getNormalisation() * norm);
    }
    // push all required information into vectors
    useMCweights.push_back(useWeights);
    cuts.push_back(basecut);
    runningSamples.push_back(s);
    foundChannels.insert(channel);
  }


  // loop over tree entries
  DEBUGclass("entering event loop");
  #ifdef _DEBUG_
  std::cout<<"Tree adress: "<<tree<<std::endl;
  #endif
  const size_t n = cuts.size();
  if (n==0) { //something really stupid must have happened. Formally we should still clean up a bit
    ERRORclass("No cuts were activated for processing sample '%s'",sample->getPath().Data());
    sample->returnToken(tok);
    sample->returnToken(fileTok);
    return -1;
  }

  //this->cloneAlgorithms(n); //create clones for each channel

  if (! this->initializeClonedAlgorithms(runningSamples,tagKey, true/*switch between observable sets for non-singleton algorithms*/)) {
    ERRORclass("Failed to initialize algorithms for processing sample '%s'",sample->getPath().Data());
    sample->returnToken(tok);
    sample->returnToken(fileTok);
    return -1;
  }
  
  // handle branch status
  if (tree && nEntries>0) {
    tree->SetBranchStatus("*", 0);
    for(size_t i=0; i<cuts.size(); ++i){
      TCollection* bnames = cuts[i]->getListOfBranches();
      if(!this->setupBranches(tree,bnames)){
        throw std::runtime_error(TString::Format("failed to setup branches for sample '%s'",cuts[i]->getSample()->getPath().Data()).Data());
      }
      bnames->SetOwner(true);
      delete bnames;
    }
    
    for (TQAlgorithm* const & alg : gActiveAlgorithms) {
      TCollection* bnames = alg->getListOfBranches();
      if (!bnames) continue; //most algorithms won't care, so we'll only get a nullptr from them
      if(!this->setupBranches(tree,bnames)){
        throw std::runtime_error(TString::Format("failed to setup branches for algorithm '%s'",alg->GetName()).Data());
      }
      bnames->SetOwner(true);
      delete bnames;
    }
  }

  if (tree && nEntries>0) { //only execute the actual event loop part if there is an event tree (we might have nothing but a MetaData tree in case of xAODs for example)
    const Long64_t nEventsPerPercent = ceil(nEntries/100.);
    const Long64_t progressInterval = ceil(nEventsPerPercent*this->getTagDoubleDefault("progressInterval",0.));
    sample->setTagInteger(".analyze.firstEvent",this->fSkipEvents);
    sample->setTagInteger(".analyze.lastEvent",nEntries);    
    for (Long64_t i = this->fSkipEvents; i < nEntries; ++i) {
      DEBUGclass("visiting entry %d/%d",i,nEntries);
      tree->GetEntry(i);
      
      this->executeClonedAlgorithms(); //run pre-event part of algorithms
      for(size_t j=0; j<n; ++j){
        DEBUGclass("  friend %d",j);
        TRY(
          cuts[j]->analyse(1., useMCweights[j]);
        ,TString::Format("An error occured while evaluating entry %lld of sample '%s'.",i,(cuts[j]->getSample()!=0?cuts[j]->getSample()->getPath().Data():"<undefined>"))
        )
        DEBUGclass("  friend %d done",j);
      }
      this->cleanupClonedAlgorithms(); //execute post-event part of algorithms
      
      #ifdef HAS_XAOD
      //#include "xAODRootAccess/TEvent.h"
      if (isxAOD) xAOD::TActiveStore::store()->clear();
      #endif
      DEBUGclass(" done visiting entry %d/%d",i,nEntries);
      if ( progressInterval>0 && (i%progressInterval == 0) ) {
        this->updateLine(fStatusLine,message,visitPROGRESS,progressInterval<=0,((double)i)/std::max(nEntries,(Long64_t)1)  );
      }
      
    }
  }
  //finalize algorithms
  if (!this->finalizeClonedAlgorithms(runningSamples, tagKey)) {
    ERRORclass("failed to finalize algorithms after processing sample '%s'",sample->getPath().Data());
    sample->returnToken(tok);
    sample->returnToken(fileTok);
    return -1;
  }
  // finalize the cuts
  for(size_t j=0; j<n; ++j){
    TQSampleFolder* sf = cuts[j]->getSample();
    bool fromCut = sf; //did we get 'sf' from the cut?
    if (!sf && runningSamples.size()>j) sf = runningSamples[j];
    if (!sf) {
      throw std::runtime_error("The internal logic of TQMultiChannelAnalysisSampleVisitor seems to be broken. Please inform the CAFCore developers and try to provide a test case reproducing this error message!");
      return -1;
    }
    DEBUGclass("stamping '%s' after finishing analysis",sf->getPath().Data());
    this->stamp(sf); //note: this must be before finalizing the cut so the cut can propagate the stamp to variants!
    if (fromCut) cuts[j]->finalize();
  }


  sample->returnToken(tok);
  sample->returnToken(fileTok);

  DEBUGclass("finished analyzing sample '%s'",sample->GetName());

  if (sample->getNTreeTokens() > 0) {
    std::cout << std::endl;
    message="sample left with # tree tokens > 0";
    sample->printTreeTokens();
    std::cout << std::endl;
    std::cout << "Message: " <<message<<std::endl;
  }

  return nEntries;
}

void TQMultiChannelAnalysisSampleVisitor::useObservableSets(bool useSets){
  // decide whether this visitor should use separate observable sets
  this->fUseObservableSets = useSets;
}
 TQMultiChannelAnalysisSampleVisitor.cxx:1
 TQMultiChannelAnalysisSampleVisitor.cxx:2
 TQMultiChannelAnalysisSampleVisitor.cxx:3
 TQMultiChannelAnalysisSampleVisitor.cxx:4
 TQMultiChannelAnalysisSampleVisitor.cxx:5
 TQMultiChannelAnalysisSampleVisitor.cxx:6
 TQMultiChannelAnalysisSampleVisitor.cxx:7
 TQMultiChannelAnalysisSampleVisitor.cxx:8
 TQMultiChannelAnalysisSampleVisitor.cxx:9
 TQMultiChannelAnalysisSampleVisitor.cxx:10
 TQMultiChannelAnalysisSampleVisitor.cxx:11
 TQMultiChannelAnalysisSampleVisitor.cxx:12
 TQMultiChannelAnalysisSampleVisitor.cxx:13
 TQMultiChannelAnalysisSampleVisitor.cxx:14
 TQMultiChannelAnalysisSampleVisitor.cxx:15
 TQMultiChannelAnalysisSampleVisitor.cxx:16
 TQMultiChannelAnalysisSampleVisitor.cxx:17
 TQMultiChannelAnalysisSampleVisitor.cxx:18
 TQMultiChannelAnalysisSampleVisitor.cxx:19
 TQMultiChannelAnalysisSampleVisitor.cxx:20
 TQMultiChannelAnalysisSampleVisitor.cxx:21
 TQMultiChannelAnalysisSampleVisitor.cxx:22
 TQMultiChannelAnalysisSampleVisitor.cxx:23
 TQMultiChannelAnalysisSampleVisitor.cxx:24
 TQMultiChannelAnalysisSampleVisitor.cxx:25
 TQMultiChannelAnalysisSampleVisitor.cxx:26
 TQMultiChannelAnalysisSampleVisitor.cxx:27
 TQMultiChannelAnalysisSampleVisitor.cxx:28
 TQMultiChannelAnalysisSampleVisitor.cxx:29
 TQMultiChannelAnalysisSampleVisitor.cxx:30
 TQMultiChannelAnalysisSampleVisitor.cxx:31
 TQMultiChannelAnalysisSampleVisitor.cxx:32
 TQMultiChannelAnalysisSampleVisitor.cxx:33
 TQMultiChannelAnalysisSampleVisitor.cxx:34
 TQMultiChannelAnalysisSampleVisitor.cxx:35
 TQMultiChannelAnalysisSampleVisitor.cxx:36
 TQMultiChannelAnalysisSampleVisitor.cxx:37
 TQMultiChannelAnalysisSampleVisitor.cxx:38
 TQMultiChannelAnalysisSampleVisitor.cxx:39
 TQMultiChannelAnalysisSampleVisitor.cxx:40
 TQMultiChannelAnalysisSampleVisitor.cxx:41
 TQMultiChannelAnalysisSampleVisitor.cxx:42
 TQMultiChannelAnalysisSampleVisitor.cxx:43
 TQMultiChannelAnalysisSampleVisitor.cxx:44
 TQMultiChannelAnalysisSampleVisitor.cxx:45
 TQMultiChannelAnalysisSampleVisitor.cxx:46
 TQMultiChannelAnalysisSampleVisitor.cxx:47
 TQMultiChannelAnalysisSampleVisitor.cxx:48
 TQMultiChannelAnalysisSampleVisitor.cxx:49
 TQMultiChannelAnalysisSampleVisitor.cxx:50
 TQMultiChannelAnalysisSampleVisitor.cxx:51
 TQMultiChannelAnalysisSampleVisitor.cxx:52
 TQMultiChannelAnalysisSampleVisitor.cxx:53
 TQMultiChannelAnalysisSampleVisitor.cxx:54
 TQMultiChannelAnalysisSampleVisitor.cxx:55
 TQMultiChannelAnalysisSampleVisitor.cxx:56
 TQMultiChannelAnalysisSampleVisitor.cxx:57
 TQMultiChannelAnalysisSampleVisitor.cxx:58
 TQMultiChannelAnalysisSampleVisitor.cxx:59
 TQMultiChannelAnalysisSampleVisitor.cxx:60
 TQMultiChannelAnalysisSampleVisitor.cxx:61
 TQMultiChannelAnalysisSampleVisitor.cxx:62
 TQMultiChannelAnalysisSampleVisitor.cxx:63
 TQMultiChannelAnalysisSampleVisitor.cxx:64
 TQMultiChannelAnalysisSampleVisitor.cxx:65
 TQMultiChannelAnalysisSampleVisitor.cxx:66
 TQMultiChannelAnalysisSampleVisitor.cxx:67
 TQMultiChannelAnalysisSampleVisitor.cxx:68
 TQMultiChannelAnalysisSampleVisitor.cxx:69
 TQMultiChannelAnalysisSampleVisitor.cxx:70
 TQMultiChannelAnalysisSampleVisitor.cxx:71
 TQMultiChannelAnalysisSampleVisitor.cxx:72
 TQMultiChannelAnalysisSampleVisitor.cxx:73
 TQMultiChannelAnalysisSampleVisitor.cxx:74
 TQMultiChannelAnalysisSampleVisitor.cxx:75
 TQMultiChannelAnalysisSampleVisitor.cxx:76
 TQMultiChannelAnalysisSampleVisitor.cxx:77
 TQMultiChannelAnalysisSampleVisitor.cxx:78
 TQMultiChannelAnalysisSampleVisitor.cxx:79
 TQMultiChannelAnalysisSampleVisitor.cxx:80
 TQMultiChannelAnalysisSampleVisitor.cxx:81
 TQMultiChannelAnalysisSampleVisitor.cxx:82
 TQMultiChannelAnalysisSampleVisitor.cxx:83
 TQMultiChannelAnalysisSampleVisitor.cxx:84
 TQMultiChannelAnalysisSampleVisitor.cxx:85
 TQMultiChannelAnalysisSampleVisitor.cxx:86
 TQMultiChannelAnalysisSampleVisitor.cxx:87
 TQMultiChannelAnalysisSampleVisitor.cxx:88
 TQMultiChannelAnalysisSampleVisitor.cxx:89
 TQMultiChannelAnalysisSampleVisitor.cxx:90
 TQMultiChannelAnalysisSampleVisitor.cxx:91
 TQMultiChannelAnalysisSampleVisitor.cxx:92
 TQMultiChannelAnalysisSampleVisitor.cxx:93
 TQMultiChannelAnalysisSampleVisitor.cxx:94
 TQMultiChannelAnalysisSampleVisitor.cxx:95
 TQMultiChannelAnalysisSampleVisitor.cxx:96
 TQMultiChannelAnalysisSampleVisitor.cxx:97
 TQMultiChannelAnalysisSampleVisitor.cxx:98
 TQMultiChannelAnalysisSampleVisitor.cxx:99
 TQMultiChannelAnalysisSampleVisitor.cxx:100
 TQMultiChannelAnalysisSampleVisitor.cxx:101
 TQMultiChannelAnalysisSampleVisitor.cxx:102
 TQMultiChannelAnalysisSampleVisitor.cxx:103
 TQMultiChannelAnalysisSampleVisitor.cxx:104
 TQMultiChannelAnalysisSampleVisitor.cxx:105
 TQMultiChannelAnalysisSampleVisitor.cxx:106
 TQMultiChannelAnalysisSampleVisitor.cxx:107
 TQMultiChannelAnalysisSampleVisitor.cxx:108
 TQMultiChannelAnalysisSampleVisitor.cxx:109
 TQMultiChannelAnalysisSampleVisitor.cxx:110
 TQMultiChannelAnalysisSampleVisitor.cxx:111
 TQMultiChannelAnalysisSampleVisitor.cxx:112
 TQMultiChannelAnalysisSampleVisitor.cxx:113
 TQMultiChannelAnalysisSampleVisitor.cxx:114
 TQMultiChannelAnalysisSampleVisitor.cxx:115
 TQMultiChannelAnalysisSampleVisitor.cxx:116
 TQMultiChannelAnalysisSampleVisitor.cxx:117
 TQMultiChannelAnalysisSampleVisitor.cxx:118
 TQMultiChannelAnalysisSampleVisitor.cxx:119
 TQMultiChannelAnalysisSampleVisitor.cxx:120
 TQMultiChannelAnalysisSampleVisitor.cxx:121
 TQMultiChannelAnalysisSampleVisitor.cxx:122
 TQMultiChannelAnalysisSampleVisitor.cxx:123
 TQMultiChannelAnalysisSampleVisitor.cxx:124
 TQMultiChannelAnalysisSampleVisitor.cxx:125
 TQMultiChannelAnalysisSampleVisitor.cxx:126
 TQMultiChannelAnalysisSampleVisitor.cxx:127
 TQMultiChannelAnalysisSampleVisitor.cxx:128
 TQMultiChannelAnalysisSampleVisitor.cxx:129
 TQMultiChannelAnalysisSampleVisitor.cxx:130
 TQMultiChannelAnalysisSampleVisitor.cxx:131
 TQMultiChannelAnalysisSampleVisitor.cxx:132
 TQMultiChannelAnalysisSampleVisitor.cxx:133
 TQMultiChannelAnalysisSampleVisitor.cxx:134
 TQMultiChannelAnalysisSampleVisitor.cxx:135
 TQMultiChannelAnalysisSampleVisitor.cxx:136
 TQMultiChannelAnalysisSampleVisitor.cxx:137
 TQMultiChannelAnalysisSampleVisitor.cxx:138
 TQMultiChannelAnalysisSampleVisitor.cxx:139
 TQMultiChannelAnalysisSampleVisitor.cxx:140
 TQMultiChannelAnalysisSampleVisitor.cxx:141
 TQMultiChannelAnalysisSampleVisitor.cxx:142
 TQMultiChannelAnalysisSampleVisitor.cxx:143
 TQMultiChannelAnalysisSampleVisitor.cxx:144
 TQMultiChannelAnalysisSampleVisitor.cxx:145
 TQMultiChannelAnalysisSampleVisitor.cxx:146
 TQMultiChannelAnalysisSampleVisitor.cxx:147
 TQMultiChannelAnalysisSampleVisitor.cxx:148
 TQMultiChannelAnalysisSampleVisitor.cxx:149
 TQMultiChannelAnalysisSampleVisitor.cxx:150
 TQMultiChannelAnalysisSampleVisitor.cxx:151
 TQMultiChannelAnalysisSampleVisitor.cxx:152
 TQMultiChannelAnalysisSampleVisitor.cxx:153
 TQMultiChannelAnalysisSampleVisitor.cxx:154
 TQMultiChannelAnalysisSampleVisitor.cxx:155
 TQMultiChannelAnalysisSampleVisitor.cxx:156
 TQMultiChannelAnalysisSampleVisitor.cxx:157
 TQMultiChannelAnalysisSampleVisitor.cxx:158
 TQMultiChannelAnalysisSampleVisitor.cxx:159
 TQMultiChannelAnalysisSampleVisitor.cxx:160
 TQMultiChannelAnalysisSampleVisitor.cxx:161
 TQMultiChannelAnalysisSampleVisitor.cxx:162
 TQMultiChannelAnalysisSampleVisitor.cxx:163
 TQMultiChannelAnalysisSampleVisitor.cxx:164
 TQMultiChannelAnalysisSampleVisitor.cxx:165
 TQMultiChannelAnalysisSampleVisitor.cxx:166
 TQMultiChannelAnalysisSampleVisitor.cxx:167
 TQMultiChannelAnalysisSampleVisitor.cxx:168
 TQMultiChannelAnalysisSampleVisitor.cxx:169
 TQMultiChannelAnalysisSampleVisitor.cxx:170
 TQMultiChannelAnalysisSampleVisitor.cxx:171
 TQMultiChannelAnalysisSampleVisitor.cxx:172
 TQMultiChannelAnalysisSampleVisitor.cxx:173
 TQMultiChannelAnalysisSampleVisitor.cxx:174
 TQMultiChannelAnalysisSampleVisitor.cxx:175
 TQMultiChannelAnalysisSampleVisitor.cxx:176
 TQMultiChannelAnalysisSampleVisitor.cxx:177
 TQMultiChannelAnalysisSampleVisitor.cxx:178
 TQMultiChannelAnalysisSampleVisitor.cxx:179
 TQMultiChannelAnalysisSampleVisitor.cxx:180
 TQMultiChannelAnalysisSampleVisitor.cxx:181
 TQMultiChannelAnalysisSampleVisitor.cxx:182
 TQMultiChannelAnalysisSampleVisitor.cxx:183
 TQMultiChannelAnalysisSampleVisitor.cxx:184
 TQMultiChannelAnalysisSampleVisitor.cxx:185
 TQMultiChannelAnalysisSampleVisitor.cxx:186
 TQMultiChannelAnalysisSampleVisitor.cxx:187
 TQMultiChannelAnalysisSampleVisitor.cxx:188
 TQMultiChannelAnalysisSampleVisitor.cxx:189
 TQMultiChannelAnalysisSampleVisitor.cxx:190
 TQMultiChannelAnalysisSampleVisitor.cxx:191
 TQMultiChannelAnalysisSampleVisitor.cxx:192
 TQMultiChannelAnalysisSampleVisitor.cxx:193
 TQMultiChannelAnalysisSampleVisitor.cxx:194
 TQMultiChannelAnalysisSampleVisitor.cxx:195
 TQMultiChannelAnalysisSampleVisitor.cxx:196
 TQMultiChannelAnalysisSampleVisitor.cxx:197
 TQMultiChannelAnalysisSampleVisitor.cxx:198
 TQMultiChannelAnalysisSampleVisitor.cxx:199
 TQMultiChannelAnalysisSampleVisitor.cxx:200
 TQMultiChannelAnalysisSampleVisitor.cxx:201
 TQMultiChannelAnalysisSampleVisitor.cxx:202
 TQMultiChannelAnalysisSampleVisitor.cxx:203
 TQMultiChannelAnalysisSampleVisitor.cxx:204
 TQMultiChannelAnalysisSampleVisitor.cxx:205
 TQMultiChannelAnalysisSampleVisitor.cxx:206
 TQMultiChannelAnalysisSampleVisitor.cxx:207
 TQMultiChannelAnalysisSampleVisitor.cxx:208
 TQMultiChannelAnalysisSampleVisitor.cxx:209
 TQMultiChannelAnalysisSampleVisitor.cxx:210
 TQMultiChannelAnalysisSampleVisitor.cxx:211
 TQMultiChannelAnalysisSampleVisitor.cxx:212
 TQMultiChannelAnalysisSampleVisitor.cxx:213
 TQMultiChannelAnalysisSampleVisitor.cxx:214
 TQMultiChannelAnalysisSampleVisitor.cxx:215
 TQMultiChannelAnalysisSampleVisitor.cxx:216
 TQMultiChannelAnalysisSampleVisitor.cxx:217
 TQMultiChannelAnalysisSampleVisitor.cxx:218
 TQMultiChannelAnalysisSampleVisitor.cxx:219
 TQMultiChannelAnalysisSampleVisitor.cxx:220
 TQMultiChannelAnalysisSampleVisitor.cxx:221
 TQMultiChannelAnalysisSampleVisitor.cxx:222
 TQMultiChannelAnalysisSampleVisitor.cxx:223
 TQMultiChannelAnalysisSampleVisitor.cxx:224
 TQMultiChannelAnalysisSampleVisitor.cxx:225
 TQMultiChannelAnalysisSampleVisitor.cxx:226
 TQMultiChannelAnalysisSampleVisitor.cxx:227
 TQMultiChannelAnalysisSampleVisitor.cxx:228
 TQMultiChannelAnalysisSampleVisitor.cxx:229
 TQMultiChannelAnalysisSampleVisitor.cxx:230
 TQMultiChannelAnalysisSampleVisitor.cxx:231
 TQMultiChannelAnalysisSampleVisitor.cxx:232
 TQMultiChannelAnalysisSampleVisitor.cxx:233
 TQMultiChannelAnalysisSampleVisitor.cxx:234
 TQMultiChannelAnalysisSampleVisitor.cxx:235
 TQMultiChannelAnalysisSampleVisitor.cxx:236
 TQMultiChannelAnalysisSampleVisitor.cxx:237
 TQMultiChannelAnalysisSampleVisitor.cxx:238
 TQMultiChannelAnalysisSampleVisitor.cxx:239
 TQMultiChannelAnalysisSampleVisitor.cxx:240
 TQMultiChannelAnalysisSampleVisitor.cxx:241
 TQMultiChannelAnalysisSampleVisitor.cxx:242
 TQMultiChannelAnalysisSampleVisitor.cxx:243
 TQMultiChannelAnalysisSampleVisitor.cxx:244
 TQMultiChannelAnalysisSampleVisitor.cxx:245
 TQMultiChannelAnalysisSampleVisitor.cxx:246
 TQMultiChannelAnalysisSampleVisitor.cxx:247
 TQMultiChannelAnalysisSampleVisitor.cxx:248
 TQMultiChannelAnalysisSampleVisitor.cxx:249
 TQMultiChannelAnalysisSampleVisitor.cxx:250
 TQMultiChannelAnalysisSampleVisitor.cxx:251
 TQMultiChannelAnalysisSampleVisitor.cxx:252
 TQMultiChannelAnalysisSampleVisitor.cxx:253
 TQMultiChannelAnalysisSampleVisitor.cxx:254
 TQMultiChannelAnalysisSampleVisitor.cxx:255
 TQMultiChannelAnalysisSampleVisitor.cxx:256
 TQMultiChannelAnalysisSampleVisitor.cxx:257
 TQMultiChannelAnalysisSampleVisitor.cxx:258
 TQMultiChannelAnalysisSampleVisitor.cxx:259
 TQMultiChannelAnalysisSampleVisitor.cxx:260
 TQMultiChannelAnalysisSampleVisitor.cxx:261
 TQMultiChannelAnalysisSampleVisitor.cxx:262
 TQMultiChannelAnalysisSampleVisitor.cxx:263
 TQMultiChannelAnalysisSampleVisitor.cxx:264
 TQMultiChannelAnalysisSampleVisitor.cxx:265
 TQMultiChannelAnalysisSampleVisitor.cxx:266
 TQMultiChannelAnalysisSampleVisitor.cxx:267
 TQMultiChannelAnalysisSampleVisitor.cxx:268
 TQMultiChannelAnalysisSampleVisitor.cxx:269
 TQMultiChannelAnalysisSampleVisitor.cxx:270
 TQMultiChannelAnalysisSampleVisitor.cxx:271
 TQMultiChannelAnalysisSampleVisitor.cxx:272
 TQMultiChannelAnalysisSampleVisitor.cxx:273
 TQMultiChannelAnalysisSampleVisitor.cxx:274
 TQMultiChannelAnalysisSampleVisitor.cxx:275
 TQMultiChannelAnalysisSampleVisitor.cxx:276
 TQMultiChannelAnalysisSampleVisitor.cxx:277
 TQMultiChannelAnalysisSampleVisitor.cxx:278
 TQMultiChannelAnalysisSampleVisitor.cxx:279
 TQMultiChannelAnalysisSampleVisitor.cxx:280
 TQMultiChannelAnalysisSampleVisitor.cxx:281
 TQMultiChannelAnalysisSampleVisitor.cxx:282
 TQMultiChannelAnalysisSampleVisitor.cxx:283
 TQMultiChannelAnalysisSampleVisitor.cxx:284
 TQMultiChannelAnalysisSampleVisitor.cxx:285
 TQMultiChannelAnalysisSampleVisitor.cxx:286
 TQMultiChannelAnalysisSampleVisitor.cxx:287
 TQMultiChannelAnalysisSampleVisitor.cxx:288
 TQMultiChannelAnalysisSampleVisitor.cxx:289
 TQMultiChannelAnalysisSampleVisitor.cxx:290
 TQMultiChannelAnalysisSampleVisitor.cxx:291
 TQMultiChannelAnalysisSampleVisitor.cxx:292
 TQMultiChannelAnalysisSampleVisitor.cxx:293
 TQMultiChannelAnalysisSampleVisitor.cxx:294
 TQMultiChannelAnalysisSampleVisitor.cxx:295
 TQMultiChannelAnalysisSampleVisitor.cxx:296
 TQMultiChannelAnalysisSampleVisitor.cxx:297
 TQMultiChannelAnalysisSampleVisitor.cxx:298
 TQMultiChannelAnalysisSampleVisitor.cxx:299
 TQMultiChannelAnalysisSampleVisitor.cxx:300
 TQMultiChannelAnalysisSampleVisitor.cxx:301
 TQMultiChannelAnalysisSampleVisitor.cxx:302
 TQMultiChannelAnalysisSampleVisitor.cxx:303
 TQMultiChannelAnalysisSampleVisitor.cxx:304
 TQMultiChannelAnalysisSampleVisitor.cxx:305
 TQMultiChannelAnalysisSampleVisitor.cxx:306
 TQMultiChannelAnalysisSampleVisitor.cxx:307
 TQMultiChannelAnalysisSampleVisitor.cxx:308
 TQMultiChannelAnalysisSampleVisitor.cxx:309
 TQMultiChannelAnalysisSampleVisitor.cxx:310
 TQMultiChannelAnalysisSampleVisitor.cxx:311
 TQMultiChannelAnalysisSampleVisitor.cxx:312
 TQMultiChannelAnalysisSampleVisitor.cxx:313
 TQMultiChannelAnalysisSampleVisitor.cxx:314
 TQMultiChannelAnalysisSampleVisitor.cxx:315
 TQMultiChannelAnalysisSampleVisitor.cxx:316
 TQMultiChannelAnalysisSampleVisitor.cxx:317
 TQMultiChannelAnalysisSampleVisitor.cxx:318
 TQMultiChannelAnalysisSampleVisitor.cxx:319
 TQMultiChannelAnalysisSampleVisitor.cxx:320
 TQMultiChannelAnalysisSampleVisitor.cxx:321
 TQMultiChannelAnalysisSampleVisitor.cxx:322
 TQMultiChannelAnalysisSampleVisitor.cxx:323
 TQMultiChannelAnalysisSampleVisitor.cxx:324
 TQMultiChannelAnalysisSampleVisitor.cxx:325
 TQMultiChannelAnalysisSampleVisitor.cxx:326
 TQMultiChannelAnalysisSampleVisitor.cxx:327
 TQMultiChannelAnalysisSampleVisitor.cxx:328
 TQMultiChannelAnalysisSampleVisitor.cxx:329
 TQMultiChannelAnalysisSampleVisitor.cxx:330
 TQMultiChannelAnalysisSampleVisitor.cxx:331
 TQMultiChannelAnalysisSampleVisitor.cxx:332
 TQMultiChannelAnalysisSampleVisitor.cxx:333
 TQMultiChannelAnalysisSampleVisitor.cxx:334
 TQMultiChannelAnalysisSampleVisitor.cxx:335
 TQMultiChannelAnalysisSampleVisitor.cxx:336
 TQMultiChannelAnalysisSampleVisitor.cxx:337
 TQMultiChannelAnalysisSampleVisitor.cxx:338
 TQMultiChannelAnalysisSampleVisitor.cxx:339
 TQMultiChannelAnalysisSampleVisitor.cxx:340
 TQMultiChannelAnalysisSampleVisitor.cxx:341
 TQMultiChannelAnalysisSampleVisitor.cxx:342
 TQMultiChannelAnalysisSampleVisitor.cxx:343
 TQMultiChannelAnalysisSampleVisitor.cxx:344
 TQMultiChannelAnalysisSampleVisitor.cxx:345
 TQMultiChannelAnalysisSampleVisitor.cxx:346
 TQMultiChannelAnalysisSampleVisitor.cxx:347
 TQMultiChannelAnalysisSampleVisitor.cxx:348
 TQMultiChannelAnalysisSampleVisitor.cxx:349
 TQMultiChannelAnalysisSampleVisitor.cxx:350
 TQMultiChannelAnalysisSampleVisitor.cxx:351
 TQMultiChannelAnalysisSampleVisitor.cxx:352
 TQMultiChannelAnalysisSampleVisitor.cxx:353
 TQMultiChannelAnalysisSampleVisitor.cxx:354
 TQMultiChannelAnalysisSampleVisitor.cxx:355
 TQMultiChannelAnalysisSampleVisitor.cxx:356
 TQMultiChannelAnalysisSampleVisitor.cxx:357
 TQMultiChannelAnalysisSampleVisitor.cxx:358
 TQMultiChannelAnalysisSampleVisitor.cxx:359
 TQMultiChannelAnalysisSampleVisitor.cxx:360
 TQMultiChannelAnalysisSampleVisitor.cxx:361
 TQMultiChannelAnalysisSampleVisitor.cxx:362
 TQMultiChannelAnalysisSampleVisitor.cxx:363
 TQMultiChannelAnalysisSampleVisitor.cxx:364
 TQMultiChannelAnalysisSampleVisitor.cxx:365
 TQMultiChannelAnalysisSampleVisitor.cxx:366
 TQMultiChannelAnalysisSampleVisitor.cxx:367
 TQMultiChannelAnalysisSampleVisitor.cxx:368
 TQMultiChannelAnalysisSampleVisitor.cxx:369
 TQMultiChannelAnalysisSampleVisitor.cxx:370
 TQMultiChannelAnalysisSampleVisitor.cxx:371
 TQMultiChannelAnalysisSampleVisitor.cxx:372
 TQMultiChannelAnalysisSampleVisitor.cxx:373
 TQMultiChannelAnalysisSampleVisitor.cxx:374
 TQMultiChannelAnalysisSampleVisitor.cxx:375
 TQMultiChannelAnalysisSampleVisitor.cxx:376
 TQMultiChannelAnalysisSampleVisitor.cxx:377
 TQMultiChannelAnalysisSampleVisitor.cxx:378
 TQMultiChannelAnalysisSampleVisitor.cxx:379
 TQMultiChannelAnalysisSampleVisitor.cxx:380
 TQMultiChannelAnalysisSampleVisitor.cxx:381
 TQMultiChannelAnalysisSampleVisitor.cxx:382
 TQMultiChannelAnalysisSampleVisitor.cxx:383
 TQMultiChannelAnalysisSampleVisitor.cxx:384
 TQMultiChannelAnalysisSampleVisitor.cxx:385
 TQMultiChannelAnalysisSampleVisitor.cxx:386
 TQMultiChannelAnalysisSampleVisitor.cxx:387
 TQMultiChannelAnalysisSampleVisitor.cxx:388
 TQMultiChannelAnalysisSampleVisitor.cxx:389
 TQMultiChannelAnalysisSampleVisitor.cxx:390
 TQMultiChannelAnalysisSampleVisitor.cxx:391
 TQMultiChannelAnalysisSampleVisitor.cxx:392
 TQMultiChannelAnalysisSampleVisitor.cxx:393
 TQMultiChannelAnalysisSampleVisitor.cxx:394
 TQMultiChannelAnalysisSampleVisitor.cxx:395
 TQMultiChannelAnalysisSampleVisitor.cxx:396
 TQMultiChannelAnalysisSampleVisitor.cxx:397
 TQMultiChannelAnalysisSampleVisitor.cxx:398
 TQMultiChannelAnalysisSampleVisitor.cxx:399
 TQMultiChannelAnalysisSampleVisitor.cxx:400
 TQMultiChannelAnalysisSampleVisitor.cxx:401
 TQMultiChannelAnalysisSampleVisitor.cxx:402
 TQMultiChannelAnalysisSampleVisitor.cxx:403
 TQMultiChannelAnalysisSampleVisitor.cxx:404
 TQMultiChannelAnalysisSampleVisitor.cxx:405
 TQMultiChannelAnalysisSampleVisitor.cxx:406
 TQMultiChannelAnalysisSampleVisitor.cxx:407
 TQMultiChannelAnalysisSampleVisitor.cxx:408
 TQMultiChannelAnalysisSampleVisitor.cxx:409
 TQMultiChannelAnalysisSampleVisitor.cxx:410
 TQMultiChannelAnalysisSampleVisitor.cxx:411
 TQMultiChannelAnalysisSampleVisitor.cxx:412
 TQMultiChannelAnalysisSampleVisitor.cxx:413
 TQMultiChannelAnalysisSampleVisitor.cxx:414
 TQMultiChannelAnalysisSampleVisitor.cxx:415
 TQMultiChannelAnalysisSampleVisitor.cxx:416
 TQMultiChannelAnalysisSampleVisitor.cxx:417
 TQMultiChannelAnalysisSampleVisitor.cxx:418
 TQMultiChannelAnalysisSampleVisitor.cxx:419
 TQMultiChannelAnalysisSampleVisitor.cxx:420
 TQMultiChannelAnalysisSampleVisitor.cxx:421
 TQMultiChannelAnalysisSampleVisitor.cxx:422
 TQMultiChannelAnalysisSampleVisitor.cxx:423
 TQMultiChannelAnalysisSampleVisitor.cxx:424
 TQMultiChannelAnalysisSampleVisitor.cxx:425
 TQMultiChannelAnalysisSampleVisitor.cxx:426
 TQMultiChannelAnalysisSampleVisitor.cxx:427
 TQMultiChannelAnalysisSampleVisitor.cxx:428
 TQMultiChannelAnalysisSampleVisitor.cxx:429
 TQMultiChannelAnalysisSampleVisitor.cxx:430
 TQMultiChannelAnalysisSampleVisitor.cxx:431
 TQMultiChannelAnalysisSampleVisitor.cxx:432
 TQMultiChannelAnalysisSampleVisitor.cxx:433
 TQMultiChannelAnalysisSampleVisitor.cxx:434
 TQMultiChannelAnalysisSampleVisitor.cxx:435
 TQMultiChannelAnalysisSampleVisitor.cxx:436
 TQMultiChannelAnalysisSampleVisitor.cxx:437
 TQMultiChannelAnalysisSampleVisitor.cxx:438
 TQMultiChannelAnalysisSampleVisitor.cxx:439
 TQMultiChannelAnalysisSampleVisitor.cxx:440
 TQMultiChannelAnalysisSampleVisitor.cxx:441
 TQMultiChannelAnalysisSampleVisitor.cxx:442
 TQMultiChannelAnalysisSampleVisitor.cxx:443
 TQMultiChannelAnalysisSampleVisitor.cxx:444
 TQMultiChannelAnalysisSampleVisitor.cxx:445
 TQMultiChannelAnalysisSampleVisitor.cxx:446
 TQMultiChannelAnalysisSampleVisitor.cxx:447
 TQMultiChannelAnalysisSampleVisitor.cxx:448
 TQMultiChannelAnalysisSampleVisitor.cxx:449
 TQMultiChannelAnalysisSampleVisitor.cxx:450
 TQMultiChannelAnalysisSampleVisitor.cxx:451
 TQMultiChannelAnalysisSampleVisitor.cxx:452
 TQMultiChannelAnalysisSampleVisitor.cxx:453
 TQMultiChannelAnalysisSampleVisitor.cxx:454
 TQMultiChannelAnalysisSampleVisitor.cxx:455
 TQMultiChannelAnalysisSampleVisitor.cxx:456
 TQMultiChannelAnalysisSampleVisitor.cxx:457
 TQMultiChannelAnalysisSampleVisitor.cxx:458
 TQMultiChannelAnalysisSampleVisitor.cxx:459
 TQMultiChannelAnalysisSampleVisitor.cxx:460
 TQMultiChannelAnalysisSampleVisitor.cxx:461
 TQMultiChannelAnalysisSampleVisitor.cxx:462
 TQMultiChannelAnalysisSampleVisitor.cxx:463
 TQMultiChannelAnalysisSampleVisitor.cxx:464
 TQMultiChannelAnalysisSampleVisitor.cxx:465
 TQMultiChannelAnalysisSampleVisitor.cxx:466
 TQMultiChannelAnalysisSampleVisitor.cxx:467
 TQMultiChannelAnalysisSampleVisitor.cxx:468
 TQMultiChannelAnalysisSampleVisitor.cxx:469
 TQMultiChannelAnalysisSampleVisitor.cxx:470
 TQMultiChannelAnalysisSampleVisitor.cxx:471
 TQMultiChannelAnalysisSampleVisitor.cxx:472
 TQMultiChannelAnalysisSampleVisitor.cxx:473
 TQMultiChannelAnalysisSampleVisitor.cxx:474
 TQMultiChannelAnalysisSampleVisitor.cxx:475
 TQMultiChannelAnalysisSampleVisitor.cxx:476
 TQMultiChannelAnalysisSampleVisitor.cxx:477
 TQMultiChannelAnalysisSampleVisitor.cxx:478
 TQMultiChannelAnalysisSampleVisitor.cxx:479
 TQMultiChannelAnalysisSampleVisitor.cxx:480
 TQMultiChannelAnalysisSampleVisitor.cxx:481
 TQMultiChannelAnalysisSampleVisitor.cxx:482
 TQMultiChannelAnalysisSampleVisitor.cxx:483
 TQMultiChannelAnalysisSampleVisitor.cxx:484
 TQMultiChannelAnalysisSampleVisitor.cxx:485
 TQMultiChannelAnalysisSampleVisitor.cxx:486
 TQMultiChannelAnalysisSampleVisitor.cxx:487
 TQMultiChannelAnalysisSampleVisitor.cxx:488
 TQMultiChannelAnalysisSampleVisitor.cxx:489
 TQMultiChannelAnalysisSampleVisitor.cxx:490
 TQMultiChannelAnalysisSampleVisitor.cxx:491
 TQMultiChannelAnalysisSampleVisitor.cxx:492
 TQMultiChannelAnalysisSampleVisitor.cxx:493
 TQMultiChannelAnalysisSampleVisitor.cxx:494
 TQMultiChannelAnalysisSampleVisitor.cxx:495
 TQMultiChannelAnalysisSampleVisitor.cxx:496
 TQMultiChannelAnalysisSampleVisitor.cxx:497
 TQMultiChannelAnalysisSampleVisitor.cxx:498
 TQMultiChannelAnalysisSampleVisitor.cxx:499
 TQMultiChannelAnalysisSampleVisitor.cxx:500
 TQMultiChannelAnalysisSampleVisitor.cxx:501
 TQMultiChannelAnalysisSampleVisitor.cxx:502
 TQMultiChannelAnalysisSampleVisitor.cxx:503
 TQMultiChannelAnalysisSampleVisitor.cxx:504
 TQMultiChannelAnalysisSampleVisitor.cxx:505
 TQMultiChannelAnalysisSampleVisitor.cxx:506
 TQMultiChannelAnalysisSampleVisitor.cxx:507
 TQMultiChannelAnalysisSampleVisitor.cxx:508
 TQMultiChannelAnalysisSampleVisitor.cxx:509
 TQMultiChannelAnalysisSampleVisitor.cxx:510
 TQMultiChannelAnalysisSampleVisitor.cxx:511
 TQMultiChannelAnalysisSampleVisitor.cxx:512
 TQMultiChannelAnalysisSampleVisitor.cxx:513
 TQMultiChannelAnalysisSampleVisitor.cxx:514
 TQMultiChannelAnalysisSampleVisitor.cxx:515
 TQMultiChannelAnalysisSampleVisitor.cxx:516
 TQMultiChannelAnalysisSampleVisitor.cxx:517
 TQMultiChannelAnalysisSampleVisitor.cxx:518
 TQMultiChannelAnalysisSampleVisitor.cxx:519
 TQMultiChannelAnalysisSampleVisitor.cxx:520
 TQMultiChannelAnalysisSampleVisitor.cxx:521
 TQMultiChannelAnalysisSampleVisitor.cxx:522
 TQMultiChannelAnalysisSampleVisitor.cxx:523
 TQMultiChannelAnalysisSampleVisitor.cxx:524
 TQMultiChannelAnalysisSampleVisitor.cxx:525
 TQMultiChannelAnalysisSampleVisitor.cxx:526
 TQMultiChannelAnalysisSampleVisitor.cxx:527
 TQMultiChannelAnalysisSampleVisitor.cxx:528
 TQMultiChannelAnalysisSampleVisitor.cxx:529
 TQMultiChannelAnalysisSampleVisitor.cxx:530
 TQMultiChannelAnalysisSampleVisitor.cxx:531
 TQMultiChannelAnalysisSampleVisitor.cxx:532
 TQMultiChannelAnalysisSampleVisitor.cxx:533
 TQMultiChannelAnalysisSampleVisitor.cxx:534
 TQMultiChannelAnalysisSampleVisitor.cxx:535
 TQMultiChannelAnalysisSampleVisitor.cxx:536
 TQMultiChannelAnalysisSampleVisitor.cxx:537
 TQMultiChannelAnalysisSampleVisitor.cxx:538
 TQMultiChannelAnalysisSampleVisitor.cxx:539
 TQMultiChannelAnalysisSampleVisitor.cxx:540
 TQMultiChannelAnalysisSampleVisitor.cxx:541
 TQMultiChannelAnalysisSampleVisitor.cxx:542
 TQMultiChannelAnalysisSampleVisitor.cxx:543
 TQMultiChannelAnalysisSampleVisitor.cxx:544
 TQMultiChannelAnalysisSampleVisitor.cxx:545
 TQMultiChannelAnalysisSampleVisitor.cxx:546
 TQMultiChannelAnalysisSampleVisitor.cxx:547
 TQMultiChannelAnalysisSampleVisitor.cxx:548
 TQMultiChannelAnalysisSampleVisitor.cxx:549
 TQMultiChannelAnalysisSampleVisitor.cxx:550
 TQMultiChannelAnalysisSampleVisitor.cxx:551
 TQMultiChannelAnalysisSampleVisitor.cxx:552
 TQMultiChannelAnalysisSampleVisitor.cxx:553
 TQMultiChannelAnalysisSampleVisitor.cxx:554
 TQMultiChannelAnalysisSampleVisitor.cxx:555
 TQMultiChannelAnalysisSampleVisitor.cxx:556
 TQMultiChannelAnalysisSampleVisitor.cxx:557
 TQMultiChannelAnalysisSampleVisitor.cxx:558
 TQMultiChannelAnalysisSampleVisitor.cxx:559
 TQMultiChannelAnalysisSampleVisitor.cxx:560
 TQMultiChannelAnalysisSampleVisitor.cxx:561
 TQMultiChannelAnalysisSampleVisitor.cxx:562
 TQMultiChannelAnalysisSampleVisitor.cxx:563
 TQMultiChannelAnalysisSampleVisitor.cxx:564
 TQMultiChannelAnalysisSampleVisitor.cxx:565
 TQMultiChannelAnalysisSampleVisitor.cxx:566
 TQMultiChannelAnalysisSampleVisitor.cxx:567
 TQMultiChannelAnalysisSampleVisitor.cxx:568
 TQMultiChannelAnalysisSampleVisitor.cxx:569
 TQMultiChannelAnalysisSampleVisitor.cxx:570
 TQMultiChannelAnalysisSampleVisitor.cxx:571
 TQMultiChannelAnalysisSampleVisitor.cxx:572
 TQMultiChannelAnalysisSampleVisitor.cxx:573
 TQMultiChannelAnalysisSampleVisitor.cxx:574
 TQMultiChannelAnalysisSampleVisitor.cxx:575
 TQMultiChannelAnalysisSampleVisitor.cxx:576
 TQMultiChannelAnalysisSampleVisitor.cxx:577
 TQMultiChannelAnalysisSampleVisitor.cxx:578
 TQMultiChannelAnalysisSampleVisitor.cxx:579
 TQMultiChannelAnalysisSampleVisitor.cxx:580
 TQMultiChannelAnalysisSampleVisitor.cxx:581
 TQMultiChannelAnalysisSampleVisitor.cxx:582
 TQMultiChannelAnalysisSampleVisitor.cxx:583
 TQMultiChannelAnalysisSampleVisitor.cxx:584
 TQMultiChannelAnalysisSampleVisitor.cxx:585
 TQMultiChannelAnalysisSampleVisitor.cxx:586
 TQMultiChannelAnalysisSampleVisitor.cxx:587
 TQMultiChannelAnalysisSampleVisitor.cxx:588
 TQMultiChannelAnalysisSampleVisitor.cxx:589
 TQMultiChannelAnalysisSampleVisitor.cxx:590
 TQMultiChannelAnalysisSampleVisitor.cxx:591
 TQMultiChannelAnalysisSampleVisitor.cxx:592
 TQMultiChannelAnalysisSampleVisitor.cxx:593
 TQMultiChannelAnalysisSampleVisitor.cxx:594
 TQMultiChannelAnalysisSampleVisitor.cxx:595
 TQMultiChannelAnalysisSampleVisitor.cxx:596
 TQMultiChannelAnalysisSampleVisitor.cxx:597
 TQMultiChannelAnalysisSampleVisitor.cxx:598
 TQMultiChannelAnalysisSampleVisitor.cxx:599
 TQMultiChannelAnalysisSampleVisitor.cxx:600
 TQMultiChannelAnalysisSampleVisitor.cxx:601
 TQMultiChannelAnalysisSampleVisitor.cxx:602
 TQMultiChannelAnalysisSampleVisitor.cxx:603
 TQMultiChannelAnalysisSampleVisitor.cxx:604
 TQMultiChannelAnalysisSampleVisitor.cxx:605
 TQMultiChannelAnalysisSampleVisitor.cxx:606
 TQMultiChannelAnalysisSampleVisitor.cxx:607
 TQMultiChannelAnalysisSampleVisitor.cxx:608
 TQMultiChannelAnalysisSampleVisitor.cxx:609
 TQMultiChannelAnalysisSampleVisitor.cxx:610
 TQMultiChannelAnalysisSampleVisitor.cxx:611
 TQMultiChannelAnalysisSampleVisitor.cxx:612
 TQMultiChannelAnalysisSampleVisitor.cxx:613
 TQMultiChannelAnalysisSampleVisitor.cxx:614
 TQMultiChannelAnalysisSampleVisitor.cxx:615
 TQMultiChannelAnalysisSampleVisitor.cxx:616
 TQMultiChannelAnalysisSampleVisitor.cxx:617
 TQMultiChannelAnalysisSampleVisitor.cxx:618
 TQMultiChannelAnalysisSampleVisitor.cxx:619
 TQMultiChannelAnalysisSampleVisitor.cxx:620
 TQMultiChannelAnalysisSampleVisitor.cxx:621
 TQMultiChannelAnalysisSampleVisitor.cxx:622
 TQMultiChannelAnalysisSampleVisitor.cxx:623
 TQMultiChannelAnalysisSampleVisitor.cxx:624
 TQMultiChannelAnalysisSampleVisitor.cxx:625
 TQMultiChannelAnalysisSampleVisitor.cxx:626