File indexing completed on 2026-10-15 08:24:59
0001 #include "Fun4AllMemoryHistograms.h"
0002
0003 #include "Fun4AllHistoManager.h"
0004 #include "Fun4AllUtils.h"
0005
0006 #include <TH1.h>
0007 #include <TSystem.h>
0008
0009 #include <iostream>
0010 #include <utility> // for pair, make_pair
0011
0012 Fun4AllMemoryHistograms *Fun4AllMemoryHistograms::mInstance {nullptr};
0013
0014 Fun4AllMemoryHistograms::Fun4AllMemoryHistograms()
0015 : Fun4AllBase("Fun4AllMemoryHistograms")
0016 {
0017 }
0018
0019 void Fun4AllMemoryHistograms::FillHistos()
0020 {
0021 if (! m_Enabled)
0022 {
0023 return;
0024 }
0025 if (! m_HistosCreated)
0026 {
0027 CreateHistos();
0028 }
0029
0030 Fun4AllUtils::memoryvals mymem;
0031 Fun4AllUtils::GetMemory(mymem);
0032 if (m_EventCount >= m_NumChannels)
0033 {
0034 increase_TH1_channelcount();
0035 }
0036 int EventCountPlus1 = m_EventCount+1;
0037 m_histovector[0]->SetBinContent(EventCountPlus1,mymem.arena);
0038 m_histovector[1]->SetBinContent(EventCountPlus1,mymem.uordblks);
0039 m_histovector[2]->SetBinContent(EventCountPlus1,mymem.fordblks);
0040 m_histovector[3]->SetBinContent(EventCountPlus1,mymem.hblkhd);
0041 m_histovector[4]->SetBinContent(EventCountPlus1,mymem.VmHWM);
0042 m_histovector[5]->SetBinContent(EventCountPlus1,mymem.VmRSS);
0043 m_EventCount++;
0044 }
0045
0046 void Fun4AllMemoryHistograms::SaveHistos(const std::string &fname)
0047 {
0048 if (! m_Enabled)
0049 {
0050 return;
0051 }
0052 Fun4AllHistoManager *hm = new Fun4AllHistoManager("MEMHISTOS");
0053 for (auto *iter : m_histovector)
0054 {
0055 hm->registerHisto(iter);
0056 }
0057 hm->dumpHistos(fname);
0058 return;
0059 }
0060
0061 void Fun4AllMemoryHistograms::increase_TH1_channelcount()
0062 {
0063 m_NumChannels += 10000;
0064 float m_Range = m_NumChannels + 0.5;
0065 for (TH1* histo : m_histovector)
0066 {
0067 const int old_nbins = histo->GetNbinsX();
0068 std::vector<double> old_content(old_nbins + 2);
0069
0070 for (int bin = 0; bin <= old_nbins + 1; ++bin)
0071 {
0072 old_content[bin] = histo->GetBinContent(bin);
0073 }
0074
0075 histo->SetBins(m_NumChannels, 0.5, m_Range);
0076
0077
0078 for (int bin = 0; bin <= old_nbins + 1; ++bin)
0079 {
0080 histo->SetBinContent(bin, old_content[bin]);
0081 }
0082 }
0083 return;
0084 }
0085
0086 void Fun4AllMemoryHistograms::CreateHistos()
0087 {
0088 float m_Range = m_NumChannels + 0.5;
0089 TH1 *arena = new TH1D("arena","arena size",m_NumChannels,0.5,m_Range);
0090 m_histovector.push_back(arena);
0091 TH1 *uordblks = new TH1D("uordblks","uordblks size",m_NumChannels,0.5,m_Range);
0092 m_histovector.push_back(uordblks);
0093 TH1 *fordblks = new TH1D("fordblks","fordblks size",m_NumChannels,0.5,m_Range);
0094 m_histovector.push_back(fordblks);
0095 TH1 *hblkhd = new TH1D("hblkhd","hblkhd size",m_NumChannels,0.5,m_Range);
0096 m_histovector.push_back(hblkhd);
0097 TH1 *VmHWM = new TH1D("VmHWM","VmHWM size",m_NumChannels,0.5,m_Range);
0098 m_histovector.push_back(VmHWM);
0099 TH1 *VmRSS = new TH1D("VmRSS","VmRSS size",m_NumChannels,0.5,m_Range);
0100 m_histovector.push_back(VmRSS);
0101 m_HistosCreated = true;
0102 }