00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "Riostream.h"
00025
00026 #include "RooFit.h"
00027 #include "RooProfileLL.h"
00028 #include "RooAbsReal.h"
00029 #include "RooMinuit.h"
00030 #include "RooMsgService.h"
00031 #include "RooRealVar.h"
00032 #include "RooMsgService.h"
00033
00034 using namespace std ;
00035
00036 ClassImp(RooProfileLL)
00037
00038
00039
00040 RooProfileLL::RooProfileLL() :
00041 RooAbsReal("RooProfileLL","RooProfileLL"),
00042 _nll(),
00043 _obs("paramOfInterest","Parameters of interest",this),
00044 _par("nuisanceParam","Nuisance parameters",this,kFALSE,kFALSE),
00045 _startFromMin(kTRUE),
00046 _minuit(0),
00047 _absMinValid(kFALSE),
00048 _absMin(0)
00049 {
00050
00051
00052 _piter = _par.createIterator() ;
00053 _oiter = _obs.createIterator() ;
00054 }
00055
00056
00057
00058 RooProfileLL::RooProfileLL(const char *name, const char *title,
00059 RooAbsReal& nllIn, const RooArgSet& observables) :
00060 RooAbsReal(name,title),
00061 _nll("input","-log(L) function",this,nllIn),
00062 _obs("paramOfInterest","Parameters of interest",this),
00063 _par("nuisanceParam","Nuisance parameters",this,kFALSE,kFALSE),
00064 _startFromMin(kTRUE),
00065 _minuit(0),
00066 _absMinValid(kFALSE),
00067 _absMin(0)
00068 {
00069
00070
00071
00072
00073
00074
00075 RooArgSet* actualObs = nllIn.getObservables(observables) ;
00076 RooArgSet* actualPars = nllIn.getParameters(observables) ;
00077
00078 _obs.add(*actualObs) ;
00079 _par.add(*actualPars) ;
00080
00081 delete actualObs ;
00082 delete actualPars ;
00083
00084 _piter = _par.createIterator() ;
00085 _oiter = _obs.createIterator() ;
00086 }
00087
00088
00089
00090
00091 RooProfileLL::RooProfileLL(const RooProfileLL& other, const char* name) :
00092 RooAbsReal(other,name),
00093 _nll("nll",this,other._nll),
00094 _obs("obs",this,other._obs),
00095 _par("par",this,other._par),
00096 _startFromMin(other._startFromMin),
00097 _minuit(0),
00098 _absMinValid(kFALSE),
00099 _absMin(0),
00100 _paramFixed(other._paramFixed)
00101 {
00102
00103
00104 _piter = _par.createIterator() ;
00105 _oiter = _obs.createIterator() ;
00106
00107 _paramAbsMin.addClone(other._paramAbsMin) ;
00108 _obsAbsMin.addClone(other._obsAbsMin) ;
00109
00110 }
00111
00112
00113
00114
00115 RooProfileLL::~RooProfileLL()
00116 {
00117
00118
00119
00120 if (_minuit) {
00121 delete _minuit ;
00122 }
00123
00124 delete _piter ;
00125 delete _oiter ;
00126 }
00127
00128
00129
00130
00131
00132 const RooArgSet& RooProfileLL::bestFitParams() const
00133 {
00134 validateAbsMin() ;
00135 return _paramAbsMin ;
00136 }
00137
00138
00139
00140 const RooArgSet& RooProfileLL::bestFitObs() const
00141 {
00142 validateAbsMin() ;
00143 return _obsAbsMin ;
00144 }
00145
00146
00147
00148
00149
00150 RooAbsReal* RooProfileLL::createProfile(const RooArgSet& paramsOfInterest)
00151 {
00152
00153
00154
00155
00156 return nll().createProfile(paramsOfInterest) ;
00157 }
00158
00159
00160
00161
00162
00163 Double_t RooProfileLL::evaluate() const
00164 {
00165
00166
00167
00168
00169
00170 if (!_minuit) {
00171 coutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") Creating instance of MINUIT" << endl ;
00172
00173 Bool_t smode = RooMsgService::instance().silentMode() ;
00174 RooMsgService::instance().setSilentMode(kTRUE) ;
00175 _minuit = new RooMinuit(const_cast<RooAbsReal&>(_nll.arg())) ;
00176 if (!smode) RooMsgService::instance().setSilentMode(kFALSE) ;
00177
00178 _minuit->setPrintLevel(-999) ;
00179
00180
00181 }
00182
00183
00184 RooArgSet* obsSetOrig = (RooArgSet*) _obs.snapshot() ;
00185
00186 validateAbsMin() ;
00187
00188
00189
00190 const_cast<RooSetProxy&>(_obs).setAttribAll("Constant",kTRUE) ;
00191 ccoutP(Eval) << "." ; ccoutP(Eval).flush() ;
00192
00193
00194 if (_startFromMin) {
00195 const_cast<RooProfileLL&>(*this)._par = _paramAbsMin ;
00196 }
00197
00198 _minuit->migrad() ;
00199
00200
00201 TIterator* iter = obsSetOrig->createIterator() ;
00202 RooRealVar* var ;
00203 while((var=(RooRealVar*)iter->Next())) {
00204 RooRealVar* target = (RooRealVar*) _obs.find(var->GetName()) ;
00205 target->setVal(var->getVal()) ;
00206 target->setConstant(var->isConstant()) ;
00207 }
00208 delete iter ;
00209 delete obsSetOrig ;
00210
00211 return _nll - _absMin ;
00212 }
00213
00214
00215
00216
00217 void RooProfileLL::validateAbsMin() const
00218 {
00219
00220
00221
00222
00223
00224 if (_absMinValid) {
00225 _piter->Reset() ;
00226 RooAbsArg* par ;
00227 while((par=(RooAbsArg*)_piter->Next())) {
00228 if (_paramFixed[par->GetName()] != par->isConstant()) {
00229 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") constant status of parameter " << par->GetName() << " has changed from "
00230 << (_paramFixed[par->GetName()]?"fixed":"floating") << " to " << (par->isConstant()?"fixed":"floating")
00231 << ", recalculating absolute minimum" << endl ;
00232 _absMinValid = kFALSE ;
00233 break ;
00234 }
00235 }
00236 }
00237
00238
00239
00240 if (!_absMinValid) {
00241
00242 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") determining minimum likelihood for current configurations w.r.t all observable" << endl ;
00243
00244
00245
00246 RooArgSet* obsStart = (RooArgSet*) _obs.snapshot(kFALSE) ;
00247
00248
00249 if (_paramAbsMin.getSize()>0) {
00250 const_cast<RooSetProxy&>(_par).assignValueOnly(_paramAbsMin) ;
00251 }
00252 if (_obsAbsMin.getSize()>0) {
00253 const_cast<RooSetProxy&>(_obs).assignValueOnly(_obsAbsMin) ;
00254 }
00255
00256
00257 const_cast<RooSetProxy&>(_obs).setAttribAll("Constant",kFALSE) ;
00258 _minuit->migrad() ;
00259
00260
00261 _absMin = _nll ;
00262 _absMinValid = kTRUE ;
00263
00264
00265 _paramAbsMin.removeAll() ;
00266 _paramAbsMin.addClone(_par) ;
00267 _obsAbsMin.addClone(_obs) ;
00268
00269
00270 _piter->Reset() ;
00271 RooAbsArg* par ;
00272 while((par=(RooAbsArg*)_piter->Next())) {
00273 _paramFixed[par->GetName()] = par->isConstant() ;
00274 }
00275
00276 if (dologI(Minimization)) {
00277 cxcoutI(Minimization) << "RooProfileLL::evaluate(" << GetName() << ") minimum found at (" ;
00278
00279 RooAbsReal* arg ;
00280 Bool_t first=kTRUE ;
00281 _oiter->Reset() ;
00282 while ((arg=(RooAbsReal*)_oiter->Next())) {
00283 ccxcoutI(Minimization) << (first?"":", ") << arg->GetName() << "=" << arg->getVal() ;
00284 first=kFALSE ;
00285 }
00286 ccxcoutI(Minimization) << ")" << endl ;
00287 }
00288
00289
00290 const_cast<RooSetProxy&>(_obs) = *obsStart ;
00291 delete obsStart ;
00292
00293 }
00294 }
00295
00296
00297
00298
00299 Bool_t RooProfileLL::redirectServersHook(const RooAbsCollection& , Bool_t ,
00300 Bool_t , Bool_t )
00301 {
00302 if (_minuit) {
00303 delete _minuit ;
00304 _minuit = 0 ;
00305 }
00306 return kFALSE ;
00307 }
00308
00309