#include "QFramework/TQAnalysisJob.h"
#include "QFramework/TQCompiledCut.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQLibrary.h"

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

#include <stdexcept>

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQAnalysisJob:
//
// The TQAnalysisJob class is the base class for every implementation of an analysis running
// on a set of samples. The idea of this class is to have a common class for encapsulating 
// analysis implementations. The most important methods for the user it introduces are:
//
// - initialize(...) called before a new sample is analyzed
// - execute(...) called for every event in the sample
// - finalize() called after the last event in the sample was analyzed
//
// In this sense, it is similar to a TSelector (Begin(...) <-> initialize(...), Process(...)
// <-> execute(...), Terminate(...) <-> finalize()). One important difference is, that you
// don't need to do your event selection in the implementation of this class, but you rather
// attach an anaylsis job to an instance of TQCompiledCut, which is responsible for the event
// selection on a more general level. You can attach more than one analysis job to a cut and
// you can attach one analysis job to more than one cuts (the analysis job is then cloned for
// each cut it is attached to).
//
// In your individual implementation of a subclass of this class you may access after init-
// ialization the TQSample or its TTree by using the protected member fields fTree and fSample
// (please take care not to change these pointers).
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQAnalysisJob)

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"

//__________________________________________________________________________________|___________

TQAnalysisJob::TQAnalysisJob() : TNamed("TQAnalysisJob", "") {
  // Default constructor of TQAnalysisJob class: a new instance of TQAnalysisJob
  // is created and reset. The new instance will be named "TQAnalysisJob".
  reset();
}


//__________________________________________________________________________________|___________

TQAnalysisJob::TQAnalysisJob(const TString& name_) : TNamed(name_.Data(), "") {
  // Constructor of TQAnalysisJob class: a new instance of TQFolder is created and
  // reset. The new instance will be named as specified by the parameter "name_"

  reset();
}


//__________________________________________________________________________________|___________

void TQAnalysisJob::reset() {
  // Reset this analysis job (this method may be overriden by a specific implemen-
  // tation of an analysis job). This method is called after an analysis job was
  // cloned
  fCut = 0;
  fSample = 0;
}

//__________________________________________________________________________________|___________

void TQAnalysisJob::copyTransientMembersFrom(TQAnalysisJob* other) {
  // copy the transient data members from another analysis job
  this->fCut = other->fCut;
}


//__________________________________________________________________________________|___________

TQAnalysisJob * TQAnalysisJob::getClone() {
  // Clone and reset (by calling reset()) this analysis job. This method is called
  // when an analysis job is attached to a cut (instance of TQCompiledCut). It
  // makes sure that an analysis job running at different cut stages is represented
  // by different instances of this class, even if the same instance was passed to
  // be attached to different cuts.

  /* clone this job */ 
  TQAnalysisJob * clone = (TQAnalysisJob*)this->Clone();

  /* reset the clone */
  clone->reset();

  clone->copyTransientMembersFrom(this);

  /* return the clone */
  return clone;

}


//__________________________________________________________________________________|___________

bool TQAnalysisJob::execute(double weight) {
  // Execute this analysis job on one event (this method is to be overwritten by a
  // specific implementation of an analysis job). This method is called for every
  // event of the sample to be analyzed (please note: as in most of the cases an
  // analysis job will be attached to a certain cut, this method will only be
  // called for events passing its selection criteria). You may indicate success
  // or failure by returning true or false respectively

  return true;
}


//__________________________________________________________________________________|___________

TString TQAnalysisJob::getDescription() {
  // Return a short description of this analysis job

  return "an analysis job template doing nothing";
}


//__________________________________________________________________________________|___________

void TQAnalysisJob::setCut(TQCompiledCut * cut_) {
  // Set the cut instance this analysis job is attached to. Please note: an
  // analysis job has to be attached to exactly one cut instance

  fCut = cut_;
}


//__________________________________________________________________________________|___________

TQCompiledCut * TQAnalysisJob::getCut() {
  // Return the cut instance this analysis job is attached to
  return fCut;
}


//______________________________________________________________________________________________

void TQAnalysisJob::print(const TString& options){
	// print the name of this analysis job
  std::cout << this->GetName() << ": " << "no details available";
}

//______________________________________________________________________________________________

TObjArray * TQAnalysisJob::getBranchNames() {
  // Return all used TTree branches in a TObjArray* of TString*
  // The strings should include all used branch names,
  // but can also include formulas, number, etc.

  TObjArray * bNames = new TObjArray();

  // Example:

  //TString * names = new TString("(sqrt(2 * lepPt1 * MET * (1 - cos(MET_phi - lepPhi1))) / 1000.");
  //bNames -> Add((TObject*) names);

  // This would be ok to book the branches lepPt1, MET, MET_phi and lepPhi1

  return bNames;
}

