#include "QFramework/TQEventlistAnalysisJob.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQCut.h"
#include "QFramework/TQAnalysisJob.h"
#include "QFramework/TQCounter.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQTable.h"
#include "TIterator.h"
#include "TList.h"

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

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

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQEventlistAnalysisJob:
//
// For each event list scheduled, a new TQEventlistAnalysisJob will be
// created. The syntax for these files is similar to the one used for
// histogramming with the TQHistoMakerAnalysisJob.
//
// In this example, an event list called "evtlist" is defined with four columns,
// containing run and event numbers, invariant dijet mass (in GeV) and
// pseudorapidity gap between the jets.
//
//    evtlist: Run << RunNumber, Event << EventNumber, \ensuremath{m_{jj}} << Mjj/1000. , \ensuremath{\Delta y_{jj}} << DYjj; 
//
//    @Cut_2jetincl: evtlist; The event list "evtlist" is appended to the cut named "Cut_2jetincl". 
//
// Caution: The TGraphs can become extremely large for large numbers
// of events!
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQEventlistAnalysisJob)

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


//______________________________________________________________________________________________

TQEventlistAnalysisJob::TQEventlistAnalysisJob() : TQAnalysisJob(),
                                                   fEventlist(0),
                                                   fEventIndex(0),
                                                   showWeightColumn(false),
                                                   f_Verbose(false)
{
	// default constructor
}


//______________________________________________________________________________________________

TQEventlistAnalysisJob::TQEventlistAnalysisJob(const TString& name_) : TQAnalysisJob(name_),
                                                                fEventlist(0),
                                                                fEventIndex(0),
                                                                showWeightColumn(false),
                                                                f_Verbose(false)
{
	// default constructor with name
}

//______________________________________________________________________________________________

TQEventlistAnalysisJob * TQEventlistAnalysisJob::getClone(){
  // clone this TQEventlistAnalysisJob
  TQEventlistAnalysisJob* newInstance = new TQEventlistAnalysisJob(this->GetName());
  newInstance->showWeightColumn = this->showWeightColumn;
  for(size_t i=0; i<this->fExpressions.size(); ++i){
    newInstance->fExpressions.push_back(this->fExpressions[i]);
    newInstance->fTitles.push_back(this->fTitles[i]);
  }
  return newInstance;
}

//______________________________________________________________________________________________

void TQEventlistAnalysisJob::reset() {
	// reset this analysis job
  this->fEventIndex = 0;

  TQAnalysisJob::reset();

  this->fExpressions.clear();
  this->fTitles.clear();
  if(fEventlist) delete this->fEventlist;
}


//______________________________________________________________________________________________

void TQEventlistAnalysisJob::addColumn(const TString& expression, const TString& label) {
  // set up tree observables corresponding to expressions
  this->fExpressions.push_back(expression);
  if(!label.IsNull()) this->fTitles.push_back(label);
  else this->fTitles.push_back(expression);
}

//______________________________________________________________________________________________

int TQEventlistAnalysisJob::nColumns() const {
	// get the number of columsn currently booked
  return this->fExpressions.size();
}

//______________________________________________________________________________________________

void TQEventlistAnalysisJob::setWeightColumn(bool weight){
	// toggle the use of a weight column
  this->showWeightColumn = weight;
}

//__________________________________________________________________________________|___________

TObjArray * TQEventlistAnalysisJob::getBranchNames() {
  // return all observable expressions (containing branch names)
  if(!this->fSample){
    throw std::runtime_error("cannot retrieve branches on uninitialized object!");
  }

  TObjArray * bNames = new TObjArray();
  for(size_t i=0; i<this->fObservables.size(); i++){
    TCollection* c = this->fObservables[i]->getBranchNames();
    bNames->AddAll(c);
    delete c;
  }
 
  return bNames;
}


