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

#include "QFramework/TQAnalysisJob.h"
#include "QFramework/TQMessageStream.h"

class TQObservable;
class TQTaggable;
class TQCut;
class TQToken;

#include "TList.h"
#include "TFile.h"
#include "TTree.h"
#include "TObjString.h"

namespace TQNTupleDumperAnalysisJobHelpers {
  class FileHandle;
  class TreeHandle;
  class BranchHandle;
}

class TQNTupleDumperAnalysisJob : public TQAnalysisJob {
 public:
  enum VarType { UNKNOWN=0, INT, INT32, INT64, FLOAT, DOUBLE, UI, UL, ULI, ULL, ULLI, UINT32, UINT64,
                  VECTORINT, VECTORINT32, VECTORINT64, VECTORFLOAT, VECTORDOUBLE, VECTORUI, VECTORUL, VECTORULI, VECTORULL, VECTORULLI, VECTORUINT32, VECTORUINT64};

  static TQNTupleDumperAnalysisJob::VarType getVarType (TString typestr);
  static TString getTypeString (TQNTupleDumperAnalysisJob::VarType type);
  static int importJobsFromTextFiles(const std::vector<TString>& filenames, TQCut* basecut, TQTaggable* aliases = NULL, const TString& channelFilter = "*", bool verbose = false);
  static TString getErrorMessage();
  static void setErrorMessage(const TString& message);


  TQToken* getTreeToken(const TString& filename, const TString& treename);
  bool returnTreeToken(const TString& filename, const TString& treename, TQToken* tok);

 protected:

  static const std::map<VarType,bool> isVectorBranchMap; //!

  static TQMessageStream fErrMsg;

  static std::map<TString,TFile*> fFiles; //!
  static std::map<TString,int> nUsers; //!
  static TObjString fTimestamp; //!

  std::vector<TString> fVarNames;
  std::vector<TString> fExpressions;
  std::vector<VarType> fTypes;

  std::vector<TQObservable*> fObservables;

  TString fTreeName = "nTuple";
  TString fFileName = "data";
  TString fActiveTreeName = ""; //!
  TString fActiveFileName = ""; //!

  bool fWriteWeight = true;
  TString fWeightName = "weight";
  TQNTupleDumperAnalysisJobHelpers::BranchHandle* fWeightBranch = 0; //!

  TQNTupleDumperAnalysisJobHelpers::TreeHandle * fTreeHandler = NULL; //!
  TQToken* fTreeToken = NULL; //!
  std::vector<TQNTupleDumperAnalysisJobHelpers::BranchHandle*> fBranches; //!

  TQSampleFolder* poolAt = NULL;

  bool initializeTree(TQTaggable* tags);
  bool finalizeTree();

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

  int getNentriesToCreate() const;
  mutable bool fExpectSingleEntryPerEvent = false;

 public:

  TQNTupleDumperAnalysisJob(const TString& name);
  TQNTupleDumperAnalysisJob(TQNTupleDumperAnalysisJob* other);

  bool bookVariable(const TString& type, const TString& name, const TString& definition);
  bool bookVariable(VarType type, const TString& name, const TString& definition);
  int nVariables();

  virtual TQAnalysisJob * getClone() override;
  virtual bool initializeSampleFolder(TQSampleFolder* sf) override;
  virtual bool finalizeSampleFolder(TQSampleFolder* sf) override;
  virtual bool execute(double weight) override;

  virtual TObjArray * getBranchNames() override;

  void writeWeights(bool write = true, const TString& name = "weight");

  TString getTreeName() const ;
  void setTreeName (const TString& treename);
  TString getFileName() const ;
  void setFileName (const TString& filename);

  void printBranches();


  ClassDefOverride(TQNTupleDumperAnalysisJob,1) // analysis job allowing to dump flat nTuples

};

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