#include "QFramework/TQGraphMakerAnalysisJob.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQHistogramUtils.h"
#include "QFramework/TQObservable.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQCompiledCut.h"
#include "QFramework/TQTaggable.h"
#include "TObjArray.h"
#include "TList.h"
#include "TObjString.h"
#include "QFramework/TQSample.h"
#include "TFolder.h"
#include "TGraph.h"
#include "TGraph2D.h"
#include "QFramework/TQUtils.h"
#include "TH1.h"
#include "TH1F.h"
#include "TH2F.h"

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

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

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQGraphMakerAnalysisJob:
//
// The TQGraphMakerAnalysisJob allows to book instances of TGraph
// showing multi-dimensional distributions of variables in a way
// similar to the TQHistoMakerAnalysisJob.
//
//   TGraph('subleadLepPt', '') << ( $(lep1).pt() : 'Number of Leptons', [Weight_$(weightname):$(cand)]*[SampleNorm] : 'Event Weight' );
//
//   @CutMET: subleadLepPt;
//
// Caution: The TGraphs can become extremely large for large numbers
// of events!
//
////////////////////////////////////////////////////////////////////////////////////////////////

TQMessageStream TQGraphMakerAnalysisJob::f_ErrMsg(new std::stringstream());

ClassImp(TQGraphMakerAnalysisJob)

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

TQGraphMakerAnalysisJob::TQGraphMakerAnalysisJob(TQGraphMakerAnalysisJob* other) :
  TQAnalysisJob(other ? other->GetName() : "TQGraphMakerAnalysisJob"),
  f_Verbose(other ? other->f_Verbose : 0),
  poolAt(other ? other->poolAt : NULL)
{
  // copy constructor
  for(size_t i=0; i<other->fGraphTemplates.size(); ++i){
    this->fGraphTemplates.push_back(TQHistogramUtils::copyGraph(other->fGraphTemplates[i]));
    this->fGraphTypes.push_back(other->fGraphTypes[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 TQGraphMakerAnalysisJob::setVerbose(int verbose) {
  // set verbosity
  f_Verbose = verbose;
}


//__________________________________________________________________________________|___________

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


//__________________________________________________________________________________|___________

void TQGraphMakerAnalysisJob::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 TQGraphMakerAnalysisJob::clearMessages(){
  // clear the error messages
  f_ErrMsg.clearMessages();
}

//__________________________________________________________________________________|___________

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


//__________________________________________________________________________________|___________

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


//__________________________________________________________________________________|___________

void TQGraphMakerAnalysisJob::cancelGraph(const TString& name) {
  // cancel the histgogram with the given name
  for(size_t i=fGraphTemplates.size(); i >0 ; i--){
    if(fGraphTemplates.at(i)->GetName() == name){
      fGraphTemplates.erase(fGraphTemplates.begin()+i-1);
      fExpressions.at(i-1).clear();
      fExpressions.erase(fExpressions.begin()+i-1);
      fGraphTypes.erase(fGraphTypes.begin()+i-1);
      return;
    }
  }
}

//__________________________________________________________________________________|___________

bool TQGraphMakerAnalysisJob::bookGraph(TString definition, TQTaggable* aliases) {
	// book a new graph, given a definition
  DEBUGclass("entering function - booking graph '%s'",definition.Data());

  if(definition.IsNull()){
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::INFO,this->Class(),__FUNCTION__,"obtained empty graph definition");
    return false;
  }

  // graph definition
  TString graphDef;
  TQStringUtils::readUpTo(definition, graphDef, "<", "()[]{}", "''\"\"");

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

  // create graph template from definition
  DEBUGclass("creating graph '%s'",graphDef.Data());
  TString msg;
  TNamed * graph = TQHistogramUtils::createGraph(graphDef, msg);
  DEBUGclass(graph ? "success" : "failure");

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

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

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

  //split off a possile option block
  std::vector<TString> settingTokens = TQStringUtils::split(definition, "<<", "([{'\"", ")]}'\"");
  if (settingTokens.size()<1) {
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::INFO,this->Class(),__FUNCTION__,"cannot parse definition block '%s'",definition.Data());
    delete graph;
    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::INFO,this->Class(),__FUNCTION__,"Failed to parse graph option block '%s'", settingTokens[1].Data());
      delete graph;
      return false;
    }
    options.importTags(optionBlock);
  }

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

  // tokenize expression block (one token per dimension)
  TList * expressionTokens = TQStringUtils::tokenize(expressionBlock, ",", true, "()[]{}", "''\"\"");
  if(expressionTokens->GetEntries() < 1){
    this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::INFO,this->Class(),__FUNCTION__,"cannot parse expression block '%s'",expressionBlock.Data());
    delete graph;
    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> titles;
  TQIterator itr(expressionTokens);
  while (itr.hasNext()) {
    TString token(itr.readNext()->GetName());
    // read expression
    TString expr;
    int nColon = 0;
    while(nColon != 1){
      TQStringUtils::readUpTo(token, expr, "\\:", "()[]{}", "''\"\"");
      nColon = TQStringUtils::countLeading(token, ":");
      if (nColon == 1) {
        break;
      } else if (nColon == 0) {
        if(TQStringUtils::removeLeading(token,"\\")){
          TQStringUtils::readToken(token,expr,":");
          continue;
        }
        this->f_ErrMsg.sendClassFunctionMessage(TQMessageStream::INFO,this->Class(),__FUNCTION__,"':' expected after expression");
        DEBUGclass("':' expected after expression");
        delete graph;
        return false;
      } else {
        TQStringUtils::readToken(token,expr,":");
        continue;
      }
    }
    TQStringUtils::readBlanksAndNewlines(token);
    TQStringUtils::removeLeading(token,":");
    TQStringUtils::readBlanksAndNewlines(token);
    // use TQTaggable to read title (handling of e.g. quotes)
    TString buffer;
    TString 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));
    DEBUGclass("found expression and title: '%s' and '%s'",expr.Data(),title.Data());
  }

  // graph properties
  TString name = graph->GetName();
  int dim = (graph->InheritsFrom(TGraph2D::Class()) ? 3 : 2);

  // check dimension of graph 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::INFO,this->Class(),__FUNCTION__,"Dimensionality of graph (%d) and expression block (%d) don't match", dim, (int)(exprs.size()));
    delete graph;
    DEBUGclass("Dimensionality of graph (%d) and expression block (%d) don't match", dim, (int)(exprs.size()));
    return false;
  }

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

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

  // set up tree observables corresponding to expressions
  for (int i = 0; i < (int)exprs.size(); i++) {
		TAxis* axis = TQHistogramUtils::getAxis_nonconst(graph,i);
		axis->SetTitle(titles[i]);
    axis->SetName(exprs[i]);
  }

  fExpressions.push_back(exprs);
  fGraphTypes.push_back(graph->IsA());
  fGraphTemplates.push_back(graph);
  return true;
}

