//this file looks like plain C, but it's actually -*- c++ -*-
#ifndef __TQHistoMakerAnalysisJob__
#define __TQHistoMakerAnalysisJob__

#include "QFramework/TQObservable.h"
#include "QFramework/TQAnalysisJob.h"
#include "QFramework/TQMessageStream.h"
#include "TList.h"
#include "QFramework/TQTaggable.h"
#include "QFramework/TQCut.h"

class TQHistoMakerAnalysisJob : public TQAnalysisJob {
 
protected:
  static TString gDefaultAuthor;
  static bool g_useHistogramObservableNames;
  static TQMessageStream f_ErrMsg;
  int f_Verbose;
 
  /* template histograms (will be cloned) */
  std::vector<TH1*> fHistogramTemplates;
  
  /* histogram specific options*/
  std::vector<bool> fFillSynchronized;
  std::vector<bool> fFillRaw;
 
  /* observables */
  std::vector<std::vector<TString> > fExpressions; 
  std::vector<TString> fWeightExpressions;
  std::vector<std::vector<TQObservable*> > fObservables; //!
  std::vector<TQObservable*> fWeightObservables; //!
  
  /* histo types */
  std::vector<int> fHistoTypes;
 
  /* actual histograms */
  // IMPORTANT NOTE:
  // fHistograms is declared a transient data member
  // hence, it is not serialized and deserialized by calls of TObject::Clone()
  // this is of critical importance, since copying would lead to invalid pointers 
  // in the field of the cloned object -- NEVER CHANGE THIS!!!
  std::vector<TH1*> fHistograms; //!
 
  void setErrorMessage(TString message);
  void initializeHistograms();
  bool finalizeHistograms();
 
  TQSampleFolder* poolAt;

public:

  TQHistoMakerAnalysisJob();
  TQHistoMakerAnalysisJob(TQHistoMakerAnalysisJob* other);

  static void setDefaultAuthor(const TString& name);
  
  static const TString& getValidNameCharacters();
 
  static int importJobsFromTextFiles(const TString& files, TQCut* basecut, const TString& channelfilter = "*", bool verbose = false);
  static int importJobsFromTextFiles(const TString& files, TQCut* basecut, TQTaggable* aliases, const TString& channelfilter = "*", bool verbose = false);
  static int importJobsFromTextFiles(const std::vector<TString>& filenames, TQCut* basecut, const TString& channelFilter = "*", bool verbose = false);
  static int importJobsFromTextFiles(const std::vector<TString>& filenames, TQCut* basecut, TQTaggable* aliases, const TString& channelFilter = "*", bool verbose = false);
  

  bool initializeSampleFolder(TQSampleFolder* sf) override;
  bool finalizeSampleFolder (TQSampleFolder* sf) override;

  bool bookHistogram(TString definition, TQTaggable* aliases = NULL);
  void cancelHistogram(const TString& name);
  void printBooking(const TString& moretext);
  void printBookingTeX(const TString& moretext);
  
  static void clearMessages();

  void setVerbose(int verbose);
  int getVerbose();

  virtual TQAnalysisJob * getClone() override;

  virtual void reset() override;
  virtual void print(const TString& options) override;

  
  static TString getErrorMessage();

  virtual bool initializeSelf() override;
  virtual bool finalizeSelf() override;

  virtual bool execute(double weight) override;

  virtual TObjArray * getBranchNames() override;

  virtual bool isPooling() const override;
  
  virtual ~TQHistoMakerAnalysisJob();
 
  ClassDefOverride(TQHistoMakerAnalysisJob, 0); // analysis job to create histograms

};

