112 RooMCStudy::RooMCStudy(
const RooAbsPdf& model,
const RooArgSet& observables,
113 const RooCmdArg& arg1,
const RooCmdArg& arg2,
114 const RooCmdArg& arg3,
const RooCmdArg& arg4,
const RooCmdArg& arg5,
115 const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8) : TNamed(
"mcstudy",
"mcstudy")
119 RooLinkedList cmdList;
120 cmdList.Add(const_cast<RooCmdArg*>(&arg1)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg2)) ;
121 cmdList.Add(const_cast<RooCmdArg*>(&arg3)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg4)) ;
122 cmdList.Add(const_cast<RooCmdArg*>(&arg5)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg6)) ;
123 cmdList.Add(const_cast<RooCmdArg*>(&arg7)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg8)) ;
126 RooCmdConfig pc(Form(
"RooMCStudy::RooMCStudy(%s)",model.GetName())) ;
128 pc.defineObject(
"fitModel",
"FitModel",0,0) ;
129 pc.defineObject(
"condObs",
"ProjectedDependents",0,0) ;
130 pc.defineObject(
"protoData",
"PrototypeData",0,0) ;
131 pc.defineSet(
"cPars",
"Constrain",0,0) ;
132 pc.defineSet(
"extCons",
"ExternalConstraints",0,0) ;
133 pc.defineInt(
"silence",
"Silence",0,0) ;
134 pc.defineInt(
"randProtoData",
"PrototypeData",0,0) ;
135 pc.defineInt(
"verboseGen",
"Verbose",0,0) ;
136 pc.defineInt(
"extendedGen",
"Extended",0,0) ;
137 pc.defineInt(
"binGenData",
"Binned",0,0) ;
138 pc.defineString(
"fitOpts",
"FitOptions",0,
"") ;
139 pc.defineInt(
"dummy",
"FitOptArgs",0,0) ;
140 pc.defineMutex(
"FitOptions",
"FitOptArgs") ;
141 pc.defineMutex(
"Constrain",
"FitOptions") ;
142 pc.defineMutex(
"ExternalConstraints",
"FitOptions") ;
145 pc.process(cmdList) ;
148 throw std::string(
"RooMCStudy::RooMCStudy() Error in parsing arguments passed to contructor") ;
153 if (pc.hasProcessed(
"FitOptArgs")) {
154 RooCmdArg* fitOptArg =
static_cast<RooCmdArg*
>(cmdList.FindObject(
"FitOptArgs")) ;
155 for (Int_t i=0 ; i<fitOptArg->subArgs().GetSize() ;i++) {
156 _fitOptList.Add(
new RooCmdArg(static_cast<RooCmdArg&>(*fitOptArg->subArgs().At(i)))) ;
161 _silence = pc.getInt(
"silence") ;
162 _verboseGen = pc.getInt(
"verboseGen") ;
163 _extendedGen = pc.getInt(
"extendedGen") ;
164 _binGenData = pc.getInt(
"binGenData") ;
165 _randProto = pc.getInt(
"randProtoData") ;
168 const RooArgSet* cParsTmp = pc.getSet(
"cPars") ;
169 const RooArgSet* extCons = pc.getSet(
"extCons") ;
171 RooArgSet* cPars =
new RooArgSet ;
173 cPars->add(*cParsTmp) ;
178 _fitOptList.Add(RooFit::Constrain(*cPars).Clone()) ;
181 _fitOptList.Add(RooFit::ExternalConstraints(*extCons).Clone()) ;
185 RooArgSet allConstraints ;
188 RooArgSet* constraints = model.getAllConstraints(observables,*cPars,kTRUE) ;
190 allConstraints.add(*constraints) ;
196 if (allConstraints.getSize()>0) {
197 _constrPdf =
new RooProdPdf(
"mcs_constr_prod",
"RooMCStudy constraints product",allConstraints) ;
200 consPars.add(*cPars) ;
202 RooArgSet* params = model.getParameters(observables) ;
203 RooArgSet* cparams = _constrPdf->getObservables(*params) ;
204 consPars.add(*cparams) ;
208 _constrGenContext = _constrPdf->genContext(consPars,0,0,_verboseGen) ;
210 _perExptGenParams = kTRUE ;
212 coutI(Generation) <<
"RooMCStudy::RooMCStudy: INFO have pdf with constraints, will generate parameters from constraint pdf for each experiment" << endl ;
217 _constrGenContext=0 ;
219 _perExptGenParams = kFALSE ;
224 _genModel =
const_cast<RooAbsPdf*
>(&model) ;
226 RooAbsPdf* fitModel =
static_cast<RooAbsPdf*
>(pc.getObject(
"fitModel",0)) ;
227 _fitModel = fitModel ? fitModel : _genModel ;
230 _genProtoData =
static_cast<RooDataSet*
>(pc.getObject(
"protoData",0)) ;
231 if (pc.getObject(
"condObs",0)) {
232 _projDeps.add(static_cast<RooArgSet&>(*pc.getObject(
"condObs",0))) ;
235 _dependents.add(observables) ;
237 _allDependents.add(_dependents) ;
238 _fitOptions = pc.getString(
"fitOpts") ;
239 _canAddFitResults = kTRUE ;
241 if (_extendedGen && _genProtoData && !_randProto) {
242 oocoutW(_fitModel,Generation) <<
"RooMCStudy::RooMCStudy: WARNING Using generator option 'e' (Poisson distribution of #events) together " << endl
243 <<
" with a prototype dataset implies incomplete sampling or oversampling of proto data." << endl
244 <<
" Use option \"r\" to randomize prototype dataset order and thus to randomize" << endl
245 <<
" the set of over/undersampled prototype events for each generation cycle." << endl ;
248 _genParams = _genModel->getParameters(&_dependents) ;
250 _genContext = _genModel->genContext(_dependents,_genProtoData,0,_verboseGen) ;
251 _genContext->attach(*_genParams) ;
256 _genInitParams = (RooArgSet*) _genParams->snapshot(kFALSE) ;
259 _fitParams = _fitModel->getParameters(&_dependents) ;
260 _fitInitParams = (RooArgSet*) _fitParams->snapshot(kTRUE) ;
262 _nExpGen = _extendedGen ? _genModel->expectedEvents(&_dependents) : 0 ;
265 _nllVar =
new RooRealVar(
"NLL",
"-log(Likelihood)",0) ;
268 _ngenVar =
new RooRealVar(
"ngen",
"number of generated events",0) ;
271 RooArgSet tmp2(*_fitParams) ;
273 tmp2.add(*_ngenVar) ;
276 tmp2.setAttribAll(
"StoreError",kTRUE) ;
277 tmp2.setAttribAll(
"StoreAsymError",kTRUE) ;
279 if (_fitModel==_genModel) {
280 fpdName = Form(
"fitParData_%s",_fitModel->GetName()) ;
282 fpdName= Form(
"fitParData_%s_%s",_fitModel->GetName(),_genModel->GetName()) ;
285 _fitParData =
new RooDataSet(fpdName.Data(),
"Fit Parameters DataSet",tmp2) ;
286 tmp2.setAttribAll(
"StoreError",kFALSE) ;
287 tmp2.setAttribAll(
"StoreAsymError",kFALSE) ;
289 if (_perExptGenParams) {
290 _genParData =
new RooDataSet(
"genParData",
"Generated Parameters dataset",*_genParams) ;
297 _allDependents.add(*_genProtoData->get(),kTRUE) ;
301 list<RooAbsMCStudyModule*>::iterator iter ;
302 for (iter=_modList.begin() ; iter!= _modList.end() ; ++iter) {
303 Bool_t ok = (*iter)->doInitializeInstance(*
this) ;
305 oocoutE(_fitModel,Generation) <<
"RooMCStudy::ctor: removing study module " << (*iter)->GetName() <<
" from analysis chain because initialization failed" << endl ;
306 iter = _modList.erase(iter) ;
329 RooMCStudy::RooMCStudy(
const RooAbsPdf& genModel,
const RooAbsPdf& fitModel,
330 const RooArgSet& dependents,
const char* genOptions,
331 const char* fitOptions,
const RooDataSet* genProtoData,
332 const RooArgSet& projDeps) :
333 TNamed(
"mcstudy",
"mcstudy"),
334 _genModel((RooAbsPdf*)&genModel),
335 _genProtoData(genProtoData),
338 _constrGenContext(0),
339 _dependents(dependents),
340 _allDependents(dependents),
341 _fitModel((RooAbsPdf*)&fitModel),
345 _fitOptions(fitOptions),
346 _canAddFitResults(kTRUE),
347 _perExptGenParams(0),
351 TString genOpt(genOptions) ;
353 _verboseGen = genOpt.Contains(
"v") ;
354 _extendedGen = genOpt.Contains(
"e") ;
355 _binGenData = genOpt.Contains(
"b") ;
356 _randProto = genOpt.Contains(
"r") ;
358 if (_extendedGen && genProtoData && !_randProto) {
359 oocoutE(_fitModel,Generation) <<
"RooMCStudy::RooMCStudy: WARNING Using generator option 'e' (Poisson distribution of #events) together " << endl
360 <<
" with a prototype dataset implies incomplete sampling or oversampling of proto data." << endl
361 <<
" Use option \"r\" to randomize prototype dataset order and thus to randomize" << endl
362 <<
" the set of over/undersampled prototype events for each generation cycle." << endl ;
366 _genContext = genModel.genContext(dependents,genProtoData,0,_verboseGen) ;
370 _genParams = _genModel->getParameters(&_dependents) ;
372 RooArgSet* tmp = genModel.getParameters(&dependents) ;
373 _genInitParams = (RooArgSet*) tmp->snapshot(kFALSE) ;
377 _fitParams = fitModel.getParameters(&dependents) ;
378 _fitInitParams = (RooArgSet*) _fitParams->snapshot(kTRUE) ;
380 _nExpGen = _extendedGen ? genModel.expectedEvents(&dependents) : 0 ;
383 _nllVar =
new RooRealVar(
"NLL",
"-log(Likelihood)",0) ;
386 _ngenVar =
new RooRealVar(
"ngen",
"number of generated events",0) ;
389 RooArgSet tmp2(*_fitParams) ;
391 tmp2.add(*_ngenVar) ;
394 tmp2.setAttribAll(
"StoreError",kTRUE) ;
395 tmp2.setAttribAll(
"StoreAsymError",kTRUE) ;
396 _fitParData =
new RooDataSet(
"fitParData",
"Fit Parameters DataSet",tmp2) ;
397 tmp2.setAttribAll(
"StoreError",kFALSE) ;
398 tmp2.setAttribAll(
"StoreAsymError",kFALSE) ;
402 _allDependents.add(*genProtoData->get(),kTRUE) ;
406 list<RooAbsMCStudyModule*>::iterator iter ;
407 for (iter=_modList.begin() ; iter!= _modList.end() ; ++iter) {
408 Bool_t ok = (*iter)->doInitializeInstance(*
this) ;
410 oocoutE(_fitModel,Generation) <<
"RooMCStudy::ctor: removing study module " << (*iter)->GetName() <<
" from analysis chain because initialization failed" << endl ;
411 iter = _modList.erase(iter) ;
421 RooMCStudy::~RooMCStudy()
423 _genDataList.Delete() ;
424 _fitOptList.Delete() ;
428 delete _fitInitParams ;
430 delete _genInitParams ;
435 delete _constrGenContext ;
444 void RooMCStudy::addModule(RooAbsMCStudyModule& module)
446 module.doInitializeInstance(*
this) ;
447 _modList.push_back(&module) ;
465 Bool_t RooMCStudy::run(Bool_t doGenerate, Bool_t DoFit, Int_t nSamples, Int_t nEvtPerSample, Bool_t keepGenData,
const char* asciiFilePat)
467 RooFit::MsgLevel oldLevel(RooFit::FATAL) ;
469 oldLevel = RooMsgService::instance().globalKillBelow() ;
470 RooMsgService::instance().setGlobalKillBelow(RooFit::PROGRESS) ;
473 list<RooAbsMCStudyModule*>::iterator iter ;
474 for (iter=_modList.begin() ; iter!= _modList.end() ; ++iter) {
475 (*iter)->initializeRun(nSamples) ;
478 Int_t prescale = nSamples>100 ? Int_t(nSamples/100) : 1 ;
482 if (nSamples%prescale==0) {
483 oocoutP(_fitModel,Generation) <<
"RooMCStudy::run: " ;
484 if (doGenerate) ooccoutI(_fitModel,Generation) <<
"Generating " ;
485 if (doGenerate && DoFit) ooccoutI(_fitModel,Generation) <<
"and " ;
486 if (DoFit) ooccoutI(_fitModel,Generation) <<
"fitting " ;
487 ooccoutP(_fitModel,Generation) <<
"sample " << nSamples << endl ;
491 Bool_t existingData = kFALSE ;
494 Int_t nEvt(nEvtPerSample) ;
497 *_genParams = *_genInitParams ;
501 RooDataSet* tmp = _constrGenContext->generate(1) ;
502 *_genParams = *tmp->get() ;
508 _genParData->add(*_genParams) ;
512 list<RooAbsMCStudyModule*>::iterator iter2 ;
513 for (iter2=_modList.begin() ; iter2!= _modList.end() ; ++iter2) {
514 (*iter2)->processBeforeGen(nSamples) ;
521 _nExpGen = _genModel->expectedEvents(&_dependents) ;
522 nEvt = RooRandom::randomGenerator()->Poisson(nEvtPerSample==0?_nExpGen:nEvtPerSample) ;
526 _genSample = _genModel->generateBinned(_dependents,nEvt) ;
532 _nExpGen = _genModel->expectedEvents(&_dependents) ;
533 nEvt = RooRandom::randomGenerator()->Poisson(nEvtPerSample==0?_nExpGen:nEvtPerSample) ;
537 if (_randProto && _genProtoData && _genProtoData->numEntries()!=nEvt) {
538 oocoutI(_fitModel,Generation) <<
"RooMCStudy: (Re)randomizing event order in prototype dataset (Nevt=" << nEvt <<
")" << endl ;
539 Int_t* newOrder = _genModel->randomizeProtoOrder(_genProtoData->numEntries(),nEvt) ;
540 _genContext->setProtoDataOrder(newOrder) ;
544 coutP(Generation) <<
"RooMCStudy: now generating " << nEvt <<
" events" << endl ;
548 _genSample = _genContext->generate(nEvt) ;
551 _genSample =
new RooDataSet(
"emptySample",
"emptySample",_dependents) ;
557 }
else if (asciiFilePat) {
560 char asciiFile[1024] ;
561 snprintf(asciiFile,1024,asciiFilePat,nSamples) ;
562 RooArgList depList(_allDependents) ;
563 _genSample = RooDataSet::read(asciiFile,depList,
"q") ;
568 _genSample = (RooDataSet*) _genDataList.At(nSamples) ;
569 existingData = kTRUE ;
571 oocoutW(_fitModel,Generation) <<
"RooMCStudy::run: WARNING: Sample #" << nSamples <<
" not loaded, skipping" << endl ;
577 _ngenVar->setVal(_genSample->sumEntries()) ;
580 list<RooAbsMCStudyModule*>::iterator iter3 ;
581 for (iter3=_modList.begin() ; iter3!= _modList.end() ; ++iter3) {
582 (*iter3)->processBetweenGenAndFit(nSamples) ;
585 if (DoFit) fitSample(_genSample) ;
588 for (iter3=_modList.begin() ; iter3!= _modList.end() ; ++iter3) {
589 (*iter3)->processAfterFit(nSamples) ;
593 if (doGenerate && asciiFilePat && *asciiFilePat) {
594 char asciiFile[1024] ;
595 snprintf(asciiFile,1024,asciiFilePat,nSamples) ;
596 RooDataSet* unbinnedData =
dynamic_cast<RooDataSet*
>(_genSample) ;
598 unbinnedData->write(asciiFile) ;
600 coutE(InputArguments) <<
"RooMCStudy::run(" << GetName() <<
") ERROR: ASCII writing of binned datasets is not supported" << endl ;
607 _genDataList.Add(_genSample) ;
614 for (iter=_modList.begin() ; iter!= _modList.end() ; ++iter) {
615 RooDataSet* auxData = (*iter)->finalizeRun() ;
617 _fitParData->merge(auxData) ;
621 _canAddFitResults = kFALSE ;
624 const RooArgSet* genPars = _genParData->get() ;
625 TIterator* iter2 = genPars->createIterator() ;
627 while((arg=(RooAbsArg*)iter2->Next())) {
628 _genParData->changeObservableName(arg->GetName(),Form(
"%s_gen",arg->GetName())) ;
632 _fitParData->merge(_genParData) ;
635 if (DoFit) calcPulls() ;
638 RooMsgService::instance().setGlobalKillBelow(oldLevel) ;
659 Bool_t RooMCStudy::generateAndFit(Int_t nSamples, Int_t nEvtPerSample, Bool_t keepGenData,
const char* asciiFilePat)
662 _fitResList.Delete() ;
663 _genDataList.Delete() ;
664 _fitParData->reset() ;
666 return run(kTRUE,kTRUE,nSamples,nEvtPerSample,keepGenData,asciiFilePat) ;
681 Bool_t RooMCStudy::generate(Int_t nSamples, Int_t nEvtPerSample, Bool_t keepGenData,
const char* asciiFilePat)
684 _genDataList.Delete() ;
686 return run(kTRUE,kFALSE,nSamples,nEvtPerSample,keepGenData,asciiFilePat) ;
698 Bool_t RooMCStudy::fit(Int_t nSamples,
const char* asciiFilePat)
701 _fitResList.Delete() ;
702 _fitParData->reset() ;
704 return run(kFALSE,kTRUE,nSamples,0,kFALSE,asciiFilePat) ;
713 Bool_t RooMCStudy::fit(Int_t nSamples, TList& dataSetList)
716 _fitResList.Delete() ;
717 _genDataList.Delete() ;
718 _fitParData->reset() ;
721 TIterator* iter = dataSetList.MakeIterator() ;
723 while((gset=(RooAbsData*)iter->Next())) {
724 _genDataList.Add(gset) ;
728 return run(kFALSE,kTRUE,nSamples,0,kTRUE,0) ;
737 void RooMCStudy::resetFitParams()
739 *_fitParams = *_fitInitParams ;
747 RooFitResult* RooMCStudy::doFit(RooAbsData* genSample)
750 TString fitOpt2(_fitOptions) ; fitOpt2.Append(
"r") ;
752 fitOpt2.Append(
"b") ;
758 RooArgSet* depList = _fitModel->getObservables(genSample) ;
759 data =
new RooDataHist(genSample->GetName(),genSample->GetTitle(),*depList,*genSample) ;
766 if (_fitOptList.GetSize()==0) {
767 if (_projDeps.getSize()>0) {
768 fr = (RooFitResult*) _fitModel->fitTo(*data,RooFit::ConditionalObservables(_projDeps),RooFit::FitOptions(fitOpt2)) ;
770 fr = (RooFitResult*) _fitModel->fitTo(*data,RooFit::FitOptions(fitOpt2)) ;
773 RooCmdArg save = RooFit::Save() ;
774 RooCmdArg condo = RooFit::ConditionalObservables(_projDeps) ;
775 RooCmdArg plevel = RooFit::PrintLevel(-1) ;
776 RooLinkedList fitOptList(_fitOptList) ;
777 fitOptList.Add(&save) ;
778 if (_projDeps.getSize()>0) {
779 fitOptList.Add(&condo) ;
782 fitOptList.Add(&plevel) ;
784 fr = (RooFitResult*) _fitModel->fitTo(*data,fitOptList) ;
787 if (_binGenData)
delete data ;
798 RooFitResult* RooMCStudy::refit(RooAbsData* genSample)
801 genSample = _genSample ;
804 RooFitResult* fr(0) ;
805 if (genSample->sumEntries()>0) {
806 fr = doFit(genSample) ;
825 Bool_t RooMCStudy::fitSample(RooAbsData* genSample)
832 RooFitResult* fr(0) ;
833 if (genSample->sumEntries()>0) {
834 fr = doFit(genSample) ;
835 ok = (fr->status()==0) ;
842 _nllVar->setVal(fr->minNll()) ;
843 RooArgSet tmp(*_fitParams) ;
847 _fitParData->add(tmp) ;
851 Bool_t userSaveRequest = kFALSE ;
852 if (_fitOptList.GetSize()>0) {
853 if (_fitOptList.FindObject(
"Save")) userSaveRequest = kTRUE ;
855 if (_fitOptions.Contains(
"r")) userSaveRequest = kTRUE ;
858 if (userSaveRequest) {
859 _fitResList.Add(fr) ;
879 Bool_t RooMCStudy::addFitResult(
const RooFitResult& fr)
881 if (!_canAddFitResults) {
882 oocoutE(_fitModel,InputArguments) <<
"RooMCStudy::addFitResult: ERROR cannot add fit results in current state" << endl ;
887 *_fitParams = RooArgSet(fr.floatParsFinal()) ;
890 Bool_t ok = (fr.status()==0) ;
892 _nllVar->setVal(fr.minNll()) ;
893 RooArgSet tmp(*_fitParams) ;
896 _fitParData->add(tmp) ;
900 if (_fitOptions.Contains(
"r")) {
901 _fitResList.Add((TObject*)&fr) ;
913 void RooMCStudy::calcPulls()
915 for (
auto it = _fitParams->begin(); it != _fitParams->end(); ++it) {
916 const auto par =
static_cast<RooRealVar*
>(*it);
917 RooErrorVar* err = par->errorVar();
918 _fitParData->addColumn(*err);
921 TString name(par->GetName()), title(par->GetTitle()) ;
922 name.Append(
"pull") ;
923 title.Append(
" Pull") ;
925 if (!par->hasError(
false)) {
926 coutW(Generation) <<
"Fit parameter '" << par->GetName() <<
"' does not have an error."
927 " A pull distribution cannot be generated. This might be caused by the parameter being constant or"
928 " because the fits were not run." << std::endl;
933 auto genParOrig =
static_cast<RooAbsReal*
>(_fitParData->get()->find(Form(
"%s_gen",par->GetName())));
934 if (genParOrig && _perExptGenParams) {
936 RooPullVar pull(name,title,*par,*genParOrig) ;
937 _fitParData->addColumn(pull,kFALSE) ;
941 genParOrig =
static_cast<RooAbsReal*
>(_genInitParams->find(par->GetName()));
944 std::size_t index = it - _fitParams->begin();
945 genParOrig = index < _genInitParams->size() ?
946 static_cast<RooAbsReal*
>((*_genInitParams)[index]) :
950 coutW(Generation) <<
"The fit parameter '" << par->GetName() <<
"' is not in the model that was used to generate toy data. "
951 "The parameter '" << genParOrig->GetName() <<
"'=" << genParOrig->getVal() <<
" was found at the same position in the generator model."
952 " It will be used to compute pulls."
953 "\nIf this is not desired, the parameters of the generator model need to be renamed or reordered." << std::endl;
958 std::unique_ptr<RooAbsReal> genPar(static_cast<RooAbsReal*>(genParOrig->Clone(
"truth")));
959 RooPullVar pull(name,title,*par,*genPar);
961 _fitParData->addColumn(pull,kFALSE) ;
963 coutE(Generation) <<
"Cannot generate pull distribution for the fit parameter '" << par->GetName() <<
"'."
964 "\nNo similar parameter was found in the set of parameters that were used to generate toy data." << std::endl;
980 const RooDataSet& RooMCStudy::fitParDataSet()
982 if (_canAddFitResults) {
984 _canAddFitResults = kFALSE ;
987 return *_fitParData ;
1000 const RooArgSet* RooMCStudy::fitParams(Int_t sampleNum)
const
1003 if (sampleNum<0 || sampleNum>=_fitParData->numEntries()) {
1004 oocoutE(_fitModel,InputArguments) <<
"RooMCStudy::fitParams: ERROR, invalid sample number: " << sampleNum << endl ;
1008 return _fitParData->get(sampleNum) ;
1018 const RooFitResult* RooMCStudy::fitResult(Int_t sampleNum)
const
1021 if (sampleNum<0 || sampleNum>=_fitResList.GetSize()) {
1022 oocoutE(_fitModel,InputArguments) <<
"RooMCStudy::fitResult: ERROR, invalid sample number: " << sampleNum << endl ;
1027 const RooFitResult* fr = (RooFitResult*) _fitResList.At(sampleNum) ;
1031 oocoutE(_fitModel,InputArguments) <<
"RooMCStudy::fitResult: ERROR, no fit result saved for sample "
1032 << sampleNum <<
", did you use the 'r; fit option?" << endl ;
1043 RooAbsData* RooMCStudy::genData(Int_t sampleNum)
const
1046 if (_genDataList.GetSize()==0) {
1047 oocoutE(_fitModel,InputArguments) <<
"RooMCStudy::genData() ERROR, generated data was not saved" << endl ;
1052 if (sampleNum<0 || sampleNum>=_genDataList.GetSize()) {
1053 oocoutE(_fitModel,InputArguments) <<
"RooMCStudy::genData() ERROR, invalid sample number: " << sampleNum << endl ;
1057 return (RooAbsData*) _genDataList.At(sampleNum) ;
1071 RooPlot* RooMCStudy::plotParamOn(RooPlot* frame,
const RooCmdArg& arg1,
const RooCmdArg& arg2,
const RooCmdArg& arg3,
const RooCmdArg& arg4,
1072 const RooCmdArg& arg5,
const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
1074 _fitParData->plotOn(frame,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
1093 RooPlot* RooMCStudy::plotParam(
const char* paramName,
const RooCmdArg& arg1,
const RooCmdArg& arg2,
const RooCmdArg& arg3,
const RooCmdArg& arg4,
1094 const RooCmdArg& arg5,
const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
1098 RooRealVar* param =
static_cast<RooRealVar*
>(_fitParData->get()->find(paramName)) ;
1100 oocoutE(_fitModel,InputArguments) <<
"RooMCStudy::plotParam: ERROR: no parameter defined with name " << paramName << endl ;
1105 return plotParam(*param,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
1115 RooPlot* RooMCStudy::plotParam(
const RooRealVar& param,
const RooCmdArg& arg1,
const RooCmdArg& arg2,
const RooCmdArg& arg3,
const RooCmdArg& arg4,
1116 const RooCmdArg& arg5,
const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
1119 RooLinkedList cmdList;
1120 cmdList.Add(const_cast<RooCmdArg*>(&arg1)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg2)) ;
1121 cmdList.Add(const_cast<RooCmdArg*>(&arg3)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg4)) ;
1122 cmdList.Add(const_cast<RooCmdArg*>(&arg5)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg6)) ;
1123 cmdList.Add(const_cast<RooCmdArg*>(&arg7)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg8)) ;
1125 RooPlot* frame = makeFrameAndPlotCmd(param, cmdList) ;
1127 _fitParData->plotOn(frame, cmdList) ;
1149 RooPlot* RooMCStudy::plotNLL(
const RooCmdArg& arg1,
const RooCmdArg& arg2,
1150 const RooCmdArg& arg3,
const RooCmdArg& arg4,
1151 const RooCmdArg& arg5,
const RooCmdArg& arg6,
1152 const RooCmdArg& arg7,
const RooCmdArg& arg8)
1154 return plotParam(*_nllVar,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
1173 RooPlot* RooMCStudy::plotError(
const RooRealVar& param,
const RooCmdArg& arg1,
const RooCmdArg& arg2,
1174 const RooCmdArg& arg3,
const RooCmdArg& arg4,
1175 const RooCmdArg& arg5,
const RooCmdArg& arg6,
1176 const RooCmdArg& arg7,
const RooCmdArg& arg8)
1178 if (_canAddFitResults) {
1180 _canAddFitResults=kFALSE ;
1183 RooErrorVar* evar = param.errorVar() ;
1184 RooRealVar* evar_rrv =
static_cast<RooRealVar*
>(evar->createFundamental()) ;
1185 RooPlot* frame = plotParam(*evar_rrv,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
1216 RooPlot* RooMCStudy::plotPull(
const RooRealVar& param,
const RooCmdArg& arg1,
const RooCmdArg& arg2,
1217 const RooCmdArg& arg3,
const RooCmdArg& arg4,
1218 const RooCmdArg& arg5,
const RooCmdArg& arg6,
1219 const RooCmdArg& arg7,
const RooCmdArg& arg8)
1222 RooLinkedList cmdList;
1223 cmdList.Add(const_cast<RooCmdArg*>(&arg1)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg2)) ;
1224 cmdList.Add(const_cast<RooCmdArg*>(&arg3)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg4)) ;
1225 cmdList.Add(const_cast<RooCmdArg*>(&arg5)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg6)) ;
1226 cmdList.Add(const_cast<RooCmdArg*>(&arg7)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg8)) ;
1228 TString name(param.GetName()), title(param.GetTitle()) ;
1229 name.Append(
"pull") ; title.Append(
" Pull") ;
1230 RooRealVar pvar(name,title,-100,100) ;
1234 RooPlot* frame = makeFrameAndPlotCmd(pvar, cmdList, kTRUE) ;
1238 RooCmdConfig pc(Form(
"RooMCStudy::plotPull(%s)",_genModel->GetName())) ;
1239 pc.defineInt(
"fitGauss",
"FitGauss",0,0) ;
1240 pc.allowUndefined() ;
1241 pc.process(cmdList) ;
1242 Bool_t fitGauss=pc.getInt(
"fitGauss") ;
1245 pc.stripCmdList(cmdList,
"FitGauss") ;
1246 const bool success = _fitParData->plotOn(frame,cmdList) ;
1249 coutF(Plotting) <<
"No pull distribution for the parameter '" << param.GetName() <<
"'. Check logs for errors." << std::endl;
1255 RooRealVar pullMean(
"pullMean",
"Mean of pull",0,-10,10) ;
1256 RooRealVar pullSigma(
"pullSigma",
"Width of pull",1,0.1,5) ;
1257 RooGenericPdf pullGauss(
"pullGauss",
"Gaussian of pull",
1258 "exp(-0.5*(@0-@1)*(@0-@1)/(@2*@2))",
1259 RooArgSet(pvar,pullMean,pullSigma)) ;
1260 pullGauss.fitTo(*_fitParData,RooFit::Minos(0),RooFit::PrintLevel(-1)) ;
1261 pullGauss.plotOn(frame) ;
1262 pullGauss.paramOn(frame,_fitParData) ;
1275 RooPlot* RooMCStudy::makeFrameAndPlotCmd(
const RooRealVar& param, RooLinkedList& cmdList, Bool_t symRange)
const
1278 RooCmdConfig pc(Form(
"RooMCStudy::plotParam(%s)",_genModel->GetName())) ;
1279 pc.defineInt(
"nbins",
"Bins",0,0) ;
1280 pc.defineDouble(
"xlo",
"Range",0,0) ;
1281 pc.defineDouble(
"xhi",
"Range",1,0) ;
1282 pc.defineInt(
"dummy",
"FrameArgs",0,0) ;
1283 pc.defineMutex(
"Bins",
"FrameArgs") ;
1284 pc.defineMutex(
"Range",
"FrameArgs") ;
1287 pc.allowUndefined() ;
1288 pc.process(cmdList) ;
1289 if (!pc.ok(kTRUE)) {
1294 Int_t nbins = pc.getInt(
"nbins") ;
1295 Double_t xlo = pc.getDouble(
"xlo") ;
1296 Double_t xhi = pc.getDouble(
"xhi") ;
1299 if (pc.hasProcessed(
"FrameArgs")) {
1301 RooCmdArg* frameArg =
static_cast<RooCmdArg*
>(cmdList.FindObject(
"FrameArgs")) ;
1302 frame = param.frame(frameArg->subArgs()) ;
1305 RooCmdArg bins = RooFit::Bins(nbins) ;
1306 RooCmdArg range = RooFit::Range(xlo,xhi) ;
1307 RooCmdArg autor = symRange ? RooFit::AutoSymRange(*_fitParData,0.2) : RooFit::AutoRange(*_fitParData,0.2) ;
1308 RooLinkedList frameCmdList ;
1310 if (pc.hasProcessed(
"Bins")) frameCmdList.Add(&bins) ;
1311 if (pc.hasProcessed(
"Range")) {
1312 frameCmdList.Add(&range) ;
1314 frameCmdList.Add(&autor) ;
1316 frame = param.frame(frameCmdList) ;
1320 pc.stripCmdList(cmdList,
"FrameArgs,Bins,Range") ;
1331 RooPlot* RooMCStudy::plotNLL(Double_t lo, Double_t hi, Int_t nBins)
1333 RooPlot* frame = _nllVar->frame(lo,hi,nBins) ;
1335 _fitParData->plotOn(frame) ;
1345 RooPlot* RooMCStudy::plotError(
const RooRealVar& param, Double_t lo, Double_t hi, Int_t nbins)
1347 if (_canAddFitResults) {
1349 _canAddFitResults=kFALSE ;
1352 RooErrorVar* evar = param.errorVar() ;
1353 RooPlot* frame = evar->frame(lo,hi,nbins) ;
1354 _fitParData->plotOn(frame) ;
1375 RooPlot* RooMCStudy::plotPull(
const RooRealVar& param, Double_t lo, Double_t hi, Int_t nbins, Bool_t fitGauss)
1377 if (_canAddFitResults) {
1379 _canAddFitResults=kFALSE ;
1383 TString name(param.GetName()), title(param.GetTitle()) ;
1384 name.Append(
"pull") ; title.Append(
" Pull") ;
1385 RooRealVar pvar(name,title,lo,hi) ;
1386 pvar.setBins(nbins) ;
1388 RooPlot* frame = pvar.frame() ;
1389 const bool success = _fitParData->plotOn(frame);
1392 coutF(Plotting) <<
"No pull distribution for the parameter '" << param.GetName() <<
"'. Check logs for errors." << std::endl;
1397 RooRealVar pullMean(
"pullMean",
"Mean of pull",0,lo,hi) ;
1398 RooRealVar pullSigma(
"pullSigma",
"Width of pull",1,0,5) ;
1399 RooGenericPdf pullGauss(
"pullGauss",
"Gaussian of pull",
1400 "exp(-0.5*(@0-@1)*(@0-@1)/(@2*@2))",
1401 RooArgSet(pvar,pullMean,pullSigma)) ;
1402 pullGauss.fitTo(*_fitParData,RooFit::Minos(0),RooFit::PrintLevel(-1)) ;
1403 pullGauss.plotOn(frame) ;
1404 pullGauss.paramOn(frame,_fitParData) ;
1415 void RooMCStudy::RecursiveRemove(TObject *obj)
1417 _fitResList.RecursiveRemove(obj);
1418 _genDataList.RecursiveRemove(obj);
1419 _fitOptList.RecursiveRemove(obj);
1420 if (_ngenVar == obj) _ngenVar =
nullptr;
1422 if (_fitParData) _fitParData->RecursiveRemove(obj);
1423 if (_fitParData == obj) _fitParData =
nullptr;
1425 if (_genParData) _genParData->RecursiveRemove(obj);
1426 if (_genParData == obj) _genParData =
nullptr;