#include "QFramework/TQTHnBaseMakerAnalysisJob.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQTHnBaseUtils.h"
#include "QFramework/TQObservable.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQCompiledCut.h"
#include "QFramework/TQTaggable.h"
#include "TObjArray.h"
#include "TList.h"
#include "QFramework/TQSample.h"
#include "THnBase.h"
#include "THn.h"
#include "THnSparse.h"

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

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

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQTHnBaseMakerAnalysisJob:
//
// TQTHnBaseMakerAnalysisJob provides the possibility to use
// multidimensional histograms with its base class THnBase within the
// QFramework.  This class is highly derived from the
// TQHistoMakerAnalysisJob, where more information can be found.
//
////////////////////////////////////////////////////////////////////////////////////////////////

TQMessageStream TQTHnBaseMakerAnalysisJob::f_ErrMsg(new std::stringstream());
bool TQTHnBaseMakerAnalysisJob::g_useHistogramObservableNames(false);

ClassImp(TQTHnBaseMakerAnalysisJob)

//__________________________________________________________________________________|___________

TQTHnBaseMakerAnalysisJob::TQTHnBaseMakerAnalysisJob() :
TQAnalysisJob("TQTHnBaseMakerAnalysisJob"),
  f_Verbose(0),
  poolAt(NULL)
{
  // standard constructor
}

//__________________________________________________________________________________|___________

TQTHnBaseMakerAnalysisJob::TQTHnBaseMakerAnalysisJob(TQTHnBaseMakerAnalysisJob* other) :
  TQAnalysisJob(other ? other->GetName() : "TQTHnBaseMakerAnalysisJob"),
  f_Verbose(other ? other->f_Verbose : 0),
  poolAt(other ? other->poolAt : NULL)
{
  // copy constructor
  for(size_t i=0; i<other->fHistogramTemplates.size(); ++i){
    this->fHistogramTemplates.push_back(TQTHnBaseUtils::copyHistogram(other->fHistogramTemplates[i]));
    this->fFillSynchronized.push_back(other->fFillSynchronized[i]);
    this->fFillRaw.push_back(other->fFillRaw[i]);
    this->fHistoTypes.push_back(other->fHistoTypes[i]);
    this->fExpressions.push_back(std::vector<TString>());
    for(size_t j=0; j<other->fExpressions[i].size(); ++j){
      this->fExpressions[i].push_back(other->fExpressions[i][j]);
    }
  }
}

//__________________________________________________________________________________|___________

void TQTHnBaseMakerAnalysisJob::setVerbose(int verbose) {
  // set verbosity
  f_Verbose = verbose;
}


//__________________________________________________________________________________|___________

int TQTHnBaseMakerAnalysisJob::getVerbose() {
  // retrieve verbosity
  return f_Verbose;
}

//__________________________________________________________________________________|___________

void TQTHnBaseMakerAnalysisJob::setErrorMessage(TString message) {

  /* update the error message */
  f_ErrMsg.sendClassFunctionMessage(TQMessageStream::INFO,this->Class(),"<anonymous>",message);

  /* print the error message if in verbose mode */
  if (f_Verbose > 0) INFOclass(message);
}

//__________________________________________________________________________________|___________

void TQTHnBaseMakerAnalysisJob::clearMessages(){
  // clear the error messages
  f_ErrMsg.clearMessages();
}

//__________________________________________________________________________________|___________

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


//__________________________________________________________________________________|___________

const TString& TQTHnBaseMakerAnalysisJob::getValidNameCharacters() {
  // retrieve a string with valid name characters
  return TQFolder::getValidNameCharacters();
}


//__________________________________________________________________________________|___________

void TQTHnBaseMakerAnalysisJob::cancelHistogram(const TString& name) {
  // cancel the histgogram with the given name
  for(size_t i=fHistogramTemplates.size(); i >0 ; i--){
    if(fHistogramTemplates.at(i)->GetName() == name){
      fHistogramTemplates.erase(fHistogramTemplates.begin()+i-1);
      fFillSynchronized.erase(fFillSynchronized.begin()+i-1);
      fFillRaw.erase(fFillRaw.begin()+i-1);
      fExpressions.at(i-1).clear();
      fExpressions.erase(fExpressions.begin()+i-1);
      fHistoTypes.erase(fHistoTypes.begin()+i-1);
      return;
    }
  }
}

