memory leak in TTree->fill() (multitree)

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 !!!

Why do you fill tens of trees? Do you delete the trees in the end? Can you run valgrind on your code and post the leak checker output?