39 namespace HistFactory {
42 vector< pair<std::string, std::string> >
get_comb(vector<std::string> names){
43 vector< pair<std::string, std::string> > list;
44 for(vector<std::string>::iterator itr=names.begin(); itr!=names.end(); ++itr){
45 vector<std::string>::iterator itr2=itr;
46 for(itr2++; itr2!=names.end(); ++itr2){
47 list.push_back(pair<std::string, std::string>(*itr, *itr2));
54 outFile->ShowStreamerInfo();
56 vector<EstimateSummary>* summaries =
new vector<EstimateSummary>;
57 outFile->cd(channel.c_str());
65 cout <<
"was able to read summary with name " << summary->name << std::endl;
66 cout <<
" nominal hist = " << summary->nominal << std::endl;
68 cout <<
" hist name = " << summary->nominal->GetName() <<endl;
69 cout <<
"still ok" << std::endl;
71 summaries->push_back(*summary);
83 void saveInputs(TFile* outFile, std::string channel, vector<EstimateSummary> summaries){
84 vector<EstimateSummary>::iterator it = summaries.begin();
85 vector<EstimateSummary>::iterator end = summaries.end();
86 vector<TH1*>::iterator histIt;
87 vector<TH1*>::iterator histEnd;
88 outFile->mkdir(channel.c_str());
91 if(channel != it->channel){
92 cout <<
"channel mismatch" << std::endl;
95 outFile->cd(channel.c_str());
103 it->nominal->Write();
105 histIt = it->lowHists.begin();
106 histEnd = it->lowHists.end();
107 for(; histIt!=histEnd; ++histIt)
110 histIt = it->highHists.begin();
111 histEnd = it->highHists.end();
112 for(; histIt!=histEnd; ++histIt)
121 if(!inFile || name.empty()){
122 cerr <<
"Not all necessary info are set to access the input file. Check your config" << std::endl;
123 cerr <<
"fileptr: " << inFile
124 <<
"path/obj: " << name << std::endl;
128 cout <<
"Retrieving " <<
name ;
130 TH1 * ptr = (
TH1 *) (inFile->Get( name.c_str() )->Clone());
132 cout <<
" found at " << ptr <<
" with integral " << ptr->
Integral() <<
" and mean " << ptr->
GetMean() << std::endl;
140 TH1 *
GetHisto(
const std::string
file,
const std::string path,
const std::string obj){
143 cout <<
"Retrieving " << file <<
":" << path << obj ;
146 TFile inFile(file.c_str());
147 TH1 * ptr = (
TH1 *) (inFile.Get( (path+obj).c_str() )->Clone());
150 cout <<
" found at " << ptr <<
" with integral " << ptr->
Integral()
151 <<
" and mean " << ptr->GetMean() << std::endl;
156 cerr <<
"Not all necessary info are set to access the input file. Check your config" 158 cerr <<
"filename: " << file
160 <<
"obj: " << obj << std::endl;
163 ptr->SetDirectory(0);
170 const std::string delims(
"\\ ");
171 std::string::size_type begIdx, endIdx;
172 begIdx=s.find_first_not_of(delims);
173 while(begIdx!=string::npos){
174 endIdx=s.find_first_of(delims, begIdx);
175 if(endIdx==string::npos) endIdx=s.length();
176 vs.push_back(s.substr(begIdx,endIdx-begIdx));
177 begIdx=s.find_first_not_of(delims, endIdx);
185 std::vector<std::string> child_vec;
187 const std::string delims(
"\\ ");
188 std::string::size_type begIdx, endIdx;
189 begIdx=str.find_first_not_of(delims);
190 while(begIdx!=string::npos){
191 endIdx=str.find_first_of(delims, begIdx);
192 if(endIdx==string::npos) endIdx=str.length();
193 std::string child_name = str.substr(begIdx,endIdx-begIdx);
194 child_vec.push_back(child_name);
195 begIdx=str.find_first_not_of(delims, endIdx);
212 std::map<std::string, double> param_map;
214 for(
unsigned int i=0; i < string_list.size(); ++i) {
216 std::string param = string_list.at(i);
218 size_t eql_location = param.find(
"=");
222 if( eql_location==string::npos ) {
227 std::string param_name = param.substr(0,eql_location);
228 double param_val = atof( param.substr(eql_location+1, param.size()).c_str() );
230 std::cout <<
"ASIMOV - Param Name: " << param_name
231 <<
" Param Val: " << param_val << std::endl;
268 std::vector<EstimateSummary> channel_estimateSummary;
270 std::cout <<
"Processing data: " << std::endl;
274 data_es.
name =
"Data";
277 if( data_hist !=
NULL ) {
280 channel_estimateSummary.push_back( data_es );
284 for(
unsigned int sampleItr = 0; sampleItr < channel.
GetSamples().size(); ++sampleItr ) {
289 std::cout <<
"Processing sample: " << sample.
GetName() << std::endl;
296 std::cout <<
"Checking NormalizeByTheory" << std::endl;
303 lumiStr += measurement.
GetLumi();
304 lumiStr.ReplaceAll(
' ', TString());
308 std::cout <<
"Setting the Histo Systs" << std::endl;
311 for(
unsigned int histoItr = 0; histoItr < sample.
GetHistoSysList().size(); ++histoItr ) {
321 std::cout <<
"Setting the NormFactors" << std::endl;
323 for(
unsigned int normItr = 0; normItr < sample.
GetNormFactorList().size(); ++normItr ) {
334 sample_es.
normFactor.push_back( normFactor_es );
338 std::cout <<
"Setting the OverallSysList" << std::endl;
340 for(
unsigned int sysItr = 0; sysItr < sample.
GetOverallSysList().size(); ++sysItr ) {
344 std::pair<double, double> DownUpPair( overallSys.
GetLow(), overallSys.
GetHigh() );
349 std::cout <<
"Checking Stat Errors" << std::endl;
371 std::cout <<
"Using Gaussian StatErrors" << std::endl;
375 std::cout <<
"Using Poisson StatErrors" << std::endl;
380 std::cout <<
"Getting the shape Factor" << std::endl;
387 std::cout <<
"Error: Only One Shape Factor currently supported" << std::endl;
392 std::cout <<
"Setting the ShapeSysts" << std::endl;
395 for(
unsigned int shapeItr=0; shapeItr < sample.
GetShapeSysList().size(); ++shapeItr ) {
416 sample_es.
shapeSysts.push_back( shapeSys_es );
420 std::cout <<
"Adding this sample" << std::endl;
423 channel_estimateSummary.push_back( sample_es );
427 return channel_estimateSummary;
478 // mcInWs -> The ModelCofig for this likelihood
479 // doConditional -> Minimize parameters for asimov quantities
480 // b_only -> Make the 'background only' asimov dataset, ie mu=0 (set muVal = 0)
481 // doNuisPro -> Set all nuisance parameters to '0' and to constant
482 // before minimizing. This should be done with *care*!!
483 // i.e. It should probably be removed as an option.
484 // signalInjection -> If true, then do the following:
485 // Perform the fit with m=0
486 // After the fit, set the value to mu=muVal
487 // so that the asimov is created with that value of mu fixed
488 // doMuHat -> Set 'mu' to be float during the fit (in the range -10 to 100)
489 // Even if it floats in the fit, it is still set to
490 // 'muVal' before the dataset is made (so the only difference
491 // comes from the other parameters that can float simultaneously with mu
494 // double doMuHat = false
495 // double muVal = -999,
496 // bool signalInjection = false
497 // bool doNuisPro = true
499 if( b_only ) muVal = 0.0;
503 // If using signal injection or a non-zero mu value,
504 // add a suffix showing that value
505 std::stringstream muStr;
506 if(signalInjection || !b_only) {
507 muStr << "_" << muVal;
510 // Create the name of the resulting dataset
511 std::string dataSetName;
512 if(signalInjection) dataSetName = "signalInjection" + muStr.str();
513 else dataSetName = "asimovData" + muStr.str();
515 // Set the parameter of interest
516 // to the 'background' value
517 RooRealVar* mu = (RooRealVar*) mcInWs->GetParametersOfInterest()->first();
519 std::cout << "Asimov: Setting " << mu->GetName() << " value to 0 for fit" << std::endl;
523 std::cout << "Asimov: Setting " << mu->GetName() << " value to " << muVal << " for fit" << std::endl;
527 // Get necessary info from the ModelConfig
528 RooArgSet mc_obs = *mcInWs->GetObservables();
529 RooArgSet mc_globs = *mcInWs->GetGlobalObservables();
530 RooArgSet mc_nuis = *mcInWs->GetNuisanceParameters();
532 // Create a set of constraint terms, which
533 // is stored in 'constraint_set'
534 // Make some temporary variables and use the
535 // unfoldConstrants function to do this.
536 RooArgSet constraint_set;
538 RooArgSet mc_nuis_tmp = mc_nuis;
539 RooArgSet constraint_set_tmp(*combPdf->getAllConstraints(mc_obs, mc_nuis_tmp, false));
540 unfoldConstraints(constraint_set_tmp, constraint_set, mc_obs, mc_nuis_tmp, counter_tmp);
542 // Now that we have the constraint terms, we
543 // can create the full lists of nuisance parameters
544 // and global variables
545 RooArgList nui_list("ordered_nuis");
546 RooArgList glob_list("ordered_globs");
548 TIterator* cIter = constraint_set.createIterator();
550 while ((arg = (RooAbsArg*)cIter->Next())) {
551 RooAbsPdf* pdf = (RooAbsPdf*) arg;
554 TIterator* nIter = mc_nuis.createIterator();
555 RooRealVar* thisNui = NULL;
557 while((nui_arg = (RooAbsArg*)nIter->Next())) {
558 if(pdf->dependsOn(*nui_arg)) {
559 thisNui = (RooRealVar*) nui_arg;
565 // need this in case the observable isn't fundamental.
566 // in this case, see which variable is dependent on the nuisance parameter and use that.
567 RooArgSet* components = pdf->getComponents();
568 components->remove(*pdf);
569 if(components->getSize()) {
570 TIterator* itr1 = components->createIterator();
572 while ((arg1 = (RooAbsArg*)itr1->Next())) {
573 TIterator* itr2 = components->createIterator();
575 while ((arg2 = (RooAbsArg*)itr2->Next())) {
576 if(arg1 == arg2) continue;
577 if(arg2->dependsOn(*arg1)) {
578 components->remove(*arg1);
585 if (components->getSize() > 1) {
586 std::cout << "ERROR::Couldn't isolate proper nuisance parameter" << std::endl;
589 else if (components->getSize() == 1) {
590 thisNui = (RooRealVar*)components->first();
593 TIterator* gIter = mc_globs.createIterator();
594 RooRealVar* thisGlob = NULL;
596 while ((glob_arg = (RooAbsArg*)gIter->Next()))
598 if (pdf->dependsOn(*glob_arg))
600 thisGlob = (RooRealVar*)glob_arg;
606 if (!thisNui || !thisGlob)
608 std::cout << "WARNING::Couldn't find nui or glob for constraint: " << pdf->GetName() << std::endl;
612 if (_printLevel >= 1) std::cout << "Pairing nui: " << thisNui->GetName() << ", with glob: " << thisGlob->GetName() << ", from constraint: " << pdf->GetName() << std::endl;
614 nui_list.add(*thisNui);
615 glob_list.add(*thisGlob);
617 } // End Loop over Constraint Terms
620 //save the snapshots of nominal parameters
621 combWS->saveSnapshot("nominalGlobs",glob_list);
622 combWS->saveSnapshot("nominalNuis", nui_list);
624 RooArgSet nuiSet_tmp(nui_list);
626 // Interesting line here:
628 std::cout << "Asimov: Setting mu constant in fit" << std::endl;
629 mu->setConstant(true);
632 std::cout << "Asimov: Letting mu float in fit (muHat)" << std::endl;
633 mu->setRange(-10,100);
636 // Conditional: "Minimize the parameters"
639 std::cout << "Starting minimization.." << std::endl;
641 // Consider removing this option:
643 std::cout << "Asimov: Setting nuisance parameters constant in the fit (ARE YOU SURE YOU WANT THIS)" << std::endl;
644 TIterator* nIter = nuiSet_tmp.createIterator();
645 RooRealVar* thisNui = NULL;
646 while((thisNui = (RooRealVar*) nIter->Next())) {
648 thisNui->setConstant();
651 // This should be checked, we don't want to
652 if(combWS->var("Lumi")) {
653 combWS->var("Lumi")->setVal(1);
654 combWS->var("Lumi")->setConstant();
658 // Create the nll and its minimizer
659 RooAbsReal* nll = combPdf->createNLL(*combData, RooFit::Constrain(nuiSet_tmp));
660 RooMinimizer minim(*nll);
661 minim.setStrategy(2);
662 minim.setPrintLevel(999);
664 // Do the minimization
665 std::cout << "Minimizing to make Asimov dataset:" << std::endl;
666 int status = minim.minimize(ROOT::Math::MinimizerOptions::DefaultMinimizerType().c_str(), "migrad");
668 // status==0 means fit was successful
669 std::cout << "Successfully minimized to make Asimov dataset:" << std::endl;
670 RooFitResult* fit_result = minim.lastMinuitFit();
671 std::cout << "Asimov: Final Fitted Parameters" << std::endl;
672 fit_result->Print("V");
674 std::cout << "Fit failed for mu = " << mu->getVal() << " with status " << status << std::endl;
675 std::cout << "Trying minuit..." << std::endl;
676 status = minim.minimize("Minuit", "migrad");
678 cout << "Fit failed for mu = " << mu->getVal() << " with status " << status << std::endl;
683 // Undo the 'doNuisPro' part
684 // Again, may want to remove this
686 TIterator* nIter = nuiSet_tmp.createIterator();
687 RooRealVar* thisNui = NULL;
688 while ((thisNui = (RooRealVar*)nIter->Next())) {
689 thisNui->setConstant(false);
692 if (combWS->var("Lumi")) {
693 combWS->var("Lumi")->setConstant(false);
697 std::cout << "Done" << std::endl;
698 } // END: DoConditional
700 mu->setConstant(false);
702 //loop over the nui/glob list, grab the corresponding variable from the tmp ws,
703 // and set the glob to the value of the nui
704 int nrNuis = nui_list.getSize();
705 if (nrNuis != glob_list.getSize()) {
706 std::cout << "ERROR::nui_list.getSize() != glob_list.getSize()!" << std::endl;
710 for(int i=0; i<nrNuis; i++) {
711 RooRealVar* nui = (RooRealVar*) nui_list.at(i);
712 RooRealVar* glob = (RooRealVar*) glob_list.at(i);
714 if (_printLevel >= 1) std::cout << "nui: " << nui << ", glob: " << glob << std::endl;
715 if (_printLevel >= 1) std::cout << "Setting glob: " << glob->GetName() << ", which had previous val: " << glob->getVal() << ", to conditional val: " << nui->getVal() << std::endl;
717 glob->setVal(nui->getVal());
720 //save the snapshots of conditional parameters
721 //cout << "Saving conditional snapshots" << std::endl;
722 combWS->saveSnapshot(("conditionalGlobs"+muStr.str()).c_str(),glob_list);
723 combWS->saveSnapshot(("conditionalNuis" +muStr.str()).c_str(), nui_list);
726 combWS->loadSnapshot("nominalGlobs");
727 combWS->loadSnapshot("nominalNuis");
730 //cout << "Making asimov" << std::endl;
731 //make the asimov data (snipped from Kyle)
733 // Restore the value of mu to the target value
736 ModelConfig* mc = mcInWs;
740 const char* weightName = "weightVar";
741 RooArgSet obsAndWeight;
742 obsAndWeight.add(*mc->GetObservables());
744 // Get the weightVar, or create one if necessary
745 RooRealVar* weightVar = combWS->var(weightName); // NULL;
746 // if (!(weightVar = combWS->var(weightName)))
747 if( weightVar==NULL ) {
748 combWS->import(*(new RooRealVar(weightName, weightName, 1,0,1000)));
749 weightVar = combWS->var(weightName);
751 if (_printLevel >= 1) std::cout << "weightVar: " << weightVar << std::endl;
752 obsAndWeight.add(*combWS->var(weightName));
759 // MAKE ASIMOV DATA FOR OBSERVABLES
761 // dummy var can just have one bin since it's a dummy
762 if(combWS->var("ATLAS_dummyX")) combWS->var("ATLAS_dummyX")->setBins(1);
764 if (_printLevel >= 1) std::cout << " check expectedData by category" << std::endl;
765 RooSimultaneous* simPdf = dynamic_cast<RooSimultaneous*>(mc->GetPdf());
767 // Create the pointer to be returned
768 RooDataSet* asimovData=NULL;
770 // If the pdf isn't simultaneous:
773 // Get pdf associated with state from simpdf
774 RooAbsPdf* pdftmp = mc->GetPdf();//simPdf->getPdf(channelCat->getLabel()) ;
776 // Generate observables defined by the pdf associated with this state
777 RooArgSet* obstmp = pdftmp->getObservables(*mc->GetObservables()) ;
779 if (_printLevel >= 1) {
784 asimovData = new RooDataSet(dataSetName.c_str(), dataSetName.c_str(),
785 RooArgSet(obsAndWeight), RooFit::WeightVar(*weightVar));
787 RooRealVar* thisObs = ((RooRealVar*)obstmp->first());
788 double expectedEvents = pdftmp->expectedEvents(*obstmp);
790 for(int jj=0; jj<thisObs->numBins(); ++jj){
793 thisNorm=pdftmp->getVal(obstmp)*thisObs->getBinWidth(jj);
794 if (thisNorm*expectedEvents <= 0)
796 cout << "WARNING::Detected bin with zero expected events (" << thisNorm*expectedEvents << ") ! Please check your inputs. Obs = " << thisObs->GetName() << ", bin = " << jj << std::endl;
798 if (thisNorm*expectedEvents > 0 && thisNorm*expectedEvents < pow(10.0, 18)) asimovData->add(*mc->GetObservables(), thisNorm*expectedEvents);
801 if (_printLevel >= 1)
804 std::cout <<"sum entries "<<asimovData->sumEntries()<<endl;
806 if(asimovData->sumEntries()!=asimovData->sumEntries()){
807 std::cout << "sum entries is nan"<<endl;
811 // don't import, return (of course)
812 //combWS->import(*asimovData);
817 // If it IS a simultaneous pdf
819 std::cout << "found a simPdf: " << simPdf << std::endl;
820 map<std::string, RooDataSet*> asimovDataMap;
822 RooCategory* channelCat = (RooCategory*)&simPdf->indexCat();
823 TIterator* iter = channelCat->typeIterator() ;
824 RooCatType* tt = NULL;
826 while((tt=(RooCatType*) iter->Next())) {
830 for (int i=0;i<nrIndices;i++){
832 channelCat->setIndex(i);
834 std::cout << "Checking channel: " << channelCat->getLabel() << std::endl;
836 // Get pdf associated with state from simpdf
837 RooAbsPdf* pdftmp = simPdf->getPdf(channelCat->getLabel()) ;
839 // Generate observables defined by the pdf associated with this state
840 RooArgSet* obstmp = pdftmp->getObservables(*mc->GetObservables()) ;
842 if (_printLevel >= 1) {
844 cout << "on type " << channelCat->getLabel() << " " << iFrame << std::endl;
847 RooDataSet* obsDataUnbinned = new RooDataSet(Form("combAsimovData%d",iFrame),Form("combAsimovData%d",iFrame),
848 RooArgSet(obsAndWeight,*channelCat), RooFit::WeightVar(*weightVar));
849 RooRealVar* thisObs = ((RooRealVar*)obstmp->first());
850 double expectedEvents = pdftmp->expectedEvents(*obstmp);
852 TString pdftmp_name = pdftmp->GetName();
854 if (!expectedEvents) {
855 std::cout << "Not expected events" << std::endl;
856 if (pdftmp_name == "model_E")
857 ((RooRealVar*)obstmp->first())->setVal(combWS->function("p_e")->getVal());
859 else if (pdftmp_name == "model_MU")
860 ((RooRealVar*)obstmp->first())->setVal(combWS->function("p_mu")->getVal());
862 else if ((pdftmp_name == "model_ratio_ELMU") || (pdftmp_name == "model_comb")) {
863 //((RooRealVar*)obstmp->first())->setVal(combWS->function("p_comb")->getVal());
864 double p_asimov_val = combWS->var("p_asimov")->getVal();
865 std::cout << "p_asimov val: " << p_asimov_val << std::endl;
866 ((RooRealVar*)obstmp->first())->setVal(combWS->var("p_asimov")->getVal());
870 std::cout << "Failed to set asimov data for non-extended pdf" << std::endl;
873 obsDataUnbinned->add(*mc->GetObservables());
877 std::cout << "expected events" << std::endl;
878 for(int jj=0; jj<thisObs->numBins(); ++jj){
881 thisNorm=pdftmp->getVal(obstmp)*thisObs->getBinWidth(jj);
882 if (thisNorm*expectedEvents <= 0)
884 std::cout << "WARNING::Detected bin with zero expected events (" << thisNorm*expectedEvents << ") ! Please check your inputs. Obs = " << thisObs->GetName() << ", bin = " << jj << std::endl;
886 if (thisNorm*expectedEvents > pow(10.0, -9) && thisNorm*expectedEvents < pow(10.0, 9)) obsDataUnbinned->add(*mc->GetObservables(), thisNorm*expectedEvents);
890 if (_printLevel >= 1)
892 obsDataUnbinned->Print();
893 std::cout <<"sum entries "<<obsDataUnbinned->sumEntries()<<endl;
895 if(obsDataUnbinned->sumEntries()!=obsDataUnbinned->sumEntries()){
896 cout << "sum entries is nan"<<endl;
900 asimovDataMap[string(channelCat->getLabel())] = obsDataUnbinned;//tempData;
902 if (_printLevel >= 1)
904 std::cout << "channel: " << channelCat->getLabel() << ", data: ";
905 obsDataUnbinned->Print();
906 std::cout << std::endl;
910 channelCat->setIndex(0);
912 asimovData = new RooDataSet(dataSetName.c_str(),dataSetName.c_str(),
913 RooArgSet(obsAndWeight,*channelCat), RooFit::Index(*channelCat),
914 RooFit::Import(asimovDataMap), RooFit::WeightVar(*weightVar));
916 // Don't import, return (of course)
917 //combWS->import(*asimovData);
918 } // End if over simultaneous pdf
920 combWS->loadSnapshot("nominalNuis");
921 combWS->loadSnapshot("nominalGlobs");
void saveInputs(TFile *outFile, std::string channel, vector< EstimateSummary > summaries)
void SetFixedParam(const std::string ¶m, bool constant=true)
ConstraintType constraint
RooStats::HistFactory::StatError & GetStatError()
std::string GetChannelName()
std::vector< RooStats::HistFactory::EstimateSummary > GetChannelEstimateSummaries(RooStats::HistFactory::Measurement &measurement, RooStats::HistFactory::Channel &channel)
std::vector< RooStats::HistFactory::NormFactor > & GetNormFactorList()
vector< EstimateSummary > * loadSavedInputs(TFile *outFile, std::string channel)
virtual void SetDirectory(TDirectory *dir)
By default when an histogram is created, it is added to the list of histogram objects in the current ...
std::vector< TH1 * > lowHists
void AddParamsToAsimov(RooStats::HistFactory::Asimov &asimov, std::string str)
Constraint::Type GetConstraintType()
virtual Double_t Integral(Option_t *option="") const
Return integral of bin contents.
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
bool GetNormalizeByTheory()
void AddSubStrings(vector< std::string > &vs, std::string s)
std::string shapeFactorName
void Print(const char *opt=0) const
This method must be overridden when a class wants to print itself.
std::vector< RooStats::HistFactory::HistoSys > & GetHistoSysList()
std::map< std::string, std::pair< double, double > > overallSyst
ConstraintType StatConstraintType
double GetRelErrorThreshold()
std::vector< TH1 * > highHists
vector< pair< std::string, std::string > > get_comb(vector< std::string > names)
void SetParamValue(const std::string ¶m, double value)
std::vector< ShapeSys > shapeSysts
std::vector< RooStats::HistFactory::ShapeSys > & GetShapeSysList()
std::vector< std::string > systSourceForHist
std::vector< RooStats::HistFactory::OverallSys > & GetOverallSysList()
Namespace for the RooStats classes.
HistFactory::StatErrorConfig & GetStatErrorConfig()
Constraint::Type GetConstraintType()
std::vector< RooStats::HistFactory::Sample > & GetSamples()
std::vector< NormFactor > normFactor
TH1 * GetHisto(const std::string file, const std::string path, const std::string obj)
TObject * Clone(const char *newname=0) const
Make a complete copy of the underlying object.
Double_t RelErrorThreshold
RooStats::HistFactory::Data & GetData()
std::vector< std::string > GetChildrenFromString(std::string str)
std::vector< RooStats::HistFactory::ShapeFactor > & GetShapeFactorList()