//__________________________________________________________________________________|___________

namespace {
  void setupAxis(TAxis* axis, const TString& title, const TString& expr, const std::vector<TString>& labels){
    axis->SetTitle(title);
    axis->SetName(expr);
    for(size_t i=0; i<labels.size(); ++i){
      axis->SetBinLabel(i+1,labels[i]);
    }
  }
}
//__________________________________________________________________________________|___________

bool TQTHnBaseMakerAnalysisJob::bookHistogram(TString definition, TQTaggable* aliases) {
  DEBUGclass("entering function - booking histogram '%s'",definition.Data());

  if(definition.IsNull()){
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::INFO,this->Class(),__FUNCTION__,"obtained empty histogram definition");
    return false;
  }
  // histogram definition
  TString histoDef;
  TQStringUtils::readUpTo(definition, histoDef, "<", "()[]{}", "''\"\"");

  // create histogram template from definition
  TString msg;
  DEBUGclass("creating histogram '%s'",histoDef.Data());

  if(histoDef.IsNull()){
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"histogram constructor is empty, remainder is '%s'",definition.Data());
    return false;
  }

  THnBase * histo = TQTHnBaseUtils::createHistogram(histoDef, msg);
  DEBUGclass(histo ? "success" : "failure");

  if (!histo) {
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,msg);
    return false;
  }

  // invalid histogram name?
  if (!TQFolder::isValidName(histo->GetName())) {
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"'%s' is an invalid histogram name", histo->GetName());
    delete histo;
    return false;
  }

  // read "<<" operator
  if (TQStringUtils::removeLeading(definition, "<") != 2) {
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::WARNING,this->Class(),__FUNCTION__,"Operator '<<' expected after histogram definition");
    delete histo;
    return false;
  }

  //split off a possile option block
  std::vector<TString> settingTokens = TQStringUtils::split(definition, "<<", "([{'\"", ")]}'\"");
  if (settingTokens.size()<1) {
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"cannot parse definition block '%s'",definition.Data());
    delete histo;
    return false;
  }
  definition = settingTokens[0];
  TQTaggable options;
  if (settingTokens.size()>1) {
    TString optionBlock;
    TQStringUtils::readBlanksAndNewlines(settingTokens[1]);
    if (!TQStringUtils::readBlock(settingTokens[1], optionBlock, "()[]{}", "''\"\"")) {
      this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"Failed to parse histogram option block '%s'", settingTokens[1].Data());
      delete histo;
      return false;
    }
    options.importTags(optionBlock);
  }

  // read expression block
  TString expressionBlock;
  TQStringUtils::readBlanksAndNewlines(definition);
  if (!TQStringUtils::readBlock(definition, expressionBlock, "()[]{}", "''\"\"")) {
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"Missing expression block after '<<' operator");
    delete histo;
    return false;
  }

  // tokenize expression block (one token per histogram dimension)
  TList * expressionTokens = TQStringUtils::tokenize(expressionBlock, ",", true, "()[]{}", "''\"\"");
  if(expressionTokens->GetEntries() < 1){
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"cannot parse expression block '%s'",expressionBlock.Data());
    delete histo;
    return false;
  }

  DEBUGclass("parsing expression block '%s', found %d entries",expressionBlock.Data(),expressionTokens->GetEntries());

  // read expression block tokens
  std::vector<TString> exprs;
  std::vector<TString> histnames;
  std::vector<TString> titles;
  std::vector<std::vector<TString> > labels ;
  TQIterator itr(expressionTokens);
  while (itr.hasNext()) {
    TString token(itr.readNext()->GetName());
    // read expression
    TString expr;
    TString histname;
    int nColon = 0;
    while(true){
      TQStringUtils::readUpTo(token, histname, "\\:", "()[]{}", "''\"\"");
      nColon = TQStringUtils::countLeading(token, ":");
      if (nColon == 1) {
        if (TQStringUtils::removeLeading(token,"\\:")) {
          TQStringUtils::readUpTo(token, expr,"\\:", "()[]{}", "''\"\"");
        }
      }
      nColon = TQStringUtils::countLeading(token, ":");
      if (nColon == 1) {
				TQStringUtils::removeLeading(token,"\\:");
      }
      nColon = TQStringUtils::countLeading(token, ":");
      if (nColon == 0) {
        break;
      } else {
				this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"histogram definitions could not be read - check your input!");
        DEBUGclass("histogram definitions could not be read - check your input!");
        delete histo;
        return false;
      }
    }
    TQStringUtils::readBlanksAndNewlines(token);
    TQStringUtils::removeLeading(token,":");
    TQStringUtils::readBlanksAndNewlines(token);

    // use TQTaggable to read title (handling of e.g. quotes)
    TString buffer;
    TString title;
    std::vector<TString> binLabels;
    if(TQStringUtils::readBlock(token,buffer,"''","",false,false) > 0 || TQStringUtils::readBlock(token,buffer,"\"\"","",false,false) > 0){
      title = buffer;
      buffer.Clear();
      TQStringUtils::readBlanksAndNewlines(token);
      if(TQStringUtils::removeLeading(token,":") == 1){
        TQStringUtils::readBlanksAndNewlines(token);
        TQStringUtils::readBlock(token,buffer,"(){}[]","",false,false);
        binLabels = TQStringUtils::split(buffer,",");
        for(size_t i=0; i<binLabels.size(); ++i){
          TQStringUtils::removeLeading(binLabels[i]," ");
          TQStringUtils::removeTrailing(binLabels[i]," ");
          TQStringUtils::unquoteInPlace(binLabels[i]);
        }
      }
    } else {
      title = TQStringUtils::unquote(token);
    }

    // store expression and title
    const TString expression(aliases ? aliases->replaceInTextRecursive(expr) : expr);
    exprs.push_back(TQStringUtils::trim(expression));
    titles.push_back(TQStringUtils::trim(title));
    histnames.push_back(TQStringUtils::trim(histname));
    labels.push_back(binLabels);
    DEBUGclass("found expression and title: '%s' and '%s'",expr.Data(),title.Data());
  }

  // histogram properties
  TString name = histo->GetName();
  int dim = TQTHnBaseUtils::getDimension(histo);

  // check dimension of histogram and expression block
  if ( ( dim > 0 && dim != (int)exprs.size() ) || ( dim < 0 && (int)exprs.size() != abs(dim)+1) ) {
    // last ist the TProfile case
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"Dimensionality of histogram (%d) and expression block (%d) don't match", dim, (int)(exprs.size()));
    delete histo;
    DEBUGclass("Dimensionality of histogram (%d) and expression block (%d) don't match", dim, (int)(exprs.size()));
    return false;
  }

  // check name of histogram
  if (!TQStringUtils::isValidIdentifier(name, getValidNameCharacters())) {
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,this->Class(),__FUNCTION__,"Invalid histogram name '%s'", name.Data());
    DEBUGclass("Invalid histogram name '%s'", name.Data());
    delete histo;
    return false;
  }

  // stop if histogram with 'name' already has been booked
  bool exists = false;
  int i = 0;
  while (!exists && i < (int)(fHistogramTemplates.size()))
    exists = (name.CompareTo(fHistogramTemplates.at(i++)->GetName()) == 0);
  if (exists) {
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::WARNING,this->Class(),__FUNCTION__,"Histogram with name '%s' has already been booked", name.Data());
    DEBUGclass("Histogram with name '%s' has already been booked", name.Data());
    delete histo;
    return false;
  }

  // set up tree observables corresponding to expressions
  for (int i = 0; i < (int)exprs.size(); i++) {
    setupAxis(histo->GetAxis(i), titles[i], histnames[i], labels[i]);
  }

  fExpressions.push_back(exprs);
  fHistoTypes.push_back(TQTHnBaseUtils::getDimension(histo));
  fHistogramTemplates.push_back(histo);
  //@tag: [fillSynchronized] This tag is read from an additional option block in the histogram definition, e.g. TH2(<histogram definition>) << (<variable definitions>) << (fillSynchronized = true) . This tag defaults to false and is only relevant if vector observables are used in multi dimensional histograms. By default all combinations of values from the different observables are filled. If this tag is set to 'true', however, all vector valued observables are required to have the same number of evaluations (same dimensionality). Only combinations of values with the same index in the respective vector observables are filled. If a vector observable is used in combination with a non-vector observable the latter one is evaluated the usual way for each entry of the vector observable.
  fFillSynchronized.push_back(options.getTagBoolDefault("fillSynchronized",false));
  fFillRaw.push_back(options.getTagBoolDefault("fillRaw",false));

  return true;
}


