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