ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 *    File: $Id: RooDataHist.h,v 1.37 2007/05/11 09:11:30 verkerke Exp $
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/
#ifndef ROO_DATA_HIST
#define ROO_DATA_HIST

#include "RooAbsData.h"
#include "RooDirItem.h"
#include "RooArgSet.h"
#include "RooNameSet.h"
#include "RooCacheManager.h"
#include <vector>
#include <list>
#include <map>
#include <string>

class TObject ;
class RooAbsArg;
class RooAbsReal ;
class RooAbsCategory ;
class Roo1DTable ;
class RooPlot;
class RooArgSet ;
class RooLinkedList ;
class RooAbsLValue ;

class RooDataHist : public RooAbsData, public RooDirItem {
public:

  // Constructors, factory methods etc.
  RooDataHist() ; 
  RooDataHist(const char *name, const char *title, const RooArgSet& vars, const char* binningName=0) ;
  RooDataHist(const char *name, const char *title, const RooArgSet& vars, const RooAbsData& data, Double_t initWgt=1.0) ;
  RooDataHist(const char *name, const char *title, const RooArgList& vars, const TH1* hist, Double_t initWgt=1.0) ;
  RooDataHist(const char *name, const char *title, const RooArgList& vars, RooCategory& indexCat, std::map<std::string,TH1*> histMap, Double_t initWgt=1.0) ;
  RooDataHist(const char *name, const char *title, const RooArgList& vars, RooCategory& indexCat, std::map<std::string,RooDataHist*> dhistMap, Double_t wgt=1.0) ;
  //RooDataHist(const char *name, const char *title, const RooArgList& vars, Double_t initWgt=1.0) ;
  RooDataHist(const char *name, const char *title, const RooArgList& vars, RooCmdArg arg1, RooCmdArg arg2=RooCmdArg(), RooCmdArg arg3=RooCmdArg(),
	      RooCmdArg arg4=RooCmdArg(),RooCmdArg arg5=RooCmdArg(),RooCmdArg arg6=RooCmdArg(),RooCmdArg arg7=RooCmdArg(),RooCmdArg arg8=RooCmdArg()) ;


  RooDataHist(const RooDataHist& other, const char* newname = 0) ;
  virtual TObject* Clone(const char* newname=0) const { return new RooDataHist(*this,newname?newname:GetName()) ; }
  virtual ~RooDataHist() ;

  virtual RooAbsData* emptyClone(const char* newName=0, const char* newTitle=0, const RooArgSet*vars=0) const {
    // Return empty clone of this RooDataHist
    return new RooDataHist(newName?newName:GetName(),newTitle?newTitle:GetTitle(),vars?*vars:*get()) ; 
  }

  // Add one ore more rows of data
  virtual void add(const RooArgSet& row, Double_t wgt=1.0) { 
    // Increment weight of bin enclosing coordinate stored in row by wgt
    add(row,wgt,-1.) ; 
  }
  virtual void add(const RooArgSet& row, Double_t weight, Double_t sumw2) ;
  void set(Double_t weight, Double_t wgtErr=-1) ;
  void set(const RooArgSet& row, Double_t weight, Double_t wgtErr=-1) ;
  void set(const RooArgSet& row, Double_t weight, Double_t wgtErrLo, Double_t wgtErrHi) ;

  void add(const RooAbsData& dset, const RooFormulaVar* cutVar=0, Double_t weight=1.0 ) ;
  void add(const RooAbsData& dset, const char* cut, Double_t weight=1.0 ) ;

  virtual const RooArgSet* get() const { 
    // Return set with coordinates of center of current bin
    return &_vars ; 
  } 
  virtual const RooArgSet* get(Int_t masterIdx) const ;
  virtual const RooArgSet* get(const RooArgSet& coord) const ;
  virtual Int_t numEntries() const ; 
  virtual Double_t sumEntries(const char* cutSpec=0, const char* cutRange=0) const ;
  virtual Bool_t isWeighted() const { 
    // Return true as all histograms have in principle events weight != 1
    return kTRUE ;     
  }
  virtual Bool_t isNonPoissonWeighted() const ;

  Double_t sum(Bool_t correctForBinSize) const ;
  Double_t sum(const RooArgSet& sumSet, const RooArgSet& sliceSet, Bool_t correctForBinSize) ;

  virtual Double_t weight() const { 
    // Return weight of current bin
    return _curWeight ; 
  }
  Double_t weight(const RooArgSet& bin, Int_t intOrder=1, Bool_t correctForBinSize=kFALSE, Bool_t cdfBoundaries=kFALSE) ;   
  Double_t binVolume() const { return _curVolume ; }
  Double_t binVolume(const RooArgSet& bin) ; 
  virtual Bool_t valid() const ;

