27 ClassImp(RooStats::HistFactory::HistFactoryNavigation);
31 namespace HistFactory {
35 HistFactoryNavigation::HistFactoryNavigation(ModelConfig* mc)
36 : _minBinToPrint(-1), _maxBinToPrint(-1),
37 _label_print_width(20), _bin_print_width(12) {
40 std::cout <<
"Error: The supplied ModelConfig is NULL " << std::endl;
45 RooAbsPdf* pdf_in_mc = mc->GetPdf();
47 std::cout <<
"Error: The pdf found in the ModelConfig: " << mc->GetName()
48 <<
" is NULL" << std::endl;
53 fModel = mc->GetPdf();
56 RooArgSet* observables_in_mc =
const_cast<RooArgSet*
>(mc->GetObservables());
57 if( !observables_in_mc ) {
58 std::cout <<
"Error: Observable set in the ModelConfig: " << mc->GetName()
59 <<
" is NULL" << std::endl;
62 if( observables_in_mc->getSize() == 0 ) {
63 std::cout <<
"Error: Observable list: " << observables_in_mc->GetName()
64 <<
" found in ModelConfig: " << mc->GetName()
65 <<
" has no entries." << std::endl;
70 fObservables = observables_in_mc;
73 _GetNodes(fModel, fObservables);
79 HistFactoryNavigation::HistFactoryNavigation(
const std::string& FileName,
80 const std::string& WorkspaceName,
81 const std::string& ModelConfigName) :
82 _minBinToPrint(-1), _maxBinToPrint(-1),
83 _label_print_width(20), _bin_print_width(12) {
86 TFile* file =
new TFile(FileName.c_str());
88 std::cout <<
"Error: Failed to open file: " << FileName << std::endl;
93 RooWorkspace* wspace = (RooWorkspace*) file->Get(WorkspaceName.c_str());
95 std::cout <<
"Error: Failed to get workspace: " << WorkspaceName
96 <<
" from file: " << FileName << std::endl;
101 ModelConfig* mc = (ModelConfig*) wspace->obj(ModelConfigName.c_str());
103 std::cout <<
"Error: Failed to find ModelConfig: " << ModelConfigName
104 <<
" from workspace: " << WorkspaceName
105 <<
" in file: " << FileName << std::endl;
110 RooAbsPdf* pdf_in_mc = mc->GetPdf();
112 std::cout <<
"Error: The pdf found in the ModelConfig: " << ModelConfigName
113 <<
" is NULL" << std::endl;
121 RooArgSet* observables_in_mc =
const_cast<RooArgSet*
>(mc->GetObservables());
122 if( !observables_in_mc ) {
123 std::cout <<
"Error: Observable set in the ModelConfig: " << ModelConfigName
124 <<
" is NULL" << std::endl;
127 if( observables_in_mc->getSize() == 0 ) {
128 std::cout <<
"Error: Observable list: " << observables_in_mc->GetName()
129 <<
" found in ModelConfig: " << ModelConfigName
130 <<
" in file: " << FileName
131 <<
" has no entries." << std::endl;
136 fObservables = observables_in_mc;
139 _GetNodes(fModel, fObservables);
145 HistFactoryNavigation::HistFactoryNavigation(RooAbsPdf* model, RooArgSet* observables) :
146 _minBinToPrint(-1), _maxBinToPrint(-1),
147 _label_print_width(20), _bin_print_width(12) {
151 std::cout <<
"Error: The supplied pdf is NULL" << std::endl;
157 fObservables = observables;
161 std::cout <<
"Error: Supplied Observable set is NULL" << std::endl;
164 if( observables->getSize() == 0 ) {
165 std::cout <<
"Error: Observable list: " << observables->GetName()
166 <<
" has no entries." << std::endl;
171 _GetNodes(fModel, fObservables);
176 void HistFactoryNavigation::PrintMultiDimHist(TH1* hist,
int bin_print_width) {
180 int num_bins = hist->GetNbinsX()*hist->GetNbinsY()*hist->GetNbinsZ();
181 for(
int i = 0; i < num_bins; ++i) {
184 while( hist->IsBinUnderflow(current_bin) ||
185 hist->IsBinOverflow(current_bin) ) {
189 if( _minBinToPrint != -1 && i < _minBinToPrint)
continue;
190 if( _maxBinToPrint != -1 && i > _maxBinToPrint)
break;
191 std::cout << std::setw(bin_print_width) << hist->GetBinContent(current_bin);
193 std::cout << std::endl;
199 RooAbsPdf* HistFactoryNavigation::GetChannelPdf(
const std::string& channel) {
201 std::map< std::string, RooAbsPdf* >::iterator itr;
202 itr = fChannelPdfMap.find(channel);
204 if( itr == fChannelPdfMap.end() ) {
205 std::cout <<
"Warning: Could not find channel: " << channel
206 <<
" in pdf: " << fModel->GetName() << std::endl;
210 RooAbsPdf* pdf = itr->second;
212 std::cout <<
"Warning: Pdf associated with channel: " << channel
213 <<
" is NULL" << std::endl;
221 void HistFactoryNavigation::PrintState(
const std::string& channel) {
225 std::cout << std::endl << channel <<
":" << std::endl;
228 std::map< std::string, RooAbsReal*> SampleFunctionMap = GetSampleFunctionMap(channel);
242 std::map< std::string, RooAbsReal*>::iterator itr = SampleFunctionMap.begin();
243 for( ; itr != SampleFunctionMap.end(); ++itr) {
245 std::string sample_name = itr->first;
246 std::string tmp_name = sample_name + channel +
"_pretty_tmp";
247 TH1* sample_hist = GetSampleHist(channel, sample_name, tmp_name);
248 num_bins = sample_hist->GetNbinsX()*sample_hist->GetNbinsY()*sample_hist->GetNbinsZ();
249 std::cout << std::setw(_label_print_width) << sample_name;
252 PrintMultiDimHist(sample_hist, _bin_print_width);
258 std::string line_break;
259 int high_bin = _maxBinToPrint==-1 ? num_bins : TMath::Min(_maxBinToPrint, (
int)num_bins);
260 int low_bin = _minBinToPrint==-1 ? 1 : _minBinToPrint;
261 int break_length = (high_bin - low_bin + 1) * _bin_print_width;
262 break_length += _label_print_width;
263 for(
int i = 0; i < break_length; ++i) {
266 std::cout << line_break << std::endl;
268 std::string tmp_name = channel +
"_pretty_tmp";
269 TH1* channel_hist = GetChannelHist(channel, tmp_name);
270 std::cout << std::setw(_label_print_width) <<
"TOTAL:";
273 PrintMultiDimHist(channel_hist, _bin_print_width);
281 void HistFactoryNavigation::PrintState() {
283 for(
unsigned int i = 0; i < fChannelNameVec.size(); ++i) {
284 PrintState(fChannelNameVec.at(i));
289 void HistFactoryNavigation::SetPrintWidths(
const std::string& channel) {
292 std::map< std::string, RooAbsReal*> SampleFunctionMap = GetSampleFunctionMap(channel);
295 for( std::map< std::string, RooAbsReal*>::iterator itr = SampleFunctionMap.begin();
296 itr != SampleFunctionMap.end(); ++itr) {
297 std::string sample_name = itr->first;
298 _label_print_width = TMath::Max(_label_print_width, (
int)sample_name.size()+2);
301 _label_print_width = TMath::Max( _label_print_width, (
int)channel.size() + 7);
305 void HistFactoryNavigation::PrintDataSet(RooDataSet* data,
306 const std::string& channel_to_print) {
326 for(
unsigned int i_chan=0; i_chan < fChannelNameVec.size(); ++i_chan) {
328 std::string channel_name = fChannelNameVec.at(i_chan);
331 if( channel_to_print !=
"" && channel_name != channel_to_print)
continue;
333 TH1* data_hist = GetDataHist(data, channel_name, channel_name+
"_tmp");
334 std::cout << std::setw(_label_print_width) << channel_name +
" (data)";
337 PrintMultiDimHist(data_hist, _bin_print_width);
343 void HistFactoryNavigation::PrintModelAndData(RooDataSet* data) {
348 for(
unsigned int i = 0; i < fChannelNameVec.size(); ++i) {
349 std::string channel = fChannelNameVec.at(i);
350 SetPrintWidths(channel);
352 PrintDataSet(data, channel);
355 std::cout << std::endl;
360 void HistFactoryNavigation::PrintParameters(
bool IncludeConstantParams) {
363 RooArgSet* params = fModel->getParameters(*fObservables);
365 std::cout << std::endl;
368 std::cout << std::setw(30) <<
"Parameter";
369 std::cout << std::setw(15) <<
"Value"
370 << std::setw(15) <<
"Error Low"
371 << std::setw(15) <<
"Error High"
375 TIterator* paramItr = params->createIterator();
376 RooRealVar* param = NULL;
377 while( (param=(RooRealVar*)paramItr->Next()) ) {
379 if( !IncludeConstantParams && param->isConstant() )
continue;
381 std::cout << std::setw(30) << param->GetName();
382 std::cout << std::setw(15) << param->getVal();
383 if( !param->isConstant() ) {
384 std::cout << std::setw(15) << param->getErrorLo() << std::setw(15) << param->getErrorHi();
386 std::cout<< std::endl;
389 std::cout << std::endl;
394 void HistFactoryNavigation::PrintChannelParameters(
const std::string& channel,
395 bool IncludeConstantParams) {
398 RooArgSet* params = fModel->getParameters(*fObservables);
401 RooAbsPdf* channel_pdf = GetChannelPdf(channel);
403 std::cout << std::endl;
406 std::cout << std::setw(30) <<
"Parameter";
407 std::cout << std::setw(15) <<
"Value"
408 << std::setw(15) <<
"Error Low"
409 << std::setw(15) <<
"Error High"
413 TIterator* paramItr = params->createIterator();
414 RooRealVar* param = NULL;
415 while( (param=(RooRealVar*)paramItr->Next()) ) {
417 if( !IncludeConstantParams && param->isConstant() )
continue;
419 if( findChild(param->GetName(), channel_pdf)==NULL )
continue;
421 std::cout << std::setw(30) << param->GetName();
422 std::cout << std::setw(15) << param->getVal();
423 if( !param->isConstant() ) {
424 std::cout << std::setw(15) << param->getErrorLo() << std::setw(15) << param->getErrorHi();
426 std::cout<< std::endl;
429 std::cout << std::endl;
435 void HistFactoryNavigation::PrintSampleParameters(
const std::string& channel,
436 const std::string& sample,
437 bool IncludeConstantParams) {
440 RooArgSet* params = fModel->getParameters(*fObservables);
443 RooAbsReal* sample_func = SampleFunction(channel, sample);
445 std::cout << std::endl;
448 std::cout << std::setw(30) <<
"Parameter";
449 std::cout << std::setw(15) <<
"Value"
450 << std::setw(15) <<
"Error Low"
451 << std::setw(15) <<
"Error High"
455 TIterator* paramItr = params->createIterator();
456 RooRealVar* param = NULL;
457 while( (param=(RooRealVar*)paramItr->Next()) ) {
459 if( !IncludeConstantParams && param->isConstant() )
continue;
461 if( findChild(param->GetName(), sample_func)==NULL )
continue;
463 std::cout << std::setw(30) << param->GetName();
464 std::cout << std::setw(15) << param->getVal();
465 if( !param->isConstant() ) {
466 std::cout << std::setw(15) << param->getErrorLo() << std::setw(15) << param->getErrorHi();
468 std::cout<< std::endl;
471 std::cout << std::endl;
478 double HistFactoryNavigation::GetBinValue(
int bin,
const std::string& channel) {
484 TH1* channel_hist_tmp = GetChannelHist(channel, (channel+
"_tmp").c_str());
485 double val = channel_hist_tmp->GetBinContent(bin);
486 delete channel_hist_tmp;
491 double HistFactoryNavigation::GetBinValue(
int bin,
const std::string& channel,
const std::string& sample){
498 TH1* sample_hist_tmp = GetSampleHist(channel, sample, (channel+
"_tmp").c_str());
499 double val = sample_hist_tmp->GetBinContent(bin);
500 delete sample_hist_tmp;
505 std::map< std::string, RooAbsReal*> HistFactoryNavigation::GetSampleFunctionMap(
const std::string& channel) {
509 std::map< std::string, std::map< std::string, RooAbsReal*> >::iterator channel_itr;
510 channel_itr = fChannelSampleFunctionMap.find(channel);
511 if( channel_itr==fChannelSampleFunctionMap.end() ){
512 std::cout <<
"Error: Channel: " << channel <<
" not found in Navigation" << std::endl;
516 return channel_itr->second;
520 RooAbsReal* HistFactoryNavigation::SampleFunction(
const std::string& channel,
const std::string& sample){
524 std::map< std::string, std::map< std::string, RooAbsReal*> >::iterator channel_itr;
525 channel_itr = fChannelSampleFunctionMap.find(channel);
526 if( channel_itr==fChannelSampleFunctionMap.end() ){
527 std::cout <<
"Error: Channel: " << channel <<
" not found in Navigation" << std::endl;
531 std::map< std::string, RooAbsReal*>& SampleMap = channel_itr->second;
532 std::map< std::string, RooAbsReal*>::iterator sample_itr;
533 sample_itr = SampleMap.find(sample);
534 if( sample_itr==SampleMap.end() ){
535 std::cout <<
"Error: Sample: " << sample <<
" not found in Navigation" << std::endl;
539 return sample_itr->second;
544 RooArgSet* HistFactoryNavigation::GetObservableSet(
const std::string& channel) {
547 std::map< std::string, RooArgSet*>::iterator channel_itr;
548 channel_itr = fChannelObservMap.find(channel);
549 if( channel_itr==fChannelObservMap.end() ){
550 std::cout <<
"Error: Channel: " << channel <<
" not found in Navigation" << std::endl;
554 return channel_itr->second;
559 TH1* HistFactoryNavigation::GetSampleHist(
const std::string& channel,
const std::string& sample,
560 const std::string& hist_name) {
565 RooArgList observable_list( *GetObservableSet(channel) );
567 std::string name = hist_name;
568 if(hist_name==
"") name = channel +
"_" + sample +
"_hist";
570 RooAbsReal* sample_function = SampleFunction(channel, sample);
572 return MakeHistFromRooFunction( sample_function, observable_list, name );
577 TH1* HistFactoryNavigation::GetChannelHist(
const std::string& channel,
const std::string& hist_name) {
582 RooArgList observable_list( *GetObservableSet(channel) );
584 std::map< std::string, RooAbsReal*> SampleFunctionMap = GetSampleFunctionMap(channel);
587 TH1* total_hist=NULL;
588 std::map< std::string, RooAbsReal*>::iterator itr = SampleFunctionMap.begin();
589 for( ; itr != SampleFunctionMap.end(); ++itr) {
590 std::string sample_name = itr->first;
591 std::string tmp_hist_name = sample_name +
"_hist_tmp";
592 RooAbsReal* sample_function = itr->second;
593 TH1* sample_hist = MakeHistFromRooFunction(sample_function, observable_list,
595 total_hist = (TH1*) sample_hist->Clone(
"TotalHist");
603 itr = SampleFunctionMap.begin();
604 for( ; itr != SampleFunctionMap.end(); ++itr) {
605 std::string sample_name = itr->first;
606 std::string tmp_hist_name = sample_name +
"_hist_tmp";
607 RooAbsReal* sample_function = itr->second;
608 TH1* sample_hist = MakeHistFromRooFunction(sample_function, observable_list,
610 total_hist->Add(sample_hist);
614 if(hist_name==
"") total_hist->SetName(hist_name.c_str());
615 else total_hist->SetName( (channel +
"_hist").c_str() );
622 std::vector< std::string > HistFactoryNavigation::GetChannelSampleList(
const std::string& channel) {
624 std::vector<std::string> sample_list;
626 std::map< std::string, RooAbsReal*> sample_map = fChannelSampleFunctionMap[channel];
627 std::map< std::string, RooAbsReal*>::iterator itr = sample_map.begin();;
628 for( ; itr != sample_map.end(); ++itr) {
629 sample_list.push_back( itr->first );
637 THStack* HistFactoryNavigation::GetChannelStack(
const std::string& channel,
638 const std::string& name) {
640 THStack* stack =
new THStack(name.c_str(),
"");
642 std::vector< std::string > samples = GetChannelSampleList(channel);
645 for(
unsigned int i=0; i < samples.size(); ++i) {
646 std::string sample_name = samples.at(i);
647 TH1* hist = GetSampleHist(channel, sample_name, sample_name+
"_tmp");
648 hist->SetLineColor(2+i);
649 hist->SetFillColor(2+i);
658 TH1* HistFactoryNavigation::GetDataHist(RooDataSet* data,
const std::string& channel,
659 const std::string& name) {
668 if(strcmp(fModel->ClassName(),
"RooSimultaneous")==0){
671 RooSimultaneous* simPdf = (RooSimultaneous*) fModel;
672 RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat());
674 TList* dataset_list = data->split(*channelCat);
676 data =
dynamic_cast<RooDataSet*
>( dataset_list->FindObject(channel.c_str()) );
680 RooArgList vars( *GetObservableSet(channel) );
682 int dim = vars.getSize();
687 RooRealVar* varX = (RooRealVar*) vars.at(0);
688 hist = data->createHistogram( name.c_str(),*varX, RooFit::Binning(varX->getBinning()) );
691 RooRealVar* varX = (RooRealVar*) vars.at(0);
692 RooRealVar* varY = (RooRealVar*) vars.at(1);
693 hist = data->createHistogram( name.c_str(),*varX, RooFit::Binning(varX->getBinning()),
694 RooFit::YVar(*varY, RooFit::Binning(varY->getBinning())) );
697 RooRealVar* varX = (RooRealVar*) vars.at(0);
698 RooRealVar* varY = (RooRealVar*) vars.at(1);
699 RooRealVar* varZ = (RooRealVar*) vars.at(2);
700 hist = data->createHistogram( name.c_str(),*varX, RooFit::Binning(varX->getBinning()),
701 RooFit::YVar(*varY, RooFit::Binning(varY->getBinning())),
702 RooFit::YVar(*varZ, RooFit::Binning(varZ->getBinning())) );
705 std::cout <<
"Error: To Create Histogram from RooDataSet, Dimension must be 1, 2, or 3" << std::endl;
706 std::cout <<
"Observables: " << std::endl;
716 void HistFactoryNavigation::DrawChannel(
const std::string& channel, RooDataSet* data) {
719 THStack* stack = GetChannelStack(channel, channel+
"_stack_tmp");
724 TH1* data_hist = GetDataHist(data, channel, channel+
"_data_tmp");
725 data_hist->Draw(
"SAME");
732 RooArgSet HistFactoryNavigation::_GetAllProducts(RooProduct* node) {
741 RooArgSet productComponents = node->components();
744 TIterator* itr = productComponents.createIterator();
745 RooAbsArg* arg = NULL;
746 while( (arg=(RooAbsArg*)itr->Next()) ) {
747 std::string ClassName = arg->ClassName();
748 if( ClassName ==
"RooProduct" ) {
749 RooProduct* prod =
dynamic_cast<RooProduct*
>(arg);
750 allTerms.add( _GetAllProducts(prod) );
765 void HistFactoryNavigation::_GetNodes(RooAbsPdf* modelPdf,
const RooArgSet* observables) {
782 if(strcmp(modelPdf->ClassName(),
"RooSimultaneous")==0){
785 RooSimultaneous* simPdf = (RooSimultaneous*) modelPdf;
786 RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat());
790 TIterator* iter = channelCat->typeIterator() ;
791 RooCatType* tt = NULL;
792 while((tt=(RooCatType*) iter->Next())) {
793 std::string ChannelName = tt->GetName();
794 fChannelNameVec.push_back( ChannelName );
795 RooAbsPdf* pdftmp = simPdf->getPdf(ChannelName.c_str()) ;
796 RooArgSet* obstmp = pdftmp->getObservables(*observables) ;
797 fChannelPdfMap[ChannelName] = pdftmp;
798 fChannelObservMap[ChannelName] = obstmp;
802 RooArgSet* obstmp = modelPdf->getObservables(*observables) ;
804 std::string ChannelName = modelPdf->GetName();
805 ChannelName = ChannelName.replace(0, 6,
"");
806 fChannelNameVec.push_back(ChannelName);
807 fChannelPdfMap[ChannelName] = modelPdf;
808 fChannelObservMap[ChannelName] = obstmp;
818 for(
unsigned int i = 0; i < fChannelNameVec.size(); ++i ) {
820 std::string ChannelName = fChannelNameVec.at(i);
821 RooAbsPdf* pdf = fChannelPdfMap[ChannelName];
828 RooArgSet* components = pdf->getComponents();
829 TIterator* argItr = components->createIterator();
830 RooAbsArg* arg = NULL;
831 while( (arg=(RooAbsArg*)argItr->Next()) ) {
832 std::string ClassName = arg->ClassName();
833 if( ClassName ==
"RooRealSumPdf" ) {
834 fChannelSumNodeMap[ChannelName] = (RooRealSumPdf*) arg;
842 for(
unsigned int i = 0; i < fChannelNameVec.size(); ++i ) {
844 std::string ChannelName = fChannelNameVec.at(i);
845 RooRealSumPdf* sumPdf =
dynamic_cast<RooRealSumPdf*
>(fChannelSumNodeMap[ChannelName]);
856 std::map< std::string, RooAbsReal*> sampleFunctionMap;
860 RooArgList nodes = sumPdf->funcList();
861 TIterator* sampleItr = nodes.createIterator();
863 while( (sample=(RooAbsArg*)sampleItr->Next()) ) {
866 RooAbsReal* func = (RooAbsReal*) sample;
869 std::string SampleName = sample->GetName();
870 if( SampleName.find(
"L_x_") != std::string::npos ) {
871 size_t index = SampleName.find(
"L_x_");
872 SampleName.replace( index, 4,
"" );
874 if( SampleName.find(ChannelName.c_str()) != std::string::npos ) {
875 size_t index = SampleName.find(ChannelName.c_str());
876 SampleName = SampleName.substr(0, index-1);
880 sampleFunctionMap[SampleName] = func;
884 fChannelSampleFunctionMap[ChannelName] = sampleFunctionMap;
894 RooAbsArg* HistFactoryNavigation::findChild(
const std::string& name, RooAbsReal* parent)
const {
896 RooAbsArg* term=NULL;
900 RooArgSet* components = parent->getComponents();
901 TIterator* argItr = components->createIterator();
902 RooAbsArg* arg = NULL;
903 while( (arg=(RooAbsArg*)argItr->Next()) ) {
904 std::string ArgName = arg->GetName();
905 if( ArgName == name ) {
913 if( term != NULL )
return term;
918 RooArgSet* args =
new RooArgSet();
919 RooArgSet* paramSet = parent->getParameters(args);
920 TIterator* paramItr = paramSet->createIterator();
921 RooAbsArg* param = NULL;
922 while( (param=(RooAbsArg*)paramItr->Next()) ) {
923 std::string ParamName = param->GetName();
924 if( ParamName == name ) {
950 RooAbsReal* HistFactoryNavigation::GetConstraintTerm(
const std::string& parameter) {
952 std::string ConstraintTermName = parameter +
"Constraint";
956 RooRealVar* param =
dynamic_cast<RooRealVar*
>(findChild(parameter, fModel));
958 std::cout <<
"Error: Couldn't Find parameter: " << parameter <<
" in model."
964 if( parameter.find(
"gamma_stat_") != std::string::npos ) {
965 ConstraintTermName = parameter +
"_constraint";
969 RooAbsReal* term =
dynamic_cast<RooAbsReal*
>(findChild(ConstraintTermName, fModel));
972 std::cout <<
"Error: Couldn't Find constraint term for parameter: " << parameter
973 <<
" (Looked for '" << ConstraintTermName <<
"')" << std::endl;
982 double HistFactoryNavigation::GetConstraintUncertainty(
const std::string& parameter) {
984 RooAbsReal* constraintTerm = GetConstraintTerm(parameter);
985 if( constraintTerm==NULL ) {
986 std::cout <<
"Error: Cannot get uncertainty because parameter: " << parameter
987 <<
" has no constraint term" << std::endl;
992 std::string ConstraintType = constraintTerm->IsA()->GetName();
997 if( ConstraintType ==
"" ) {
998 std::cout <<
"Error: Constraint type is an empty string."
999 <<
" This simply should not be." << std::endl;
1002 else if( ConstraintType ==
"RooGaussian" ){
1011 std::string sigmaName =
"";
1012 if( parameter.find(
"alpha_")!=std::string::npos ) {
1015 else if( parameter.find(
"gamma_stat_")!=std::string::npos ) {
1016 sigmaName = parameter +
"_sigma";
1020 RooAbsReal* sigmaVar =
dynamic_cast<RooAbsReal*
>(constraintTerm->findServer(sigmaName.c_str()));
1021 if( sigmaVar==NULL ) {
1022 std::cout <<
"Error: Failed to find the 'sigma' node: " << sigmaName
1023 <<
" in the RooGaussian: " << constraintTerm->GetName() << std::endl;
1027 sigma = sigmaVar->getVal();
1029 else if( ConstraintType ==
"RooPoisson" ){
1031 std::string tauName =
"nom_" + parameter;
1032 RooAbsReal* tauVar =
dynamic_cast<RooAbsReal*
>( constraintTerm->findServer(tauName.c_str()) );
1033 if( tauVar==NULL ) {
1034 std::cout <<
"Error: Failed to find the nominal 'tau' node: " << tauName
1035 <<
" for the RooPoisson: " << constraintTerm->GetName() << std::endl;
1038 double tau_val = tauVar->getVal();
1039 sigma = 1.0 / TMath::Sqrt( tau_val );
1042 std::cout <<
"Error: Encountered unknown constraint type for Stat Uncertainties: "
1043 << ConstraintType << std::endl;
1051 void HistFactoryNavigation::ReplaceNode(
const std::string& ToReplace, RooAbsArg* ReplaceWith) {
1054 RooAbsArg* nodeToReplace = findChild(ToReplace, fModel);
1055 if( nodeToReplace==NULL ) {
1056 std::cout <<
"Error: Cannot replace node: " << ToReplace
1057 <<
" because this node wasn't found in: " << fModel->GetName()
1067 for (
auto client : nodeToReplace->clients()) {
1072 if( findChild(client->GetName(), fModel) ==
nullptr)
continue;
1075 bool valueProp=
false;
1076 bool shapeProp=
false;
1077 client->replaceServer( *nodeToReplace, *ReplaceWith, valueProp, shapeProp );
1078 std::cout <<
"Replaced: " << ToReplace <<
" with: " << ReplaceWith->GetName()
1079 <<
" in node: " << client->GetName() << std::endl;
1088 void HistFactoryNavigation::PrintSampleComponents(
const std::string& channel,
1089 const std::string& sample) {
1092 RooAbsReal* sampleNode = SampleFunction(channel, sample);
1095 RooArgList observable_list( *GetObservableSet(channel) );
1098 std::string total_Name = sampleNode->GetName();
1099 TH1* total_hist= MakeHistFromRooFunction( sampleNode, observable_list, total_Name +
"_tmp");
1100 unsigned int num_bins = total_hist->GetNbinsX()*total_hist->GetNbinsY()*total_hist->GetNbinsZ();
1102 RooArgSet components;
1105 int label_print_width = 30;
1106 int bin_print_width = 12;
1107 if( strcmp(sampleNode->ClassName(),
"RooProduct")==0){
1108 RooProduct* prod =
dynamic_cast<RooProduct*
>(sampleNode);
1109 components.add( _GetAllProducts(prod) );
1112 components.add(*sampleNode);
1117 TIterator* itr = components.createIterator();
1118 RooAbsArg* arg = NULL;
1119 while( (arg=(RooAbsArg*)itr->Next()) ) {
1120 RooAbsReal* component =
dynamic_cast<RooAbsReal*
>(arg);
1121 std::string NodeName = component->GetName();
1122 label_print_width = TMath::Max(label_print_width, (
int)NodeName.size()+2);
1127 std::cout << std::endl;
1128 std::cout <<
"Channel: " << channel <<
" Sample: " << sample << std::endl;
1129 std::cout << std::setw(label_print_width) <<
"Factor";
1131 for(
unsigned int i=0; i < num_bins; ++i) {
1132 if( _minBinToPrint != -1 && (
int)i < _minBinToPrint)
continue;
1133 if( _maxBinToPrint != -1 && (
int)i > _maxBinToPrint)
break;
1134 std::stringstream sstr;
1136 std::cout << std::setw(bin_print_width) << sstr.str();
1138 std::cout << std::endl;
1140 TIterator* itr = components.createIterator();
1141 RooAbsArg* arg = NULL;
1142 while( (arg=(RooAbsArg*)itr->Next()) ) {
1143 RooAbsReal* component =
dynamic_cast<RooAbsReal*
>(arg);
1144 std::string NodeName = component->GetName();
1149 RooFit::MsgLevel levelBefore = RooMsgService::instance().globalKillBelow();
1150 RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL);
1153 hist = MakeHistFromRooFunction( component, observable_list, NodeName+
"_tmp");
1155 RooMsgService::instance().setGlobalKillBelow(levelBefore);
1158 RooMsgService::instance().setGlobalKillBelow(levelBefore);
1161 std::cout << std::setw(label_print_width) << NodeName;
1164 PrintMultiDimHist(hist, bin_print_width);
1168 std::string line_break;
1169 int high_bin = _maxBinToPrint==-1 ? num_bins : TMath::Min(_maxBinToPrint, (
int)num_bins);
1170 int low_bin = _minBinToPrint==-1 ? 1 : _minBinToPrint;
1171 int break_length = (high_bin - low_bin + 1) * bin_print_width;
1172 break_length += label_print_width;
1173 for(
int i = 0; i < break_length; ++i) {
1176 std::cout << line_break << std::endl;
1178 std::cout << std::setw(label_print_width) <<
"TOTAL:";
1179 PrintMultiDimHist(total_hist, bin_print_width);
1195 TH1* HistFactoryNavigation::MakeHistFromRooFunction( RooAbsReal* func, RooArgList vars,
1196 std::string name ) {
1211 int dim = vars.getSize();
1216 RooRealVar* varX = (RooRealVar*) vars.at(0);
1217 hist = func->createHistogram( name.c_str(),*varX, RooFit::Binning(varX->getBinning()), RooFit::Scaling(
false) );
1220 RooRealVar* varX = (RooRealVar*) vars.at(0);
1221 RooRealVar* varY = (RooRealVar*) vars.at(1);
1222 hist = func->createHistogram( name.c_str(),*varX, RooFit::Binning(varX->getBinning()), RooFit::Scaling(
false),
1223 RooFit::YVar(*varY, RooFit::Binning(varY->getBinning())) );
1226 RooRealVar* varX = (RooRealVar*) vars.at(0);
1227 RooRealVar* varY = (RooRealVar*) vars.at(1);
1228 RooRealVar* varZ = (RooRealVar*) vars.at(2);
1229 hist = func->createHistogram( name.c_str(),*varX, RooFit::Binning(varX->getBinning()), RooFit::Scaling(
false),
1230 RooFit::YVar(*varY, RooFit::Binning(varY->getBinning())),
1231 RooFit::YVar(*varZ, RooFit::Binning(varZ->getBinning())) );
1234 std::cout <<
"Error: To Create Histogram from RooAbsReal function, Dimension must be 1, 2, or 3" << std::endl;
1242 void HistFactoryNavigation::_GetNodes(ModelConfig* mc) {
1243 RooAbsPdf* modelPdf = mc->GetPdf();
1244 const RooArgSet* observables = mc->GetObservables();
1245 _GetNodes(modelPdf, observables);
1249 void HistFactoryNavigation::SetConstant(
const std::string& regExpr,
bool constant) {
1253 TString RegexTString(regExpr);
1254 TRegexp theRegExpr(RegexTString);
1260 RooArgSet* params = fModel->getParameters(*fObservables);
1262 std::cout << std::endl;
1265 std::cout << std::setw(30) <<
"Parameter";
1266 std::cout << std::setw(15) <<
"Value"
1267 << std::setw(15) <<
"Error Low"
1268 << std::setw(15) <<
"Error High"
1272 TIterator* paramItr = params->createIterator();
1273 RooRealVar* param = NULL;
1274 while( (param=(RooRealVar*)paramItr->Next()) ) {
1276 std::string ParamName = param->GetName();
1277 TString ParamNameTString(ParamName);
1282 if( theRegExpr.Index(ParamNameTString, &dummy) == -1 )
continue;
1284 param->setConstant( constant );
1285 std::cout <<
"Setting param: " << ParamName <<
" constant"
1286 <<
" (matches regex: " << regExpr <<
")" << std::endl;
1290 RooRealVar* HistFactoryNavigation::var(
const std::string& varName)
const {
1292 RooAbsArg* arg = findChild(varName, fModel);
1293 if( !arg )
return NULL;
1295 RooRealVar* var_obj =
dynamic_cast<RooRealVar*
>(arg);