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

#include "RooWorkspace.h"
#include "RooSimultaneous.h"
#include "RooStats/ModelConfig.h"
#include "RooRealVar.h"
#include "RooFitResult.h"
#include "RooAbsPdf.h"
#include "RooDataSet.h"
#include "RooArgList.h"
#include "RooNLLVar.h"

#include "SFramework/RooFitUtils.h"

#ifdef HAS_RooFitUtils
#include <RooFitUtils/ExtendedMinimizer.h>
#endif

#include "QFramework/TQTaggable.h"
#include "QFramework/TQFolder.h"

#ifdef HAS_RooFitUtils
class TSStatisticsCalculator : public RooFitUtils::ExtendedMinimizer {
#else
class TSStatisticsCalculator {
 protected:
  RooWorkspace * fWorkspace = NULL;
  RooAbsReal* fNll = NULL;
#endif
 protected:
  RooStats::ModelConfig * fModelConfig;
  TQFolder* fSnapshots = NULL;
  
protected:
  virtual void info(TString message);
  virtual void error(TString message);
  virtual void warn(TString message);

  void setParameterValues(TQTaggable* options, const TString& prefix);
  void setParameterErrors(TQTaggable* options, const TString& prefix);
	void setParametersConstFloat(const RooArgSet * params, TQTaggable * options);
	void setParametersConstFloat(const RooArgSet& params, TQTaggable * options);
	
  TQFolder * minimizeNll(const TString& options);
  TQFolder * minimizeNll(TQTaggable * options);

  void resetOffset();

  void setup(const TString& datasetName, TQTaggable * options = NULL);  
  void setup(RooAbsPdf * pdf, RooDataSet * data, const RooArgSet& constrain, TQTaggable * options);

  void clear();
  
  virtual TQFolder * fitPdfToData(RooAbsPdf * pdf, RooDataSet * data, const RooArgSet& constrain, TQTaggable * options = NULL);
  virtual TQFolder * fitPdfToData(RooAbsPdf * pdf, RooDataSet * data, const RooArgSet& constrain, const TString& options);
	
 public:
  
  RooWorkspace* getWorkspace();
  RooStats::ModelConfig* getModelConfig();
  RooAbsPdf* getPdf();
  RooSimultaneous* getSimPdf();
  RooCategory* getIndexCategory();
  const RooArgSet* getNuisanceParameters();
  const RooArgSet* getPOIs();
	
  static RooArgSet* makeMinosArgSet(RooWorkspace* ws, const std::vector<TString>& filters);  
  static void unfoldConstraints(RooArgSet &initial, RooArgSet &final, RooArgSet &obs, RooArgSet &nuis, Int_t &counter);

  bool loadSnapshot(TQTaggable * options);
	
  TSStatisticsCalculator(const char* className);
  TSStatisticsCalculator(const char* className,RooWorkspace * ws);
	TSStatisticsCalculator(const char* className,RooWorkspace * ws,TQFolder* snapshots);
  virtual ~TSStatisticsCalculator();

  RooArgSet getPOIs(TQTaggable* options);
  RooArgSet getNuisanceParameters(TQTaggable* options);
  static RooArgSet getNuisanceParameters(RooStats::ModelConfig* mc, RooWorkspace* ws, TQTaggable* options);    
  Bool_t setWorkspace(RooWorkspace * ws);
 
  virtual TQFolder * runCalculation(TQFolder * options = 0) = 0;
  