//__________________________________________________________________________________|___________

bool TQTHnBaseMakerAnalysisJob::execute(double weight) {
  DEBUGclass("filling histograms for event...");
  // execute this analysis job, filling all histograms
  for (unsigned int i = 0; i < fHistograms.size(); ++i) {
#ifdef _DEBUG_
    if(this->fObservables.size() < i){
      throw std::runtime_error("insufficient size of observable vector!");
    }
#endif

    const int dim = fObservables[i].size();
    if (dim != TQTHnBaseUtils::getDimension(fHistograms[i])) {
      ERRORclass("Dimension of Observable does not agree with dimension of histogram named %s. No filling of histogram possible", this->fHistograms[i]->GetName());
    }
    TRY(
	std::vector<double> fillvector;
	for (unsigned int a = 0; a<fObservables[i].size(); a++) {
	  fillvector.push_back(fObservables[i][a]->getValue());
	}
	((THnSparse*)(fHistograms[i]))->Fill(fillvector.data(),
																			 this->fFillRaw[i]? 1. : weight*fSample->getNormalisation());
	,TString::Format("Failed to fill histogram '%s' using the observables '%s', '%s', '%s' at cut '%s'.", fHistograms[i]->GetName(), fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), fObservables[i][2]->GetName(), this->getCut()->GetName())
	)

      }

  return true;
}