//______________________________________________________________________________________________

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

  // we need a parent cut defining the name of the event list 
  if (!this->getCut()) return false;

  // create a new event list 
  DEBUGclass("allocating table");
  fEventlist = new TQTable(this->GetName());
  fEventlist->clearVlines();
  fEventlist->expand(1000,this->fExpressions.size()+this->showWeightColumn);

  // initialize TQObservables 
  DEBUGclass("preparing observables");
  for (size_t i = 0; i < this->fExpressions.size(); ++i) {
    fEventlist->setEntry(0,i,this->fTitles[i]);
    TQObservable* obs = TQObservable::getObservable(this->fExpressions[i],this->fSample);
    if (!obs) {
      ERRORclass("Failed to obtain observable with expression '%s' for sample '%s' in analysis job '%s'",this->fExpressions[i].Data(),this->fSample->getPath().Data(),this->GetName());
      return false;
    }
    if (!obs->initialize(this->fSample)) {
      ERRORclass("Failed to initialize observable created from expression '%s' for sample '%s' in analysis job '%s'" ,this->fExpressions[i].Data(),this->fSample->getPath().Data(),this->GetName());
      return false;    
    }
    this->fObservables.push_back(obs);
  }
  if(this->showWeightColumn){
    DEBUGclass("handling weight column");
    fEventlist->setEntry(0,this->fObservables.size(),"weight");
  }
 
  // we believe everything is fine 
  return true;
}


//______________________________________________________________________________________________

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

	// clear unused space from the table
  fEventlist->shrink();
 
  // get the cutflow folder 
  TQFolder * evlFolder = this->fSample->getFolder(TString::Format(".eventlists/%s/+",this->getCut()->GetName()));
 
  // stop if we failed to get the folder 
  if (!evlFolder)
    return false;
 
  // remove existing list 
  evlFolder->Remove(evlFolder->FindObject(fEventlist->GetName()));
  // add the list 
  evlFolder->Add(fEventlist);
  fEventlist = NULL;

  return true;
}


//______________________________________________________________________________________________

bool TQEventlistAnalysisJob::execute(double weight) {
	// execute this analysis job on an event and add it to the list
  this->fEventIndex++;
  if(fEventlist->getNrows() <= this->fEventIndex){
    fEventlist->expand(2*this->fEventIndex,this->fObservables.size()+this->showWeightColumn);
  }
  for (size_t i = 0; i < this->fObservables.size(); ++i) {
    double val = 0;
    TRY(
    val = this->fObservables[i]->getValue();
    ,TString::Format("Failed to evaluate observable '%s' at cut '%s'.", fObservables[i]->GetName(), this->getCut()->GetName())
    )
    DEBUGclass("setting entry %d/%d from '%s' to %g",this->fEventIndex,i,this->fObservables[i]->getActiveExpression().Data(),val);
    this->fEventlist->setEntryValue(this->fEventIndex,i,val);
  }
  if(this->showWeightColumn){
    DEBUGclass("setting (weight) entry %d/%d to %g",this->fEventIndex,this->fObservables.size(),weight);
    this->fEventlist->setEntryValue(this->fEventIndex,this->fObservables.size(),weight);
  }
  return true;
}


//__________________________________________________________________________________|___________

void TQEventlistAnalysisJob::setErrorMessage(TString message) {
	// send an 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 TQEventlistAnalysisJob::clearMessages(){
  // clear the error messages
  f_ErrMsg.clearMessages();
}

//__________________________________________________________________________________|___________

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

//______________________________________________________________________________________________

TQEventlistAnalysisJob::~TQEventlistAnalysisJob() {
	// standard destructor
  this->reset();
}

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

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

//__________________________________________________________________________________|___________

