ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 *    File: $Id: RooTreeDataStore.h 31258 2009-11-17 22:41:06Z wouter $
 * 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_TREE_DATA_STORE
#define ROO_TREE_DATA_STORE

#include "RooAbsDataStore.h" 
#include "TString.h"

class RooAbsArg ;
class RooArgList ;
class TTree ;
class RooFormulaVar ;
class RooArgSet ;


class RooTreeDataStore : public RooAbsDataStore {
public:

  RooTreeDataStore() ; 
  RooTreeDataStore(TTree* t, const RooArgSet& vars, const char* wgtVarName=0) ; 

  // Empty ctor
  RooTreeDataStore(const char* name, const char* title, const RooArgSet& vars, const char* wgtVarName=0) ;
  virtual RooAbsDataStore* clone(const RooArgSet& vars, const char* newname=0) const { return new RooTreeDataStore(*this,vars,newname) ; }

  // Ctors from TTree
  RooTreeDataStore(const char* name, const char* title, const RooArgSet& vars, TTree& t, const RooFormulaVar& select, const char* wgtVarName=0) ; 
  RooTreeDataStore(const char* name, const char* title, const RooArgSet& vars, TTree& t, const char* selExpr=0, const char* wgtVarName=0) ; 

  // Ctors from DataStore
  RooTreeDataStore(const char* name, const char* title, const RooArgSet& vars, const RooAbsDataStore& tds, const RooFormulaVar& select, const char* wgtVarName=0) ;
  RooTreeDataStore(const char* name, const char* title, const RooArgSet& vars, const RooAbsDataStore& tds, const char* selExpr=0, const char* wgtVarName=0) ;

  RooTreeDataStore(const char *name, const char *title, RooAbsDataStore& tds, 
		   const RooArgSet& vars, const RooFormulaVar* cutVar, const char* cutRange,
		   Int_t nStart, Int_t nStop, Bool_t /*copyCache*/, const char* wgtVarName=0) ;

  RooTreeDataStore(const RooTreeDataStore& other, const char* newname=0) ;
  RooTreeDataStore(const RooTreeDataStore& other, const RooArgSet& vars, const char* newname=0) ;
  virtual ~RooTreeDataStore() ;


  // Write current row
  virtual Int_t fill() ;

  // Retrieve a row
  using RooAbsDataStore::get ;
  virtual const RooArgSet* get(Int_t index) const ;
  virtual Double_t weight() const ;
  virtual Double_t weightError(RooAbsData::ErrorType etype=RooAbsData::Poisson) const ;
  virtual void weightError(Double_t& lo, Double_t& hi, RooAbsData::ErrorType etype=RooAbsData::Poisson) const ; 
  virtual Double_t weight(Int_t index) const ;
  virtual Bool_t isWeighted() const { return (_wgtVar!=0||_extWgtArray!=0) ; }

  // Change observable name
  virtual Bool_t changeObservableName(const char* from, const char* to) ;
  
  // Add one or more columns
  virtual RooAbsArg* addColumn(RooAbsArg& var, Bool_t adjustRange=kTRUE) ;
  virtual RooArgSet* addColumns(const RooArgList& varList) ;

  // Merge column-wise
  RooAbsDataStore* merge(const RooArgSet& allvars, std::list<RooAbsDataStore*> dstoreList) ;

  // Add rows 
  virtual void append(RooAbsDataStore& other) ;

  // General & bookkeeping methods
  virtual Bool_t valid() const ;
  virtual Int_t numEntries() const ;
  virtual void reset() ;
  
  // Tree access
  TTree& tree() { return *_tree ; }
  virtual const TTree* tree() const { return _tree ; }  

  // Forwarded from TTree
  Stat_t GetEntries() const;
  void Reset(Option_t* option=0);
  Int_t Fill();
  Int_t GetEntry(Int_t entry = 0, Int_t getall = 0);

  void	Draw(Option_t* option = "") ;

  // Constant term  optimizer interface
  virtual void cacheArgs(const RooAbsArg* owner, RooArgSet& varSet, const RooArgSet* nset=0) ;
  virtual const RooAbsArg* cacheOwner() { return _cacheOwner ; }
  virtual void setArgStatus(const RooArgSet& set, Bool_t active) ;
  virtual void resetCache() ;

  void loadValues(const TTree *t, const RooFormulaVar* select=0, const char* rangeName=0, Int_t nStart=0, Int_t nStop=2000000000)  ;
  void loadValues(const RooAbsDataStore *tds, const RooFormulaVar* select=0, const char* rangeName=0, Int_t nStart=0, Int_t nStop=2000000000)  ;

  virtual void checkInit() const;

  void setExternalWeightArray(Double_t* arrayWgt, Double_t* arrayWgtErrLo, Double_t* arrayWgtErrHi, Double_t* arraySumW2) { 
    _extWgtArray = arrayWgt ; 
    _extWgtErrLoArray = arrayWgtErrLo ;
    _extWgtErrHiArray = arrayWgtErrHi ;
    _extSumW2Array = arraySumW2 ;
  }
  
 protected:

  RooArgSet varsNoWeight(const RooArgSet& allVars, const char* wgtName=0) ;
  RooRealVar* weightVar(const RooArgSet& allVars, const char* wgtName=0) ;

  void initialize();
  void attachCache(const RooAbsArg* newOwner, const RooArgSet& cachedVars) ;

  // TTree Branch buffer size control
  void setBranchBufferSize(Int_t size) { _defTreeBufSize = size ; }
  Int_t getBranchBufferSize() const { return _defTreeBufSize ; }

  static Int_t _defTreeBufSize ;  

  void createTree(const char* name, const char* title) ; 
  TTree *_tree ;           // TTree holding the data points
  TTree *_cacheTree ;      //! TTree holding the cached function values
  const RooAbsArg* _cacheOwner ; //! Object owning cache contents
  mutable Bool_t _defCtor ;//! Was object constructed with default ctor?

  RooArgSet _varsww ;
  RooRealVar* _wgtVar ;     // Pointer to weight variable (if set)

  Double_t* _extWgtArray ;         //! External weight array
  Double_t* _extWgtErrLoArray ;    //! External weight array - low error
  Double_t* _extWgtErrHiArray ;    //! External weight array - high error
  Double_t* _extSumW2Array ;       //! External sum of weights array

  mutable Double_t  _curWgt ;      // Weight of current event
  mutable Double_t  _curWgtErrLo ; // Weight of current event
  mutable Double_t  _curWgtErrHi ; // Weight of current event
  mutable Double_t  _curWgtErr ;   // Weight of current event

  ClassDef(RooTreeDataStore,2) // TTree-based Data Storage class
};


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