//__________________________________________________________________________________|___________

void TQGraphMakerAnalysisJob::print(const TString& options) {
  // overloading the standard print-routine, internally calling printBooking[TeX], depending on options
  if(options.Contains("TeX")){
    this->printBookingTeX(this->GetName());
  } else {
    this->printBooking(this->GetName());
  }
}

//__________________________________________________________________________________|___________

void TQGraphMakerAnalysisJob::printBookingTeX(const TString& moretext) {
  // print booked graphs (LaTeX format)
  std::cout << "\\begin{tabular}{l l l l }" << std::endl;;
  std::cout << "\\multicolumn{2}{l}{\\bfseries Booked Graphs}" << " & \\multicolumn{2}{l}{" << moretext  << "}\\tabularnewline" << std::endl;
  for (size_t i = 0;i < fGraphTemplates.size(); i++) {
    TString exp(TQStringUtils::concat(fExpressions.at(i),","));
    exp.ReplaceAll("$","\\$");
    std::cout << fGraphTemplates.at(i)->GetName() << " & "
              << fGraphTemplates.at(i)->GetTitle()  << " & "
              << TQHistogramUtils::getDetailsAsString(fGraphTemplates.at(i), 2)  << " & "
              << exp;
    if(i != fGraphTemplates.size() -1) std::cout << " \\tabularnewline ";
    std::cout<< std::endl;
  }
  std::cout << "\\end{tabular}" << std::endl;
}

//__________________________________________________________________________________|___________

void TQGraphMakerAnalysisJob::printBooking(const TString& moretext) {
  // print booked graphs
  std::cout << TQStringUtils::makeBoldBlue("Booked Graphs") << " " << TQStringUtils::makeBoldWhite(moretext) << std::endl;
  for (size_t i = 0;i < fGraphTemplates.size(); i++) {
    std::cout << TQStringUtils::fixedWidth(fGraphTemplates.at(i)->GetName(),20)
              << TQStringUtils::fixedWidth(fGraphTemplates.at(i)->GetTitle(),20)
              << TQHistogramUtils::getDetailsAsString(fGraphTemplates.at(i), 2)
              << " << " << TQStringUtils::concat(fExpressions.at(i)," : ")
              << std::endl;
  }
}


