#include "QFramework/TQSampleNormalizationObservable.h"
#include <limits>

#include "QFramework/TQSample.h"

// uncomment the following line to enable debug printouts
// #define _DEBUG_
// you can perform debug printouts with statements like this
// DEBUG("error number %d occurred",someInteger);

// be careful to not move the _DEBUG_ flag behind the following line
// otherwise, it will show no effect
#include "QFramework/TQLibrary.h"

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQSampleNormalizationObservable
//
// The TQSampleNormalizationObservable is a variant of TQObservable
// that simply always returns the sample normaliztion.
//
////////////////////////////////////////////////////////////////////////////////////////////////

/*@observable: [TQSampleNormalizationObservable] The TQSampleNormalizationObservable provides the
    sample-wide contribution to the event weight, that is the factor composed of cross-section,
    possible k-factors, luminosity, initial (generated) sumOfWeights, XSec scaling, ...
    The value provided by this Observable is therefore constant accross all events of one input file
    (ntuple/xAOD). Technically, the value provided is the one set on the currently processed instance
    of TQSample and retrieved via TQSample::getNormalisation().
    The TQSampleNormalizationObservable is NOT autoamtically created but needs to be instantiated by
    the user (e.g. in an ObservableSnippet). The name given in the constructor defines the expression
    that is mapped to this Observable.

*/

ClassImp(TQSampleNormalizationObservable)

//______________________________________________________________________________________________

TQSampleNormalizationObservable::TQSampleNormalizationObservable(){
  // default constructor
  DEBUGclass("default constructor called");
}

//______________________________________________________________________________________________

TQSampleNormalizationObservable::~TQSampleNormalizationObservable(){
  // default destructor
  DEBUGclass("destructor called");
} 

//______________________________________________________________________________________________

double TQSampleNormalizationObservable::getValue() const {
  // value retrieval function, called on every event for every cut and histogram
  DEBUGclass("entering function");

  // the contents of this function highly depend on the way your
  // observable is supposed to retrieve (or create?) data
  // good luck, you're on your own here!
  
  return this->fSample->getNormalisation();
}

//______________________________________________________________________________________________

Long64_t TQSampleNormalizationObservable::getCurrentEntry() const {
  // retrieve the current entry from the tree

  // since we don't have any tree or event pointer, there is usually
  // no way for us to know what entry we are currently looking
  // at. hence, we return -1 by default
  
  return -1;
}

//______________________________________________________________________________________________

TObjArray* TQSampleNormalizationObservable::getBranchNames() const {
  // retrieve the list of branch names for this observable
  // ownership of the list belongs to the caller of the function
  DEBUGclass("retrieving branch names");

  // since we don't have a tree pointer, we probably also don't need any branches
  return NULL;
}
//______________________________________________________________________________________________

bool TQSampleNormalizationObservable::initializeSelf(){
  DEBUGclass("initializing");
  // initialize this observable
  return true;
}

//______________________________________________________________________________________________

bool TQSampleNormalizationObservable::finalizeSelf(){
  // initialize this observable
  DEBUGclass("finalizing");
  // remember to undo anything you did in initializeSelf() !
  return true;
}
//______________________________________________________________________________________________

