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 #include "TClass.h"
00031 #include "Riostream.h"
00032
00033 #include "RooFit.h"
00034
00035 #include "RooNumGenFactory.h"
00036 #include "RooArgSet.h"
00037 #include "RooAbsFunc.h"
00038 #include "RooNumGenConfig.h"
00039 #include "RooNumber.h"
00040
00041 #include "RooAcceptReject.h"
00042 #include "RooFoamGenerator.h"
00043 #include "RooSentinel.h"
00044
00045
00046 #include "RooMsgService.h"
00047
00048 using namespace std ;
00049
00050 ClassImp(RooNumGenFactory)
00051 ;
00052
00053 RooNumGenFactory* RooNumGenFactory::_instance = 0 ;
00054
00055
00056
00057
00058 RooNumGenFactory::RooNumGenFactory()
00059 {
00060
00061
00062
00063 _instance = this ;
00064
00065 RooAcceptReject::registerSampler(*this) ;
00066 RooFoamGenerator::registerSampler(*this) ;
00067
00068
00069 RooNumGenConfig::defaultConfig().method1D(kFALSE,kFALSE).setLabel("RooFoamGenerator") ;
00070 RooNumGenConfig::defaultConfig().method1D(kTRUE ,kFALSE).setLabel("RooAcceptReject") ;
00071 RooNumGenConfig::defaultConfig().method1D(kFALSE,kTRUE ).setLabel("RooAcceptReject") ;
00072 RooNumGenConfig::defaultConfig().method1D(kTRUE, kTRUE ).setLabel("RooAcceptReject") ;
00073
00074 RooNumGenConfig::defaultConfig().method2D(kFALSE,kFALSE).setLabel("RooFoamGenerator") ;
00075 RooNumGenConfig::defaultConfig().method2D(kTRUE ,kFALSE).setLabel("RooAcceptReject") ;
00076 RooNumGenConfig::defaultConfig().method2D(kFALSE,kTRUE ).setLabel("RooAcceptReject") ;
00077 RooNumGenConfig::defaultConfig().method2D(kTRUE, kTRUE ).setLabel("RooAcceptReject") ;
00078
00079 RooNumGenConfig::defaultConfig().methodND(kFALSE,kFALSE).setLabel("RooFoamGenerator") ;
00080 RooNumGenConfig::defaultConfig().methodND(kTRUE ,kFALSE).setLabel("RooAcceptReject") ;
00081 RooNumGenConfig::defaultConfig().methodND(kFALSE,kTRUE ).setLabel("RooAcceptReject") ;
00082 RooNumGenConfig::defaultConfig().methodND(kTRUE, kTRUE ).setLabel("RooAcceptReject") ;
00083
00084 }
00085
00086
00087
00088
00089 RooNumGenFactory::~RooNumGenFactory()
00090 {
00091
00092
00093 std::map<std::string,RooAbsNumGenerator*>::iterator iter = _map.begin() ;
00094 while (iter != _map.end()) {
00095 delete iter->second ;
00096 ++iter ;
00097 }
00098 }
00099
00100
00101
00102 RooNumGenFactory::RooNumGenFactory(const RooNumGenFactory& other) : TObject(other)
00103 {
00104
00105 }
00106
00107
00108
00109
00110 RooNumGenFactory& RooNumGenFactory::instance()
00111 {
00112
00113
00114 if (_instance==0) {
00115 new RooNumGenFactory ;
00116 RooSentinel::activate() ;
00117 }
00118 return *_instance ;
00119 }
00120
00121
00122
00123 void RooNumGenFactory::cleanup()
00124 {
00125
00126
00127 if (_instance) {
00128 delete _instance ;
00129 _instance = 0 ;
00130 }
00131 }
00132
00133
00134
00135
00136 Bool_t RooNumGenFactory::storeProtoSampler(RooAbsNumGenerator* proto, const RooArgSet& defConfig)
00137 {
00138
00139
00140
00141
00142 TString name = proto->IsA()->GetName() ;
00143
00144 if (getProtoSampler(name)) {
00145
00146 return kTRUE ;
00147 }
00148
00149
00150 _map[name.Data()] = proto ;
00151
00152
00153 RooNumGenConfig::defaultConfig().addConfigSection(proto,defConfig) ;
00154
00155 return kFALSE ;
00156 }
00157
00158
00159
00160
00161 const RooAbsNumGenerator* RooNumGenFactory::getProtoSampler(const char* name)
00162 {
00163
00164
00165 if (_map.count(name)==0) {
00166 return 0 ;
00167 }
00168
00169 return _map[name] ;
00170 }
00171
00172
00173
00174
00175 RooAbsNumGenerator* RooNumGenFactory::createSampler(RooAbsReal& func, const RooArgSet& genVars, const RooArgSet& condVars, const RooNumGenConfig& config, Bool_t verbose, RooAbsReal* maxFuncVal)
00176 {
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 Int_t ndim = genVars.getSize() ;
00187 Bool_t cond = (condVars.getSize() > 0) ? kTRUE : kFALSE ;
00188
00189 Bool_t hasCat(kFALSE) ;
00190 TIterator* iter = genVars.createIterator() ;
00191 RooAbsArg* arg ;
00192 while ((arg=(RooAbsArg*)iter->Next())) {
00193 if (arg->IsA()==RooCategory::Class()) {
00194 hasCat=kTRUE ;
00195 break ;
00196 }
00197 }
00198 delete iter ;
00199
00200
00201 TString method ;
00202 switch(ndim) {
00203 case 1:
00204 method = config.method1D(cond,hasCat).getLabel() ;
00205 break ;
00206
00207 case 2:
00208 method = config.method2D(cond,hasCat).getLabel() ;
00209 break ;
00210
00211 default:
00212 method = config.methodND(cond,hasCat).getLabel() ;
00213 break ;
00214 }
00215
00216
00217 if (!method.CompareTo("N/A")) {
00218 oocoutE((TObject*)0,Integration) << "RooNumGenFactory::createSampler: No sampler method has been defined for "
00219 << (cond?"a conditional ":"a ") << ndim << "-dimensional p.d.f" << endl ;
00220 return 0 ;
00221 }
00222
00223
00224 const RooAbsNumGenerator* proto = getProtoSampler(method) ;
00225 RooAbsNumGenerator* engine = proto->clone(func,genVars,condVars,config,verbose,maxFuncVal) ;
00226 return engine ;
00227 }