// @(#)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_MEASUREMENT_H
#define HISTFACTORY_MEASUREMENT_H

#include <string>
#include <map>
#include <fstream>
#include <iostream>

#include "TObject.h"
#include "TFile.h"


#include "PreprocessFunction.h"
#include "RooStats/HistFactory/Channel.h"
#include "RooStats/HistFactory/Asimov.h"

namespace RooStats{
namespace HistFactory {

class Measurement : public TNamed {


public:

  Measurement();
  //  Measurement( const Measurement& other ); // Copy
  Measurement(const char* Name, const char* Title="");

  //  set output prefix
  void SetOutputFilePrefix( const std::string& prefix ) { fOutputFilePrefix = prefix; }
  // retrieve prefix for output files
  std::string GetOutputFilePrefix() { return fOutputFilePrefix; }

  // insert PoI at beginning of vector of PoIs
  void SetPOI( const std::string& POI ) { fPOI.insert( fPOI.begin(), POI ); }
  // append parameter to vector of PoIs
  void AddPOI( const std::string& POI ) { fPOI.push_back(POI); }
  // get name of PoI at given index
  std::string GetPOI(unsigned int i=0) { return fPOI.at(i); }
  // get vector of PoI names
  std::vector<std::string>& GetPOIList() { return fPOI; }


  // Add a parameter to be set as constant
  // (Similar to ParamSetting method below)
  void AddConstantParam( const std::string& param );
  // empty vector of constant parameters
  void ClearConstantParams() { fConstantParams.clear(); }
  // get vector of all constant parameters
  std::vector< std::string >& GetConstantParams() { return fConstantParams; }

  // Set a parameter to a specific value
  // (And optionally fix it)
  void SetParamValue( const std::string& param, double value);
  // get map: parameter name <--> parameter value
  std::map<std::string, double>& GetParamValues() { return fParamValues; }
  // clear map of parameter values
  void ClearParamValues() { fParamValues.clear(); }

  void AddPreprocessFunction( std::string name, std::string expression, std::string dependencies );
  // add a preprocess function object
  void AddFunctionObject( const RooStats::HistFactory::PreprocessFunction function) { fFunctionObjects.push_back( function ); }
  void SetFunctionObjects( std::vector< RooStats::HistFactory::PreprocessFunction > objects ) { fFunctionObjects = objects; }
  // get vector of defined function objects
  std::vector< RooStats::HistFactory::PreprocessFunction >& GetFunctionObjects() { return fFunctionObjects; }
  std::vector< std::string > GetPreprocessFunctions();

  // get vector of defined Asimov Datasets
  std::vector< RooStats::HistFactory::Asimov >& GetAsimovDatasets() { return fAsimovDatasets; }
  // add an Asimov Dataset
  void AddAsimovDataset( RooStats::HistFactory::Asimov dataset ) { fAsimovDatasets.push_back(dataset); }

  // set integrated luminosity used to normalise histograms (if NormalizeByTheory is true for this sample)
  void SetLumi(double Lumi ) { fLumi = Lumi; }
  // set relative uncertainty on luminosity
  void SetLumiRelErr( double RelErr ) { fLumiRelErr = RelErr; }
  // retrieve integrated luminosity
  double GetLumi() { return fLumi; }
  // retrieve relative uncertainty on luminosity
  double GetLumiRelErr() { return fLumiRelErr; }
  
  void SetBinLow( int BinLow ) { fBinLow = BinLow; }
  void SetBinHigh ( int BinHigh ) { fBinHigh = BinHigh; }
  int GetBinLow() { return fBinLow; }
  int GetBinHigh() { return fBinHigh; } 

  // do not produce any plots or tables, just save the model
  void SetExportOnly( bool ExportOnly ) { fExportOnly = ExportOnly; }
  bool GetExportOnly() { return fExportOnly; }


  void PrintTree( std::ostream& = std::cout ); // Print to a stream
  void PrintXML( std::string Directory="", std::string NewOutputPrefix="" );

  std::vector< RooStats::HistFactory::Channel >& GetChannels() { return fChannels; }
  RooStats::HistFactory::Channel& GetChannel( std::string );
  // add a completely configured channel
  void AddChannel( RooStats::HistFactory::Channel chan ) { fChannels.push_back( chan ); }

  bool HasChannel( std::string );
  void writeToFile( TFile* file );

  void CollectHistograms();


  void AddGammaSyst(std::string syst, double uncert);
  void AddLogNormSyst(std::string syst, double uncert);
  void AddUniformSyst(std::string syst);
  void AddNoSyst(std::string syst);

  std::map< std::string, double >& GetGammaSyst() { return fGammaSyst; }
  std::map< std::string, double >& GetUniformSyst() { return fUniformSyst; }
  std::map< std::string, double >& GetLogNormSyst() { return fLogNormSyst; }
  std::map< std::string, double >& GetNoSyst() { return fNoSyst; }


private:

  // Configurables of this measurement
  std::string fOutputFilePrefix;
  std::vector<std::string> fPOI;
  double fLumi;
  double fLumiRelErr;
  int fBinLow;
  int fBinHigh;
  bool fExportOnly;
  std::string fInterpolationScheme;

  // Channels that make up this measurement
  std::vector< RooStats::HistFactory::Channel > fChannels;

  // List of Parameters to be set constant
  std::vector< std::string > fConstantParams;

  // Map of parameter names to inital values to be set
  std::map< std::string, double > fParamValues;

  // List of Preprocess Function objects
  std::vector< RooStats::HistFactory::PreprocessFunction > fFunctionObjects;

  // List of Asimov datasets to generate
  std::vector< RooStats::HistFactory::Asimov > fAsimovDatasets;

  // List of Alternate constraint terms
  std::map< std::string, double > fGammaSyst;
  std::map< std::string, double > fUniformSyst;
  std::map< std::string, double > fLogNormSyst;
  std::map< std::string, double > fNoSyst;
  
  std::string GetDirPath( TDirectory* dir );

  ClassDef(RooStats::HistFactory::Measurement, 3);

};
 
} // namespace HistFactory
} // namespace RooStats

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