//__________________________________________________________________________________|___________

bool TQTHnBaseMakerAnalysisJob::initializeSelf() {
  // initialize this analysis job
  DEBUGclass("initializing analysis job '%s'",this->GetName());

  if(fHistograms.size() < 1){
    this->poolAt = this->fSample;
    DEBUGclass("initializing histograms");
    this->initializeHistograms();
  }

  bool success = true;
  /* initialize TQObservables */
  DEBUGclass("initializing observables");
  for (unsigned int i = 0; i < fExpressions.size(); ++i) {
    std::vector<TQObservable*> observables;
    for (unsigned int j = 0; j < fExpressions[i].size(); ++j) {
      TQObservable* obs = TQObservable::getObservable(fExpressions[i][j],this->fSample);
      if(obs && success){
        DEBUGclass("initializing...");
        if (!obs->initialize(this->fSample)) {
          ERRORclass("Failed to initialize observable created from expression '%s' for sample '%s' in TQHistomakerAnalysisJob '%s' for histogram named '%s'",this->fExpressions[i][j].Data(), this->fSample->getPath().Data(), this->GetName(), this->fHistograms[i]->GetName());
          success=false;
        }
        DEBUGclass("initialized observable '%s' of type '%s' with '%s'",
                   obs->getExpression().Data(),
                   obs->ClassName(),
                   obs->getActiveExpression().Data());
      }
      if(!obs){
        DEBUGclass("creating const observable");
        obs = TQObservable::getObservable("Const:nan",this->fSample);
        obs->initialize(this->fSample);
      }
      observables.push_back(obs);
    }
    this->fObservables.push_back(observables);
  }
  DEBUG("successfully initialized histogram job");
  return success;
}

//__________________________________________________________________________________|___________

void TQTHnBaseMakerAnalysisJob::initializeHistograms(){
  // create histograms from templates */
  DEBUGclass("Size of histogram template vector : %i", fHistogramTemplates.size());
  for (unsigned int i = 0; i < fHistogramTemplates.size(); i++) {

    /* copy/clone the template histogram */
    //TH1 * histo = (TH1*)(*fHistogramTemplates)[i]->Clone();
    THnBase * histo = TQTHnBaseUtils::copyHistogram((fHistogramTemplates)[i]);
    // std::cout << "initialized " << histo->GetName() << std::endl;
    // histo->SetDirectory(0);
    fHistograms.push_back(histo);
  }
}


//__________________________________________________________________________________|___________

bool TQTHnBaseMakerAnalysisJob::finalizeSelf() {
  // finalize TQObservables
  for (unsigned int i = 0; i < fObservables.size(); ++i) {
    for (unsigned int j = 0; j < fObservables[i].size(); ++j) {
      fObservables[i][j]->finalize();
    }
  }
  this->fObservables.clear();

  if(this->poolAt == this->fSample)
    if(!this->finalizeHistograms())
      return false;

  return true;
}

//__________________________________________________________________________________|___________

