00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "RooFit.h"
00027 #include "Riostream.h"
00028
00029 #include "RooHistFunc.h"
00030 #include "RooDataHist.h"
00031 #include "RooMsgService.h"
00032 #include "RooRealVar.h"
00033 #include "RooCategory.h"
00034
00035
00036
00037 ClassImp(RooHistFunc)
00038 ;
00039
00040
00041
00042
00043 RooHistFunc::RooHistFunc() : _dataHist(0), _totVolume(0)
00044 {
00045
00046 }
00047
00048
00049
00050 RooHistFunc::RooHistFunc(const char *name, const char *title, const RooArgSet& vars,
00051 const RooDataHist& dhist, Int_t intOrder) :
00052 RooAbsReal(name,title),
00053 _depList("depList","List of dependents",this),
00054 _dataHist((RooDataHist*)&dhist),
00055 _codeReg(10),
00056 _intOrder(intOrder),
00057 _cdfBoundaries(kFALSE),
00058 _totVolume(0),
00059 _unitNorm(kFALSE)
00060 {
00061
00062
00063
00064
00065
00066
00067 _depList.add(vars) ;
00068
00069
00070 const RooArgSet* dvars = dhist.get() ;
00071 if (vars.getSize()!=dvars->getSize()) {
00072 coutE(InputArguments) << "RooHistFunc::ctor(" << GetName()
00073 << ") ERROR variable list and RooDataHist must contain the same variables." << endl ;
00074 assert(0) ;
00075 }
00076 TIterator* iter = vars.createIterator() ;
00077 RooAbsArg* arg ;
00078 while((arg=(RooAbsArg*)iter->Next())) {
00079 if (!dvars->find(arg->GetName())) {
00080 coutE(InputArguments) << "RooHistFunc::ctor(" << GetName()
00081 << ") ERROR variable list and RooDataHist must contain the same variables." << endl ;
00082 assert(0) ;
00083 }
00084 }
00085 delete iter ;
00086 }
00087
00088
00089
00090
00091 RooHistFunc::RooHistFunc(const RooHistFunc& other, const char* name) :
00092 RooAbsReal(other,name),
00093 _depList("depList",this,other._depList),
00094 _dataHist(other._dataHist),
00095 _codeReg(other._codeReg),
00096 _intOrder(other._intOrder),
00097 _cdfBoundaries(other._cdfBoundaries),
00098 _totVolume(other._totVolume),
00099 _unitNorm(other._unitNorm)
00100 {
00101
00102 }
00103
00104
00105
00106
00107 Double_t RooHistFunc::evaluate() const
00108 {
00109
00110
00111
00112
00113 Double_t ret = _dataHist->weight(_depList,_intOrder,kFALSE,_cdfBoundaries) ;
00114 return ret ;
00115 }
00116
00117
00118
00119 Double_t RooHistFunc::totVolume() const
00120 {
00121
00122
00123
00124 if (_totVolume>0) {
00125 return _totVolume ;
00126 }
00127 _totVolume = 1. ;
00128 TIterator* iter = _depList.createIterator() ;
00129 RooAbsArg* arg ;
00130 while((arg=(RooAbsArg*)iter->Next())) {
00131 RooRealVar* real = dynamic_cast<RooRealVar*>(arg) ;
00132 if (real) {
00133 _totVolume *= (real->getMax()-real->getMin()) ;
00134 } else {
00135 RooCategory* cat = dynamic_cast<RooCategory*>(arg) ;
00136 if (cat) {
00137 _totVolume *= cat->numTypes() ;
00138 }
00139 }
00140 }
00141 delete iter ;
00142 return _totVolume ;
00143 }
00144
00145
00146
00147
00148 Int_t RooHistFunc::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName) const
00149 {
00150
00151
00152
00153
00154
00155
00156
00157
00158 if (rangeName!=0) {
00159 return 0 ;
00160 }
00161
00162
00163 RooAbsCollection *allVarsCommon = allVars.selectCommon(_depList) ;
00164 Bool_t intAllObs = (allVarsCommon->getSize()==_depList.getSize()) ;
00165 if (intAllObs && matchArgs(allVars,analVars,_depList)) {
00166 return 1000 ;
00167 }
00168
00169
00170 if (_intOrder>0) {
00171 return 0 ;
00172 }
00173
00174
00175 RooArgSet* allVarsSel = (RooArgSet*) allVars.selectCommon(_depList) ;
00176 if (allVarsSel->getSize()==0) {
00177 delete allVarsSel ;
00178 return 0 ;
00179 }
00180
00181
00182
00183 Int_t code(0),n(0) ;
00184 TIterator* iter = _depList.createIterator() ;
00185 RooAbsArg* arg ;
00186 while((arg=(RooAbsArg*)iter->Next())) {
00187 if (allVars.find(arg->GetName())) code |= (1<<n) ;
00188 n++ ;
00189 }
00190 delete iter ;
00191 analVars.add(*allVarsSel) ;
00192
00193 return code ;
00194
00195 }
00196
00197
00198
00199
00200 Double_t RooHistFunc::analyticalIntegral(Int_t code, const char* ) const
00201 {
00202
00203
00204
00205
00206
00207
00208
00209 if (code==1000) {
00210 return _dataHist->sum(kTRUE) ;
00211 }
00212
00213
00214
00215 RooArgSet intSet ;
00216 TIterator* iter = _depList.createIterator() ;
00217 RooAbsArg* arg ;
00218 Int_t n(0) ;
00219 while((arg=(RooAbsArg*)iter->Next())) {
00220 if (code & (1<<n)) {
00221 intSet.add(*arg) ;
00222 }
00223 n++ ;
00224 }
00225 delete iter ;
00226
00227 Double_t ret = _dataHist->sum(intSet,_depList,kTRUE) ;
00228 return ret ;
00229 }
00230
00231
00232
00233
00234 list<Double_t>* RooHistFunc::plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const
00235 {
00236
00237
00238
00239
00240
00241 if (_intOrder>0) {
00242 return 0 ;
00243 }
00244
00245
00246 RooAbsLValue* lvarg = dynamic_cast<RooAbsLValue*>(_dataHist->get()->find(obs.GetName())) ;
00247 if (!lvarg) {
00248 return 0 ;
00249 }
00250
00251
00252 const RooAbsBinning* binning = lvarg->getBinningPtr(0) ;
00253 Double_t* boundaries = binning->array() ;
00254
00255 list<Double_t>* hint = new list<Double_t> ;
00256
00257
00258 xlo = xlo - 0.01*(xhi-xlo) ;
00259 xhi = xhi + 0.01*(xhi-xlo) ;
00260
00261 Double_t delta = (xhi-xlo)*1e-8 ;
00262
00263
00264
00265 for (Int_t i=0 ; i<binning->numBoundaries() ; i++) {
00266 if (boundaries[i]>=xlo && boundaries[i]<=xhi) {
00267 hint->push_back(boundaries[i]-delta) ;
00268 hint->push_back(boundaries[i]+delta) ;
00269 }
00270 }
00271
00272 return hint ;
00273 }
00274
00275