Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-05 03:16:36

0001 #include "L1Trigger/L1TGEM/interface/ME0StubAlgoPatUnitMux.h"
0002 
0003 using namespace l1t::me0;
0004 
0005 uint64_t l1t::me0::parseData(const UInt192& data, int strip, int maxSpan) {
0006   UInt192 dataShifted;
0007   uint64_t parsedData;
0008   if (strip < maxSpan / 2 + 1) {
0009     dataShifted = data << (maxSpan / 2 - strip);
0010     parsedData = (dataShifted & UInt192(0xffffffffffffffff >> (64 - maxSpan))).to_ullong();
0011   } else {
0012     dataShifted = data >> (strip - maxSpan / 2);
0013     parsedData = (dataShifted & UInt192(0xffffffffffffffff >> (64 - maxSpan))).to_ullong();
0014   }
0015   return parsedData;
0016 }
0017 std::vector<uint64_t> l1t::me0::extractDataWindow(const std::vector<UInt192>& layerData, int strip, int maxSpan) {
0018   std::vector<uint64_t> out;
0019   out.reserve(layerData.size());
0020   for (const UInt192& data : layerData) {
0021     out.push_back(parseData(data, strip, maxSpan));
0022   }
0023   return out;
0024 }
0025 std::vector<int> l1t::me0::parseBxData(const std::vector<int>& bxData, int strip, int maxSpan) {
0026   std::vector<int> dataShifted;
0027   std::vector<int> parsedBxData;
0028   if (strip < maxSpan / 2 + 1) {
0029     std::vector<std::vector<int>> seed = {std::vector<int>((maxSpan / 2 - strip), -9999), bxData};
0030     dataShifted = concatVector(seed);
0031     parsedBxData = std::vector<int>(dataShifted.begin(), dataShifted.begin() + maxSpan);
0032   } else {
0033     int shift = strip - maxSpan / 2;
0034     int numAppendedNeeded = shift + maxSpan - static_cast<int>(bxData.size());
0035     if (numAppendedNeeded > 0) {
0036       std::vector<std::vector<int>> seed = {bxData, std::vector<int>(numAppendedNeeded, -9999)};
0037       dataShifted = concatVector(seed);
0038     } else {
0039       dataShifted = bxData;
0040     }
0041     parsedBxData = std::vector<int>(dataShifted.begin() + shift, dataShifted.begin() + shift + maxSpan);
0042   }
0043   return parsedBxData;
0044 }
0045 std::vector<std::vector<int>> l1t::me0::extractBxDataWindow(const std::vector<std::vector<int>>& layerData,
0046                                                             int strip,
0047                                                             int maxSpan) {
0048   std::vector<std::vector<int>> out;
0049   out.reserve(layerData.size());
0050   for (const std::vector<int>& data : layerData) {
0051     out.push_back(parseBxData(data, strip, maxSpan));
0052   }
0053   return out;
0054 }
0055 std::vector<ME0StubPrimitive> l1t::me0::patMux(const std::vector<UInt192>& partitionData,
0056                                                const std::vector<std::vector<int>>& partitionBxData,
0057                                                int partition,
0058                                                Config& config) {
0059   std::vector<ME0StubPrimitive> out;
0060   for (int strip = 0; strip < config.width; ++strip) {
0061     const std::vector<uint64_t>& dataWindow = extractDataWindow(partitionData, strip, config.maxSpan);
0062     const std::vector<std::vector<int>>& bxDataWindow = extractBxDataWindow(partitionBxData, strip, config.maxSpan);
0063     const ME0StubPrimitive& seg = patUnit(dataWindow,
0064                                           bxDataWindow,
0065                                           strip,
0066                                           partition,
0067                                           config.layerThresholdPatternId,
0068                                           config.layerThresholdEta,
0069                                           config.maxSpan,
0070                                           config.skipCentroids,
0071                                           config.numOr);
0072     out.push_back(seg);
0073   }
0074   return out;
0075 }