#include "TObjArray.h"
#include "TList.h"
#include "TObjString.h"
#include "TFolder.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TProfile.h"
#include "TProfile2D.h"

#include "QFramework/TQHistoMakerAnalysisJob.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQHistogramUtils.h"
#include "QFramework/TQObservable.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQCut.h"
#include "QFramework/TQTaggable.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQUtils.h"

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

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

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQHistoMakerAnalysisJob:
//
// The TQHistoMakerAnalysisJob is the de-facto standard analaysis job for booking histograms.
// The booking can be done with expressions of the following type:
//
// A one-dimensional histogram is defined. The value "Mjj/1000" is
// filled into the histogram, and the label of the x-axis will be
// '\#it{m}_{jj} [GeV]'. Please note that the '#'-symbol is escaped by
// a backslash. If the backslash is omitted, the parser will interpret
// anything following the '#' as a comment and ignore it, resulting in
// a syntax error while parsing this histogram.
//
//    TH1F('Mjj', '', 40, 0., 800.) << (Mjj/1000. : '\#it{m}_{jj} [GeV]');
//
// A one-dimensional histogram with variable binning is defined.
//
//    TH1F('Mjj2', '', {0,200,600,800,1200,2000}) << (Mjj/1000. : '\#it{m}_{jj} [GeV]');
//
// A two-dimensional histogram is defined with labels for the x- and y-axis.
//
//    TH2F('Mjj_DYjj', '', 40, 0., 800., 30, 0., 5.) << (Mjj/1000. : '\#it{m}_{jj} [GeV]', DYjj : '\#it{\#Delta Y}_{jj}');
//
// Two of the above histograms will be attached to the Cut named "Cut_2jetincl" and all descendant cuts.
//
//    @Cut_2jetincl/*: Mjj_DYjj,Mjj2;
//
// Please note that the TQHistoMakerAnalysisJob will also understand
// definitions of TH[1/2/3][D/F/C/I] as well as TProfile and
// TProfile2D.
//
// Additional option for individual histograms can be specified as in the following example:
//
//    TH1F('Mjj', '', 40, 0., 800.) << (Mjj/1000. : '\#it{m}_{jj} [GeV]') << (fillRaw=true, someOtherOption="someSetting");
//
// The content between the last pair of parentheses is read as a list
// of tags (see TQTaggable::importTags). Supported options are then
// applied to all booking instances (i.e. for all different cuts) of
// the particular histogram. Currently supported options include:
//
//    fillRaw=true
//
// Ignore event weights when filling this histogram/profile:
//
//    fillSynchronized=true
//
// Used for profiles and multidimensional histograms, i.e., everything
// but TH1x. When using vector type observables (observables with
// possibly more than one evaluation per event), by default, all
// combinations of values provided by the observables corresponding to
// the individual axes are filled. By specifying this option the
// behavior is changed such that only combinations of values are
// filled where their indices are equal. This then also enforces all
// non-scalar observables for the histogram/profile to have the same
// number of evaluations (same 'length' of the vector/list of values
// they represent). Scalar type observables are implicitly expanded to
// match the size of the vector observables as if it would return the
// same value for every index.
//
//    weightExpression="myFancyWeight"
//
// Similar to a weight expression used in a cut but only applied to
// the particular histogram. If "myFancyWeight" corresponds to a
// vector type observable, its number of evaluations must be equal to
// the number of evaluations of the regular observables used for this
// histogram/profile. For multidimensional histograms and profiles the
// use of a vector valued weight is only supported in combination with
// fillSynchronized=true and enforces the weight observable to be of
// equal length as the regular (non-scalar) observables
//
////////////////////////////////////////////////////////////////////////////////////////////////

TQMessageStream TQHistoMakerAnalysisJob::f_ErrMsg(new std::stringstream());
bool TQHistoMakerAnalysisJob::g_useHistogramObservableNames(false);
TString TQHistoMakerAnalysisJob::gDefaultAuthor = "histoJob";

ClassImp(TQHistoMakerAnalysisJob)

//__________________________________________________________________________________|___________

