13 #ifndef ROOSTATS_ToyMCSampler
14 #define ROOSTATS_ToyMCSampler
37 class DetailedOutputAggregator;
39 class NuisanceParametersSampler {
42 NuisanceParametersSampler(RooAbsPdf *prior=NULL,
const RooArgSet *parameters=NULL, Int_t nToys=1000, Bool_t asimov=kFALSE) :
52 virtual ~NuisanceParametersSampler() {
53 if(fPoints) {
delete fPoints; fPoints = NULL; }
56 void NextPoint(RooArgSet& nuisPoint, Double_t& weight);
63 const RooArgSet *fParams;
71 class ToyMCSampler:
public TestStatSampler {
76 ToyMCSampler(TestStatistic &ts, Int_t ntoys);
77 virtual ~ToyMCSampler();
79 static void SetAlwaysUseMultiGen(Bool_t flag);
81 void SetUseMultiGen(Bool_t flag) { fUseMultiGen = flag ; }
84 virtual SamplingDistribution* GetSamplingDistribution(RooArgSet& paramPoint);
85 virtual RooDataSet* GetSamplingDistributions(RooArgSet& paramPoint);
86 virtual RooDataSet* GetSamplingDistributionsSingleWorker(RooArgSet& paramPoint);
88 virtual SamplingDistribution* AppendSamplingDistribution(
89 RooArgSet& allParameters,
90 SamplingDistribution* last,
97 virtual void AddTestStatistic(TestStatistic* t = NULL) {
99 oocoutI((TObject*)0,InputArguments) <<
"No test statistic given. Doing nothing." << std::endl;
105 fTestStatistics.push_back( t );
110 virtual RooAbsData* GenerateToyData(RooArgSet& paramPoint, RooAbsPdf& pdf)
const {
111 if(fExpectedNuisancePar) oocoutE((TObject*)NULL,InputArguments) <<
"ToyMCSampler: using expected nuisance parameters but ignoring weight. Use GetSamplingDistribution(paramPoint, weight) instead." << std::endl;
113 return GenerateToyData(paramPoint, weight, pdf);
115 virtual RooAbsData* GenerateToyData(RooArgSet& paramPoint)
const {
return GenerateToyData(paramPoint,*fPdf); }
117 virtual RooAbsData* GenerateToyData(RooArgSet& paramPoint,
double& weight, RooAbsPdf& pdf)
const;
118 virtual RooAbsData* GenerateToyData(RooArgSet& paramPoint,
double& weight)
const {
return GenerateToyData(paramPoint,weight,*fPdf); }
121 virtual void GenerateGlobalObservables(RooAbsPdf& pdf)
const;
125 virtual Double_t EvaluateTestStatistic(RooAbsData& data, RooArgSet& nullPOI,
int i ) {
126 return fTestStatistics[i]->Evaluate(data, nullPOI);
128 virtual Double_t EvaluateTestStatistic(RooAbsData& data, RooArgSet& nullPOI) {
return EvaluateTestStatistic( data,nullPOI, 0 ); }
129 virtual RooArgList* EvaluateAllTestStatistics(RooAbsData& data,
const RooArgSet& poi);
132 virtual TestStatistic* GetTestStatistic(
unsigned int i)
const {
133 if( fTestStatistics.size() <= i )
return NULL;
134 return fTestStatistics[i];
136 virtual TestStatistic* GetTestStatistic(
void)
const {
return GetTestStatistic(0); }
138 virtual Double_t ConfidenceLevel()
const {
return 1. - fSize; }
139 virtual void Initialize(
145 virtual Int_t GetNToys(
void) {
return fNToys; }
146 virtual void SetNToys(
const Int_t ntoy) { fNToys = ntoy; }
149 virtual void SetNEventsPerToy(
const Int_t nevents) {
155 virtual void SetParametersForTestStat(
const RooArgSet& nullpoi) {
156 if( fParametersForTestStat )
delete fParametersForTestStat;
157 fParametersForTestStat = (
const RooArgSet*)nullpoi.snapshot();
160 virtual void SetPdf(RooAbsPdf& pdf) { fPdf = &pdf; ClearCache(); }
163 virtual void SetPriorNuisance(RooAbsPdf* pdf) {
164 fPriorNuisance = pdf;
165 if (fNuisanceParametersSampler) {
166 delete fNuisanceParametersSampler;
167 fNuisanceParametersSampler = NULL;
171 virtual void SetNuisanceParameters(
const RooArgSet& np) { fNuisancePars = &np; }
173 virtual void SetObservables(
const RooArgSet& o) { fObservables = &o; }
175 virtual void SetGlobalObservables(
const RooArgSet& o) { fGlobalObservables = &o; }
179 virtual void SetTestSize(Double_t size) { fSize = size; }
181 virtual void SetConfidenceLevel(Double_t cl) { fSize = 1. - cl; }
184 virtual void SetTestStatistic(TestStatistic *testStatistic,
unsigned int i) {
185 if( fTestStatistics.size() < i ) {
186 oocoutE((TObject*)NULL,InputArguments) <<
"Cannot set test statistic for this index." << std::endl;
189 if( fTestStatistics.size() == i)
190 fTestStatistics.push_back(testStatistic);
192 fTestStatistics[i] = testStatistic;
194 virtual void SetTestStatistic(TestStatistic *t) {
return SetTestStatistic(t,0); }
196 virtual void SetExpectedNuisancePar(Bool_t i = kTRUE) { fExpectedNuisancePar = i; }
197 virtual void SetAsimovNuisancePar(Bool_t i = kTRUE) { fExpectedNuisancePar = i; }
200 Bool_t CheckConfig(
void);
203 void SetGenerateBinned(
bool binned =
true) { fGenerateBinned = binned; }
205 void SetGenerateBinnedTag(
const char* binnedTag =
"" ) { fGenerateBinnedTag = binnedTag; }
207 void SetGenerateAutoBinned( Bool_t autoBinned = kTRUE ) { fGenerateAutoBinned = autoBinned; }
210 void SetSamplingDistName(
const char* name) {
if(name) fSamplingDistName = name; }
211 std::string GetSamplingDistName(
void) {
return fSamplingDistName; }
214 void SetMaxToys(Double_t t) { fMaxToys = t; }
216 void SetToysLeftTail(Double_t toys, Double_t threshold) {
218 fAdaptiveLowLimit = threshold;
219 fAdaptiveHighLimit = RooNumber::infinity();
221 void SetToysRightTail(Double_t toys, Double_t threshold) {
223 fAdaptiveHighLimit = threshold;
224 fAdaptiveLowLimit = -RooNumber::infinity();
226 void SetToysBothTails(Double_t toys, Double_t low_threshold, Double_t high_threshold) {
228 fAdaptiveHighLimit = high_threshold;
229 fAdaptiveLowLimit = low_threshold;
233 void SetProofConfig(ProofConfig *pc = NULL) { fProofConfig = pc; }
235 void SetProtoData(
const RooDataSet* d) { fProtoData = d; }
239 const RooArgList* EvaluateAllTestStatistics(RooAbsData& data,
const RooArgSet& poi, DetailedOutputAggregator& detOutAgg);
242 RooAbsData* Generate(RooAbsPdf &pdf, RooArgSet &observables,
const RooDataSet *protoData=NULL,
int forceEvents=0)
const;
245 virtual void ClearCache();
250 const RooArgSet* fParametersForTestStat;
251 std::vector<TestStatistic*> fTestStatistics;
253 std::string fSamplingDistName;
254 RooAbsPdf *fPriorNuisance;
255 const RooArgSet *fNuisancePars;
256 const RooArgSet *fObservables;
257 const RooArgSet *fGlobalObservables;
261 Bool_t fExpectedNuisancePar;
262 Bool_t fGenerateBinned;
263 TString fGenerateBinnedTag;
264 Bool_t fGenerateAutoBinned;
269 Double_t fToysInTails;
274 Double_t fAdaptiveLowLimit;
275 Double_t fAdaptiveHighLimit;
277 const RooDataSet *fProtoData;
279 ProofConfig *fProofConfig;
281 mutable NuisanceParametersSampler *fNuisanceParametersSampler;
284 mutable RooArgSet* _allVars ;
285 mutable std::list<RooAbsPdf*> _pdfList ;
286 mutable std::list<RooArgSet*> _obsList ;
287 mutable std::list<RooAbsPdf::GenSpec*> _gsList ;
288 mutable RooAbsPdf::GenSpec* _gs1 ;
289 mutable RooAbsPdf::GenSpec* _gs2 ;
290 mutable RooAbsPdf::GenSpec* _gs3 ;
291 mutable RooAbsPdf::GenSpec* _gs4 ;
293 static Bool_t fgAlwaysUseMultiGen ;
294 Bool_t fUseMultiGen ;
297 ClassDef(ToyMCSampler,3)