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