Logo ROOT  
Reference Guide
ToyMCSampler.cxx
Go to the documentation of this file.
1// @(#)root/roostats:$Id$
2// Author: Sven Kreiss June 2010
3// Author: Kyle Cranmer, Lorenzo Moneta, Gregory Schott, Wouter Verkerke
4/*************************************************************************
5 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class RooStats::NuisanceParametersSampler
13 \ingroup Roostats
14
15Helper class for ToyMCSampler. Handles all of the nuisance parameter related
16functions. Once instantiated, it gives a new nuisance parameter point
17at each call to nextPoint(...).
18*/
19
20/** \class RooStats::ToyMCSampler
21 \ingroup Roostats
22
23ToyMCSampler is an implementation of the TestStatSampler interface.
24It generates Toy Monte Carlo for a given parameter point and evaluates a
25TestStatistic.
26
27For parallel runs, ToyMCSampler can be given an instance of ProofConfig
28and then run in parallel using proof or proof-lite. Internally, it uses
29ToyMCStudy with the RooStudyManager.
30*/
31
33
34#include "RooMsgService.h"
35
36#include "RooDataHist.h"
37
38#include "RooRealVar.h"
39
40#include "TCanvas.h"
41#include "RooPlot.h"
42#include "RooRandom.h"
43
44#include "RooStudyManager.h"
45#include "RooStats/ToyMCStudy.h"
48#include "RooSimultaneous.h"
49#include "RooCategory.h"
50
51#include "TMath.h"
52
53
54using namespace RooFit;
55using namespace std;
56
57
59
60namespace RooStats {
61
62////////////////////////////////////////////////////////////////////////////////
63/// Assigns new nuisance parameter point to members of nuisPoint.
64/// nuisPoint can be more objects than just the nuisance
65/// parameters.
66
67void NuisanceParametersSampler::NextPoint(RooArgSet& nuisPoint, double& weight) {
68
69 // check whether to get new set of nuisanceParPoints
70 if (fIndex >= fNToys) {
71 Refresh();
72 fIndex = 0;
73 }
74
75 // get value
76 nuisPoint.assign(*fPoints->get(fIndex++));
77 weight = fPoints->weight();
78
79 // check whether result will have any influence
80 if(fPoints->weight() == 0.0) {
81 oocoutI(nullptr,Generation) << "Weight 0 encountered. Skipping." << endl;
82 NextPoint(nuisPoint, weight);
83 }
84}
85
86////////////////////////////////////////////////////////////////////////////////
87/// Creates the initial set of nuisance parameter points. It also refills the
88/// set with new parameter points if called repeatedly. This helps with
89/// adaptive sampling as the required number of nuisance parameter points
90/// might increase during the run.
91
93
94 if (!fPrior || !fParams) return;
95
96 if (fExpected) {
97 // UNDER CONSTRUCTION
98 oocoutI(nullptr,InputArguments) << "Using expected nuisance parameters." << endl;
99
100 int nBins = fNToys;
101
102 // From FeldmanCousins.cxx:
103 // set nbins for the POI
104 for (auto *myarg2 : static_range_cast<RooRealVar *>(*fParams)) {
105 myarg2->setBins(nBins);
106 }
107
108
109 fPoints.reset( fPrior->generate(
110 *fParams,
111 AllBinned(),
113 NumEvents(1) // for Asimov set, this is only a scale factor
114 ));
115 if(fPoints->numEntries() != fNToys) {
116 fNToys = fPoints->numEntries();
117 oocoutI(nullptr,InputArguments) <<
118 "Adjusted number of toys to number of bins of nuisance parameters: " << fNToys << endl;
119 }
120
121/*
122 // check
123 TCanvas *c1 = new TCanvas;
124 RooPlot *p = dynamic_cast<RooRealVar*>(fParams->first())->frame();
125 fPoints->plotOn(p);
126 p->Draw();
127 for(int x=0; x < fPoints->numEntries(); x++) {
128 fPoints->get(x)->Print("v");
129 cout << fPoints->weight() << endl;
130 }
131*/
132
133 }else{
134 oocoutI(nullptr,InputArguments) << "Using randomized nuisance parameters." << endl;
135
137 }
138}
139
141
142////////////////////////////////////////////////////////////////////////////////
143
145
146////////////////////////////////////////////////////////////////////////////////
147/// Proof constructor. Do not use.
148
149ToyMCSampler::ToyMCSampler() : fSamplingDistName("SD"), fNToys(1)
150{
151
152 fPdf = nullptr;
153 fPriorNuisance = nullptr;
154 fNuisancePars = nullptr;
155 fObservables = nullptr;
156 fGlobalObservables = nullptr;
157
158 fSize = 0.05;
159 fNEvents = 0;
160 fGenerateBinned = false;
162 fGenerateAutoBinned = true;
163 fExpectedNuisancePar = false;
164
165 fToysInTails = 0.0;
169
170 fProtoData = nullptr;
171
172 fProofConfig = nullptr;
174
175 //suppress messages for num integration of Roofit
177
178 fUseMultiGen = false ;
179}
180
181////////////////////////////////////////////////////////////////////////////////
182
183ToyMCSampler::ToyMCSampler(TestStatistic &ts, Int_t ntoys) : fSamplingDistName(ts.GetVarName().Data()), fNToys(ntoys)
184{
185 fPdf = nullptr;
186 fPriorNuisance = nullptr;
187 fNuisancePars = nullptr;
188 fObservables = nullptr;
189 fGlobalObservables = nullptr;
190
191 fSize = 0.05;
192 fNEvents = 0;
193 fGenerateBinned = false;
195 fGenerateAutoBinned = true;
196 fExpectedNuisancePar = false;
197
198 fToysInTails = 0.0;
202
203 fProtoData = nullptr;
204
205 fProofConfig = nullptr;
207
208 //suppress messages for num integration of Roofit
210
211 fUseMultiGen = false ;
212
213 AddTestStatistic(&ts);
214}
215
216////////////////////////////////////////////////////////////////////////////////
217
220
221 ClearCache();
222}
223
224////////////////////////////////////////////////////////////////////////////////
225/// only checks, no guessing/determination (do this in calculators,
226/// e.g. using ModelConfig::GuessObsAndNuisance(...))
227
229 bool goodConfig = true;
230
231 if(fTestStatistics.empty() || fTestStatistics[0] == nullptr) { ooccoutE(nullptr,InputArguments) << "Test statistic not set." << endl; goodConfig = false; }
232 if(!fObservables) { ooccoutE(nullptr,InputArguments) << "Observables not set." << endl; goodConfig = false; }
233 if(!fParametersForTestStat) { ooccoutE(nullptr,InputArguments) << "Parameter values used to evaluate the test statistic are not set." << endl; goodConfig = false; }
234 if(!fPdf) { ooccoutE(nullptr,InputArguments) << "Pdf not set." << endl; goodConfig = false; }
235
236 return goodConfig;
237}
238
239////////////////////////////////////////////////////////////////////////////////
240/// Evaluate all test statistics, returning result and any detailed output.
241/// PDF parameter values are saved in case they are modified by
242/// TestStatistic::Evaluate (eg. SimpleLikelihoodRatioTestStat).
243
245 DetailedOutputAggregator detOutAgg;
246 const RooArgList* allTS = EvaluateAllTestStatistics(data, poi, detOutAgg);
247 if (!allTS) return 0;
248 // no need to delete allTS, it is deleted in destructor of detOutAgg
249 return dynamic_cast<RooArgList*>(allTS->snapshot());
250}
251
252////////////////////////////////////////////////////////////////////////////////
253
255 RooArgSet *allVars = fPdf ? fPdf->getVariables() : nullptr;
256 RooArgSet *saveAll = allVars ? allVars->snapshot() : nullptr;
257 for( unsigned int i = 0; i < fTestStatistics.size(); i++ ) {
258 if( fTestStatistics[i] == nullptr ) continue;
259 TString name( TString::Format("%s_TS%u", fSamplingDistName.c_str(), i) );
260 std::unique_ptr<RooArgSet> parForTS(poi.snapshot());
261 RooRealVar ts( name, fTestStatistics[i]->GetVarName(), fTestStatistics[i]->Evaluate( data, *parForTS ) );
262 RooArgList tset(ts);
263 detOutAgg.AppendArgSet(&tset);
264 if (const RooArgSet* detOut = fTestStatistics[i]->GetDetailedOutput()) {
265 name.Append("_");
266 detOutAgg.AppendArgSet(detOut, name);
267 }
268 if (saveAll) {
269 // restore values, perhaps modified by fTestStatistics[i]->Evaluate()
270 allVars->assign(*saveAll);
271 }
272 }
273 delete saveAll;
274 delete allVars;
275 return detOutAgg.GetAsArgList();
276}
277
278////////////////////////////////////////////////////////////////////////////////
279
281 if(fTestStatistics.size() > 1) {
282 oocoutW(nullptr, InputArguments) << "Multiple test statistics defined, but only one distribution will be returned." << endl;
283 for( unsigned int i=0; i < fTestStatistics.size(); i++ ) {
284 oocoutW(nullptr, InputArguments) << " \t test statistic: " << fTestStatistics[i] << endl;
285 }
286 }
287
288 RooDataSet* r = GetSamplingDistributions(paramPointIn);
289 if(r == nullptr || r->numEntries() == 0) {
290 oocoutW(nullptr, Generation) << "no sampling distribution generated" << endl;
291 return nullptr;
292 }
293
294 SamplingDistribution* samp = new SamplingDistribution( r->GetName(), r->GetTitle(), *r );
295 delete r;
296 return samp;
297}
298
299////////////////////////////////////////////////////////////////////////////////
300/// Use for serial and parallel runs.
301
303{
304
305 // ======= S I N G L E R U N ? =======
306 if(!fProofConfig)
307 return GetSamplingDistributionsSingleWorker(paramPointIn);
308
309 // ======= P A R A L L E L R U N =======
310 if (!CheckConfig()){
311 oocoutE(nullptr, InputArguments)
312 << "Bad COnfiguration in ToyMCSampler "
313 << endl;
314 return nullptr;
315 }
316
317 // turn adaptive sampling off if given
318 if(fToysInTails) {
319 fToysInTails = 0;
320 oocoutW(nullptr, InputArguments)
321 << "Adaptive sampling in ToyMCSampler is not supported for parallel runs."
322 << endl;
323 }
324
325 // adjust number of toys on the slaves to keep the total number of toys constant
326 Int_t totToys = fNToys;
327 fNToys = (int)ceil((double)fNToys / (double)fProofConfig->GetNExperiments()); // round up
328
329 // create the study instance for parallel processing
330 ToyMCStudy* toymcstudy = new ToyMCStudy ;
331 toymcstudy->SetToyMCSampler(*this);
332 toymcstudy->SetParamPoint(paramPointIn);
334
335 // temporary workspace for proof to avoid messing with TRef
337 RooStudyManager studymanager(w, *toymcstudy);
339
340 RooDataSet* output = toymcstudy->merge();
341
342 // reset the number of toys
343 fNToys = totToys;
344
345 delete toymcstudy;
346 return output;
347}
348
349////////////////////////////////////////////////////////////////////////////////
350/// This is the main function for serial runs. It is called automatically
351/// from inside GetSamplingDistribution when no ProofConfig is given.
352/// You should not call this function yourself. This function should
353/// be used by ToyMCStudy on the workers (ie. when you explicitly want
354/// a serial run although ProofConfig is present).
355///
356
358{
359 // Make sure the cache is clear. It is important to clear it here, because
360 // the cache might be invalid even when just the firstPOI was changed, for which
361 // no accessor has to be called. (Fixes a bug when ToyMCSampler is
362 // used with the Neyman Construction)
363 ClearCache();
364
365 if (!CheckConfig()){
366 oocoutE(nullptr, InputArguments)
367 << "Bad COnfiguration in ToyMCSampler "
368 << endl;
369 return nullptr;
370 }
371
372 // important to cache the paramPoint b/c test statistic might
373 // modify it from event to event
374 RooArgSet *paramPoint = (RooArgSet*) paramPointIn.snapshot();
375 RooArgSet *allVars = fPdf->getVariables();
376 RooArgSet *saveAll = (RooArgSet*) allVars->snapshot();
377
378
379 DetailedOutputAggregator detOutAgg;
380
381 // counts the number of toys in the limits set for adaptive sampling
382 // (taking weights into account; always on first test statistic)
383 double toysInTails = 0.0;
384
385 for (Int_t i = 0; i < fMaxToys; ++i) {
386 // need to check at the beginning for case that zero toys are requested
387 if (toysInTails >= fToysInTails && i+1 > fNToys) break;
388
389 // status update
390 if ( i% 500 == 0 && i>0 ) {
391 oocoutP(nullptr,Generation) << "generated toys: " << i << " / " << fNToys;
392 if (fToysInTails) ooccoutP(nullptr,Generation) << " (tails: " << toysInTails << " / " << fToysInTails << ")" << std::endl;
393 else ooccoutP(nullptr,Generation) << endl;
394 }
395
396 // TODO: change this treatment to keep track of all values so that the threshold
397 // for adaptive sampling is counted for all distributions and not just the
398 // first one.
399 double valueFirst = -999.0, weight = 1.0;
400
401 // set variables to requested parameter point
402 allVars->assign(*saveAll); // important for example for SimpleLikelihoodRatioTestStat
403
404 RooAbsData* toydata = GenerateToyData(*paramPoint, weight);
405 if (i == 0 && !fPdf->canBeExtended() && dynamic_cast<RooSimultaneous*>(fPdf)) {
406 const RooArgSet* toySet = toydata->get();
407 if (std::none_of(toySet->begin(), toySet->end(), [](const RooAbsArg* arg){
408 return dynamic_cast<const RooAbsCategory*>(arg) != nullptr;
409 }))
410 oocoutE(nullptr, Generation) << "ToyMCSampler: Generated toy data didn't contain a category variable, although"
411 " a simultaneous PDF is in use. To generate events for a simultaneous PDF, all components need to be"
412 " extended. Otherwise, the number of events to generate per component cannot be determined." << std::endl;
413 }
414
416
417 const RooArgList* allTS = EvaluateAllTestStatistics(*toydata, *fParametersForTestStat, detOutAgg);
418 if (allTS->getSize() > Int_t(fTestStatistics.size()))
419 detOutAgg.AppendArgSet( fGlobalObservables, "globObs_" );
420 if (RooRealVar* firstTS = dynamic_cast<RooRealVar*>(allTS->first()))
421 valueFirst = firstTS->getVal();
422
423 delete toydata;
424
425 // check for nan
426 if(valueFirst != valueFirst) {
427 oocoutW(nullptr, Generation) << "skip: " << valueFirst << ", " << weight << endl;
428 continue;
429 }
430
431 detOutAgg.CommitSet(weight);
432
433 // adaptive sampling checks
434 if (valueFirst <= fAdaptiveLowLimit || valueFirst >= fAdaptiveHighLimit) {
435 if(weight >= 0.) toysInTails += weight;
436 else toysInTails += 1.;
437 }
438 }
439
440 // clean up
441 allVars->assign(*saveAll);
442 delete saveAll;
443 delete allVars;
444 delete paramPoint;
445
447}
448
449////////////////////////////////////////////////////////////////////////////////
450
452
453
455 ooccoutE(nullptr,InputArguments) << "Global Observables not set." << endl;
456 return;
457 }
458
459
461
462 // generate one set of global observables and assign it
463 // has problem for sim pdfs
464 RooSimultaneous* simPdf = dynamic_cast<RooSimultaneous*>( &pdf );
465 if (!simPdf) {
466 RooDataSet *one = pdf.generate(*fGlobalObservables, 1);
467
468 const RooArgSet *values = one->get(0);
469 if (!_allVars) {
470 _allVars.reset(pdf.getVariables());
471 }
472 _allVars->assign(*values);
473 delete one;
474
475 } else {
476
477 if (_pdfList.empty()) {
478 RooCategory& channelCat = (RooCategory&)simPdf->indexCat();
479 int nCat = channelCat.numTypes();
480 for (int i=0; i < nCat; ++i){
481 channelCat.setIndex(i);
482 RooAbsPdf* pdftmp = simPdf->getPdf(channelCat.getCurrentLabel());
483 assert(pdftmp);
484 RooArgSet* globtmp = pdftmp->getObservables(*fGlobalObservables);
485 RooAbsPdf::GenSpec* gs = pdftmp->prepareMultiGen(*globtmp, NumEvents(1));
486 _pdfList.push_back(pdftmp);
487 _obsList.emplace_back(globtmp);
488 _gsList.emplace_back(gs);
489 }
490 }
491
492 // Assign generated values to the observables in _obsList
493 for (unsigned int i = 0; i < _pdfList.size(); ++i) {
494 std::unique_ptr<RooDataSet> tmp( _pdfList[i]->generate(*_gsList[i]) );
495 _obsList[i]->assign(*tmp->get(0));
496 }
497 }
498
499
500 } else {
501
502 // not using multigen for global observables
504 const RooArgSet *values = one->get(0);
505 RooArgSet* allVars = pdf.getVariables();
506 allVars->assign(*values);
507 delete allVars;
508 delete one;
509
510 }
511}
512
513////////////////////////////////////////////////////////////////////////////////
514/// This method generates a toy data set for the given parameter point taking
515/// global observables into account.
516/// The values of the generated global observables remain in the pdf's variables.
517/// They have to have those values for the subsequent evaluation of the
518/// test statistics.
519
520RooAbsData* ToyMCSampler::GenerateToyData(RooArgSet& paramPoint, double& weight, RooAbsPdf& pdf) const {
521
522 if(!fObservables) {
523 ooccoutE(nullptr,InputArguments) << "Observables not set." << endl;
524 return nullptr;
525 }
526
527 // assign input paramPoint
528 RooArgSet* allVars = fPdf->getVariables();
529 allVars->assign(paramPoint);
530
531
532 // create nuisance parameter points
536 oocoutI(nullptr,InputArguments) << "Cannot use multigen when nuisance parameters vary for every toy" << endl;
537 }
538
539 // generate global observables
540 RooArgSet observables(*fObservables);
542 observables.remove(*fGlobalObservables);
544 }
545
546 // save values to restore later.
547 // but this must remain after(!) generating global observables
548 const RooArgSet* saveVars = (const RooArgSet*)allVars->snapshot();
549
550 if(fNuisanceParametersSampler) { // use nuisance parameters?
551 // Construct a set of nuisance parameters that has the parameters
552 // in the input paramPoint removed. Therefore, no parameter in
553 // paramPoint is randomized.
554 // Therefore when a parameter is given (should be held fixed),
555 // but is also in the list of nuisance parameters, the parameter
556 // will be held fixed. This is useful for debugging to hold single
557 // parameters fixed although under "normal" circumstances it is
558 // randomized.
559 RooArgSet allVarsMinusParamPoint(*allVars);
560 allVarsMinusParamPoint.remove(paramPoint, false, true); // match by name
561
562 // get nuisance parameter point and weight
563 fNuisanceParametersSampler->NextPoint(allVarsMinusParamPoint, weight);
564
565
566 }else{
567 weight = 1.0;
568 }
569
570 RooAbsData *data = Generate(pdf, observables);
571
572 // We generated the data with the randomized nuisance parameter (if hybrid)
573 // but now we are setting the nuisance parameters back to where they were.
574 allVars->assign(*saveVars);
575 delete allVars;
576 delete saveVars;
577
578 return data;
579}
580
581////////////////////////////////////////////////////////////////////////////////
582/// This is the generate function to use in the context of the ToyMCSampler
583/// instead of the standard RooAbsPdf::generate(...).
584/// It takes into account whether the number of events is given explicitly
585/// or whether it should use the expected number of events. It also takes
586/// into account the option to generate a binned data set (*i.e.* RooDataHist).
587
588RooAbsData* ToyMCSampler::Generate(RooAbsPdf &pdf, RooArgSet &observables, const RooDataSet* protoData, int forceEvents) const {
589
590 if(fProtoData) {
591 protoData = fProtoData;
592 forceEvents = protoData->numEntries();
593 }
594
595 RooAbsData *data = nullptr;
596 int events = forceEvents;
597 if(events == 0) events = fNEvents;
598
599 // cannot use multigen when the nuisance parameters change for every toy
601
602 if (events == 0) {
603 if (pdf.canBeExtended() && pdf.expectedEvents(observables) > 0) {
604 if(fGenerateBinned) {
605 if(protoData) data = pdf.generate(observables, AllBinned(), Extended(), ProtoData(*protoData, true, true));
606 else data = pdf.generate(observables, AllBinned(), Extended());
607 } else {
608 if (protoData) {
609 if (useMultiGen) {
610 if (!_gs2) _gs2.reset( pdf.prepareMultiGen(observables, Extended(), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag), ProtoData(*protoData, true, true)) );
611 data = pdf.generate(*_gs2) ;
612 } else {
613 data = pdf.generate (observables, Extended(), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag), ProtoData(*protoData, true, true));
614 }
615 } else {
616 if (useMultiGen) {
618 data = pdf.generate(*_gs1) ;
619 } else {
621 }
622
623 }
624 }
625 } else {
626 oocoutE(nullptr,InputArguments)
627 << "ToyMCSampler: Error : pdf is not extended and number of events per toy is zero"
628 << endl;
629 }
630 } else {
631 if (fGenerateBinned) {
632 if(protoData) data = pdf.generate(observables, events, AllBinned(), ProtoData(*protoData, true, true));
633 else data = pdf.generate(observables, events, AllBinned());
634 } else {
635 if (protoData) {
636 if (useMultiGen) {
637 if (!_gs3) _gs3.reset( pdf.prepareMultiGen(observables, NumEvents(events), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag), ProtoData(*protoData, true, true)) );
638 data = pdf.generate(*_gs3) ;
639 } else {
640 data = pdf.generate (observables, NumEvents(events), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag), ProtoData(*protoData, true, true));
641 }
642 } else {
643 if (useMultiGen) {
645 data = pdf.generate(*_gs4) ;
646 } else {
648 }
649 }
650 }
651 }
652
653 return data;
654}
655
656////////////////////////////////////////////////////////////////////////////////
657/// Extended interface to append to sampling distribution more samples
658
660 RooArgSet& allParameters,
662 Int_t additionalMC)
663{
664 Int_t tmp = fNToys;
665 fNToys = additionalMC;
666 SamplingDistribution* newSamples = GetSamplingDistribution(allParameters);
667 fNToys = tmp;
668
669 if(last){
670 last->Add(newSamples);
671 delete newSamples;
672 return last;
673 }
674
675 return newSamples;
676}
677
678////////////////////////////////////////////////////////////////////////////////
679/// clear the cache obtained from the pdf used for speeding the toy and global observables generation
680/// needs to be called every time the model pdf (fPdf) changes
681
683 _gs1 = nullptr;
684 _gs2 = nullptr;
685 _gs3 = nullptr;
686 _gs4 = nullptr;
687 _allVars = nullptr;
688
689 // no need to delete the _pdfList since it is managed by the RooSimultaneous object
690 if (_pdfList.size() > 0) {
691 _pdfList.clear();
692 _obsList.clear();
693 _gsList.clear();
694 }
695}
696
697} // end namespace RooStats
#define oocoutW(o, a)
Definition: RooMsgService.h:51
#define oocoutE(o, a)
Definition: RooMsgService.h:52
#define oocoutI(o, a)
Definition: RooMsgService.h:49
#define ooccoutP(o, a)
Definition: RooMsgService.h:58
#define oocoutP(o, a)
Definition: RooMsgService.h:50
#define ooccoutE(o, a)
Definition: RooMsgService.h:60
#define ClassImp(name)
Definition: Rtypes.h:375
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
char name[80]
Definition: TGX11.cxx:110
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
Definition: RooAbsArg.h:71
RooArgSet * getObservables(const RooArgSet &set, bool valueOnly=true) const
Given a set of possible observables, return the observables that this PDF depends on.
Definition: RooAbsArg.h:293
RooArgSet * getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expresssion tree)
Definition: RooAbsArg.cxx:2056
virtual const char * getCurrentLabel() const
Return label string of current state.
Int_t numTypes(const char *=nullptr) const
Return number of types defined (in range named rangeName if rangeName!=nullptr)
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
bool empty() const
RooAbsCollection * snapshot(bool deepCopy=true) const
Take a snap shot of current collection contents.
Int_t getSize() const
Return the number of elements in the collection.
const_iterator end() const
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
RooAbsArg * first() const
const_iterator begin() const
RooAbsData is the common abstract base class for binned and unbinned datasets.
Definition: RooAbsData.h:62
virtual const RooArgSet * get() const
Definition: RooAbsData.h:106
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
Definition: RooAbsData.cxx:378
GenSpec * prepareMultiGen(const RooArgSet &whatVars, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none())
Prepare GenSpec configuration object for efficient generation of multiple datasets from identical spe...
Definition: RooAbsPdf.cxx:2039
virtual double expectedEvents(const RooArgSet *nset) const
Return expected number of events to be used in calculation of extended likelihood.
Definition: RooAbsPdf.cxx:3195
RooDataSet * generate(const RooArgSet &whatVars, Int_t nEvents, const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none())
See RooAbsPdf::generate(const RooArgSet&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&,...
Definition: RooAbsPdf.h:60
bool canBeExtended() const
If true, PDF can provide extended likelihood term.
Definition: RooAbsPdf.h:263
virtual RooDataSet * generateSimGlobal(const RooArgSet &whatVars, Int_t nEvents)
Special generator interface for generation of 'global observables' – for RooStats tools.
Definition: RooAbsPdf.cxx:2545
RooArgList is a container object that can hold multiple RooAbsArg objects.
Definition: RooArgList.h:22
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition: RooArgSet.h:56
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
Definition: RooArgSet.h:179
RooCategory is an object to represent discrete states.
Definition: RooCategory.h:28
bool setIndex(Int_t index, bool printError=true) override
Set value by specifying the index code of the desired state.
RooDataSet is a container class to hold unbinned data.
Definition: RooDataSet.h:55
const RooArgSet * get(Int_t index) const override
Return RooArgSet with coordinates of event 'index'.
static RooMsgService & instance()
Return reference to singleton instance.
StreamConfig & getStream(Int_t id)
static double infinity()
Return internal infinity representation.
Definition: RooNumber.cxx:48
static TRandom * randomGenerator()
Return a pointer to a singleton random-number generator implementation.
Definition: RooRandom.cxx:51
RooRealVar represents a variable that can be changed from the outside.
Definition: RooRealVar.h:40
RooSimultaneous facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
const RooAbsCategoryLValue & indexCat() const
RooAbsPdf * getPdf(const char *catName) const
Return the p.d.f associated with the given index category name.
This class is designed to aid in the construction of RooDataSets and RooArgSets, particularly those n...
void AppendArgSet(const RooAbsCollection *aset, TString prefix="")
For each variable in aset, prepend prefix to its name and add to the internal store.
RooDataSet * GetAsDataSet(TString name, TString title)
Returns all detailed output as a dataset.
void CommitSet(double weight=1.0)
Commit to the result RooDataSet.
Helper class for ToyMCSampler.
Definition: ToyMCSampler.h:38
void Refresh()
Creates the initial set of nuisance parameter points.
void NextPoint(RooArgSet &nuisPoint, double &weight)
Assigns new nuisance parameter point to members of nuisPoint.
std::unique_ptr< RooAbsData > fPoints
Definition: ToyMCSampler.h:63
RooWorkspace & GetWorkspace(void) const
returns fWorkspace
Definition: ProofConfig.h:94
Int_t GetNExperiments(void) const
return fNExperiments
Definition: ProofConfig.h:98
const char * GetHost(void) const
returns fHost
Definition: ProofConfig.h:96
bool GetShowGui(void) const
return fShowGui
Definition: ProofConfig.h:100
This class simply holds a sampling distribution of some test statistic.
void Add(const SamplingDistribution *other)
merge two sampling distributions
TestStatistic is an interface class to provide a facility for construction test statistics distributi...
Definition: TestStatistic.h:31
ToyMCSampler is an implementation of the TestStatSampler interface.
Definition: ToyMCSampler.h:67
const RooArgSet * fGlobalObservables
Definition: ToyMCSampler.h:251
std::string fSamplingDistName
name of the model
Definition: ToyMCSampler.h:247
virtual void GenerateGlobalObservables(RooAbsPdf &pdf) const
generate global observables
RooAbsData * Generate(RooAbsPdf &pdf, RooArgSet &observables, const RooDataSet *protoData=nullptr, int forceEvents=0) const
helper for GenerateToyData
virtual RooDataSet * GetSamplingDistributionsSingleWorker(RooArgSet &paramPoint)
This is the main function for serial runs.
std::unique_ptr< const RooArgSet > fParametersForTestStat
Definition: ToyMCSampler.h:244
virtual SamplingDistribution * AppendSamplingDistribution(RooArgSet &allParameters, SamplingDistribution *last, Int_t additionalMC)
Extended interface to append to sampling distribution more samples.
NuisanceParametersSampler * fNuisanceParametersSampler
!
Definition: ToyMCSampler.h:275
std::unique_ptr< RooAbsPdf::GenSpec > _gs4
! GenSpec #4
Definition: ToyMCSampler.h:285
const RooArgSet * fObservables
Definition: ToyMCSampler.h:250
double fToysInTails
minimum no of toys in tails for adaptive sampling (taking weights into account, therefore double) Def...
Definition: ToyMCSampler.h:263
virtual RooArgList * EvaluateAllTestStatistics(RooAbsData &data, const RooArgSet &poi)
Evaluate all test statistics, returning result and any detailed output.
RooAbsPdf * fPdf
densities, snapshots, and test statistics to reweight to
Definition: ToyMCSampler.h:243
SamplingDistribution * GetSamplingDistribution(RooArgSet &paramPoint) override
main interface
std::unique_ptr< RooAbsPdf::GenSpec > _gs1
! GenSpec #1
Definition: ToyMCSampler.h:282
virtual RooDataSet * GetSamplingDistributions(RooArgSet &paramPoint)
Use for serial and parallel runs.
virtual void AddTestStatistic(TestStatistic *t=nullptr)
The pdf can be nullptr in which case the density from SetPdf() is used.
Definition: ToyMCSampler.h:93
virtual RooAbsData * GenerateToyData(RooArgSet &paramPoint, RooAbsPdf &pdf) const
generates toy data without weight
Definition: ToyMCSampler.h:104
bool fExpectedNuisancePar
whether to use expectation values for nuisance parameters (ie Asimov data set)
Definition: ToyMCSampler.h:255
bool fUseMultiGen
Use PrepareMultiGen?
Definition: ToyMCSampler.h:288
std::unique_ptr< RooAbsPdf::GenSpec > _gs2
! GenSpec #2
Definition: ToyMCSampler.h:283
const RooArgSet * fNuisancePars
Definition: ToyMCSampler.h:249
std::unique_ptr< RooAbsPdf::GenSpec > _gs3
! GenSpec #3
Definition: ToyMCSampler.h:284
std::vector< TestStatistic * > fTestStatistics
Definition: ToyMCSampler.h:245
Int_t fNEvents
number of events per toy (may be ignored depending on settings)
Definition: ToyMCSampler.h:253
ToyMCSampler()
Proof constructor. Do not use.
double fAdaptiveLowLimit
tails
Definition: ToyMCSampler.h:268
std::unique_ptr< RooArgSet > _allVars
!
Definition: ToyMCSampler.h:278
static void SetAlwaysUseMultiGen(bool flag)
std::vector< RooAbsPdf * > _pdfList
! We don't own those objects
Definition: ToyMCSampler.h:279
Int_t fNToys
number of toys to generate
Definition: ToyMCSampler.h:252
virtual void ClearCache()
helper method for clearing the cache
bool CheckConfig(void)
Checks for sufficient information to do a GetSamplingDistribution(...).
ProofConfig * fProofConfig
!
Definition: ToyMCSampler.h:273
std::vector< std::unique_ptr< RooArgSet > > _obsList
!
Definition: ToyMCSampler.h:280
static bool fgAlwaysUseMultiGen
Use PrepareMultiGen always.
Definition: ToyMCSampler.h:287
double fMaxToys
maximum no of toys (taking weights into account, therefore double)
Definition: ToyMCSampler.h:266
const RooDataSet * fProtoData
in dev
Definition: ToyMCSampler.h:271
std::vector< std::unique_ptr< RooAbsPdf::GenSpec > > _gsList
!
Definition: ToyMCSampler.h:281
RooAbsPdf * fPriorNuisance
prior pdf for nuisance parameters
Definition: ToyMCSampler.h:248
ToyMCStudy is an implementation of RooAbsStudy for toy Monte Carlo sampling.
Definition: ToyMCStudy.h:30
void SetToyMCSampler(ToyMCSampler &t)
Definition: ToyMCStudy.h:55
void SetParamPoint(const RooArgSet &paramPoint)
Definition: ToyMCStudy.h:56
void SetRandomSeed(unsigned int seed)
Definition: ToyMCStudy.h:58
RooDataSet * merge()
Definition: ToyMCStudy.cxx:101
RooStudyManager is a utility class to manage studies that consist of repeated applications of generat...
void runProof(Int_t nExperiments, const char *proofHost="", bool showGui=true)
Open PROOF-Lite session.
The RooWorkspace is a persistable container for RooFit projects.
Definition: RooWorkspace.h:43
virtual UInt_t Integer(UInt_t imax)
Returns a random integer uniformly distributed on the interval [ 0, imax-1 ].
Definition: TRandom.cxx:360
Basic string class.
Definition: TString.h:136
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition: TString.cxx:2341
RooCmdArg Extended(bool flag=true)
RooCmdArg ProtoData(const RooDataSet &protoData, bool randomizeOrder=false, bool resample=false)
RooCmdArg AllBinned()
RooCmdArg AutoBinned(bool flag=true)
RooCmdArg NumEvents(Int_t numEvents)
RooCmdArg GenBinned(const char *tag)
RooCmdArg ExpectedData(bool flag=true)
RVec< PromoteType< T > > ceil(const RVec< T > &v)
Definition: RVec.hxx:1791
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
Definition: Common.h:18
@ Generation
Definition: RooGlobalFunc.h:63
@ NumIntegration
Definition: RooGlobalFunc.h:65
@ InputArguments
Definition: RooGlobalFunc.h:64
Namespace for the RooStats classes.
Definition: Asimov.h:19
void removeTopic(RooFit::MsgTopic oldTopic)
static void output()