MStringS::MStringS(const VString string){ int size=string.size(); if (!size) {data=0; return ;} data=(short*)new char[size*2+2]; //MString ret; ret.Reserv(size); for(int i=0; i<size; i++) data[i]=ctos(string[i]); sz=size; data[sz]=0; return ; }
void Utils::CLogger::SetInstanceFilter( VString& filterList ) { // 删除Root的Appender,等于不输出任何信息 log4cplus::Logger rootLogger = log4cplus::Logger::getRoot(); rootLogger.removeAllAppenders(); // 设置要求输出的Instance size_t iCount=filterList.size(); for ( size_t i=0; i<iCount; i++) { log4cplus::Logger logger = log4cplus::Logger::getInstance(filterList[i].GetString()); logger.addAppender(GetAppender()); #ifdef _DEBUG logger.addAppender(GetDebugAppender()); #endif // _DEBUG } }
VString VStringList::join(const VString &separator) const { int l = size()-1; VString ret; // немного ускоряем работу ret.reserve(l * separator.size()); for(int i=0; i<l; ++i) { ret.append(at(i)); ret.append(separator); } if(!isEmpty()) ret.append(at(size()-1)); return ret; }
int main() { ch::CombineHarvester cb; typedef vector<pair<int, string>> Categories; typedef vector<string> VString; string auxiliaries = string(getenv("CMSSW_BASE")) + "/src/auxiliaries/"; string aux_shapes = auxiliaries +"shapes/"; string aux_pruning = auxiliaries +"pruning/"; string input_dir = string(getenv("CMSSW_BASE")) + "/src/CombineHarvester/CombineTools/input"; VString chns = {"et", "mt", "em", "ee", "mm", "tt"}; map<string, string> input_folders = { {"et", "Imperial"}, {"mt", "Imperial"}, {"em", "MIT"}, {"ee", "DESY-KIT"}, {"mm", "DESY-KIT"}, {"tt", "CERN"} }; map<string, VString> bkg_procs; bkg_procs["et"] = {"ZTT", "W", "QCD", "ZL", "ZJ", "TT", "VV"}; bkg_procs["mt"] = {"ZTT", "W", "QCD", "ZL", "ZJ", "TT", "VV"}; bkg_procs["em"] = {"Ztt", "EWK", "Fakes", "ttbar", "ggH_hww125", "qqH_hww125"}; bkg_procs["ee"] = {"ZTT", "WJets", "QCD", "ZEE", "TTJ", "Dibosons", "ggH_hww125", "qqH_hww125"}; bkg_procs["mm"] = {"ZTT", "WJets", "QCD", "ZMM", "TTJ", "Dibosons", "ggH_hww125", "qqH_hww125"}; bkg_procs["tt"] = {"ZTT", "W", "QCD", "ZL", "ZJ", "TT", "VV"}; VString sig_procs = {"ggH", "qqH", "WH", "ZH"}; map<string, Categories> cats; cats["et_7TeV"] = { {1, "eleTau_0jet_medium"}, {2, "eleTau_0jet_high"}, {3, "eleTau_1jet_medium"}, {5, "eleTau_1jet_high_mediumhiggs"}, {6, "eleTau_vbf"}}; cats["et_8TeV"] = { {1, "eleTau_0jet_medium"}, {2, "eleTau_0jet_high"}, {3, "eleTau_1jet_medium"}, {5, "eleTau_1jet_high_mediumhiggs"}, {6, "eleTau_vbf_loose"}, {7, "eleTau_vbf_tight"}}; cats["mt_7TeV"] = { {1, "muTau_0jet_medium"}, {2, "muTau_0jet_high"}, {3, "muTau_1jet_medium"}, {4, "muTau_1jet_high_lowhiggs"}, {5, "muTau_1jet_high_mediumhiggs"}, {6, "muTau_vbf"}}; cats["mt_8TeV"] = { {1, "muTau_0jet_medium"}, {2, "muTau_0jet_high"}, {3, "muTau_1jet_medium"}, {4, "muTau_1jet_high_lowhiggs"}, {5, "muTau_1jet_high_mediumhiggs"}, {6, "muTau_vbf_loose"}, {7, "muTau_vbf_tight"}}; cats["em_7TeV"] = { {0, "emu_0jet_low"}, {1, "emu_0jet_high"}, {2, "emu_1jet_low"}, {3, "emu_1jet_high"}, {4, "emu_vbf_loose"}}; cats["em_8TeV"] = { {0, "emu_0jet_low"}, {1, "emu_0jet_high"}, {2, "emu_1jet_low"}, {3, "emu_1jet_high"}, {4, "emu_vbf_loose"}, {5, "emu_vbf_tight"}}; cats["ee_7TeV"] = { {0, "ee_0jet_low"}, {1, "ee_0jet_high"}, {2, "ee_1jet_low"}, {3, "ee_1jet_high"}, {4, "ee_vbf"}}; cats["ee_8TeV"] = cats["ee_7TeV"]; cats["mm_7TeV"] = { {0, "mumu_0jet_low"}, {1, "mumu_0jet_high"}, {2, "mumu_1jet_low"}, {3, "mumu_1jet_high"}, {4, "mumu_vbf"}}; cats["mm_8TeV"] = cats["mm_7TeV"]; cats["tt_8TeV"] = { {0, "tauTau_1jet_high_mediumhiggs"}, {1, "tauTau_1jet_high_highhiggs"}, {2, "tauTau_vbf"}}; vector<string> masses = ch::ValsFromRange("110:145|5"); cout << ">> Creating processes and observations...\n"; for (string era : {"7TeV", "8TeV"}) { for (auto chn : chns) { cb.AddObservations( {"*"}, {"htt"}, {era}, {chn}, cats[chn+"_"+era]); cb.AddProcesses( {"*"}, {"htt"}, {era}, {chn}, bkg_procs[chn], cats[chn+"_"+era], false); cb.AddProcesses( masses, {"htt"}, {era}, {chn}, sig_procs, cats[chn+"_"+era], true); } } // Have to drop ZL from tautau_vbf category cb.FilterProcs([](ch::Process const* p) { return p->bin() == "tauTau_vbf" && p->process() == "ZL"; }); cout << ">> Adding systematic uncertainties...\n"; ch::AddSystematics_et_mt(cb); ch::AddSystematics_em(cb); ch::AddSystematics_ee_mm(cb); ch::AddSystematics_tt(cb); cout << ">> Extracting histograms from input root files...\n"; for (string era : {"7TeV", "8TeV"}) { for (string chn : chns) { // Skip 7TeV tt: if (chn == "tt" && era == "7TeV") continue; string file = aux_shapes + input_folders[chn] + "/htt_" + chn + ".inputs-sm-" + era + "-hcg.root"; cb.cp().channel({chn}).era({era}).backgrounds().ExtractShapes( file, "$BIN/$PROCESS", "$BIN/$PROCESS_$SYSTEMATIC"); cb.cp().channel({chn}).era({era}).signals().ExtractShapes( file, "$BIN/$PROCESS$MASS", "$BIN/$PROCESS$MASS_$SYSTEMATIC"); } } //! [part1] cout << ">> Scaling signal process rates...\n"; map<string, TGraph> xs; // Get the table of H->tau tau BRs vs mass xs["htt"] = ch::TGraphFromTable(input_dir+"/xsecs_brs/htt_YR3.txt", "mH", "br"); for (string const& e : {"7TeV", "8TeV"}) { for (string const& p : sig_procs) { // Get the table of xsecs vs mass for process "p" and era "e": xs[p+"_"+e] = ch::TGraphFromTable(input_dir+"/xsecs_brs/"+p+"_"+e+"_YR3.txt", "mH", "xsec"); cout << ">>>> Scaling for process " << p << " and era " << e << "\n"; cb.cp().process({p}).era({e}).ForEachProc([&](ch::Process *proc) { double m = boost::lexical_cast<double>(proc->mass()); proc->set_rate(proc->rate() * xs[p+"_"+e].Eval(m) * xs["htt"].Eval(m)); }); } } //! [part1] xs["hww_over_htt"] = ch::TGraphFromTable(input_dir+"/xsecs_brs/hww_over_htt.txt", "mH", "ratio"); for (string const& e : {"7TeV", "8TeV"}) { for (string const& p : {"ggH", "qqH"}) { cb.cp().channel({"em"}).process({p+"_hww125"}).era({e}) .ForEachProc([&](ch::Process *proc) { proc->set_rate(proc->rate() * xs[p+"_"+e].Eval(125.) * xs["htt"].Eval(125.)); proc->set_rate(proc->rate() * xs["hww_over_htt"].Eval(125.)); }); } } cout << ">> Merging bin errors and generating bbb uncertainties...\n"; //! [part2] auto bbb = ch::BinByBinFactory() .SetAddThreshold(0.1) .SetMergeThreshold(0.5) .SetFixNorm(true); //! [part2] ch::CombineHarvester cb_et = cb.cp().channel({"et"}); bbb.MergeAndAdd(cb_et.cp().era({"7TeV"}).bin_id({1, 2}).process({"ZL", "ZJ", "QCD", "W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"7TeV"}).bin_id({3, 5}).process({"W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"8TeV"}).bin_id({1, 2}).process({"ZL", "ZJ", "QCD", "W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"8TeV"}).bin_id({3, 5}).process({"W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"7TeV"}).bin_id({6}).process({"ZL", "ZJ", "W", "ZTT"}), cb); //! [part3] bbb.MergeAndAdd(cb_et.cp().era({"8TeV"}).bin_id({6}).process({"ZL", "ZJ", "W"}), cb); //! [part3] bbb.MergeAndAdd(cb_et.cp().era({"8TeV"}).bin_id({7}).process({"ZL", "ZJ", "W", "ZTT"}), cb); ch::CombineHarvester cb_mt = cb.cp().channel({"mt"}); bbb.MergeAndAdd(cb_mt.cp().era({"7TeV"}).bin_id({1, 2, 3, 4}).process({"W", "QCD"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"8TeV"}).bin_id({1, 2, 3, 4}).process({"W", "QCD"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"7TeV"}).bin_id({5}).process({"W"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"7TeV"}).bin_id({6}).process({"W", "ZTT"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"8TeV"}).bin_id({5, 6}).process({"W"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"8TeV"}).bin_id({7}).process({"W", "ZTT"}), cb); ch::CombineHarvester cb_em = cb.cp().channel({"em"}); bbb.MergeAndAdd(cb_em.cp().era({"7TeV"}).bin_id({1, 3}).process({"Fakes"}), cb); bbb.MergeAndAdd(cb_em.cp().era({"8TeV"}).bin_id({1, 3}).process({"Fakes"}), cb); bbb.MergeAndAdd(cb_em.cp().era({"7TeV"}).bin_id({4}).process({"Fakes", "EWK", "Ztt"}), cb); bbb.MergeAndAdd(cb_em.cp().era({"8TeV"}).bin_id({5}).process({"Fakes", "EWK", "Ztt"}), cb); bbb.MergeAndAdd(cb_em.cp().era({"8TeV"}).bin_id({4}).process({"Fakes", "EWK"}), cb); ch::CombineHarvester cb_tt = cb.cp().channel({"tt"}); bbb.MergeAndAdd(cb_tt.cp().era({"8TeV"}).bin_id({0, 1, 2}).process({"ZTT", "QCD"}), cb); bbb.SetAddThreshold(0.); // ee and mm use a different threshold ch::CombineHarvester cb_ll = cb.cp().channel({"ee", "mm"}); bbb.MergeAndAdd(cb_ll.cp().era({"7TeV"}).bin_id({1, 3, 4}).process({"ZTT", "ZEE", "ZMM", "TTJ"}), cb); bbb.MergeAndAdd(cb_ll.cp().era({"8TeV"}).bin_id({1, 3, 4}).process({"ZTT", "ZEE", "ZMM", "TTJ"}), cb); cout << ">> Setting standardised bin names...\n"; ch::SetStandardBinNames(cb); //! [part4] VString droplist = ch::ParseFileLines( aux_pruning + "uncertainty-pruning-drop-131128-sm.txt"); cout << ">> Droplist contains " << droplist.size() << " entries\n"; set<string> to_drop; for (auto x : droplist) to_drop.insert(x); auto pre_drop = cb.syst_name_set(); cb.syst_name(droplist, false); auto post_drop = cb.syst_name_set(); cout << ">> Systematics dropped: " << pre_drop.size() - post_drop.size() << "\n"; //! [part4] // The following is an example of duplicating existing objects and modifying // them in the process. Here we clone all mH=125 signals, adding "_SM125" to // the process name, switching it to background and giving it the generic mass // label. This would let us create a datacard for doing a second Higgs search // ch::CloneProcsAndSysts(cb.cp().signals().mass({"125"}), cb, // [](ch::Object* p) { // p->set_process(p->process() + "_SM125"); // p->set_signal(false); // p->set_mass("*"); // }); // Writing datacards manually - easier with CardWriter below: // string folder = "output/sm_cards/LIMITS"; // boost::filesystem::create_directories(folder); // boost::filesystem::create_directories(folder + "/common"); // for (auto m : masses) { // boost::filesystem::create_directories(folder + "/" + m); // } // for (string chn : chns) { // TFile output((folder + "/common/htt_" + chn + ".input.root").c_str(), // "RECREATE"); // auto bins = cb.cp().channel({chn}).bin_set(); // for (auto b : bins) { // for (auto m : masses) { // cout << ">> Writing datacard for bin: " << b << " and mass: " << m // << "\r" << flush; // cb.cp().channel({chn}).bin({b}).mass({m, "*"}).WriteDatacard( // folder + "/" + m + "/" + b + ".txt", output); // } // } // output.Close(); // } // Here we define a CardWriter with a template for how the text datacard // and the root files should be named. ch::CardWriter writer("$TAG/$MASS/$ANALYSIS_$CHANNEL_$BINID_$ERA.txt", "$TAG/common/$ANALYSIS_$CHANNEL.input_$ERA.root"); // writer.SetVerbosity(1); writer.WriteCards("output/sm_cards/cmb", cb); for (auto chn : cb.channel_set()) { writer.WriteCards("output/sm_cards/" + chn, cb.cp().channel({chn})); } cout << "\n>> Done!\n"; }
int main() { ch::CombineHarvester cb; // cb.SetVerbosity(1); typedef vector<pair<int, string>> Categories; typedef vector<string> VString; string auxiliaries = string(getenv("CMSSW_BASE")) + "/src/auxiliaries/"; string aux_shapes = auxiliaries +"shapes/"; string aux_pruning = auxiliaries +"pruning/"; string input_dir = string(getenv("CMSSW_BASE")) + "/src/CombineHarvester/CombineTools/input"; VString chns = {"et", "mt", "em", "ee", "mm", "tt"}; map<string, string> input_folders = { {"et", "Imperial"}, {"mt", "Imperial"}, {"em", "MIT"}, {"ee", "DESY-KIT"}, {"mm", "DESY-KIT"}, {"tt", "CERN"} }; map<string, string> sig_shape_map = { {"et", "_fine_binning"}, {"mt", "_fine_binning"}, {"em", ""}, {"ee", ""}, {"mm", ""}, {"tt", "_fine_binning"} }; map<string, VString> bkg_procs; bkg_procs["et"] = {"ZTT", "W", "QCD", "ZL", "ZJ", "TT", "VV"}; bkg_procs["mt"] = {"ZTT", "W", "QCD", "ZL", "ZJ", "TT", "VV"}; bkg_procs["em"] = {"Ztt", "EWK", "Fakes", "ttbar", "ggH_hww125", "qqH_hww125"}; bkg_procs["ee"] = {"ZTT", "WJets", "QCD", "ZEE", "TTJ", "Dibosons", "ggH_hww125", "qqH_hww125"}; bkg_procs["mm"] = {"ZTT", "WJets", "QCD", "ZMM", "TTJ", "Dibosons", "ggH_hww125", "qqH_hww125"}; bkg_procs["tt"] = {"ZTT", "W", "QCD", "ZL", "ZJ", "TT", "VV"}; VString sig_procs = {"ggH", "qqH", "WH", "ZH"}; map<string, Categories> cats; cats["et_7TeV"] = { {1, "eleTau_0jet_medium"}, {2, "eleTau_0jet_high"}, {3, "eleTau_1jet_medium"}, {5, "eleTau_1jet_high_mediumhiggs"}, {6, "eleTau_vbf"} }; cats["et_8TeV"] = { {1, "eleTau_0jet_medium"}, {2, "eleTau_0jet_high"}, {3, "eleTau_1jet_medium"}, {5, "eleTau_1jet_high_mediumhiggs"}, {6, "eleTau_vbf_loose"}, {7, "eleTau_vbf_tight"} }; cats["mt_7TeV"] = { {1, "muTau_0jet_medium"}, {2, "muTau_0jet_high"}, {3, "muTau_1jet_medium"}, {4, "muTau_1jet_high_lowhiggs"}, {5, "muTau_1jet_high_mediumhiggs"}, {6, "muTau_vbf"} }; cats["mt_8TeV"] = { {1, "muTau_0jet_medium"}, {2, "muTau_0jet_high"}, {3, "muTau_1jet_medium"}, {4, "muTau_1jet_high_lowhiggs"}, {5, "muTau_1jet_high_mediumhiggs"}, {6, "muTau_vbf_loose"}, {7, "muTau_vbf_tight"} }; cats["em_7TeV"] = { {0, "emu_0jet_low"}, {1, "emu_0jet_high"}, {2, "emu_1jet_low"}, {3, "emu_1jet_high"}, {4, "emu_vbf_loose"} }; cats["em_8TeV"] = { {0, "emu_0jet_low"}, {1, "emu_0jet_high"}, {2, "emu_1jet_low"}, {3, "emu_1jet_high"}, {4, "emu_vbf_loose"}, {5, "emu_vbf_tight"} }; cats["ee_7TeV"] = { {0, "ee_0jet_low"}, {1, "ee_0jet_high"}, {2, "ee_1jet_low"}, {3, "ee_1jet_high"}, {4, "ee_vbf"} }; cats["ee_8TeV"] = cats["ee_7TeV"]; cats["mm_7TeV"] = { {0, "mumu_0jet_low"}, {1, "mumu_0jet_high"}, {2, "mumu_1jet_low"}, {3, "mumu_1jet_high"}, {4, "mumu_vbf"} }; cats["mm_8TeV"] = cats["mm_7TeV"]; cats["tt_8TeV"] = { {0, "tauTau_1jet_high_mediumhiggs"}, {1, "tauTau_1jet_high_highhiggs"}, {2, "tauTau_vbf"} }; vector<string> masses = ch::ValsFromRange("110:145|5"); cout << ">> Creating processes and observations...\n"; for (string era : { "7TeV", "8TeV" }) { for (auto chn : chns) { cb.AddObservations( {"*"}, {"htt"}, {era}, {chn}, cats[chn+"_"+era]); cb.AddProcesses( {"*"}, {"htt"}, {era}, {chn}, bkg_procs[chn], cats[chn+"_"+era], false); cb.AddProcesses( masses, {"htt"}, {era}, {chn}, sig_procs, cats[chn+"_"+era], true); } } // Have to drop ZL from tautau_vbf category cb.FilterProcs([](ch::Process const* p) { return p->bin() == "tauTau_vbf" && p->process() == "ZL"; }); cout << ">> Adding systematic uncertainties...\n"; ch::AddSystematics_et_mt(cb); ch::AddSystematics_em(cb); ch::AddSystematics_ee_mm(cb); ch::AddSystematics_tt(cb); cout << ">> Extracting histograms from input root files...\n"; for (string era : { "7TeV", "8TeV" }) { for (string chn : chns) { // Skip 7TeV tt: if (chn == "tt" && era == "7TeV") continue; string file = aux_shapes + input_folders[chn] + "/htt_" + chn + ".inputs-sm-" + era + "-hcg.root"; string ext = sig_shape_map[chn]; cb.cp().channel({chn}).era({era}).backgrounds().ExtractShapes( file, "$BIN/$PROCESS", "$BIN/$PROCESS_$SYSTEMATIC"); cb.cp().channel({chn}).era({era}).signals().ExtractShapes( file, "$BIN/$PROCESS$MASS"+ext, "$BIN/$PROCESS$MASS_$SYSTEMATIC"+ext); } } cout << ">> Scaling signal process rates...\n"; map<string, TGraph> xs; // Get the table of H->tau tau BRs vs mass xs["htt"] = ch::TGraphFromTable(input_dir+"/xsecs_brs/htt_YR3.txt", "mH", "br"); for (string const& e : { "7TeV", "8TeV" }) { for (string const& p : sig_procs) { // Get the table of xsecs vs mass for process "p" and era "e": xs[p+"_"+e] = ch::TGraphFromTable(input_dir+"/xsecs_brs/"+p+"_"+e+"_YR3.txt", "mH", "xsec"); cout << ">>>> Scaling for process " << p << " and era " << e << "\n"; cb.cp().process({p}).era({e}).ForEachProc([&](ch::Process *proc) { double m = boost::lexical_cast<double>(proc->mass()); proc->set_rate(proc->rate() * xs[p+"_"+e].Eval(m) * xs["htt"].Eval(m)); }); } } xs["hww_over_htt"] = ch::TGraphFromTable(input_dir+"/xsecs_brs/hww_over_htt.txt", "mH", "ratio"); for (string const& e : { "7TeV", "8TeV" }) { for (string const& p : { "ggH", "qqH" }) { cb.cp().channel({"em"}).process({p+"_hww125"}).era({e}) .ForEachProc([&](ch::Process *proc) { proc->set_rate(proc->rate() * xs[p+"_"+e].Eval(125.) * xs["htt"].Eval(125.)); proc->set_rate(proc->rate() * xs["hww_over_htt"].Eval(125.)); }); } } cout << ">> Merging bin errors and generating bbb uncertainties...\n"; auto bbb = ch::BinByBinFactory() .SetAddThreshold(0.1) .SetMergeThreshold(0.5) .SetFixNorm(true); ch::CombineHarvester cb_et = cb.cp().channel({"et"}); bbb.MergeAndAdd(cb_et.cp().era({"7TeV"}).bin_id({1, 2}).process({"ZL", "ZJ", "QCD", "W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"7TeV"}).bin_id({3, 5}).process({"W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"8TeV"}).bin_id({1, 2}).process({"ZL", "ZJ", "QCD", "W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"8TeV"}).bin_id({3, 5}).process({"W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"7TeV"}).bin_id({6}).process({"ZL", "ZJ", "W", "ZTT"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"8TeV"}).bin_id({6}).process({"ZL", "ZJ", "W"}), cb); bbb.MergeAndAdd(cb_et.cp().era({"8TeV"}).bin_id({7}).process({"ZL", "ZJ", "W", "ZTT"}), cb); ch::CombineHarvester cb_mt = cb.cp().channel({"mt"}); bbb.MergeAndAdd(cb_mt.cp().era({"7TeV"}).bin_id({1, 2, 3, 4}).process({"W", "QCD"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"8TeV"}).bin_id({1, 2, 3, 4}).process({"W", "QCD"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"7TeV"}).bin_id({5}).process({"W"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"7TeV"}).bin_id({6}).process({"W", "ZTT"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"8TeV"}).bin_id({5, 6}).process({"W"}), cb); bbb.MergeAndAdd(cb_mt.cp().era({"8TeV"}).bin_id({7}).process({"W", "ZTT"}), cb); ch::CombineHarvester cb_em = cb.cp().channel({"em"}); bbb.MergeAndAdd(cb_em.cp().era({"7TeV"}).bin_id({1, 3}).process({"Fakes"}), cb); bbb.MergeAndAdd(cb_em.cp().era({"8TeV"}).bin_id({1, 3}).process({"Fakes"}), cb); bbb.MergeAndAdd(cb_em.cp().era({"7TeV"}).bin_id({4}).process({"Fakes", "EWK", "Ztt"}), cb); bbb.MergeAndAdd(cb_em.cp().era({"8TeV"}).bin_id({5}).process({"Fakes", "EWK", "Ztt"}), cb); bbb.MergeAndAdd(cb_em.cp().era({"8TeV"}).bin_id({4}).process({"Fakes", "EWK"}), cb); ch::CombineHarvester cb_tt = cb.cp().channel({"tt"}); bbb.MergeAndAdd(cb_tt.cp().era({"8TeV"}).bin_id({0, 1, 2}).process({"ZTT", "QCD"}), cb); bbb.SetAddThreshold(0.); // ee and mm use a different threshold ch::CombineHarvester cb_ll = cb.cp().channel({"ee", "mm"}); bbb.MergeAndAdd(cb_ll.cp().era({"7TeV"}).bin_id({1, 3, 4}).process({"ZTT", "ZEE", "ZMM", "TTJ"}), cb); bbb.MergeAndAdd(cb_ll.cp().era({"8TeV"}).bin_id({1, 3, 4}).process({"ZTT", "ZEE", "ZMM", "TTJ"}), cb); cout << ">> Setting standardised bin names...\n"; ch::SetStandardBinNames(cb); VString droplist = ch::ParseFileLines( aux_pruning + "uncertainty-pruning-drop-131128-sm.txt"); cout << ">> Droplist contains " << droplist.size() << " entries\n"; set<string> to_drop; for (auto x : droplist) to_drop.insert(x); auto pre_drop = cb.syst_name_set(); cb.syst_name(droplist, false); auto post_drop = cb.syst_name_set(); cout << ">> Systematics dropped: " << pre_drop.size() - post_drop.size() << "\n"; map<string, bool> can_morph = { {"et", true}, {"mt", true}, {"em", true}, {"ee", false}, {"mm", false}, {"tt", true} }; RooWorkspace ws("htt", "htt"); RooRealVar mh("MH", "", 125, 90, 145); // TFile demo("htt_sm_morphing_debug.root", "RECREATE"); //! [part1] bool do_morphing = true; if (do_morphing) { // RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING); for (auto chn : chns) { auto bins = cb.cp().channel({chn}).bin_set(); for (auto bin : bins) { for (auto p : sig_procs) { ch::BuildRooMorphing(ws, cb, bin, p, mh, "norm", can_morph[chn], true, nullptr /*&demo*/); } } } // demo.Close(); cb.AddWorkspace(ws); cb.cp().signals().ExtractPdfs(cb, "htt", "$BIN_$PROCESS_morph"); //! [part1] string folder = "output/sm_cards_morphed"; boost::filesystem::create_directories(folder); TFile output((folder + "/htt.input.root").c_str(), "RECREATE"); for (string chn : chns) { boost::filesystem::create_directories(folder+"/"+chn); //Use CH to create combined card for each channel cb.cp().channel({chn}).mass({"*"}).WriteDatacard( folder + "/" + chn + "/combinedCard.txt", output); auto bins = cb.cp().channel({chn}).bin_set(); for (auto b : bins) { cout << ">> Writing datacard for bin: " << b << "\r" << flush; //Also print individual datacards for each category of each channel boost::filesystem::create_directories(folder+"/"+chn); cb.cp().channel({chn}).bin({b}).mass({"*"}).WriteDatacard( folder + "/" + chn + "/" + b + ".txt", output); //Also print individual datacards for each category of each channel in the combined directory boost::filesystem::create_directories(folder+"/cmb"); cb.cp().channel({chn}).bin({b}).mass({"*"}).WriteDatacard( folder + "/cmb/"+ b + ".txt", output); } } //Use CH to create combined card for full combination cb.cp().mass({"*"}).WriteDatacard( folder + "/cmb/combinedCard.txt", output); output.Close(); cout << "\n>> Done!\n"; } }
VBOOL VLogicModel::_setEntityMaterial(const VString &entityName, const VString &matName) { if (matName.empty()) { return VTRUE; } else { VEntityMap::iterator itr = mEntities.find(entityName); if (itr == mEntities.end()) { Ogre::LogManager::getSingleton().logMessage( "Logic Model Entity with name '" + entityName + "' dosen't exists! " + "LogicModel::_setEntityMaterial " + mName ); return VFALSE; } VEntityValue &entValue = itr->second; Ogre::Entity *entity = entValue.mEntity; assert(entity); if (matName.find(";") != VString::npos) { Ogre::StringVector matNames = Ogre::StringUtil::split(matName, ";"); assert(matName.size() > 1); for (VUINT32 i = 0; i < entity->getNumSubEntities(); ++i) { Ogre::SubEntity *subEntity = entity->getSubEntity(i); assert(subEntity); VString subMatName; if (i < matNames.size()) { subMatName = matNames[i]; } else { subMatName = matNames[0]; } const Ogre::MaterialPtr subMat = Ogre::MaterialManager::getSingleton().getByName(subMatName); if (!subMat.isNull()) { subEntity->setMaterialName(subMatName); } } } else { const Ogre::MaterialPtr entityMat = Ogre::MaterialManager::getSingleton().getByName(matName); if (!entityMat.isNull()) { entity->setMaterialName(matName); } } } return VTRUE; }