Skip to content

Commit 146f2e2

Browse files
committed
Fix timeframe aggregation in dpl-eventgen
* precalculate batch size so it does not depend on the event counter updated in the generator loop * use DataAllocator::make instead of snapshot to reduce memory churn
1 parent ff2d508 commit 146f2e2

File tree

3 files changed

+37
-13
lines changed

3 files changed

+37
-13
lines changed

Generators/include/Generators/GeneratorService.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <SimulationDataFormat/MCTrack.h>
2121
#include <Generators/PrimaryGenerator.h> // could be forward declaration
2222
#include <DetectorsBase/Stack.h>
23+
#include <MemoryResources/MemoryResources.h>
2324

2425
namespace o2
2526
{
@@ -66,6 +67,7 @@ class GeneratorService
6667
std::pair<std::vector<MCTrack>, o2::dataformats::MCEventHeader> generateEvent();
6768

6869
void generateEvent_MCTracks(std::vector<MCTrack>& tracks, o2::dataformats::MCEventHeader& header);
70+
void generateEvent_MCTracks(o2::pmr::vector<MCTrack>& tracks, o2::dataformats::MCEventHeader& header);
6971
void generateEvent_TParticles(std::vector<TParticle>& tparts, o2::dataformats::MCEventHeader& header);
7072

7173
private:

Generators/src/GeneratorService.cxx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ void GeneratorService::generateEvent_MCTracks(std::vector<MCTrack>& tracks, o2::
6161
}
6262
}
6363

64+
void GeneratorService::generateEvent_MCTracks(o2::pmr::vector<MCTrack>& tracks, o2::dataformats::MCEventHeader& header)
65+
{
66+
mPrimGen.SetEvent(&header);
67+
mStack.Reset();
68+
mPrimGen.GenerateEvent(&mStack); // this is the usual FairROOT interface going via stack
69+
70+
tracks.reserve(mStack.getPrimaries().size());
71+
for (auto& tparticle : mStack.getPrimaries()) {
72+
tracks.emplace_back(tparticle);
73+
}
74+
}
75+
6476
std::pair<std::vector<o2::MCTrack>, o2::dataformats::MCEventHeader> GeneratorService::generateEvent()
6577
{
6678
std::vector<o2::MCTrack> tracks;

run/dpl_eventgen.cxx

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ struct GeneratorTask {
5050
std::unique_ptr<o2::eventgen::GeneratorService> genservice;
5151
TStopwatch timer;
5252

53+
std::vector<o2::pmr::vector<o2::MCTrack>*> mctracks_vector;
54+
std::vector<o2::dataformats::MCEventHeader*> mcheader_vector;
55+
5356
void init(o2::framework::InitContext& /*ic*/)
5457
{
5558
genservice.reset(new o2::eventgen::GeneratorService);
@@ -85,25 +88,31 @@ struct GeneratorTask {
8588
outfile.reset(new TFile(kineoutfilename.c_str(), "RECREATE"));
8689
outtree.reset(new TTree("o2sim", "o2sim"));
8790
}
91+
92+
mctracks_vector.reserve(aggregate);
93+
mcheader_vector.reserve(aggregate);
8894
}
8995

9096
void run(o2::framework::ProcessingContext& pc)
9197
{
92-
std::vector<o2::MCTrack> mctracks;
93-
o2::dataformats::MCEventHeader mcheader;
94-
auto mctrack_ptr = &mctracks;
95-
if (outfile.get()) {
96-
auto br = o2::base::getOrMakeBranch(*outtree, "MCTrack", &mctrack_ptr);
97-
br->SetAddress(&mctrack_ptr);
98-
}
98+
mctracks_vector.clear();
99+
mcheader_vector.clear();
99100

100-
for (auto i = 0; i < std::min((GenCount)aggregate, nEvents - eventCounter); ++i) {
101-
mctracks.clear();
102-
genservice->generateEvent_MCTracks(mctracks, mcheader);
103-
pc.outputs().snapshot(Output{"MC", "MCHEADER", 0}, mcheader);
104-
pc.outputs().snapshot(Output{"MC", "MCTRACKS", 0}, mctracks);
101+
auto batch = std::min((GenCount)aggregate, nEvents - eventCounter);
102+
for (auto i = 0U; i < batch; ++i) {
103+
mctracks_vector.push_back(&pc.outputs().make<o2::pmr::vector<o2::MCTrack>>(Output{"MC", "MCTRACKS", 0}));
104+
auto& mctracks = mctracks_vector.back();
105+
mcheader_vector.push_back(&pc.outputs().make<o2::dataformats::MCEventHeader>(Output{"MC", "MCHEADER", 0}));
106+
auto& mcheader = mcheader_vector.back();
107+
genservice->generateEvent_MCTracks(*mctracks, *mcheader);
105108
++eventCounter;
106109

110+
auto mctrack_ptr = mctracks;
111+
if (outfile.get()) {
112+
auto br = o2::base::getOrMakeBranch(*outtree, "MCTrack", &mctrack_ptr);
113+
br->SetAddress(&mctrack_ptr);
114+
}
115+
107116
if (outfile.get() && outtree.get()) {
108117
outtree->Fill();
109118
}
@@ -112,6 +121,7 @@ struct GeneratorTask {
112121
// report number of TFs injected for the rate limiter to work
113122
++tfCounter;
114123
pc.services().get<o2::monitoring::Monitoring>().send(o2::monitoring::Metric{(uint64_t)tfCounter, "df-sent"}.addTag(o2::monitoring::tags::Key::Subsystem, o2::monitoring::tags::Value::DPL));
124+
115125
bool time_expired = false;
116126
if (ttl > 0) {
117127
timer.Stop();
@@ -125,7 +135,7 @@ struct GeneratorTask {
125135
pc.services().get<ControlService>().endOfStream();
126136
pc.services().get<ControlService>().readyToQuit(QuitRequest::Me);
127137

128-
// write out data to disc if asked
138+
// write out data to disk if asked
129139
if (outfile.get()) {
130140
outtree->SetEntries(eventCounter);
131141
outtree->Write();

0 commit comments

Comments
 (0)