3 bool PASS() {
return true; }
13 iseventlistbooked(
false),
17 cutflow_booked(
false) {
28 iseventlistbooked(
false),
32 cutflow_booked(
false) {
38 if (booked_histograms.size() > 0) {
39 for (
auto& [
k,
v] : booked_histograms) {
43 if (booked_2dhistograms.size() > 0) {
44 for (
auto& [
k,
v] : booked_2dhistograms) {
52 if (cuttreemap.find(
n.Data()) == cuttreemap.end())
53 cuttreemap[
n.Data()] = cuttree.getCutPointer(
n);
55 error(TString::Format(
"Cut %s already exists! no duplicate cut names allowed!",
n.Data()));
82 last_active_cut->addCut(
n);
99 last_active_cut->addCut(
n);
109 c->parent->children.erase(
std::find(
c->parent->children.begin(),
c->parent->children.end(),
c));
110 cuttreemap.erase(cuttreemap.find(
n.Data()));
116 std::vector<TString> to_not_remove;
118 std::vector<TString>
cutlist = cuttree.getCutList(
n);
120 to_not_remove.push_back(
cut);
125 std::vector<TString>
cutlist = cuttree.getCutList(
n);
126 for (
unsigned int i = 0;
i <
cutlist.size() - 1; ++
i) {
128 std::vector<RooUtil::CutTree*> toremove;
131 if (
std::find(to_not_remove.begin(), to_not_remove.end(),
child->name) == to_not_remove.end())
132 toremove.push_back(
child);
135 for (
auto&
child : toremove) {
137 cuttreemap.erase(cuttreemap.find(
child->name.Data()));
152 for (
auto& cutname : cutlists[
region]) {
153 cuttreelists[
region].push_back(cuttreemap[cutname.Data()]);
160 if (
std::find(cutflow_nofill_cut_list.begin(), cutflow_nofill_cut_list.end(),
n) == cutflow_nofill_cut_list.end())
161 cutflow_nofill_cut_list.push_back(
n);
168 t =
new TTree(
"cut_tree",
"cut_tree");
176 createWgtSystBranches();
182 if (cutflow_booked) {
183 error(
"bookCutflowHistograms():: cutflows already booked! yet you called again to book it! Check your user code!");
185 cutflow_booked =
true;
186 bookCutflowHistograms_v1();
194 for (
auto& cuttreelist : cuttreelists) {
195 THist*
h =
new THist(cuttreelist.first +
"_cutflow",
"", cuttreelist.second.size(), 0, cuttreelist.second.size());
197 new THist(cuttreelist.first +
"_rawcutflow",
"", cuttreelist.second.size(), 0, cuttreelist.second.size());
201 h_raw->SetDirectory(0);
202 std::vector<int*> passes;
204 for (
auto&
ct : cuttreelist.second) {
205 passes.push_back(&(
ct->pass));
208 cutflow_histograms_v2.push_back(std::make_tuple(
h, passes,
weights,
UNITY));
209 rawcutflow_histograms_v2.push_back(std::make_tuple(h_raw, passes));
213 for (
auto& syst : systs) {
214 for (
auto& cuttreelist : cuttreelists) {
216 new THist(cuttreelist.first + syst +
"_cutflow",
"", cuttreelist.second.size(), 0, cuttreelist.second.size());
218 cuttreelist.first + syst +
"_rawcutflow",
"", cuttreelist.second.size(), 0, cuttreelist.second.size());
222 h_raw->SetDirectory(0);
223 std::vector<int*> passes;
225 for (
auto&
ct : cuttreelist.second) {
226 passes.push_back(&(
ct->pass));
229 cutflow_histograms_v2.push_back(std::make_tuple(
h, passes,
weights, systs_funcs[syst]));
230 rawcutflow_histograms_v2.push_back(std::make_tuple(h_raw, passes));
235 for (
unsigned int i = 0;
i < cutsysts.size(); ++
i) {
236 TString cutsyst = cutsysts[
i];
237 for (
auto& cuttreelist : cuttreelists) {
239 cuttreelist.first + cutsyst +
"_cutflow",
"", cuttreelist.second.size(), 0, cuttreelist.second.size());
241 cuttreelist.first + cutsyst +
"_rawcutflow",
"", cuttreelist.second.size(), 0, cuttreelist.second.size());
245 h_raw->SetDirectory(0);
246 std::vector<int*> passes;
248 for (
auto&
ct : cuttreelist.second) {
249 passes.push_back(&(
ct->systpasses[
i]));
252 cutflow_histograms_v2.push_back(std::make_tuple(
h, passes,
weights,
UNITY));
253 rawcutflow_histograms_v2.push_back(std::make_tuple(h_raw, passes));
264 for (
auto& syst : systs) {
265 std::map<CUTFLOWMAPSTRING, THist*> cutflow_histograms_tmp;
266 std::map<CUTFLOWMAPSTRING, THist*> rawcutflow_histograms_tmp;
267 std::tie(cutflow_histograms_tmp, rawcutflow_histograms_tmp) =
269 cutflow_histograms.insert(cutflow_histograms_tmp.begin(), cutflow_histograms_tmp.end());
270 rawcutflow_histograms.insert(rawcutflow_histograms_tmp.begin(), rawcutflow_histograms_tmp.end());
273 for (
auto& cutsyst : cutsysts) {
274 std::map<CUTFLOWMAPSTRING, THist*> cutflow_histograms_tmp;
275 std::map<CUTFLOWMAPSTRING, THist*> rawcutflow_histograms_tmp;
276 std::tie(cutflow_histograms_tmp, rawcutflow_histograms_tmp) =
278 cutflow_histograms.insert(cutflow_histograms_tmp.begin(), cutflow_histograms_tmp.end());
279 rawcutflow_histograms.insert(rawcutflow_histograms_tmp.begin(), rawcutflow_histograms_tmp.end());
282 for (
auto& cutflow_histogram : cutflow_histograms) {
283 TString
msg =
"Booked cutflow histogram for cut = " + cutflow_histogram.first;
286 for (
auto& rawcutflow_histogram : rawcutflow_histograms) {
287 TString
msg =
"Booked rawcutflow histogram for cut = " + rawcutflow_histogram.first;
296 bookCutflowHistograms();
301 std::vector<TString>
regions = cuttree.getEndCuts();
304 bookCutflowHistograms();
312 TString
filename = ofile->GetName();
327 for (
auto& pair : booked_histograms)
328 pair.second->Write();
329 for (
auto& pair : booked_2dhistograms)
330 pair.second->Write();
344 cuttreemap[cutname.Data()]->pass_this_cut_func = pass;
345 cuttreemap[cutname.Data()]->weight_this_cut_func =
weight;
353 if (cuttreemap[cutname.Data()]->systs.find(syst) == cuttreemap[cutname.Data()]->systs.end()) {
355 TString::Format(
"setCutSyst():: Did not find syst=%s from the cut=%s! Did you actually book this syst for the " 356 "cut properly using addCutSyst() ?",
360 cuttreemap[cutname.Data()]->systs[syst]->pass_this_cut_func = pass;
361 cuttreemap[cutname.Data()]->systs[syst]->weight_this_cut_func =
weight;
369 TString
msg =
"No TTreeX object set, setCut() for " + cutname;
370 printSetFunctionError(
msg);
375 tx->setBranch<
bool>(cutname, pass,
false,
true);
376 tx->setBranch<
float>(cutname +
"_weight",
weight,
false,
true);
378 cuttreemap[cutname.Data()]->pass_this_cut = pass;
379 cuttreemap[cutname.Data()]->weight_this_cut =
weight;
386 TString
msg =
"No TTreeX object set, setCutSyst() for " + cutname +
", " + syst;
387 printSetFunctionError(
msg);
391 tx->setBranch<
bool>(cutname + syst, pass,
false,
true);
392 tx->setBranch<
float>(cutname + syst +
"_weight",
weight,
false,
true);
394 cuttreemap[cutname.Data()]->systs[syst]->pass_this_cut = pass;
395 cuttreemap[cutname.Data()]->systs[syst]->weight_this_cut =
weight;
399 #endif // USE_CUTLAMBDA 404 TString
msg =
"No TTreeX object set, setWgtSyst() for " + syst;
405 printSetFunctionError(
msg);
408 tx->setBranch<
float>(syst,
weight,
false,
true);
413 cutsysts.push_back(syst);
414 cuttree.addSyst(syst,
pattern, vetopattern);
420 systs.push_back(syst);
421 systs_funcs[syst] =
weight;
430 for (
auto& syst : systs) {
431 if (!tx->hasBranch<
float>(syst))
432 tx->createBranch<
float>(syst);
439 TString
msg =
"No TTreeX object set, setVariable() for " + varname;
440 printSetFunctionError(
msg);
443 tx->setBranch<
float>(varname,
val,
false,
true);
449 TString
msg =
"No TTreeX object set, setEventID()";
450 printSetFunctionError(
msg);
453 tx->setBranch<
int>(
"run",
run,
false,
true);
454 tx->setBranch<
int>(
"lumi",
lumi,
false,
true);
455 tx->setBranch<
unsigned long long>(
"evt", evt,
false,
true);
461 error(
"bookEventLists():: No TTreeX has been set. Forgot to call bookCutflows()?");
462 if (!tx->hasBranch<
int>(
"run"))
463 tx->createBranch<
int>(
"run");
464 if (!tx->hasBranch<
int>(
"lumi"))
465 tx->createBranch<
int>(
"lumi");
466 if (!tx->hasBranch<
unsigned long long>(
"evt"))
467 tx->createBranch<
unsigned long long>(
"evt");
468 iseventlistbooked =
true;
475 TString
msg =
"No TTreeX object set, fill()";
476 printSetFunctionError(
msg);
479 tx->setBranch<
bool>(
"Root", 1);
480 tx->setBranch<
float>(
"Root_weight", 1);
482 cuttreemap[
"Root"]->pass_this_cut = 1;
483 cuttreemap[
"Root"]->weight_this_cut = 1;
487 cuttree.evaluate(*tx,
"", iseventlistbooked);
493 for (
auto& syst : systs)
499 if (not doskipsysthist) {
501 for (
auto& syst : systs)
505 for (
auto& cutsyst : cutsysts) {
506 cuttree.evaluate(*tx, cutsyst, iseventlistbooked);
507 fillCutflows(cutsyst,
false);
508 if (not doskipsysthist)
526 for (
auto& pair : cutlists) {
527 const TString& region_name = pair.first;
528 std::vector<TString>&
cutlist = pair.second;
529 float wgtsyst = (!syst.IsNull() and iswgtsyst) ? systs_funcs[syst]() : 1;
531 cutflow_histograms[(region_name + syst).Data()],
532 rawcutflow_histograms[(region_name + syst).Data()],
539 for (
auto& pair : cuttreelists) {
540 const TString& region_name = pair.first;
541 std::vector<RooUtil::CutTree*>& cuttreelist = pair.second;
542 float wgtsyst = (!syst.IsNull() and iswgtsyst) ? systs_funcs[syst]() : 1;
543 fillCutflow_v2(cuttreelist,
544 cutflow_histograms[(region_name + syst).Data()],
545 rawcutflow_histograms[(region_name + syst).Data()],
552 for (
auto& pair : cutlists) {
553 const TString& region_name = pair.first;
554 std::vector<TString>&
cutlist = pair.second;
555 float wgtsyst = (!syst.IsNull() and iswgtsyst) ? tx->getBranch<
float>(syst) : 1;
557 cutflow_histograms[(region_name + syst).Data()],
558 rawcutflow_histograms[(region_name + syst).Data()],
566 for (
unsigned int i = 0;
i <
cutlist.size(); ++
i) {
567 int& pass = cuttreemap[
cutlist[
i].Data()]->pass;
583 for (
unsigned int i = 0;
i < cuttreelist.size(); ++
i) {
587 int& pass =
ct->pass;
601 float wgtsyst = (!syst.IsNull() and iswgtsyst) ? systs_funcs[syst]() : 1;
602 cuttree.fillHistograms(syst, wgtsyst);
604 float wgtsyst = (!syst.IsNull() and iswgtsyst) ? tx->getBranch<
float>(syst) : 1.;
605 cuttree.fillHistograms(*tx, syst, wgtsyst);
667 std::vector<TString>
regions = cuttree.getEndCuts();
686 TString varname =
key.first;
687 unsigned int nbin = std::get<0>(
key.second);
688 float min = std::get<1>(
key.second);
689 float max = std::get<2>(
key.second);
690 std::function<float()> vardef = std::get<3>(
key.second);
691 TString histname =
cut + syst +
"__" + varname;
692 if (booked_histograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data())) == booked_histograms.end()) {
693 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())] =
695 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->SetDirectory(0);
696 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->Sumw2();
698 booked_histograms_nominal_keys.push_back(std::make_tuple(
cut.Data(), syst.Data(), varname.Data()));
700 cuttreemap[
cut.Data()]->addHist1D(
701 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())], vardef, syst);
713 TString varname =
key.first;
714 unsigned int nbin = std::get<0>(
key.second);
715 float min = std::get<1>(
key.second);
716 float max = std::get<2>(
key.second);
717 std::function<std::vector<float>()> vardef = std::get<3>(
key.second);
718 std::function<std::vector<float>()> wgtdef = std::get<4>(
key.second);
719 TString histname =
cut + syst +
"__" + varname;
720 if (booked_histograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data())) == booked_histograms.end()) {
721 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())] =
723 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->SetDirectory(0);
724 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->Sumw2();
726 booked_histograms_nominal_keys.push_back(std::make_tuple(
cut.Data(), syst.Data(), varname.Data()));
728 cuttreemap[
cut.Data()]->addHist1DVec(
729 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())], vardef, wgtdef, syst);
737 TString varname =
key.first;
738 std::vector<float> boundaries = std::get<0>(
key.second);
739 std::function<float()> vardef = std::get<1>(
key.second);
740 TString histname =
cut + syst +
"__" + varname;
741 if (booked_histograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data())) == booked_histograms.end()) {
742 Float_t
bounds[boundaries.size()];
743 for (
unsigned int i = 0;
i < boundaries.size(); ++
i)
745 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())] =
746 new THist(histname,
"", boundaries.size() - 1,
bounds);
747 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->SetDirectory(0);
748 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->Sumw2();
750 booked_histograms_nominal_keys.push_back(std::make_tuple(
cut.Data(), syst.Data(), varname.Data()));
752 cuttreemap[
cut.Data()]->addHist1D(
753 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())], vardef, syst);
764 TString varname =
key.first;
765 std::vector<float> boundaries = std::get<0>(
key.second);
766 std::function<std::vector<float>()> vardef = std::get<1>(
key.second);
767 std::function<std::vector<float>()> wgtdef = std::get<2>(
key.second);
768 TString histname =
cut + syst +
"__" + varname;
769 if (booked_histograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data())) == booked_histograms.end()) {
770 Float_t
bounds[boundaries.size()];
771 for (
unsigned int i = 0;
i < boundaries.size(); ++
i)
773 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())] =
774 new THist(histname,
"", boundaries.size() - 1,
bounds);
775 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->SetDirectory(0);
776 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->Sumw2();
778 booked_histograms_nominal_keys.push_back(std::make_tuple(
cut.Data(), syst.Data(), varname.Data()));
780 cuttreemap[
cut.Data()]->addHist1DVec(
781 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())], vardef, wgtdef, syst);
788 std::pair<std::pair<TString, TString>,
792 TString varname =
key.first.first;
793 TString varnamey =
key.first.second;
794 unsigned int nbin = std::get<0>(
key.second);
795 float min = std::get<1>(
key.second);
796 float max = std::get<2>(
key.second);
797 unsigned int nbiny = std::get<3>(
key.second);
798 float miny = std::get<4>(
key.second);
799 float maxy = std::get<5>(
key.second);
800 std::function<float()> varxdef = std::get<6>(
key.second);
801 std::function<float()> varydef = std::get<7>(
key.second);
802 TString histname =
cut + syst +
"__" + varname +
"_v_" + varnamey;
803 if (booked_2dhistograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())) ==
804 booked_2dhistograms.end()) {
805 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())] =
806 new TH2F(histname,
"", nbin,
min,
max, nbiny, miny, maxy);
807 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())]->SetDirectory(0);
808 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())]->Sumw2();
810 booked_2dhistograms_nominal_keys.push_back(
811 std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data()));
813 cuttreemap[
cut.Data()]->addHist2D(
814 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())],
823 std::pair<std::pair<TString, TString>,
834 TString varname =
key.first.first;
835 TString varnamey =
key.first.second;
836 unsigned int nbin = std::get<0>(
key.second);
837 float min = std::get<1>(
key.second);
838 float max = std::get<2>(
key.second);
839 unsigned int nbiny = std::get<3>(
key.second);
840 float miny = std::get<4>(
key.second);
841 float maxy = std::get<5>(
key.second);
842 std::function<std::vector<float>()> varxdef = std::get<6>(
key.second);
843 std::function<std::vector<float>()> varydef = std::get<7>(
key.second);
844 std::function<std::vector<float>()> elemwgt = std::get<8>(
key.second);
845 TString histname =
cut + syst +
"__" + varname +
"_v_" + varnamey;
846 if (booked_2dhistograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())) ==
847 booked_2dhistograms.end()) {
848 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())] =
849 new TH2F(histname,
"", nbin,
min,
max, nbiny, miny, maxy);
850 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())]->SetDirectory(0);
851 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())]->Sumw2();
853 booked_2dhistograms_nominal_keys.push_back(
854 std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data()));
856 cuttreemap[
cut.Data()]->addHist2DVec(
857 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())],
866 std::pair<std::pair<TString, TString>,
875 TString varname =
key.first.first;
876 TString varnamey =
key.first.second;
877 std::vector<float> xboundaries = std::get<0>(
key.second);
878 unsigned int nbiny = std::get<1>(
key.second);
879 float miny = std::get<2>(
key.second);
880 float maxy = std::get<3>(
key.second);
881 std::function<std::vector<float>()> varxdef = std::get<4>(
key.second);
882 std::function<std::vector<float>()> varydef = std::get<5>(
key.second);
883 std::function<std::vector<float>()> elemwgt = std::get<6>(
key.second);
884 TString histname =
cut + syst +
"__" + varname +
"_v_" + varnamey;
885 if (booked_2dhistograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())) ==
886 booked_2dhistograms.end()) {
887 Double_t xbounds[xboundaries.size()];
888 for (
unsigned int i = 0;
i < xboundaries.size(); ++
i)
889 xbounds[
i] = xboundaries[
i];
890 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())] =
891 new TH2F(histname,
"", xboundaries.size() - 1, xbounds, nbiny, miny, maxy);
892 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())]->SetDirectory(0);
893 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())]->Sumw2();
895 booked_2dhistograms_nominal_keys.push_back(
896 std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data()));
898 cuttreemap[
cut.Data()]->addHist2DVec(
899 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())],
909 std::pair<TString, std::tuple<unsigned, float, float>>
key,
911 TString varname =
key.first;
912 unsigned int nbin = std::get<0>(
key.second);
913 float min = std::get<1>(
key.second);
914 float max = std::get<2>(
key.second);
915 TString histname =
cut + syst +
"__" + varname;
916 if (booked_histograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data())) == booked_histograms.end()) {
917 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())] =
919 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->SetDirectory(0);
920 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->Sumw2();
922 booked_histograms_nominal_keys.push_back(std::make_tuple(
cut.Data(), syst.Data(), varname.Data()));
925 error(
"bookHistogram():: No TTreeX has been set. Forgot to call bookCutflows()?");
926 if (!tx->hasBranch<
float>(varname))
927 tx->createBranch<
float>(varname);
928 cuttreemap[
cut.Data()]->addHist1D(
929 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())], varname, syst);
935 TString varname =
key.first;
936 std::vector<float> boundaries =
key.second;
937 TString histname =
cut + syst +
"__" + varname;
938 if (booked_histograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data())) == booked_histograms.end()) {
939 Float_t
bounds[boundaries.size()];
940 for (
unsigned int i = 0;
i < boundaries.size(); ++
i)
942 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())] =
943 new THist(histname,
"", boundaries.size() - 1,
bounds);
944 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->SetDirectory(0);
945 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())]->Sumw2();
947 booked_histograms_nominal_keys.push_back(std::make_tuple(
cut.Data(), syst.Data(), varname.Data()));
950 error(
"bookHistogram():: No TTreeX has been set. Forgot to call bookCutflows()?");
951 if (!tx->hasBranch<
float>(varname))
952 tx->createBranch<
float>(varname);
953 cuttreemap[
cut.Data()]->addHist1D(
954 booked_histograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data())], varname, syst);
961 std::pair<std::pair<TString, TString>, std::tuple<unsigned, float, float, unsigned, float, float>>
key,
963 TString varname =
key.first.first;
964 TString varnamey =
key.first.second;
965 unsigned int nbin = std::get<0>(
key.second);
966 float min = std::get<1>(
key.second);
967 float max = std::get<2>(
key.second);
968 unsigned int nbiny = std::get<0>(
key.second);
969 float miny = std::get<1>(
key.second);
970 float maxy = std::get<2>(
key.second);
971 TString histname =
cut + syst +
"__" + varname +
"_v_" + varnamey;
972 if (booked_2dhistograms.find(std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())) ==
973 booked_2dhistograms.end()) {
974 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())] =
975 new TH2F(histname,
"", nbin,
min,
max, nbiny, miny, maxy);
976 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())]->SetDirectory(0);
977 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())]->Sumw2();
979 booked_2dhistograms_nominal_keys.push_back(
980 std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data()));
983 error(
"book2DHistogram():: No TTreeX has been set. Forgot to call bookCutflows()?");
984 if (!tx->hasBranch<
float>(varname))
985 tx->createBranch<
float>(varname);
986 if (!tx->hasBranch<
float>(varnamey))
987 tx->createBranch<
float>(varnamey);
988 cuttreemap[
cut.Data()]->addHist2D(
989 booked_2dhistograms[std::make_tuple(
cut.Data(), syst.Data(), varname.Data(), varnamey.Data())],
1004 bookVecHistogram(
cut,
key);
1006 bookVecHistogram(
cut,
key);
1008 book2DHistogram(
cut,
key);
1010 book2DVecHistogram(
cut,
key);
1012 book2DVecHistogram(
cut,
key);
1013 if (not doskipsysthist) {
1014 for (
auto& syst : systs) {
1016 bookHistogram(
cut,
key, syst);
1018 bookHistogram(
cut,
key, syst);
1020 bookVecHistogram(
cut,
key, syst);
1022 bookVecHistogram(
cut,
key, syst);
1024 book2DHistogram(
cut,
key, syst);
1026 book2DVecHistogram(
cut,
key, syst);
1028 book2DVecHistogram(
cut,
key, syst);
1030 for (
auto& cutsyst : cutsysts) {
1032 bookHistogram(
cut,
key, cutsyst);
1034 bookHistogram(
cut,
key, cutsyst);
1036 bookVecHistogram(
cut,
key, cutsyst);
1038 bookVecHistogram(
cut,
key, cutsyst);
1040 book2DHistogram(
cut,
key, cutsyst);
1042 book2DVecHistogram(
cut,
key, cutsyst);
1044 book2DVecHistogram(
cut,
key, cutsyst);
1051 std::vector<TString>
cutlist = cuttree.getCutListBelow(
cut);
1059 error(
"bookHistogramsForCutAndAbove not yet implemented");
1064 std::vector<TString>
regions = cuttree.getEndCuts();
1078 if (seterrorcount < 100) {
1081 }
else if (seterrorcount == 100) {
1083 print(
"Suppressing Cutflow::set\"Func\"() errors ... ");
1092 for (
auto& pair : booked_histograms)
1093 pair.second->SetCanExtend(TH1::kAllAxes);
1102 #ifdef USE_CUTLAMBDA 1106 if (th1fs.find(
name) == th1fs.end()) {
1107 th1fs[
name] = std::make_tuple(
n,
min,
max, vardef);
1109 error(TString::Format(
"histogram already exists name = %s",
name.Data()));
1120 if (th1vecfs.find(
name) == th1vecfs.end()) {
1121 th1vecfs[
name] = std::make_tuple(
n,
min,
max, vardef, wgt);
1123 error(TString::Format(
"histogram already exists name = %s",
name.Data()));
1129 if (th1fs_varbin.find(
name) == th1fs_varbin.end()) {
1130 th1fs_varbin[
name] = std::make_tuple(boundaries, vardef);
1132 error(TString::Format(
"histogram already exists name = %s",
name.Data()));
1138 std::vector<float> boundaries,
1141 if (th1vecfs_varbin.find(
name) == th1vecfs_varbin.end()) {
1142 th1vecfs_varbin[
name] = std::make_tuple(boundaries, vardef, wgt);
1144 error(TString::Format(
"histogram already exists name = %s",
name.Data()));
1159 if (th2fs.find(std::make_pair(
name, namey)) == th2fs.end()) {
1160 th2fs[std::make_pair(
name, namey)] = std::make_tuple(
n,
min,
max, ny, miny, maxy, varxdef, varydef);
1162 error(TString::Format(
"histogram already exists name = %s", (
name +
"_v_" + namey).Data()));
1178 if (th2vecfs.find(std::make_pair(
name, namey)) == th2vecfs.end()) {
1179 th2vecfs[std::make_pair(
name, namey)] = std::make_tuple(
n,
min,
max, ny, miny, maxy, varxdef, varydef, elem_wgt);
1181 error(TString::Format(
"histogram already exists name = %s", (
name +
"_v_" + namey).Data()));
1187 std::vector<float> xboundaries,
1195 if (th2vecfs_xvarbin.find(std::make_pair(
name, namey)) == th2vecfs_xvarbin.end()) {
1196 th2vecfs_xvarbin[std::make_pair(
name, namey)] =
1197 std::make_tuple(xboundaries, ny, miny, maxy, varxdef, varydef, elem_wgt);
1199 error(TString::Format(
"histogram already exists name = %s", (
name +
"_v_" + namey).Data()));
1205 if (th1fs.find(
name) == th1fs.end())
1208 error(TString::Format(
"histogram already exists name = %s",
name.Data()));
1213 if (th1fs_varbin.find(
name) == th1fs_varbin.end())
1214 th1fs_varbin[
name] = boundaries;
1216 error(TString::Format(
"histogram already exists name = %s",
name.Data()));
1221 TString
name,
unsigned int n,
float min,
float max, TString namey,
unsigned int ny,
float miny,
float maxy) {
1222 if (th2fs.find(std::make_pair(
name, namey)) == th2fs.end())
1223 th2fs[std::make_pair(
name, namey)] = std::make_tuple(
n,
min,
max, ny, miny, maxy);
1225 error(TString::Format(
"histogram already exists name = %s", (
name +
"_v_" + namey).Data()));
void bookHistogramsForCutAndAbove(Histograms &histograms, TString)
void setVariable(TString varname, float)
void bookCutflowHistograms()
void setCut(TString cutname, std::function< bool()> pass, std::function< float()> weight)
void bookHistogramsForEndCuts(Histograms &histograms)
void bookHistogramsForCutAndBelow(Histograms &histograms, TString)
void fillCutflow(std::vector< TString > cutlist, RooUtil::TTreeX &tx, TH1D *h)
std::tuple< std::map< TString, TH1D * >, std::map< TString, TH1D * > > createCutflowHistograms(CutNameListMap &cutlists, TString syst="")
void addToCutTreeMap(TString n)
void removeCut(TString n)
void print(TString msg="", const char *fname="", int flush_before=0, int flush_after=0)
void bookCutflowHistograms_v1()
void saveCutflowHistograms(std::map< TString, TH1D *> &cutflows, std::map< TString, TH1D *> &rawcutflows)
void addHistogram(TString, unsigned int, float, float, std::function< float()>)
void book2DVecHistogram(TString, std::pair< std::pair< TString, TString >, std::tuple< unsigned, float, float, unsigned, float, float, std::function< std::vector< float >()>, std::function< std::vector< float >()>, std::function< std::vector< float >()>>>, TString="")
CutTree & getCut(TString n)
void setLastActiveCut(TString n)
void error(TString msg, const char *fname="", int is_error=1)
void setSaveTTreeX(bool=true)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void filterCuts(std::vector< TString > ns)
void setSkipSystematicHistograms(bool=true)
example_stream void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
void bookCutflowsForRegions(std::vector< TString > regions)
void fillCutflow(std::vector< TString > &cutlist, TH1D *h, TH1D *hraw, float wgtsyst=1)
void add2DHistogram(TString, unsigned int, float, float, TString, unsigned int, float, float, std::function< float()>, std::function< float()>)
void addCutSyst(TString syst, std::vector< TString > pattern, std::vector< TString > vetopattern=std::vector< TString >())
void fillCutflow_v2(std::vector< CutTree *> &cutlist, TH1D *h, TH1D *hraw, float wgtsyst=1)
void printSetFunctionError(TString msg)
key
prepare the HTCondor submission files and eventually submit them
void bookHistogram(TString, std::pair< TString, std::tuple< unsigned, float, float, std::function< float()>>>, TString="")
void createWgtSystBranches()
def saveHistograms(tdirectory, histos)
void bookHistogramsForCut(Histograms &histograms, TString)
void addVecHistogram(TString, unsigned int, float, float, std::function< std::vector< float >()>, std::function< std::vector< float >()> wgt=nullptr)
void add2DVecHistogram(TString, unsigned int, float, float, TString, unsigned int, float, float, std::function< std::vector< float >()>, std::function< std::vector< float >()>, std::function< std::vector< float >()> wgt=nullptr)
void setCutLists(std::vector< TString > regions)
void setCutSyst(TString cutname, TString syst, std::function< bool()> pass, std::function< float()> weight)
void bookVecHistogram(TString, std::pair< TString, std::tuple< unsigned, float, float, std::function< std::vector< float >()>, std::function< std::vector< float >()>>>, TString="")
void createCutflowBranches(CutNameListMap &cutlists, RooUtil::TTreeX &tx)
void bookCutflowHistograms_v2()
void book2DHistogram(TString, std::pair< std::pair< TString, TString >, std::tuple< unsigned, float, float, unsigned, float, float, std::function< float()>, std::function< float()>>>, TString="")
void addCutToSkipCutflowList(TString n)
void setHistsAxesExtendable()
void fillCutflows_v1(TString syst="", bool iswgtsyst=true)
void addCutToLastActiveCut(TString n, std::function< bool()> pass, std::function< float()> weight)
void fillHistograms(TString syst="", bool iswgtsyst=true)
void addWgtSyst(TString syst, std::function< float()>)
void setEventID(int, int, unsigned long long)
void fillCutflows(TString syst="", bool iswgtsyst=true)
void setWgtSyst(TString syst, float weight)
void bookHistograms(Histograms &histograms)
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
void fillCutflows_v2(TString syst="", bool iswgtsyst=true)
void addCut(TString n, std::function< bool()> pass, std::function< float()> weight)
std::map< std::string, CutTree * > cuttreemap