/usr/include/root/RooStats/ToyMCImportanceSampler.h is in libroot-roofit-dev 5.34.30-0ubuntu8.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | // @(#)root/roostats:$Id$
// Author: Sven Kreiss and Kyle Cranmer January 2012
// Author: Kyle Cranmer, Lorenzo Moneta, Gregory Schott, Wouter Verkerke
/*************************************************************************
* Copyright (C) 1995-2008, Rene Brun and Fons Rademakers. *
* All rights reserved. *
* *
* For the licensing terms see $ROOTSYS/LICENSE. *
* For the list of contributors see $ROOTSYS/README/CREDITS. *
*************************************************************************/
#ifndef ROOSTATS_ToyMCImportanceSampler
#define ROOSTATS_ToyMCImportanceSampler
//_________________________________________________
/*
BEGIN_HTML
<p>
ToyMCImportanceSampler is an extension of the ToyMCSampler for Importance Sampling.
</p>
<p>
Implementation based on:
Cranmer, Kreiss, Read (in Preparation)
</p>
END_HTML
*/
//
#include "RooStats/ToyMCSampler.h"
namespace RooStats {
enum toysStrategies { EQUALTOYSPERDENSITY, EXPONENTIALTOYDISTRIBUTION };
class ToyMCImportanceSampler: public ToyMCSampler {
public:
ToyMCImportanceSampler() :
ToyMCSampler()
{
// Proof constructor. Do not use.
fIndexGenDensity = 0;
fGenerateFromNull = true;
fApplyVeto = true;
fReuseNLL = true;
fToysStrategy = EQUALTOYSPERDENSITY;
}
ToyMCImportanceSampler(TestStatistic &ts, Int_t ntoys) :
ToyMCSampler(ts, ntoys)
{
fIndexGenDensity = 0;
fGenerateFromNull = true;
fApplyVeto = true;
fReuseNLL = true;
fToysStrategy = EQUALTOYSPERDENSITY;
}
virtual ~ToyMCImportanceSampler();
// overwrite GetSamplingDistributionsSingleWorker(paramPoint) with a version that loops
// over nulls and importance densities, but calls the parent
// ToyMCSampler::GetSamplingDistributionsSingleWorker(paramPoint).
virtual RooDataSet* GetSamplingDistributionsSingleWorker(RooArgSet& paramPoint);
using ToyMCSampler::GenerateToyData;
virtual RooAbsData* GenerateToyData(RooArgSet& paramPoint, double& weight) const;
virtual RooAbsData* GenerateToyData(RooArgSet& paramPoint, double& weight, std::vector<double>& impNLLs, double& nullNLL) const;
virtual RooAbsData* GenerateToyData(std::vector<double>& weights) const;
virtual RooAbsData* GenerateToyData(std::vector<double>& weights, std::vector<double>& nullNLLs, std::vector<double>& impNLLs) const;
/// specifies the pdf to sample from
void SetDensityToGenerateFromByIndex(unsigned int i, bool fromNull = false) {
if( (fromNull && i >= fNullDensities.size()) ||
(!fromNull && i >= fImportanceDensities.size())
) {
oocoutE((TObject*)0,InputArguments) << "Index out of range. Requested index: "<<i<<
" , but null densities: "<<fNullDensities.size()<<
" and importance densities: "<<fImportanceDensities.size() << std::endl;
}
fIndexGenDensity = i;
fGenerateFromNull = fromNull;
ClearCache();
}
// For importance sampling with multiple desnities/snapshots:
// This is used to check the current Likelihood against Likelihoods from
// other importance densities apart from the one given as importance snapshot.
// The pdf can be NULL in which case the density from SetImportanceDensity()
// is used. The snapshot is also optional.
void AddImportanceDensity(RooAbsPdf* p, const RooArgSet* s) {
if( p == NULL && s == NULL ) {
oocoutI((TObject*)0,InputArguments) << "Neither density nor snapshot given. Doing nothing." << std::endl;
return;
}
if( p == NULL && fPdf == NULL ) {
oocoutE((TObject*)0,InputArguments) << "No density given, but snapshot is there. Aborting." << std::endl;
return;
}
if( p == NULL ) p = fPdf;
if( s ) s = (const RooArgSet*)s->snapshot();
fImportanceDensities.push_back( p );
fImportanceSnapshots.push_back( s );
fImpNLLs.push_back( NULL );
}
// The pdf can be NULL in which case the density from SetPdf()
// is used. The snapshot and TestStatistic is also optional.
void AddNullDensity(RooAbsPdf* p, const RooArgSet* s = NULL) {
if( p == NULL && s == NULL ) {
oocoutI((TObject*)0,InputArguments) << "Neither density nor snapshot nor test statistic given. Doing nothing." << std::endl;
return;
}
if( p == NULL && fNullDensities.size() >= 1 ) p = fNullDensities[0];
if( s == NULL ) s = fParametersForTestStat;
if( s ) s = (const RooArgSet*)s->snapshot();
fNullDensities.push_back( p );
fNullSnapshots.push_back( s );
fNullNLLs.push_back( NULL );
ClearCache();
}
// overwrite from ToyMCSampler
virtual void SetPdf(RooAbsPdf& pdf) {
ToyMCSampler::SetPdf(pdf);
if( fNullDensities.size() == 1 ) { fNullDensities[0] = &pdf; }
else if( fNullDensities.size() == 0) AddNullDensity( &pdf );
else{
oocoutE((TObject*)0,InputArguments) << "Cannot use SetPdf() when already multiple null densities are specified. Please use AddNullDensity()." << std::endl;
}
}
// overwrite from ToyMCSampler
void SetParametersForTestStat(const RooArgSet& nullpoi) {
ToyMCSampler::SetParametersForTestStat(nullpoi);
if( fNullSnapshots.size() == 0 ) AddNullDensity( NULL, &nullpoi );
else if( fNullSnapshots.size() == 1 ) {
oocoutI((TObject*)0,InputArguments) << "Overwriting snapshot for the only defined null density." << std::endl;
if( fNullSnapshots[0] ) delete fNullSnapshots[0];
fNullSnapshots[0] = (const RooArgSet*)nullpoi.snapshot();
}else{
oocoutE((TObject*)0,InputArguments) << "Cannot use SetParametersForTestStat() when already multiple null densities are specified. Please use AddNullDensity()." << std::endl;
}
}
// When set to true, this sets the weight of all toys to zero that
// do not have the largest likelihood under the density it was generated
// compared to the other densities.
void SetApplyVeto(bool b = true) { fApplyVeto = b; }
void SetReuseNLL(bool r = true) { fReuseNLL = r; }
// set the conditional observables which will be used when creating the NLL
// so the pdf's will not be normalized on the conditional observables when computing the NLL
// Since the class use a NLL we need to set the ocnditional onservables if they exist in the model
virtual void SetConditionalObservables(const RooArgSet& set) {fConditionalObs.removeAll(); fConditionalObs.add(set);}
int CreateNImpDensitiesForOnePOI(
RooAbsPdf& pdf,
const RooArgSet& allPOI,
RooRealVar& poi,
int n,
double poiValueForBackground = 0.0
);
int CreateImpDensitiesForOnePOIAdaptively(
RooAbsPdf& pdf,
const RooArgSet& allPOI,
RooRealVar& poi,
double nStdDevOverlap = 0.5,
double poiValueForBackground = 0.0
);
void SetEqualNumToysPerDensity( void ) { fToysStrategy = EQUALTOYSPERDENSITY; }
void SetExpIncreasingNumToysPerDensity( void ) { fToysStrategy = EXPONENTIALTOYDISTRIBUTION; }
protected:
// helper method for clearing the cache
virtual void ClearCache();
unsigned int fIndexGenDensity;
bool fGenerateFromNull;
bool fApplyVeto;
RooArgSet fConditionalObs; // set of conditional observables
// support multiple null densities
std::vector<RooAbsPdf*> fNullDensities;
mutable std::vector<const RooArgSet*> fNullSnapshots;
// densities and snapshots to generate from
std::vector<RooAbsPdf*> fImportanceDensities;
std::vector<const RooArgSet*> fImportanceSnapshots;
bool fReuseNLL;
toysStrategies fToysStrategy;
mutable std::vector<RooAbsReal*> fNullNLLs; //!
mutable std::vector<RooAbsReal*> fImpNLLs; //!
protected:
ClassDef(ToyMCImportanceSampler,2) // An implementation of importance sampling
};
}
#endif
|