  TIterator* sliceIterator(RooAbsArg& sliceArg, const RooArgSet& otherArgs) ;
  
  virtual void weightError(Double_t& lo, Double_t& hi, ErrorType etype=Poisson) const ;
  virtual Double_t weightError(ErrorType etype=Poisson) const { 
    // Return symmetric error on current bin calculated either from Poisson statistics or from SumOfWeights
    Double_t lo,hi ;
    weightError(lo,hi,etype) ;
    return (lo+hi)/2 ;
  }

  using RooAbsData::plotOn ;
  virtual RooPlot *plotOn(RooPlot *frame, PlotOpt o) const;
  
  virtual void reset() ;
  void dump2() ;

  virtual void printMultiline(ostream& os, Int_t content, Bool_t verbose=kFALSE, TString indent="") const ;
  virtual void printArgs(ostream& os) const ;
  virtual void printValue(ostream& os) const ;

  void SetName(const char *name) ;
  void SetNameTitle(const char *name, const char* title) ;

  Int_t getIndex(const RooArgSet& coord) ;

  void removeSelfFromDir() { removeFromDir(this) ; }
  
protected:

  friend class RooAbsCachedPdf ;
  friend class RooAbsCachedReal ;
  friend class RooDataHistSliceIter ;
  friend class RooAbsOptTestStatistic ;

  Int_t calcTreeIndex() const ;
  void cacheValidEntries() ;

  void setAllWeights(Double_t value) ;
 
  void initialize(const char* binningName=0,Bool_t fillTree=kTRUE) ;
  RooDataHist(const char* name, const char* title, RooDataHist* h, const RooArgSet& varSubset, 
	      const RooFormulaVar* cutVar, const char* cutRange, Int_t nStart, Int_t nStop, Bool_t copyCache) ;
  RooAbsData* reduceEng(const RooArgSet& varSubset, const RooFormulaVar* cutVar, const char* cutRange=0, 
	                Int_t nStart=0, Int_t nStop=2000000000, Bool_t copyCache=kTRUE) ;
  Double_t interpolateDim(RooRealVar& dim, const RooAbsBinning* binning, Double_t xval, Int_t intOrder, Bool_t correctForBinSize, Bool_t cdfBoundaries) ;
  void calculatePartialBinVolume(const RooArgSet& dimSet) const ;

  void adjustBinning(const RooArgList& vars, TH1& href, Int_t* offset=0) ;
  void importTH1(const RooArgList& vars, TH1& histo, Double_t initWgt) ;
  void importTH1Set(const RooArgList& vars, RooCategory& indexCat, std::map<std::string,TH1*> hmap, Double_t initWgt) ;
  void importDHistSet(const RooArgList& vars, RooCategory& indexCat, std::map<std::string,RooDataHist*> dmap, Double_t initWgt) ;

  virtual RooAbsData* cacheClone(const RooAbsArg* newCacheOwner, const RooArgSet* newCacheVars, const char* newName=0) ;


  Int_t       _arrSize ; //  Size of the weight array
  std::vector<Int_t> _idxMult ; // Multiplier jump table for index calculation

  Double_t*       _wgt ; //[_arrSize] Weight array
  Double_t*     _errLo ; //[_arrSize] Low-side error on weight array
  Double_t*     _errHi ; //[_arrSize] High-side error on weight array
  Double_t*     _sumw2 ; //[_arrSize] Sum of weights^2
  Double_t*      _binv ; //[_arrSize] Bin volume array  

  RooArgSet  _realVars ; // Real dimensions of the dataset 
  TIterator* _realIter ; //! Iterator over realVars
  Bool_t*    _binValid ; //! Valid bins with current range definition
 
  mutable Double_t _curWeight ; // Weight associated with the current coordinate
  mutable Double_t _curWgtErrLo ; // Error on weight associated with the current coordinate
  mutable Double_t _curWgtErrHi ; // Error on weight associated with the current coordinate
  mutable Double_t _curSumW2 ; // Current sum of weights^2
  mutable Double_t _curVolume ; // Volume of bin enclosing current coordinate
  mutable Int_t    _curIndex ; // Current index

  mutable std::vector<Double_t>* _pbinv ; //! Partial bin volume array
  mutable RooCacheManager<std::vector<Double_t> > _pbinvCacheMgr ; //! Cache manager for arrays of partial bin volumes
  std::list<RooAbsLValue*> _lvvars ; //! List of observables casted as RooAbsLValue
  std::list<const RooAbsBinning*> _lvbins ; //! List of used binnings associated with lvalues

private:

  ClassDef(RooDataHist,4) // Binned data set
};

#endif

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