12 #include "TIterator.h" 18 #include "RooDataSet.h" 19 #include "RooArgSet.h" 20 #include "RooRealVar.h" 21 #include "RooWorkspace.h" 23 #include "RooStats/MarkovChain.h" 29 int main(
int argc,
char *argv[]){
30 for(
int iarg = 1; iarg < argc; ++iarg){
31 TFile file(argv[iarg],
"read");
32 if(!file.IsOpen())
continue;
33 RooWorkspace *w =
static_cast<RooWorkspace*
>(file.Get(
"w"));
34 if(w ==
nullptr)
continue;
35 RooDataSet *data =
GetData(file);
36 if(data ==
nullptr)
continue;
38 map<string, vector<double> > values;
39 vector<double> weights;
46 if(!file.IsOpen())
return nullptr;
47 TDirectory *dir =
static_cast<TDirectory*
>(file.Get(
"toys"));
48 if(dir ==
nullptr)
return nullptr;
49 TList *keys = dir->GetListOfKeys();
50 if(keys ==
nullptr)
return nullptr;
53 RooDataSet *data =
nullptr;
54 while((key = static_cast<TKey*>(next_key()))){
55 if(key->GetClassName() != string(
"RooStats::MarkovChain"))
continue;
56 RooStats::MarkovChain *mcmc =
static_cast<RooStats::MarkovChain*
>(key->ReadObj());
57 if(mcmc ==
nullptr)
continue;
58 RooDataSet *this_data =
static_cast<RooDataSet*
>(mcmc->GetAsDataSet());
59 if(this_data ==
nullptr)
continue;
63 data->append(*this_data);
71 map<
string, vector<double> > &values,
72 vector<double> &weights){
76 int num_entries = data.numEntries();
77 Timer timer(num_entries, 1.);
79 for(
int entry = 0; entry < num_entries; ++entry){
81 const RooArgSet *
args =
static_cast<const RooArgSet*
>(data.get(entry));
82 TIterator *iter = args->createIterator();
83 for(; iter !=
nullptr && *(*iter) !=
nullptr; iter->Next()){
84 RooRealVar *var =
static_cast<RooRealVar*
>(*(*iter));
85 if(var ==
nullptr)
continue;
86 RooRealVar *wvar = w.var(var->GetName());
87 if(wvar ==
nullptr)
continue;
88 wvar->setVal(var->getVal());
91 weights.push_back(data.weight());
97 const RooWorkspace &w){
104 const RooArgSet &
args){
105 TIterator *iter = args.createIterator();
106 for(; iter !=
nullptr && *(*iter) !=
nullptr; iter->Next()){
107 RooRealVar *var =
static_cast<RooRealVar*
>(*(*iter));
108 if(var ==
nullptr)
continue;
109 values[var->GetName()].push_back(var->getVal());
117 void MakePlots(
const map<
string, vector<double> > &values,
118 const vector<double> &weights){
119 for(
auto var = values.cbegin();
120 var != values.cend();
122 MakePlot(var->first, var->second, weights);
127 const vector<double> &weights){
128 int num_bins = TMath::Nint(sqrt(static_cast<double>(values.size())));
129 if(num_bins < 1) num_bins = 1;
130 if(num_bins > 100) num_bins = 100;
131 double min_val = *min_element(values.cbegin(), values.cend());
132 double max_val = *max_element(values.cbegin(), values.cend());
134 TH1D h((
"hist_"+name).c_str(), (name+
";"+name+
";").c_str(),
135 num_bins, min_val, max_val);
137 size_t num_entries = min(values.size(), weights.size());
138 for(
size_t entry = 0; entry < num_entries; ++entry){
139 h.Fill(values.at(entry), weights.at(entry));
144 canvas.Print((
"hist_"+name+
"_lin.pdf").c_str());
147 canvas.Print((
"hist_"+name+
"_log.pdf").c_str());
void MakePlots(const map< string, vector< double > > &values, const vector< double > &weights)
void FillValues(map< string, vector< double > > &values, const RooWorkspace &w)
void MakePlot(const string &name, const vector< double > &values, const vector< double > &weights)
int main(int argc, char *argv[])
RooDataSet * GetData(TFile &file)
void GetValues(RooWorkspace &w, RooDataSet &data, map< string, vector< double > > &values, vector< double > &weights)