//__________________________________________________________________________________|___________

bool TQGraphMakerAnalysisJob::execute(double/*weight*/) {
  DEBUGclass("filling graphs for event...");
  // execute this analysis job, filling all graphs
  for (unsigned int i = 0; i < fGraphs.size(); ++i) {
    #ifdef _DEBUG_
    if(this->fObservables.size() < i){
      throw std::runtime_error("insufficient size of observable vector!");
    }
    #endif
    if(fGraphTypes[i] == TGraph::Class()){
      TGraph* g = (TGraph*)(fGraphs[i]);
			// aggressively expand the graph memoy to avoid frequent reallocation
			g->Expand(g->GetN()+10,1000);
      TRY(
					g->SetPoint(g->GetN(),fObservables[i][0]->getValue(),fObservables[i][1]->getValue())
					,TString::Format("Failed to add event to graph '%s' using the observable '%s' at cut '%s'.", g->GetName(), fObservables[i][0]->GetName(), this->getCut()->GetName())
					);
    }
  }
  return true;
}

//__________________________________________________________________________________|___________

TObjArray * TQGraphMakerAnalysisJob::getBranchNames() {
  // retrieve the list of branch names used by this job
  if(!this->fSample){
    throw std::runtime_error("cannot retrieve branches on uninitialized object!");
  }
  TObjArray * bNames = new TObjArray();

  /* return all observable expressions (containing branch names) */
  for (size_t i = 0; i < fObservables.size(); ++i) {
    for (size_t j = 0; j < fObservables[i].size(); ++j) {
      TQObservable* obs = fObservables[i][j];
      if(obs){
        TCollection* c = obs->getBranchNames();
        if(c){
          if(c->GetEntries() > 0) bNames -> AddAll(c);
          c->SetOwner(false);
          delete c;
        }
      }
    }
  }

  return bNames;
}

//__________________________________________________________________________________|___________

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

  if(fGraphs.size() < 1){
    this->poolAt = this->fSample;
    DEBUGclass("initializing graphs");
    this->initializeGraphs();
  }

  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) {
      TString expr(fExpressions[i][j]);
      TQObservable* obs = TQObservable::getObservable(expr,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 TQGraphMAnalysisJob '%s' for graph named '%s'",this->fExpressions[i][j].Data(), this->fSample->getPath().Data(), this->GetName(), this->fGraphs[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 graph job");
  return success;
}

//__________________________________________________________________________________|___________

void TQGraphMakerAnalysisJob::initializeGraphs(){
  // create graphs from templates
  DEBUGclass("Size of graph template vector : %i", fGraphTemplates.size());
  for (unsigned int i = 0; i < fGraphTemplates.size(); i++) {

    // copy/clone the template graph
    TNamed * graph = TQHistogramUtils::copyGraph((fGraphTemplates)[i]);
    fGraphs.push_back(graph);
  }
}


//__________________________________________________________________________________|___________

bool TQGraphMakerAnalysisJob::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->finalizeGraphs())
      return false;

  return true;
}

//__________________________________________________________________________________|___________

bool TQGraphMakerAnalysisJob::finalizeGraphs(){
  // store the graphs in the sample folder hierarchy
  if (!getCut()) { return false; }

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

  /* scale and store graphs */
  DEBUGclass("length of graph list is %i", fGraphs.size());
  for (unsigned int i = 0; i < fGraphs.size(); i++) {
    TNamed * graph = (fGraphs)[i];
    if (!graph){ DEBUGclass("Graph is 0!"); };
    /* delete existing graph */
    TObject *g = folder->FindObject(graph->GetName());
    if (g){
      DEBUGclass("removing previous object %s", g->GetName());
      folder->Remove(g);
    }
		// stupidly enough, TGraph resets the axis titles whenever a point is added, so now, we need to copy the axis titles again
		TQHistogramUtils::copyGraphAxisTitles(graph,fGraphTemplates[i]);
    // save the new graph
    DEBUGclass("saving graph %s", graph->GetName());
    folder->Add(graph);
  }

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

  return true;
}

//__________________________________________________________________________________|___________

bool TQGraphMakerAnalysisJob::initializeSampleFolder(TQSampleFolder* sf){
  // initialize this job on a sample folder (taking care of pooling)
  bool pool = false;
  sf->getTagBool(".aj.pool.graphs",pool);
  if(pool && (this->fGraphs.size() == 0)){
    this->initializeGraphs();
    this->poolAt = sf;
  }

  return true;
}

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

void TQGraphMakerAnalysisJob::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
  fGraphs.clear();
}

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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