// @(#)root/roostats:$Id$
// Authors: Kevin Belasco        17/06/2009
// Authors: Kyle Cranmer         17/06/2009
/*************************************************************************
 * 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 ROOSTATS_MarkovChain
#define ROOSTATS_MarkovChain

#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif

#ifndef ROO_REAL_VAR
#include "RooRealVar.h"
#endif
#ifndef ROO_DATA_SET
#include "RooDataSet.h"
#endif
#ifndef ROO_DATA_HIST
#include "RooDataHist.h"
#endif
#ifndef ROOT_THnSparse
#include "THnSparse.h"
#endif
//#include "RooArgSet.h"
//#include "RooMsgService.h"
//#include "RooRealVar.h"


namespace RooStats {

   class MarkovChain : public TNamed {

   public:
      MarkovChain();
      MarkovChain(RooArgSet& parameters);
      MarkovChain(const char* name, const char* title, RooArgSet& parameters);

      // safely add an entry to the chain
      virtual void Add(RooArgSet& entry, Double_t nllValue, Double_t weight = 1.0);
      // add an entry to the chain ONLY IF you have constructed with parameters
      // or called SetParameters
      virtual void AddFast(RooArgSet& entry, Double_t nllValue, Double_t weight = 1.0);
      // add another markov chain
      virtual void AddWithBurnIn(MarkovChain& otherChain, Int_t burnIn = 0);
      // add another markov chain
      virtual void Add(MarkovChain& otherChain, Double_t discardEntries = 0.0);
      // set which of your parameters this chain should store
      virtual void SetParameters(RooArgSet& parameters);
      // get the number of steps in the chain
      virtual Int_t Size() const { return fChain ? fChain->numEntries() : 0; }
      // get the entry at position i
      virtual const RooArgSet* Get(Int_t i) const { return fChain->get(i); }
      // get the entry at the current position
      virtual const RooArgSet* Get() const { return fChain->get(); }
      // get the weight of the current (last indexed) entry
      virtual Double_t Weight() const;
      // get the weight of entry at position i
      virtual Double_t Weight(Int_t i) const;
      // get the NLL value of entry at position i
      virtual Double_t NLL(Int_t i) const; 
      // get the NLL value of the current (last indexed) entry
      virtual Double_t NLL() const;

      // get this MarkovChain as a RooDataSet whose entries contain the values
      // of whichVars.  Call with whichVars = NULL (default) to get values of
      // all variables (including NLL value and weight);
      // Note: caller owns the returned data set
      virtual RooDataSet* GetAsDataSet(RooArgSet* whichVars = NULL) const;

      // Get a clone of the markov chain on which this interval is based
      // as a RooDataSet.  You own the returned RooDataSet*
      virtual RooDataSet* GetAsDataSet(const RooCmdArg& arg1,
                                       const RooCmdArg& arg2=RooCmdArg::none(), const RooCmdArg& arg3=RooCmdArg::none(),
                                       const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
                                       const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(),
                                       const RooCmdArg& arg8=RooCmdArg::none() ) const; 

      virtual const RooDataSet* GetAsConstDataSet() const { return fChain; }

      // get this MarkovChain as a RooDataHist whose entries contain the values
      // of whichVars.  Call with whichVars = NULL (default) to get values of
      // all variables (including NLL value and weight);
      // Note: caller owns the returned data hist
      virtual RooDataHist* GetAsDataHist(RooArgSet* whichVars = NULL) const;

      // Get a clone of the markov chain on which this interval is based
      // as a RooDataHist.  You own the returned RooDataHist*
      virtual RooDataHist* GetAsDataHist(const RooCmdArg & arg1,
                                         const RooCmdArg& arg2=RooCmdArg::none(), const RooCmdArg& arg3=RooCmdArg::none(),
                                         const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
                                         const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(),
                                         const RooCmdArg& arg8=RooCmdArg::none() ) const; 

      // Get a clone of the markov chain on which this interval is based
      // as a sparse histogram.  You own the returned THnSparse*
      virtual THnSparse* GetAsSparseHist(RooAbsCollection* whichVars = NULL) const;
      virtual THnSparse* GetAsSparseHist(RooAbsCollection& whichVars) const
      { return GetAsSparseHist(&whichVars); }

      // get a clone of the NLL variable
      virtual RooRealVar* GetNLLVar() const
      { return (RooRealVar*)fNLL->Clone(); }

      // get a clone of the weight variable
      virtual RooRealVar* GetWeightVar() const
      { return (RooRealVar*)fWeight->Clone(); }

      virtual ~MarkovChain()
      {
         delete fParameters;
         delete fDataEntry;
         delete fChain;
      }

   protected:
      RooArgSet * fParameters;
      RooArgSet * fDataEntry;
      RooDataSet* fChain;
      RooRealVar* fNLL;
      RooRealVar* fWeight;

      ClassDef(MarkovChain,1);
   };
}

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