55 if( ( !
menu->hasStore() ) && ( ( !
menu->container() ) ||
56 ( !
menu->container()->hasStore() ) ) ) {
57 msg << MSG::FATAL <<
"prepareTriggerMenu(...) Received "
58 <<
"xAOD::TriggerMenu object is not connected to an auxiliary "
60 return StatusCode::FAILURE;
69 for(
size_t i = 0; i <
menu->itemCtpIds().
size(); ++i ) {
74 if(
menu->itemPrescalesAvailable() ) {
76 static_cast< float >(
menu->itemPrescales()[ i ] ) );
78 if(
msg.level() <= MSG::VERBOSE ) {
79 msg << MSG::VERBOSE <<
"L1 item " <<
menu->itemNames()[ i ]
80 <<
" has ctpid " <<
menu->itemCtpIds()[ i ] <<
endmsg;
89 bool signatureWarningPrinted =
false;
92 for(
size_t i = 0; i <
menu->chainIds().
size(); ++i ) {
95 std::string level =
"";
97 if(
menu->chainNames()[ i ].find(
"L2_" ) == 0 ) {
99 }
else if(
menu->chainNames()[ i ].find(
"EF_" ) == 0 ) {
105 }
else if(
menu->chainNames()[ i ].find(
"HLT_" ) == 0 ) {
108 msg << MSG::WARNING <<
"prepareTriggerMenu(...): "
109 <<
"Couldn't figure out 'level' for chain: "
113 std::vector< HLTSignature* > signatures;
116 if(
menu->chainSignatureCountersAvailable() &&
117 menu->chainSignatureCounters().size() &&
118 menu->chainSignatureLogicsAvailable() &&
119 menu->chainSignatureLogics().size() &&
120 menu->chainSignatureOutputTEsAvailable() &&
121 menu->chainSignatureOutputTEs().size()
125 const std::vector< uint32_t >& counters =
126 menu->chainSignatureCounters()[ i ];
127 const std::vector< int >& logics =
128 menu->chainSignatureLogics()[ i ];
129 const std::vector< std::vector< std::string > >& outputTEs =
130 menu->chainSignatureOutputTEs()[ i ];
136 if(
msg.level() <= MSG::VERBOSE ) {
137 msg << MSG::VERBOSE <<
"chain " <<
menu->chainNames()[ i ]
138 <<
" has counter " <<
menu->chainIds()[ i ]
139 <<
" and " << counters.size() <<
" signatures" <<
endmsg;
141 for(
size_t sig = 0; sig < counters.size(); ++sig ) {
142 std::vector< HLTTriggerElement* > outTEs;
143 outTEs.reserve(outputTEs[ sig ].
size());
144 for(
size_t outTEcounter = 0;
145 outTEcounter< outputTEs[ sig ].size(); ++outTEcounter ) {
148 outTEs.push_back( element );
151 new HLTSignature( counters[ sig ], logics[ sig ], std::move(outTEs) );
152 signatures.push_back( signature );
153 if(
msg.level() <= MSG::VERBOSE ) {
154 msg << MSG::VERBOSE <<
"prepared signature: "
155 << *( signatures.back() ) <<
endmsg;
158 }
else if( ! signatureWarningPrinted ) {
159 msg << MSG::WARNING <<
"prepareTriggerMenu(...): "
160 <<
"HLT Signature information not available on the input"
162 signatureWarningPrinted =
true;
167 menu->chainIds()[ i ],
170 menu->chainParentNames()[ i ],
172 std::move(signatures) );
173 chain->set_has_l2(has_l2);
174 if(
menu->chainRerunPrescalesAvailable() ) {
175 chain->set_rerun_prescale(
menu->chainRerunPrescales()[ i ] );
177 if(
menu->chainPassthroughPrescalesAvailable() ) {
178 chain->set_pass_through(
menu->chainPassthroughPrescales()[ i ] );
180 if (
menu->chainPrescalesAvailable() ) {
181 chain->set_prescale(
menu->chainPrescales()[ i ]);
185 std::vector<long unsigned int> leg_multiplicities(parsed_multiplicities.begin(), parsed_multiplicities.end());
186 chain->set_leg_multiplicities( leg_multiplicities );
190 msg << MSG::FATAL <<
"prepareTriggerMenu(...): "
191 <<
"Couldn't add chain \"" << chain->name()
194 return StatusCode::FAILURE;
199 if(
menu->sequenceInputTEsAvailable() &&
200 menu->sequenceOutputTEsAvailable() &&
201 menu->sequenceAlgorithmsAvailable() ) {
203 for(
size_t i = 0; i<
menu->sequenceOutputTEs().
size(); ++i ) {
206 std::vector< HLTTriggerElement* > inputTEs;
207 for(
size_t j = 0; j <
menu->sequenceInputTEs()[ i ].
size(); ++j ) {
210 inputTEs.push_back( te );
214 menu->sequenceAlgorithms()[ i ] );
220 msg << MSG::WARNING <<
"prepareTriggerMenu(...): "
221 <<
"HLT Sequence information not available on the input" <<
endmsg;
225 if(
menu->bunchGroupBunchesAvailable() ) {
232 for(
size_t i = 0; i <
menu->bunchGroupBunches().
size(); ++i ) {
236 bg.setInternalNumber( i );
237 std::vector< uint16_t >::const_iterator b_itr =
238 menu->bunchGroupBunches()[ i ].begin();
239 std::vector< uint16_t >::const_iterator b_end =
240 menu->bunchGroupBunches()[ i ].end();
241 for( ; b_itr != b_end; ++b_itr ) {
242 bg.addBunch( *b_itr );
253 msg << MSG::WARNING <<
"prepareTriggerMenu(...): "
254 <<
"Bunch-group information not available on the "
259 msg << MSG::INFO <<
"Loaded xAOD::TriggerMenu configuration:" <<
endmsg;
260 msg << MSG::INFO <<
" SMK = " <<
menu->smk()
261 <<
", L1PSK = " <<
menu->l1psk()
265 return StatusCode::SUCCESS;
327 for (
const L1Item& loadedItem : loadedL1) {
329 item->
setName( loadedItem.name() );
330 item->
setCtpId( loadedItem.ctpId() );
336 ps = loadedPrescale.
enabled ?
static_cast< float >( loadedPrescale.
prescale ) : -1.0;
340 if(
msg.level() <= MSG::VERBOSE ) {
341 msg << MSG::VERBOSE <<
"L1 item " << loadedItem.name()
342 <<
" has ctpid " << loadedItem.ctpId()
343 <<
" and prescale " << ps
351 sequenceList.
clear();
355 for (
const Chain& loadedChain : loadedHlt) {
357 std::string level =
"";
358 if( loadedChain.name().find(
"L2_" ) == 0 ) {
360 }
else if( loadedChain.name().find(
"EF_" ) == 0 ) {
362 }
else if( loadedChain.name().find(
"HLT_" ) == 0 ) {
365 msg << MSG::WARNING <<
"prepareTriggerMenu(...): "
366 <<
"Couldn't figure out 'level' for chain: "
367 << loadedChain.name() <<
endmsg;
371 std::vector< HLTSignature* > signatures;
374 std::vector<uint32_t> counters;
375 std::vector<int> logics;
376 std::vector<std::vector<std::string>> outputTEs;
377 if (loadedChain.hasChild(
"signature")) {
383 for(
size_t sig = 0; sig < counters.size(); ++sig ) {
384 std::vector< HLTTriggerElement* > outTEs;
385 outTEs.reserve(outputTEs[ sig ].
size());
386 for(
size_t outTEcounter = 0; outTEcounter< outputTEs[ sig ].size(); ++outTEcounter ) {
388 outTEs.push_back( element );
391 signatures.push_back( signature );
392 if(
msg.level() <= MSG::VERBOSE ) {
393 msg << MSG::VERBOSE <<
"prepared signature: " << *( signatures.back() ) <<
endmsg;
399 loadedChain.counter(),
402 loadedChain.l1item(),
404 std::move(signatures) );
407 chain->set_has_l2(
false);
408 chain->set_rerun_prescale( -1.0 );
409 chain->set_pass_through( -1.0 );
410 chain->set_leg_multiplicities( loadedChain.legMultiplicities() );
412 for (
const std::string& group : loadedChain.groups()){
413 chain->addGroup(group);
419 ps = loadedPrescale.
enabled ?
static_cast< float >( loadedPrescale.
prescale ) : -1.0;
421 chain->set_prescale( ps );
423 if(
msg.level() <= MSG::VERBOSE ) {
424 msg << MSG::VERBOSE <<
"chain " << loadedChain.name()
425 <<
" has counter " << loadedChain.counter()
426 <<
", HLT prescale " << ps
427 <<
", groups " << loadedChain.groups().size() <<
", legs " << loadedChain.legMultiplicities().size()
428 <<
", and " << counters.size() <<
" signatures (runs 1,2 only) " <<
endmsg;
433 msg << MSG::FATAL <<
"prepareTriggerMenu(...): "
434 <<
"Couldn't add chain \"" << chain->name()
437 return StatusCode::FAILURE;
443 if( loadedHlt.
hasChild(
"sequence_run2") ) {
444 std::vector<std::string> menu_outputTEs =
ToVector<std::string>(loadedHlt,
"sequence_run2.outputTEs");
448 for(
size_t i = 0; i< menu_outputTEs.size(); ++i ) {
450 std::vector< HLTTriggerElement* > inputTEs;
451 for(
size_t j = 0; j < menu_inputTEs[ i ].size(); ++j ) {
453 inputTEs.push_back( te );
470 for(
size_t i = 0; i < 16; ++i ) {
472 bg.setInternalNumber(i);
479 for(
size_t i = 0; i < loadedBgSet.
size(); ++i ) {
481 const std::shared_ptr<L1BunchGroup> loadedBg = loadedBgSet.
getBunchGroup(i);
485 bg.setInternalNumber(i);
488 for (
const uint16_t b : loadedBg->bunches()) {
489 bg.addBunch(
static_cast<int>(b) );
498 static_assert(std::is_move_assignable<BunchGroupSet>::value);
500 bgSet = std::move(bgSetNew);
503 return StatusCode::SUCCESS;
StatusCode prepareTriggerMenu(const xAOD::TriggerMenu *menu, CTPConfig &ctpConfig, HLTChainList &chainList, HLTSequenceList &sequenceList, BunchGroupSet &bgSet, MsgStream &msg)
In order to avoid duplicating code between how the dual-use and the Athena-only code translates the x...