int TQEventlistAnalysisJob::importJobsFromTextFiles(const std::vector<TString>& filenames, TQCut* basecut, TQTaggable* aliases, const TString& channelFilter, bool verbose){
  // open a list of files (std::vector), parse all eventlist definitions inside
  // for each assigment encountered matching the channelfilter (or with no channel),
  // create an eventlist job for each eventlist and add it to the basecut
  if(filenames.size() < 1){
    ERRORfunc("importing no eventlists from empty files list!");
    return -1;
  }
  std::map<TString,std::vector<TString> > eventlistDefinitions;
  std::vector<TString> assignments;
  TString buffer;
  for(size_t i=0; i<filenames.size(); i++){
    std::vector<TString>* lines = TQStringUtils::readFileLines(filenames[i]);
    if(!lines){
      if(verbose) ERRORfunc("unable to open file '%s'",filenames[i].Data());
      continue;
    }
    for(size_t j=0; j<lines->size(); j++){
      TString line(lines->at(j));
      TQStringUtils::readBlanks(line);
      if(line.IsNull()) continue;
      if(!line.BeginsWith("@")){
        TString name, def;
        if(!TQStringUtils::readUpTo(line,name,":")){
          if(verbose) ERRORfunc("unable to parse eventlist definition '%s'",line.Data());
          continue;
        }
        TQStringUtils::removeLeading(line,": ");
        TQStringUtils::readUpTo(line,def,";");
        DEBUGclass("found definition: '%s', assigning as '%s'",def.Data(),name.Data());
        eventlistDefinitions[TQStringUtils::trim(name)] = TQStringUtils::split(def,",","{","}");
      } else if(TQStringUtils::removeLeading(line,"@") == 1){ 
        DEBUGclass("found assignment: '%s'",line.Data());
        assignments.push_back(line);
      } else {
        if(verbose) WARNfunc("encountered unknown token: '%s'",line.Data());
      }
    }
    delete lines;
  }

  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,eventlists;
    TQStringUtils::readUpTo(assignment,cuts,":");
    TQStringUtils::readToken(assignment,buffer," :");
    TQStringUtils::readUpTo(assignment,eventlists,";");
    TQStringUtils::readToken(assignment,buffer,"; ");
    DEBUGclass("eventlists: '%s'",eventlists.Data());
    DEBUGclass("cuts: '%s'",cuts.Data());
    DEBUGclass("spare symbols: '%s'",buffer.Data());
    std::vector<TString> vEvtlists = TQStringUtils::split(eventlists,",");
    if(vEvtlists.size() < 1){
      if(verbose) ERRORfunc("no eventlists listed in assignment '%s'",assignments[i].Data());
      continue;
    }
    for(size_t j=0; j<vEvtlists.size(); j++){
      TString evtlist(vEvtlists[j]);
      bool showWeight = (TQStringUtils::removeTrailing(evtlist,"+") > 0);
      std::vector<TString> def = eventlistDefinitions[evtlist];
      if(def.empty()){
        if(verbose) ERRORfunc("unable to find eventlist definition for name '%s', skipping",vEvtlists[j].Data());
        continue;
      }
      TQEventlistAnalysisJob* job = new TQEventlistAnalysisJob(evtlist);
      job->setWeightColumn(showWeight);
      for(size_t i=0; i<def.size(); i++){
        TString col(aliases ? aliases->replaceInTextRecursive(def[i]) : def[i]);
        TString title;
        TQStringUtils::readUpToText(col,title,"<<");
        TQStringUtils::removeLeading(col," <");
        if(!title.IsNull() && ! col.IsNull()){
          job->addColumn(col,title);
        }
      }
      if(job->nColumns() < 1){
        DEBUGclass("error booking eventlist for '%s', function says '%s'",f_ErrMsg.getMessages().Data());
      } else {
        basecut->addAnalysisJob(job,cuts);
        retval += 1;
      }
      delete job;
    }
  } 

  DEBUGclass("end of function call, found %d event lists",retval);
  return retval;
}
 TQEventlistAnalysisJob.cxx:1
 TQEventlistAnalysisJob.cxx:2
 TQEventlistAnalysisJob.cxx:3
 TQEventlistAnalysisJob.cxx:4
 TQEventlistAnalysisJob.cxx:5
 TQEventlistAnalysisJob.cxx:6
 TQEventlistAnalysisJob.cxx:7
 TQEventlistAnalysisJob.cxx:8
 TQEventlistAnalysisJob.cxx:9
 TQEventlistAnalysisJob.cxx:10
 TQEventlistAnalysisJob.cxx:11
 TQEventlistAnalysisJob.cxx:12
 TQEventlistAnalysisJob.cxx:13
 TQEventlistAnalysisJob.cxx:14
 TQEventlistAnalysisJob.cxx:15
 TQEventlistAnalysisJob.cxx:16
 TQEventlistAnalysisJob.cxx:17
 TQEventlistAnalysisJob.cxx:18
 TQEventlistAnalysisJob.cxx:19
 TQEventlistAnalysisJob.cxx:20
 TQEventlistAnalysisJob.cxx:21
 TQEventlistAnalysisJob.cxx:22
 TQEventlistAnalysisJob.cxx:23
 TQEventlistAnalysisJob.cxx:24
 TQEventlistAnalysisJob.cxx:25
 TQEventlistAnalysisJob.cxx:26
 TQEventlistAnalysisJob.cxx:27
 TQEventlistAnalysisJob.cxx:28
 TQEventlistAnalysisJob.cxx:29
 TQEventlistAnalysisJob.cxx:30
 TQEventlistAnalysisJob.cxx:31
 TQEventlistAnalysisJob.cxx:32
 TQEventlistAnalysisJob.cxx:33
 TQEventlistAnalysisJob.cxx:34
 TQEventlistAnalysisJob.cxx:35
 TQEventlistAnalysisJob.cxx:36
 TQEventlistAnalysisJob.cxx:37
 TQEventlistAnalysisJob.cxx:38
 TQEventlistAnalysisJob.cxx:39
 TQEventlistAnalysisJob.cxx:40
 TQEventlistAnalysisJob.cxx:41
 TQEventlistAnalysisJob.cxx:42
 TQEventlistAnalysisJob.cxx:43
 TQEventlistAnalysisJob.cxx:44
 TQEventlistAnalysisJob.cxx:45
 TQEventlistAnalysisJob.cxx:46
 TQEventlistAnalysisJob.cxx:47
 TQEventlistAnalysisJob.cxx:48
 TQEventlistAnalysisJob.cxx:49
 TQEventlistAnalysisJob.cxx:50
 TQEventlistAnalysisJob.cxx:51
 TQEventlistAnalysisJob.cxx:52
 TQEventlistAnalysisJob.cxx:53
 TQEventlistAnalysisJob.cxx:54
 TQEventlistAnalysisJob.cxx:55
 TQEventlistAnalysisJob.cxx:56
 TQEventlistAnalysisJob.cxx:57
 TQEventlistAnalysisJob.cxx:58
 TQEventlistAnalysisJob.cxx:59
 TQEventlistAnalysisJob.cxx:60
 TQEventlistAnalysisJob.cxx:61
 TQEventlistAnalysisJob.cxx:62
 TQEventlistAnalysisJob.cxx:63
 TQEventlistAnalysisJob.cxx:64
 TQEventlistAnalysisJob.cxx:65
 TQEventlistAnalysisJob.cxx:66
 TQEventlistAnalysisJob.cxx:67
 TQEventlistAnalysisJob.cxx:68
 TQEventlistAnalysisJob.cxx:69
 TQEventlistAnalysisJob.cxx:70
 TQEventlistAnalysisJob.cxx:71
 TQEventlistAnalysisJob.cxx:72
 TQEventlistAnalysisJob.cxx:73
 TQEventlistAnalysisJob.cxx:74
 TQEventlistAnalysisJob.cxx:75
 TQEventlistAnalysisJob.cxx:76
 TQEventlistAnalysisJob.cxx:77
 TQEventlistAnalysisJob.cxx:78
 TQEventlistAnalysisJob.cxx:79
 TQEventlistAnalysisJob.cxx:80
 TQEventlistAnalysisJob.cxx:81
 TQEventlistAnalysisJob.cxx:82
 TQEventlistAnalysisJob.cxx:83
 TQEventlistAnalysisJob.cxx:84
 TQEventlistAnalysisJob.cxx:85
 TQEventlistAnalysisJob.cxx:86
 TQEventlistAnalysisJob.cxx:87
 TQEventlistAnalysisJob.cxx:88
 TQEventlistAnalysisJob.cxx:89
 TQEventlistAnalysisJob.cxx:90
 TQEventlistAnalysisJob.cxx:91
 TQEventlistAnalysisJob.cxx:92
 TQEventlistAnalysisJob.cxx:93
 TQEventlistAnalysisJob.cxx:94
 TQEventlistAnalysisJob.cxx:95
 TQEventlistAnalysisJob.cxx:96
 TQEventlistAnalysisJob.cxx:97
 TQEventlistAnalysisJob.cxx:98
 TQEventlistAnalysisJob.cxx:99
 TQEventlistAnalysisJob.cxx:100
 TQEventlistAnalysisJob.cxx:101
 TQEventlistAnalysisJob.cxx:102
 TQEventlistAnalysisJob.cxx:103
 TQEventlistAnalysisJob.cxx:104
 TQEventlistAnalysisJob.cxx:105
 TQEventlistAnalysisJob.cxx:106
 TQEventlistAnalysisJob.cxx:107
 TQEventlistAnalysisJob.cxx:108
 TQEventlistAnalysisJob.cxx:109
 TQEventlistAnalysisJob.cxx:110
 TQEventlistAnalysisJob.cxx:111
 TQEventlistAnalysisJob.cxx:112
 TQEventlistAnalysisJob.cxx:113
 TQEventlistAnalysisJob.cxx:114
 TQEventlistAnalysisJob.cxx:115
 TQEventlistAnalysisJob.cxx:116
 TQEventlistAnalysisJob.cxx:117
 TQEventlistAnalysisJob.cxx:118
 TQEventlistAnalysisJob.cxx:119
 TQEventlistAnalysisJob.cxx:120
 TQEventlistAnalysisJob.cxx:121
 TQEventlistAnalysisJob.cxx:122
 TQEventlistAnalysisJob.cxx:123
 TQEventlistAnalysisJob.cxx:124
 TQEventlistAnalysisJob.cxx:125
 TQEventlistAnalysisJob.cxx:126
 TQEventlistAnalysisJob.cxx:127
 TQEventlistAnalysisJob.cxx:128
 TQEventlistAnalysisJob.cxx:129
 TQEventlistAnalysisJob.cxx:130
 TQEventlistAnalysisJob.cxx:131
 TQEventlistAnalysisJob.cxx:132
 TQEventlistAnalysisJob.cxx:133
 TQEventlistAnalysisJob.cxx:134
 TQEventlistAnalysisJob.cxx:135
 TQEventlistAnalysisJob.cxx:136
 TQEventlistAnalysisJob.cxx:137
 TQEventlistAnalysisJob.cxx:138
 TQEventlistAnalysisJob.cxx:139
 TQEventlistAnalysisJob.cxx:140
 TQEventlistAnalysisJob.cxx:141
 TQEventlistAnalysisJob.cxx:142
 TQEventlistAnalysisJob.cxx:143
 TQEventlistAnalysisJob.cxx:144
 TQEventlistAnalysisJob.cxx:145
 TQEventlistAnalysisJob.cxx:146
 TQEventlistAnalysisJob.cxx:147
 TQEventlistAnalysisJob.cxx:148
 TQEventlistAnalysisJob.cxx:149
 TQEventlistAnalysisJob.cxx:150
 TQEventlistAnalysisJob.cxx:151
 TQEventlistAnalysisJob.cxx:152
 TQEventlistAnalysisJob.cxx:153
 TQEventlistAnalysisJob.cxx:154
 TQEventlistAnalysisJob.cxx:155
 TQEventlistAnalysisJob.cxx:156
 TQEventlistAnalysisJob.cxx:157
 TQEventlistAnalysisJob.cxx:158
 TQEventlistAnalysisJob.cxx:159
 TQEventlistAnalysisJob.cxx:160
 TQEventlistAnalysisJob.cxx:161
 TQEventlistAnalysisJob.cxx:162
 TQEventlistAnalysisJob.cxx:163
 TQEventlistAnalysisJob.cxx:164
 TQEventlistAnalysisJob.cxx:165
 TQEventlistAnalysisJob.cxx:166
 TQEventlistAnalysisJob.cxx:167
 TQEventlistAnalysisJob.cxx:168
 TQEventlistAnalysisJob.cxx:169
 TQEventlistAnalysisJob.cxx:170
 TQEventlistAnalysisJob.cxx:171
 TQEventlistAnalysisJob.cxx:172
 TQEventlistAnalysisJob.cxx:173
 TQEventlistAnalysisJob.cxx:174
 TQEventlistAnalysisJob.cxx:175
 TQEventlistAnalysisJob.cxx:176
 TQEventlistAnalysisJob.cxx:177
 TQEventlistAnalysisJob.cxx:178
 TQEventlistAnalysisJob.cxx:179
 TQEventlistAnalysisJob.cxx:180
 TQEventlistAnalysisJob.cxx:181
 TQEventlistAnalysisJob.cxx:182
 TQEventlistAnalysisJob.cxx:183
 TQEventlistAnalysisJob.cxx:184
 TQEventlistAnalysisJob.cxx:185
 TQEventlistAnalysisJob.cxx:186
 TQEventlistAnalysisJob.cxx:187
 TQEventlistAnalysisJob.cxx:188
 TQEventlistAnalysisJob.cxx:189
 TQEventlistAnalysisJob.cxx:190
 TQEventlistAnalysisJob.cxx:191
 TQEventlistAnalysisJob.cxx:192
 TQEventlistAnalysisJob.cxx:193
 TQEventlistAnalysisJob.cxx:194
 TQEventlistAnalysisJob.cxx:195
 TQEventlistAnalysisJob.cxx:196
 TQEventlistAnalysisJob.cxx:197
 TQEventlistAnalysisJob.cxx:198
 TQEventlistAnalysisJob.cxx:199
 TQEventlistAnalysisJob.cxx:200
 TQEventlistAnalysisJob.cxx:201
 TQEventlistAnalysisJob.cxx:202
 TQEventlistAnalysisJob.cxx:203
 TQEventlistAnalysisJob.cxx:204
 TQEventlistAnalysisJob.cxx:205
 TQEventlistAnalysisJob.cxx:206
 TQEventlistAnalysisJob.cxx:207
 TQEventlistAnalysisJob.cxx:208
 TQEventlistAnalysisJob.cxx:209
 TQEventlistAnalysisJob.cxx:210
 TQEventlistAnalysisJob.cxx:211
 TQEventlistAnalysisJob.cxx:212
 TQEventlistAnalysisJob.cxx:213
 TQEventlistAnalysisJob.cxx:214
 TQEventlistAnalysisJob.cxx:215
 TQEventlistAnalysisJob.cxx:216
 TQEventlistAnalysisJob.cxx:217
 TQEventlistAnalysisJob.cxx:218
 TQEventlistAnalysisJob.cxx:219
 TQEventlistAnalysisJob.cxx:220
 TQEventlistAnalysisJob.cxx:221
 TQEventlistAnalysisJob.cxx:222
 TQEventlistAnalysisJob.cxx:223
 TQEventlistAnalysisJob.cxx:224
 TQEventlistAnalysisJob.cxx:225
 TQEventlistAnalysisJob.cxx:226
 TQEventlistAnalysisJob.cxx:227
 TQEventlistAnalysisJob.cxx:228
 TQEventlistAnalysisJob.cxx:229
 TQEventlistAnalysisJob.cxx:230
 TQEventlistAnalysisJob.cxx:231
 TQEventlistAnalysisJob.cxx:232
 TQEventlistAnalysisJob.cxx:233
 TQEventlistAnalysisJob.cxx:234
 TQEventlistAnalysisJob.cxx:235
 TQEventlistAnalysisJob.cxx:236
 TQEventlistAnalysisJob.cxx:237
 TQEventlistAnalysisJob.cxx:238
 TQEventlistAnalysisJob.cxx:239
 TQEventlistAnalysisJob.cxx:240
 TQEventlistAnalysisJob.cxx:241
 TQEventlistAnalysisJob.cxx:242
 TQEventlistAnalysisJob.cxx:243
 TQEventlistAnalysisJob.cxx:244
 TQEventlistAnalysisJob.cxx:245
 TQEventlistAnalysisJob.cxx:246
 TQEventlistAnalysisJob.cxx:247
 TQEventlistAnalysisJob.cxx:248
 TQEventlistAnalysisJob.cxx:249
 TQEventlistAnalysisJob.cxx:250
 TQEventlistAnalysisJob.cxx:251
 TQEventlistAnalysisJob.cxx:252
 TQEventlistAnalysisJob.cxx:253
 TQEventlistAnalysisJob.cxx:254
 TQEventlistAnalysisJob.cxx:255
 TQEventlistAnalysisJob.cxx:256
 TQEventlistAnalysisJob.cxx:257
 TQEventlistAnalysisJob.cxx:258
 TQEventlistAnalysisJob.cxx:259
 TQEventlistAnalysisJob.cxx:260
 TQEventlistAnalysisJob.cxx:261
 TQEventlistAnalysisJob.cxx:262
 TQEventlistAnalysisJob.cxx:263
 TQEventlistAnalysisJob.cxx:264
 TQEventlistAnalysisJob.cxx:265
 TQEventlistAnalysisJob.cxx:266
 TQEventlistAnalysisJob.cxx:267
 TQEventlistAnalysisJob.cxx:268
 TQEventlistAnalysisJob.cxx:269
 TQEventlistAnalysisJob.cxx:270
 TQEventlistAnalysisJob.cxx:271
 TQEventlistAnalysisJob.cxx:272
 TQEventlistAnalysisJob.cxx:273
 TQEventlistAnalysisJob.cxx:274
 TQEventlistAnalysisJob.cxx:275
 TQEventlistAnalysisJob.cxx:276
 TQEventlistAnalysisJob.cxx:277
 TQEventlistAnalysisJob.cxx:278
 TQEventlistAnalysisJob.cxx:279
 TQEventlistAnalysisJob.cxx:280
 TQEventlistAnalysisJob.cxx:281
 TQEventlistAnalysisJob.cxx:282
 TQEventlistAnalysisJob.cxx:283
 TQEventlistAnalysisJob.cxx:284
 TQEventlistAnalysisJob.cxx:285
 TQEventlistAnalysisJob.cxx:286
 TQEventlistAnalysisJob.cxx:287
 TQEventlistAnalysisJob.cxx:288
 TQEventlistAnalysisJob.cxx:289
 TQEventlistAnalysisJob.cxx:290
 TQEventlistAnalysisJob.cxx:291
 TQEventlistAnalysisJob.cxx:292
 TQEventlistAnalysisJob.cxx:293
 TQEventlistAnalysisJob.cxx:294
 TQEventlistAnalysisJob.cxx:295
 TQEventlistAnalysisJob.cxx:296
 TQEventlistAnalysisJob.cxx:297
 TQEventlistAnalysisJob.cxx:298
 TQEventlistAnalysisJob.cxx:299
 TQEventlistAnalysisJob.cxx:300
 TQEventlistAnalysisJob.cxx:301
 TQEventlistAnalysisJob.cxx:302
 TQEventlistAnalysisJob.cxx:303
 TQEventlistAnalysisJob.cxx:304
 TQEventlistAnalysisJob.cxx:305
 TQEventlistAnalysisJob.cxx:306
 TQEventlistAnalysisJob.cxx:307
 TQEventlistAnalysisJob.cxx:308
 TQEventlistAnalysisJob.cxx:309
 TQEventlistAnalysisJob.cxx:310
 TQEventlistAnalysisJob.cxx:311
 TQEventlistAnalysisJob.cxx:312
 TQEventlistAnalysisJob.cxx:313
 TQEventlistAnalysisJob.cxx:314
 TQEventlistAnalysisJob.cxx:315
 TQEventlistAnalysisJob.cxx:316
 TQEventlistAnalysisJob.cxx:317
 TQEventlistAnalysisJob.cxx:318
 TQEventlistAnalysisJob.cxx:319
 TQEventlistAnalysisJob.cxx:320
 TQEventlistAnalysisJob.cxx:321
 TQEventlistAnalysisJob.cxx:322
 TQEventlistAnalysisJob.cxx:323
 TQEventlistAnalysisJob.cxx:324
 TQEventlistAnalysisJob.cxx:325
 TQEventlistAnalysisJob.cxx:326
 TQEventlistAnalysisJob.cxx:327
 TQEventlistAnalysisJob.cxx:328
 TQEventlistAnalysisJob.cxx:329
 TQEventlistAnalysisJob.cxx:330
 TQEventlistAnalysisJob.cxx:331
 TQEventlistAnalysisJob.cxx:332
 TQEventlistAnalysisJob.cxx:333
 TQEventlistAnalysisJob.cxx:334
 TQEventlistAnalysisJob.cxx:335
 TQEventlistAnalysisJob.cxx:336
 TQEventlistAnalysisJob.cxx:337
 TQEventlistAnalysisJob.cxx:338
 TQEventlistAnalysisJob.cxx:339
 TQEventlistAnalysisJob.cxx:340
 TQEventlistAnalysisJob.cxx:341
 TQEventlistAnalysisJob.cxx:342
 TQEventlistAnalysisJob.cxx:343
 TQEventlistAnalysisJob.cxx:344
 TQEventlistAnalysisJob.cxx:345
 TQEventlistAnalysisJob.cxx:346
 TQEventlistAnalysisJob.cxx:347
 TQEventlistAnalysisJob.cxx:348
 TQEventlistAnalysisJob.cxx:349
 TQEventlistAnalysisJob.cxx:350
 TQEventlistAnalysisJob.cxx:351
 TQEventlistAnalysisJob.cxx:352
 TQEventlistAnalysisJob.cxx:353
 TQEventlistAnalysisJob.cxx:354
 TQEventlistAnalysisJob.cxx:355
 TQEventlistAnalysisJob.cxx:356
 TQEventlistAnalysisJob.cxx:357
 TQEventlistAnalysisJob.cxx:358
 TQEventlistAnalysisJob.cxx:359
 TQEventlistAnalysisJob.cxx:360
 TQEventlistAnalysisJob.cxx:361
 TQEventlistAnalysisJob.cxx:362
 TQEventlistAnalysisJob.cxx:363
 TQEventlistAnalysisJob.cxx:364
 TQEventlistAnalysisJob.cxx:365
 TQEventlistAnalysisJob.cxx:366
 TQEventlistAnalysisJob.cxx:367
 TQEventlistAnalysisJob.cxx:368
 TQEventlistAnalysisJob.cxx:369
 TQEventlistAnalysisJob.cxx:370
 TQEventlistAnalysisJob.cxx:371
 TQEventlistAnalysisJob.cxx:372
 TQEventlistAnalysisJob.cxx:373
 TQEventlistAnalysisJob.cxx:374
 TQEventlistAnalysisJob.cxx:375
 TQEventlistAnalysisJob.cxx:376
 TQEventlistAnalysisJob.cxx:377
 TQEventlistAnalysisJob.cxx:378
 TQEventlistAnalysisJob.cxx:379
 TQEventlistAnalysisJob.cxx:380
 TQEventlistAnalysisJob.cxx:381
 TQEventlistAnalysisJob.cxx:382
 TQEventlistAnalysisJob.cxx:383
 TQEventlistAnalysisJob.cxx:384