CombineHarvester
CombineHarvester_Creation.cc
Go to the documentation of this file.
2 #include <vector>
3 #include <map>
4 #include <string>
5 #include <iomanip>
6 #include <iostream>
7 #include <utility>
8 #include <algorithm>
9 #include "TDirectory.h"
10 #include "TH1.h"
18 
19 namespace ch {
21  std::vector<std::string> mass,
22  std::vector<std::string> analysis,
23  std::vector<std::string> era,
24  std::vector<std::string> channel,
25  ch::Categories bin) {
26  std::vector<unsigned> lengths = {
27  unsigned(mass.size()),
28  unsigned(analysis.size()),
29  unsigned(era.size()),
30  unsigned(channel.size()),
31  unsigned(bin.size())};
32  auto comb = ch::GenerateCombinations(lengths);
33  for (auto const& c : comb) {
34  auto obs = std::make_shared<Observation>();
35  obs->set_mass(mass[c[0]]);
36  obs->set_analysis(analysis[c[1]]);
37  obs->set_era(era[c[2]]);
38  obs->set_channel(channel[c[3]]);
39  obs->set_bin_id(bin[c[4]].first);
40  obs->set_bin(bin[c[4]].second);
41  obs_.push_back(obs);
42  }
43 }
44 
46  std::vector<std::string> mass,
47  std::vector<std::string> analysis,
48  std::vector<std::string> era,
49  std::vector<std::string> channel,
50  std::vector<std::string> procs,
51  ch::Categories bin,
52  bool signal) {
53  std::vector<unsigned> lengths = {
54  unsigned(mass.size()),
55  unsigned(analysis.size()),
56  unsigned(era.size()),
57  unsigned(channel.size()),
58  unsigned(bin.size())};
59  auto comb = ch::GenerateCombinations(lengths);
60  for (auto const& c : comb) {
61  for (unsigned i = 0; i < procs.size(); ++i) {
62  auto proc = std::make_shared<Process>();
63  proc->set_mass(mass[c[0]]);
64  proc->set_analysis(analysis[c[1]]);
65  proc->set_era(era[c[2]]);
66  proc->set_channel(channel[c[3]]);
67  proc->set_bin_id(bin[c[4]].first);
68  proc->set_bin(bin[c[4]].second);
69  proc->set_process(procs[i]);
70  proc->set_signal(signal);
71  procs_.push_back(proc);
72  }
73  }
74 }
75 
77  std::string const& name,
78  std::string const& type, bool asymm,
79  double val_u, double val_d,
80  std::string const& formula,
81  std::string const& args) {
82  std::string subbed_name = name;
83  boost::replace_all(subbed_name, "$BINID",
84  boost::lexical_cast<std::string>(proc.bin_id()));
85  boost::replace_all(subbed_name, "$BIN", proc.bin());
86  boost::replace_all(subbed_name, "$PROCESS", proc.process());
87  boost::replace_all(subbed_name, "$MASS", proc.mass());
88  boost::replace_all(subbed_name, "$ERA", proc.era());
89  boost::replace_all(subbed_name, "$CHANNEL", proc.channel());
90  boost::replace_all(subbed_name, "$ANALYSIS", proc.analysis());
91  std::map<std::string,std::string> attrs = proc.all_attributes();
92  for( const auto it : attrs){
93  boost::replace_all(subbed_name, "$ATTR("+it.first+")",proc.attribute(it.first));
94  }
95  auto sys = std::make_shared<Systematic>();
96  ch::SetProperties(sys.get(), &proc);
97  sys->set_name(subbed_name);
98  sys->set_type(type);
99  if (type == "lnN" || type == "lnU") {
100  sys->set_asymm(asymm);
101  sys->set_value_u(val_u);
102  sys->set_value_d(val_d);
103  CreateParameterIfEmpty(sys->name());
104  } else if (type == "shape" || type == "shapeN2" || type == "shapeU") {
105  sys->set_asymm(true);
106  sys->set_value_u(1.0);
107  sys->set_value_d(1.0);
108  sys->set_scale(val_u);
109  CreateParameterIfEmpty(sys->name());
110  } else if (type == "rateParam") {
111  sys->set_asymm(false);
112  if (formula == "" && args == "") {
113  SetupRateParamVar(subbed_name, val_u);
114  } else {
115  std::string subbed_args = args;
116  boost::replace_all(subbed_args, "$BINID",
117  boost::lexical_cast<std::string>(proc.bin_id()));
118  boost::replace_all(subbed_args, "$BIN", proc.bin());
119  boost::replace_all(subbed_args, "$PROCESS", proc.process());
120  boost::replace_all(subbed_args, "$MASS", proc.mass());
121  boost::replace_all(subbed_args, "$ERA", proc.era());
122  boost::replace_all(subbed_args, "$CHANNEL", proc.channel());
123  boost::replace_all(subbed_args, "$ANALYSIS", proc.analysis());
124  for( const auto it : attrs){
125  boost::replace_all(subbed_args, "$ATTR("+it.first+")",proc.attribute(it.first));
126  }
127  SetupRateParamFunc(subbed_name, formula, subbed_args);
128  }
129  }
130  if (sys->type() == "lnU" || sys->type() == "shapeU") {
131  params_.at(sys->name())->set_err_d(0.);
132  params_.at(sys->name())->set_err_u(0.);
133  }
134  systs_.push_back(sys);
135 }
136 
137 void CombineHarvester::RenameSystematic(CombineHarvester &target, std::string const& old_name,
138  std::string const& new_name) {
139  for(unsigned i = 0; i<systs_.size(); ++i){
140  if(systs_[i]->name()==old_name){
141  systs_[i]->set_name(new_name);
142  target.CreateParameterIfEmpty(systs_[i]->name());
143  }
144  }
145 }
146 
147 void CombineHarvester::ExtractShapes(std::string const& file,
148  std::string const& rule,
149  std::string const& syst_rule) {
150  std::vector<HistMapping> mapping(1);
151  mapping[0].process = "*";
152  mapping[0].category = "*";
153  mapping[0].file = std::make_shared<TFile>(file.c_str());
154  mapping[0].pattern = rule;
155  mapping[0].syst_pattern = syst_rule;
156 
157  // Note that these LoadShapes calls will fail if we encounter
158  // any object that already has shapes
159  for (unsigned i = 0; i < obs_.size(); ++i) {
160  if (obs_[i]->shape() || obs_[i]->data()) continue;
161  LoadShapes(obs_[i].get(), mapping);
162  }
163  for (unsigned i = 0; i < procs_.size(); ++i) {
164  if (procs_[i]->shape() || procs_[i]->pdf()) continue;
165  LoadShapes(procs_[i].get(), mapping);
166  }
167  if (syst_rule == "") return;
168  for (unsigned i = 0; i < systs_.size(); ++i) {
169  if (systs_[i]->type() != "shape" && systs_[i]->type() != "shapeN2" &&
170  systs_[i]->type() != "shapeU")
171  continue;
172  LoadShapes(systs_[i].get(), mapping);
173  }
174 }
175 
176 void CombineHarvester::AddWorkspace(RooWorkspace const& ws,
177  bool can_rename) {
178  SetupWorkspace(ws, can_rename);
179 }
180 
182  std::string const& ws_name,
183  std::string const& rule,
184  std::string norm_rule) {
185  std::vector<HistMapping> mapping(1);
186  mapping[0].process = "*";
187  mapping[0].category = "*";
188  mapping[0].pattern = ws_name+":"+rule;
189  if (norm_rule != "") mapping[0].syst_pattern = ws_name + ":" + norm_rule;
190  if (!wspaces_.count(ws_name)) return;
191  mapping[0].ws = wspaces_.at(ws_name);
192  for (unsigned i = 0; i < procs_.size(); ++i) {
193  if (!procs_[i]->pdf()) {
194  target.LoadShapes(procs_[i].get(), mapping);
195  }
196  }
197 }
198 
199 void CombineHarvester::ExtractData(std::string const &ws_name,
200  std::string const &rule) {
201  std::vector<HistMapping> mapping(1);
202  mapping[0].process = "*";
203  mapping[0].category = "*";
204  mapping[0].pattern = ws_name+":"+rule;
205  if (!wspaces_.count(ws_name)) return;
206  mapping[0].ws = wspaces_.at(ws_name);
207  for (unsigned i = 0; i < obs_.size(); ++i) {
208  if (!obs_[i]->data()) {
209  LoadShapes(obs_[i].get(), mapping);
210  }
211  }
212 }
213 
214 void CombineHarvester::AddBinByBin(double threshold, bool fixed_norm,
215  CombineHarvester &other) {
216  AddBinByBin(threshold, fixed_norm, &other);
217 }
218 
219 void CombineHarvester::AddBinByBin(double threshold, bool fixed_norm,
220  CombineHarvester *other) {
221  auto bbb_factory = ch::BinByBinFactory()
222  .SetAddThreshold(threshold)
223  .SetFixNorm(fixed_norm)
224  .SetVerbosity(verbosity_);
225  bbb_factory.AddBinByBin(*this, *other);
226 }
227 
228 void CombineHarvester::CreateParameterIfEmpty(std::string const &name) {
229  if (!params_.count(name)) {
230  auto param = std::make_shared<Parameter>(Parameter());
231  param->set_name(name);
232  params_.insert({name, param});
233  }
234 }
235 
236 void CombineHarvester::MergeBinErrors(double bbb_threshold,
237  double merge_threshold) {
238  auto bbb_factory = ch::BinByBinFactory()
239  .SetAddThreshold(bbb_threshold)
240  .SetMergeThreshold(merge_threshold)
241  .SetVerbosity(verbosity_);
242  bbb_factory.MergeBinErrors(*this);
243 }
244 
246  obs_.push_back(std::make_shared<ch::Observation>(obs));
247 }
248 
250  procs_.push_back(std::make_shared<ch::Process>(proc));
251 }
252 
254  systs_.push_back(std::make_shared<ch::Systematic>(sys));
255 }
256 }
ch::CombineHarvester::ExtractData
void ExtractData(std::string const &ws_name, std::string const &rule)
Definition: CombineHarvester_Creation.cc:199
ch::CombineHarvester::analysis
CombineHarvester & analysis(std::vector< std::string > const &vec, bool cond=true)
Definition: CombineHarvester_Filters.cc:55
ch::CombineHarvester::AddWorkspace
void AddWorkspace(RooWorkspace const &ws, bool can_rename=false)
Definition: CombineHarvester_Creation.cc:176
ch::BinByBinFactory::SetMergeThreshold
BinByBinFactory & SetMergeThreshold(double val)
The threshold for the merging algorithm.
Definition: BinByBin.h:107
Parameter.h
ch::CombineHarvester::mass
CombineHarvester & mass(std::vector< std::string > const &vec, bool cond=true)
Definition: CombineHarvester_Filters.cc:97
ch::BinByBinFactory::SetAddThreshold
BinByBinFactory & SetAddThreshold(double val)
Set the fractional bin error threshold for bin-by-bin creation and for participation in the merging a...
Definition: BinByBin.h:99
ch::Object::era
virtual std::string const & era() const
Definition: Object.h:29
Utilities.h
Process.h
ch::CombineHarvester::CreateParameterIfEmpty
void CreateParameterIfEmpty(std::string const &name)
Definition: CombineHarvester_Creation.cc:228
ch::Object::bin
virtual std::string const & bin() const
Definition: Object.h:17
ch::syst::era
Definition: Systematics.h:21
ch::CombineHarvester::InsertProcess
void InsertProcess(ch::Process const &proc)
Definition: CombineHarvester_Creation.cc:249
ch::BinByBinFactory::AddBinByBin
void AddBinByBin(CombineHarvester &src, CombineHarvester &dest)
Create bin-by-bin shape uncertainties for every process in src, and add these to dest
Definition: BinByBin.cc:105
ch::Categories
std::vector< std::pair< int, std::string > > Categories
Definition: CombineHarvester.h:28
ch::Object::channel
virtual std::string const & channel() const
Definition: Object.h:32
ch::CombineHarvester::AddBinByBin
void AddBinByBin(double threshold, bool fixed_norm, CombineHarvester *other)
Create bin-by-bin uncertainties.
Definition: CombineHarvester_Creation.cc:219
ch::CombineHarvester::InsertObservation
void InsertObservation(ch::Observation const &obs)
Definition: CombineHarvester_Creation.cc:245
ch::Process
Definition: Process.h:15
ch::Parameter
Definition: Parameter.h:12
ch::syst::channel
Definition: Systematics.h:26
BinByBin.h
ch::Object::all_attributes
virtual std::map< std::string, std::string > const & all_attributes() const
Definition: Object.h:43
ch::CombineHarvester::AddSystFromProc
void AddSystFromProc(Process const &proc, std::string const &name, std::string const &type, bool asymm, double val_u, double val_d, std::string const &formula, std::string const &args)
Definition: CombineHarvester_Creation.cc:76
ch::CombineHarvester::AddProcesses
void AddProcesses(std::vector< std::string > mass, std::vector< std::string > analysis, std::vector< std::string > era, std::vector< std::string > channel, std::vector< std::string > procs, ch::Categories bin, bool signal)
Definition: CombineHarvester_Creation.cc:45
ch::Object::analysis
virtual std::string const & analysis() const
Definition: Object.h:26
ch::CombineHarvester::ExtractShapes
void ExtractShapes(std::string const &file, std::string const &rule, std::string const &syst_rule)
Definition: CombineHarvester_Creation.cc:147
ch::BinByBinFactory::SetVerbosity
BinByBinFactory & SetVerbosity(unsigned verbosity)
By default this class only produces output on the screen when an error occurs, set to a value greater...
Definition: BinByBin.h:90
ch::Object::mass
virtual std::string const & mass() const
Definition: Object.h:38
ch::CombineHarvester::MergeBinErrors
void MergeBinErrors(double bbb_threshold, double merge_threshold)
Merge bin errors within a bin.
Definition: CombineHarvester_Creation.cc:236
Systematic.h
ch
Definition: Algorithm.h:10
ch::CombineHarvester::InsertSystematic
void InsertSystematic(ch::Systematic const &sys)
Definition: CombineHarvester_Creation.cc:253
ch::Systematic
Definition: Systematic.h:12
ch::Object::bin_id
virtual int bin_id() const
Definition: Object.h:35
ch::CombineHarvester::data
CombineHarvester & data()
Definition: CombineHarvester_Filters.cc:183
ch::CombineHarvester::RenameSystematic
void RenameSystematic(CombineHarvester &target, std::string const &old_name, std::string const &new_name)
Rename a systematic from 'old_name' to 'new_name' and add a parameter 'new_name' to CH instance 'targ...
Definition: CombineHarvester_Creation.cc:137
ch::CombineHarvester::bin
CombineHarvester & bin(std::vector< std::string > const &vec, bool cond=true)
Definition: CombineHarvester_Filters.cc:13
ch::CombineHarvester
Definition: CombineHarvester.h:30
ch::CombineHarvester::ExtractPdfs
void ExtractPdfs(CombineHarvester &target, std::string const &ws_name, std::string const &rule, std::string norm_rule="")
Definition: CombineHarvester_Creation.cc:181
ch::CombineHarvester::AddObservations
void AddObservations(std::vector< std::string > mass, std::vector< std::string > analysis, std::vector< std::string > era, std::vector< std::string > channel, ch::Categories bin)
Definition: CombineHarvester_Creation.cc:20
ch::BinByBinFactory
Merges bin uncertainties and creates bin-by-bin statistical uncertainties.
Definition: BinByBin.h:21
CombineHarvester.h
Observation.h
ch::BinByBinFactory::SetFixNorm
BinByBinFactory & SetFixNorm(bool fix)
Whether or not the bin-by-bin systematics are allowed to vary the process normalisation.
Definition: BinByBin.h:124
ch::BinByBinFactory::MergeBinErrors
void MergeBinErrors(CombineHarvester &cb)
Merges histogram bin errors between processes.
Definition: BinByBin.cc:22
ch::Object::process
virtual std::string const & process() const
Definition: Object.h:20
ch::Object::attribute
virtual const std::string attribute(std::string const &attr_label) const
Definition: Object.h:44
Logging.h
ch::GenerateCombinations
std::vector< std::vector< unsigned > > GenerateCombinations(std::vector< unsigned > vec)
Definition: Utilities.cc:191
ch::SetProperties
void SetProperties(T *first, U const *second)
Definition: Utilities.h:59
ch::Observation
Definition: Observation.h:12