@@ -183,6 +183,37 @@ Bool_t GeneratorHybrid::Init()
183183 }
184184 gens[count]->Init (); // TODO: move this to multi-threaded
185185 addSubGenerator (count, gen);
186+ if (mTriggerModes [count] != o2::eventgen::Generator::kTriggerOFF ) {
187+ gens[count]->setTriggerMode (mTriggerModes [count]);
188+ LOG (info) << " Setting Trigger mode of generator " << gen << " to: " << mTriggerModes [count];
189+ o2::eventgen::Trigger trigger = nullptr ;
190+ o2::eventgen::DeepTrigger deeptrigger = nullptr ;
191+ for (int trg = 0 ; trg < mTriggerMacros [count].size (); trg++) {
192+ if (mTriggerMacros [count][trg].empty () || mTriggerFuncs [count][trg].empty ()) {
193+ continue ;
194+ }
195+ LOG (info) << " Setting trigger " << trg << " of generator " << gen << " with following parameters" ;
196+ LOG (info) << " Macro filename: " << mTriggerMacros [count][trg];
197+ LOG (info) << " Function name: " << mTriggerFuncs [count][trg];
198+ trigger = o2::conf::GetFromMacro<o2::eventgen::Trigger>(mTriggerMacros [count][trg], mTriggerFuncs [count][trg], " o2::eventgen::Trigger" , " trigger" );
199+ if (!trigger) {
200+ LOG (info) << " Trying to retrieve a \' o2::eventgen::DeepTrigger\' type" ;
201+ deeptrigger = o2::conf::GetFromMacro<o2::eventgen::DeepTrigger>(mTriggerMacros [count][trg], mTriggerFuncs [count][trg], " o2::eventgen::DeepTrigger" , " deeptrigger" );
202+ }
203+ if (!trigger && !deeptrigger) {
204+ LOG (warn) << " Failed to retrieve \' external trigger\' : problem with configuration" ;
205+ LOG (warn) << " Trigger " << trg << " of generator " << gen << " will not be included" ;
206+ continue ;
207+ } else {
208+ LOG (info) << " Trigger " << trg << " of generator " << gen << " successfully set" ;
209+ }
210+ if (trigger) {
211+ gens[count]->addTrigger (trigger);
212+ } else {
213+ gens[count]->addDeepTrigger (deeptrigger);
214+ }
215+ }
216+ }
186217 count++;
187218 }
188219 if (mRandomize ) {
@@ -240,9 +271,13 @@ Bool_t GeneratorHybrid::Init()
240271 // mGenIsInitialized[task] = true;
241272 // }
242273 }
243- generator->clearParticles ();
244- generator->generateEvent ();
245- generator->importParticles ();
274+ bool isTriggered = false ;
275+ while (!isTriggered) {
276+ generator->clearParticles ();
277+ generator->generateEvent ();
278+ generator->importParticles ();
279+ isTriggered = generator->triggerEvent ();
280+ }
246281 LOG (debug) << " eventgen finished for task " << task;
247282 if (!mStopFlag ) {
248283 if (mGenerationMode == GenMode::kParallel ) {
@@ -450,6 +485,68 @@ Bool_t GeneratorHybrid::confSetter(const auto& gen)
450485 mConfigs .push_back (" " );
451486 }
452487 }
488+ if (gen.HasMember (" triggers" )) {
489+ const auto & trigger = gen[" triggers" ];
490+ auto trigger_specs = [this , &trigger]() {
491+ mTriggerMacros .push_back ({});
492+ mTriggerFuncs .push_back ({});
493+ if (trigger.HasMember (" specs" )) {
494+ for (auto & spec : trigger[" specs" ].GetArray ()) {
495+ if (spec.HasMember (" macro" )){
496+ const auto & macro = spec[" macro" ].GetString ();
497+ if (!strcmp (macro, " " ) == 0 ) {
498+ mTriggerMacros .back ().push_back (macro);
499+ } else {
500+ mTriggerMacros .back ().push_back (" " );
501+ }
502+ } else {
503+ mTriggerMacros .back ().push_back (" " );
504+ }
505+ if (spec.HasMember (" function" )) {
506+ const auto & function = spec[" function" ].GetString ();
507+ if (!strcmp (function, " " ) == 0 ) {
508+ mTriggerFuncs .back ().push_back (function);
509+ } else {
510+ mTriggerFuncs .back ().push_back (" " );
511+ }
512+ } else {
513+ mTriggerFuncs .back ().push_back (" " );
514+ }
515+ }
516+ } else {
517+ mTriggerMacros .back ().push_back (" " );
518+ mTriggerFuncs .back ().push_back (" " );
519+ }
520+ };
521+ if (trigger.HasMember (" mode" )) {
522+ const auto & trmode = trigger[" mode" ].GetString ();
523+ if (strcmp (trmode, " or" ) == 0 ) {
524+ mTriggerModes .push_back (o2::eventgen::Generator::kTriggerOR );
525+ trigger_specs ();
526+ } else if (strcmp (trmode, " and" ) == 0 ) {
527+ mTriggerModes .push_back (o2::eventgen::Generator::kTriggerAND );
528+ trigger_specs ();
529+ } else if (strcmp (trmode, " off" ) == 0 ) {
530+ mTriggerModes .push_back (o2::eventgen::Generator::kTriggerOFF );
531+ mTriggerMacros .push_back ({" " });
532+ mTriggerFuncs .push_back ({" " });
533+ } else {
534+ LOG (warn) << " Wrong trigger mode provided for generator " << name << " , keeping trigger OFF" ;
535+ mTriggerModes .push_back (o2::eventgen::Generator::kTriggerOFF );
536+ mTriggerMacros .push_back ({" " });
537+ mTriggerFuncs .push_back ({" " });
538+ }
539+ } else {
540+ LOG (warn) << " No trigger mode provided for generator " << name << " , turning trigger OFF" ;
541+ mTriggerModes .push_back (o2::eventgen::Generator::kTriggerOFF );
542+ mTriggerMacros .push_back ({" " });
543+ mTriggerFuncs .push_back ({" " });
544+ }
545+ } else {
546+ mTriggerModes .push_back (o2::eventgen::Generator::kTriggerOFF );
547+ mTriggerMacros .push_back ({" " });
548+ mTriggerFuncs .push_back ({" " });
549+ }
453550 return true ;
454551}
455552
0 commit comments