10 #include "GaudiKernel/ITHistSvc.h"
11 #include <nlohmann/json.hpp>
37 const std::string& L1name = L1item.name();
38 if (L1name == L1_item){
39 const std::string& L1definition = L1item.definition();
47 ATH_MSG_DEBUG(
"Warning: L1 item '" << L1_item <<
"' not found in the L1 menu!");
57 std::map<std::string, TriggerInfo> triggerMap;
62 std::regex re(R
"(([\w\d_-]+)
)");
64 std::sregex_iterator end;
65 std::vector<size_t> triggerPositions;
69 std::smatch
match = *iter;
70 std::string triggerName =
match.str(1);
71 std::string triggerCount =
match.str(2);
72 info.triggers.push_back(triggerCount + triggerName);
75 triggerPositions.push_back(
match.position(0) +
match.length(0));
80 for (
size_t j = 0; j < triggerPositions.size(); ++j) {
81 size_t pos = triggerPositions[j];
86 [](
unsigned char c) { return std::isspace(c); }),
90 if (
part.find(
"&") != std::string::npos) {
91 info.operations.push_back(
"&");
92 }
else if (
part.find(
"|") != std::string::npos) {
93 info.operations.push_back(
"|");
100 lastPart.erase(std::remove_if(lastPart.begin(), lastPart.end(),
101 [](
unsigned char c) {
return std::isspace(
c); }),
108 for (
const auto& pair : triggerMap) {
110 for (
size_t i = 0;
i < pair.second.triggers.size(); ++
i) {
112 if (
i < pair.second.operations.size()) {
120 std::vector<std::string> beforeCTP_triggers;
121 std::vector<std::string> beforeCTP_triggers_mult;
123 for (
const auto& pair : triggerMap) {
124 for (
size_t i = 0;
i < pair.second.triggers.size(); ++
i) {
125 beforeCTP_triggers_mult.push_back(pair.second.triggers[
i]);
126 size_t pos_number = 0;
127 while (pos_number < (pair.second.triggers[
i]).size() && std::isdigit((pair.second.triggers[
i])[pos_number])) {
130 beforeCTP_triggers.push_back((pair.second.triggers[
i]).substr(pos_number));
134 std::unordered_set<std::string> seen_mult;
135 std::vector<std::string> beforeCTP_triggers_mult_unique;
137 for (
const auto& str_mult : beforeCTP_triggers_mult) {
138 auto [
it, inserted] = seen_mult.insert(str_mult);
140 beforeCTP_triggers_mult_unique.push_back(str_mult);
144 std::sort(beforeCTP_triggers.begin(), beforeCTP_triggers.end());
145 auto beforeCTP_triggers_unique = std::unique(beforeCTP_triggers.begin(), beforeCTP_triggers.end());
146 beforeCTP_triggers.erase(beforeCTP_triggers_unique, beforeCTP_triggers.end());
153 for (
size_t i = 0;
i < beforeCTP_triggers.size(); ++
i){
154 ATH_MSG_DEBUG(
"Filling L1menu parameters from item: " << beforeCTP_triggers[
i]);
157 definition.
clock = 0;
162 for(
const auto & connName :
l1menu->connectorNames() ) {
164 for(
auto &
tl :
conn.triggerLines() ) {
166 if ((connName ==
"Topo2El") || (connName ==
"Topo3El")){
167 for (
size_t fpga = 0; fpga < 2; ++fpga){
168 for (
size_t clock = 0; clock < 2; ++clock){
169 for (
auto &
tl :
conn.triggerLines(fpga,clock)){
170 if (
tl.name() == beforeCTP_triggers[
i]){
172 definition.
nBit =
tl.nbits();
174 if (connName ==
"Topo2El") definition.
conID = 2;
175 if (connName ==
"Topo3El") definition.
conID = 3;
184 if (
tl.name() == beforeCTP_triggers[
i]){
186 definition.
nBit =
tl.nbits();
187 definition.
clock = 0;
188 if (connName ==
"Topo1Opt0") definition.
conID = 4;
189 if (connName ==
"Topo1Opt1") definition.
conID = 5;
190 if (connName ==
"Topo1Opt2") definition.
conID = 6;
191 if (connName ==
"Topo1Opt3") definition.
conID = 7;
202 return StatusCode::SUCCESS;
209 ATH_MSG_DEBUG(
"################## Registering rates matrix:");
210 m_ratesMatrixHist =
new TH2D(
"rates_matrix",
"L1item Rates matrix",150,-3,3,150,-3,3);
226 std::set<std::string> triggerGroup {
"RATE_SingleElectron"};
230 std::vector<double> vector_zeros(
m_L1_items.size(), 0);
250 return StatusCode::SUCCESS;
259 std::vector<uint32_t>result_vector(2,0);
262 long long topoWordPrint =
result->topoWord64();
263 std::bitset<64> wordPrint(topoWordPrint);
264 if (
result->connectionId() != definition.
conID)
continue;
266 std::vector<uint32_t> connectorWords(4);
276 long long topoWordOverflow =
result->topoWordOverflow();
279 std::bitset<32> wordOver(topoWordOverflow);
280 word = wordRes | wordOver;
282 connectorWords[
result->clock()] =
static_cast<uint32_t>(word.to_ullong());
287 long long topoWord64Overflow =
result->topoWord64Overflow();
290 std::bitset<64> wordOver(topoWord64Overflow);
291 word = wordRes | wordOver;
294 connectorWords[2*
result->clock() + 0] =
static_cast<uint32_t>(word.to_ullong());
295 connectorWords[2*
result->clock() + 1] =
static_cast<uint32_t>(word.to_ullong() >> 32);
300 unsigned int startOffset = 0;
302 if (
result->connectionId() == 5 ||
result->connectionId() == 7){
307 resultValue =
extractResult(connectorWords, definition, startOffset);
308 result_vector[
result->clock()] = resultValue;
311 if ((result_vector[0]>1)||(result_vector[1]>1)){
312 if (result_vector[0]>1) resultValue = result_vector[0];
313 if (result_vector[1]>1) resultValue = result_vector[1];
315 resultValue = result_vector[0] || result_vector[1];
331 unsigned int startindex = definition.
flatindex + startOffset;
332 unsigned int endindex = startindex + definition.
nBit - 1;
333 unsigned int firstWord = startindex / 32;
334 unsigned int lastWord = endindex / 32;
335 unsigned int nBitAdded = 0;
338 if ((firstWord>1) | (lastWord>1)){
339 firstWord = firstWord%3;
340 lastWord = lastWord%3;
343 std::vector<uint32_t>result_vec(lastWord,0);
346 for (
unsigned int wordIndex=firstWord; wordIndex <= lastWord; wordIndex++) {
347 unsigned int startPosInWord = (wordIndex == firstWord) ? (startindex % 32) : 0 ;
348 unsigned int endPosInWord = (wordIndex == lastWord) ? (endindex % 32) : 31;
350 mask = ( ( 1
u<< (endPosInWord+1) ) - 1 );
351 word = connectorContents[wordIndex] &
mask;
352 word >>= startPosInWord;
353 result |= word << nBitAdded;
354 nBitAdded += endPosInWord - startPosInWord + 1;
355 result_vec.push_back(
result);
357 if (result_vec.size()>1){
358 result = result_vec[0] || result_vec[1];
371 const std::vector<uint32_t>
l1Triggers = trigDecision->
tbp();
375 ATH_MSG_FATAL(
"Could not retrieve L1Topo EDM Container from the Simulation.");
376 return StatusCode::FAILURE;
379 std::vector<std::string> l1Items_vector;
381 std::vector<uint32_t> resultValue(l1Items_vector.size(), 0);
386 std::map<std::string, bool> beforeCTP_result_Map;
396 ATH_MSG_DEBUG(
"Decision from the decoder (L1TopoResultsContainer): " << resultValue[
i]);
403 while (
pos < mult_item.size() && std::isdigit(mult_item[
pos])) {
406 std::string leading_number = mult_item.substr(0,
pos);
407 std::string item_name = mult_item.substr(
pos);
410 if (item_name == l1Items_vector[
i]) {
412 if (resultValue[
i] >= 1){
413 beforeCTP_result_Map[mult_item] =
true;
427 std::map<std::string, bool> L1_result_Map;
428 std::vector<bool> isPassed_L1item;
432 const std::string&
key = pair.first;
434 if (
info.triggers.empty())
continue;
436 bool result = beforeCTP_result_Map[
info.triggers[0]];
438 for (
size_t i = 1;
i <
info.triggers.size(); ++
i) {
439 const std::string& currentTrigger =
info.triggers[
i];
440 const std::string& currentOp =
info.operations[
i - 1];
441 if (currentOp ==
"&") {
442 result &= beforeCTP_result_Map[currentTrigger];
443 }
else if (currentOp ==
"|") {
444 result |= beforeCTP_result_Map[currentTrigger];
448 isPassed_L1item.push_back(
result);
455 for (
const auto& pair : L1_result_Map) {
456 const std::string&
label = pair.first;
475 return StatusCode::SUCCESS;
489 return StatusCode::SUCCESS;