Commit d8cec0fc authored by Pierre-Alain Loizeau's avatar Pierre-Alain Loizeau
Browse files

[MQ] Fixes for memory leaks

- Make sure that Histo servers gets the right number of parts even if no histos/no canvases to configure or send
- Remove extendable axis in histos of CbmAlgoBuildRawEvents as they cannot be merged
- Do not send STOP command after EOF in CbmMQTsSamplerRepReq
- Pre-book capacity in typical range for input vectors in DigiEventBuilder device
parent bbf024e9
......@@ -38,7 +38,7 @@ CbmMqHistoServer::CbmMqHistoServer()
, fsChannelNameHistosInput("histogram-in")
, fsChannelNameHistosConfig("histo-conf")
, fsChannelNameCanvasConfig("canvas-conf")
, fsHistoFileName("HistosMonitorPulser.root")
, fsHistoFileName("MqHistos.root")
, fuHttpServerPort(8098)
, fArrayHisto()
, fvpsHistosFolder()
......@@ -87,6 +87,7 @@ void CbmMqHistoServer::InitTask()
bool CbmMqHistoServer::ReceiveData(FairMQMessagePtr& msg, int /*index*/)
{
LOG(debug) << "CbmMqHistoServer::ReceiveData => Processing histograms update";
TObject* tempObject = nullptr;
Deserialize<RootSerializer>(*msg, tempObject);
......@@ -110,12 +111,14 @@ bool CbmMqHistoServer::ReceiveData(FairMQMessagePtr& msg, int /*index*/)
LOG(warning) << "Unsupported object type for " << pObj->GetName();
} // for (Int_t i = 0; i < arrayHisto->GetEntriesFast(); i++)
LOG(debug) << "CbmMqHistoServer::ReceiveData => Deleting array";
/// Need to use Delete instead of Clear to avoid memory leak!!!
arrayHisto->Delete();
/// If new histos received, try to prepare as many canvases as possible
/// Should be expensive on start and cheap afterward
if (!fbAllCanvasReady) {
LOG(debug) << "CbmMqHistoServer::ReceiveData => Checking for canvases updates";
for (uint32_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
/// Jump canvases already ready
if (fvbCanvasReady[uCanv]) continue;
......@@ -148,6 +151,8 @@ bool CbmMqHistoServer::ReceiveData(FairMQMessagePtr& msg, int /*index*/)
bMqHistoServerSaveHistos = kFALSE;
} // if( bMqHistoServerSaveHistos )
*/
LOG(debug) << "CbmMqHistoServer::ReceiveData => Finished processing histograms update";
return true;
}
......@@ -197,7 +202,7 @@ bool CbmMqHistoServer::ReceiveCanvasConfig(FairMQMessagePtr& msg, int /*index*/)
} // for( UInt_t uPrevCanv = 0; uPrevCanv < fvpsCanvasConfig.size(); ++uPrevCanv )
if (uPrevCanv < fvpsCanvasConfig.size()) {
LOG(warning) << " Ignored new configuration for histo " << tempObject.first
LOG(warning) << " Ignored new configuration for Canvas " << tempObject.first
<< " due to previously received one: " << tempObject.second;
/// Not sure if we should return false here...
} // if( uPrevCanv < fvpsCanvasConfig.size() )
......@@ -218,7 +223,7 @@ bool CbmMqHistoServer::ReceiveConfigAndData(FairMQParts& parts, int /*index*/)
/// Reject anything but a at least Header + Histo Config + Canvas Config + Histo Data
if (parts.Size() < 4) {
if (1 == parts.Size()) {
/// PAL, 09/04/2021, Debug message catching missed method overlad/polymorphism:
/// PAL, 09/04/2021, Debug message catching missed method overload/polymorphism:
/// contrary to my expectation, if 2 method bound to same channel, one with FairMQMessagePtr and one with
/// FairMQParts, all messages go to multipart version and FairMQMessagePtr is converted to size 1 FairMQParts
LOG(debug) << "CbmMqHistoServer::ReceiveConfigAndData => only 1 parts found in input, "
......@@ -238,9 +243,27 @@ bool CbmMqHistoServer::ReceiveConfigAndData(FairMQParts& parts, int /*index*/)
LOG(info) << "CbmMqHistoServer::ReceiveConfigAndData => Received configuration for " << pairHeader.first
<< " histos and " << pairHeader.second << " canvases";
if (static_cast<size_t>(parts.Size()) != 1 + pairHeader.first + pairHeader.second + 1) {
uint32_t uOffsetHistoConfig = pairHeader.first;
if (0 == pairHeader.first) {
uOffsetHistoConfig = 1;
if (0 < (parts.At(uOffsetHistoConfig))->GetSize()) {
LOG(fatal) << "CbmMqHistoServer::ReceiveConfigAndData => No histo config expected but corresponding message is"
<< " not empty: " << (parts.At(uOffsetHistoConfig))->GetSize();
}
}
uint32_t uOffsetCanvasConfig = pairHeader.second;
if (0 == pairHeader.second) {
uOffsetCanvasConfig = 1;
if (0 < (parts.At(uOffsetHistoConfig + uOffsetCanvasConfig))->GetSize()) {
LOG(fatal) << "CbmMqHistoServer::ReceiveConfigAndData => No Canvas config expected but corresponding message is"
<< " not empty: " << (parts.At(uOffsetHistoConfig + uOffsetCanvasConfig))->GetSize();
}
}
if (static_cast<size_t>(parts.Size()) != 1 + uOffsetHistoConfig + uOffsetCanvasConfig + 1) {
LOG(fatal) << "CbmMqHistoServer::ReceiveConfigAndData => Number of parts not matching header: " << parts.Size()
<< " instead of " << 1 + pairHeader.first + pairHeader.second + 1;
<< " instead of " << 1 + uOffsetHistoConfig + uOffsetCanvasConfig + 1;
} // if( parts.Size() != 1 + pairHeader.first + pairHeader.second )
/// Decode parts for histograms configuration
......@@ -250,11 +273,14 @@ bool CbmMqHistoServer::ReceiveConfigAndData(FairMQParts& parts, int /*index*/)
/// Decode parts for histograms configuration
for (uint32_t uCanv = 0; uCanv < pairHeader.second; ++uCanv) {
ReceiveCanvasConfig(parts.At(1 + pairHeader.first + uCanv), 0);
ReceiveCanvasConfig(parts.At(1 + uOffsetHistoConfig + uCanv), 0);
} // for (UInt_t uCanv = 0; uCanv < pairHeader.second; ++uCanv)
/// Decode the histograms data now that the configuration is loaded
ReceiveData(parts.At(1 + pairHeader.first + pairHeader.second), 0);
ReceiveData(parts.At(1 + uOffsetHistoConfig + uOffsetCanvasConfig), 0);
LOG(info) << "CbmMqHistoServer::ReceiveConfigAndData => Finished processing composed message with " << parts.Size()
<< " parts";
return true;
}
......@@ -352,6 +378,7 @@ bool CbmMqHistoServer::ResetHistograms()
}
bool CbmMqHistoServer::PrepareCanvas(uint32_t uCanvIdx)
{
LOG(debug) << " Extracting configuration for canvas index " << uCanvIdx;
CanvasConfig conf(ExtractCanvasConfigFromString(fvpsCanvasConfig[uCanvIdx].second));
/// First check if all objects to be drawn are present
......@@ -369,6 +396,8 @@ bool CbmMqHistoServer::PrepareCanvas(uint32_t uCanvIdx)
} // for( uint32_t uObjIdx = 0; uObjIdx < uNbObj; ++uObjIdx )
} // for( uint32_t uPadIdx = 0; uPadIdx < uNbPads; ++uPadIdx )
LOG(info) << " All histos found for canvas " << conf.GetName().data() << ", now preparing it";
/// Create new canvas and pads
TCanvas* pNewCanv = new TCanvas(conf.GetName().data(), conf.GetTitle().data());
pNewCanv->Divide(conf.GetNbPadsX(), conf.GetNbPadsY());
......@@ -400,7 +429,10 @@ bool CbmMqHistoServer::PrepareCanvas(uint32_t uCanvIdx)
dynamic_cast<TH1*>(pObj)->Draw(conf.GetOption(uPadIdx, uObjIdx).data());
} // if( nullptr != dynamic_cast< TH1 *>( pObj ) )
else
LOG(warning) << "Unsupported object type for " << sName << " when preparing canvas " << conf.GetName();
LOG(warning) << " Unsupported object type for " << sName << " when preparing canvas " << conf.GetName();
LOG(info) << " Configured histo " << sName << " on pad " << (1 + uPadIdx) << " for canvas "
<< conf.GetName().data();
} // if( "nullptr" != sName )
} // for( uint32_t uObjIdx = 0; uObjIdx < uNbObj; ++uObjIdx )
} // for( uint32_t uPadIdx = 0; uPadIdx < uNbPads; ++uPadIdx )
......@@ -409,7 +441,7 @@ bool CbmMqHistoServer::PrepareCanvas(uint32_t uCanvIdx)
fServer->Register(Form("/%s", fvCanvas[uCanvIdx].second.data()), fvCanvas[uCanvIdx].first);
fvbCanvasRegistered[uCanvIdx] = true;
LOG(info) << "registered canvas " << fvCanvas[uCanvIdx].first->GetName() << " in folder "
LOG(info) << " Registered canvas " << fvCanvas[uCanvIdx].first->GetName() << " in folder "
<< fvCanvas[uCanvIdx].second;
/// Update flag telling whether all known canvases are registered
......
......@@ -267,13 +267,13 @@ try {
/* clang-format on */
/// Create input vectors
fvDigiT0 = new std::vector<CbmTofDigi>();
fvDigiSts = new std::vector<CbmStsDigi>();
fvDigiMuch = new std::vector<CbmMuchDigi>();
fvDigiTrd = new std::vector<CbmTrdDigi>();
fvDigiTof = new std::vector<CbmTofDigi>();
fvDigiRich = new std::vector<CbmRichDigi>();
fvDigiPsd = new std::vector<CbmPsdDigi>();
fvDigiT0 = new std::vector<CbmTofDigi>(1000000);
fvDigiSts = new std::vector<CbmStsDigi>(1000000);
fvDigiMuch = new std::vector<CbmMuchDigi>(1000000);
fvDigiTrd = new std::vector<CbmTrdDigi>(1000000);
fvDigiTof = new std::vector<CbmTofDigi>(1000000);
fvDigiRich = new std::vector<CbmRichDigi>(1000000);
fvDigiPsd = new std::vector<CbmPsdDigi>(1000000);
fCbmTsEventHeader = new CbmTsEventHeader();
......@@ -562,6 +562,13 @@ bool CbmDeviceBuildDigiEvents::SendHistoConfAndData()
partsOut.AddPart(std::move(messageHist));
} // for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto)
/// Catch case where no histos are registered!
/// => Add empty message
if (0 == fvpsHistosFolder.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
/// Serialize the vector of canvas config into a single MQ message
FairMQMessagePtr messageCan(NewMessage());
......@@ -570,6 +577,13 @@ bool CbmDeviceBuildDigiEvents::SendHistoConfAndData()
partsOut.AddPart(std::move(messageCan));
} // for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv)
/// Catch case where no Canvases are registered!
/// => Add empty message
if (0 == fvpsCanvasConfig.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
/// Serialize the array of histos into a single MQ message
FairMQMessagePtr msgHistos(NewMessage());
Serialize<RootSerializer>(*msgHistos, &fArrayHisto);
......
......@@ -544,6 +544,13 @@ bool CbmDeviceDigiEventSink::SendHistoConfAndData()
partsOut.AddPart(std::move(messageHist));
} // for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto)
/// Catch case where no histos are registered!
/// => Add empty message
if (0 == fvpsHistosFolder.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
/// Serialize the vector of canvas config into a single MQ message
FairMQMessagePtr messageCan(NewMessage());
......@@ -552,6 +559,13 @@ bool CbmDeviceDigiEventSink::SendHistoConfAndData()
partsOut.AddPart(std::move(messageCan));
} // for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv)
/// Catch case where no Canvases are registered!
/// => Add empty message
if (0 == fvpsCanvasConfig.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
/// Serialize the array of histos into a single MQ message
FairMQMessagePtr msgHistos(NewMessage());
Serialize<RootSerializer>(*msgHistos, &fArrayHisto);
......
......@@ -496,6 +496,13 @@ bool CbmDeviceEventSink::SendHistoConfAndData()
partsOut.AddPart(std::move(messageHist));
} // for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto)
/// Catch case where no histos are registered!
/// => Add empty message
if (0 == fvpsHistosFolder.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
/// Serialize the vector of canvas config into a single MQ message
FairMQMessagePtr messageCan(NewMessage());
......@@ -504,6 +511,13 @@ bool CbmDeviceEventSink::SendHistoConfAndData()
partsOut.AddPart(std::move(messageCan));
} // for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv)
/// Catch case where no Canvases are registered!
/// => Add empty message
if (0 == fvpsCanvasConfig.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
/// Serialize the array of histos into a single MQ message
FairMQMessagePtr msgHistos(NewMessage());
Serialize<RootSerializer>(*msgHistos, &fArrayHisto);
......
......@@ -772,6 +772,13 @@ bool CbmDeviceUnpack::SendHistoConfAndData()
partsOut.AddPart(std::move(messageHist));
} // for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto)
/// Catch case where no histos are registered!
/// => Add empty message
if (0 == fvpsHistosFolder.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
/// Serialize the vector of canvas config into a single MQ message
FairMQMessagePtr messageCan(NewMessage());
......@@ -780,6 +787,13 @@ bool CbmDeviceUnpack::SendHistoConfAndData()
partsOut.AddPart(std::move(messageCan));
} // for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv)
/// Catch case where no Canvases are registered!
/// => Add empty message
if (0 == fvpsCanvasConfig.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
/// Serialize the array of histos into a single MQ message
FairMQMessagePtr msgHistos(NewMessage());
Serialize<RootSerializer>(*msgHistos, &fArrayHisto);
......
......@@ -354,9 +354,14 @@ bool CbmMQTsSamplerRepReq::HandleRequest(FairMQMessagePtr& msgReq, int)
/// Initialize the histograms
if (0 < fuPublishFreqTs && 0 == fulTsCounter) { InitHistograms(); } // if( 0 < fuPublishFreqTs )
if (fbEofFound) {
/// Ignore all requests if EOS reached
return true;
}
if (fbNoSplitTs) {
if (!CreateAndSendFullTs()) {
if (!CreateAndSendFullTs() && !fbEofFound) {
/// If command channel defined, send command to all "slaves"
if ("" != fsChannelNameCommands) {
/// Wait 1 s before sending a STOP to let all slaves finish processing previous data
......@@ -365,7 +370,7 @@ bool CbmMQTsSamplerRepReq::HandleRequest(FairMQMessagePtr& msgReq, int)
} // if( "" != fsChannelNameCommands )
return false;
} // if( !CreateAndSendFullTs( ts ) )
} // if( !CreateAndSendFullTs( ts ) && !fbEofFound)
} // if( fbNoSplitTs )
else if (fbSendTsPerSysId) {
/// TODO: add support for alternative request with "system name" instead of "system ID"
......@@ -375,7 +380,7 @@ bool CbmMQTsSamplerRepReq::HandleRequest(FairMQMessagePtr& msgReq, int)
/// This assumes that the order of the components does NOT change after the first TS
/// That should be the case as the component index correspond to a physical link idx
if (!CreateCombinedComponentsPerSysId(iSysId)) {
if (!CreateCombinedComponentsPerSysId(iSysId) && !fbEofFound) {
/// If command channel defined, send command to all "slaves"
if ("" != fsChannelNameCommands) {
/// Wait 1 s before sending a STOP to let all slaves finish processing previous data
......@@ -384,7 +389,7 @@ bool CbmMQTsSamplerRepReq::HandleRequest(FairMQMessagePtr& msgReq, int)
} // if( "" != fsChannelNameCommands )
return false;
} // if(!CreateAndCombineComponentsPerSysId(iSysId) )
} // if(!CreateAndCombineComponentsPerSysId(iSysId) && !fbEofFound)
} // else if( fbSendTsPerSysId && fbSendTsPerSysId ) of if( fbNoSplitTs
else if (fbSendTsPerBlock) {
std::string reqStr(static_cast<char*>(msgReq->GetData()), msgReq->GetSize());
......@@ -392,7 +397,7 @@ bool CbmMQTsSamplerRepReq::HandleRequest(FairMQMessagePtr& msgReq, int)
/// This assumes that the order of the components does NOT change after the first TS
/// That should be the case as the component index correspond to a physical link idx
if (!CreateCombinedComponentsPerBlock(reqStr)) {
if (!CreateCombinedComponentsPerBlock(reqStr) && !fbEofFound) {
/// If command channel defined, send command to all "slaves"
if ("" != fsChannelNameCommands) {
/// Wait 1 s before sending a STOP to let all slaves finish processing previous data
......@@ -401,7 +406,7 @@ bool CbmMQTsSamplerRepReq::HandleRequest(FairMQMessagePtr& msgReq, int)
} // if( "" != fsChannelNameCommands )
return false;
} // if( !CreateAndCombineComponentsPerChannel(reqStr) )
} // if( !CreateAndCombineComponentsPerChannel(reqStr) && !fbEofFound)
} // else if( fbSendTsPerSysId && fbSendTsPerSysId ) of if( fbNoSplitTs )
/// Send histograms each 100 time slices. Should be each ~1s
......@@ -530,6 +535,8 @@ std::unique_ptr<fles::Timeslice> CbmMQTsSamplerRepReq::GetNewTs()
SendCommand(sCmd);
} // if( "" != fsChannelNameCommands )
fbEofFound = true;
return nullptr;
} // else of if (fulTsCounter < fulMaxTimeslices)
} // if (timeslice)
......@@ -547,6 +554,8 @@ std::unique_ptr<fles::Timeslice> CbmMQTsSamplerRepReq::GetNewTs()
SendCommand(sCmd);
} // if( "" != fsChannelNameCommands )
fbEofFound = true;
return nullptr;
} // else of if (timeslice)
}
......@@ -913,6 +922,13 @@ bool CbmMQTsSamplerRepReq::SendHistoConfAndData()
partsOut.AddPart(std::move(messageHist));
} // for (UInt_t uHisto = 0; uHisto < fvpsHistosFolder.size(); ++uHisto)
/// Catch case where no histos are registered!
/// => Add empty message
if (0 == fvpsHistosFolder.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
/// Serialize the vector of canvas config into a single MQ message
FairMQMessagePtr messageCan(NewMessage());
......@@ -921,6 +937,13 @@ bool CbmMQTsSamplerRepReq::SendHistoConfAndData()
partsOut.AddPart(std::move(messageCan));
} // for (UInt_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv)
/// Catch case where no Canvases are registered!
/// => Add empty message
if (0 == fvpsCanvasConfig.size()) {
FairMQMessagePtr messageHist(NewMessage());
partsOut.AddPart(std::move(messageHist));
}
/// Serialize the array of histos into a single MQ message
FairMQMessagePtr msgHistos(NewMessage());
Serialize<RootSerializer>(*msgHistos, &fArrayHisto);
......
......@@ -119,6 +119,9 @@ private:
std::deque<std::unique_ptr<fles::Timeslice>> fdpTimesliceBuffer = {};
std::deque<std::vector<bool>> fdbCompSentFlags = {};
/// Flag indicating the EOF was reached to avoid sending an emergency STOP
bool fbEofFound = false;
std::string fsChannelNameMissedTs = "";
std::string fsChannelNameCommands = "";
......
......@@ -683,21 +683,21 @@ void CbmAlgoBuildRawEvents::CreateHistograms()
outFolder = new TFolder("AlgoBuildRawEventsHist", " AlgoBuildRawEvents Histos");
outFolder->Clear();
fhEventTime = new TH1F("hEventTime", "seed time of the events; Seed time [s]; Events", 1000, 0, 0.001);
fhEventTime->SetCanExtend(TH1::kAllAxes);
fhEventTime = new TH1F("hEventTime", "seed time of the events; Seed time within TS [s]; Events", 100000, 0, 0.2);
// fhEventTime->SetCanExtend(TH1::kAllAxes); // Breaks the MQ histogram server as cannot be merged!
fhEventDt =
new TH1F("fhEventDt", "interval in seed time of consecutive events; Seed time [s]; Events", 1000, 0, 0.0001);
fhEventDt->SetCanExtend(TH1::kAllAxes);
new TH1F("fhEventDt", "interval in seed time of consecutive events; Seed time dt [ns]; Events", 10000, 0, 100000);
// fhEventDt->SetCanExtend(TH1::kAllAxes); // Breaks the MQ histogram server as cannot be merged!
fhEventSize = new TH1F("hEventSize", "nb of all digis in the event; Nb Digis []; Events []", 1000, 0, 100);
fhEventSize->SetCanExtend(TH1::kAllAxes);
fhEventSize = new TH1F("hEventSize", "nb of all digis in the event; Nb Digis []; Events []", 10000, 0, 10000);
// fhEventSize->SetCanExtend(TH1::kAllAxes); // Breaks the MQ histogram server as cannot be merged!
fhNbDigiPerEvtTime = new TH2I("hNbDigiPerEvtTime",
"nb of all digis per event vs seed time of the events; Seed time "
"[s]; Nb Digis []; Events []",
1000, 0, 0.001, 1000, 0, 100);
fhNbDigiPerEvtTime->SetCanExtend(TH2::kAllAxes);
1000, 0, 0.1, 5000, 0, 5000);
// fhNbDigiPerEvtTime->SetCanExtend(TH2::kAllAxes); // Breaks he MQ histogram server as cannot be merged!
/// Loop on selection detectors
for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
......@@ -707,11 +707,11 @@ void CbmAlgoBuildRawEvents::CreateHistograms()
continue;
}
TH2I* hNbDigiPerEvtTimeDet = new TH2I(Form("hNbDigiPerEvtTime%s", (*det).sName.data()),
Form("nb of %s digis per event vs seed time of the events; Seed time "
Form("nb of %s digis per event vs seed time of the events; Seed time in TS "
"[s]; Nb Digis []; Events []",
(*det).sName.data()),
1000, 0, 0.001, 1000, 0, 100);
hNbDigiPerEvtTimeDet->SetCanExtend(TH2::kAllAxes);
1000, 0, 0.1, 5000, 0, 5000);
// hNbDigiPerEvtTimeDet->SetCanExtend(TH2::kAllAxes); // Breaks he MQ histogram server as cannot be merged!
fvhNbDigiPerEvtTimeDet.push_back(hNbDigiPerEvtTimeDet);
}
......@@ -769,7 +769,7 @@ void CbmAlgoBuildRawEvents::ResetHistograms(Bool_t /*bResetTime*/)
{
/// Also reset the Start time for the evolution plots!
fdStartTime = -1.0;
}
}
*/
}
......
......@@ -106,7 +106,7 @@ Bool_t CbmRecoUnpack::Init()
fMuchConfig->SetAlgo();
initParContainers(fMuchConfig->GetParContainerRequest()); /// Framework bound work = kept in this Task
fMuchConfig->InitAlgo();
initPerformanceMaps(fkFlesMuch, "RICH");
initPerformanceMaps(fkFlesMuch, "MUCH");
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment