#include <QFramework/TQNTupleDumperAnalysisJob.h>
#include <QFramework/TQStringUtils.h>
#include <QFramework/TQUtils.h>
#include <QFramework/TQToken.h>
#include <QFramework/TQObservable.h>
#include <QFramework/TQCut.h>
#include <QFramework/TQPathManager.h>
#include <TString.h>
#include "TBranch.h"
#include "TTree.h"
#include <stdexcept>
#include <map>
#include <vector>

//#define _DEBUG_
#include <QFramework/TQLibrary.h>

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQNTupleDumperAnalysisJob:
//
// The TQNTupleDumperAnalysisJob is an analysis job that provides an
// easy interface allowing to write out flat, sk(l)immed mini-nTuples
// with a carefully selected set of variables that can further be used
// for MVA or statistics processing.
//
// Once the job has been created, branches (variables) can be booked like this:
// TQNTupleDumperAnalysisJob::bookVariable("int","runNumber","EventInfo.runNumber()")
//
// It is also possible to mass-book nTuple jobs from config files, using the static
// TQNTupleDumperAnalysisJob::importJobsFromTextFiles
// function. The syntax of these files may look like this:
//
//  ntup: int runNumber << float, mjj << Mjj/1000. , float dyjj << DYjj;
//  @Cut_2jet: ntup >> data/ntup/$(SampleID).root:HWWTree_$(channel);
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQNTupleDumperAnalysisJob)

TQMessageStream TQNTupleDumperAnalysisJob::fErrMsg(new std::stringstream());

const std::map<TQNTupleDumperAnalysisJob::VarType,bool> TQNTupleDumperAnalysisJob::isVectorBranchMap { //used to determine if the branch associated with a particular VarType is vector valued
          {TQNTupleDumperAnalysisJob::VarType::UNKNOWN, false},
          {TQNTupleDumperAnalysisJob::VarType::INT, false},
          {TQNTupleDumperAnalysisJob::VarType::INT32, false},
          {TQNTupleDumperAnalysisJob::VarType::INT64, false},
          {TQNTupleDumperAnalysisJob::VarType::FLOAT, false},
          {TQNTupleDumperAnalysisJob::VarType::DOUBLE, false},
          {TQNTupleDumperAnalysisJob::VarType::UI, false},
          {TQNTupleDumperAnalysisJob::VarType::UL, false},
          {TQNTupleDumperAnalysisJob::VarType::ULI, false},
          {TQNTupleDumperAnalysisJob::VarType::ULL, false},
          {TQNTupleDumperAnalysisJob::VarType::ULLI, false},
          {TQNTupleDumperAnalysisJob::VarType::UINT32, false},
          {TQNTupleDumperAnalysisJob::VarType::UINT64, false},
          {TQNTupleDumperAnalysisJob::VarType::VECTORINT, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORINT32, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORINT64, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORFLOAT, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORDOUBLE, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORUI, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORUL, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORULI, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORULL, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORULLI, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORUINT32, true},
          {TQNTupleDumperAnalysisJob::VarType::VECTORUINT64, true}
      };

namespace TQNTupleDumperAnalysisJobHelpers {
  class BranchHandle {
  public:
    const TString name;
    TBranch* branch = 0;
    virtual ~BranchHandle(){};
    BranchHandle(const TString& bname) :
      name(bname) {}
    virtual void setValue(double x, int index = 0) = 0;
    virtual double getValue(int index = 0) const = 0;
    virtual int getNValues() const = 0;
    virtual void resetValue() = 0; //no op for scalar case, calls std::vector<T>::clear() for vector case
    virtual TString getValuesAsString() const { return TString(""); }
    const char* getName() const {
      return name.Data();
    }
  };

  template<class T>
  class BranchHandleT : public BranchHandle {
  public:
    mutable T element = 0;
    virtual void setValue(double x, int index = 0) final override {
      DEBUGfunc("setting value of branch %s@%p to %g",this->getName(),this->branch,x);
      if (index != 0) {throw std::runtime_error(TString::Format("Caught attempt to set value of scalar branch handle with index != 0 (%d)",index).Data()); return;}
      this->element = (T)x;
    }
    virtual double getValue(int /*index*/ = 0) const final override {
      return (double)(this->element);
    }
    virtual int getNValues() const final override {return 1;}
    virtual void resetValue() final override {
      this->element = (T)0.;
    }
    virtual TString getValuesAsString() const final override {
      return TString::Format("%.4f",this->getValue());
    }
    BranchHandleT(TTree* tree, const TString& bname) :
      BranchHandle(bname) {
      this->branch = tree->GetBranch(name);
      if(this->branch){
        tree->SetBranchAddress(name,&element);
      } else {
        this->branch = tree->Branch(name, &element);
      }
      DEBUGfunc("setting branch %s@%p to address %p",this->getName(),this->branch,&element);
    }
  };

  template<class T>
  class BranchHandleVectorT : public BranchHandle {
  public:
    mutable std::vector<T> element;
    virtual void setValue(double x, int index = 0) final override {
      DEBUGfunc("setting value of branch %s[%d]@%p to %g",this->getName(),index,this->branch,x);
      if (! (index<(int)element.size()) ) element.resize(index+1); //adjust vector size if insufficient
      this->element[index] = (T)x;
    }
    virtual double getValue(int i) const final override {
      if (i<(int)element.size()) return (double)(this->element[i]);
      throw std::runtime_error(TString::Format("Caught attempt to access TQNTupleDumperAnalysisJobHelpers::BranchHandleVectorT::element out of bounds in handle '%s'!",this->getName()).Data());
    }
    virtual int getNValues() const final override {return (int)element.size();}
    virtual void resetValue() final override {
      element.clear();
    }
    virtual TString getValuesAsString() const final override {
      TString retval = "{";
      for (int i=0; i<this->getNValues(); ++i) {
        if (i!=0) retval.Append(", "); //not required for first element
        retval.Append(TString::Format("%.4f",this->getValue(i)));
      }
      retval.Append("}");
      return retval;
    }

    BranchHandleVectorT(TTree* tree, const TString& bname) :
      BranchHandle(bname) {
      this->branch = tree->GetBranch(name);
      if(this->branch){
        tree->SetBranchAddress(name,&element);
      } else {
        this->branch = tree->Branch(name, &element);
      }
      DEBUGfunc("setting branch %s@%p to address %p",this->getName(),this->branch,&element);
    }
  };

  class TreeHandle {
  public:
    TTree* tree = 0;
    std::vector<TQToken*> tokens;
    std::vector<BranchHandle*> branches;

    ~TreeHandle() noexcept(false){
      for(auto b:branches){
        delete b;
      }
      if(tokens.size() > 0){
        throw std::runtime_error("trying to delete TreeHandle with remaining tree tokens!");
      }
    }

    void empty(){
      for(auto branch:branches){
        branch->resetValue();
      }
    }
    void fill(){
      this->tree->Fill();
    }
    void print(){
      for(auto b:branches){
        std::cout << b->getName() << " = " << b->getValuesAsString().Data() << std::endl;
      }
    }

    BranchHandle* getBranch(const TString& name,TQNTupleDumperAnalysisJob::VarType type){
      DEBUGfunc("requested branch '%s'",name.Data());
      for(size_t i=0; i<branches.size(); ++i){
        if(TQStringUtils::equal(branches[i]->getName(),name)){
          DEBUGfunc("returning existing branch '%s@%p'",name.Data(),branches[i]);
          return branches[i];
        }
      }
      BranchHandle* b = NULL;
      switch(type){
      case TQNTupleDumperAnalysisJob::INT:
        b = new BranchHandleT<int>(tree,name); break;
      case TQNTupleDumperAnalysisJob::INT32:
        b = new BranchHandleT<int32_t>(tree,name); break;
      case TQNTupleDumperAnalysisJob::INT64:
        b = new BranchHandleT<int64_t>(tree,name); break;
      case TQNTupleDumperAnalysisJob::DOUBLE:
        b = new BranchHandleT<double>(tree,name); break;
      case TQNTupleDumperAnalysisJob::FLOAT:
        b = new BranchHandleT<float>(tree,name); break;
      case TQNTupleDumperAnalysisJob::UI:
        b = new BranchHandleT<unsigned int>(tree,name); break;
      case TQNTupleDumperAnalysisJob::UL:
        b = new BranchHandleT<unsigned long>(tree,name); break;
      case TQNTupleDumperAnalysisJob::ULI:
        b = new BranchHandleT<unsigned long int>(tree,name); break;
      case TQNTupleDumperAnalysisJob::ULL:
        b = new BranchHandleT<unsigned long long>(tree,name); break;
      case TQNTupleDumperAnalysisJob::ULLI:
        b = new BranchHandleT<unsigned long long int>(tree,name); break;
      case TQNTupleDumperAnalysisJob::UINT32:
        b = new BranchHandleT<uint32_t>(tree,name); break;
      case TQNTupleDumperAnalysisJob::UINT64:
        b = new BranchHandleT<uint64_t>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORINT:
        b = new BranchHandleVectorT<int>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORINT32:
        b = new BranchHandleVectorT<int32_t>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORINT64:
        b = new BranchHandleVectorT<int64_t>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORDOUBLE:
        b = new BranchHandleVectorT<double>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORFLOAT:
        b = new BranchHandleVectorT<float>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORUI:
        b = new BranchHandleVectorT<unsigned int>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORUL:
        b = new BranchHandleVectorT<unsigned long>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORULI:
        b = new BranchHandleVectorT<unsigned long int>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORULL:
        b = new BranchHandleVectorT<unsigned long long>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORULLI:
        b = new BranchHandleVectorT<unsigned long long int>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORUINT32:
        b = new BranchHandleVectorT<uint32_t>(tree,name); break;
      case TQNTupleDumperAnalysisJob::VECTORUINT64:
        b = new BranchHandleVectorT<uint64_t>(tree,name); break;
      default:
        throw std::runtime_error(TString::Format("in TQNTupleDumperAnalysisJob, encountered unknown variable type for '%s'",name.Data()).Data());
      }
      this->branches.push_back(b);
      DEBUGfunc("returning new branch '%s@%p'",name.Data(),b);
      return b;
    }
    TQToken* getToken(){
      DEBUGfunc("attempting to get token for '%s'",tree->GetName());
      TQToken* tok = new TQToken();
      tok->setContent(this);
      this->tokens.push_back(tok);
      return tok;
    }
    bool returnToken(TQToken* tok){
      DEBUGfunc("attempting to return token for '%s'",tree->GetName());
      bool found = false;

      // thank you internet <3 from
      // https://stackoverflow.com/questions/8234779/how-to-remove-from-a-map-while-iterating-it/
      for (auto it = tokens.begin(); it != tokens.end() /* not hoisted */; /* no increment */)
      {
        if (tok == (*it))
        {
          DEBUGfunc("returning token %p", (*it));
          it = tokens.erase(it);
          found = true;
        }
        else
        {
          it++;
        }
      }

      if(found){
        delete tok;
      } else {
        DEBUGfunc("unable to return token %p",tok);
      }
      return found;
    }
    bool hasTokens(){
      return (tokens.size() > 0);
    }
    void close(){
      TDirectory* d = gDirectory;
      gDirectory = tree->GetDirectory();
      DEBUGfunc("writing tree '%s' with %d entries to directory '%s'",tree->GetName(),tree->GetEntries(),gDirectory->GetName());
      tree->Write("", TObject::kOverwrite);
      gDirectory = d;
      for(auto b:this->branches){
        delete b;
      }
      this->branches.clear();
    }
    TreeHandle(TTree* t) : tree(t) {};
  };

  class FileHandle {
    bool hasBeenOpened = false;
    TString filename = "";
    TFile* file = 0;
    std::map<const TString,TreeHandle*> trees;
  public:
    FileHandle(const TString& name) : filename(name) {};
    TQToken* getTreeToken(const TString& treename){
      if(!file){
        DEBUGfunc("attempting to open file '%s'",filename.Data());
        if(hasBeenOpened){
          file = TFile::Open(filename,"UPDATE");
        } else {
          TQUtils::ensureDirectoryForFile(filename);
          file = TFile::Open(filename,"RECREATE");
        }
      }
      if(!file || !file->IsOpen()){
        DEBUGfunc("invalid file '%s'",filename.Data());
        if(file) delete file;
        return NULL;
      }
      hasBeenOpened = true;
      DEBUGfunc("attempting to find tree '%s' in file '%s'",treename.Data(),filename.Data());
      if(trees.find(treename) == trees.end()){
        TTree* t = dynamic_cast<TTree*>(file->Get(treename));
        if(!t){
          t = new TTree(treename,treename);
          t->SetMaxVirtualSize(1e15);
          t->SetDirectory(file);
        }
        trees.emplace(treename,new TreeHandle(t));
      }
      DEBUGfunc("attempting to get tree token for '%s':'%s'",filename.Data(),treename.Data());
      return trees[treename]->getToken();
    }
    bool returnTreeToken(const TString& treename, TQToken* tok){
      DEBUGfunc("attempting to return tree token for '%s':'%s'",filename.Data(),treename.Data());
      if(trees.find(treename) == trees.end()){
        return false;
      }
      bool found = trees[treename]->returnToken(tok);

      // thank you internet <3 from
      // https://stackoverflow.com/questions/8234779/how-to-remove-from-a-map-while-iterating-it/
      for (auto it = trees.begin(); it != trees.end() /* not hoisted */; /* no increment */)
      {
        if (!(*it).second->hasTokens())
        {
          (*it).second->close();
          delete (*it).second;
          it = trees.erase(it);
        }
        else
        {
          it++;
        }
      }

      if(trees.size() == 0){
        file->Close();
        delete file;
        file = NULL;
      }
      return found;
    }
  };

