12 #ifndef ROOSTATS_ToyMCImportanceSampler
13 #define ROOSTATS_ToyMCImportanceSampler
19 enum toysStrategies { EQUALTOYSPERDENSITY, EXPONENTIALTOYDISTRIBUTION };
21 class ToyMCImportanceSampler:
public ToyMCSampler {
24 ToyMCImportanceSampler() :
30 fGenerateFromNull =
true;
33 fToysStrategy = EQUALTOYSPERDENSITY;
35 ToyMCImportanceSampler(TestStatistic &ts, Int_t ntoys) :
36 ToyMCSampler(ts, ntoys)
39 fGenerateFromNull =
true;
42 fToysStrategy = EQUALTOYSPERDENSITY;
45 virtual ~ToyMCImportanceSampler();
50 virtual RooDataSet* GetSamplingDistributionsSingleWorker(RooArgSet& paramPoint);
52 using ToyMCSampler::GenerateToyData;
53 virtual RooAbsData* GenerateToyData(RooArgSet& paramPoint,
double& weight)
const;
54 virtual RooAbsData* GenerateToyData(RooArgSet& paramPoint,
double& weight, std::vector<double>& impNLLs,
double& nullNLL)
const;
55 virtual RooAbsData* GenerateToyData(std::vector<double>& weights)
const;
56 virtual RooAbsData* GenerateToyData(std::vector<double>& weights, std::vector<double>& nullNLLs, std::vector<double>& impNLLs)
const;
60 void SetDensityToGenerateFromByIndex(
unsigned int i,
bool fromNull =
false) {
61 if( (fromNull && i >= fNullDensities.size()) ||
62 (!fromNull && i >= fImportanceDensities.size())
64 oocoutE((TObject*)0,InputArguments) <<
"Index out of range. Requested index: "<<i<<
65 " , but null densities: "<<fNullDensities.size()<<
66 " and importance densities: "<<fImportanceDensities.size() << std::endl;
70 fGenerateFromNull = fromNull;
80 void AddImportanceDensity(RooAbsPdf* p,
const RooArgSet* s) {
81 if( p == NULL && s == NULL ) {
82 oocoutI((TObject*)0,InputArguments) <<
"Neither density nor snapshot given. Doing nothing." << std::endl;
85 if( p == NULL && fPdf == NULL ) {
86 oocoutE((TObject*)0,InputArguments) <<
"No density given, but snapshot is there. Aborting." << std::endl;
90 if( p == NULL ) p = fPdf;
92 if( s ) s = (
const RooArgSet*)s->snapshot();
94 fImportanceDensities.push_back( p );
95 fImportanceSnapshots.push_back( s );
96 fImpNLLs.push_back( NULL );
101 void AddNullDensity(RooAbsPdf* p,
const RooArgSet* s = NULL) {
102 if( p == NULL && s == NULL ) {
103 oocoutI((TObject*)0,InputArguments) <<
"Neither density nor snapshot nor test statistic given. Doing nothing." << std::endl;
107 if( p == NULL && fNullDensities.size() >= 1 ) p = fNullDensities[0];
108 if( s == NULL ) s = fParametersForTestStat;
109 if( s ) s = (
const RooArgSet*)s->snapshot();
111 fNullDensities.push_back( p );
112 fNullSnapshots.push_back( s );
113 fNullNLLs.push_back( NULL );
117 virtual void SetPdf(RooAbsPdf& pdf) {
118 ToyMCSampler::SetPdf(pdf);
120 if( fNullDensities.size() == 1 ) { fNullDensities[0] = &pdf; }
121 else if( fNullDensities.size() == 0) AddNullDensity( &pdf );
123 oocoutE((TObject*)0,InputArguments) <<
"Cannot use SetPdf() when already multiple null densities are specified. Please use AddNullDensity()." << std::endl;
127 void SetParametersForTestStat(
const RooArgSet& nullpoi) {
128 ToyMCSampler::SetParametersForTestStat(nullpoi);
129 if( fNullSnapshots.size() == 0 ) AddNullDensity( NULL, &nullpoi );
130 else if( fNullSnapshots.size() == 1 ) {
131 oocoutI((TObject*)0,InputArguments) <<
"Overwriting snapshot for the only defined null density." << std::endl;
132 if( fNullSnapshots[0] )
delete fNullSnapshots[0];
133 fNullSnapshots[0] = (
const RooArgSet*)nullpoi.snapshot();
135 oocoutE((TObject*)0,InputArguments) <<
"Cannot use SetParametersForTestStat() when already multiple null densities are specified. Please use AddNullDensity()." << std::endl;
142 void SetApplyVeto(
bool b =
true) { fApplyVeto = b; }
144 void SetReuseNLL(
bool r =
true) { fReuseNLL = r; }
149 virtual void SetConditionalObservables(
const RooArgSet& set) {fConditionalObs.removeAll(); fConditionalObs.add(set);}
151 int CreateNImpDensitiesForOnePOI(
153 const RooArgSet& allPOI,
156 double poiValueForBackground = 0.0
158 int CreateImpDensitiesForOnePOIAdaptively(
160 const RooArgSet& allPOI,
162 double nStdDevOverlap = 0.5,
163 double poiValueForBackground = 0.0
166 void SetEqualNumToysPerDensity(
void ) { fToysStrategy = EQUALTOYSPERDENSITY; }
167 void SetExpIncreasingNumToysPerDensity(
void ) { fToysStrategy = EXPONENTIALTOYDISTRIBUTION; }
172 virtual void ClearCache();
174 unsigned int fIndexGenDensity;
175 bool fGenerateFromNull;
178 RooArgSet fConditionalObs;
181 std::vector<RooAbsPdf*> fNullDensities;
182 mutable std::vector<const RooArgSet*> fNullSnapshots;
185 std::vector<RooAbsPdf*> fImportanceDensities;
186 std::vector<const RooArgSet*> fImportanceSnapshots;
190 toysStrategies fToysStrategy;
192 mutable std::vector<RooAbsReal*> fNullNLLs;
193 mutable std::vector<RooAbsReal*> fImpNLLs;
196 ClassDef(ToyMCImportanceSampler,2)