00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "Riostream.h"
00038 #include "RooDataSet.h"
00039 #include "RooRealVar.h"
00040 #include "RooRandom.h"
00041 #include "TString.h"
00042 #include "RooFit.h"
00043 #include "RooFitResult.h"
00044 #include "RooAddition.h"
00045 #include "RooMsgService.h"
00046 #include "RooRandomizeParamMCSModule.h"
00047
00048 using namespace std ;
00049
00050 ClassImp(RooRandomizeParamMCSModule)
00051 ;
00052
00053
00054
00055
00056 RooRandomizeParamMCSModule::RooRandomizeParamMCSModule() :
00057 RooAbsMCStudyModule("RooRandomizeParamMCSModule","RooRandomizeParamMCSModule"), _data(0)
00058 {
00059
00060 }
00061
00062
00063
00064
00065 RooRandomizeParamMCSModule::RooRandomizeParamMCSModule(const RooRandomizeParamMCSModule& other) :
00066 RooAbsMCStudyModule(other),
00067 _unifParams(other._unifParams),
00068 _gausParams(other._gausParams),
00069 _data(0)
00070 {
00071
00072 }
00073
00074
00075
00076
00077 RooRandomizeParamMCSModule:: ~RooRandomizeParamMCSModule()
00078 {
00079
00080
00081 if (_data) {
00082 delete _data ;
00083 }
00084 }
00085
00086
00087
00088
00089 void RooRandomizeParamMCSModule::sampleUniform(RooRealVar& param, Double_t lo, Double_t hi)
00090 {
00091
00092
00093
00094
00095
00096 if (genParams()) {
00097 RooRealVar* actualPar = static_cast<RooRealVar*>(genParams()->find(param.GetName())) ;
00098 if (!actualPar) {
00099 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::initializeInstance: variable " << param.GetName() << " is not a parameter of RooMCStudy model and is ignored!" << endl ;
00100 return ;
00101 }
00102 }
00103
00104 _unifParams.push_back(UniParam(¶m,lo,hi)) ;
00105 }
00106
00107
00108
00109
00110 void RooRandomizeParamMCSModule::sampleGaussian(RooRealVar& param, Double_t mean, Double_t sigma)
00111 {
00112
00113
00114
00115
00116
00117 if (genParams()) {
00118 RooRealVar* actualPar = static_cast<RooRealVar*>(genParams()->find(param.GetName())) ;
00119 if (!actualPar) {
00120 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::initializeInstance: variable " << param.GetName() << " is not a parameter of RooMCStudy model and is ignored!" << endl ;
00121 return ;
00122 }
00123 }
00124
00125 _gausParams.push_back(GausParam(¶m,mean,sigma)) ;
00126 }
00127
00128
00129
00130
00131
00132 void RooRandomizeParamMCSModule::sampleSumUniform(const RooArgSet& paramSet, Double_t lo, Double_t hi)
00133 {
00134
00135
00136
00137
00138
00139
00140
00141 RooArgSet okset ;
00142 TIterator* iter = paramSet.createIterator() ;
00143 RooAbsArg* arg ;
00144 while((arg=(RooAbsArg*)iter->Next())) {
00145
00146 RooRealVar* rrv = dynamic_cast<RooRealVar*>(arg) ;
00147 if (!rrv) {
00148 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::sampleSumUniform() ERROR: input parameter " << arg->GetName() << " is not a RooRealVar and is ignored" << endl ;
00149 continue;
00150 }
00151 okset.add(*rrv) ;
00152 }
00153 delete iter ;
00154
00155
00156
00157 RooArgSet okset2 ;
00158 if (genParams()) {
00159 TIterator* psiter = okset.createIterator() ;
00160 RooAbsArg* arg2 ;
00161 while ((arg2=(RooAbsArg*)psiter->Next())) {
00162 RooRealVar* actualVar= static_cast<RooRealVar*>(genParams()->find(arg2->GetName())) ;
00163 if (!actualVar) {
00164 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::sampleSumUniform: variable " << arg2->GetName() << " is not a parameter of RooMCStudy model and is ignored!" << endl ;
00165 } else {
00166 okset2.add(*actualVar) ;
00167 }
00168 }
00169 delete psiter ;
00170 } else {
00171
00172
00173 okset2.add(okset) ;
00174
00175 }
00176
00177
00178 _unifParamSets.push_back(UniParamSet(okset2,lo,hi)) ;
00179
00180 }
00181
00182
00183
00184
00185
00186 void RooRandomizeParamMCSModule::sampleSumGauss(const RooArgSet& paramSet, Double_t mean, Double_t sigma)
00187 {
00188
00189
00190
00191
00192
00193
00194
00195
00196 RooArgSet okset ;
00197 TIterator* iter = paramSet.createIterator() ;
00198 RooAbsArg* arg ;
00199 while((arg=(RooAbsArg*)iter->Next())) {
00200
00201 RooRealVar* rrv = dynamic_cast<RooRealVar*>(arg) ;
00202 if (!rrv) {
00203 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::sampleSumGauss() ERROR: input parameter " << arg->GetName() << " is not a RooRealVar and is ignored" << endl ;
00204 continue;
00205 }
00206 okset.add(*rrv) ;
00207 }
00208
00209
00210
00211 RooArgSet okset2 ;
00212 if (genParams()) {
00213 TIterator* psiter = okset.createIterator() ;
00214 RooAbsArg* arg2 ;
00215 while ((arg2=(RooAbsArg*)psiter->Next())) {
00216 RooRealVar* actualVar= static_cast<RooRealVar*>(genParams()->find(arg2->GetName())) ;
00217 if (!actualVar) {
00218 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::sampleSumUniform: variable " << arg2->GetName() << " is not a parameter of RooMCStudy model and is ignored!" << endl ;
00219 } else {
00220 okset2.add(*actualVar) ;
00221 }
00222 }
00223 delete psiter ;
00224 } else {
00225
00226
00227 okset2.add(okset) ;
00228
00229 }
00230
00231 _gausParamSets.push_back(GausParamSet(okset,mean,sigma)) ;
00232
00233 }
00234
00235
00236
00237
00238
00239 Bool_t RooRandomizeParamMCSModule::initializeInstance()
00240 {
00241
00242
00243
00244 std::list<UniParam>::iterator uiter ;
00245 for (uiter= _unifParams.begin() ; uiter!= _unifParams.end() ; ++uiter) {
00246
00247
00248 RooRealVar* actualPar = static_cast<RooRealVar*>(genParams()->find(uiter->_param->GetName())) ;
00249 if (!actualPar) {
00250 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::initializeInstance: variable " << uiter->_param->GetName() << " is not a parameter of RooMCStudy model and is ignored!" << endl ;
00251 uiter = _unifParams.erase(uiter) ;
00252 continue ;
00253 }
00254 uiter->_param = actualPar ;
00255
00256
00257 TString parName = Form("%s_gen",uiter->_param->GetName()) ;
00258 TString parTitle = Form("%s as generated",uiter->_param->GetTitle()) ;
00259 RooRealVar* par_gen = new RooRealVar(parName.Data(),parTitle.Data(),0) ;
00260 _genParSet.addOwned(*par_gen) ;
00261 }
00262
00263
00264 std::list<UniParam>::iterator giter ;
00265 for (giter= _unifParams.begin() ; giter!= _unifParams.end() ; ++giter) {
00266
00267
00268 RooRealVar* actualPar = static_cast<RooRealVar*>(genParams()->find(giter->_param->GetName())) ;
00269 if (!actualPar) {
00270 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::initializeInstance: variable " << giter->_param->GetName() << " is not a parameter of RooMCStudy model and is ignored!" << endl ;
00271 giter = _unifParams.erase(giter) ;
00272 continue ;
00273 }
00274 giter->_param = actualPar ;
00275
00276
00277 TString parName = Form("%s_gen",giter->_param->GetName()) ;
00278 TString parTitle = Form("%s as generated",giter->_param->GetTitle()) ;
00279 RooRealVar* par_gen = new RooRealVar(parName.Data(),parTitle.Data(),0) ;
00280 _genParSet.addOwned(*par_gen) ;
00281 }
00282
00283
00284
00285 std::list<UniParamSet>::iterator usiter ;
00286 for (usiter= _unifParamSets.begin() ; usiter!= _unifParamSets.end() ; ++usiter) {
00287
00288
00289 RooArgSet actualPSet ;
00290 TIterator* psiter = usiter->_pset.createIterator() ;
00291 RooAbsArg* arg ;
00292 while ((arg=(RooAbsArg*)psiter->Next())) {
00293 RooRealVar* actualVar= static_cast<RooRealVar*>(genParams()->find(arg->GetName())) ;
00294 if (!actualVar) {
00295 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::initializeInstance: variable " << arg->GetName() << " is not a parameter of RooMCStudy model and is ignored!" << endl ;
00296 } else {
00297 actualPSet.add(*actualVar) ;
00298 }
00299 }
00300 delete psiter ;
00301 usiter->_pset.removeAll() ;
00302 usiter->_pset.add(actualPSet) ;
00303
00304
00305 TIterator* iter = usiter->_pset.createIterator() ;
00306 RooRealVar* param ;
00307 while((param=(RooRealVar*)iter->Next())) {
00308 TString parName = Form("%s_gen",param->GetName()) ;
00309 TString parTitle = Form("%s as generated",param->GetTitle()) ;
00310 RooRealVar* par_gen = new RooRealVar(parName.Data(),parTitle.Data(),0) ;
00311 _genParSet.addOwned(*par_gen) ;
00312 }
00313 delete iter ;
00314 }
00315
00316
00317 std::list<GausParamSet>::iterator ugiter ;
00318 for (ugiter= _gausParamSets.begin() ; ugiter!= _gausParamSets.end() ; ++ugiter) {
00319
00320
00321 RooArgSet actualPSet ;
00322 TIterator* psiter = ugiter->_pset.createIterator() ;
00323 RooAbsArg* arg ;
00324 while ((arg=(RooAbsArg*)psiter->Next())) {
00325 RooRealVar* actualVar= static_cast<RooRealVar*>(genParams()->find(arg->GetName())) ;
00326 if (!actualVar) {
00327 oocoutW((TObject*)0,InputArguments) << "RooRandomizeParamMCSModule::initializeInstance: variable " << arg->GetName() << " is not a parameter of RooMCStudy model and is ignored!" << endl ;
00328 } else {
00329 actualPSet.add(*actualVar) ;
00330 }
00331 }
00332 ugiter->_pset.removeAll() ;
00333 ugiter->_pset.add(actualPSet) ;
00334
00335
00336 TIterator* iter = ugiter->_pset.createIterator() ;
00337 RooRealVar* param ;
00338 while((param=(RooRealVar*)iter->Next())) {
00339 TString parName = Form("%s_gen",param->GetName()) ;
00340 TString parTitle = Form("%s as generated",param->GetTitle()) ;
00341 RooRealVar* par_gen = new RooRealVar(parName.Data(),parTitle.Data(),0) ;
00342 _genParSet.addOwned(*par_gen) ;
00343 }
00344 }
00345
00346
00347 _data = new RooDataSet("DeltaLLSigData","Additional data for Delta(-log(L)) study",_genParSet) ;
00348
00349 return kTRUE ;
00350 }
00351
00352
00353
00354
00355 Bool_t RooRandomizeParamMCSModule::initializeRun(Int_t )
00356 {
00357
00358
00359
00360 _data->reset() ;
00361 return kTRUE ;
00362 }
00363
00364
00365
00366
00367 Bool_t RooRandomizeParamMCSModule::processBeforeGen(Int_t )
00368 {
00369
00370
00371
00372 std::list<UniParam>::iterator uiter ;
00373 for (uiter= _unifParams.begin() ; uiter!= _unifParams.end() ; ++uiter) {
00374 Double_t newVal = RooRandom::randomGenerator()->Uniform(uiter->_lo,uiter->_hi) ;
00375 oocoutE((TObject*)0,Generation) << "RooRandomizeParamMCSModule::processBeforeGen: applying uniform smearing to generator parameter "
00376 << uiter->_param->GetName() << " in range [" << uiter->_lo << "," << uiter->_hi << "], chosen value for this sample is " << newVal << endl ;
00377 uiter->_param->setVal(newVal) ;
00378
00379 RooRealVar* genpar = static_cast<RooRealVar*>(_genParSet.find(Form("%s_gen",uiter->_param->GetName()))) ;
00380 genpar->setVal(newVal) ;
00381 }
00382
00383
00384 std::list<GausParam>::iterator giter ;
00385 for (giter= _gausParams.begin() ; giter!= _gausParams.end() ; ++giter) {
00386 Double_t newVal = RooRandom::randomGenerator()->Gaus(giter->_mean,giter->_sigma) ;
00387 oocoutI((TObject*)0,Generation) << "RooRandomizeParamMCSModule::processBeforeGen: applying gaussian smearing to generator parameter "
00388 << giter->_param->GetName() << " with a mean of " << giter->_mean << " and a width of " << giter->_sigma << ", chosen value for this sample is " << newVal << endl ;
00389 giter->_param->setVal(newVal) ;
00390
00391 RooRealVar* genpar = static_cast<RooRealVar*>(_genParSet.find(Form("%s_gen",giter->_param->GetName()))) ;
00392 genpar->setVal(newVal) ;
00393 }
00394
00395
00396 std::list<UniParamSet>::iterator usiter ;
00397 for (usiter= _unifParamSets.begin() ; usiter!= _unifParamSets.end() ; ++usiter) {
00398
00399
00400 Double_t newVal = RooRandom::randomGenerator()->Uniform(usiter->_lo,usiter->_hi) ;
00401 oocoutI((TObject*)0,Generation) << "RooRandomizeParamMCSModule::processBeforeGen: applying uniform smearing to sum of set of generator parameters "
00402 << usiter->_pset
00403 << " in range [" << usiter->_lo << "," << usiter->_hi << "], chosen sum value for this sample is " << newVal << endl ;
00404
00405
00406 RooAddition sumVal("sumVal","sumVal",usiter->_pset) ;
00407 Double_t compScaleFactor = newVal/sumVal.getVal() ;
00408
00409
00410 TIterator* iter = usiter->_pset.createIterator() ;
00411 RooRealVar* param ;
00412 while((param=(RooRealVar*)iter->Next())) {
00413 param->setVal(param->getVal()*compScaleFactor) ;
00414 RooRealVar* genpar = static_cast<RooRealVar*>(_genParSet.find(Form("%s_gen",param->GetName()))) ;
00415 genpar->setVal(param->getVal()) ;
00416 }
00417 delete iter ;
00418 }
00419
00420
00421 std::list<GausParamSet>::iterator gsiter ;
00422 for (gsiter= _gausParamSets.begin() ; gsiter!= _gausParamSets.end() ; ++gsiter) {
00423
00424
00425 Double_t newVal = RooRandom::randomGenerator()->Gaus(gsiter->_mean,gsiter->_sigma) ;
00426 oocoutI((TObject*)0,Generation) << "RooRandomizeParamMCSModule::processBeforeGen: applying gaussian smearing to sum of set of generator parameters "
00427 << gsiter->_pset
00428 << " with a mean of " << gsiter->_mean << " and a width of " << gsiter->_sigma
00429 << ", chosen value for this sample is " << newVal << endl ;
00430
00431
00432 RooAddition sumVal("sumVal","sumVal",gsiter->_pset) ;
00433 Double_t compScaleFactor = newVal/sumVal.getVal() ;
00434
00435
00436 TIterator* iter = gsiter->_pset.createIterator() ;
00437 RooRealVar* param ;
00438 while((param=(RooRealVar*)iter->Next())) {
00439 param->setVal(param->getVal()*compScaleFactor) ;
00440 RooRealVar* genpar = static_cast<RooRealVar*>(_genParSet.find(Form("%s_gen",param->GetName()))) ;
00441 genpar->setVal(param->getVal()) ;
00442 }
00443 }
00444
00445
00446 _data->add(_genParSet) ;
00447
00448 return kTRUE ;
00449 }
00450
00451
00452
00453
00454 RooDataSet* RooRandomizeParamMCSModule::finalizeRun()
00455 {
00456
00457
00458 return _data ;
00459 }
00460
00461