  std::map<const TString,FileHandle*> gFiles;

}

using namespace TQNTupleDumperAnalysisJobHelpers;

//__________________________________________________________________________________|___________

TQToken* TQNTupleDumperAnalysisJob::getTreeToken(const TString& filename, const TString& treename){
  if(gFiles.find(filename) == gFiles.end()){
    gFiles.emplace(filename,new FileHandle(filename));
  }
  TQToken* tok = gFiles[filename]->getTreeToken(treename);
  return tok;
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::returnTreeToken(const TString& filename, const TString& treename, TQToken* tok){
  if(gFiles.find(filename) == gFiles.end()){
    return false;
  }
  return gFiles[filename]->returnTreeToken(treename,tok);
}

//__________________________________________________________________________________|___________

TQNTupleDumperAnalysisJob::TQNTupleDumperAnalysisJob(const TString& name) :
  TQAnalysisJob(name)
{
  // default constructor
}

//__________________________________________________________________________________|___________

TQNTupleDumperAnalysisJob::VarType TQNTupleDumperAnalysisJob::getVarType (TString typestr){
  // convert a VarType string to the corresponding enum
  typestr.ToLower();
  DEBUGclass("trying to match type '%s'",typestr.Data());
  if(TQStringUtils::equal(typestr,"int")){
    return VarType::INT;
  }
  if(TQStringUtils::equal(typestr,"int32_t")){
    return VarType::INT32;
  }
  if(TQStringUtils::equal(typestr,"int64_t")){
    return VarType::INT64;
  }
  if(TQStringUtils::equal(typestr,"float")){
    return VarType::FLOAT;
  }
  if(TQStringUtils::equal(typestr,"double")){
    return VarType::DOUBLE;
  }
  if(TQStringUtils::equal(typestr,"unsigned int")){
    return VarType::UI;
  }
  if(TQStringUtils::equal(typestr,"unsigned long")){
    return VarType::UL;
  }
  if(TQStringUtils::equal(typestr,"unsigned long int")){
    return VarType::ULI;
  }
  if(TQStringUtils::equal(typestr,"unsigned long long")){
    return VarType::ULL;
  }
  if(TQStringUtils::equal(typestr,"unsigned long long int")){
    return VarType::ULLI;
  }
  if(TQStringUtils::equal(typestr,"uint32_t")){
    return VarType::UINT32;
  }
  if(TQStringUtils::equal(typestr,"uint64_t")){
    return VarType::UINT64;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<int>")) {
    return VarType::VECTORINT;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<int32_t>")) {
    return VarType::VECTORINT32;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<int64_t>")) {
    return VarType::VECTORINT64;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<float>")) {
    return VarType::VECTORFLOAT;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<double>")) {
    return VarType::VECTORDOUBLE;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedint>")) { //minimize removes all whitespaces
    return VarType::VECTORUI;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedlong>")) { //minimize removes all whitespaces
    return VarType::VECTORUL;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedlongint>")) { //minimize removes all whitespaces
    return VarType::VECTORULI;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedlonglong>")) { //minimize removes all whitespaces
    return VarType::VECTORULL;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedlonglongint>")) { //minimize removes all whitespaces
    return VarType::VECTORULLI;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<uint32_t>")) {
    return VarType::VECTORUINT32;
  }
  if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<uint64_t>")) {
    return VarType::VECTORUINT64;
  }

  return VarType::UNKNOWN;
}

//__________________________________________________________________________________|___________

TString TQNTupleDumperAnalysisJob::getTypeString (VarType type){
  // convert a VarType enum to the corresponding string
    switch(type){
    case TQNTupleDumperAnalysisJob::VarType::INT:
      return "int";
    case TQNTupleDumperAnalysisJob::VarType::INT32:
      return "int32_t";
    case TQNTupleDumperAnalysisJob::VarType::INT64:
      return "int64_t";
    case TQNTupleDumperAnalysisJob::VarType::FLOAT:
      return "float";
    case TQNTupleDumperAnalysisJob::VarType::DOUBLE:
      return "double";
    case TQNTupleDumperAnalysisJob::VarType::UI:
      return "unsigned int";
    case TQNTupleDumperAnalysisJob::VarType::UL:
      return "unsigned long";
    case TQNTupleDumperAnalysisJob::VarType::ULI:
      return "unsigned long int";
    case TQNTupleDumperAnalysisJob::VarType::ULL:
      return "unsigned long long";
    case TQNTupleDumperAnalysisJob::VarType::ULLI:
      return "unsigned long long int";
    case TQNTupleDumperAnalysisJob::VarType::UINT32:
      return "uint32_t";
    case TQNTupleDumperAnalysisJob::VarType::UINT64:
      return "uint64_t";
    case TQNTupleDumperAnalysisJob::VarType::VECTORINT:
      return "vector<int>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORINT32:
      return "vector<int32_t>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORINT64:
      return "vector<int64_t>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORFLOAT:
      return "vector<float>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORDOUBLE:
      return "vector<double>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORUI:
      return "vector<unsigned int>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORUL:
      return "vector<unsigned long>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORULI:
      return "vector<unsigned long int>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORULL:
      return "vector<unsigned long long>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORULLI:
      return "vector<unsigned long long int>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORUINT32:
      return "vector<uint32_t>";
    case TQNTupleDumperAnalysisJob::VarType::VECTORUINT64:
      return "vector<uint64_t>";

    default:
      return TQStringUtils::makeBoldRed("invalid");
    }
}

//__________________________________________________________________________________|___________

int TQNTupleDumperAnalysisJob::nVariables(){
  // retrieve the number of booked variables
  return this->fTypes.size();
}

//__________________________________________________________________________________|___________

