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

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

class TQGraphMakerAnalysisJob : public TQAnalysisJob {
 
protected:

  static TQMessageStream f_ErrMsg;
  int f_Verbose;
 
  std::vector<TNamed*> fGraphTemplates;
  std::vector<std::vector<TString> > fExpressions; 
  std::vector<std::vector<TQObservable*> > fObservables; //!
  std::vector<TClass*> fGraphTypes;
 
  /* actual graphs */
  // IMPORTANT NOTE:
  // fGraphs 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<TNamed*> fGraphs; //!
 
  void setErrorMessage(TString message);
  void initializeGraphs();
  bool finalizeGraphs();
 
  TQSampleFolder* poolAt;

public:

  TQGraphMakerAnalysisJob();
  TQGraphMakerAnalysisJob(TQGraphMakerAnalysisJob* 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 bookGraph(TString definition, TQTaggable* aliases = NULL);
  void cancelGraph(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 ~TQGraphMakerAnalysisJob();
 
  ClassDefOverride(TQGraphMakerAnalysisJob, 0); // analysis job to create graphs

};

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