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

#include "QFramework/TQSignificanceEvaluator.h"
#include "QFramework/TQGridScanner.h"
#include "TSStatisticsManager.h"
#include "QFramework/TQFolder.h"

class TSCLSignificanceEvaluator : public TQSignificanceEvaluator {
 public:
  void keepTMP(TString tmpfilenamebase="histograms_");
  
  void printMode();
  void exportSampleFolder(bool doexport = true);
  void importSampleFolder(bool doimport = true);
  void exportSignificance(bool doexport = true);
  void importSignificance(bool doimport = true);
  void setSampleFolderFile(const TString& filename);
  void setSignificanceFile(const TString& filename);
  void setExternalEvaluation(const TString& command, bool allowRecycling = false);
  void setInternalEvaluation(bool eval = true);
  void setDebugOutputdir(TString outdir);

  void deactivate();
  
  TQSampleFolder* getWorkingFolder(TString path = "");
  int cleanWorkingFolder();
  TQSampleFolder* getBaseFolder(TString path = "");
  TQFolder* getConfigFolder(TString path = "");
  void printPaths();
  virtual double getLuminosity(TString folderName="info",TString tagName="luminosity") override;

  bool addFOM(const TString& fomName);
  
  virtual double evaluate() override;
  virtual std::vector<double> evaluateMultiple() override;

  virtual int exportWorkspace(const TString& outFileName = "model-raw.root") override;
  
  void addVariation(TQSampleFolder* sf, TString varname);
  void setInitialization(TClass* initClass);
  virtual bool initialize(TQGridScanner* scanner) override;
  bool initialize(const TString& importfilename = "", const TString& exportfilename = "");
  bool configure(const TString& configfilename, const TString& modelname = "");
  TSCLSignificanceEvaluator(TQSampleFolder* sf=NULL, TString targetVar="", TString name="CL");
  TSCLSignificanceEvaluator(TList* folders, TString targetVar="", TString name="CL", TString folderKeyTag=".key");
  TSCLSignificanceEvaluator(TString targetVar, TString name="CL");

  virtual double getSignificance(size_t iregion) override;
  virtual double getSignificance2(size_t iregion) override;

 protected:
  TQSampleFolder* baseFolder;       //!   
  TQSampleFolder* workingFolder;    //!
  TQFolder* m_config;		    //!
  TString tmpFileName;		    //!
  TString tmpFileNameBase;	    //!
  TString outputdir;	    //!
  TString modelName;		    //!
  TString discriminantVariable;	    //!
  int m_discriminantVariableIndex; //! // index of discriminant variable in n-dim hist
  TSStatisticsManager* engine;	    //!
  std::vector<TString> m_histRegionsInInput;   //!
  std::vector<TString> m_histRegionsInModel;   //!
  std::vector<TString> m_samplePaths;   //!
  std::vector<TString> locations;   //! // deprecated! delete once ready to do so
  std::vector<TString> m_histNames;  //!
  std::vector<TString> variations;  //!
  TString sampleFolderFileName;	    //!
  TString significanceFileName;	    //!
  TString evaluationCommand;	    //!
  bool internalEvaluation;          //!
  bool recyclingAllowed;          //!
  bool supportRegionSetHandling;   //!
  bool debug; //!

  std::vector<TH1F*> m_Hists; //!
  std::map< TString, TAxis* > m_boundMultiDimAxis; //!
  
  int nPreparedRegionSets; //!
  int m_nPointsProcessed; //!

 public:

  bool checkCutoffs();
  void setRegionSetHandling(bool val);
  void setVerbose(bool v);
  virtual bool hasNativeRegionSetHandling() override;
  virtual bool prepareNextRegionSet(const TString& suffix = "") override;
  virtual bool isPrepared() override;

  bool m_multipleFOMsCompatible = false;
  
  enum Mode { IMPORT, EXPORT, NONE };
  
 protected:
  Mode sampleFolderMode;
  Mode significanceMode;
  int configureBoundRegions();
  Int_t prepareFromGridScanner(const TString& /*suffix = ""*/);
  
  std::vector <TString> m_FOMNames;

  ClassDefOverride(TSCLSignificanceEvaluator,1)
};

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