//__________________________________________________________________________________|___________

bool TQAnalysisJob::initialize(TQSample * sample) {
  // Initialize this analysis job on a sample to be analyzed. Try to get a tree
  // token from the sample (by calling TQSample::getTreeToken()) and return true
  // if this initialization process succeeded, return false otherwise. Set the
  // protected variables fSample (TQSample*, pointing to the sample to be
  // analyzed), fTree (TTree*, pointing to the ROOT tree of this sample) to be
  // accessible in implementations of a subclass. For a specific implemenation of
  // an analysis job, this method has to be called before performing specific
  // initialization. In an inherited class implementation do for example
  //
  // bool initialize(TQSample * sample) {
  // if (TQAnalysisJob::initialize(sample)) {
  // /* make your specific initialization here */
  // return true;
  // } else {
  // return false;
  // }
  // }

  if (!sample) {
    return false;
  }
  
  this->fSample = sample;
  bool retval = this->initializeSelf();
  if(!retval){
    this->finalizeSelf();
    return false;
  }
  return true;
}

//__________________________________________________________________________________|___________

bool TQAnalysisJob::finalize() {
  // Finalize this analysis job. Return the tree token and reset the protected
  // variables fSample and fTree. For a specific implemenation of an analysis job,
  // this method has to be called after performing specific finalization. In an 
  // inherited class implementation do for example
  //
  // bool finalize() {
  // /* make your finalization here (e.g write your analysis results) */
  // return TQAnalysisJob::finalize();
  // }

  if(!this->fSample) return true;
  bool retval = this->finalizeSelf();
  
  this->fSample = 0;

  return retval;
}

//__________________________________________________________________________________|___________

bool TQAnalysisJob::initializeSampleFolder(TQSampleFolder* sf){
	// initiallize this algorithm on a sample folder
  return true;
}

//__________________________________________________________________________________|___________

bool TQAnalysisJob::finalizeSampleFolder(TQSampleFolder* sf){
	// finalize this algorithm on a sample folder
  return true;
}

//__________________________________________________________________________________|___________

int TQAnalysisJob::addToCuts(TList* cuts, const TString& cutname){
	// add this algorithm to one (or more) cuts
  if(!cuts || cutname.IsNull()) return 0;
  TQIterator itr(cuts);
  int retval = 0;
  while(itr.hasNext()){
    TQCompiledCut* cc = dynamic_cast<TQCompiledCut*>(itr.readNext());
    if(!cc) continue;
    cc->addAnalysisJob(this,cutname);
    retval++;
  }
  return retval;
}

//__________________________________________________________________________________|___________

TQAnalysisJob::~TQAnalysisJob() {
  // default destructor
}

//__________________________________________________________________________________|___________

bool TQAnalysisJob::isPooling() const {
  // default is no pooling
  return false;
}

