Skip to content

Commit 9a75a46

Browse files
authored
o2sim: fix time aggregation in dpl-eventgen (#15091)
* 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 e75007c commit 9a75a46

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
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();

run/o2sim_mctracks_to_aod.cxx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,8 @@ struct MctracksToAod {
9494
// TODO: include BC simulation
9595
auto bcCounter = 0UL;
9696
size_t offset = 0;
97+
LOG(debug) << "--- Loop over " << nParts << " parts ---";
9798
for (auto i = 0U; i < nParts; ++i) {
98-
LOG(debug) << "--- Loop over " << nParts << " parts ---";
99-
10099
auto record = mSampler.generateCollisionTime();
101100
auto header = pc.inputs().get<McHeader*>("mcheader", i);
102101
auto tracks = pc.inputs().get<McTracks>("mctracks", i);

0 commit comments

Comments
 (0)