File indexing completed on 2023-10-25 09:56:03
0001 #include "L1Trigger/RegionalCaloTrigger/interface/L1RCTLookupTables.h"
0002 #include "L1Trigger/RegionalCaloTrigger/interface/L1RCTReceiverCard.h"
0003
0004 #include <vector>
0005 using std::vector;
0006
0007 #include <bitset>
0008 using std::bitset;
0009
0010 #include <iostream>
0011 using std::cerr;
0012 using std::cout;
0013 using std::endl;
0014
0015 #include <string>
0016 using std::string;
0017
0018 L1RCTReceiverCard::L1RCTReceiverCard(int crateNumber, int cardNumber, const L1RCTLookupTables *rctLookupTables)
0019 : regions(2),
0020 crtNo(crateNumber),
0021 cardNo(cardNumber),
0022 rctLookupTables_(rctLookupTables),
0023 etIn10Bits(2),
0024 overFlowBits(2),
0025 muonBits(2),
0026 tauBits(2) {}
0027
0028 L1RCTReceiverCard::~L1RCTReceiverCard() {}
0029
0030 void L1RCTReceiverCard::randomInput() {
0031 std::vector<unsigned short> input(64);
0032 for (int i = 0; i < 64; i++)
0033 input.at(i) = rand() & 511;
0034 fillInput(input);
0035 }
0036
0037 void L1RCTReceiverCard::fileInput(char *filename) {
0038 std::vector<unsigned short> input(64);
0039 unsigned short x;
0040 std::ifstream instream(filename);
0041 if (instream) {
0042 for (int i = 0; i < 64; i++) {
0043 if (!(instream >> x))
0044 break;
0045 else
0046 input.at(i) = x;
0047 }
0048 }
0049 fillInput(input);
0050 }
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 void L1RCTReceiverCard::fillInput(const std::vector<unsigned short> &input) {
0072 std::vector<unsigned short> ecalInput(32);
0073 std::vector<unsigned short> ecalFG(32);
0074 std::vector<unsigned short> hcalInput(32);
0075 std::vector<unsigned short> hcalMuon(32);
0076
0077 for (int i = 0; i < 32; i++) {
0078 ecalInput.at(i) = input.at(i) / 2;
0079 ecalFG.at(i) = input.at(i) & 1;
0080 hcalInput.at(i) = input.at(i + 32) / 2;
0081 hcalMuon.at(i) = input.at(i + 32) & 1;
0082 unsigned long lookup = rctLookupTables_->lookup(
0083 ecalInput.at(i), hcalInput.at(i), ecalFG.at(i), crtNo, cardNo, i);
0084 unsigned short etIn7Bits = lookup & 127;
0085 unsigned short etIn9Bits = (lookup >> 8) & 511;
0086 unsigned short HE_FGBit = (lookup >> 7) & 1;
0087 unsigned short activityBit = (lookup >> 17) & 1;
0088 std::vector<unsigned short> indices = towerToRegionMap(i);
0089 unsigned short r = indices.at(0);
0090 unsigned short row = indices.at(1);
0091 unsigned short col = indices.at(2);
0092 regions.at(r).setEtIn7Bits(row, col, etIn7Bits);
0093 regions.at(r).setEtIn9Bits(row, col, etIn9Bits);
0094 regions.at(r).setHE_FGBit(row, col, HE_FGBit);
0095 regions.at(r).setMuonBit(row, col, hcalMuon.at(i));
0096 regions.at(r).setActivityBit(row, col, activityBit);
0097 }
0098 }
0099
0100 vector<unsigned short> L1RCTReceiverCard::towerToRegionMap(int towernum) {
0101 std::vector<unsigned short> returnVec(3);
0102 unsigned short region;
0103 unsigned short towerrow;
0104 unsigned short towercol;
0105 if (crtNo < 9) {
0106 if (cardNo != 6) {
0107 if (towernum < 16) {
0108 region = 0;
0109 towerrow = towernum % 4;
0110 towercol = 3 - (towernum / 4);
0111 } else {
0112 region = 1;
0113 towerrow = towernum % 4;
0114 towercol = 7 - (towernum / 4);
0115 }
0116 } else {
0117 if (towernum < 16) {
0118 region = 0;
0119 towerrow = towernum % 4;
0120 towercol = 3 - (towernum / 4);
0121 } else {
0122 region = 1;
0123 towerrow = towernum % 4;
0124 towercol = (towernum / 4) - 4;
0125 }
0126 }
0127 } else {
0128 if (cardNo != 6) {
0129 if (towernum < 16) {
0130 region = 0;
0131 towerrow = towernum % 4;
0132 towercol = towernum / 4;
0133 } else {
0134 region = 1;
0135 towerrow = towernum % 4;
0136 towercol = (towernum / 4) - 4;
0137 }
0138 } else {
0139 if (towernum < 16) {
0140 region = 0;
0141 towerrow = towernum % 4;
0142 towercol = towernum / 4;
0143 } else {
0144 region = 1;
0145 towerrow = towernum % 4;
0146 towercol = 7 - (towernum / 4);
0147 }
0148 }
0149 }
0150 returnVec.at(0) = region;
0151 returnVec.at(1) = towerrow;
0152 returnVec.at(2) = towercol;
0153 return returnVec;
0154 }
0155
0156 void L1RCTReceiverCard::fillTauBits() {
0157 for (int i = 0; i < 2; i++)
0158 tauBits.at(i) = calcTauBit(regions.at(i));
0159 }
0160
0161 unsigned short L1RCTReceiverCard::calcTauBit(L1RCTRegion region) {
0162 bitset<4> etaPattern;
0163 bitset<4> phiPattern;
0164
0165 bitset<4> badPattern5(string("0101"));
0166 bitset<4> badPattern7(string("0111"));
0167 bitset<4> badPattern9(string("1001"));
0168 bitset<4> badPattern10(string("1010"));
0169 bitset<4> badPattern11(string("1011"));
0170 bitset<4> badPattern13(string("1101"));
0171 bitset<4> badPattern14(string("1110"));
0172 bitset<4> badPattern15(string("1111"));
0173
0174 for (int i = 0; i < 4; i++) {
0175 phiPattern[i] = region.getActivityBit(i, 0) || region.getActivityBit(i, 1) || region.getActivityBit(i, 2) ||
0176 region.getActivityBit(i, 3);
0177 etaPattern[i] = region.getActivityBit(0, i) || region.getActivityBit(1, i) || region.getActivityBit(2, i) ||
0178 region.getActivityBit(3, i);
0179 }
0180
0181 bool answer;
0182
0183 if (etaPattern != badPattern5 && etaPattern != badPattern7 && etaPattern != badPattern10 &&
0184 etaPattern != badPattern11 && etaPattern != badPattern13 && etaPattern != badPattern14 &&
0185 etaPattern != badPattern15 && phiPattern != badPattern5 && phiPattern != badPattern7 &&
0186 phiPattern != badPattern10 && phiPattern != badPattern11 && phiPattern != badPattern13 &&
0187 phiPattern != badPattern14 && phiPattern != badPattern15 && etaPattern != badPattern9 &&
0188 phiPattern != badPattern9) {
0189
0190 answer = false;
0191 }
0192
0193 else {
0194 answer = true;
0195 }
0196
0197 return answer;
0198 }
0199
0200 void L1RCTReceiverCard::fillRegionSums() {
0201 for (int i = 0; i < 2; i++) {
0202 etIn10Bits.at(i) = (calcRegionSum(regions.at(i))) / 2;
0203 overFlowBits.at(i) = (calcRegionSum(regions.at(i)) & 1);
0204 }
0205 }
0206
0207 unsigned short L1RCTReceiverCard::calcRegionSum(L1RCTRegion region) {
0208 unsigned short sum = 0;
0209 unsigned short overflow = 0;
0210 for (int i = 0; i < 4; i++) {
0211 for (int j = 0; j < 4; j++) {
0212 unsigned short towerEt = region.getEtIn9Bits(i, j);
0213
0214
0215
0216 sum = sum + towerEt;
0217 }
0218 }
0219 if (sum > 1023) {
0220 sum = 1023;
0221 overflow = 1;
0222 }
0223 unsigned short sumFullInfo = sum * 2 + overflow;
0224 return sumFullInfo;
0225 }
0226
0227 void L1RCTReceiverCard::fillMuonBits() {
0228 for (int i = 0; i < 2; i++)
0229 muonBits.at(i) = calcMuonBit(regions.at(i));
0230 }
0231
0232 unsigned short L1RCTReceiverCard::calcMuonBit(L1RCTRegion region) {
0233 unsigned short muonBit = 0;
0234 for (int i = 0; i < 4; i++) {
0235 for (int j = 0; j < 4; j++) {
0236 muonBit = muonBit || region.getMuonBit(i, j);
0237 }
0238 }
0239 return muonBit;
0240 }
0241
0242 void L1RCTReceiverCard::print() {
0243 std::cout << "Receiver Card " << cardNo << " in Crate " << crtNo << std::endl;
0244
0245 for (int i = 0; i < 2; i++) {
0246 std::cout << "Region " << i << " information" << std::endl;
0247 regions.at(i).print();
0248 std::cout << "Region Et sum " << etIn10Bits.at(i) << std::endl;
0249 std::cout << "Tau Veto Bit " << tauBits.at(i) << std::endl;
0250 std::cout << "Muon Bit " << muonBits.at(i) << std::endl;
0251 }
0252 }