void TQHistoMakerAnalysisJob::setDefaultAuthor(const TString& name){
  // change the default histogram author tag
  TQHistoMakerAnalysisJob::gDefaultAuthor = name;
}

//__________________________________________________________________________________|___________

TQHistoMakerAnalysisJob::TQHistoMakerAnalysisJob() :
TQAnalysisJob(TQHistoMakerAnalysisJob::gDefaultAuthor.Data()),
  f_Verbose(0),
  poolAt(NULL)
{
  // standard constructor
}

//__________________________________________________________________________________|___________

TQHistoMakerAnalysisJob::TQHistoMakerAnalysisJob(TQHistoMakerAnalysisJob* other) :
  TQAnalysisJob(other ? other->GetName() : TQHistoMakerAnalysisJob::gDefaultAuthor.Data()),
  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(TQHistogramUtils::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]);
    }
    this->fWeightExpressions.push_back(other->fWeightExpressions[i]);
  }
}

//__________________________________________________________________________________|___________

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


//__________________________________________________________________________________|___________

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


//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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


//__________________________________________________________________________________|___________

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


//__________________________________________________________________________________|___________

void TQHistoMakerAnalysisJob::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);
      fWeightExpressions.erase(fWeightExpressions.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 TQHistoMakerAnalysisJob::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;
  }

  TH1 * histo = TQHistogramUtils::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::INFO,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, "<<", "([{'\"", ")]}'\"");
  std::vector<TString> settingTokens = TQStringUtils::tokenizeVector(definition, "<<", true, "()[]{}", "\"\"''");
  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 or malformated 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> titles;
  std::vector<std::vector<TString> > labels ;
  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::ERROR,this->Class(),__FUNCTION__,"':' expected after expression");
        DEBUGclass("':' expected after expression");
        delete histo;
        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;
    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));
    labels.push_back(binLabels);
    DEBUGclass("found expression and title: '%s' and '%s'",expr.Data(),title.Data());
  }

  // histogram properties
  TString name = histo->GetName();
  int dim = TQHistogramUtils::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++) {
    if (i == 0) {
      setupAxis(histo->GetXaxis(),titles[i],exprs[i],labels[i]);
    }
    if (i == 1) {
      setupAxis(histo->GetYaxis(),titles[i],exprs[i],labels[i]);
    }
    if (i == 2) {
      setupAxis(histo->GetZaxis(),titles[i],exprs[i],labels[i]);
    }
  }

  fExpressions.push_back(exprs);
  fHistoTypes.push_back(TQHistogramUtils::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));
  //@tag: [weightExpression] This tag is read from an additional option block in the histogram definition (see tag 'fillSynchronized'). It allows to specify an expression which is multiplied on top of the weight provided by the respective cut. If a vector observable is used for the values to be filled into the histogram, the weight expression needs to either correspond to a scalar observable, or to a vector observable with the same number of evaluations as the value observable. If the latter case (vector valued weight) is used for multidimensional histograms (TH2, TH3), 'fillSynchronized=true' must be specified or an error will be thrown  (reason: if every combination of evaluations of vector observables is filled the matching to a particular weight for this combination is non-trivial. If there is a particular use case where this is needed, please address suggestions to the core developers)
  const TString wExpr(aliases ? aliases->replaceInTextRecursive(options.getTagStringDefault("weightExpression","")) : options.getTagStringDefault("weightExpression",""));
  fWeightExpressions.push_back(wExpr);
  //if (options.hasTagString("weightExpression")) {
  //  std::cout<<"found histogram with weight expression '"<<options.getTagStringDefault("weightExpression","")<<"'"<<std::endl;
  //}
  //@tag: [fillRaw] This tag is read from an additional option block in the histogam definition (see tag 'fillSynchronized'). It causes all event weights to be ignored for the corresponding histogram. Please note that if a dedicated weight expression (see tag 'weightExpression') is provided it will still be used. Default: false
  fFillRaw.push_back(options.getTagBoolDefault("fillRaw",false));

  return true;
}

//__________________________________________________________________________________|___________

