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

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

class TQTHnBaseMakerAnalysisJob : public TQAnalysisJob {
 
protected:

  static bool g_useHistogramObservableNames;
  static TQMessageStream f_ErrMsg;
  int f_Verbose;
 
  /* template histograms (will be cloned) */
  std::vector<THnBase*> fHistogramTemplates;
  std::vector<bool> fFillSynchronized;
  std::vector<bool> fFillRaw;
 
  /* tree observables */
  std::vector<std::vector<TString> > fExpressions; 
  std::vector<std::vector<TQObservable*> > fObservables; //!
  /* 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<THnBase*> fHistograms; //!
 
  void setErrorMessage(TString message);
  void initializeHistograms();
  bool finalizeHistograms();
 
  TQSampleFolder* poolAt;

public:

  TQTHnBaseMakerAnalysisJob();
  TQTHnBaseMakerAnalysisJob(TQTHnBaseMakerAnalysisJob* other);

  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);
  
  static void clearMessages();

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

  virtual TQAnalysisJob * getClone() override;

  virtual void reset() override;
  
  static TString getErrorMessage();

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

  virtual bool execute(double weight) override;

  virtual ~TQTHnBaseMakerAnalysisJob();
 
  ClassDefOverride(TQTHnBaseMakerAnalysisJob, 0); // analysis job to book histograms of arbitrary dimension

};

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