From c53e07ed11fccf83b1420a154e2a46bc2ef9c77f Mon Sep 17 00:00:00 2001 From: jmaurer Date: Thu, 23 Jan 2020 20:07:28 +0100 Subject: [PATCH 1/2] realEffObj() and fakeEffObj() now return const references instead of a copy --- .../AnalysisCommon/FakeBkgTools/FakeBkgTools/LhoodMMEvent.h | 4 ++-- .../AnalysisCommon/FakeBkgTools/Root/LhoodMMEvent.cxx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/FakeBkgTools/LhoodMMEvent.h b/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/FakeBkgTools/LhoodMMEvent.h index 1668b8ce9b0..5f00bac3bec 100644 --- a/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/FakeBkgTools/LhoodMMEvent.h +++ b/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/FakeBkgTools/LhoodMMEvent.h @@ -19,8 +19,8 @@ class LhoodMMEvent { unsigned nlep() const {return m_nlep;} float realEff(unsigned ilep, CP::BaseFakeBkgTool* tool = nullptr) const; float fakeEff(unsigned ilep, CP::BaseFakeBkgTool* tool = nullptr) const; - FakeBkgTools::Efficiency realEffObj(unsigned ilep) const; - FakeBkgTools::Efficiency fakeEffObj(unsigned ilep) const; + const FakeBkgTools::Efficiency& realEffObj(unsigned ilep) const; + const FakeBkgTools::Efficiency& fakeEffObj(unsigned ilep) const; bool isTight(unsigned ilep) const; int charge(unsigned ilep) const; diff --git a/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/Root/LhoodMMEvent.cxx b/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/Root/LhoodMMEvent.cxx index cdd1a7cbed1..164c9b04bf1 100644 --- a/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/Root/LhoodMMEvent.cxx +++ b/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/Root/LhoodMMEvent.cxx @@ -79,7 +79,7 @@ float LhoodMMEvent::fakeEff(unsigned ilep, BaseFakeBkgTool* tool) const { } -Efficiency LhoodMMEvent::realEffObj(unsigned ilep) const { +const Efficiency& LhoodMMEvent::realEffObj(unsigned ilep) const { if (ilep <= m_nlep) { return m_realEff[ilep]; } else { @@ -88,7 +88,7 @@ Efficiency LhoodMMEvent::realEffObj(unsigned ilep) const { } -Efficiency LhoodMMEvent::fakeEffObj(unsigned ilep) const { +const Efficiency& LhoodMMEvent::fakeEffObj(unsigned ilep) const { if (ilep <= m_nlep) { return m_fakeEff[ilep]; } else { -- GitLab From b94c68b123dec1ef53bb021f51a09d49fb3d29e6 Mon Sep 17 00:00:00 2001 From: jmaurer Date: Thu, 23 Jan 2020 20:10:24 +0100 Subject: [PATCH 2/2] usage of references instead of copies in saveProgress(); fix of small memory leaks in saveProgress(); properly account for ProgressFileDirectory property in mergeSubJobs() --- .../FakeBkgTools/Root/LhoodMM_tools.cxx | 88 +++++++++---------- 1 file changed, 40 insertions(+), 48 deletions(-) diff --git a/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/Root/LhoodMM_tools.cxx b/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/Root/LhoodMM_tools.cxx index 13e898dc144..799ddc0e641 100644 --- a/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/Root/LhoodMM_tools.cxx +++ b/PhysicsAnalysis/AnalysisCommon/FakeBkgTools/Root/LhoodMM_tools.cxx @@ -1643,7 +1643,7 @@ StatusCode LhoodMM_tools::saveProgress(TDirectory* dir) { dir->mkdir("histos_1d"); dir->cd("histos_1d"); - std::vector h1_val_addrs; + std::vector> h1_val_addrs; std::map>::iterator map1_iter; int i1dhist = 0; for (map1_iter=m_mmevts_1dhisto_map.begin(); map1_iter != m_mmevts_1dhisto_map.end(); map1_iter++) { @@ -1653,14 +1653,13 @@ StatusCode LhoodMM_tools::saveProgress(TDirectory* dir) { histogram->Write(); auto val_map_iter = m_values_1dhisto_map.find(map1_iter->first); - float* f = new float; - h1_val_addrs.push_back(f); + h1_val_addrs.emplace_back(new float); if (val_map_iter != m_values_1dhisto_map.end() ) { string histvarname = "h1d_val"; histvarname += std::to_string(i1dhist); i1dhist++; string histvartype = histvarname+"/F"; - t->Branch(histvarname.c_str(), f, histvartype.c_str()); + t->Branch(histvarname.c_str(), h1_val_addrs.back().get(), histvartype.c_str()); } else { ATH_MSG_ERROR("Could not find entry for histogram " << map1_iter->first); return StatusCode::FAILURE; @@ -1672,7 +1671,7 @@ StatusCode LhoodMM_tools::saveProgress(TDirectory* dir) { dir->mkdir("histos_2d"); dir->cd("histos_2d"); - std::vector h2_valx_addrs, h2_valy_addrs; + std::vector> h2_valx_addrs, h2_valy_addrs; int i2dhist = 0; std::map>::iterator map2_iter; for (map2_iter=m_mmevts_2dhisto_map.begin(); map2_iter != m_mmevts_2dhisto_map.end(); map2_iter++) { @@ -1682,19 +1681,17 @@ StatusCode LhoodMM_tools::saveProgress(TDirectory* dir) { histogram->Write(); auto val_map_iter = m_values_2dhisto_map.find(map2_iter->first); - float* fx = new float; - h2_valx_addrs.push_back(fx); - float* fy = new float; - h2_valy_addrs.push_back(fy); + h2_valx_addrs.emplace_back(new float); + h2_valy_addrs.emplace_back(new float); if (val_map_iter != m_values_2dhisto_map.end() ) { string histvarname = "h2d_valx"; histvarname += std::to_string(i2dhist); string histvartype = histvarname+"/F"; - t->Branch(histvarname.c_str(), fx, histvartype.c_str()); + t->Branch(histvarname.c_str(), h2_valx_addrs.back().get(), histvartype.c_str()); histvarname = "h2d_valy"; histvarname += std::to_string(i2dhist); i2dhist++; - t->Branch(histvarname.c_str(), fy, histvartype.c_str()); + t->Branch(histvarname.c_str(), h2_valy_addrs.back().get(), histvartype.c_str()); } else { ATH_MSG_ERROR("Could not find entry for histogram " << map1_iter->first); return StatusCode::FAILURE; @@ -1711,7 +1708,7 @@ StatusCode LhoodMM_tools::saveProgress(TDirectory* dir) { r_systDown.clear(); f_systDown.clear(); - LhoodMMEvent m = m_mmevts_total[ievt]; + const LhoodMMEvent& m = m_mmevts_total[ievt]; nlep = m.nlep(); weight = m.weight(); @@ -1720,38 +1717,32 @@ StatusCode LhoodMM_tools::saveProgress(TDirectory* dir) { fnominal[i] = m.fakeEff(i); tight[i] = m.isTight(i); charge[i] = m.charge(i); - boost::container::flat_map r = m.realEffObj(i).uncertainties; - std::vector r_systUIDvec = std::vector(); - std::vector r_systUpvec = std::vector(); - std::vector r_systDownvec = std::vector(); - for (const auto syst : r ) { - r_systUIDvec.push_back(syst.first); - r_systUpvec.push_back(syst.second.up); - r_systDownvec.push_back(syst.second.down); - } - r_systUID.push_back(r_systUIDvec); - r_systUp.push_back(r_systUpvec); - r_systDown.push_back(r_systDownvec); - - boost::container::flat_map f = m.fakeEffObj(i).uncertainties; - std::vector f_systUIDvec = std::vector(); - std::vector f_systUpvec = std::vector(); - std::vector f_systDownvec = std::vector(); + const boost::container::flat_map& r = m.realEffObj(i).uncertainties; + r_systUID.emplace_back(); + r_systUp.emplace_back(); + r_systDown.emplace_back(); + for (const auto& syst : r ) { + r_systUID.back().push_back(syst.first); + r_systUp.back().push_back(syst.second.up); + r_systDown.back().push_back(syst.second.down); + } + + const boost::container::flat_map& f = m.fakeEffObj(i).uncertainties; + f_systUID.emplace_back(); + f_systUp.emplace_back(); + f_systDown.emplace_back(); for (const auto& syst : f) { - f_systUIDvec.push_back(syst.first); - f_systUpvec.push_back(syst.second.up); - f_systDownvec.push_back(syst.second.down); - } - f_systUID.push_back(f_systUIDvec); - f_systUp.push_back(f_systUpvec); - f_systDown.push_back(f_systDownvec); + f_systUID.back().push_back(syst.first); + f_systUp.back().push_back(syst.second.up); + f_systDown.back().push_back(syst.second.down); + } } int ih1var = 0; auto map1_iter = m_mmevts_1dhisto_map.begin(); for (; map1_iter != m_mmevts_1dhisto_map.end(); map1_iter++) { - float *h1_var_addr = h1_val_addrs[ih1var]; - auto mmevts_vec = map1_iter->second; + float *h1_var_addr = h1_val_addrs[ih1var].get(); + auto& mmevts_vec = map1_iter->second; *h1_var_addr = mmevts_vec[ievt].aux(); ih1var++; } @@ -1759,9 +1750,9 @@ StatusCode LhoodMM_tools::saveProgress(TDirectory* dir) { int ih2var = 0; auto map2_iter = m_mmevts_2dhisto_map.begin(); for (; map2_iter != m_mmevts_2dhisto_map.end(); map2_iter++) { - float *h2_varx_addr = h2_valx_addrs[ih2var]; - float *h2_vary_addr = h2_valy_addrs[ih2var]; - auto mmevts_vec = map2_iter->second; + float *h2_varx_addr = h2_valx_addrs[ih2var].get(); + float *h2_vary_addr = h2_valy_addrs[ih2var].get(); + auto& mmevts_vec = map2_iter->second; *h2_varx_addr = mmevts_vec[ievt].aux(); *h2_vary_addr = mmevts_vec[ievt].aux2(); ih2var++; @@ -1793,7 +1784,9 @@ StatusCode LhoodMM_tools::mergeSubJobs() { } } - fin->cd("histos_1d"); + std::string prefix = (m_progressFileDirectory.length()? "/" + m_progressFileDirectory + "/" : ""); + + fin->cd((prefix + "histos_1d").c_str()); TIter nextkey(gDirectory->GetListOfKeys()); vector h1_val_addrs, h2_valx_addrs, h2_valy_addrs; while (TKey* key = (TKey*)nextkey()) { @@ -1804,8 +1797,7 @@ StatusCode LhoodMM_tools::mergeSubJobs() { register1DHistogram(h, x); } - fin->cd(); - fin->cd("histos_2d"); + fin->cd((prefix + "histos_2d").c_str()); nextkey = gDirectory->GetListOfKeys(); while (TKey* key = (TKey*)nextkey()) { TH2F* h = (TH2F*)key->ReadObj()->Clone(); @@ -1817,8 +1809,7 @@ StatusCode LhoodMM_tools::mergeSubJobs() { register2DHistogram(h, x, y); } - - TTree *t = (TTree*)fin->Get("LhoodMM_progress"); + TTree *t = (TTree*)fin->Get((prefix + "LhoodMM_progress").c_str()); if (t == nullptr) { ATH_MSG_ERROR("Unable to find LhoodMM_progress tree in " << filename); return StatusCode::FAILURE; @@ -1923,10 +1914,11 @@ StatusCode LhoodMM_tools::mergeSubJobs() { chargevec.push_back(charge[ilep]); } - addEventCustom(isTightvec, rvec, fvec, chargevec, weight); + auto sc = addEventCustom(isTightvec, rvec, fvec, chargevec, weight); + if(sc != StatusCode::SUCCESS) return sc; } - + delete r_systUID; delete f_systUID; delete r_systUp; -- GitLab