bool TQTHnBaseMakerAnalysisJob::finalizeHistograms(){
  // store the histograms in the sample folder hierarchy
  if (!getCut()) { return false; }

  /* get the histogram folder */
  TQFolder * folder = this->poolAt->getFolder(TString::Format(
                                                              ".histograms/%s+", getCut()->GetName()));
  if (!folder) { return false; }
  DEBUGclass("successfully created folder for cut %s", getCut()->GetName());

  /* scale and store histograms */
  DEBUGclass("length of histogram list is %i", fHistograms.size());
  for (unsigned int i = 0; i < fHistograms.size(); i++) {
    THnBase * histo = (fHistograms)[i];
    if (!histo){ DEBUGclass("Histogram is 0!"); };
    /* delete existing histogram */
    TObject *h = folder->FindObject(histo->GetName());
    if (h)
      {
        DEBUGclass("removing previous object %s", h->GetName());
        folder->Remove(h);
      }
    /* save the new histogram */
    DEBUGclass("saving histogram %s", histo->GetName());
    folder->Add(histo);
  }

  /* delete the list of histograms */
  this->fHistograms.clear();
  this->poolAt = NULL;

  return true;
}

//__________________________________________________________________________________|___________

bool TQTHnBaseMakerAnalysisJob::initializeSampleFolder(TQSampleFolder* sf){
  // initialize this job on a sample folder (taking care of pooling)
  bool pool = false;
  sf->getTagBool(".aj.pool.histograms",pool);
  // std::cout << std::endl << "initialize samplefolder called on " << sf->GetName() << " pool=" << pool << ", fHistograms=" << fHistograms << std::endl << std::endl;

  if(pool && (this->fHistograms.size() == 0)){
    this->initializeHistograms();
    this->poolAt = sf;
  }

  return true;
}

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

TQTHnBaseMakerAnalysisJob::~TQTHnBaseMakerAnalysisJob() {
  // destructor
  for (unsigned int i = 0; i < fHistogramTemplates.size(); i++) {
    delete (fHistogramTemplates)[i]; }
}

//__________________________________________________________________________________|___________

TQAnalysisJob* TQTHnBaseMakerAnalysisJob::getClone(){
  // retrieve a clone of this job
  TQTHnBaseMakerAnalysisJob* newJob = new TQTHnBaseMakerAnalysisJob(this);
  return newJob;
}

//__________________________________________________________________________________|___________

void TQTHnBaseMakerAnalysisJob::reset() {
  // Reset this analysis job. This method is called after an analysis job was
  // cloned.

  // call the reset function of the parent class
  TQAnalysisJob::reset();
  // do class-specific stuff
  fHistograms.clear();
}

//__________________________________________________________________________________|___________

int TQTHnBaseMakerAnalysisJob::importJobsFromTextFiles(const TString& files, TQCompiledCut* basecut, const TString& channelFilter, bool verbose){
  // open a list of files (comma-separated), parse all histogram definitions inside
  // for each assigment encountered matching the channelfilter (or with no channel),
  // create a histogram job, fill it with all appropriate histograms and add it to the basecut
  std::vector <TString> filenames = TQStringUtils::split(files,",");
  return TQTHnBaseMakerAnalysisJob::importJobsFromTextFiles(filenames,basecut,channelFilter,verbose);
}

//__________________________________________________________________________________|___________

int TQTHnBaseMakerAnalysisJob::importJobsFromTextFiles(const TString& files, TQCompiledCut* basecut, TQTaggable* aliases, const TString& channelFilter, bool verbose){
  // open a list of files (comma-separated), parse all histogram definitions inside
  // for each assigment encountered matching the channelfilter (or with no channel),
  // create a histogram job, fill it with all appropriate histograms and add it to the basecut
  std::vector <TString> filenames = TQStringUtils::split(files,",");
  return TQTHnBaseMakerAnalysisJob::importJobsFromTextFiles(filenames,basecut,aliases,channelFilter,verbose);
}

//__________________________________________________________________________________|___________

int TQTHnBaseMakerAnalysisJob::importJobsFromTextFiles(const std::vector<TString>& filenames, TQCompiledCut* basecut, const TString& channelFilter, bool verbose){
  // open a list of files (std::vector), parse all histogram definitions inside
  // for each assigment encountered matching the channelfilter (or with no channel),
  // create a histogram job, fill it with all appropriate histograms and add it to the basecut
  return TQTHnBaseMakerAnalysisJob::importJobsFromTextFiles(filenames, basecut, NULL, channelFilter, verbose);
}