#endif
 TQHistoMakerAnalysisJob.h:1
 TQHistoMakerAnalysisJob.h:2
 TQHistoMakerAnalysisJob.h:3
 TQHistoMakerAnalysisJob.h:4
 TQHistoMakerAnalysisJob.h:5
 TQHistoMakerAnalysisJob.h:6
 TQHistoMakerAnalysisJob.h:7
 TQHistoMakerAnalysisJob.h:8
 TQHistoMakerAnalysisJob.h:9
 TQHistoMakerAnalysisJob.h:10
 TQHistoMakerAnalysisJob.h:11
 TQHistoMakerAnalysisJob.h:12
 TQHistoMakerAnalysisJob.h:13
 TQHistoMakerAnalysisJob.h:14
 TQHistoMakerAnalysisJob.h:15
 TQHistoMakerAnalysisJob.h:16
 TQHistoMakerAnalysisJob.h:17
 TQHistoMakerAnalysisJob.h:18
 TQHistoMakerAnalysisJob.h:19
 TQHistoMakerAnalysisJob.h:20
 TQHistoMakerAnalysisJob.h:21
 TQHistoMakerAnalysisJob.h:22
 TQHistoMakerAnalysisJob.h:23
 TQHistoMakerAnalysisJob.h:24
 TQHistoMakerAnalysisJob.h:25
 TQHistoMakerAnalysisJob.h:26
 TQHistoMakerAnalysisJob.h:27
 TQHistoMakerAnalysisJob.h:28
 TQHistoMakerAnalysisJob.h:29
 TQHistoMakerAnalysisJob.h:30
 TQHistoMakerAnalysisJob.h:31
 TQHistoMakerAnalysisJob.h:32
 TQHistoMakerAnalysisJob.h:33
 TQHistoMakerAnalysisJob.h:34
 TQHistoMakerAnalysisJob.h:35
 TQHistoMakerAnalysisJob.h:36
 TQHistoMakerAnalysisJob.h:37
 TQHistoMakerAnalysisJob.h:38
 TQHistoMakerAnalysisJob.h:39
 TQHistoMakerAnalysisJob.h:40
 TQHistoMakerAnalysisJob.h:41
 TQHistoMakerAnalysisJob.h:42
 TQHistoMakerAnalysisJob.h:43
 TQHistoMakerAnalysisJob.h:44
 TQHistoMakerAnalysisJob.h:45
 TQHistoMakerAnalysisJob.h:46
 TQHistoMakerAnalysisJob.h:47
 TQHistoMakerAnalysisJob.h:48
 TQHistoMakerAnalysisJob.h:49
 TQHistoMakerAnalysisJob.h:50
 TQHistoMakerAnalysisJob.h:51
 TQHistoMakerAnalysisJob.h:52
 TQHistoMakerAnalysisJob.h:53
 TQHistoMakerAnalysisJob.h:54
 TQHistoMakerAnalysisJob.h:55
 TQHistoMakerAnalysisJob.h:56
 TQHistoMakerAnalysisJob.h:57
 TQHistoMakerAnalysisJob.h:58
 TQHistoMakerAnalysisJob.h:59
 TQHistoMakerAnalysisJob.h:60
 TQHistoMakerAnalysisJob.h:61
 TQHistoMakerAnalysisJob.h:62
 TQHistoMakerAnalysisJob.h:63
 TQHistoMakerAnalysisJob.h:64
 TQHistoMakerAnalysisJob.h:65
 TQHistoMakerAnalysisJob.h:66
 TQHistoMakerAnalysisJob.h:67
 TQHistoMakerAnalysisJob.h:68
 TQHistoMakerAnalysisJob.h:69
 TQHistoMakerAnalysisJob.h:70
 TQHistoMakerAnalysisJob.h:71
 TQHistoMakerAnalysisJob.h:72
 TQHistoMakerAnalysisJob.h:73
 TQHistoMakerAnalysisJob.h:74
 TQHistoMakerAnalysisJob.h:75
 TQHistoMakerAnalysisJob.h:76
 TQHistoMakerAnalysisJob.h:77
 TQHistoMakerAnalysisJob.h:78
 TQHistoMakerAnalysisJob.h:79
 TQHistoMakerAnalysisJob.h:80
 TQHistoMakerAnalysisJob.h:81
 TQHistoMakerAnalysisJob.h:82
 TQHistoMakerAnalysisJob.h:83
 TQHistoMakerAnalysisJob.h:84
 TQHistoMakerAnalysisJob.h:85
 TQHistoMakerAnalysisJob.h:86
 TQHistoMakerAnalysisJob.h:87
 TQHistoMakerAnalysisJob.h:88
 TQHistoMakerAnalysisJob.h:89
 TQHistoMakerAnalysisJob.h:90
 TQHistoMakerAnalysisJob.h:91
 TQHistoMakerAnalysisJob.h:92
 TQHistoMakerAnalysisJob.h:93
 TQHistoMakerAnalysisJob.h:94
 TQHistoMakerAnalysisJob.h:95
 TQHistoMakerAnalysisJob.h:96
 TQHistoMakerAnalysisJob.h:97
 TQHistoMakerAnalysisJob.h:98
 TQHistoMakerAnalysisJob.h:99
 TQHistoMakerAnalysisJob.h:100
 TQHistoMakerAnalysisJob.h:101