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

#include "SFramework/TSModelFactory.h"
#include "SFramework/TSSystematicsManager.h"
#include "QFramework/TQSampleFolder.h"
#include "QFramework/TQTaggable.h"

class TSModelBuilder : public TSSystematicsManager {

protected:

  int errorCount = 0;
  int maxErrorCount = 100;
  int warnCount = 0;
  int maxWarnCount = 100;
  
  virtual Bool_t createChannelDefinitions(TQFolder * config, TQFolder * model);
  virtual Bool_t createChannelDefinition(TQFolder * config, TQFolder * model, TString name);



  virtual std::vector<int> getRemapping(TQFolder * channelConfig, TQSampleFolder * refSamples,TString refPath, TString refHistogram, TQTaggable * refHistogramOptions, Int_t remapX, Int_t remapY, Int_t &dim, Bool_t remapSlices);
  virtual std::vector<int> getRemappingOptimizedSgnf(TQFolder * channelConfig, TQSampleFolder * refSamples, TString sigPath, TString bkgPath, TString histname, TQTaggable * histogramOptions, Int_t &dim);


  virtual std::vector<int> getMergeBins(TQFolder * config, TQFolder * channelConfig, std::map<TQFolder*,TH1*> histograms, TString varname, Bool_t isNominal, Int_t &dim); // remco

  virtual Bool_t collectAllHistograms(TQFolder * config, TQFolder * model);
  virtual Bool_t collectHistograms(TQFolder * config, TQFolder * model, TQFolder* variation);
  
  void info(TString message);
  void error(TString message);
  void warn(TString message);

public:

  TSModelBuilder();

  static void applyEdits(TQFolder* edit, TQFolder* model);
  static void applyStyle(TQFolder* model, const TString& samplename, TH1* hist);
  
  virtual TQFolder * createDefinition(TQFolder * config);
  virtual Bool_t finalizeModel(TQFolder * model, TQFolder * config);
  virtual TQFolder * buildModel(TQFolder * config);
  void purgeVariation(TQFolder* model, const TString& name, Bool_t notify = false);

  Bool_t parseConversion(TString def, Bool_t &alongX,
                                 Bool_t &includeUnderflowX, Bool_t &includeOverflowX,
                                 Bool_t &includeUnderflowY, Bool_t &includeOverflowY);
  TH1* processHistogram(TQFolder* config, TQFolder* sampleDef, const TH1* histo);


  
  virtual ~TSModelBuilder();
		
  ClassDefOverride(TSModelBuilder, 0);

};

#endif
 TSModelBuilder.h:1
 TSModelBuilder.h:2
 TSModelBuilder.h:3
 TSModelBuilder.h:4
 TSModelBuilder.h:5
 TSModelBuilder.h:6
 TSModelBuilder.h:7
 TSModelBuilder.h:8
 TSModelBuilder.h:9
 TSModelBuilder.h:10
 TSModelBuilder.h:11
 TSModelBuilder.h:12
 TSModelBuilder.h:13
 TSModelBuilder.h:14
 TSModelBuilder.h:15
 TSModelBuilder.h:16
 TSModelBuilder.h:17
 TSModelBuilder.h:18
 TSModelBuilder.h:19
 TSModelBuilder.h:20
 TSModelBuilder.h:21
 TSModelBuilder.h:22
 TSModelBuilder.h:23
 TSModelBuilder.h:24
 TSModelBuilder.h:25
 TSModelBuilder.h:26
 TSModelBuilder.h:27
 TSModelBuilder.h:28
 TSModelBuilder.h:29
 TSModelBuilder.h:30
 TSModelBuilder.h:31
 TSModelBuilder.h:32
 TSModelBuilder.h:33
 TSModelBuilder.h:34
 TSModelBuilder.h:35
 TSModelBuilder.h:36
 TSModelBuilder.h:37
 TSModelBuilder.h:38
 TSModelBuilder.h:39
 TSModelBuilder.h:40
 TSModelBuilder.h:41
 TSModelBuilder.h:42
 TSModelBuilder.h:43
 TSModelBuilder.h:44
 TSModelBuilder.h:45
 TSModelBuilder.h:46
 TSModelBuilder.h:47
 TSModelBuilder.h:48
 TSModelBuilder.h:49
 TSModelBuilder.h:50
 TSModelBuilder.h:51
 TSModelBuilder.h:52
 TSModelBuilder.h:53
 TSModelBuilder.h:54
 TSModelBuilder.h:55
 TSModelBuilder.h:56
 TSModelBuilder.h:57
 TSModelBuilder.h:58
 TSModelBuilder.h:59
 TSModelBuilder.h:60
 TSModelBuilder.h:61
 TSModelBuilder.h:62