34 : _minBinToPrint(-1), _maxBinToPrint(-1),
35 _label_print_width(20), _bin_print_width(12) {
38 std::cout <<
"Error: The supplied ModelConfig is NULL " << std::endl;
45 std::cout <<
"Error: The pdf found in the ModelConfig: " << mc->
GetName()
46 <<
" is NULL" << std::endl;
55 if( !observables_in_mc ) {
56 std::cout <<
"Error: Observable set in the ModelConfig: " << mc->
GetName()
57 <<
" is NULL" << std::endl;
60 if( observables_in_mc->
getSize() == 0 ) {
61 std::cout <<
"Error: Observable list: " << observables_in_mc->
GetName()
62 <<
" found in ModelConfig: " << mc->
GetName()
63 <<
" has no entries." << std::endl;
78 const std::string& WorkspaceName,
79 const std::string& ModelConfigName) :
80 _minBinToPrint(-1), _maxBinToPrint(-1),
81 _label_print_width(20), _bin_print_width(12) {
86 std::cout <<
"Error: Failed to open file: " << FileName << std::endl;
93 std::cout <<
"Error: Failed to get workspace: " << WorkspaceName
94 <<
" from file: " << FileName << std::endl;
101 std::cout <<
"Error: Failed to find ModelConfig: " << ModelConfigName
102 <<
" from workspace: " << WorkspaceName
103 <<
" in file: " << FileName << std::endl;
110 std::cout <<
"Error: The pdf found in the ModelConfig: " << ModelConfigName
111 <<
" is NULL" << std::endl;
120 if( !observables_in_mc ) {
121 std::cout <<
"Error: Observable set in the ModelConfig: " << ModelConfigName
122 <<
" is NULL" << std::endl;
125 if( observables_in_mc->
getSize() == 0 ) {
126 std::cout <<
"Error: Observable list: " << observables_in_mc->
GetName()
127 <<
" found in ModelConfig: " << ModelConfigName
128 <<
" in file: " << FileName
129 <<
" has no entries." << std::endl;
144 _minBinToPrint(-1), _maxBinToPrint(-1),
145 _label_print_width(20), _bin_print_width(12) {
149 std::cout <<
"Error: The supplied pdf is NULL" << std::endl;
159 std::cout <<
"Error: Supplied Observable set is NULL" << std::endl;
162 if( observables->
getSize() == 0 ) {
163 std::cout <<
"Error: Observable list: " << observables->
GetName()
164 <<
" has no entries." << std::endl;
179 for(
int i = 0; i < num_bins; ++i) {
189 std::cout << std::setw(bin_print_width) << hist->
GetBinContent(current_bin);
191 std::cout << std::endl;
199 std::map< std::string, RooAbsPdf* >::iterator itr;
203 std::cout <<
"Warning: Could not find channel: " << channel
210 std::cout <<
"Warning: Pdf associated with channel: " << channel
211 <<
" is NULL" << std::endl;
223 std::cout << std::endl << channel <<
":" << std::endl;
240 std::map< std::string, RooAbsReal*>::iterator itr = SampleFunctionMap.begin();
241 for( ; itr != SampleFunctionMap.end(); ++itr) {
243 std::string sample_name = itr->first;
244 std::string tmp_name = sample_name + channel +
"_pretty_tmp";
256 std::string line_break;
261 for(
int i = 0; i < break_length; ++i) {
264 std::cout << line_break << std::endl;
266 std::string tmp_name = channel +
"_pretty_tmp";
293 for( std::map< std::string, RooAbsReal*>::iterator itr = SampleFunctionMap.begin();
294 itr != SampleFunctionMap.end(); ++itr) {
295 std::string sample_name = itr->first;
304 const std::string& channel_to_print) {
324 for(
unsigned int i_chan=0; i_chan <
fChannelNameVec.size(); ++i_chan) {
329 if( channel_to_print !=
"" && channel_name != channel_to_print)
continue;
331 TH1* data_hist =
GetDataHist(data, channel_name, channel_name+
"_tmp");
353 std::cout << std::endl;
362 std::cout << std::endl;
365 std::cout << std::setw(30) <<
"Parameter";
366 std::cout << std::setw(15) <<
"Value"
367 << std::setw(15) <<
"Error Low"
368 << std::setw(15) <<
"Error High"
376 if( !IncludeConstantParams && param->
isConstant() )
continue;
378 std::cout << std::setw(30) << param->
GetName();
379 std::cout << std::setw(15) << param->
getVal();
383 std::cout<< std::endl;
386 std::cout << std::endl;
390 bool IncludeConstantParams) {
398 std::cout << std::endl;
401 std::cout << std::setw(30) <<
"Parameter";
402 std::cout << std::setw(15) <<
"Value"
403 << std::setw(15) <<
"Error Low"
404 << std::setw(15) <<
"Error High"
412 if( !IncludeConstantParams && param->
isConstant() )
continue;
416 std::cout << std::setw(30) << param->
GetName();
417 std::cout << std::setw(15) << param->
getVal();
421 std::cout<< std::endl;
424 std::cout << std::endl;
429 const std::string& sample,
430 bool IncludeConstantParams) {
438 std::cout << std::endl;
441 std::cout << std::setw(30) <<
"Parameter";
442 std::cout << std::setw(15) <<
"Value"
443 << std::setw(15) <<
"Error Low"
444 << std::setw(15) <<
"Error High"
452 if( !IncludeConstantParams && param->
isConstant() )
continue;
456 std::cout << std::setw(30) << param->
GetName();
457 std::cout << std::setw(15) << param->
getVal();
461 std::cout<< std::endl;
464 std::cout << std::endl;
477 delete channel_hist_tmp;
489 TH1* sample_hist_tmp =
GetSampleHist(channel, sample, (channel+
"_tmp").c_str());
491 delete sample_hist_tmp;
500 std::map< std::string, std::map< std::string, RooAbsReal*> >::iterator channel_itr;
503 std::cout <<
"Error: Channel: " << channel <<
" not found in Navigation" << std::endl;
507 return channel_itr->second;
515 std::map< std::string, std::map< std::string, RooAbsReal*> >::iterator channel_itr;
518 std::cout <<
"Error: Channel: " << channel <<
" not found in Navigation" << std::endl;
522 std::map< std::string, RooAbsReal*>& SampleMap = channel_itr->second;
523 std::map< std::string, RooAbsReal*>::iterator sample_itr;
524 sample_itr = SampleMap.find(sample);
525 if( sample_itr==SampleMap.end() ){
526 std::cout <<
"Error: Sample: " << sample <<
" not found in Navigation" << std::endl;
530 return sample_itr->second;
538 std::map< std::string, RooArgSet*>::iterator channel_itr;
541 std::cout <<
"Error: Channel: " << channel <<
" not found in Navigation" << std::endl;
545 return channel_itr->second;
551 const std::string& hist_name) {
558 std::string
name = hist_name;
559 if(hist_name==
"")
name = channel +
"_" + sample +
"_hist";
578 TH1* total_hist =
nullptr;
579 std::map< std::string, RooAbsReal*>::iterator itr = SampleFunctionMap.begin();
580 for( ; itr != SampleFunctionMap.end(); ++itr) {
581 std::string sample_name = itr->first;
582 std::string tmp_hist_name = sample_name +
"_hist_tmp";
586 total_hist = (
TH1*) sample_hist->
Clone(
"TotalHist");
597 itr = SampleFunctionMap.begin();
598 for( ; itr != SampleFunctionMap.end(); ++itr) {
599 std::string sample_name = itr->first;
600 std::string tmp_hist_name = sample_name +
"_hist_tmp";
604 total_hist->
Add(sample_hist);
608 if(hist_name==
"") total_hist->
SetName(hist_name.c_str());
609 else total_hist->
SetName( (channel +
"_hist").c_str() );
618 std::vector<std::string> sample_list;
621 std::map< std::string, RooAbsReal*>::iterator itr = sample_map.begin();;
622 for( ; itr != sample_map.end(); ++itr) {
623 sample_list.push_back( itr->first );
632 const std::string&
name) {
639 for(
unsigned int i=0; i < samples.size(); ++i) {
640 std::string sample_name = samples.at(i);
653 const std::string&
name) {
660 TList *dataset_list =
nullptr;
670 dataset_list = data->
split(*channelCat);
683 std::cout <<
"Error: To Create Histogram from RooDataSet" << std::endl;
687 dataset_list =
nullptr;
690 }
else if( dim==1 ) {
709 std::cout <<
"Error: To Create Histogram from RooDataSet, Dimension must be 1, 2, or 3" << std::endl;
710 std::cout <<
"Observables: " << std::endl;
715 dataset_list =
nullptr;
723 dataset_list =
nullptr;
740 data_hist->
Draw(
"SAME");
762 std::string ClassName = arg->
ClassName();
763 if( ClassName ==
"RooProduct" ) {
797 if(strcmp(modelPdf->
ClassName(),
"RooSimultaneous")==0){
805 for (
const auto& nameIdx : *channelCat) {
806 const std::string& ChannelName = nameIdx.first;
817 std::string ChannelName = modelPdf->
GetName();
818 ChannelName = ChannelName.replace(0, 6,
"");
845 std::string ClassName = arg->
ClassName();
846 if( ClassName ==
"RooRealSumPdf" ) {
869 std::map< std::string, RooAbsReal*> sampleFunctionMap;
882 std::string SampleName = sample->
GetName();
883 if( SampleName.find(
"L_x_") != std::string::npos ) {
884 size_t index = SampleName.find(
"L_x_");
885 SampleName.replace( index, 4,
"" );
887 if( SampleName.find(ChannelName.c_str()) != std::string::npos ) {
888 size_t index = SampleName.find(ChannelName.c_str());
889 SampleName = SampleName.substr(0, index-1);
893 sampleFunctionMap[SampleName] = func;
917 std::string ArgName = arg->
GetName();
918 if( ArgName ==
name ) {
926 if( term != NULL )
return term;
936 std::string ParamName = param->
GetName();
937 if( ParamName ==
name ) {
965 std::string ConstraintTermName = parameter +
"Constraint";
971 std::cout <<
"Error: Couldn't Find parameter: " << parameter <<
" in model."
977 if( parameter.find(
"gamma_stat_") != std::string::npos ) {
978 ConstraintTermName = parameter +
"_constraint";
985 std::cout <<
"Error: Couldn't Find constraint term for parameter: " << parameter
986 <<
" (Looked for '" << ConstraintTermName <<
"')" << std::endl;
998 if( constraintTerm==NULL ) {
999 std::cout <<
"Error: Cannot get uncertainty because parameter: " << parameter
1000 <<
" has no constraint term" << std::endl;
1005 std::string ConstraintType = constraintTerm->IsA()->
GetName();
1010 if( ConstraintType ==
"" ) {
1011 std::cout <<
"Error: Constraint type is an empty string."
1012 <<
" This simply should not be." << std::endl;
1015 else if( ConstraintType ==
"RooGaussian" ){
1024 std::string sigmaName =
"";
1025 if( parameter.find(
"alpha_")!=std::string::npos ) {
1028 else if( parameter.find(
"gamma_stat_")!=std::string::npos ) {
1029 sigmaName = parameter +
"_sigma";
1034 if( sigmaVar==NULL ) {
1035 std::cout <<
"Error: Failed to find the 'sigma' node: " << sigmaName
1036 <<
" in the RooGaussian: " << constraintTerm->
GetName() << std::endl;
1042 else if( ConstraintType ==
"RooPoisson" ){
1044 std::string tauName =
"nom_" + parameter;
1046 if( tauVar==NULL ) {
1047 std::cout <<
"Error: Failed to find the nominal 'tau' node: " << tauName
1048 <<
" for the RooPoisson: " << constraintTerm->
GetName() << std::endl;
1051 double tau_val = tauVar->
getVal();
1055 std::cout <<
"Error: Encountered unknown constraint type for Stat Uncertainties: "
1056 << ConstraintType << std::endl;
1068 if( nodeToReplace==NULL ) {
1069 std::cout <<
"Error: Cannot replace node: " << ToReplace
1070 <<
" because this node wasn't found in: " <<
fModel->
GetName()
1080 for (
auto client : nodeToReplace->
clients()) {
1088 bool valueProp=
false;
1089 bool shapeProp=
false;
1090 client->replaceServer( *nodeToReplace, *ReplaceWith, valueProp, shapeProp );
1091 std::cout <<
"Replaced: " << ToReplace <<
" with: " << ReplaceWith->
GetName()
1092 <<
" in node: " << client->GetName() << std::endl;
1102 const std::string& sample) {
1111 std::string total_Name = sampleNode->
GetName();
1118 int label_print_width = 30;
1119 int bin_print_width = 12;
1120 if( strcmp(sampleNode->
ClassName(),
"RooProduct")==0){
1125 components.
add(*sampleNode);
1134 std::string NodeName = component->
GetName();
1135 label_print_width =
TMath::Max(label_print_width, (
int)NodeName.size()+2);
1140 std::cout << std::endl;
1141 std::cout <<
"Channel: " << channel <<
" Sample: " << sample << std::endl;
1142 std::cout << std::setw(label_print_width) <<
"Factor";
1144 for(
unsigned int i=0; i < num_bins; ++i) {
1147 std::stringstream sstr;
1149 std::cout << std::setw(bin_print_width) << sstr.str();
1151 std::cout << std::endl;
1157 std::string NodeName = component->
GetName();
1174 std::cout << std::setw(label_print_width) << NodeName;
1181 std::string line_break;
1184 int break_length = (high_bin - low_bin + 1) * bin_print_width;
1185 break_length += label_print_width;
1186 for(
int i = 0; i < break_length; ++i) {
1189 std::cout << line_break << std::endl;
1191 std::cout << std::setw(label_print_width) <<
"TOTAL:";
1209 std::string
name ) {
1247 std::cout <<
"Error: To Create Histogram from RooAbsReal function, Dimension must be 1, 2, or 3" << std::endl;
1266 TString RegexTString(regExpr);
1267 TRegexp theRegExpr(RegexTString);
1275 std::cout << std::endl;
1278 std::cout << std::setw(30) <<
"Parameter";
1279 std::cout << std::setw(15) <<
"Value"
1280 << std::setw(15) <<
"Error Low"
1281 << std::setw(15) <<
"Error High"
1289 std::string ParamName = param->
GetName();
1290 TString ParamNameTString(ParamName);
1295 if( theRegExpr.
Index(ParamNameTString, &dummy) == -1 )
continue;
1298 std::cout <<
"Setting param: " << ParamName <<
" constant"
1299 <<
" (matches regex: " << regExpr <<
")" << std::endl;
1306 if( !arg )
return NULL;
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
RooArgSet * getObservables(const RooArgSet &set, Bool_t valueOnly=kTRUE) const
Given a set of possible observables, return the observables that this PDF depends on.
const RefCountList_t & clients() const
List of all clients of this object.
RooArgSet * getComponents() const
Create a RooArgSet with all components (branch nodes) of the expression tree headed by this object.
RooArgSet * getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
Bool_t isConstant() const
Check if the "Constant" attribute is set.
RooAbsArg * findServer(const char *name) const
Return server of this with name name. Returns nullptr if not found.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
virtual void Print(Option_t *options=0) const
This method must be overridden when a class wants to print itself.
const char * GetName() const
Returns name of object.
TIterator * createIterator(Bool_t dir=kIterForward) const
TIterator-style iteration over contained elements.
RooAbsArg * find(const char *name) const
Find object with given name in list.
virtual TList * split(const RooAbsCategory &splitCat, Bool_t createEmptyDataSets=kFALSE) const
Split dataset into subsets based on states of given splitCat in this dataset.
void setConstant(Bool_t value=kTRUE)
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
TH1 * createHistogram(const char *varNameList, Int_t xbins=0, Int_t ybins=0, Int_t zbins=0) const
Create and fill a ROOT histogram TH1, TH2 or TH3 with the values of this function for the variables w...
Double_t getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooCategory is an object to represent discrete states.
RooDataSet is a container class to hold unbinned data.
TH2F * createHistogram(const RooAbsRealLValue &var1, const RooAbsRealLValue &var2, const char *cuts="", const char *name="hist") const
Create a TH2F histogram of the distribution of the specified variable using this dataset.
static RooMsgService & instance()
Return reference to singleton instance.
void setGlobalKillBelow(RooFit::MsgLevel level)
RooFit::MsgLevel globalKillBelow() const
A RooProduct represents the product of a given set of RooAbsReal objects.
The class RooRealSumPdf implements a PDF constructed from a sum of functions:
const RooArgList & funcList() const
RooRealVar represents a variable that can be changed from the outside.
Double_t getErrorHi() const
Double_t getErrorLo() const
const RooAbsBinning & getBinning(const char *name=0, Bool_t verbose=kTRUE, Bool_t createOnTheFly=kFALSE) const
Return binning definition with name.
RooSimultaneous facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
const RooAbsCategoryLValue & indexCat() const
RooAbsPdf * getPdf(const char *catName) const
Return the p.d.f associated with the given index category name.
void PrintParameters(bool IncludeConstantParams=false)
Print the current values and errors of pdf parameters.
std::vector< std::string > fChannelNameVec
The list of channels.
RooArgSet * GetObservableSet(const std::string &channel)
Get the set of observables for a given channel.
TH1 * GetDataHist(RooDataSet *data, const std::string &channel, const std::string &name="")
Get a histogram from the dataset for this channel.
RooArgSet * fObservables
The observables.
void _GetNodes(ModelConfig *mc)
Fetch the node information for the pdf in question, and save it in the varous collections in this cla...
std::map< std::string, RooAbsPdf * > fChannelSumNodeMap
Map of channel names to pdf without constraint.
void ReplaceNode(const std::string &ToReplace, RooAbsArg *ReplaceWith)
Find a node in the pdf and replace it with a new node These nodes can be functions,...
void PrintState()
Should pretty print all channels and the current values

void PrintSampleComponents(const std::string &channel, const std::string &sample)
Print the different components that make up a sample (NormFactors, Statistical Uncertainties,...
void SetPrintWidths(const std::string &channel)
Set the title and bin widths.
RooAbsPdf * fModel
The HistFactory Pdf Pointer.
TH1 * GetChannelHist(const std::string &channel, const std::string &name="")
Get the total channel histogram for this channel.
TH1 * GetSampleHist(const std::string &channel, const std::string &sample, const std::string &name="")
The (current) histogram for that sample This includes all parameters and interpolation.
TH1 * MakeHistFromRooFunction(RooAbsReal *func, RooArgList vars, std::string name="Hist")
Make a histogram from a funciton Edit so it can take a RooArgSet of parameters.
void PrintMultiDimHist(TH1 *hist, int bin_print_width)
Print a histogram's contents to the screen void PrettyPrintHistogram(TH1* hist);.
void DrawChannel(const std::string &channel, RooDataSet *data=NULL)
Draw a stack of the channel, and include data if the pointer is supplied.
void PrintSampleParameters(const std::string &channel, const std::string &sample, bool IncludeConstantParams=false)
Print parameters that effect a particular sample.
std::map< std::string, RooAbsReal * > GetSampleFunctionMap(const std::string &channel)
Get a map of sample names to their functions for a particular channel.
RooAbsReal * SampleFunction(const std::string &channel, const std::string &sample)
Get the RooAbsReal function for a given sample in a given channel.
HistFactoryNavigation(ModelConfig *mc)
Initialze based on an already-created HistFactory Model.
double GetBinValue(int bin, const std::string &channel)
The value of the ith bin for the total in that channel.
RooAbsArg * findChild(const std::string &name, RooAbsReal *parent) const
Internal method implementation of finding a daughter node from a parent node (looping over all genera...
std::map< std::string, std::map< std::string, RooAbsReal * > > fChannelSampleFunctionMap
Map of Map of Channel, Sample names to Function Nodes Used by doing: fChannelSampleFunctionMap["MyCha...
std::map< std::string, RooAbsPdf * > fChannelPdfMap
Map of channel names to their full pdf's.
std::vector< std::string > GetChannelSampleList(const std::string &channel)
void PrintModelAndData(RooDataSet *data)
Print the model and the data, comparing channel by channel.
std::map< std::string, RooArgSet * > fChannelObservMap
Map of channel names to their set of ovservables.
RooAbsPdf * GetChannelPdf(const std::string &channel)
void PrintDataSet(RooDataSet *data, const std::string &channel="")
Print a "HistFactory style" RooDataSet in a readable way.
void PrintChannelParameters(const std::string &channel, bool IncludeConstantParams=false)
Print parameters that effect a particular channel.
void SetConstant(const std::string ®Expr=".*", bool constant=true)
RooArgSet _GetAllProducts(RooProduct *node)
Recursively get all products of products.
THStack * GetChannelStack(const std::string &channel, const std::string &name="")
Get a stack of all samples in a channel.
RooAbsReal * GetConstraintTerm(const std::string ¶meter)
Get the constraint term for a given systematic (alpha or gamma)
RooRealVar * var(const std::string &varName) const
double GetConstraintUncertainty(const std::string ¶meter)
Get the uncertainty based on the constraint term for a given systematic.
ModelConfig is a simple class that holds configuration information specifying how a model should be u...
const RooArgSet * GetObservables() const
get RooArgSet for observables (return NULL if not existing)
RooAbsPdf * GetPdf() const
get model PDF (return NULL if pdf has not been specified or does not exist)
The RooWorkspace is a persistable container for RooFit projects.
TObject * obj(const char *name) const
Return any type of object (RooAbsArg, RooAbsData or generic object) with given name)
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
TH1 is the base class of all histogram classes in ROOT.
virtual Int_t GetNbinsY() const
virtual Int_t GetNbinsZ() const
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
TObject * Clone(const char *newname=0) const
Make a complete copy of the underlying object.
virtual Int_t GetNbinsX() const
virtual Bool_t Add(TF1 *h1, Double_t c1=1, Option_t *option="")
Performs the operation: this = this + c1*f1 if errors are defined (see TH1::Sumw2),...
Bool_t IsBinUnderflow(Int_t bin, Int_t axis=0) const
Return true if the bin is underflow.
Bool_t IsBinOverflow(Int_t bin, Int_t axis=0) const
Return true if the bin is overflow.
virtual void Draw(Option_t *option="")
Draw this histogram with options.
virtual void SetName(const char *name)
Change the name of this histogram.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
The Histogram stack class.
virtual void Draw(Option_t *chopt="")
Draw this multihist with its current attributes.
virtual void Add(TH1 *h, Option_t *option="")
add a new histogram to the list Only 1-d and 2-d histograms currently supported.
Iterator abstract base class.
virtual TObject * Next()=0
virtual TObject * FindObject(const char *name) const
Find an object in this list using its name.
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
virtual const char * GetName() const
Returns name of object.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Regular expression class.
Ssiz_t Index(const TString &str, Ssiz_t *len, Ssiz_t start=0) const
Find the first occurrence of the regexp in string and return the position, or -1 if there is no match...
RooCmdArg Scaling(Bool_t flag)
RooCmdArg YVar(const RooAbsRealLValue &var, const RooCmdArg &arg=RooCmdArg::none())
RooCmdArg Binning(const RooAbsBinning &binning)
MsgLevel
Verbosity level for RooMsgService::StreamConfig in RooMsgService.
Namespace for the RooStats classes.
Short_t Max(Short_t a, Short_t b)
Double_t Sqrt(Double_t x)
Short_t Min(Short_t a, Short_t b)