  virtual TQFolder * fitPdfToData(const TString& datasetName, TQTaggable * options = NULL);
	
#ifdef HAS_RooFitUtils
  ClassDefOverride(TSStatisticsCalculator, 0);
#else
  ClassDef(TSStatisticsCalculator, 0);
#endif
};
 
#endif
 TSStatisticsCalculator.h:1
 TSStatisticsCalculator.h:2
 TSStatisticsCalculator.h:3
 TSStatisticsCalculator.h:4
 TSStatisticsCalculator.h:5
 TSStatisticsCalculator.h:6
 TSStatisticsCalculator.h:7
 TSStatisticsCalculator.h:8
 TSStatisticsCalculator.h:9
 TSStatisticsCalculator.h:10
 TSStatisticsCalculator.h:11
 TSStatisticsCalculator.h:12
 TSStatisticsCalculator.h:13
 TSStatisticsCalculator.h:14
 TSStatisticsCalculator.h:15
 TSStatisticsCalculator.h:16
 TSStatisticsCalculator.h:17
 TSStatisticsCalculator.h:18
 TSStatisticsCalculator.h:19
 TSStatisticsCalculator.h:20
 TSStatisticsCalculator.h:21
 TSStatisticsCalculator.h:22
 TSStatisticsCalculator.h:23
 TSStatisticsCalculator.h:24
 TSStatisticsCalculator.h:25
 TSStatisticsCalculator.h:26
 TSStatisticsCalculator.h:27
 TSStatisticsCalculator.h:28
 TSStatisticsCalculator.h:29
 TSStatisticsCalculator.h:30
 TSStatisticsCalculator.h:31
 TSStatisticsCalculator.h:32
 TSStatisticsCalculator.h:33
 TSStatisticsCalculator.h:34
 TSStatisticsCalculator.h:35
 TSStatisticsCalculator.h:36
 TSStatisticsCalculator.h:37
 TSStatisticsCalculator.h:38
 TSStatisticsCalculator.h:39
 TSStatisticsCalculator.h:40
 TSStatisticsCalculator.h:41
 TSStatisticsCalculator.h:42
 TSStatisticsCalculator.h:43
 TSStatisticsCalculator.h:44
 TSStatisticsCalculator.h:45
 TSStatisticsCalculator.h:46
 TSStatisticsCalculator.h:47
 TSStatisticsCalculator.h:48
 TSStatisticsCalculator.h:49
 TSStatisticsCalculator.h:50
 TSStatisticsCalculator.h:51
 TSStatisticsCalculator.h:52
 TSStatisticsCalculator.h:53
 TSStatisticsCalculator.h:54
 TSStatisticsCalculator.h:55
 TSStatisticsCalculator.h:56
 TSStatisticsCalculator.h:57
 TSStatisticsCalculator.h:58
 TSStatisticsCalculator.h:59
 TSStatisticsCalculator.h:60
 TSStatisticsCalculator.h:61
 TSStatisticsCalculator.h:62
 TSStatisticsCalculator.h:63
 TSStatisticsCalculator.h:64
 TSStatisticsCalculator.h:65
 TSStatisticsCalculator.h:66
 TSStatisticsCalculator.h:67
 TSStatisticsCalculator.h:68
 TSStatisticsCalculator.h:69
 TSStatisticsCalculator.h:70
 TSStatisticsCalculator.h:71
 TSStatisticsCalculator.h:72
 TSStatisticsCalculator.h:73
 TSStatisticsCalculator.h:74
 TSStatisticsCalculator.h:75
 TSStatisticsCalculator.h:76
 TSStatisticsCalculator.h:77
 TSStatisticsCalculator.h:78
 TSStatisticsCalculator.h:79
 TSStatisticsCalculator.h:80
 TSStatisticsCalculator.h:81
 TSStatisticsCalculator.h:82
 TSStatisticsCalculator.h:83
 TSStatisticsCalculator.h:84
 TSStatisticsCalculator.h:85
 TSStatisticsCalculator.h:86
 TSStatisticsCalculator.h:87
 TSStatisticsCalculator.h:88
 TSStatisticsCalculator.h:89
 TSStatisticsCalculator.h:90
 TSStatisticsCalculator.h:91
 TSStatisticsCalculator.h:92
 TSStatisticsCalculator.h:93
 TSStatisticsCalculator.h:94
 TSStatisticsCalculator.h:95