#pragma GCC diagnostic pop
 TQAnalysisJob.cxx:1
 TQAnalysisJob.cxx:2
 TQAnalysisJob.cxx:3
 TQAnalysisJob.cxx:4
 TQAnalysisJob.cxx:5
 TQAnalysisJob.cxx:6
 TQAnalysisJob.cxx:7
 TQAnalysisJob.cxx:8
 TQAnalysisJob.cxx:9
 TQAnalysisJob.cxx:10
 TQAnalysisJob.cxx:11
 TQAnalysisJob.cxx:12
 TQAnalysisJob.cxx:13
 TQAnalysisJob.cxx:14
 TQAnalysisJob.cxx:15
 TQAnalysisJob.cxx:16
 TQAnalysisJob.cxx:17
 TQAnalysisJob.cxx:18
 TQAnalysisJob.cxx:19
 TQAnalysisJob.cxx:20
 TQAnalysisJob.cxx:21
 TQAnalysisJob.cxx:22
 TQAnalysisJob.cxx:23
 TQAnalysisJob.cxx:24
 TQAnalysisJob.cxx:25
 TQAnalysisJob.cxx:26
 TQAnalysisJob.cxx:27
 TQAnalysisJob.cxx:28
 TQAnalysisJob.cxx:29
 TQAnalysisJob.cxx:30
 TQAnalysisJob.cxx:31
 TQAnalysisJob.cxx:32
 TQAnalysisJob.cxx:33
 TQAnalysisJob.cxx:34
 TQAnalysisJob.cxx:35
 TQAnalysisJob.cxx:36
 TQAnalysisJob.cxx:37
 TQAnalysisJob.cxx:38
 TQAnalysisJob.cxx:39
 TQAnalysisJob.cxx:40
 TQAnalysisJob.cxx:41
 TQAnalysisJob.cxx:42
 TQAnalysisJob.cxx:43
 TQAnalysisJob.cxx:44
 TQAnalysisJob.cxx:45
 TQAnalysisJob.cxx:46
 TQAnalysisJob.cxx:47
 TQAnalysisJob.cxx:48
 TQAnalysisJob.cxx:49
 TQAnalysisJob.cxx:50
 TQAnalysisJob.cxx:51
 TQAnalysisJob.cxx:52
 TQAnalysisJob.cxx:53
 TQAnalysisJob.cxx:54
 TQAnalysisJob.cxx:55
 TQAnalysisJob.cxx:56
 TQAnalysisJob.cxx:57
 TQAnalysisJob.cxx:58
 TQAnalysisJob.cxx:59
 TQAnalysisJob.cxx:60
 TQAnalysisJob.cxx:61
 TQAnalysisJob.cxx:62
 TQAnalysisJob.cxx:63
 TQAnalysisJob.cxx:64
 TQAnalysisJob.cxx:65
 TQAnalysisJob.cxx:66
 TQAnalysisJob.cxx:67
 TQAnalysisJob.cxx:68
 TQAnalysisJob.cxx:69
 TQAnalysisJob.cxx:70
 TQAnalysisJob.cxx:71
 TQAnalysisJob.cxx:72
 TQAnalysisJob.cxx:73
 TQAnalysisJob.cxx:74
 TQAnalysisJob.cxx:75
 TQAnalysisJob.cxx:76
 TQAnalysisJob.cxx:77
 TQAnalysisJob.cxx:78
 TQAnalysisJob.cxx:79
 TQAnalysisJob.cxx:80
 TQAnalysisJob.cxx:81
 TQAnalysisJob.cxx:82
 TQAnalysisJob.cxx:83
 TQAnalysisJob.cxx:84
 TQAnalysisJob.cxx:85
 TQAnalysisJob.cxx:86
 TQAnalysisJob.cxx:87
 TQAnalysisJob.cxx:88
 TQAnalysisJob.cxx:89
 TQAnalysisJob.cxx:90
 TQAnalysisJob.cxx:91
 TQAnalysisJob.cxx:92
 TQAnalysisJob.cxx:93
 TQAnalysisJob.cxx:94
 TQAnalysisJob.cxx:95
 TQAnalysisJob.cxx:96
 TQAnalysisJob.cxx:97
 TQAnalysisJob.cxx:98
 TQAnalysisJob.cxx:99
 TQAnalysisJob.cxx:100
 TQAnalysisJob.cxx:101
 TQAnalysisJob.cxx:102
 TQAnalysisJob.cxx:103
 TQAnalysisJob.cxx:104
 TQAnalysisJob.cxx:105
 TQAnalysisJob.cxx:106
 TQAnalysisJob.cxx:107
 TQAnalysisJob.cxx:108
 TQAnalysisJob.cxx:109
 TQAnalysisJob.cxx:110
 TQAnalysisJob.cxx:111
 TQAnalysisJob.cxx:112
 TQAnalysisJob.cxx:113
 TQAnalysisJob.cxx:114
 TQAnalysisJob.cxx:115
 TQAnalysisJob.cxx:116
 TQAnalysisJob.cxx:117
 TQAnalysisJob.cxx:118
 TQAnalysisJob.cxx:119
 TQAnalysisJob.cxx:120
 TQAnalysisJob.cxx:121
 TQAnalysisJob.cxx:122
 TQAnalysisJob.cxx:123
 TQAnalysisJob.cxx:124
 TQAnalysisJob.cxx:125
 TQAnalysisJob.cxx:126
 TQAnalysisJob.cxx:127
 TQAnalysisJob.cxx:128
 TQAnalysisJob.cxx:129
 TQAnalysisJob.cxx:130
 TQAnalysisJob.cxx:131
 TQAnalysisJob.cxx:132
 TQAnalysisJob.cxx:133
 TQAnalysisJob.cxx:134
 TQAnalysisJob.cxx:135
 TQAnalysisJob.cxx:136
 TQAnalysisJob.cxx:137
 TQAnalysisJob.cxx:138
 TQAnalysisJob.cxx:139
 TQAnalysisJob.cxx:140
 TQAnalysisJob.cxx:141
 TQAnalysisJob.cxx:142
 TQAnalysisJob.cxx:143
 TQAnalysisJob.cxx:144
 TQAnalysisJob.cxx:145
 TQAnalysisJob.cxx:146
 TQAnalysisJob.cxx:147
 TQAnalysisJob.cxx:148
 TQAnalysisJob.cxx:149
 TQAnalysisJob.cxx:150
 TQAnalysisJob.cxx:151
 TQAnalysisJob.cxx:152
 TQAnalysisJob.cxx:153
 TQAnalysisJob.cxx:154
 TQAnalysisJob.cxx:155
 TQAnalysisJob.cxx:156
 TQAnalysisJob.cxx:157
 TQAnalysisJob.cxx:158
 TQAnalysisJob.cxx:159
 TQAnalysisJob.cxx:160
 TQAnalysisJob.cxx:161
 TQAnalysisJob.cxx:162
 TQAnalysisJob.cxx:163
 TQAnalysisJob.cxx:164
 TQAnalysisJob.cxx:165
 TQAnalysisJob.cxx:166
 TQAnalysisJob.cxx:167
 TQAnalysisJob.cxx:168
 TQAnalysisJob.cxx:169
 TQAnalysisJob.cxx:170
 TQAnalysisJob.cxx:171
 TQAnalysisJob.cxx:172
 TQAnalysisJob.cxx:173
 TQAnalysisJob.cxx:174
 TQAnalysisJob.cxx:175
 TQAnalysisJob.cxx:176
 TQAnalysisJob.cxx:177
 TQAnalysisJob.cxx:178
 TQAnalysisJob.cxx:179
 TQAnalysisJob.cxx:180
 TQAnalysisJob.cxx:181
 TQAnalysisJob.cxx:182
 TQAnalysisJob.cxx:183
 TQAnalysisJob.cxx:184
 TQAnalysisJob.cxx:185
 TQAnalysisJob.cxx:186
 TQAnalysisJob.cxx:187
 TQAnalysisJob.cxx:188
 TQAnalysisJob.cxx:189
 TQAnalysisJob.cxx:190
 TQAnalysisJob.cxx:191
 TQAnalysisJob.cxx:192
 TQAnalysisJob.cxx:193
 TQAnalysisJob.cxx:194
 TQAnalysisJob.cxx:195
 TQAnalysisJob.cxx:196
 TQAnalysisJob.cxx:197
 TQAnalysisJob.cxx:198
 TQAnalysisJob.cxx:199
 TQAnalysisJob.cxx:200
 TQAnalysisJob.cxx:201
 TQAnalysisJob.cxx:202
 TQAnalysisJob.cxx:203
 TQAnalysisJob.cxx:204
 TQAnalysisJob.cxx:205
 TQAnalysisJob.cxx:206
 TQAnalysisJob.cxx:207
 TQAnalysisJob.cxx:208
 TQAnalysisJob.cxx:209
 TQAnalysisJob.cxx:210
 TQAnalysisJob.cxx:211
 TQAnalysisJob.cxx:212
 TQAnalysisJob.cxx:213
 TQAnalysisJob.cxx:214
 TQAnalysisJob.cxx:215
 TQAnalysisJob.cxx:216
 TQAnalysisJob.cxx:217
 TQAnalysisJob.cxx:218
 TQAnalysisJob.cxx:219
 TQAnalysisJob.cxx:220
 TQAnalysisJob.cxx:221
 TQAnalysisJob.cxx:222
 TQAnalysisJob.cxx:223
 TQAnalysisJob.cxx:224
 TQAnalysisJob.cxx:225
 TQAnalysisJob.cxx:226
 TQAnalysisJob.cxx:227
 TQAnalysisJob.cxx:228
 TQAnalysisJob.cxx:229
 TQAnalysisJob.cxx:230
 TQAnalysisJob.cxx:231
 TQAnalysisJob.cxx:232
 TQAnalysisJob.cxx:233
 TQAnalysisJob.cxx:234
 TQAnalysisJob.cxx:235
 TQAnalysisJob.cxx:236
 TQAnalysisJob.cxx:237
 TQAnalysisJob.cxx:238
 TQAnalysisJob.cxx:239
 TQAnalysisJob.cxx:240
 TQAnalysisJob.cxx:241
 TQAnalysisJob.cxx:242
 TQAnalysisJob.cxx:243
 TQAnalysisJob.cxx:244
 TQAnalysisJob.cxx:245
 TQAnalysisJob.cxx:246
 TQAnalysisJob.cxx:247
 TQAnalysisJob.cxx:248
 TQAnalysisJob.cxx:249
 TQAnalysisJob.cxx:250
 TQAnalysisJob.cxx:251
 TQAnalysisJob.cxx:252
 TQAnalysisJob.cxx:253
 TQAnalysisJob.cxx:254
 TQAnalysisJob.cxx:255
 TQAnalysisJob.cxx:256
 TQAnalysisJob.cxx:257
 TQAnalysisJob.cxx:258
 TQAnalysisJob.cxx:259
 TQAnalysisJob.cxx:260
 TQAnalysisJob.cxx:261
 TQAnalysisJob.cxx:262
 TQAnalysisJob.cxx:263
 TQAnalysisJob.cxx:264
 TQAnalysisJob.cxx:265
 TQAnalysisJob.cxx:266
 TQAnalysisJob.cxx:267
 TQAnalysisJob.cxx:268
 TQAnalysisJob.cxx:269
 TQAnalysisJob.cxx:270