// @(#)root/roostats:$Id$
// Author: George Lewis, Kyle Cranmer
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef HISTFACTORY_SAMPLE_H
#define HISTFACTORY_SAMPLE_H

#include <string>
#include <fstream>
#include <vector>
#include <iostream>

class TH1;

#include "RooStats/HistFactory/HistRef.h"
#include "RooStats/HistFactory/Systematics.h"

namespace RooStats{
namespace HistFactory {

class Sample {


public:

  Sample();
  Sample(std::string Name);
  Sample(const Sample& other);
  /// constructor from name, file and path. Name of the histogram should not include the path
  Sample(std::string Name, std::string HistoName, std::string InputFile, std::string HistoPath="");
  ~Sample();

  void Print(std::ostream& = std::cout);  
  void PrintXML( std::ofstream& xml );
  void writeToFile( std::string FileName, std::string DirName );

  TH1* GetHisto();
  // set histogram for this sample
  void SetHisto( TH1* histo ) { fhNominal = histo; fHistoName=histo->GetName(); }
  void SetValue( Double_t Val );

  // Some helper functions
  /// Note that histogram name should not include the path of the histogram in the file.  
  /// This has to be given separatly 

  void ActivateStatError();
  void ActivateStatError( std::string HistoName, std::string InputFile, std::string HistoPath="" );

  void AddOverallSys( std::string Name, Double_t Low, Double_t High );
  void AddOverallSys( const OverallSys& Sys );

  void AddNormFactor( std::string Name, Double_t Val, Double_t Low, Double_t High, bool Const=false );
  void AddNormFactor( const NormFactor& Factor );

  void AddHistoSys(    std::string Name, std::string HistoNameLow,  std::string HistoFileLow,  std::string HistoPathLow,
		                         std::string HistoNameHigh, std::string HistoFileHigh, std::string HistoPathHigh );
  void AddHistoSys( const HistoSys& Sys );

  void AddHistoFactor( std::string Name, std::string HistoNameLow,  std::string HistoFileLow,  std::string HistoPathLow,  
		       std::string HistoNameHigh, std::string HistoFileHigh, std::string HistoPathHigh );
  void AddHistoFactor( const HistoFactor& Factor );

  void AddShapeFactor( std::string Name );
  void AddShapeFactor( const ShapeFactor& Factor );

  void AddShapeSys(    std::string Name, Constraint::Type ConstraintType, std::string HistoName, std::string HistoFile, std::string HistoPath="" );
  void AddShapeSys( const ShapeSys& Sys );

  // defines whether the normalization scale with luminosity
  void SetNormalizeByTheory( bool norm ) { fNormalizeByTheory = norm; }
  // does the normalization scale with luminosity
  bool GetNormalizeByTheory() { return fNormalizeByTheory; }


  // get name of sample
  std::string GetName() { return fName; }
  // set name of sample
  void SetName(const std::string& Name) { fName = Name; }

  // get input ROOT file
  std::string GetInputFile() { return fInputFile; }
  // set input ROOT file
  void SetInputFile(const std::string& InputFile) { fInputFile = InputFile; }

  // get histogram name
  std::string GetHistoName() { return fHistoName; }
  // set histogram name
  void SetHistoName(const std::string& HistoName) { fHistoName = HistoName; }

  // get histogram path
  std::string GetHistoPath() { return fHistoPath; }
  // set histogram path
  void SetHistoPath(const std::string& HistoPath) { fHistoPath = HistoPath; }

  // get name of associated channel
  std::string GetChannelName() { return fChannelName; }
  // set name of associated channel
  void SetChannelName(const std::string& ChannelName) { fChannelName = ChannelName; }



  std::vector< RooStats::HistFactory::OverallSys >& GetOverallSysList() { return fOverallSysList; }
  std::vector< RooStats::HistFactory::NormFactor >& GetNormFactorList() { return fNormFactorList; }

  std::vector< RooStats::HistFactory::HistoSys >&    GetHistoSysList() {    return fHistoSysList; }
  std::vector< RooStats::HistFactory::HistoFactor >& GetHistoFactorList() { return fHistoFactorList; }

  std::vector< RooStats::HistFactory::ShapeSys >&    GetShapeSysList() {    return fShapeSysList; }
  std::vector< RooStats::HistFactory::ShapeFactor >& GetShapeFactorList() { return fShapeFactorList; }

  RooStats::HistFactory::StatError& GetStatError() { return fStatError; }
  void SetStatError( RooStats::HistFactory::StatError Error ) { fStatError = Error; }


protected:

  std::string fName;
  std::string fInputFile;
  std::string fHistoName;
  std::string fHistoPath;