void TQNTupleDumperAnalysisJob::printBranches(){
  // print the branches booked in this job
  std::cout<< TQStringUtils::makeBoldBlue(this->Class()->GetName()) << " " << TQStringUtils::makeBoldWhite(this->GetName()) << std::endl;
  for(size_t i=0; i<this->fTypes.size(); ++i){
    std::cout << TQStringUtils::fixedWidth(this->getTypeString(this->fTypes[i]),10,"l") << " " <<
      TQStringUtils::makeBoldWhite(TQStringUtils::fixedWidth(this->fVarNames[i],20,"l")) << " " <<
      TQStringUtils::fixedWidth(this->fExpressions[i],50,"l") << std::endl;
  }
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::bookVariable(const TString& type, const TString& name, const TString& definition){
  // book a variable
  DEBUGclass("called with arguments '%s','%s','%s'",type.Data(),name.Data(),definition.Data());
  return this->bookVariable(this->getVarType(type),name,definition);
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::bookVariable(VarType type, const TString& name, const TString& definition){
  // book a variable
  DEBUGclass("called with arguments '%d','%s','%s'",type,name.Data(),definition.Data());
  if(type == VarType::UNKNOWN){
    ERRORclass("cannot book variable '%s' of unknown type!",name.Data());
    return false;
  }
  this->fTypes.push_back(type);
  this->fExpressions.push_back(definition);
  this->fVarNames.push_back(name);

  return true;
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::initializeTree(TQTaggable* tags) {
  // initialize the output tree for this job
  DEBUGclass("entering function");
  TQTaggable tempTags;
  tempTags.setTagString("cut",this->fCut->GetName());
  this->fActiveFileName = tempTags.replaceInTextRecursive( tags->replaceInTextRecursive(this->fFileName,"~",false) );
  this->fActiveTreeName = tempTags.replaceInTextRecursive( tags->replaceInTextRecursive(this->fTreeName.Data(),"~",false) );
  if(fActiveFileName.Contains("$") || fActiveTreeName.Contains("$")){
    ERRORclass("unexpanded placeholders encountered in TQNTupleDumperAnalysisJob::initializeTree: file='%s', tree='%s'. available tags:",fActiveFileName.Data(),fActiveTreeName.Data());
    tags->printTags();
    throw std::runtime_error("unexpanded placeholders");
    return false;
  }

  DEBUGclass("initializing output file '%s' for '%s'",fActiveFileName.Data(),fActiveTreeName.Data());
  this->fActiveFileName = TQPathManager::getPathManager()->getLocalPath(this->fActiveFileName);
  DEBUGclass("File will temporarily be written to %s", this->fActiveFileName.Data());

  this->fTreeToken = TQNTupleDumperAnalysisJob::getTreeToken(fActiveFileName,fActiveTreeName);
  if(!this->fTreeToken){
    throw std::runtime_error(TString::Format("unable to open ouptut for '%s':'%s'",fActiveFileName.Data(),fActiveTreeName.Data()).Data());
    return false;
  }
  DEBUGclass("retrieving tree handler");
  this->fTreeHandler = (TQNTupleDumperAnalysisJobHelpers::TreeHandle*)(this->fTreeToken->getContent());

  DEBUGclass("getting branches");
  const size_t size = this->fVarNames.size();
  for(size_t i=0; i<size; ++i){
    this->fBranches.push_back(this->fTreeHandler->getBranch(this->fVarNames[i],this->fTypes[i]));
    DEBUGclass("registered branch '%s' at position %p",this->fVarNames[i].Data(),this->fBranches[i]);
  }

  if(this->fWriteWeight){
    this->fWeightBranch = this->fTreeHandler->getBranch(this->fWeightName,VarType::DOUBLE);
    DEBUGclass("registered weight branch '%s' at position %p",this->fWeightName.Data(),this->fWeightBranch);
  }
  DEBUGclass("done");
  return true;
}

//__________________________________________________________________________________|___________

void TQNTupleDumperAnalysisJob::writeWeights(bool write, const TString& name){
  // determine whether to write weights, and what name the weight branch should have
  this->fWriteWeight = write;
  this->fWeightName = name;
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::finalizeTree() {
  // finalize the output tree and close the file
  DEBUGclass("finalizing...");
  bool ok = TQNTupleDumperAnalysisJob::returnTreeToken(this->fActiveFileName,this->fActiveTreeName,this->fTreeToken);
  this->fActiveFileName.Clear();
  this->fActiveTreeName.Clear();
  this->fBranches.clear();
  this->fTreeToken = NULL;
  this->fTreeHandler = NULL;
  return ok;
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::initializeSelf() {
  // initialize this analysis job
  DEBUGclass("initializing observables");
  for(size_t i=0; i<this->fVarNames.size(); ++i){
    TQObservable* obs = TQObservable::getObservable(this->fExpressions[i],this->fSample);
    if (!obs->initialize(this->fSample)) {
      ERRORclass("Failed to initialize observable obtained from expression '%s' in TQNTupleDumperAnalysisJob with filename:treename='%s:%s' for sample '%s'",this->fExpressions[i].Data(), this->fFileName.Data(), this->fTreeName.Data() ,this->fSample->getPath().Data());
      return false;
    }
    this->fObservables.push_back(obs);
  }

  if(!this->fTreeHandler){
    DEBUGclass("initializing tree");
    this->poolAt = this->fSample;
    if(!this->initializeTree(this->fSample)) return false;
  }

  DEBUGclass("done");
  return true;
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::finalizeSelf() {
  // finalize this analysis job
  DEBUGclass("finalizing observables");
  for(size_t i=0; i<this->fVarNames.size(); ++i){
    this->fObservables[i]->finalize();
  }
  this->fObservables.clear();

  if(this->poolAt == this->fSample){
    DEBUGclass("finalizing tree");
    this->poolAt = nullptr;
    if(!this->finalizeTree()) return false;
  }
  this->fExpectSingleEntryPerEvent = false; //reset expectation of single entry in output tree per input event (i.e. per 'execute' call)

  return true;
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::initializeSampleFolder(TQSampleFolder* sf){
  // initialize this job on a sample folder (taking care of pooling)
  if (!sf) return false;
  if(!this->poolAt){
    // by default, we pool as soon as the filename is uniquely determined
    TQTaggable tempTags;
    tempTags.setTagString("cut",this->fCut->GetName());
    TString filename = tempTags.replaceInTextRecursive( sf->replaceInTextRecursive(this->fFileName, "~", false) );
    TString treename = tempTags.replaceInTextRecursive( sf->replaceInTextRecursive(this->fTreeName, "~", false) );
    bool pool = (!(filename.Contains("$")) && (!(treename.Contains("$"))));
    sf->getTagBool(".aj.pool.trees",pool);
    if(pool && !this->fTreeHandler){
      DEBUG("starting to pool at sample folder '%s'",sf->GetName());
      this->poolAt = sf;
      //TQTaggable tags(sf);
      //tags.setTagString("cut",this->fCut->GetName());
      this->initializeTree(sf);
    }
  }

  return true;
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::finalizeSampleFolder(TQSampleFolder* sf){
  // finalize this job on a sample folder (taking care of pooling)
  bool ok = true;
  if(sf == this->poolAt){
    ok = this->finalizeTree();
    this->poolAt = NULL;
  }
  return ok;
}

//__________________________________________________________________________________|___________

int TQNTupleDumperAnalysisJob::getNentriesToCreate() const {
  // returns the number of entries to be created in the output tree for the current
  // input event. A std::runtime_error is thrown if an incompatible combination of
  // observables is found. Checks are skipped and 1 is returned if for the current
  // TQSample the booked ntuple structure can be expected to always yield one output
  // entry (event) per input event
  if (fExpectSingleEntryPerEvent) return 1; //shortcut if we have already assesed that there are no vector observables used for non-vector branches (in which case we should create one entry in the output tree per entry of the vector observable
  int nEntries = -1;
  #ifdef _DEBUG_
  TQObservable* refObs = nullptr;
  #endif
  for (size_t i=0; i<fTypes.size(); ++i) {
    if (fObservables[i]->getObservableType() != TQObservable::ObservableType::vector) continue; //scalar observables are evaluated as needed
    if (isVectorBranchMap.at(fTypes[i])) continue; //for vector branches we use the full range of the corresponding observable in any case (but still have only one tree entry in the output)
    DEBUGclass("found non-trivial observable / branch type combination in TQNTupleDumperAnalysisJob '%s'",this->GetName());
    if (nEntries<0) {
      nEntries = fObservables[i]->getNevaluations(); //store the number of evaluations if this is the first vector observable (which is not associated to a vector branch!)
      #ifdef _DEBUG_
      refObs = fObservables[i];
      #endif
    }

    else if (fObservables[i]->getNevaluations() != nEntries) { //check for inconsistencies for which there is no obvious way out -> throw!
      #ifdef _DEBUG_
      throw std::runtime_error(TString::Format("Found inconsistent number of evaluations between different vector observables in TQNTupleDumperAnalysisJob '%s': %d vs %d evaluations (from observables with expressions '%s' vs '%s').",
              this->GetName(),
              refObs ? refObs->getNevaluations() : std::numeric_limits<int>::quiet_NaN(),
              fObservables[i] ? fObservables[i]->getNevaluations() : std::numeric_limits<int>::quiet_NaN(),
              refObs ? refObs->getExpression().Data() : "<observable n/a>",
              fObservables[i] ? fObservables[i]->getExpression().Data() : "<observable n/a>"
              ).Data());
      #else//simplified error message
      throw std::runtime_error(TString::Format("Found inconsistent number of evaluations between different vector observables in TQNTupleDumperAnalysisJob '%s'",this->GetName()).Data());
      #endif
      return -1;
    }
  }

  if (nEntries<0) { //if no Observable+branchType combination might imply multiple tree entries per input event we can skipp these tests for the rest of the sample
    this->fExpectSingleEntryPerEvent = true;
    return 1;
  }
  //we have a non-trivial setup so we return the number of output entries to create for the current input event
  return nEntries;
}

//__________________________________________________________________________________|___________

bool TQNTupleDumperAnalysisJob::execute(double weight) {
  // execute this analysis job on one event
  // fill the output tree with the event data
  if(!this->fTreeHandler){
    DEBUGclass("invalid treehandler!");
    return false;
  }

  int nToCreate = this->getNentriesToCreate();
  if (nToCreate<0) {
    ERRORclass("Failed to obtain valid number of entries to create in TQNTupleDumperAnalysisJob '%s'",this->GetName());
    return false;
  }

  for (int entry = 0; entry<nToCreate; ++entry) {
    this->fTreeHandler->empty(); //initialize all branch values to 0 (for vector branches length 1, vec[0]=0.)

    for(size_t i=0; i<this->fBranches.size(); ++i){
      //differetiate two cases: 'vector observable with scalar branch' or 'anything else'
      if (this->fObservables[i]->getObservableType() == TQObservable::ObservableType::vector && !isVectorBranchMap.at(fTypes[i])) {
        TRY(
          fBranches[i]->setValue(this->fObservables[i]->getValueAt(entry),0);
          ,TString::Format("Failed to set value for branch '%s' using observable '%s'",fBranches[i]->getName(),this->fObservables[i]->GetName())
          )
      } else {
      //'anything else'
        for (int vecIndex = this->fObservables[i]->getNevaluations()-1; vecIndex>=0; --vecIndex) { //iterate backwards to avoid resizing the internal std::vector<T> each time
          TRY(
          fBranches[i]->setValue(this->fObservables[i]->getValueAt(vecIndex),vecIndex);
          ,TString::Format("Failed to set value for branch '%s' using observable '%s'",fBranches[i]->getName(),this->fObservables[i]->GetName())
          )
        }
      }
    }
    if(this->fWriteWeight){
      fWeightBranch->setValue(weight*fSample->getNormalisation());
      //    fWeightBranch->setValue(fObservables[0]->getCurrentEntry());
    }
    DEBUGclass("filling event %d from instance %s at cut %s",fObservables[0]->getCurrentEntry() ,this->GetName(),this->fCut->GetName());
    #ifdef _DEBUG_
    this->fTreeHandler->print();
    #endif
    this->fTreeHandler->fill();
  }


  return true;
}

//__________________________________________________________________________________|___________

TObjArray * TQNTupleDumperAnalysisJob::getBranchNames() {
  // retrieve the list of branch names used by this job
  TObjArray * bNames = new TObjArray();

  for (size_t i = 0; i < this->fObservables.size(); ++i) {
    TQObservable* obs = this->fObservables[i];
    if(obs){
      TCollection* c = obs->getBranchNames();
      if(c){
        if(c->GetEntries() > 0) bNames -> AddAll(c);
        delete c;
      }
    }
  }

  return bNames;
}

//__________________________________________________________________________________|___________

TQNTupleDumperAnalysisJob::TQNTupleDumperAnalysisJob(TQNTupleDumperAnalysisJob* other) :
  TQAnalysisJob(other ? other->GetName() : "TQNTupleDumperAnalysisJob"),
  fTreeName(other ? other->fTreeName : "invalid"),
  fFileName(other ? other->fFileName : "invalid.root"),
  fWriteWeight(other ? other->fWriteWeight : true),
  fWeightName(other ? other->fWeightName : "weight")
{
  // copy constructor
  if(other){
    for(int i=0; i<other->nVariables(); ++i){
      this->bookVariable(other->fTypes[i], other->fVarNames[i], other->fExpressions[i]);
    }
  }
}

//__________________________________________________________________________________|___________

TQAnalysisJob * TQNTupleDumperAnalysisJob::getClone() {
  // cloning function, internally calls copy constructor
  return new TQNTupleDumperAnalysisJob(this);
}

//__________________________________________________________________________________|___________

int TQNTupleDumperAnalysisJob::importJobsFromTextFiles(const std::vector<TString>& filenames, TQCut* basecut, TQTaggable* aliases, const TString& channelFilter, bool verbose){
  // open a list of files (std::vector), parse all nTuple definitions inside
  // for each assigment encountered matching the channelfilter (or with no channel),
  // create an nTuple job for each nTuple and add it to the basecut
  if(filenames.size() < 1){
    ERRORfunc("importing no nTuples from empty files list!");
    return -1;
  }
  std::map<TString,std::vector<TString> > nTupleDefinitions;
  std::vector<TString> assignments;
  TString buffer;
  for(size_t i=0; i<filenames.size(); i++){
    std::vector<TString>* lines = TQStringUtils::readFileLines(filenames[i]);
    if(!lines){
      if(verbose) ERRORfunc("unable to open file '%s'",filenames[i].Data());
      continue;
    }
    for(size_t j=0; j<lines->size(); j++){
      TString line(lines->at(j));
      TQStringUtils::readBlanks(line);
      if(line.IsNull()) continue;
      if(!line.BeginsWith("@")){
        TString name, def;
        if(!TQStringUtils::readUpTo(line,name,":")){
          if(verbose) ERRORfunc("unable to parse nTuple definition '%s'",line.Data());
          continue;
        }
        TQStringUtils::removeLeading(line,": ");
        bool foundSemicolon = false;
        while(!foundSemicolon) {
          TQStringUtils::readUpTo(line,def,";","()[]{}"); //readUpTo leaves the "UpTo" character in the input string. Hence, as long as there is a ; the input string won't be empty
          if(line.Length()>0) {
            foundSemicolon = true;
          } else { //read an additional line for this definition
            ++j; //adjust index
            if (j>=lines->size()) {
              ERRORfunc("Failed to parse nTuple definition for '%s': could not find terminating semicolon!");
              return -1;
            }
            TQStringUtils::removeTrailing(def,"\n");
            line.Append(lines->at(j));
          }
        }
        DEBUGclass("found definition: '%s', assigning as '%s'",def.Data(),name.Data());
        nTupleDefinitions[TQStringUtils::trim(name)] = TQStringUtils::tokenizeVector(def,",",true,"{}()[]","\"\"''"); //this should be a bit safer as it respects more parentheses
        //nTupleDefinitions[TQStringUtils::trim(name)] = TQStringUtils::split(def,",","{","}");
      } else if(TQStringUtils::removeLeading(line,"@") == 1){
        DEBUGclass("found assignment: '%s'",line.Data());
        assignments.push_back(line);
      } else {
        if(verbose) WARNfunc("encountered unknown token: '%s'",line.Data());
      }
    }
    delete lines;
  }

  struct JobInfo {
    TQNTupleDumperAnalysisJob* job;
    TString cuts;
  };
  std::vector<JobInfo> jobs;
  for(size_t i=0; i<assignments.size(); i++){
    TString assignment = assignments[i];
    DEBUGclass("looking at assignment '%s'",assignment.Data());
    TString channel;
    if(TQStringUtils::readBlock(assignment,channel) && !channel.IsNull() && !TQStringUtils::matches(channel,channelFilter)) continue;
    TString cuts,nTuples;
    TQStringUtils::readUpTo(assignment,cuts,":");
    TQStringUtils::readToken(assignment,buffer," :");
    TQStringUtils::readUpTo(assignment,nTuples,";");
    TQStringUtils::readToken(assignment,buffer,"; ");
    DEBUGclass("nTuples: '%s'",nTuples.Data());
    DEBUGclass("cuts: '%s'",cuts.Data());
    DEBUGclass("spare symbols: '%s'",buffer.Data());
    std::vector<TString> vNtups = TQStringUtils::split(nTuples,",");
    if(vNtups.size() < 1){
      if(verbose) ERRORfunc("no nTuples listed in assignment '%s'",assignments[i].Data());
      continue;
    }
    for(size_t j=0; j<vNtups.size(); j++){
      TString ntupbooking(aliases ? aliases->replaceInTextRecursive(vNtups[j]) : vNtups[j]);
      TString ntupname,filename,treename;
      TQStringUtils::removeLeading(ntupbooking," ");
      TQStringUtils::readUpTo(ntupbooking,ntupname," >");
      TQStringUtils::readToken(ntupbooking,buffer," >");
      TQStringUtils::readUpTo(ntupbooking,filename," :");
      TQStringUtils::readToken(ntupbooking,buffer," :");
      TQStringUtils::readUpTo(ntupbooking,treename," ;");
      DEBUGclass("ntup: '%s'",ntupname.Data());
      DEBUGclass("filname: '%s'",filename.Data());
      DEBUGclass("treename: '%s'",treename.Data());
      std::vector<TString> def = nTupleDefinitions[ntupname];
      if(def.empty()){
        if(verbose) ERRORfunc("unable to find nTuple definition for name '%s', skipping",vNtups[j].Data());
        continue;
      }
      bool is_new_job = true;
      TQNTupleDumperAnalysisJob* job = nullptr;
      // check if there is already an existing job with same filename, treename, and cuts
      // if thats the case add the branches to the existing job
      for (JobInfo& job_info : jobs) {
          if (job_info.job->getFileName() == filename && job_info.job->getTreeName() == treename && job_info.cuts == cuts) {
              DEBUGclass("Found existing job with same filename, treename, and cuts");
              job = job_info.job;
              // new name is <old_name>_<this ntupname>
              job->SetName((TString(job->GetName()) + "_" + ntupname).Data());
              is_new_job = false;
              break;
          }
      }
      // no existing job found, create new job
      if (is_new_job) {
        job = new TQNTupleDumperAnalysisJob(ntupname);
        job->setTreeName(treename);
        job->setFileName(filename);
      }

      for(size_t i=0; i<def.size(); i++){
        TString branch(aliases ? aliases->replaceInTextRecursive(def[i]) : def[i]);
        const TString bakbranch(branch);
        DEBUGclass("parsing definition '%s'",branch.Data());
        TQStringUtils::removeLeading(branch," \t");
        TString type_name;
        TQStringUtils::readUpToText(branch,type_name,"<<");
        TQStringUtils::removeLeading(type_name," \t");
        TQStringUtils::removeTrailing(type_name," \t");
        //alternative code ahead in case we need to make the parsing more robust/flexible (untested)
        /*
        //ok, here begins the ugly part: there can be whitespaces in the variable type (e.g. 'unsigned long long') but also in the observable expression, e.g. 'TH2Map:someFile.root:someHist(subObs1, subObs2)'. Hence, we can't easily tell where the type definition ends and where the observable expression starts. => check at each whitespace if substring of type_name up to that point is a valid type.
        TString typeStr = "";
        TQNTupleDumperAnalysisJob::VarType type = TQNTupleDumperAnalysisJob::VarType::UNKNOWN ;
        while( (type == TQNTupleDumperAnalysisJob::VarType::UNKNOWN) && (TQStringUtils::readUpTo(type_name,typeStr," \t") > 0 || TQStringUtils::readToken(type_name,typeStr," \t") > 0) ) { //readUpTo and readToken > 0 implicitly checks for length of type_name being > 0, i.e., protects against infinite loops
          type = getVarType(typeStr); //check if a valid type was read thus far
        }
        TString name = TQStringUtils::trim(type_name);
        */
        int sep = TQStringUtils::findLastOf(type_name,"\t ");
        TString typeStr = TQStringUtils::trim(type_name(0,sep));
        TString name = type_name(sep+1,type_name.Length()-sep-1);
        DEBUGclass("type of the branch '%s'",typeStr.Data());
        DEBUGclass("name of the branch '%s'",name.Data());

        TQStringUtils::removeLeading(branch," <\t");
        if( !typeStr.IsNull() && !name.IsNull() && !branch.IsNull()){
          DEBUGclass("booking variable '%s' (%s) with expression '%s'",name.Data(),typeStr.Data(),branch.Data());
          job->bookVariable(typeStr,name,branch);
        } else {
          TQNTupleDumperAnalysisJob::setErrorMessage(TString::Format("unable to parse variable definition: '%s', expected syntax is 'type name << expression'. The following elements have been extracted from your definition: type = '%s', name = '%s', expression = '%s'",bakbranch.Data(), typeStr.Data(), name.Data(), branch.Data()  ));
        }
      }
      if(job->nVariables() < 1){
        DEBUGclass("error booking nTuple for '%s', function says '%s'",fErrMsg.getMessages().Data());
        delete job;  // jobs with variables are deleted later after they are attached to the basecut
      } else {
        if (is_new_job) {
          jobs.push_back({job, cuts});
        }
      }
    }
  }

  int retval = 0;
  for (JobInfo& job_info : jobs) {
    if(verbose) job_info.job->printBranches();
    basecut->addAnalysisJob(job_info.job, job_info.cuts);
    retval += 1;
    delete job_info.job;
  }

  DEBUGclass("end of function call, found %d ntuple definitions",retval);
  return retval;
}

//__________________________________________________________________________________|___________

TString TQNTupleDumperAnalysisJob::getErrorMessage() {
  // Return the latest error message
  return fErrMsg.getMessages();
}

//__________________________________________________________________________________|___________

void TQNTupleDumperAnalysisJob::setErrorMessage(const TString& message) {
  // update the error message
  fErrMsg.sendClassFunctionMessage(TQMessageStream::INFO,TQNTupleDumperAnalysisJob::Class(),"<anonymous>",message);
}

//__________________________________________________________________________________|___________

TString TQNTupleDumperAnalysisJob::getTreeName() const {
  // get the tree name
  return this->fTreeName;
}
//__________________________________________________________________________________|___________

void TQNTupleDumperAnalysisJob::setTreeName (const TString& treename){
  // set the tree name
  this->fTreeName=treename;
}

//__________________________________________________________________________________|___________

TString TQNTupleDumperAnalysisJob::getFileName() const {
  // get the file name
  return this->fFileName;
}

//__________________________________________________________________________________|___________

void TQNTupleDumperAnalysisJob::setFileName (const TString& filename){
  // set the file name
  this->fFileName = filename;
}

//__________________________________________________________________________________|___________

 TQNTupleDumperAnalysisJob.cxx:1
 TQNTupleDumperAnalysisJob.cxx:2
 TQNTupleDumperAnalysisJob.cxx:3
 TQNTupleDumperAnalysisJob.cxx:4
 TQNTupleDumperAnalysisJob.cxx:5
 TQNTupleDumperAnalysisJob.cxx:6
 TQNTupleDumperAnalysisJob.cxx:7
 TQNTupleDumperAnalysisJob.cxx:8
 TQNTupleDumperAnalysisJob.cxx:9
 TQNTupleDumperAnalysisJob.cxx:10
 TQNTupleDumperAnalysisJob.cxx:11
 TQNTupleDumperAnalysisJob.cxx:12
 TQNTupleDumperAnalysisJob.cxx:13
 TQNTupleDumperAnalysisJob.cxx:14
 TQNTupleDumperAnalysisJob.cxx:15
 TQNTupleDumperAnalysisJob.cxx:16
 TQNTupleDumperAnalysisJob.cxx:17
 TQNTupleDumperAnalysisJob.cxx:18
 TQNTupleDumperAnalysisJob.cxx:19
 TQNTupleDumperAnalysisJob.cxx:20
 TQNTupleDumperAnalysisJob.cxx:21
 TQNTupleDumperAnalysisJob.cxx:22
 TQNTupleDumperAnalysisJob.cxx:23
 TQNTupleDumperAnalysisJob.cxx:24
 TQNTupleDumperAnalysisJob.cxx:25
 TQNTupleDumperAnalysisJob.cxx:26
 TQNTupleDumperAnalysisJob.cxx:27
 TQNTupleDumperAnalysisJob.cxx:28
 TQNTupleDumperAnalysisJob.cxx:29
 TQNTupleDumperAnalysisJob.cxx:30
 TQNTupleDumperAnalysisJob.cxx:31
 TQNTupleDumperAnalysisJob.cxx:32
 TQNTupleDumperAnalysisJob.cxx:33
 TQNTupleDumperAnalysisJob.cxx:34
 TQNTupleDumperAnalysisJob.cxx:35
 TQNTupleDumperAnalysisJob.cxx:36
 TQNTupleDumperAnalysisJob.cxx:37
 TQNTupleDumperAnalysisJob.cxx:38
 TQNTupleDumperAnalysisJob.cxx:39
 TQNTupleDumperAnalysisJob.cxx:40
 TQNTupleDumperAnalysisJob.cxx:41
 TQNTupleDumperAnalysisJob.cxx:42
 TQNTupleDumperAnalysisJob.cxx:43
 TQNTupleDumperAnalysisJob.cxx:44
 TQNTupleDumperAnalysisJob.cxx:45
 TQNTupleDumperAnalysisJob.cxx:46
 TQNTupleDumperAnalysisJob.cxx:47
 TQNTupleDumperAnalysisJob.cxx:48
 TQNTupleDumperAnalysisJob.cxx:49
 TQNTupleDumperAnalysisJob.cxx:50
 TQNTupleDumperAnalysisJob.cxx:51
 TQNTupleDumperAnalysisJob.cxx:52
 TQNTupleDumperAnalysisJob.cxx:53
 TQNTupleDumperAnalysisJob.cxx:54
 TQNTupleDumperAnalysisJob.cxx:55
 TQNTupleDumperAnalysisJob.cxx:56
 TQNTupleDumperAnalysisJob.cxx:57
 TQNTupleDumperAnalysisJob.cxx:58
 TQNTupleDumperAnalysisJob.cxx:59
 TQNTupleDumperAnalysisJob.cxx:60
 TQNTupleDumperAnalysisJob.cxx:61
 TQNTupleDumperAnalysisJob.cxx:62
 TQNTupleDumperAnalysisJob.cxx:63
 TQNTupleDumperAnalysisJob.cxx:64
 TQNTupleDumperAnalysisJob.cxx:65
 TQNTupleDumperAnalysisJob.cxx:66
 TQNTupleDumperAnalysisJob.cxx:67
 TQNTupleDumperAnalysisJob.cxx:68
 TQNTupleDumperAnalysisJob.cxx:69
 TQNTupleDumperAnalysisJob.cxx:70
 TQNTupleDumperAnalysisJob.cxx:71
 TQNTupleDumperAnalysisJob.cxx:72
 TQNTupleDumperAnalysisJob.cxx:73
 TQNTupleDumperAnalysisJob.cxx:74
 TQNTupleDumperAnalysisJob.cxx:75
 TQNTupleDumperAnalysisJob.cxx:76
 TQNTupleDumperAnalysisJob.cxx:77
 TQNTupleDumperAnalysisJob.cxx:78
 TQNTupleDumperAnalysisJob.cxx:79
 TQNTupleDumperAnalysisJob.cxx:80
 TQNTupleDumperAnalysisJob.cxx:81
 TQNTupleDumperAnalysisJob.cxx:82
 TQNTupleDumperAnalysisJob.cxx:83
 TQNTupleDumperAnalysisJob.cxx:84
 TQNTupleDumperAnalysisJob.cxx:85
 TQNTupleDumperAnalysisJob.cxx:86
 TQNTupleDumperAnalysisJob.cxx:87
 TQNTupleDumperAnalysisJob.cxx:88
 TQNTupleDumperAnalysisJob.cxx:89
 TQNTupleDumperAnalysisJob.cxx:90
 TQNTupleDumperAnalysisJob.cxx:91
 TQNTupleDumperAnalysisJob.cxx:92
 TQNTupleDumperAnalysisJob.cxx:93
 TQNTupleDumperAnalysisJob.cxx:94
 TQNTupleDumperAnalysisJob.cxx:95
 TQNTupleDumperAnalysisJob.cxx:96
 TQNTupleDumperAnalysisJob.cxx:97
 TQNTupleDumperAnalysisJob.cxx:98
 TQNTupleDumperAnalysisJob.cxx:99
 TQNTupleDumperAnalysisJob.cxx:100
 TQNTupleDumperAnalysisJob.cxx:101
 TQNTupleDumperAnalysisJob.cxx:102
 TQNTupleDumperAnalysisJob.cxx:103
 TQNTupleDumperAnalysisJob.cxx:104
 TQNTupleDumperAnalysisJob.cxx:105
 TQNTupleDumperAnalysisJob.cxx:106
 TQNTupleDumperAnalysisJob.cxx:107
 TQNTupleDumperAnalysisJob.cxx:108
 TQNTupleDumperAnalysisJob.cxx:109
 TQNTupleDumperAnalysisJob.cxx:110
 TQNTupleDumperAnalysisJob.cxx:111
 TQNTupleDumperAnalysisJob.cxx:112
 TQNTupleDumperAnalysisJob.cxx:113
 TQNTupleDumperAnalysisJob.cxx:114
 TQNTupleDumperAnalysisJob.cxx:115
 TQNTupleDumperAnalysisJob.cxx:116
 TQNTupleDumperAnalysisJob.cxx:117
 TQNTupleDumperAnalysisJob.cxx:118
 TQNTupleDumperAnalysisJob.cxx:119
 TQNTupleDumperAnalysisJob.cxx:120
 TQNTupleDumperAnalysisJob.cxx:121
 TQNTupleDumperAnalysisJob.cxx:122
 TQNTupleDumperAnalysisJob.cxx:123
 TQNTupleDumperAnalysisJob.cxx:124
 TQNTupleDumperAnalysisJob.cxx:125
 TQNTupleDumperAnalysisJob.cxx:126
 TQNTupleDumperAnalysisJob.cxx:127
 TQNTupleDumperAnalysisJob.cxx:128
 TQNTupleDumperAnalysisJob.cxx:129
 TQNTupleDumperAnalysisJob.cxx:130
 TQNTupleDumperAnalysisJob.cxx:131
 TQNTupleDumperAnalysisJob.cxx:132
 TQNTupleDumperAnalysisJob.cxx:133
 TQNTupleDumperAnalysisJob.cxx:134
 TQNTupleDumperAnalysisJob.cxx:135
 TQNTupleDumperAnalysisJob.cxx:136
 TQNTupleDumperAnalysisJob.cxx:137
 TQNTupleDumperAnalysisJob.cxx:138
 TQNTupleDumperAnalysisJob.cxx:139
 TQNTupleDumperAnalysisJob.cxx:140
 TQNTupleDumperAnalysisJob.cxx:141
 TQNTupleDumperAnalysisJob.cxx:142
 TQNTupleDumperAnalysisJob.cxx:143
 TQNTupleDumperAnalysisJob.cxx:144
 TQNTupleDumperAnalysisJob.cxx:145
 TQNTupleDumperAnalysisJob.cxx:146
 TQNTupleDumperAnalysisJob.cxx:147
 TQNTupleDumperAnalysisJob.cxx:148
 TQNTupleDumperAnalysisJob.cxx:149
 TQNTupleDumperAnalysisJob.cxx:150
 TQNTupleDumperAnalysisJob.cxx:151
 TQNTupleDumperAnalysisJob.cxx:152
 TQNTupleDumperAnalysisJob.cxx:153
 TQNTupleDumperAnalysisJob.cxx:154
 TQNTupleDumperAnalysisJob.cxx:155
 TQNTupleDumperAnalysisJob.cxx:156
 TQNTupleDumperAnalysisJob.cxx:157
 TQNTupleDumperAnalysisJob.cxx:158
 TQNTupleDumperAnalysisJob.cxx:159
 TQNTupleDumperAnalysisJob.cxx:160
 TQNTupleDumperAnalysisJob.cxx:161
 TQNTupleDumperAnalysisJob.cxx:162
 TQNTupleDumperAnalysisJob.cxx:163
 TQNTupleDumperAnalysisJob.cxx:164
 TQNTupleDumperAnalysisJob.cxx:165
 TQNTupleDumperAnalysisJob.cxx:166
 TQNTupleDumperAnalysisJob.cxx:167
 TQNTupleDumperAnalysisJob.cxx:168
 TQNTupleDumperAnalysisJob.cxx:169
 TQNTupleDumperAnalysisJob.cxx:170
 TQNTupleDumperAnalysisJob.cxx:171
 TQNTupleDumperAnalysisJob.cxx:172
 TQNTupleDumperAnalysisJob.cxx:173
 TQNTupleDumperAnalysisJob.cxx:174
 TQNTupleDumperAnalysisJob.cxx:175
 TQNTupleDumperAnalysisJob.cxx:176
 TQNTupleDumperAnalysisJob.cxx:177
 TQNTupleDumperAnalysisJob.cxx:178
 TQNTupleDumperAnalysisJob.cxx:179
 TQNTupleDumperAnalysisJob.cxx:180
 TQNTupleDumperAnalysisJob.cxx:181
 TQNTupleDumperAnalysisJob.cxx:182
 TQNTupleDumperAnalysisJob.cxx:183
 TQNTupleDumperAnalysisJob.cxx:184
 TQNTupleDumperAnalysisJob.cxx:185
 TQNTupleDumperAnalysisJob.cxx:186
 TQNTupleDumperAnalysisJob.cxx:187
 TQNTupleDumperAnalysisJob.cxx:188
 TQNTupleDumperAnalysisJob.cxx:189
 TQNTupleDumperAnalysisJob.cxx:190
 TQNTupleDumperAnalysisJob.cxx:191
 TQNTupleDumperAnalysisJob.cxx:192
 TQNTupleDumperAnalysisJob.cxx:193
 TQNTupleDumperAnalysisJob.cxx:194
 TQNTupleDumperAnalysisJob.cxx:195
 TQNTupleDumperAnalysisJob.cxx:196
 TQNTupleDumperAnalysisJob.cxx:197
 TQNTupleDumperAnalysisJob.cxx:198
 TQNTupleDumperAnalysisJob.cxx:199
 TQNTupleDumperAnalysisJob.cxx:200
 TQNTupleDumperAnalysisJob.cxx:201
 TQNTupleDumperAnalysisJob.cxx:202
 TQNTupleDumperAnalysisJob.cxx:203
 TQNTupleDumperAnalysisJob.cxx:204
 TQNTupleDumperAnalysisJob.cxx:205
 TQNTupleDumperAnalysisJob.cxx:206
 TQNTupleDumperAnalysisJob.cxx:207
 TQNTupleDumperAnalysisJob.cxx:208
 TQNTupleDumperAnalysisJob.cxx:209
 TQNTupleDumperAnalysisJob.cxx:210
 TQNTupleDumperAnalysisJob.cxx:211
 TQNTupleDumperAnalysisJob.cxx:212
 TQNTupleDumperAnalysisJob.cxx:213
 TQNTupleDumperAnalysisJob.cxx:214
 TQNTupleDumperAnalysisJob.cxx:215
 TQNTupleDumperAnalysisJob.cxx:216
 TQNTupleDumperAnalysisJob.cxx:217
 TQNTupleDumperAnalysisJob.cxx:218
 TQNTupleDumperAnalysisJob.cxx:219
 TQNTupleDumperAnalysisJob.cxx:220
 TQNTupleDumperAnalysisJob.cxx:221
 TQNTupleDumperAnalysisJob.cxx:222
 TQNTupleDumperAnalysisJob.cxx:223
 TQNTupleDumperAnalysisJob.cxx:224
 TQNTupleDumperAnalysisJob.cxx:225
 TQNTupleDumperAnalysisJob.cxx:226
 TQNTupleDumperAnalysisJob.cxx:227
 TQNTupleDumperAnalysisJob.cxx:228
 TQNTupleDumperAnalysisJob.cxx:229
 TQNTupleDumperAnalysisJob.cxx:230
 TQNTupleDumperAnalysisJob.cxx:231
 TQNTupleDumperAnalysisJob.cxx:232
 TQNTupleDumperAnalysisJob.cxx:233
 TQNTupleDumperAnalysisJob.cxx:234
 TQNTupleDumperAnalysisJob.cxx:235
 TQNTupleDumperAnalysisJob.cxx:236
 TQNTupleDumperAnalysisJob.cxx:237
 TQNTupleDumperAnalysisJob.cxx:238
 TQNTupleDumperAnalysisJob.cxx:239
 TQNTupleDumperAnalysisJob.cxx:240
 TQNTupleDumperAnalysisJob.cxx:241
 TQNTupleDumperAnalysisJob.cxx:242
 TQNTupleDumperAnalysisJob.cxx:243
 TQNTupleDumperAnalysisJob.cxx:244
 TQNTupleDumperAnalysisJob.cxx:245
 TQNTupleDumperAnalysisJob.cxx:246
 TQNTupleDumperAnalysisJob.cxx:247
 TQNTupleDumperAnalysisJob.cxx:248
 TQNTupleDumperAnalysisJob.cxx:249
 TQNTupleDumperAnalysisJob.cxx:250
 TQNTupleDumperAnalysisJob.cxx:251
 TQNTupleDumperAnalysisJob.cxx:252
 TQNTupleDumperAnalysisJob.cxx:253
 TQNTupleDumperAnalysisJob.cxx:254
 TQNTupleDumperAnalysisJob.cxx:255
 TQNTupleDumperAnalysisJob.cxx:256
 TQNTupleDumperAnalysisJob.cxx:257
 TQNTupleDumperAnalysisJob.cxx:258
 TQNTupleDumperAnalysisJob.cxx:259
 TQNTupleDumperAnalysisJob.cxx:260
 TQNTupleDumperAnalysisJob.cxx:261
 TQNTupleDumperAnalysisJob.cxx:262
 TQNTupleDumperAnalysisJob.cxx:263
 TQNTupleDumperAnalysisJob.cxx:264
 TQNTupleDumperAnalysisJob.cxx:265
 TQNTupleDumperAnalysisJob.cxx:266
 TQNTupleDumperAnalysisJob.cxx:267
 TQNTupleDumperAnalysisJob.cxx:268
 TQNTupleDumperAnalysisJob.cxx:269
 TQNTupleDumperAnalysisJob.cxx:270
 TQNTupleDumperAnalysisJob.cxx:271
 TQNTupleDumperAnalysisJob.cxx:272
 TQNTupleDumperAnalysisJob.cxx:273
 TQNTupleDumperAnalysisJob.cxx:274
 TQNTupleDumperAnalysisJob.cxx:275
 TQNTupleDumperAnalysisJob.cxx:276
 TQNTupleDumperAnalysisJob.cxx:277
 TQNTupleDumperAnalysisJob.cxx:278
 TQNTupleDumperAnalysisJob.cxx:279
 TQNTupleDumperAnalysisJob.cxx:280
 TQNTupleDumperAnalysisJob.cxx:281
 TQNTupleDumperAnalysisJob.cxx:282
 TQNTupleDumperAnalysisJob.cxx:283
 TQNTupleDumperAnalysisJob.cxx:284
 TQNTupleDumperAnalysisJob.cxx:285
 TQNTupleDumperAnalysisJob.cxx:286
 TQNTupleDumperAnalysisJob.cxx:287
 TQNTupleDumperAnalysisJob.cxx:288
 TQNTupleDumperAnalysisJob.cxx:289
 TQNTupleDumperAnalysisJob.cxx:290
 TQNTupleDumperAnalysisJob.cxx:291
 TQNTupleDumperAnalysisJob.cxx:292
 TQNTupleDumperAnalysisJob.cxx:293
 TQNTupleDumperAnalysisJob.cxx:294
 TQNTupleDumperAnalysisJob.cxx:295
 TQNTupleDumperAnalysisJob.cxx:296
 TQNTupleDumperAnalysisJob.cxx:297
 TQNTupleDumperAnalysisJob.cxx:298
 TQNTupleDumperAnalysisJob.cxx:299
 TQNTupleDumperAnalysisJob.cxx:300
 TQNTupleDumperAnalysisJob.cxx:301
 TQNTupleDumperAnalysisJob.cxx:302
 TQNTupleDumperAnalysisJob.cxx:303
 TQNTupleDumperAnalysisJob.cxx:304
 TQNTupleDumperAnalysisJob.cxx:305
 TQNTupleDumperAnalysisJob.cxx:306
 TQNTupleDumperAnalysisJob.cxx:307
 TQNTupleDumperAnalysisJob.cxx:308
 TQNTupleDumperAnalysisJob.cxx:309
 TQNTupleDumperAnalysisJob.cxx:310
 TQNTupleDumperAnalysisJob.cxx:311
 TQNTupleDumperAnalysisJob.cxx:312
 TQNTupleDumperAnalysisJob.cxx:313
 TQNTupleDumperAnalysisJob.cxx:314
 TQNTupleDumperAnalysisJob.cxx:315
 TQNTupleDumperAnalysisJob.cxx:316
 TQNTupleDumperAnalysisJob.cxx:317
 TQNTupleDumperAnalysisJob.cxx:318
 TQNTupleDumperAnalysisJob.cxx:319
 TQNTupleDumperAnalysisJob.cxx:320
 TQNTupleDumperAnalysisJob.cxx:321
 TQNTupleDumperAnalysisJob.cxx:322
 TQNTupleDumperAnalysisJob.cxx:323
 TQNTupleDumperAnalysisJob.cxx:324
 TQNTupleDumperAnalysisJob.cxx:325
 TQNTupleDumperAnalysisJob.cxx:326
 TQNTupleDumperAnalysisJob.cxx:327
 TQNTupleDumperAnalysisJob.cxx:328
 TQNTupleDumperAnalysisJob.cxx:329
 TQNTupleDumperAnalysisJob.cxx:330
 TQNTupleDumperAnalysisJob.cxx:331
 TQNTupleDumperAnalysisJob.cxx:332
 TQNTupleDumperAnalysisJob.cxx:333
 TQNTupleDumperAnalysisJob.cxx:334
 TQNTupleDumperAnalysisJob.cxx:335
 TQNTupleDumperAnalysisJob.cxx:336
 TQNTupleDumperAnalysisJob.cxx:337
 TQNTupleDumperAnalysisJob.cxx:338
 TQNTupleDumperAnalysisJob.cxx:339
 TQNTupleDumperAnalysisJob.cxx:340
 TQNTupleDumperAnalysisJob.cxx:341
 TQNTupleDumperAnalysisJob.cxx:342
 TQNTupleDumperAnalysisJob.cxx:343
 TQNTupleDumperAnalysisJob.cxx:344
 TQNTupleDumperAnalysisJob.cxx:345
 TQNTupleDumperAnalysisJob.cxx:346
 TQNTupleDumperAnalysisJob.cxx:347
 TQNTupleDumperAnalysisJob.cxx:348
 TQNTupleDumperAnalysisJob.cxx:349
 TQNTupleDumperAnalysisJob.cxx:350
 TQNTupleDumperAnalysisJob.cxx:351
 TQNTupleDumperAnalysisJob.cxx:352
 TQNTupleDumperAnalysisJob.cxx:353
 TQNTupleDumperAnalysisJob.cxx:354
 TQNTupleDumperAnalysisJob.cxx:355
 TQNTupleDumperAnalysisJob.cxx:356
 TQNTupleDumperAnalysisJob.cxx:357
 TQNTupleDumperAnalysisJob.cxx:358
 TQNTupleDumperAnalysisJob.cxx:359
 TQNTupleDumperAnalysisJob.cxx:360
 TQNTupleDumperAnalysisJob.cxx:361
 TQNTupleDumperAnalysisJob.cxx:362
 TQNTupleDumperAnalysisJob.cxx:363
 TQNTupleDumperAnalysisJob.cxx:364
 TQNTupleDumperAnalysisJob.cxx:365
 TQNTupleDumperAnalysisJob.cxx:366
 TQNTupleDumperAnalysisJob.cxx:367
 TQNTupleDumperAnalysisJob.cxx:368
 TQNTupleDumperAnalysisJob.cxx:369
 TQNTupleDumperAnalysisJob.cxx:370
 TQNTupleDumperAnalysisJob.cxx:371
 TQNTupleDumperAnalysisJob.cxx:372
 TQNTupleDumperAnalysisJob.cxx:373
 TQNTupleDumperAnalysisJob.cxx:374
 TQNTupleDumperAnalysisJob.cxx:375
 TQNTupleDumperAnalysisJob.cxx:376
 TQNTupleDumperAnalysisJob.cxx:377
 TQNTupleDumperAnalysisJob.cxx:378
 TQNTupleDumperAnalysisJob.cxx:379
 TQNTupleDumperAnalysisJob.cxx:380
 TQNTupleDumperAnalysisJob.cxx:381
 TQNTupleDumperAnalysisJob.cxx:382
 TQNTupleDumperAnalysisJob.cxx:383
 TQNTupleDumperAnalysisJob.cxx:384
 TQNTupleDumperAnalysisJob.cxx:385
 TQNTupleDumperAnalysisJob.cxx:386
 TQNTupleDumperAnalysisJob.cxx:387
 TQNTupleDumperAnalysisJob.cxx:388
 TQNTupleDumperAnalysisJob.cxx:389
 TQNTupleDumperAnalysisJob.cxx:390
 TQNTupleDumperAnalysisJob.cxx:391
 TQNTupleDumperAnalysisJob.cxx:392
 TQNTupleDumperAnalysisJob.cxx:393
 TQNTupleDumperAnalysisJob.cxx:394
 TQNTupleDumperAnalysisJob.cxx:395
 TQNTupleDumperAnalysisJob.cxx:396
 TQNTupleDumperAnalysisJob.cxx:397
 TQNTupleDumperAnalysisJob.cxx:398
 TQNTupleDumperAnalysisJob.cxx:399
 TQNTupleDumperAnalysisJob.cxx:400
 TQNTupleDumperAnalysisJob.cxx:401
 TQNTupleDumperAnalysisJob.cxx:402
 TQNTupleDumperAnalysisJob.cxx:403
 TQNTupleDumperAnalysisJob.cxx:404
 TQNTupleDumperAnalysisJob.cxx:405
 TQNTupleDumperAnalysisJob.cxx:406
 TQNTupleDumperAnalysisJob.cxx:407
 TQNTupleDumperAnalysisJob.cxx:408
 TQNTupleDumperAnalysisJob.cxx:409
 TQNTupleDumperAnalysisJob.cxx:410
 TQNTupleDumperAnalysisJob.cxx:411
 TQNTupleDumperAnalysisJob.cxx:412
 TQNTupleDumperAnalysisJob.cxx:413
 TQNTupleDumperAnalysisJob.cxx:414
 TQNTupleDumperAnalysisJob.cxx:415
 TQNTupleDumperAnalysisJob.cxx:416
 TQNTupleDumperAnalysisJob.cxx:417
 TQNTupleDumperAnalysisJob.cxx:418
 TQNTupleDumperAnalysisJob.cxx:419
 TQNTupleDumperAnalysisJob.cxx:420
 TQNTupleDumperAnalysisJob.cxx:421
 TQNTupleDumperAnalysisJob.cxx:422
 TQNTupleDumperAnalysisJob.cxx:423
 TQNTupleDumperAnalysisJob.cxx:424
 TQNTupleDumperAnalysisJob.cxx:425
 TQNTupleDumperAnalysisJob.cxx:426
 TQNTupleDumperAnalysisJob.cxx:427
 TQNTupleDumperAnalysisJob.cxx:428
 TQNTupleDumperAnalysisJob.cxx:429
 TQNTupleDumperAnalysisJob.cxx:430
 TQNTupleDumperAnalysisJob.cxx:431
 TQNTupleDumperAnalysisJob.cxx:432
 TQNTupleDumperAnalysisJob.cxx:433
 TQNTupleDumperAnalysisJob.cxx:434
 TQNTupleDumperAnalysisJob.cxx:435
 TQNTupleDumperAnalysisJob.cxx:436
 TQNTupleDumperAnalysisJob.cxx:437
 TQNTupleDumperAnalysisJob.cxx:438
 TQNTupleDumperAnalysisJob.cxx:439
 TQNTupleDumperAnalysisJob.cxx:440
 TQNTupleDumperAnalysisJob.cxx:441
 TQNTupleDumperAnalysisJob.cxx:442
 TQNTupleDumperAnalysisJob.cxx:443
 TQNTupleDumperAnalysisJob.cxx:444
 TQNTupleDumperAnalysisJob.cxx:445
 TQNTupleDumperAnalysisJob.cxx:446
 TQNTupleDumperAnalysisJob.cxx:447
 TQNTupleDumperAnalysisJob.cxx:448
 TQNTupleDumperAnalysisJob.cxx:449
 TQNTupleDumperAnalysisJob.cxx:450
 TQNTupleDumperAnalysisJob.cxx:451
 TQNTupleDumperAnalysisJob.cxx:452
 TQNTupleDumperAnalysisJob.cxx:453
 TQNTupleDumperAnalysisJob.cxx:454
 TQNTupleDumperAnalysisJob.cxx:455
 TQNTupleDumperAnalysisJob.cxx:456
 TQNTupleDumperAnalysisJob.cxx:457
 TQNTupleDumperAnalysisJob.cxx:458
 TQNTupleDumperAnalysisJob.cxx:459
 TQNTupleDumperAnalysisJob.cxx:460
 TQNTupleDumperAnalysisJob.cxx:461
 TQNTupleDumperAnalysisJob.cxx:462
 TQNTupleDumperAnalysisJob.cxx:463
 TQNTupleDumperAnalysisJob.cxx:464
 TQNTupleDumperAnalysisJob.cxx:465
 TQNTupleDumperAnalysisJob.cxx:466
 TQNTupleDumperAnalysisJob.cxx:467
 TQNTupleDumperAnalysisJob.cxx:468
 TQNTupleDumperAnalysisJob.cxx:469
 TQNTupleDumperAnalysisJob.cxx:470
 TQNTupleDumperAnalysisJob.cxx:471
 TQNTupleDumperAnalysisJob.cxx:472
 TQNTupleDumperAnalysisJob.cxx:473
 TQNTupleDumperAnalysisJob.cxx:474
 TQNTupleDumperAnalysisJob.cxx:475
 TQNTupleDumperAnalysisJob.cxx:476
 TQNTupleDumperAnalysisJob.cxx:477
 TQNTupleDumperAnalysisJob.cxx:478
 TQNTupleDumperAnalysisJob.cxx:479
 TQNTupleDumperAnalysisJob.cxx:480
 TQNTupleDumperAnalysisJob.cxx:481
 TQNTupleDumperAnalysisJob.cxx:482
 TQNTupleDumperAnalysisJob.cxx:483
 TQNTupleDumperAnalysisJob.cxx:484
 TQNTupleDumperAnalysisJob.cxx:485
 TQNTupleDumperAnalysisJob.cxx:486
 TQNTupleDumperAnalysisJob.cxx:487
 TQNTupleDumperAnalysisJob.cxx:488
 TQNTupleDumperAnalysisJob.cxx:489
 TQNTupleDumperAnalysisJob.cxx:490
 TQNTupleDumperAnalysisJob.cxx:491
 TQNTupleDumperAnalysisJob.cxx:492
 TQNTupleDumperAnalysisJob.cxx:493
 TQNTupleDumperAnalysisJob.cxx:494
 TQNTupleDumperAnalysisJob.cxx:495
 TQNTupleDumperAnalysisJob.cxx:496
 TQNTupleDumperAnalysisJob.cxx:497
 TQNTupleDumperAnalysisJob.cxx:498
 TQNTupleDumperAnalysisJob.cxx:499
 TQNTupleDumperAnalysisJob.cxx:500
 TQNTupleDumperAnalysisJob.cxx:501
 TQNTupleDumperAnalysisJob.cxx:502
 TQNTupleDumperAnalysisJob.cxx:503
 TQNTupleDumperAnalysisJob.cxx:504
 TQNTupleDumperAnalysisJob.cxx:505
 TQNTupleDumperAnalysisJob.cxx:506
 TQNTupleDumperAnalysisJob.cxx:507
 TQNTupleDumperAnalysisJob.cxx:508
 TQNTupleDumperAnalysisJob.cxx:509
 TQNTupleDumperAnalysisJob.cxx:510
 TQNTupleDumperAnalysisJob.cxx:511
 TQNTupleDumperAnalysisJob.cxx:512
 TQNTupleDumperAnalysisJob.cxx:513
 TQNTupleDumperAnalysisJob.cxx:514
 TQNTupleDumperAnalysisJob.cxx:515
 TQNTupleDumperAnalysisJob.cxx:516
 TQNTupleDumperAnalysisJob.cxx:517
 TQNTupleDumperAnalysisJob.cxx:518
 TQNTupleDumperAnalysisJob.cxx:519
 TQNTupleDumperAnalysisJob.cxx:520
 TQNTupleDumperAnalysisJob.cxx:521
 TQNTupleDumperAnalysisJob.cxx:522
 TQNTupleDumperAnalysisJob.cxx:523
 TQNTupleDumperAnalysisJob.cxx:524
 TQNTupleDumperAnalysisJob.cxx:525
 TQNTupleDumperAnalysisJob.cxx:526
 TQNTupleDumperAnalysisJob.cxx:527
 TQNTupleDumperAnalysisJob.cxx:528
 TQNTupleDumperAnalysisJob.cxx:529
 TQNTupleDumperAnalysisJob.cxx:530
 TQNTupleDumperAnalysisJob.cxx:531
 TQNTupleDumperAnalysisJob.cxx:532
 TQNTupleDumperAnalysisJob.cxx:533
 TQNTupleDumperAnalysisJob.cxx:534
 TQNTupleDumperAnalysisJob.cxx:535
 TQNTupleDumperAnalysisJob.cxx:536
 TQNTupleDumperAnalysisJob.cxx:537
 TQNTupleDumperAnalysisJob.cxx:538
 TQNTupleDumperAnalysisJob.cxx:539
 TQNTupleDumperAnalysisJob.cxx:540
 TQNTupleDumperAnalysisJob.cxx:541
 TQNTupleDumperAnalysisJob.cxx:542
 TQNTupleDumperAnalysisJob.cxx:543
 TQNTupleDumperAnalysisJob.cxx:544
 TQNTupleDumperAnalysisJob.cxx:545
 TQNTupleDumperAnalysisJob.cxx:546
 TQNTupleDumperAnalysisJob.cxx:547
 TQNTupleDumperAnalysisJob.cxx:548
 TQNTupleDumperAnalysisJob.cxx:549
 TQNTupleDumperAnalysisJob.cxx:550
 TQNTupleDumperAnalysisJob.cxx:551
 TQNTupleDumperAnalysisJob.cxx:552
 TQNTupleDumperAnalysisJob.cxx:553
 TQNTupleDumperAnalysisJob.cxx:554
 TQNTupleDumperAnalysisJob.cxx:555
 TQNTupleDumperAnalysisJob.cxx:556
 TQNTupleDumperAnalysisJob.cxx:557
 TQNTupleDumperAnalysisJob.cxx:558
 TQNTupleDumperAnalysisJob.cxx:559
 TQNTupleDumperAnalysisJob.cxx:560
 TQNTupleDumperAnalysisJob.cxx:561
 TQNTupleDumperAnalysisJob.cxx:562
 TQNTupleDumperAnalysisJob.cxx:563
 TQNTupleDumperAnalysisJob.cxx:564
 TQNTupleDumperAnalysisJob.cxx:565
 TQNTupleDumperAnalysisJob.cxx:566
 TQNTupleDumperAnalysisJob.cxx:567
 TQNTupleDumperAnalysisJob.cxx:568
 TQNTupleDumperAnalysisJob.cxx:569
 TQNTupleDumperAnalysisJob.cxx:570
 TQNTupleDumperAnalysisJob.cxx:571
 TQNTupleDumperAnalysisJob.cxx:572
 TQNTupleDumperAnalysisJob.cxx:573
 TQNTupleDumperAnalysisJob.cxx:574
 TQNTupleDumperAnalysisJob.cxx:575
 TQNTupleDumperAnalysisJob.cxx:576
 TQNTupleDumperAnalysisJob.cxx:577
 TQNTupleDumperAnalysisJob.cxx:578
 TQNTupleDumperAnalysisJob.cxx:579
 TQNTupleDumperAnalysisJob.cxx:580
 TQNTupleDumperAnalysisJob.cxx:581
 TQNTupleDumperAnalysisJob.cxx:582
 TQNTupleDumperAnalysisJob.cxx:583
 TQNTupleDumperAnalysisJob.cxx:584
 TQNTupleDumperAnalysisJob.cxx:585
 TQNTupleDumperAnalysisJob.cxx:586
 TQNTupleDumperAnalysisJob.cxx:587
 TQNTupleDumperAnalysisJob.cxx:588
 TQNTupleDumperAnalysisJob.cxx:589
 TQNTupleDumperAnalysisJob.cxx:590
 TQNTupleDumperAnalysisJob.cxx:591
 TQNTupleDumperAnalysisJob.cxx:592
 TQNTupleDumperAnalysisJob.cxx:593
 TQNTupleDumperAnalysisJob.cxx:594
 TQNTupleDumperAnalysisJob.cxx:595
 TQNTupleDumperAnalysisJob.cxx:596
 TQNTupleDumperAnalysisJob.cxx:597
 TQNTupleDumperAnalysisJob.cxx:598
 TQNTupleDumperAnalysisJob.cxx:599
 TQNTupleDumperAnalysisJob.cxx:600
 TQNTupleDumperAnalysisJob.cxx:601
 TQNTupleDumperAnalysisJob.cxx:602
 TQNTupleDumperAnalysisJob.cxx:603
 TQNTupleDumperAnalysisJob.cxx:604
 TQNTupleDumperAnalysisJob.cxx:605
 TQNTupleDumperAnalysisJob.cxx:606
 TQNTupleDumperAnalysisJob.cxx:607
 TQNTupleDumperAnalysisJob.cxx:608
 TQNTupleDumperAnalysisJob.cxx:609
 TQNTupleDumperAnalysisJob.cxx:610
 TQNTupleDumperAnalysisJob.cxx:611
 TQNTupleDumperAnalysisJob.cxx:612
 TQNTupleDumperAnalysisJob.cxx:613
 TQNTupleDumperAnalysisJob.cxx:614
 TQNTupleDumperAnalysisJob.cxx:615
 TQNTupleDumperAnalysisJob.cxx:616
 TQNTupleDumperAnalysisJob.cxx:617
 TQNTupleDumperAnalysisJob.cxx:618
 TQNTupleDumperAnalysisJob.cxx:619
 TQNTupleDumperAnalysisJob.cxx:620
 TQNTupleDumperAnalysisJob.cxx:621
 TQNTupleDumperAnalysisJob.cxx:622
 TQNTupleDumperAnalysisJob.cxx:623
 TQNTupleDumperAnalysisJob.cxx:624
 TQNTupleDumperAnalysisJob.cxx:625
 TQNTupleDumperAnalysisJob.cxx:626
 TQNTupleDumperAnalysisJob.cxx:627
 TQNTupleDumperAnalysisJob.cxx:628
 TQNTupleDumperAnalysisJob.cxx:629
 TQNTupleDumperAnalysisJob.cxx:630
 TQNTupleDumperAnalysisJob.cxx:631
 TQNTupleDumperAnalysisJob.cxx:632
 TQNTupleDumperAnalysisJob.cxx:633
 TQNTupleDumperAnalysisJob.cxx:634
 TQNTupleDumperAnalysisJob.cxx:635
 TQNTupleDumperAnalysisJob.cxx:636
 TQNTupleDumperAnalysisJob.cxx:637
 TQNTupleDumperAnalysisJob.cxx:638
 TQNTupleDumperAnalysisJob.cxx:639
 TQNTupleDumperAnalysisJob.cxx:640
 TQNTupleDumperAnalysisJob.cxx:641
 TQNTupleDumperAnalysisJob.cxx:642
 TQNTupleDumperAnalysisJob.cxx:643
 TQNTupleDumperAnalysisJob.cxx:644
 TQNTupleDumperAnalysisJob.cxx:645
 TQNTupleDumperAnalysisJob.cxx:646
 TQNTupleDumperAnalysisJob.cxx:647
 TQNTupleDumperAnalysisJob.cxx:648
 TQNTupleDumperAnalysisJob.cxx:649
 TQNTupleDumperAnalysisJob.cxx:650
 TQNTupleDumperAnalysisJob.cxx:651
 TQNTupleDumperAnalysisJob.cxx:652
 TQNTupleDumperAnalysisJob.cxx:653
 TQNTupleDumperAnalysisJob.cxx:654
 TQNTupleDumperAnalysisJob.cxx:655
 TQNTupleDumperAnalysisJob.cxx:656
 TQNTupleDumperAnalysisJob.cxx:657
 TQNTupleDumperAnalysisJob.cxx:658
 TQNTupleDumperAnalysisJob.cxx:659
 TQNTupleDumperAnalysisJob.cxx:660
 TQNTupleDumperAnalysisJob.cxx:661
 TQNTupleDumperAnalysisJob.cxx:662
 TQNTupleDumperAnalysisJob.cxx:663
 TQNTupleDumperAnalysisJob.cxx:664
 TQNTupleDumperAnalysisJob.cxx:665
 TQNTupleDumperAnalysisJob.cxx:666
 TQNTupleDumperAnalysisJob.cxx:667
 TQNTupleDumperAnalysisJob.cxx:668
 TQNTupleDumperAnalysisJob.cxx:669
 TQNTupleDumperAnalysisJob.cxx:670
 TQNTupleDumperAnalysisJob.cxx:671
 TQNTupleDumperAnalysisJob.cxx:672
 TQNTupleDumperAnalysisJob.cxx:673
 TQNTupleDumperAnalysisJob.cxx:674
 TQNTupleDumperAnalysisJob.cxx:675
 TQNTupleDumperAnalysisJob.cxx:676
 TQNTupleDumperAnalysisJob.cxx:677
 TQNTupleDumperAnalysisJob.cxx:678
 TQNTupleDumperAnalysisJob.cxx:679
 TQNTupleDumperAnalysisJob.cxx:680
 TQNTupleDumperAnalysisJob.cxx:681
 TQNTupleDumperAnalysisJob.cxx:682
 TQNTupleDumperAnalysisJob.cxx:683
 TQNTupleDumperAnalysisJob.cxx:684
 TQNTupleDumperAnalysisJob.cxx:685
 TQNTupleDumperAnalysisJob.cxx:686
 TQNTupleDumperAnalysisJob.cxx:687
 TQNTupleDumperAnalysisJob.cxx:688
 TQNTupleDumperAnalysisJob.cxx:689
 TQNTupleDumperAnalysisJob.cxx:690
 TQNTupleDumperAnalysisJob.cxx:691
 TQNTupleDumperAnalysisJob.cxx:692
 TQNTupleDumperAnalysisJob.cxx:693
 TQNTupleDumperAnalysisJob.cxx:694
 TQNTupleDumperAnalysisJob.cxx:695
 TQNTupleDumperAnalysisJob.cxx:696
 TQNTupleDumperAnalysisJob.cxx:697
 TQNTupleDumperAnalysisJob.cxx:698
 TQNTupleDumperAnalysisJob.cxx:699
 TQNTupleDumperAnalysisJob.cxx:700
 TQNTupleDumperAnalysisJob.cxx:701
 TQNTupleDumperAnalysisJob.cxx:702
 TQNTupleDumperAnalysisJob.cxx:703
 TQNTupleDumperAnalysisJob.cxx:704
 TQNTupleDumperAnalysisJob.cxx:705
 TQNTupleDumperAnalysisJob.cxx:706
 TQNTupleDumperAnalysisJob.cxx:707
 TQNTupleDumperAnalysisJob.cxx:708
 TQNTupleDumperAnalysisJob.cxx:709
 TQNTupleDumperAnalysisJob.cxx:710
 TQNTupleDumperAnalysisJob.cxx:711
 TQNTupleDumperAnalysisJob.cxx:712
 TQNTupleDumperAnalysisJob.cxx:713
 TQNTupleDumperAnalysisJob.cxx:714
 TQNTupleDumperAnalysisJob.cxx:715
 TQNTupleDumperAnalysisJob.cxx:716
 TQNTupleDumperAnalysisJob.cxx:717
 TQNTupleDumperAnalysisJob.cxx:718
 TQNTupleDumperAnalysisJob.cxx:719
 TQNTupleDumperAnalysisJob.cxx:720
 TQNTupleDumperAnalysisJob.cxx:721
 TQNTupleDumperAnalysisJob.cxx:722
 TQNTupleDumperAnalysisJob.cxx:723
 TQNTupleDumperAnalysisJob.cxx:724
 TQNTupleDumperAnalysisJob.cxx:725
 TQNTupleDumperAnalysisJob.cxx:726
 TQNTupleDumperAnalysisJob.cxx:727
 TQNTupleDumperAnalysisJob.cxx:728
 TQNTupleDumperAnalysisJob.cxx:729
 TQNTupleDumperAnalysisJob.cxx:730
 TQNTupleDumperAnalysisJob.cxx:731
 TQNTupleDumperAnalysisJob.cxx:732
 TQNTupleDumperAnalysisJob.cxx:733
 TQNTupleDumperAnalysisJob.cxx:734
 TQNTupleDumperAnalysisJob.cxx:735
 TQNTupleDumperAnalysisJob.cxx:736
 TQNTupleDumperAnalysisJob.cxx:737
 TQNTupleDumperAnalysisJob.cxx:738
 TQNTupleDumperAnalysisJob.cxx:739
 TQNTupleDumperAnalysisJob.cxx:740
 TQNTupleDumperAnalysisJob.cxx:741
 TQNTupleDumperAnalysisJob.cxx:742
 TQNTupleDumperAnalysisJob.cxx:743
 TQNTupleDumperAnalysisJob.cxx:744
 TQNTupleDumperAnalysisJob.cxx:745
 TQNTupleDumperAnalysisJob.cxx:746
 TQNTupleDumperAnalysisJob.cxx:747
 TQNTupleDumperAnalysisJob.cxx:748
 TQNTupleDumperAnalysisJob.cxx:749
 TQNTupleDumperAnalysisJob.cxx:750
 TQNTupleDumperAnalysisJob.cxx:751
 TQNTupleDumperAnalysisJob.cxx:752
 TQNTupleDumperAnalysisJob.cxx:753
 TQNTupleDumperAnalysisJob.cxx:754
 TQNTupleDumperAnalysisJob.cxx:755
 TQNTupleDumperAnalysisJob.cxx:756
 TQNTupleDumperAnalysisJob.cxx:757
 TQNTupleDumperAnalysisJob.cxx:758
 TQNTupleDumperAnalysisJob.cxx:759
 TQNTupleDumperAnalysisJob.cxx:760
 TQNTupleDumperAnalysisJob.cxx:761
 TQNTupleDumperAnalysisJob.cxx:762
 TQNTupleDumperAnalysisJob.cxx:763
 TQNTupleDumperAnalysisJob.cxx:764
 TQNTupleDumperAnalysisJob.cxx:765
 TQNTupleDumperAnalysisJob.cxx:766
 TQNTupleDumperAnalysisJob.cxx:767
 TQNTupleDumperAnalysisJob.cxx:768
 TQNTupleDumperAnalysisJob.cxx:769
 TQNTupleDumperAnalysisJob.cxx:770
 TQNTupleDumperAnalysisJob.cxx:771
 TQNTupleDumperAnalysisJob.cxx:772
 TQNTupleDumperAnalysisJob.cxx:773
 TQNTupleDumperAnalysisJob.cxx:774
 TQNTupleDumperAnalysisJob.cxx:775
 TQNTupleDumperAnalysisJob.cxx:776
 TQNTupleDumperAnalysisJob.cxx:777
 TQNTupleDumperAnalysisJob.cxx:778
 TQNTupleDumperAnalysisJob.cxx:779
 TQNTupleDumperAnalysisJob.cxx:780
 TQNTupleDumperAnalysisJob.cxx:781
 TQNTupleDumperAnalysisJob.cxx:782
 TQNTupleDumperAnalysisJob.cxx:783
 TQNTupleDumperAnalysisJob.cxx:784
 TQNTupleDumperAnalysisJob.cxx:785
 TQNTupleDumperAnalysisJob.cxx:786
 TQNTupleDumperAnalysisJob.cxx:787
 TQNTupleDumperAnalysisJob.cxx:788
 TQNTupleDumperAnalysisJob.cxx:789
 TQNTupleDumperAnalysisJob.cxx:790
 TQNTupleDumperAnalysisJob.cxx:791
 TQNTupleDumperAnalysisJob.cxx:792
 TQNTupleDumperAnalysisJob.cxx:793
 TQNTupleDumperAnalysisJob.cxx:794
 TQNTupleDumperAnalysisJob.cxx:795
 TQNTupleDumperAnalysisJob.cxx:796
 TQNTupleDumperAnalysisJob.cxx:797
 TQNTupleDumperAnalysisJob.cxx:798
 TQNTupleDumperAnalysisJob.cxx:799
 TQNTupleDumperAnalysisJob.cxx:800
 TQNTupleDumperAnalysisJob.cxx:801
 TQNTupleDumperAnalysisJob.cxx:802
 TQNTupleDumperAnalysisJob.cxx:803
 TQNTupleDumperAnalysisJob.cxx:804
 TQNTupleDumperAnalysisJob.cxx:805
 TQNTupleDumperAnalysisJob.cxx:806
 TQNTupleDumperAnalysisJob.cxx:807
 TQNTupleDumperAnalysisJob.cxx:808
 TQNTupleDumperAnalysisJob.cxx:809
 TQNTupleDumperAnalysisJob.cxx:810
 TQNTupleDumperAnalysisJob.cxx:811
 TQNTupleDumperAnalysisJob.cxx:812
 TQNTupleDumperAnalysisJob.cxx:813
 TQNTupleDumperAnalysisJob.cxx:814
 TQNTupleDumperAnalysisJob.cxx:815
 TQNTupleDumperAnalysisJob.cxx:816
 TQNTupleDumperAnalysisJob.cxx:817
 TQNTupleDumperAnalysisJob.cxx:818
 TQNTupleDumperAnalysisJob.cxx:819
 TQNTupleDumperAnalysisJob.cxx:820
 TQNTupleDumperAnalysisJob.cxx:821
 TQNTupleDumperAnalysisJob.cxx:822
 TQNTupleDumperAnalysisJob.cxx:823
 TQNTupleDumperAnalysisJob.cxx:824
 TQNTupleDumperAnalysisJob.cxx:825
 TQNTupleDumperAnalysisJob.cxx:826
 TQNTupleDumperAnalysisJob.cxx:827
 TQNTupleDumperAnalysisJob.cxx:828
 TQNTupleDumperAnalysisJob.cxx:829
 TQNTupleDumperAnalysisJob.cxx:830
 TQNTupleDumperAnalysisJob.cxx:831
 TQNTupleDumperAnalysisJob.cxx:832
 TQNTupleDumperAnalysisJob.cxx:833
 TQNTupleDumperAnalysisJob.cxx:834
 TQNTupleDumperAnalysisJob.cxx:835
 TQNTupleDumperAnalysisJob.cxx:836
 TQNTupleDumperAnalysisJob.cxx:837
 TQNTupleDumperAnalysisJob.cxx:838
 TQNTupleDumperAnalysisJob.cxx:839
 TQNTupleDumperAnalysisJob.cxx:840
 TQNTupleDumperAnalysisJob.cxx:841
 TQNTupleDumperAnalysisJob.cxx:842
 TQNTupleDumperAnalysisJob.cxx:843
 TQNTupleDumperAnalysisJob.cxx:844
 TQNTupleDumperAnalysisJob.cxx:845
 TQNTupleDumperAnalysisJob.cxx:846
 TQNTupleDumperAnalysisJob.cxx:847
 TQNTupleDumperAnalysisJob.cxx:848
 TQNTupleDumperAnalysisJob.cxx:849
 TQNTupleDumperAnalysisJob.cxx:850
 TQNTupleDumperAnalysisJob.cxx:851
 TQNTupleDumperAnalysisJob.cxx:852
 TQNTupleDumperAnalysisJob.cxx:853
 TQNTupleDumperAnalysisJob.cxx:854
 TQNTupleDumperAnalysisJob.cxx:855
 TQNTupleDumperAnalysisJob.cxx:856
 TQNTupleDumperAnalysisJob.cxx:857
 TQNTupleDumperAnalysisJob.cxx:858
 TQNTupleDumperAnalysisJob.cxx:859
 TQNTupleDumperAnalysisJob.cxx:860
 TQNTupleDumperAnalysisJob.cxx:861
 TQNTupleDumperAnalysisJob.cxx:862
 TQNTupleDumperAnalysisJob.cxx:863
 TQNTupleDumperAnalysisJob.cxx:864
 TQNTupleDumperAnalysisJob.cxx:865
 TQNTupleDumperAnalysisJob.cxx:866
 TQNTupleDumperAnalysisJob.cxx:867
 TQNTupleDumperAnalysisJob.cxx:868
 TQNTupleDumperAnalysisJob.cxx:869
 TQNTupleDumperAnalysisJob.cxx:870
 TQNTupleDumperAnalysisJob.cxx:871
 TQNTupleDumperAnalysisJob.cxx:872
 TQNTupleDumperAnalysisJob.cxx:873
 TQNTupleDumperAnalysisJob.cxx:874
 TQNTupleDumperAnalysisJob.cxx:875
 TQNTupleDumperAnalysisJob.cxx:876
 TQNTupleDumperAnalysisJob.cxx:877
 TQNTupleDumperAnalysisJob.cxx:878
 TQNTupleDumperAnalysisJob.cxx:879
 TQNTupleDumperAnalysisJob.cxx:880
 TQNTupleDumperAnalysisJob.cxx:881
 TQNTupleDumperAnalysisJob.cxx:882
 TQNTupleDumperAnalysisJob.cxx:883
 TQNTupleDumperAnalysisJob.cxx:884
 TQNTupleDumperAnalysisJob.cxx:885
 TQNTupleDumperAnalysisJob.cxx:886
 TQNTupleDumperAnalysisJob.cxx:887
 TQNTupleDumperAnalysisJob.cxx:888
 TQNTupleDumperAnalysisJob.cxx:889
 TQNTupleDumperAnalysisJob.cxx:890
 TQNTupleDumperAnalysisJob.cxx:891
 TQNTupleDumperAnalysisJob.cxx:892
 TQNTupleDumperAnalysisJob.cxx:893
 TQNTupleDumperAnalysisJob.cxx:894
 TQNTupleDumperAnalysisJob.cxx:895
 TQNTupleDumperAnalysisJob.cxx:896
 TQNTupleDumperAnalysisJob.cxx:897
 TQNTupleDumperAnalysisJob.cxx:898
 TQNTupleDumperAnalysisJob.cxx:899
 TQNTupleDumperAnalysisJob.cxx:900
 TQNTupleDumperAnalysisJob.cxx:901
 TQNTupleDumperAnalysisJob.cxx:902
 TQNTupleDumperAnalysisJob.cxx:903
 TQNTupleDumperAnalysisJob.cxx:904
 TQNTupleDumperAnalysisJob.cxx:905
 TQNTupleDumperAnalysisJob.cxx:906
 TQNTupleDumperAnalysisJob.cxx:907
 TQNTupleDumperAnalysisJob.cxx:908
 TQNTupleDumperAnalysisJob.cxx:909
 TQNTupleDumperAnalysisJob.cxx:910
 TQNTupleDumperAnalysisJob.cxx:911
 TQNTupleDumperAnalysisJob.cxx:912
 TQNTupleDumperAnalysisJob.cxx:913
 TQNTupleDumperAnalysisJob.cxx:914
 TQNTupleDumperAnalysisJob.cxx:915
 TQNTupleDumperAnalysisJob.cxx:916
 TQNTupleDumperAnalysisJob.cxx:917
 TQNTupleDumperAnalysisJob.cxx:918
 TQNTupleDumperAnalysisJob.cxx:919
 TQNTupleDumperAnalysisJob.cxx:920
 TQNTupleDumperAnalysisJob.cxx:921
 TQNTupleDumperAnalysisJob.cxx:922
 TQNTupleDumperAnalysisJob.cxx:923
 TQNTupleDumperAnalysisJob.cxx:924
 TQNTupleDumperAnalysisJob.cxx:925
 TQNTupleDumperAnalysisJob.cxx:926
 TQNTupleDumperAnalysisJob.cxx:927
 TQNTupleDumperAnalysisJob.cxx:928
 TQNTupleDumperAnalysisJob.cxx:929
 TQNTupleDumperAnalysisJob.cxx:930
 TQNTupleDumperAnalysisJob.cxx:931
 TQNTupleDumperAnalysisJob.cxx:932
 TQNTupleDumperAnalysisJob.cxx:933
 TQNTupleDumperAnalysisJob.cxx:934
 TQNTupleDumperAnalysisJob.cxx:935
 TQNTupleDumperAnalysisJob.cxx:936
 TQNTupleDumperAnalysisJob.cxx:937
 TQNTupleDumperAnalysisJob.cxx:938
 TQNTupleDumperAnalysisJob.cxx:939
 TQNTupleDumperAnalysisJob.cxx:940
 TQNTupleDumperAnalysisJob.cxx:941
 TQNTupleDumperAnalysisJob.cxx:942
 TQNTupleDumperAnalysisJob.cxx:943
 TQNTupleDumperAnalysisJob.cxx:944
 TQNTupleDumperAnalysisJob.cxx:945
 TQNTupleDumperAnalysisJob.cxx:946
 TQNTupleDumperAnalysisJob.cxx:947
 TQNTupleDumperAnalysisJob.cxx:948
 TQNTupleDumperAnalysisJob.cxx:949
 TQNTupleDumperAnalysisJob.cxx:950
 TQNTupleDumperAnalysisJob.cxx:951
 TQNTupleDumperAnalysisJob.cxx:952
 TQNTupleDumperAnalysisJob.cxx:953
 TQNTupleDumperAnalysisJob.cxx:954
 TQNTupleDumperAnalysisJob.cxx:955
 TQNTupleDumperAnalysisJob.cxx:956
 TQNTupleDumperAnalysisJob.cxx:957
 TQNTupleDumperAnalysisJob.cxx:958
 TQNTupleDumperAnalysisJob.cxx:959
 TQNTupleDumperAnalysisJob.cxx:960
 TQNTupleDumperAnalysisJob.cxx:961
 TQNTupleDumperAnalysisJob.cxx:962
 TQNTupleDumperAnalysisJob.cxx:963
 TQNTupleDumperAnalysisJob.cxx:964
 TQNTupleDumperAnalysisJob.cxx:965
 TQNTupleDumperAnalysisJob.cxx:966
 TQNTupleDumperAnalysisJob.cxx:967
 TQNTupleDumperAnalysisJob.cxx:968
 TQNTupleDumperAnalysisJob.cxx:969
 TQNTupleDumperAnalysisJob.cxx:970
 TQNTupleDumperAnalysisJob.cxx:971
 TQNTupleDumperAnalysisJob.cxx:972
 TQNTupleDumperAnalysisJob.cxx:973
 TQNTupleDumperAnalysisJob.cxx:974
 TQNTupleDumperAnalysisJob.cxx:975
 TQNTupleDumperAnalysisJob.cxx:976
 TQNTupleDumperAnalysisJob.cxx:977
 TQNTupleDumperAnalysisJob.cxx:978
 TQNTupleDumperAnalysisJob.cxx:979
 TQNTupleDumperAnalysisJob.cxx:980
 TQNTupleDumperAnalysisJob.cxx:981
 TQNTupleDumperAnalysisJob.cxx:982
 TQNTupleDumperAnalysisJob.cxx:983
 TQNTupleDumperAnalysisJob.cxx:984
 TQNTupleDumperAnalysisJob.cxx:985
 TQNTupleDumperAnalysisJob.cxx:986
 TQNTupleDumperAnalysisJob.cxx:987
 TQNTupleDumperAnalysisJob.cxx:988
 TQNTupleDumperAnalysisJob.cxx:989
 TQNTupleDumperAnalysisJob.cxx:990
 TQNTupleDumperAnalysisJob.cxx:991
 TQNTupleDumperAnalysisJob.cxx:992
 TQNTupleDumperAnalysisJob.cxx:993
 TQNTupleDumperAnalysisJob.cxx:994
 TQNTupleDumperAnalysisJob.cxx:995
 TQNTupleDumperAnalysisJob.cxx:996
 TQNTupleDumperAnalysisJob.cxx:997
 TQNTupleDumperAnalysisJob.cxx:998
 TQNTupleDumperAnalysisJob.cxx:999
 TQNTupleDumperAnalysisJob.cxx:1000
 TQNTupleDumperAnalysisJob.cxx:1001
 TQNTupleDumperAnalysisJob.cxx:1002
 TQNTupleDumperAnalysisJob.cxx:1003
 TQNTupleDumperAnalysisJob.cxx:1004
 TQNTupleDumperAnalysisJob.cxx:1005
 TQNTupleDumperAnalysisJob.cxx:1006
 TQNTupleDumperAnalysisJob.cxx:1007
 TQNTupleDumperAnalysisJob.cxx:1008
 TQNTupleDumperAnalysisJob.cxx:1009
 TQNTupleDumperAnalysisJob.cxx:1010
 TQNTupleDumperAnalysisJob.cxx:1011
 TQNTupleDumperAnalysisJob.cxx:1012
 TQNTupleDumperAnalysisJob.cxx:1013
 TQNTupleDumperAnalysisJob.cxx:1014
 TQNTupleDumperAnalysisJob.cxx:1015
 TQNTupleDumperAnalysisJob.cxx:1016
 TQNTupleDumperAnalysisJob.cxx:1017
 TQNTupleDumperAnalysisJob.cxx:1018
 TQNTupleDumperAnalysisJob.cxx:1019
 TQNTupleDumperAnalysisJob.cxx:1020
 TQNTupleDumperAnalysisJob.cxx:1021
 TQNTupleDumperAnalysisJob.cxx:1022
 TQNTupleDumperAnalysisJob.cxx:1023
 TQNTupleDumperAnalysisJob.cxx:1024
 TQNTupleDumperAnalysisJob.cxx:1025
 TQNTupleDumperAnalysisJob.cxx:1026
 TQNTupleDumperAnalysisJob.cxx:1027
 TQNTupleDumperAnalysisJob.cxx:1028
 TQNTupleDumperAnalysisJob.cxx:1029
 TQNTupleDumperAnalysisJob.cxx:1030
 TQNTupleDumperAnalysisJob.cxx:1031
 TQNTupleDumperAnalysisJob.cxx:1032
 TQNTupleDumperAnalysisJob.cxx:1033
 TQNTupleDumperAnalysisJob.cxx:1034
 TQNTupleDumperAnalysisJob.cxx:1035
 TQNTupleDumperAnalysisJob.cxx:1036
 TQNTupleDumperAnalysisJob.cxx:1037
 TQNTupleDumperAnalysisJob.cxx:1038
 TQNTupleDumperAnalysisJob.cxx:1039
 TQNTupleDumperAnalysisJob.cxx:1040
 TQNTupleDumperAnalysisJob.cxx:1041
 TQNTupleDumperAnalysisJob.cxx:1042
 TQNTupleDumperAnalysisJob.cxx:1043
 TQNTupleDumperAnalysisJob.cxx:1044
 TQNTupleDumperAnalysisJob.cxx:1045
 TQNTupleDumperAnalysisJob.cxx:1046
 TQNTupleDumperAnalysisJob.cxx:1047
 TQNTupleDumperAnalysisJob.cxx:1048
 TQNTupleDumperAnalysisJob.cxx:1049
 TQNTupleDumperAnalysisJob.cxx:1050
 TQNTupleDumperAnalysisJob.cxx:1051
 TQNTupleDumperAnalysisJob.cxx:1052
 TQNTupleDumperAnalysisJob.cxx:1053
 TQNTupleDumperAnalysisJob.cxx:1054
 TQNTupleDumperAnalysisJob.cxx:1055
 TQNTupleDumperAnalysisJob.cxx:1056
 TQNTupleDumperAnalysisJob.cxx:1057
 TQNTupleDumperAnalysisJob.cxx:1058
 TQNTupleDumperAnalysisJob.cxx:1059
 TQNTupleDumperAnalysisJob.cxx:1060
 TQNTupleDumperAnalysisJob.cxx:1061
 TQNTupleDumperAnalysisJob.cxx:1062
 TQNTupleDumperAnalysisJob.cxx:1063
 TQNTupleDumperAnalysisJob.cxx:1064
 TQNTupleDumperAnalysisJob.cxx:1065
 TQNTupleDumperAnalysisJob.cxx:1066
 TQNTupleDumperAnalysisJob.cxx:1067
 TQNTupleDumperAnalysisJob.cxx:1068
 TQNTupleDumperAnalysisJob.cxx:1069
 TQNTupleDumperAnalysisJob.cxx:1070
 TQNTupleDumperAnalysisJob.cxx:1071
 TQNTupleDumperAnalysisJob.cxx:1072
 TQNTupleDumperAnalysisJob.cxx:1073
 TQNTupleDumperAnalysisJob.cxx:1074
 TQNTupleDumperAnalysisJob.cxx:1075
 TQNTupleDumperAnalysisJob.cxx:1076
 TQNTupleDumperAnalysisJob.cxx:1077
 TQNTupleDumperAnalysisJob.cxx:1078
 TQNTupleDumperAnalysisJob.cxx:1079
 TQNTupleDumperAnalysisJob.cxx:1080
 TQNTupleDumperAnalysisJob.cxx:1081
 TQNTupleDumperAnalysisJob.cxx:1082
 TQNTupleDumperAnalysisJob.cxx:1083
 TQNTupleDumperAnalysisJob.cxx:1084
 TQNTupleDumperAnalysisJob.cxx:1085
 TQNTupleDumperAnalysisJob.cxx:1086
 TQNTupleDumperAnalysisJob.cxx:1087
 TQNTupleDumperAnalysisJob.cxx:1088
 TQNTupleDumperAnalysisJob.cxx:1089
 TQNTupleDumperAnalysisJob.cxx:1090
 TQNTupleDumperAnalysisJob.cxx:1091
 TQNTupleDumperAnalysisJob.cxx:1092
 TQNTupleDumperAnalysisJob.cxx:1093
 TQNTupleDumperAnalysisJob.cxx:1094
 TQNTupleDumperAnalysisJob.cxx:1095