void TQHistoMakerAnalysisJob::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 TQHistoMakerAnalysisJob::printBookingTeX(const TString& moretext) {
  // print booked histograms (LaTeX format)
  std::cout << "\\begin{tabular}{l l l l l}" << std::endl;;
  std::cout << "\\multicolumn{2}{l}{\\bfseries Booked Histograms}" << " & \\multicolumn{2}{l}{" << moretext  << "} & Options \\tabularnewline" << std::endl;
  for (size_t i = 0;i < fHistogramTemplates.size(); i++) {
    TString exp(TQStringUtils::concat(fExpressions.at(i),","));
    exp.ReplaceAll("$","\\$");
    //create a list of additional options
    std::vector<TString> options;
    if (fFillSynchronized.size()>i && fFillSynchronized.at(i)) options.push_back(TString("fillSynchronized=true"));
    if (fFillRaw.size()>i && fFillRaw.at(i)) options.push_back(TString("fillRaw=true"));
    if (fWeightExpressions.size()>i && fWeightExpressions.at(i).Length()>0) options.push_back(TString::Format("weightExpression='%s'",fWeightExpressions.at(i).Data()).ReplaceAll("$","\\$"));
    //merge the list into a single string
    TString optionString(TQStringUtils::concat(options,","));
    std::cout << fHistogramTemplates.at(i)->GetName() << " & "
              << fHistogramTemplates.at(i)->GetTitle()  << " & "
              << TQHistogramUtils::getDetailsAsString(fHistogramTemplates.at(i), 2)  << " & "
              << exp << " & "
              << (optionString.Length()>0 ? optionString.Data() : "");
    if(i != fHistogramTemplates.size() -1) std::cout << " \\tabularnewline ";
    std::cout<< std::endl;
  }
  std::cout << "\\end{tabular}" << std::endl;
}

//__________________________________________________________________________________|___________

void TQHistoMakerAnalysisJob::printBooking(const TString& moretext) {
  // print booked histograms
  std::cout << TQStringUtils::makeBoldBlue("Booked Histograms") << " " << TQStringUtils::makeBoldWhite(moretext) << std::endl;
  for (size_t i = 0;i < fHistogramTemplates.size(); i++) {
    //compile list of additional options for this histogram
    std::vector<TString> options;
    if (fFillSynchronized.size()>i && fFillSynchronized.at(i)) options.push_back(TString("fillSynchronized=true"));
    if (fFillRaw.size()>i && fFillRaw.at(i)) options.push_back(TString("fillRaw=true"));
    if (fWeightExpressions.size()>i && fWeightExpressions.at(i).Length()>0) options.push_back(TString::Format("weightExpression='%s'",fWeightExpressions.at(i).Data()).ReplaceAll("$","\\$"));

    std::cout << TQStringUtils::fixedWidth(fHistogramTemplates.at(i)->GetName(),20)
              << TQStringUtils::fixedWidth(fHistogramTemplates.at(i)->GetTitle(),20)
              << TQHistogramUtils::getDetailsAsString(fHistogramTemplates.at(i), 2)
              << " << " << TQStringUtils::concat(fExpressions.at(i)," : ");
    if (options.size()>0) std::cout << " << ( " << TQStringUtils::concat(options,",") << " ) "; //append option block if applicable
              std::cout << std::endl;
  }
}


//__________________________________________________________________________________|___________

