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
00027
00028
00029
00030
00031
00032
00033
00034 #include "RooFit.h"
00035
00036 #include "Riostream.h"
00037 #include "Riostream.h"
00038 #include <math.h>
00039
00040 #include "RooGenProdProj.h"
00041 #include "RooAbsReal.h"
00042 #include "RooAbsPdf.h"
00043 #include "RooErrorHandler.h"
00044 #include "RooProduct.h"
00045
00046 ClassImp(RooGenProdProj)
00047 ;
00048
00049
00050
00051 RooGenProdProj::RooGenProdProj()
00052 {
00053
00054 }
00055
00056
00057
00058 RooGenProdProj::RooGenProdProj(const char *name, const char *title, const RooArgSet& _prodSet, const RooArgSet& _intSet,
00059 const RooArgSet& _normSet, const char* isetRangeName, const char* normRangeName, Bool_t doFactorize) :
00060 RooAbsReal(name, title),
00061 _compSetOwnedN(0),
00062 _compSetOwnedD(0),
00063 _compSetN("compSetN","Set of integral components owned by numerator",this,kFALSE),
00064 _compSetD("compSetD","Set of integral components owned by denominator",this,kFALSE),
00065 _intList("intList","List of integrals",this,kTRUE),
00066 _haveD(kFALSE)
00067 {
00068
00069
00070
00071
00072 _compSetOwnedN = new RooArgSet ;
00073 _compSetOwnedD = new RooArgSet ;
00074
00075 RooAbsReal* numerator = makeIntegral("numerator",_prodSet,_intSet,*_compSetOwnedN,isetRangeName,doFactorize) ;
00076 RooAbsReal* denominator = makeIntegral("denominator",_prodSet,_normSet,*_compSetOwnedD,normRangeName,doFactorize) ;
00077
00078
00079
00080
00081
00082
00083
00084 _compSetN.add(*_compSetOwnedN) ;
00085 _compSetD.add(*_compSetOwnedD) ;
00086
00087 _intList.add(*numerator) ;
00088 if (denominator) {
00089 _intList.add(*denominator) ;
00090 _haveD = kTRUE ;
00091 }
00092 }
00093
00094
00095
00096
00097 RooGenProdProj::RooGenProdProj(const RooGenProdProj& other, const char* name) :
00098 RooAbsReal(other, name),
00099 _compSetOwnedN(0),
00100 _compSetOwnedD(0),
00101 _compSetN("compSetN","Set of integral components owned by numerator",this),
00102 _compSetD("compSetD","Set of integral components owned by denominator",this),
00103 _intList("intList","List of integrals",this)
00104 {
00105
00106
00107
00108 TIterator* iter = serverIterator() ;
00109 RooAbsArg* server ;
00110 while((server=(RooAbsArg*)iter->Next())) {
00111 removeServer(*server,kTRUE) ;
00112 }
00113 delete iter ;
00114
00115
00116 _compSetOwnedN = (RooArgSet*) other._compSetN.snapshot() ;
00117 _compSetN.add(*_compSetOwnedN) ;
00118
00119 _compSetOwnedD = (RooArgSet*) other._compSetD.snapshot() ;
00120 _compSetD.add(*_compSetOwnedD) ;
00121
00122 RooAbsArg* arg ;
00123 TIterator* nIter = _compSetOwnedN->createIterator() ;
00124 while((arg=(RooAbsArg*)nIter->Next())) {
00125
00126 arg->setOperMode(_operMode) ;
00127 }
00128 delete nIter ;
00129 TIterator* dIter = _compSetOwnedD->createIterator() ;
00130 while((arg=(RooAbsArg*)dIter->Next())) {
00131
00132 arg->setOperMode(_operMode) ;
00133 }
00134 delete dIter ;
00135
00136
00137 _haveD = other._haveD ;
00138 _intList.add(*_compSetN.find(other._intList.at(0)->GetName())) ;
00139 if (other._haveD) {
00140 _intList.add(*_compSetD.find(other._intList.at(1)->GetName())) ;
00141 }
00142 }
00143
00144
00145
00146
00147 RooGenProdProj::~RooGenProdProj()
00148 {
00149
00150
00151 if (_compSetOwnedN) delete _compSetOwnedN ;
00152 if (_compSetOwnedD) delete _compSetOwnedD ;
00153 }
00154
00155
00156
00157
00158 RooAbsReal* RooGenProdProj::makeIntegral(const char* name, const RooArgSet& compSet, const RooArgSet& intSet,
00159 RooArgSet& saveSet, const char* isetRangeName, Bool_t doFactorize)
00160 {
00161
00162
00163
00164
00165
00166 RooArgSet anaIntSet, numIntSet ;
00167
00168
00169 TIterator* compIter = compSet.createIterator() ;
00170 TIterator* intIter = intSet.createIterator() ;
00171 RooAbsPdf* pdf ;
00172 RooAbsArg* arg ;
00173 while((arg=(RooAbsArg*)intIter->Next())) {
00174 Int_t count(0) ;
00175 compIter->Reset() ;
00176 while((pdf=(RooAbsPdf*)compIter->Next())) {
00177 if (pdf->dependsOn(*arg)) count++ ;
00178 }
00179
00180 if (count==0) {
00181 } else if (count==1) {
00182 anaIntSet.add(*arg) ;
00183 } else {
00184 }
00185 }
00186
00187
00188 RooArgSet prodSet ;
00189 numIntSet.add(intSet) ;
00190
00191 compIter->Reset() ;
00192 while((pdf=(RooAbsPdf*)compIter->Next())) {
00193 if (doFactorize && pdf->dependsOn(anaIntSet)) {
00194 RooArgSet anaSet ;
00195 Int_t code = pdf->getAnalyticalIntegralWN(anaIntSet,anaSet,0,isetRangeName) ;
00196 if (code!=0) {
00197
00198 RooAbsReal* pai = pdf->createIntegral(anaSet,isetRangeName) ;
00199 pai->setOperMode(_operMode) ;
00200
00201
00202 prodSet.add(*pai) ;
00203
00204
00205 numIntSet.remove(anaSet) ;
00206
00207
00208 saveSet.addOwned(*pai) ;
00209 } else {
00210
00211 prodSet.add(*pdf) ;
00212 }
00213 } else {
00214
00215 prodSet.add(*pdf) ;
00216 }
00217 }
00218
00219
00220
00221
00222 TString prodName ;
00223 if (isetRangeName) {
00224 prodName = Form("%s_%s_Range[%s]",GetName(),name,isetRangeName) ;
00225 } else {
00226 prodName = Form("%s_%s",GetName(),name) ;
00227 }
00228 RooProduct* prod = new RooProduct(prodName,"product",prodSet) ;
00229 prod->setOperMode(_operMode) ;
00230
00231
00232 saveSet.addOwned(*prod) ;
00233
00234
00235 RooAbsReal* ret = prod->createIntegral(numIntSet,isetRangeName) ;
00236
00237
00238 ret->setOperMode(_operMode) ;
00239 saveSet.addOwned(*ret) ;
00240
00241 delete compIter ;
00242 delete intIter ;
00243
00244
00245 return ret ;
00246 }
00247
00248
00249
00250
00251 Double_t RooGenProdProj::evaluate() const
00252 {
00253
00254
00255 Double_t nom = ((RooAbsReal*)_intList.at(0))->getVal() ;
00256
00257 if (!_haveD) return nom ;
00258
00259 Double_t den = ((RooAbsReal*)_intList.at(1))->getVal() ;
00260
00261
00262
00263 return nom / den ;
00264 }
00265
00266
00267
00268
00269 void RooGenProdProj::operModeHook()
00270 {
00271
00272
00273
00274
00275 RooAbsArg* arg ;
00276 TIterator* nIter = _compSetOwnedN->createIterator() ;
00277 while((arg=(RooAbsArg*)nIter->Next())) {
00278 arg->setOperMode(_operMode) ;
00279 }
00280 delete nIter ;
00281
00282 TIterator* dIter = _compSetOwnedD->createIterator() ;
00283 while((arg=(RooAbsArg*)dIter->Next())) {
00284 arg->setOperMode(_operMode) ;
00285 }
00286 delete dIter ;
00287
00288 _intList.at(0)->setOperMode(_operMode) ;
00289 if (_haveD) _intList.at(1)->setOperMode(Auto) ;
00290 }
00291
00292
00293
00294
00295
00296
00297