  // The Name of the parent channel
  std::string fChannelName;

  //
  // Systematics
  //

  std::vector< RooStats::HistFactory::OverallSys >  fOverallSysList;
  std::vector< RooStats::HistFactory::NormFactor >  fNormFactorList;

  std::vector< RooStats::HistFactory::HistoSys >    fHistoSysList;
  std::vector< RooStats::HistFactory::HistoFactor > fHistoFactorList;

  std::vector< RooStats::HistFactory::ShapeSys >    fShapeSysList;
  std::vector< RooStats::HistFactory::ShapeFactor > fShapeFactorList;


  // Properties
  RooStats::HistFactory::StatError fStatError;

  bool fNormalizeByTheory;
  bool fStatErrorActivate;


  // The Nominal Shape
  HistRef fhNominal;
  TH1* fhCountingHist;

};


} // namespace HistFactory
} // namespace RooStats

#endif
 Sample.h:1
 Sample.h:2
 Sample.h:3
 Sample.h:4
 Sample.h:5
 Sample.h:6
 Sample.h:7
 Sample.h:8
 Sample.h:9
 Sample.h:10
 Sample.h:11
 Sample.h:12
 Sample.h:13
 Sample.h:14
 Sample.h:15
 Sample.h:16
 Sample.h:17
 Sample.h:18
 Sample.h:19
 Sample.h:20
 Sample.h:21
 Sample.h:22
 Sample.h:23
 Sample.h:24
 Sample.h:25
 Sample.h:26
 Sample.h:27
 Sample.h:28
 Sample.h:29
 Sample.h:30
 Sample.h:31
 Sample.h:32
 Sample.h:33
 Sample.h:34
 Sample.h:35
 Sample.h:36
 Sample.h:37
 Sample.h:38
 Sample.h:39
 Sample.h:40
 Sample.h:41
 Sample.h:42
 Sample.h:43
 Sample.h:44
 Sample.h:45
 Sample.h:46
 Sample.h:47
 Sample.h:48
 Sample.h:49
 Sample.h:50
 Sample.h:51
 Sample.h:52
 Sample.h:53
 Sample.h:54
 Sample.h:55
 Sample.h:56
 Sample.h:57
 Sample.h:58
 Sample.h:59
 Sample.h:60
 Sample.h:61
 Sample.h:62
 Sample.h:63
 Sample.h:64
 Sample.h:65
 Sample.h:66
 Sample.h:67
 Sample.h:68
 Sample.h:69
 Sample.h:70
 Sample.h:71
 Sample.h:72
 Sample.h:73
 Sample.h:74
 Sample.h:75
 Sample.h:76
 Sample.h:77
 Sample.h:78
 Sample.h:79
 Sample.h:80
 Sample.h:81
 Sample.h:82
 Sample.h:83
 Sample.h:84
 Sample.h:85
 Sample.h:86
 Sample.h:87
 Sample.h:88
 Sample.h:89
 Sample.h:90
 Sample.h:91
 Sample.h:92
 Sample.h:93
 Sample.h:94
 Sample.h:95
 Sample.h:96
 Sample.h:97
 Sample.h:98
 Sample.h:99
 Sample.h:100
 Sample.h:101
 Sample.h:102
 Sample.h:103
 Sample.h:104
 Sample.h:105
 Sample.h:106
 Sample.h:107
 Sample.h:108
 Sample.h:109
 Sample.h:110
 Sample.h:111
 Sample.h:112
 Sample.h:113
 Sample.h:114
 Sample.h:115
 Sample.h:116
 Sample.h:117
 Sample.h:118
 Sample.h:119
 Sample.h:120
 Sample.h:121
 Sample.h:122
 Sample.h:123
 Sample.h:124
 Sample.h:125
 Sample.h:126
 Sample.h:127
 Sample.h:128
 Sample.h:129
 Sample.h:130
 Sample.h:131
 Sample.h:132
 Sample.h:133
 Sample.h:134
 Sample.h:135
 Sample.h:136
 Sample.h:137
 Sample.h:138
 Sample.h:139
 Sample.h:140
 Sample.h:141
 Sample.h:142
 Sample.h:143
 Sample.h:144
 Sample.h:145
 Sample.h:146
 Sample.h:147
 Sample.h:148
 Sample.h:149
 Sample.h:150
 Sample.h:151
 Sample.h:152
 Sample.h:153
 Sample.h:154
 Sample.h:155
 Sample.h:156
 Sample.h:157
 Sample.h:158
 Sample.h:159
 Sample.h:160
 Sample.h:161
 Sample.h:162