//__________________________________________________________________________________|___________

int TQTHnBaseMakerAnalysisJob::importJobsFromTextFiles(const std::vector<TString>& filenames, TQCompiledCut* basecut, TQTaggable* aliases, const TString& channelFilter, bool verbose){
  // open a list of files (std::vector), parse all histogram definitions inside
  // for each assigment encountered matching the channelfilter (or with no channel),
  // create a histogram job, fill it with all appropriate histograms and add it to the basecut
  if(filenames.size() < 1){
    ERRORfunc("importing no histograms from empty files list!");
    return -1;
  }
  std::map<TString,TString> histogramDefinitions;
  std::vector<TString> assignments;
  TString buffer;
  for(size_t i=0; i<filenames.size(); i++){
    std::vector<TString>* lines = TQStringUtils::readFileLines(filenames[i],2048);
    if(!lines){
      ERRORfunc("unable to open file '%s'",filenames[i].Data());
      continue;
    }
    for(size_t j=0; j<lines->size(); ++j){
      TString line(TQStringUtils::trim(lines->at(j)));
      DEBUGclass("looking at line '%s'",line.Data());
      if(line.IsNull()) continue;
      if(line.BeginsWith("T")){
        size_t namestart = TQStringUtils::findFirstOf(line,"'\"",0)+1;
        size_t nameend = TQStringUtils::findFirstOf(line,"'\"",namestart);
        if(namestart == 0 || namestart > (size_t)line.Length() || nameend > (size_t)line.Length() || nameend == namestart){
          ERRORfunc("unable to parse histogram definition '%s'",line.Data());
          continue;
        }
        TString name(TQStringUtils::trim(line(namestart,nameend-namestart),"\t ,"));
        DEBUGclass("found definition: '%s', assigning as '%s'",line.Data(),name.Data());
        histogramDefinitions[name] = line;
      } else if(TQStringUtils::removeLeading(line,"@") == 1){
        DEBUGclass("found assignment: '%s'",line.Data());
        assignments.push_back(line);
      } else {
        WARNfunc("encountered unknown token: '%s'",line.Data());
      }
    }
    delete lines;
  }
  if(verbose) VERBOSEfunc("going to create '%d' jobs",(int)(assignments.size()));
  int retval = 0;
  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,histograms;
    TQStringUtils::readUpTo(assignment,cuts,":");
    TQStringUtils::readToken(assignment,buffer," :");
    TQStringUtils::readUpTo(assignment,histograms,";");
    TQStringUtils::readToken(assignment,buffer,"; ");
    DEBUGclass("histograms: '%s'",histograms.Data());
    DEBUGclass("cuts: '%s'",cuts.Data());
    if(verbose) VERBOSEfunc("building job for cuts '%s'",cuts.Data());
    DEBUGclass("spare symbols: '%s'",buffer.Data());
    std::vector<TString> vHistos = TQStringUtils::split(histograms,",");
    if(vHistos.size() < 1){
      ERRORfunc("no histograms listed in assignment '%s'",assignments[i].Data());
      continue;
    }
    TQTHnBaseMakerAnalysisJob* job = new TQTHnBaseMakerAnalysisJob();
    for(size_t j=0; j<vHistos.size(); ++j){
      const TString def = histogramDefinitions[TQStringUtils::trim(vHistos[j],"\t ,")];
      if(def.IsNull()){
        ERRORfunc("unable to find histogram definition for name '%s', skipping",TQStringUtils::trim(vHistos[j],"\t ,").Data());
        continue;
      }
      bool ok = job->bookHistogram(def,aliases);
      if(ok){
        if(verbose) VERBOSEfunc("\tbooked histogram '%s'",def.Data());
      } else {
        retval += 1;
        if(verbose) f_ErrMsg.writeMessagesToStdout();
        job->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::ERROR,job->Class(),__FUNCTION__,"'%s' caused an error when trying to book the histogram, the previous lines might provide some more information.", def.Data());
        DEBUGclass("error booking histogram for '%s', function says '%s'",def.Data(),f_ErrMsg.getMessages().Data());
      }
    }
    // if(verbose) job->printBooking(cuts);
    basecut->addAnalysisJob(job,cuts);
    delete job;
  }

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