TQSampleNormalizationObservable::TQSampleNormalizationObservable(const TString& name):
TQObservable(name)
{
  // constructor with name argument
  DEBUGclass("constructor called with '%s'",name.Data());
}
 TQSampleNormalizationObservable.cxx:1
 TQSampleNormalizationObservable.cxx:2
 TQSampleNormalizationObservable.cxx:3
 TQSampleNormalizationObservable.cxx:4
 TQSampleNormalizationObservable.cxx:5
 TQSampleNormalizationObservable.cxx:6
 TQSampleNormalizationObservable.cxx:7
 TQSampleNormalizationObservable.cxx:8
 TQSampleNormalizationObservable.cxx:9
 TQSampleNormalizationObservable.cxx:10
 TQSampleNormalizationObservable.cxx:11
 TQSampleNormalizationObservable.cxx:12
 TQSampleNormalizationObservable.cxx:13
 TQSampleNormalizationObservable.cxx:14
 TQSampleNormalizationObservable.cxx:15
 TQSampleNormalizationObservable.cxx:16
 TQSampleNormalizationObservable.cxx:17
 TQSampleNormalizationObservable.cxx:18
 TQSampleNormalizationObservable.cxx:19
 TQSampleNormalizationObservable.cxx:20
 TQSampleNormalizationObservable.cxx:21
 TQSampleNormalizationObservable.cxx:22
 TQSampleNormalizationObservable.cxx:23
 TQSampleNormalizationObservable.cxx:24
 TQSampleNormalizationObservable.cxx:25
 TQSampleNormalizationObservable.cxx:26
 TQSampleNormalizationObservable.cxx:27
 TQSampleNormalizationObservable.cxx:28
 TQSampleNormalizationObservable.cxx:29
 TQSampleNormalizationObservable.cxx:30
 TQSampleNormalizationObservable.cxx:31
 TQSampleNormalizationObservable.cxx:32
 TQSampleNormalizationObservable.cxx:33
 TQSampleNormalizationObservable.cxx:34
 TQSampleNormalizationObservable.cxx:35
 TQSampleNormalizationObservable.cxx:36
 TQSampleNormalizationObservable.cxx:37
 TQSampleNormalizationObservable.cxx:38
 TQSampleNormalizationObservable.cxx:39
 TQSampleNormalizationObservable.cxx:40
 TQSampleNormalizationObservable.cxx:41
 TQSampleNormalizationObservable.cxx:42
 TQSampleNormalizationObservable.cxx:43
 TQSampleNormalizationObservable.cxx:44
 TQSampleNormalizationObservable.cxx:45
 TQSampleNormalizationObservable.cxx:46
 TQSampleNormalizationObservable.cxx:47
 TQSampleNormalizationObservable.cxx:48
 TQSampleNormalizationObservable.cxx:49
 TQSampleNormalizationObservable.cxx:50
 TQSampleNormalizationObservable.cxx:51
 TQSampleNormalizationObservable.cxx:52
 TQSampleNormalizationObservable.cxx:53
 TQSampleNormalizationObservable.cxx:54
 TQSampleNormalizationObservable.cxx:55
 TQSampleNormalizationObservable.cxx:56
 TQSampleNormalizationObservable.cxx:57
 TQSampleNormalizationObservable.cxx:58
 TQSampleNormalizationObservable.cxx:59
 TQSampleNormalizationObservable.cxx:60
 TQSampleNormalizationObservable.cxx:61
 TQSampleNormalizationObservable.cxx:62
 TQSampleNormalizationObservable.cxx:63
 TQSampleNormalizationObservable.cxx:64
 TQSampleNormalizationObservable.cxx:65
 TQSampleNormalizationObservable.cxx:66
 TQSampleNormalizationObservable.cxx:67
 TQSampleNormalizationObservable.cxx:68
 TQSampleNormalizationObservable.cxx:69
 TQSampleNormalizationObservable.cxx:70
 TQSampleNormalizationObservable.cxx:71
 TQSampleNormalizationObservable.cxx:72
 TQSampleNormalizationObservable.cxx:73
 TQSampleNormalizationObservable.cxx:74
 TQSampleNormalizationObservable.cxx:75
 TQSampleNormalizationObservable.cxx:76
 TQSampleNormalizationObservable.cxx:77
 TQSampleNormalizationObservable.cxx:78
 TQSampleNormalizationObservable.cxx:79
 TQSampleNormalizationObservable.cxx:80
 TQSampleNormalizationObservable.cxx:81
 TQSampleNormalizationObservable.cxx:82
 TQSampleNormalizationObservable.cxx:83
 TQSampleNormalizationObservable.cxx:84
 TQSampleNormalizationObservable.cxx:85
 TQSampleNormalizationObservable.cxx:86
 TQSampleNormalizationObservable.cxx:87
 TQSampleNormalizationObservable.cxx:88
 TQSampleNormalizationObservable.cxx:89
 TQSampleNormalizationObservable.cxx:90
 TQSampleNormalizationObservable.cxx:91
 TQSampleNormalizationObservable.cxx:92
 TQSampleNormalizationObservable.cxx:93
 TQSampleNormalizationObservable.cxx:94
 TQSampleNormalizationObservable.cxx:95
 TQSampleNormalizationObservable.cxx:96
 TQSampleNormalizationObservable.cxx:97
 TQSampleNormalizationObservable.cxx:98
 TQSampleNormalizationObservable.cxx:99
 TQSampleNormalizationObservable.cxx:100
 TQSampleNormalizationObservable.cxx:101
 TQSampleNormalizationObservable.cxx:102
 TQSampleNormalizationObservable.cxx:103
 TQSampleNormalizationObservable.cxx:104
 TQSampleNormalizationObservable.cxx:105
 TQSampleNormalizationObservable.cxx:106
 TQSampleNormalizationObservable.cxx:107
 TQSampleNormalizationObservable.cxx:108
 TQSampleNormalizationObservable.cxx:109
 TQSampleNormalizationObservable.cxx:110