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 }