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

#include "TString.h"
#include "QFramework/TQNamedTaggable.h"
#include "QFramework/TQMessageStream.h"

class TQSampleDataReader;
class TQSampleFolder;
class TQFolder;

#include <math.h>
#include <limits>

class TQNFChainloader; 

class TQNFBase : public TQNamedTaggable {
  // Classes inheriting from this abstract base class must include "QFramework/TQNFChainloader.h" in their source file!
protected:
  TQNFBase();
  TQNFBase(const TString& name);

  TQSampleDataReader* fReader;
  bool fOwnerOfReader;

  TQMessageStream messages; //!
  int verbosity;

  std::vector<TString> vNFpaths; // the non-abstract class has to keep this vector updated with the complete paths where NFs have been set, e.g. "/bkg/ee/Zjets/.default:CutZCR_VBF_C". It is handy to fill this vector if execute(0) is called, i.e. during the first iteration run by TQNFChainloader.
  TQNFChainloader* chainLoader;
 
  TQFolder * infoFolder;
  TQFolder * cutInfoFolder;

  bool initialized;
  int iterationNumber;

  virtual bool initializeSelf() = 0; 
  virtual bool finalizeSelf() = 0; 

public:

  virtual ~TQNFBase();

  TString getPathTag(const TString& tagname);

  void setSampleFolder(TQSampleFolder* sf);
  void setReader(TQSampleDataReader* rd);
  TQSampleFolder* getSampleFolder();
  TQSampleDataReader* getReader();

  void setOutputStream(const TString& outfile = "", int verbosity = 2);
  void closeOutputStream();
  void setVerbosity(int verbosity);

  void setInfoFolder(TQFolder* f);
  void setCutInfoFolder(TQFolder* f);
 
  virtual bool readConfiguration(TQFolder* f) = 0;
  //virtual int writeResultsToStream(std::ostream* out) = 0;
  //virtual int writeResultsToFile(const TString& filename) = 0;

  virtual TString getStatusMessage();
  virtual int getStatus();

  bool initialize();
  bool finalize();

  virtual int execute(int itrNumber) = 0; // If itrNumber=-1, no variation of input values should be performed. 
  virtual bool success() = 0;
 
  void setChainLoader(TQNFChainloader * loader);
 
  int deployResult(const std::vector<TString>& startAtCutNames, const std::vector<TString>& stopAtCuts = std::vector<TString>());
  virtual int deployResult(const std::vector<TString>& startAtCutnames, const std::vector<TString>& stopAtCuts, int overwrite, bool applyToStopCut) = 0;
  
  std::vector<TString> getTargetCuts(const std::vector<TString>& startCuts, const std::vector<TString>& stopCuts, bool applyToStopCut);
  void getTargetCutsWorker(TList* targets, TQFolder* startCut, TList* stopCuts = NULL, bool applyToStopCut = true);

  const std::vector<TString>& getNFpaths(); 
  void addNFPath(const TString& path, const TString& cutname, const TString& scalescheme = ".default");
  void printNFPaths();

  ClassDef(TQNFBase, 0); // abstract base class for normalization factor calculators

};

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