00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOSTATS_ToyMCSamplerOld
00013 #define ROOSTATS_ToyMCSamplerOld
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef ROOT_Rtypes
00038 #include "Rtypes.h"
00039 #endif
00040
00041 #include <vector>
00042 #include <string>
00043 #include <sstream>
00044
00045 #include "RooStats/TestStatSampler.h"
00046 #include "RooStats/SamplingDistribution.h"
00047 #include "RooStats/TestStatistic.h"
00048 #include "RooStats/RooStatsUtils.h"
00049
00050 #include "RooWorkspace.h"
00051 #include "RooMsgService.h"
00052 #include "RooAbsPdf.h"
00053 #include "TRandom.h"
00054
00055 #include "RooDataSet.h"
00056
00057 namespace RooStats {
00058
00059 class ToyMCSamplerOld : public TestStatSampler {
00060
00061
00062 public:
00063 ToyMCSamplerOld(TestStatistic &ts) {
00064 fTestStat = &ts;
00065 fWS = new RooWorkspace();
00066 fOwnsWorkspace = true;
00067 fDataName = "";
00068 fPdfName = "";
00069 fNullPOI = 0;
00070 fNuisParams=0;
00071 fObservables=0;
00072 fExtended = kTRUE;
00073 fRand = new TRandom();
00074 fCounter=0;
00075 fVarName = fTestStat->GetVarName();
00076 fLastDataSet = 0;
00077 fNevents = 0;
00078 fNtoys = 0;
00079 fSize = 0.05;
00080 }
00081
00082 virtual ~ToyMCSamplerOld() {
00083 if(fOwnsWorkspace) delete fWS;
00084 if(fRand) delete fRand;
00085 if(fLastDataSet) delete fLastDataSet;
00086 }
00087
00088
00089 virtual SamplingDistribution* AppendSamplingDistribution(RooArgSet& allParameters,
00090 SamplingDistribution* last,
00091 Int_t additionalMC) {
00092
00093 Int_t tmp = fNtoys;
00094 fNtoys = additionalMC;
00095 SamplingDistribution* newSamples = GetSamplingDistribution(allParameters);
00096 fNtoys = tmp;
00097
00098 if(last){
00099 last->Add(newSamples);
00100 delete newSamples;
00101 return last;
00102 }
00103
00104 return newSamples;
00105 }
00106
00107
00108 virtual SamplingDistribution* GetSamplingDistribution(RooArgSet& allParameters) {
00109 std::vector<Double_t> testStatVec;
00110
00111
00112 RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
00113 RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR) ;
00114
00115 for(Int_t i=0; i<fNtoys; ++i){
00116
00117
00118
00119
00120
00121 RooDataSet* toydata = (RooDataSet*)GenerateToyData(allParameters);
00122
00123
00124 testStatVec.push_back( fTestStat->Evaluate(*toydata, *fNullPOI) );
00125
00126
00127
00128
00129
00130
00131 if(fLastDataSet) delete fLastDataSet;
00132 fLastDataSet = toydata;
00133 }
00134
00135 RooMsgService::instance().setGlobalKillBelow(msglevel);
00136
00137
00138 return new SamplingDistribution( "temp",
00139 "Sampling Distribution of Test Statistic", testStatVec, fVarName );
00140 }
00141
00142 virtual RooAbsData* GenerateToyData(RooArgSet& allParameters) const {
00143
00144
00145
00146
00147 RooAbsPdf* pdf = fWS->pdf(fPdfName);
00148 if(!fObservables){
00149 cout << "Observables not specified in ToyMCSamplerOld, will try to determine. "
00150 << "Will ignore all constant parameters, parameters of interest, and nuisance parameters." << endl;
00151 RooArgSet* observables = pdf->getVariables();
00152 RemoveConstantParameters(observables);
00153
00154
00155 if(fNullPOI) observables->remove(*fNullPOI, kFALSE, kTRUE);
00156 if(fNuisParams) observables->remove(*fNuisParams, kFALSE, kTRUE);
00157 cout << "will use the following as observables when generating data" << endl;
00158 observables->Print();
00159 fObservables=observables;
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 RooArgSet* parameters = pdf->getParameters(fObservables);
00183 RooStats::SetParameters(&allParameters, parameters);
00184
00185
00186
00187
00188
00189
00190
00191
00192 RooFit::MsgLevel level = RooMsgService::instance().globalKillBelow();
00193 RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR) ;
00194
00195
00196 RooAbsData* data = NULL;
00197 if(fExtended) {
00198 data = (RooAbsData*)pdf->generate(*fObservables, RooFit::Extended());
00199 } else {
00200 data = (RooAbsData*)pdf->generate(*fObservables, fNevents);
00201 }
00202
00203 RooMsgService::instance().setGlobalKillBelow(level) ;
00204 delete parameters;
00205 return data;
00206 }
00207
00208
00209 string MakeName(RooArgSet& ){
00210 std::ostringstream str;
00211 str<<"SamplingDist_"<< fCounter;
00212 fCounter++;
00213 std::string buf = str.str();
00214 return buf ;
00215 }
00216
00217
00218 virtual Double_t EvaluateTestStatistic(RooAbsData& data, RooArgSet& allParameters) {
00219 return fTestStat->Evaluate(data, allParameters);
00220 }
00221
00222
00223 virtual TestStatistic* GetTestStatistic() const {
00224 return fTestStat;
00225 }
00226
00227
00228 virtual Double_t ConfidenceLevel() const {return 1.-fSize;}
00229
00230
00231 virtual void Initialize(RooAbsArg& ,
00232 RooArgSet& ,
00233 RooArgSet& ) {}
00234
00235
00236 virtual void SetNToys(const Int_t ntoy) {
00237 fNtoys = ntoy;
00238 }
00239
00240 virtual void SetNEventsPerToy(const Int_t nevents) {
00241 fNevents = nevents;
00242 }
00243
00244
00245 virtual void SetExtended(const Bool_t isExtended) {
00246 fExtended = isExtended;
00247 }
00248
00249
00250 virtual void SetData(RooAbsData& data) {
00251 if(&data){
00252 fWS->import(data);
00253 fDataName = data.GetName();
00254 fWS->Print();
00255 }
00256 }
00257
00258 virtual void SetPdf(RooAbsPdf& pdf) {
00259 if(&pdf){
00260 fWS->import(pdf);
00261 fPdfName = pdf.GetName();
00262 }
00263 }
00264
00265
00266 virtual void SetData(const char* name) {fDataName = name;}
00267
00268 virtual void SetPdf(const char* name) {fPdfName = name;}
00269
00270 virtual void SetPriorNuisance(RooAbsPdf* ) {}
00271
00272
00273 virtual void SetParametersForTestStat(const RooArgSet& nullpoi) {fNullPOI = (RooArgSet*)nullpoi.snapshot();}
00274
00275 virtual void SetNuisanceParameters(const RooArgSet& set) {fNuisParams = &set;}
00276
00277 virtual void SetObservables(const RooArgSet& set) {fObservables = &set;}
00278
00279 virtual void SetGlobalObservables(const RooArgSet& ) {}
00280
00281
00282 virtual void SetTestSize(Double_t size) {fSize = size;}
00283
00284 virtual void SetConfidenceLevel(Double_t cl) {fSize = 1.-cl;}
00285
00286
00287 virtual void SetTestStatistic(TestStatistic* testStat) {
00288 fTestStat = testStat;
00289 }
00290
00291
00292 void SetSamplingDistName(const char* name) { if(name) fSamplingDistName = name; }
00293
00294
00295 private:
00296 Double_t fSize;
00297 RooWorkspace* fWS;
00298 Bool_t fOwnsWorkspace;
00299 string fSamplingDistName;
00300 const char* fPdfName;
00301 const char* fDataName;
00302 RooArgSet* fNullPOI;
00303 const RooArgSet* fNuisParams;
00304 mutable const RooArgSet* fObservables;
00305 TestStatistic* fTestStat;
00306 Int_t fNtoys;
00307 Int_t fNevents;
00308 Bool_t fExtended;
00309 TRandom* fRand;
00310 TString fVarName;
00311
00312 Int_t fCounter;
00313
00314 RooDataSet* fLastDataSet;
00315
00316 protected:
00317 ClassDef(ToyMCSamplerOld,1)
00318 };
00319 }
00320
00321
00322 #endif