//  
// Author: Felix Thomas <mailto: Felix.Thomas@mailbox.tu-dresden.de>
// Update: $$
// Copyright: 2010 (C) Felix Thomas
//
#ifndef HEP_HepTemplateFitter
#define HEP_HepTemplateFitter
#ifndef ROOT_TTask
#include <TTask.h>
#endif
#ifndef ROOT_TList
#include <TList.h>
#endif
#ifndef ROOT_TH1F
#include <TH1F.h>
#endif
#ifndef ROOT_THSTACK
#include <THStack.h>
#endif
#ifndef ROOT_TDirectory
#include <TDirectory.h>
#endif

class TFile;
class TKey;
class TSystem;
class TFractionFitter;
class HepDataMCSample;
class HepTemplate;
class TObjString;
class TCanvas;
class TROOT;

class HepTemplateFitter : public TTask {

  private:
    TList   *fDataSamples;     // List of data samples (might be also MC)
    TList   *fMCSamples;       // List of MC samples

    TList   *fTemplates;       // List with templates
    TH1F    *fReference;       // Histogram to which the templates are fitted
    
    TString *fExportDir;       // Working directory
    Bool_t   fExportROOT;      // Export all plots to a ROOT file ?
    TFile   *fOutputRootFile;  // Output file containing all plots 

    TFractionFitter *fFitter;
    
  public:
    HepTemplateFitter(const char* name, const char* title);
    virtual ~HepTemplateFitter();
    virtual void Exec(Option_t *option = "");

    HepDataMCSample* AddMCSample(const char* path, const char* label, Float_t xsec); // *MENU*

    HepDataMCSample* AddDataSample(const char* path, const char* label); // *MENU*
    HepDataMCSample* AddDataSample(const char* path, const char* label, Float_t xsec); // *MENU*

    void GenerateTemplate(char* histname, char* templatename, Color_t color);
    void GenerateTemplate(char* histname, char* templatename, Double_t low, Double_t high, Color_t color);
    
    void GenerateReference(char* histname);

    inline void SetWorkingDir(const char* dir)
    { SetExportDir(dir); }
    inline void SetExportDir(const char* dir) {
	fExportDir->Remove(0);
	fExportDir->Append(dir);
    }
    Bool_t GetExportROOT() { return fExportROOT; }
    
  private:
    HepDataMCSample* AddMCSample(const char* path, const char* label, Color_t color,
			 Style_t line_style, Width_t line_width,
			 Style_t fill_style);
    HepDataMCSample* AddDataSample(const char* path, const char* label, Color_t color,
      		 Style_t line_style, Width_t line_width,
      		 Style_t fill_style);

    void         FillTemplates();
    HepTemplate* BuildTemplate(char* histname, char* templatename, Color_t color);
    THStack*     BuildStackPlot();
    ClassDef(HepTemplateFitter,0) // Template Fitter
};
#endif

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