Hello, I’m working on the analysis code to read a xAOD file and generate my own root file. However I have the problems with memory leak like this
Package.EventLoop INFO Memory increase/change during the job:
Package.EventLoop INFO - resident: 29.4749 kB/event (14708 kB total)
Package.EventLoop INFO - virtual : 1.32265 kB/event (660 kB total)
Package.EventLoop WARNING *
Package.EventLoop WARNING * A significant memory leak was detected
Package.EventLoop WARNING *
after some debugging, the memory leak is located at tree->fill(). but I can’t figure out why this happens, the branches in my trees are all float or bool or int, there should be no pointer related problem. But the case is if I comment out some “***tree->Fill()”, there is no leak. And if I only fill the commented trees, the leak don’t exist either. I’m very confused.
The code is attached below:
StatusCode MyxAODAnalysis::initialize()
{
****
TFile *outputFile = wk()->getOutputFile(m_outputName);
ANA_CHECK(EventSave_TreeInitialize(outputFile));
ANA_CHECK(EventInfo_TreeInitialize(outputFile));
ANA_CHECK(xAODInfo_TreeInitialize(outputFile));
ANA_CHECK(Electron_TreeInitialize(outputFile));
ANA_CHECK(Electron_Calibration_TreeInitialize(outputFile));
ANA_CHECK(Electron_Useless_TreeInitialize(outputFile));
ANA_CHECK(Electron_Track_TreeInitialize(outputFile));
ANA_CHECK(Electron_Isolation_TreeInitialize(outputFile));
ANA_CHECK(Electron_Cluster_TreeInitialize(outputFile));
ANA_CHECK(Electron_ShowerShape_TreeInitialize(outputFile));
if (isMC)
{
ANA_CHECK(Electron_SF_TreeInitialize(outputFile));
ANA_CHECK(Electron_Pt_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_ChargeMisIDSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumIDSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_TightID_ChargeMisIDSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_TightIDSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCLooseIso_ChargeMisIDSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCLooseIsoSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCLooseIso_TriggerEff_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCLooseIso_TriggerSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_TightID_FCLooseIso_ChargeMisIDSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_TightID_FCLooseIsoSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_TightID_FCLooseIso_TriggerEff_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_TightID_FCLooseIso_TriggerSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCTightIso_ChargeMisIDSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCTightIsoSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCTightIso_TriggerEff_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCTightIso_TriggerSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCTightIso_ECIDSLooseSF_Syst_TreeInitialize(outputFile));
ANA_CHECK(Electron_MediumID_FCTightIso_ECIDSLoose_ChargeMisIDSF_Syst_TreeInitialize(outputFile));
}
****
}
one example for tree_initialize()
StatusCode MyxAODAnalysis::Electron_TreeInitialize(TFile *&outputfile)
{
ANA_MSG_INFO(“Electron_Tree-INITIALIZE”);
m_Electron_Tree = new TTree(“Electron_Tree”, “Electron_Tree”);
m_Electron_Tree->SetDirectory(outputfile);
m_Electron_Tree->Branch("Electron_Calibrated_Pt", &Electron_Calibrated_Pt, "Electron_Calibrated_Pt/F");
m_Electron_Tree->Branch("Electron_Eta", &Electron_Eta, "Electron_Eta/F");
m_Electron_Tree->Branch("Electron_Phi", &Electron_Phi, "Electron_Phi/F");
m_Electron_Tree->Branch("Electron_Charge", &Electron_Charge, "Electron_Charge/F");
m_Electron_Tree->Branch("Electron_PassIDMedium", &Electron_PassIDMedium, "Electron_PassIDMedium/O");
m_Electron_Tree->Branch("Electron_PassIDLoose", &Electron_PassIDLoose, "Electron_PassIDLoose/O");
m_Electron_Tree->Branch("Electron_PassIDTight", &Electron_PassIDTight, "Electron_PassIDTight/O");
m_Electron_Tree->Branch("Electron_Track_dz0", &Electron_Track_dz0, "Electron_Track_dz0/F");
m_Electron_Tree->Branch("Electron_Track_d0sig", &Electron_Track_d0sig, "Electron_Track_d0sig/F");
m_Electron_Tree->Branch("Electron_MatchedTrigger", &Electron_MatchedTrigger, "Electron_MatchedTrigger/O");
m_Electron_Tree->Branch("Electron_PassECIDSLoose", &Electron_PassECIDSLoose, "Electron_PassECIDSLoose/O");
m_Electron_Tree->Branch("Electron_PassIso_FCLoose", &Electron_PassIso_FCLoose, "Electron_PassIso_FCLoose/O");
m_Electron_Tree->Branch("Electron_PassIso_FCTight", &Electron_PassIso_FCTight, "Electron_PassIso_FCTight/O");
return StatusCode::SUCCESS;
}
then for each event I have:
StatusCode MyxAODAnalysis::execute()
{
// ----------------
// Containers
// ----------------
// retrieve the eventInfo object from the event store
m_store->clear();
eventInfo = nullptr;
ANA_CHECK(evtStore()->retrieve(eventInfo, “EventInfo”));
vertex = nullptr;
ANA_CHECK(evtStore()->retrieve(vertex, “PrimaryVertices”));
const xAOD::JetContainer *jets = nullptr;
ANA_CHECK(evtStore()->retrieve(jets, “AntiKt4EMPFlowJets”));
const xAOD::JetContainer *btag_jets = nullptr;
ANA_CHECK(evtStore()->retrieve(btag_jets, “AntiKt4EMPFlowJets_BTagging201903”));
const xAOD::MuonContainer *muons = nullptr;
ANA_CHECK(evtStore()->retrieve(muons, “Muons”));
const xAOD::ElectronContainer *electrons = nullptr;
ANA_CHECK(evtStore()->retrieve(electrons, “Electrons”));
const xAOD::ElectronContainer *electronsfwd = nullptr;
ANA_CHECK(evtStore()->retrieve(electronsfwd, “ForwardElectrons”));
ANA_CHECK(evtStore()->retrieve(photons, “Photons”));
ANA_CHECK(evtStore()->retrieve(taus, “TauJets”));
// retrieve the MET core
const xAOD::MissingETContainer *coreMet = nullptr;
ANA_CHECK(evtStore()->retrieve(coreMet, “MET_Core_AntiKt4EMPFlow”));
// retrieve the MET association map
const xAOD::MissingETAssociationMap *metMap = nullptr;
ANA_CHECK(evtStore()->retrieve(metMap, “METAssoc_AntiKt4EMPFlow”));
if (isMC)
{
ANA_CHECK(evtStore()->retrieve(truths, “TruthParticles”));
ANA_CHECK(evtStore()->retrieve(event_truth, “TruthEvents”));
ANA_CHECK(evtStore()->retrieve(jet_truth, “AntiKt4TruthJets”));
}
auto electrons_shallowCopy = xAOD::shallowCopyContainer(*electrons);
std::unique_ptrxAOD::ElectronContainer electronsSC(electrons_shallowCopy.first);
std::unique_ptrxAOD::ShallowAuxContainer electronsAuxSC(electrons_shallowCopy.second);
xAOD::Electron *electron_Calib = nullptr;
xAOD::Electron *electron_Calib_S12Off = nullptr;
for (auto electronSC : *electronsSC)
{
m_Electron_Tree->Fill();
m_Electron_Calibration_Tree->Fill();
m_Electron_Useless_Tree->Fill();
m_Electron_Track_Tree->Fill();
m_Electron_Isolation_Tree->Fill();
m_Electron_Cluster_Tree->Fill();
m_Electron_ShowerShape_Tree->Fill();
m_Electron_SF_Tree->Fill();
m_Electron_MediumID_ChargeMisIDSF_Syst_Tree->Fill();
m_Electron_MediumIDSF_Syst_Tree->Fill();
m_Electron_TightID_ChargeMisIDSF_Syst_Tree->Fill();
m_Electron_TightIDSF_Syst_Tree->Fill();
m_Electron_MediumID_FCLooseIso_ChargeMisIDSF_Syst_Tree->Fill();
m_Electron_MediumID_FCLooseIsoSF_Syst_Tree->Fill();
m_Electron_MediumID_FCLooseIso_TriggerEff_Syst_Tree->Fill();
m_Electron_MediumID_FCLooseIso_TriggerSF_Syst_Tree->Fill();
m_Electron_TightID_FCLooseIso_ChargeMisIDSF_Syst_Tree->Fill();//
m_Electron_TightID_FCLooseIsoSF_Syst_Tree->Fill();
m_Electron_TightID_FCLooseIso_TriggerEff_Syst_Tree->Fill();
m_Electron_TightID_FCLooseIso_TriggerSF_Syst_Tree->Fill();
m_Electron_MediumID_FCTightIso_ChargeMisIDSF_Syst_Tree->Fill();
m_Electron_MediumID_FCTightIsoSF_Syst_Tree->Fill();
m_Electron_MediumID_FCTightIso_TriggerEff_Syst_Tree->Fill();
m_Electron_MediumID_FCTightIso_TriggerSF_Syst_Tree->Fill();
if (electron_Calib != nullptr)
delete electron_Calib;
electron_Calib = nullptr;
}
}
//if (NElectrons > 0)
//ANA_CHECK(LoopElectron(electrons));
currently for debugging I don't give the branches any value which are given in LoopElectrons(electrons)
feedbacks are realy welcomed !!!