bool TQHistoMakerAnalysisJob::execute(double weight) {
  DEBUGclass("%s: filling histograms for event...",this->GetName());
  // execute this analysis job, filling all histograms
  int nEvals = 0;
  int nWeightEvals = 0;

  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
    // DEBUGclass("switching for histo type");
    switch (fHistoTypes[i]) {
    case -2:
      if (this->fFillSynchronized[i]) {
        TRY(
        nEvals = std::max(std::max(fObservables[i][0]->getNevaluations(),fObservables[i][1]->getNevaluations()),fObservables[i][2]->getNevaluations());
        ,TString::Format("Failed to get number of evaluations from at least one of the observables '%s', '%s', '%s' for filling histogram '%s' at cut '%s'.", fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), fObservables[i][2]->GetName(), fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        //at this point we should be safe calling getNevaluations
        if (fObservables[i][0]->getNevaluations() != nEvals &&  fObservables[i][0]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        if (fObservables[i][1]->getNevaluations() != nEvals &&  fObservables[i][1]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        if (fObservables[i][2]->getNevaluations() != nEvals &&  fObservables[i][2]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1 && nWeightEvals != nEvals) {
          throw std::runtime_error( TString::Format("Histogram specific weight is neither scalar nor does the number of evaluations of the responsible observable (%d) match the number of evaluations of the value observable(s) (%d). Please check the definition of histogram '%s' with weight observable '%s'! ",nWeightEvals,nEvals,fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }

        TRY(
        for (int a = 0; a<nEvals; ++a) {
          ((TProfile2D*)(fHistograms[i]))->Fill(fObservables[i][0]->getValueAt(fObservables[i][0]->getNevaluations()==1?0:a),
                                                fObservables[i][1]->getValueAt(fObservables[i][1]->getNevaluations()==1?0:a),
                                                fObservables[i][2]->getValueAt(fObservables[i][2]->getNevaluations()==1?0:a),
                                                (this->fFillRaw[i]? 1. : weight*fSample->getNormalisation())
                                                * ( fWeightObservables[i]?fWeightObservables[i]->getValueAt(std::min(a,std::max(0,nWeightEvals-1)) ) : 1.) );
        }
        ,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())
        )

      } else { //filling every combination of entries provided by the different (vector) observables
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1) {
          throw std::runtime_error( TString::Format("Vector type observables cannot be used as entry specific weights for multidimensional histograms / profiles unless synchronized filling mode is chosen. Please verify your additional options for histogram '%s', weight observable '%s'",fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }
        TRY(
        for (int a = 0; a<fObservables[i][0]->getNevaluations(); a++) {
        for (int b = 0; b<fObservables[i][1]->getNevaluations(); b++) {
        for (int c = 0; c<fObservables[i][2]->getNevaluations(); c++) {
          ((TProfile2D*)(fHistograms[i]))->Fill(fObservables[i][0]->getValueAt(a),
                                                fObservables[i][1]->getValueAt(b),
                                                fObservables[i][2]->getValueAt(c),
                                                (this->fFillRaw[i]? 1. : weight*fSample->getNormalisation())
                                                * ( fWeightObservables[i] ? fWeightObservables[i]->getValueAt(0)  : 1. )   );
        }}}
        ,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())
        )

      }
      break;
    case -1:
      if (this->fFillSynchronized[i]) {
        TRY(
        nEvals = std::max(fObservables[i][0]->getNevaluations(),fObservables[i][1]->getNevaluations());
        ,TString::Format("Failed to get number of evaluations from at least one of the observables '%s', '%s' for filling histogram '%s' at cut '%s'.", fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (fObservables[i][0]->getNevaluations() != nEvals &&  fObservables[i][0]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        if (fObservables[i][1]->getNevaluations() != nEvals &&  fObservables[i][1]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1 && nWeightEvals != nEvals) {
          throw std::runtime_error( TString::Format("Histogram specific weight is neither scalar nor does the number of evaluations of the responsible observable (%d) match the number of evaluations of the value observable(s) (%d). Please check the definition of histogram '%s' with weight observable '%s'! ",nWeightEvals,nEvals,fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }

        TRY(
        for (int a = 0; a<nEvals; a++) {
          ((TProfile*)(fHistograms[i]))->Fill(fObservables[i][0]->getValueAt(fObservables[i][0]->getNevaluations()==1?0:a),
                                              fObservables[i][1]->getValueAt(fObservables[i][1]->getNevaluations()==1?0:a),
                                              ( this->fFillRaw[i]? 1. : weight*fSample->getNormalisation() )
                                              * ( fWeightObservables[i]?fWeightObservables[i]->getValueAt(std::min(a,std::max(0,nWeightEvals-1)) ) : 1.) );
        }
        ,TString::Format("Failed to fill histogram '%s' using the observables '%s', '%s' at cut '%s'.", fHistograms[i]->GetName(), fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), this->getCut()->GetName())
        )
      } else { //filling every combination of entries provided by the different (vector) observables
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1) {
          throw std::runtime_error( TString::Format("Vector type observables cannot be used as entry specific weights for multidimensional histograms / profiles unless synchronized filling mode is chosen. Please verify your additional options for histogram '%s', weight observable '%s'",fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }
        TRY(
        for (int a = 0; a<fObservables[i][0]->getNevaluations(); a++) {
        for (int b = 0; b<fObservables[i][1]->getNevaluations(); b++) {
          ((TProfile*)(fHistograms[i]))->Fill(fObservables[i][0]->getValueAt(a),
                                                fObservables[i][1]->getValueAt(b),
                                                ( this->fFillRaw[i]? 1. : weight*fSample->getNormalisation() )
                                                * ( fWeightObservables[i] ? fWeightObservables[i]->getValueAt(0)  : 1. )   );
        }}
        ,TString::Format("Failed to fill histogram '%s' using the observables '%s', '%s' at cut '%s'.", fHistograms[i]->GetName(), fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), this->getCut()->GetName())
        )
      }
      break;
    case 1:
      {
        // DEBUGclass("found 1D-histogram");
#ifdef _DEBUG_
        // a set protections only active during debugging
        if(!this->fHistograms[i]){
          throw std::runtime_error("histogram slot is empty!");
        }
        if(this->fObservables[i].size() < 1){
          throw std::runtime_error("no observable found for this histogram!");
        } else if(!this->fObservables[i][0]){
          throw std::runtime_error("observable slot for histogram is empty!");
        } else if(fObservables[i].size() != 1){
          throw std::runtime_error("wrong number of observables for one-dimensional histogram!");
        }
#endif
        DEBUGclass("evaluating observable at %p",fObservables[i][0]);
        DEBUGclass("observable is '%s' of type '%s'",fObservables[i][0]->GetName(),fObservables[i][0]->ClassName());
        //        try {
        TRY(
        nEvals = fObservables[i][0]->getNevaluations();
        ,TString::Format("Failed to get number of evaluations from observable '%s' for filling histogram '%s' at cut '%s'.", fObservables[i][0]->GetName(), fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1 && nWeightEvals != nEvals) {
          throw std::runtime_error( TString::Format("Histogram specific weight is neither scalar nor does the number of evaluations of the responsible observable (%d) match the number of evaluations of the value observable(s) (%d). Please check the definition of histogram '%s' with weight observable '%s'! ",nWeightEvals,nEvals,fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }

          TRY(
          for (int a=0; a<fObservables[i][0]->getNevaluations(); a++) {
            const double val = fObservables[i][0]->getValueAt(a);
            DEBUGclass("done evaluating");
            DEBUGclass("filling histogram '%s' from '%s' with value %f %s",fHistograms[i]->GetName(),fObservables[i][0]->getActiveExpression().Data(),val, (fWeightObservables[i]? TString::Format("and individual weight %f",fWeightObservables[i]->getValueAt( std::min(a,std::max(0,nWeightEvals-1)) )).Data() : "") );
            fHistograms[i]->Fill(val,
                                  ( this->fFillRaw[i]? 1. : weight*fSample->getNormalisation() ) * ( fWeightObservables[i]?fWeightObservables[i]->getValueAt(std::min(a,std::max(0,nWeightEvals-1)) ) : 1.)  );
          }
          ,TString::Format("Failed to fill histogram '%s' using the observable '%s' at cut '%s'.", fHistograms[i]->GetName(), fObservables[i][0]->GetName(), this->getCut()->GetName())
          )
//        } catch (const std::exception& e){
//          BREAK("ERROR in '%s': %s",fObservables[i][0]->GetName(),e.what());
//        }
      }
      break;
    case 2:
    if (this->fFillSynchronized[i]) {
        TRY(
        nEvals = std::max(fObservables[i][0]->getNevaluations(),fObservables[i][1]->getNevaluations());
        ,TString::Format("Failed to get number of evaluations from at least one of the observables '%s', '%s' for filling histogram '%s' at cut '%s'.", fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (fObservables[i][0]->getNevaluations() != nEvals &&  fObservables[i][0]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        if (fObservables[i][1]->getNevaluations() != nEvals &&  fObservables[i][1]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1 && nWeightEvals != nEvals) {
          throw std::runtime_error( TString::Format("Histogram specific weight is neither scalar nor does the number of evaluations of the responsible observable (%d) match the number of evaluations of the value observable(s) (%d). Please check the definition of histogram '%s' with weight observable '%s'! ",nWeightEvals,nEvals,fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }

        TRY(
        for (int a = 0; a<nEvals; a++) {
          ((TH2*)(fHistograms[i]))->Fill(fObservables[i][0]->getValueAt(fObservables[i][0]->getNevaluations()==1?0:a),
                                              fObservables[i][1]->getValueAt(fObservables[i][1]->getNevaluations()==1?0:a),
                                              ( this->fFillRaw[i]? 1. : weight*fSample->getNormalisation() )
                                              * ( fWeightObservables[i]?fWeightObservables[i]->getValueAt(std::min(a,std::max(0,nWeightEvals-1)) ) : 1.) );
        }
        ,TString::Format("Failed to fill histogram '%s' using the observables '%s', '%s' at cut '%s'.", fHistograms[i]->GetName(), fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), this->getCut()->GetName())
        )
      } else { //filling every combination of entries provided by the different (vector) observables
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1) {
          throw std::runtime_error( TString::Format("Vector type observables cannot be used as entry specific weights for multidimensional histograms / profiles unless synchronized filling mode is chosen. Please verify your additional options for histogram '%s', weight observable '%s'",fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }
        TRY(
        for (int a = 0; a<fObservables[i][0]->getNevaluations(); a++) {
        for (int b = 0; b<fObservables[i][1]->getNevaluations(); b++) {
          ((TH2*)(fHistograms[i]))->Fill(fObservables[i][0]->getValueAt(a),
                                                fObservables[i][1]->getValueAt(b),
                                                ( this->fFillRaw[i]? 1. : weight*fSample->getNormalisation() )
                                                * ( fWeightObservables[i] ? fWeightObservables[i]->getValueAt(0)  : 1. )   );
        }}
        ,TString::Format("Failed to fill histogram '%s' using the observables '%s', '%s' at cut '%s'.", fHistograms[i]->GetName(), fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), this->getCut()->GetName())
        )
      }
      break;
    case 3:
      if (this->fFillSynchronized[i]) {
        TRY(
        nEvals = std::max(std::max(fObservables[i][0]->getNevaluations(),fObservables[i][1]->getNevaluations()),fObservables[i][2]->getNevaluations());
        ,TString::Format("Failed to get number of evaluations from at least one of the observables '%s', '%s', '%s' for filling histogram '%s' at cut '%s'.", fObservables[i][0]->GetName(), fObservables[i][1]->GetName(), fObservables[i][2]->GetName(), fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (fObservables[i][0]->getNevaluations() != nEvals &&  fObservables[i][0]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        if (fObservables[i][1]->getNevaluations() != nEvals &&  fObservables[i][1]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        if (fObservables[i][2]->getNevaluations() != nEvals &&  fObservables[i][2]->getNevaluations() != 1) throw std::runtime_error("Cannot perform synchonized histogram filling: Number of evaluations do not match!");
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1 && nWeightEvals != nEvals) {
          throw std::runtime_error( TString::Format("Histogram specific weight is neither scalar nor does the number of evaluations of the responsible observable (%d) match the number of evaluations of the value observable(s) (%d). Please check the definition of histogram '%s' with weight observable '%s'! ",nWeightEvals,nEvals,fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }

        TRY(
        for (int a = 0; a<nEvals; ++a) {
          ((TH3*)(fHistograms[i]))->Fill(fObservables[i][0]->getValueAt(fObservables[i][0]->getNevaluations()==1?0:a),
                                                fObservables[i][1]->getValueAt(fObservables[i][1]->getNevaluations()==1?0:a),
                                                fObservables[i][2]->getValueAt(fObservables[i][2]->getNevaluations()==1?0:a),
                                                (this->fFillRaw[i]? 1. : weight*fSample->getNormalisation() )
                                                * ( fWeightObservables[i]?fWeightObservables[i]->getValueAt(std::min(a,std::max(0,nWeightEvals-1)) ) : 1.) );
        }
        ,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())
        )
      } else { //filling every combination of entries provided by the different (vector) observables
        TRY(
        nWeightEvals = fWeightObservables[i] ? fWeightObservables[i]->getNevaluations() : 1;
        ,TString::Format("Failed to get number of evaluations from histogram-entry-weight observable '%s' for filling histogram '%s' at cut '%s'", fWeightObservables[i]?fWeightObservables[i]->GetName():"", fHistograms[i]->GetName(), this->getCut()->GetName())
        )
        if (nWeightEvals != 1) {
          throw std::runtime_error( TString::Format("Vector type observables cannot be used as entry specific weights for multidimensional histograms / profiles unless synchronized filling mode is chosen. Please verify your additional options for histogram '%s', weight observable '%s'",fHistograms[i]->GetName(),fWeightObservables[i]?fWeightObservables[i]->GetName():"").Data());
        }
        TRY(
        for (int a = 0; a<fObservables[i][0]->getNevaluations(); ++a) {
        for (int b = 0; b<fObservables[i][1]->getNevaluations(); ++b) {
        for (int c = 0; c<fObservables[i][2]->getNevaluations(); ++c) {
          ((TH3*)(fHistograms[i]))->Fill(fObservables[i][0]->getValueAt(a),
                                                fObservables[i][1]->getValueAt(b),
                                                fObservables[i][2]->getValueAt(c),
                                                ( this->fFillRaw[i]? 1. : weight*fSample->getNormalisation() )
                                                * ( fWeightObservables[i] ? fWeightObservables[i]->getValueAt(0)  : 1. )  );
        }}}
        ,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;
}

//__________________________________________________________________________________|___________

TObjArray * TQHistoMakerAnalysisJob::getBranchNames() {
  // retrieve the list of branch names used by this job
  if(!this->fSample){
    throw std::runtime_error(TString::Format("TQHistoMakerAnalysisJob '%s': cannot retrieve branches on uninitialized object!", this->GetName()).Data());
  }
  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 TQHistoMakerAnalysisJob::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){//can this really happen? TQObservable::getObservable should always fall back to an instance of TQTreeFormulaObservable created via a factory (this might not be correct, but at least obs should never be a null-pointer)
        DEBUGclass("creating const observable");
        obs = TQObservable::getObservable("Const:nan",this->fSample);
        obs->initialize(this->fSample);
      }
      observables.push_back(obs);
    }
    this->fObservables.push_back(observables);
  }
  //get observables for individual weights if needed
  for (unsigned  int i=0; i< fWeightExpressions.size(); ++i) {
    if (fWeightExpressions[i].Length()<1) {
      fWeightObservables.push_back(NULL);
      continue;
    }

    TQObservable* wObs = TQObservable::getObservable(fWeightExpressions[i],this->fSample);
      if(wObs){
        DEBUGclass("initializing...");
        if (!wObs->initialize(this->fSample)) {
          ERRORclass("Failed to initialize weight observable created from expression '%s' for sample '%s' in TQHistomakerAnalysisJob '%s' for histogram named '%s'",this->fWeightExpressions[i].Data(), this->fSample->getPath().Data(), this->GetName(), this->fHistograms[i]->GetName());
          success=false;
        }
        DEBUGclass("initialized observable '%s' of type '%s' with '%s'",
                   wObs->getExpression().Data(),
                   wObs->ClassName(),
                   wObs->getActiveExpression().Data());
      }
      if(!wObs){//can this really happen? TQObservable::getObservable should always fall back to an instance of TQTreeFormulaObservable created via a factory (this might not be correct, but at least obs should never be a null-pointer)
        DEBUGclass("creating const observable");
        wObs = TQObservable::getObservable("Const:nan",this->fSample);
        wObs->initialize(this->fSample);
      }
      fWeightObservables.push_back(wObs);

  }
  DEBUG("successfully initialized histogram job");
  return success;
}

//__________________________________________________________________________________|___________

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

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

  }
}


//__________________________________________________________________________________|___________

bool TQHistoMakerAnalysisJob::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();
  for (unsigned int i = 0; i < fWeightObservables.size(); ++i) {
      if (fWeightObservables[i]) fWeightObservables[i]->finalize(); //weight observables are optional and might be just dummy entries (i.e. null pointers)!
  }
  this->fWeightObservables.clear();

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

  return true;
}

//__________________________________________________________________________________|___________

bool TQHistoMakerAnalysisJob::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("%s: successfully created folder %s for cut %s", this->GetName(),poolAt->getPath().Data(), getCut()->GetName());

  /* scale and store histograms */
  DEBUGclass("length of histogram list is %i", fHistograms.size());
  for (unsigned int i = 0; i < fHistograms.size(); i++) {
    TH1 * histo = (fHistograms)[i];
    if (!histo){ DEBUGclass("Histogram is 0!"); };
    /* delete existing histogram */
    TObject *h = folder->FindObject(histo->GetName());
    if (h){
      std::stringstream warnmessage;
      warnmessage << "A histogram with the name '" << h->GetName() << "' is already in the sample folder. This can happen when you try to book the same histogram multiple times at the same cut. Authors are:\n";
      TQIterator itr(folder->getListOfKeys(".author.*"), true);
      while (itr.hasNext()) {
	TObject* obj = itr.readNext();
	warnmessage << obj->GetName() << "\t" << folder->getTagStringDefault(obj->GetName(),"") << "\n";
      }
      warnmessage << "Please check your histogram file. Removing previous object for now.";
      folder->Remove(h);
      WARNclass(warnmessage.str().c_str());
    }
    /* save the new histogram */
    DEBUGclass("saving histogram %s", histo->GetName());
    folder->Add(histo);
  }

  /* delete the list of histograms */
  this->fHistograms.clear();
  folder->setTagBool(TString::Format(".author.%s",this->GetName()),true);
  if(this->poolAt){
    folder->setTagString(TString::Format(".author.%s.pool",this->GetName()),this->poolAt->getPath());    
  }
  this->poolAt = NULL;

  return true;
}

//__________________________________________________________________________________|___________

bool TQHistoMakerAnalysisJob::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 TQHistoMakerAnalysisJob::finalizeSampleFolder(TQSampleFolder* sf){
  // finalize this job on a sample folder (taking care of pooling)
  if(sf == this->poolAt)
    return this->finalizeHistograms();
  return true;
}

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

void TQHistoMakerAnalysisJob::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 TQHistoMakerAnalysisJob::importJobsFromTextFiles(const TString& files, TQCut* 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 TQHistoMakerAnalysisJob::importJobsFromTextFiles(filenames,basecut,channelFilter,verbose);
}

//__________________________________________________________________________________|___________

int TQHistoMakerAnalysisJob::importJobsFromTextFiles(const TString& files, TQCut* 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 TQHistoMakerAnalysisJob::importJobsFromTextFiles(filenames,basecut,aliases,channelFilter,verbose);
}

//__________________________________________________________________________________|___________

int TQHistoMakerAnalysisJob::importJobsFromTextFiles(const std::vector<TString>& filenames, TQCut* 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 TQHistoMakerAnalysisJob::importJobsFromTextFiles(filenames, basecut, NULL, channelFilter, verbose);
}

//__________________________________________________________________________________|___________

int TQHistoMakerAnalysisJob::importJobsFromTextFiles(const std::vector<TString>& filenames, TQCut* 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;
    }
    TQHistoMakerAnalysisJob* job = new TQHistoMakerAnalysisJob();
    job->SetName(TQHistoMakerAnalysisJob::gDefaultAuthor);
    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;
}

//__________________________________________________________________________________|___________

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