File indexing completed on 2024-09-07 04:36:57
0001 #include "L1Trigger/L1TMuonBarrel/interface/L1TMuonBarrelParamsHelper.h"
0002
0003 void L1TMuonBarrelParamsHelper::print(std::ostream& out) const {
0004 out << "L1 BMTF Parameters" << std::endl;
0005
0006 out << "Firmware version: " << fwVersion_ << std::endl;
0007 }
0008
0009 L1TMuonBarrelParamsHelper::L1TMuonBarrelParamsHelper(const L1TMuonBarrelParams& barrelParams)
0010 : L1TMuonBarrelParams(
0011 barrelParams)
0012 {
0013
0014
0015 }
0016
0017 void L1TMuonBarrelParamsHelper::configFromPy(std::map<std::string, int>& allInts,
0018 std::map<std::string, bool>& allBools,
0019 std::map<std::string, std::vector<std::string> > allMasks,
0020 unsigned int fwVersion,
0021 const std::string& AssLUTpath) {
0022 set_PT_Assignment_nbits_Phi(allInts["PT_Assignment_nbits_Phi"]);
0023 set_PT_Assignment_nbits_PhiB(allInts["PT_Assignment_nbits_PhiB"]);
0024 set_PHI_Assignment_nbits_Phi(allInts["PHI_Assignment_nbits_Phi"]);
0025 set_PHI_Assignment_nbits_PhiB(allInts["PHI_Assignment_nbits_PhiB"]);
0026 set_Extrapolation_nbits_Phi(allInts["Extrapolation_nbits_Phi"]);
0027 set_Extrapolation_nbits_PhiB(allInts["Extrapolation_nbits_PhiB"]);
0028 set_BX_min(allInts["BX_min"]);
0029 set_BX_max(allInts["BX_max"]);
0030 set_Extrapolation_Filter(allInts["Extrapolation_Filter"]);
0031 set_OutOfTime_Filter_Window(allInts["OutOfTime_Filter_Window"]);
0032 set_OutOfTime_Filter(allBools["OutOfTime_Filter"]);
0033 set_Open_LUTs(allBools["Open_LUTs"]);
0034 set_EtaTrackFinder(allBools["EtaTrackFinder"]);
0035 set_Extrapolation_21(allBools["Extrapolation_21"]);
0036 setFwVersion(fwVersion);
0037 set_DisableNewAlgo(allBools["DisableNewAlgo"]);
0038
0039 setAssLUTPath(AssLUTpath);
0040
0041 std::vector<LUT> pta_lut(0);
0042 pta_lut.reserve(19);
0043 std::vector<int> pta_threshold(10);
0044 if (load_pt(pta_lut, pta_threshold, allInts["PT_Assignment_nbits_Phi"], AssLUTpath) != 0) {
0045 cout << "Can not open files to load pt-assignment look-up tables for L1TMuonBarrelTrackProducer!" << endl;
0046 }
0047 setpta_lut(pta_lut);
0048 setpta_threshold(pta_threshold);
0049
0050
0051 std::vector<LUT> phi_lut(0);
0052 phi_lut.reserve(2);
0053 if (load_phi(phi_lut, allInts["PHI_Assignment_nbits_Phi"], allInts["PHI_Assignment_nbits_PhiB"], AssLUTpath) != 0) {
0054 cout << "Can not open files to load phi-assignment look-up tables for L1TMuonBarrelTrackProducer!" << endl;
0055 }
0056 setphi_lut(phi_lut);
0057
0058 l1mudttfparams.reset();
0059 l1mudttfqualplut
0060 .load();
0061 l1mudttfetaplut.load();
0062
0063 lutparams_.eta_lut_ = l1mudttfetaplut.m_lut;
0064 lutparams_.qp_lut_ = l1mudttfqualplut.m_lut;
0065
0066 for (int wh = -3; wh < 4; wh++) {
0067 int sec = 0;
0068 for (char& c : allMasks["mask_phtf_st1"].at(wh + 3)) {
0069 int mask = c - '0';
0070 l1mudttfmasks.set_inrec_chdis_st1(wh, sec, mask);
0071 sec++;
0072 }
0073 sec = 0;
0074 for (char& c : allMasks["mask_phtf_st2"].at(wh + 3)) {
0075 int mask = c - '0';
0076 l1mudttfmasks.set_inrec_chdis_st2(wh, sec, mask);
0077 sec++;
0078 }
0079 sec = 0;
0080 for (char& c : allMasks["mask_phtf_st3"].at(wh + 3)) {
0081 int mask = c - '0';
0082 l1mudttfmasks.set_inrec_chdis_st3(wh, sec, mask);
0083 sec++;
0084 }
0085 sec = 0;
0086 for (char& c : allMasks["mask_phtf_st4"].at(wh + 3)) {
0087 int mask = c - '0';
0088 l1mudttfmasks.set_inrec_chdis_st4(wh, sec, mask);
0089 sec++;
0090 }
0091 sec = 0;
0092 for (char& c : allMasks["mask_ettf_st1"].at(wh + 3)) {
0093 int mask = c - '0';
0094 l1mudttfmasks.set_etsoc_chdis_st1(wh, sec, mask);
0095 sec++;
0096 }
0097 sec = 0;
0098 for (char& c : allMasks["mask_ettf_st2"].at(wh + 3)) {
0099 int mask = c - '0';
0100 l1mudttfmasks.set_etsoc_chdis_st2(wh, sec, mask);
0101 sec++;
0102 }
0103 sec = 0;
0104 for (char& c : allMasks["mask_ettf_st3"].at(wh + 3)) {
0105 int mask = c - '0';
0106 l1mudttfmasks.set_etsoc_chdis_st3(wh, sec, mask);
0107
0108 l1mudttfmasks.set_inrec_chdis_csc(wh, sec, true);
0109 sec++;
0110 }
0111 }
0112
0113
0114 std::vector<L1TMuonBarrelParams::LUTParams::extLUT> ext_lut(0);
0115 ext_lut.reserve(12);
0116 if (load_ext(ext_lut, allInts["PHI_Assignment_nbits_Phi"], allInts["PHI_Assignment_nbits_PhiB"]) != 0) {
0117 cout << "Can not open files to load extrapolation look-up tables for L1TMuonBarrelTrackProducer!" << endl;
0118 }
0119 setext_lut(ext_lut);
0120
0121
0122 }
0123
0124 void L1TMuonBarrelParamsHelper::configFromDB(l1t::TriggerSystem& trgSys) {
0125 std::map<std::string, std::string> procRole = trgSys.getProcToRoleAssignment();
0126
0127
0128 l1mudttfmasks.reset();
0129
0130 for (auto it_proc = procRole.begin(); it_proc != procRole.end(); it_proc++) {
0131 std::string procId = it_proc->first;
0132
0133 std::map<std::string, l1t::Parameter> settings = trgSys.getParameters(procId.c_str());
0134
0135 std::vector<std::string> paths = settings["regTable"].getTableColumn<std::string>("register_path");
0136 std::vector<unsigned int> vals = settings["regTable"].getTableColumn<unsigned int>("register_value");
0137 for (unsigned int row = 0; row < paths.size(); row++) {
0138 if (paths[row].find("open_lut") != std::string::npos) {
0139
0140 set_Open_LUTs(vals[row]);
0141 }
0142 if (paths[row].find("sel_21") != std::string::npos) {
0143
0144 set_Extrapolation_21(vals[row]);
0145 }
0146
0147 if (paths[row].find("dis_newalgo") != std::string::npos) {
0148
0149
0150
0151 bool disnewalgo = (vals[row] == 1);
0152 set_DisableNewAlgo(disnewalgo);
0153 }
0154
0155 string masks[5] = {"mask_ctrl_N2", "mask_ctrl_N1", "mask_ctrl_0", "mask_ctrl_P1", "mask_ctrl_P2"};
0156
0157 for (int m = 0; m < 5; m++) {
0158 if (paths[row].find(masks[m]) != std::string::npos) {
0159
0160 int mask = 0x1 & vals[row];
0161 int mask_all = vals[row];
0162
0163 if (!(mask_all == 0x111111 || mask_all == 0x222222 || mask_all == 0x333333 || mask_all == 0x444444 ||
0164 mask_all == 0x555555 || mask_all == 0x666666 || mask_all == 0x777777))
0165 cerr << "BMTF: Cannot re-emulate properly. Individual link masking cannot be handled." << endl;
0166
0167 if ((mask & 1) > 0) {
0168 for (int sec = 0; sec < 12; sec++) {
0169 if (masks[m] == "mask_ctrl_N2") {
0170 l1mudttfmasks.set_inrec_chdis_st1(-3, sec, true);
0171
0172 }
0173 if (masks[m] == "mask_ctrl_N1") {
0174 l1mudttfmasks.set_inrec_chdis_st1(-2, sec, true);
0175
0176 }
0177
0178 if (masks[m] == "mask_ctrl_0") {
0179 l1mudttfmasks.set_inrec_chdis_st1(-1, sec, true);
0180 l1mudttfmasks.set_inrec_chdis_st1(1, sec, true);
0181
0182
0183 }
0184 if (masks[m] == "mask_ctrl_P1") {
0185 l1mudttfmasks.set_inrec_chdis_st1(2, sec, true);
0186
0187 }
0188 if (masks[m] == "mask_ctrl_P2") {
0189 l1mudttfmasks.set_inrec_chdis_st1(3, sec, true);
0190
0191 }
0192 }
0193 }
0194
0195 if ((mask & 2) > 0) {
0196 for (int sec = 0; sec < 12; sec++) {
0197 if (masks[m] == "mask_ctrl_N2") {
0198 l1mudttfmasks.set_inrec_chdis_st2(-3, sec, true);
0199
0200 }
0201 if (masks[m] == "mask_ctrl_N1") {
0202 l1mudttfmasks.set_inrec_chdis_st2(-2, sec, true);
0203
0204 }
0205
0206 if (masks[m] == "mask_ctrl_0") {
0207 l1mudttfmasks.set_inrec_chdis_st2(-1, sec, true);
0208 l1mudttfmasks.set_inrec_chdis_st2(1, sec, true);
0209
0210
0211 }
0212 if (masks[m] == "mask_ctrl_P1") {
0213 l1mudttfmasks.set_inrec_chdis_st2(2, sec, true);
0214
0215 }
0216 if (masks[m] == "mask_ctrl_P2") {
0217 l1mudttfmasks.set_inrec_chdis_st2(3, sec, true);
0218
0219 }
0220 }
0221 }
0222
0223 if ((mask & 4) > 0) {
0224 for (int sec = 0; sec < 12; sec++) {
0225 if (masks[m] == "mask_ctrl_N2") {
0226 l1mudttfmasks.set_inrec_chdis_st3(-3, sec, true);
0227
0228 }
0229 if (masks[m] == "mask_ctrl_N1") {
0230 l1mudttfmasks.set_inrec_chdis_st3(-2, sec, true);
0231
0232 }
0233
0234 if (masks[m] == "mask_ctrl_0") {
0235 l1mudttfmasks.set_inrec_chdis_st3(-1, sec, true);
0236 l1mudttfmasks.set_inrec_chdis_st3(1, sec, true);
0237
0238
0239 }
0240 if (masks[m] == "mask_ctrl_P1") {
0241 l1mudttfmasks.set_inrec_chdis_st3(2, sec, true);
0242
0243 }
0244 if (masks[m] == "mask_ctrl_P2") {
0245 l1mudttfmasks.set_inrec_chdis_st3(3, sec, true);
0246
0247 }
0248 }
0249 }
0250
0251 if ((mask & 8) > 0) {
0252 for (int sec = 0; sec < 12; sec++) {
0253 if (masks[m] == "mask_ctrl_N2") {
0254 l1mudttfmasks.set_inrec_chdis_st4(-3, sec, true);
0255 }
0256 if (masks[m] == "mask_ctrl_N1") {
0257 l1mudttfmasks.set_inrec_chdis_st4(-2, sec, true);
0258 }
0259
0260 if (masks[m] == "mask_ctrl_0") {
0261 l1mudttfmasks.set_inrec_chdis_st4(-1, sec, true);
0262 l1mudttfmasks.set_inrec_chdis_st4(1, sec, true);
0263 }
0264 if (masks[m] == "mask_ctrl_P1") {
0265 l1mudttfmasks.set_inrec_chdis_st4(2, sec, true);
0266 }
0267 if (masks[m] == "mask_ctrl_P2") {
0268 l1mudttfmasks.set_inrec_chdis_st4(3, sec, true);
0269 }
0270 }
0271 }
0272 }
0273 }
0274 }
0275 }
0276 }
0277
0278 int L1TMuonBarrelParamsHelper::load_pt(std::vector<LUT>& pta_lut,
0279 std::vector<int>& pta_threshold,
0280 unsigned short int nbitphi,
0281 std::string AssLUTpath) {
0282
0283 const int MAX_PTASSMETH = 19;
0284 const int MAX_PTASSMETHA = 12;
0285
0286
0287 enum PtAssMethod {
0288 PT12L,
0289 PT12H,
0290 PT13L,
0291 PT13H,
0292 PT14L,
0293 PT14H,
0294 PT23L,
0295 PT23H,
0296 PT24L,
0297 PT24H,
0298 PT34L,
0299 PT34H,
0300 PB12H,
0301 PB13H,
0302 PB14H,
0303 PB21H,
0304 PB23H,
0305 PB24H,
0306 PB34H,
0307 NODEF
0308 };
0309
0310
0311 string pta_str = "";
0312
0313
0314
0315 int nbit_phi = nbitphi;
0316 int sh_phi = 12 - nbit_phi;
0317
0318
0319 for (int pam = 0; pam < MAX_PTASSMETH; pam++) {
0320 switch (pam) {
0321 case PT12L: {
0322 pta_str = "pta12l";
0323 break;
0324 }
0325 case PT12H: {
0326 pta_str = "pta12h";
0327 break;
0328 }
0329 case PT13L: {
0330 pta_str = "pta13l";
0331 break;
0332 }
0333 case PT13H: {
0334 pta_str = "pta13h";
0335 break;
0336 }
0337 case PT14L: {
0338 pta_str = "pta14l";
0339 break;
0340 }
0341 case PT14H: {
0342 pta_str = "pta14h";
0343 break;
0344 }
0345 case PT23L: {
0346 pta_str = "pta23l";
0347 break;
0348 }
0349 case PT23H: {
0350 pta_str = "pta23h";
0351 break;
0352 }
0353 case PT24L: {
0354 pta_str = "pta24l";
0355 break;
0356 }
0357 case PT24H: {
0358 pta_str = "pta24h";
0359 break;
0360 }
0361 case PT34L: {
0362 pta_str = "pta34l";
0363 break;
0364 }
0365 case PT34H: {
0366 pta_str = "pta34h";
0367 break;
0368 }
0369 case PB12H: {
0370 pta_str = "ptb12h_Feb2016";
0371 break;
0372 }
0373 case PB13H: {
0374 pta_str = "ptb13h_Feb2016";
0375 break;
0376 }
0377 case PB14H: {
0378 pta_str = "ptb14h_Feb2016";
0379 break;
0380 }
0381 case PB21H: {
0382 pta_str = "ptb21h_Feb2016";
0383 break;
0384 }
0385 case PB23H: {
0386 pta_str = "ptb23h_Feb2016";
0387 break;
0388 }
0389 case PB24H: {
0390 pta_str = "ptb24h_Feb2016";
0391 break;
0392 }
0393 case PB34H: {
0394 pta_str = "ptb34h_Feb2016";
0395 break;
0396 }
0397 }
0398
0399
0400 const string& lutpath = AssLUTpath;
0401 edm::FileInPath lut_f = edm::FileInPath(string(lutpath + pta_str + ".lut"));
0402 string pta_file = lut_f.fullPath();
0403
0404
0405 L1TriggerLutFile file(pta_file);
0406 if (file.open() != 0)
0407 return -1;
0408
0409
0410 int shift = sh_phi;
0411 int adr_old = -2048 >> shift;
0412 if (pam >= MAX_PTASSMETHA)
0413 adr_old = -512 >> shift;
0414
0415 LUT tmplut;
0416
0417 int number = -1;
0418 int sum_pt = 0;
0419
0420 if (file.good()) {
0421 int threshold = file.readInteger();
0422 pta_threshold[pam / 2] = threshold;
0423 }
0424
0425
0426 while (file.good()) {
0427 int adr = (file.readInteger()) >> shift;
0428 int pt = file.readInteger();
0429
0430 number++;
0431
0432 if (adr != adr_old) {
0433 assert(number);
0434 tmplut.insert(make_pair(adr_old, (sum_pt / number)));
0435
0436 adr_old = adr;
0437 number = 0;
0438 sum_pt = 0;
0439 }
0440
0441 sum_pt += pt;
0442
0443 if (!file.good())
0444 file.close();
0445 }
0446
0447 file.close();
0448 pta_lut.push_back(tmplut);
0449 }
0450 return 0;
0451 }
0452
0453 int L1TMuonBarrelParamsHelper::load_phi(std::vector<LUT>& phi_lut,
0454 unsigned short int nbit_phi,
0455 unsigned short int nbit_phib,
0456 std::string AssLUTpath) {
0457
0458
0459
0460 int sh_phi = 12 - nbit_phi;
0461 int sh_phib = 10 - nbit_phib;
0462
0463 string phi_str;
0464
0465 for (int idx = 0; idx < 2; idx++) {
0466 switch (idx) {
0467 case 0: {
0468 phi_str = "phi12";
0469 break;
0470 }
0471 case 1: {
0472 phi_str = "phi42";
0473 break;
0474 }
0475 }
0476
0477
0478 edm::FileInPath lut_f = edm::FileInPath(string(AssLUTpath + phi_str + ".lut"));
0479 string phi_file = lut_f.fullPath();
0480
0481
0482 L1TriggerLutFile file(phi_file);
0483 if (file.open() != 0)
0484 return -1;
0485
0486 LUT tmplut;
0487
0488 int number = -1;
0489 int adr_old = -512 >> sh_phib;
0490 int sum_phi = 0;
0491
0492
0493 while (file.good()) {
0494 int adr = (file.readInteger()) >> sh_phib;
0495 int phi = file.readInteger();
0496
0497 number++;
0498
0499 if (adr != adr_old) {
0500 assert(number);
0501 tmplut.insert(make_pair(adr_old, ((sum_phi / number) >> sh_phi)));
0502
0503 adr_old = adr;
0504 number = 0;
0505 sum_phi = 0;
0506 }
0507
0508 sum_phi += phi;
0509
0510 if (!file.good())
0511 file.close();
0512 }
0513
0514 file.close();
0515 phi_lut.push_back(tmplut);
0516 }
0517 return 0;
0518 }
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538 int L1TMuonBarrelParamsHelper::load_ext(std::vector<L1TMuonBarrelParams::LUTParams::extLUT>& ext_lut,
0539 unsigned short int nbit_phi,
0540 unsigned short int nbit_phib) {
0541
0542 const int MAX_EXT = 12;
0543
0544
0545 enum Extrapolation { EX12, EX13, EX14, EX21, EX23, EX24, EX34, EX15, EX16, EX25, EX26, EX56 };
0546
0547
0548 string defaultPath = "L1Trigger/L1TMuon/data/bmtf_luts/";
0549 string ext_dir = "LUTs_Ext/";
0550 string ext_str = "";
0551
0552
0553
0554
0555
0556 int sh_phi = 12 - nbit_phi;
0557 int sh_phib = 10 - nbit_phib;
0558
0559
0560 for (int ext = 0; ext < MAX_EXT; ext++) {
0561 switch (ext) {
0562 case EX12:
0563 ext_str = "ext12";
0564 break;
0565 case EX13:
0566 ext_str = "ext13";
0567 break;
0568 case EX14:
0569 ext_str = "ext14";
0570 break;
0571 case EX21:
0572 ext_str = "ext21";
0573 break;
0574 case EX23:
0575 ext_str = "ext23";
0576 break;
0577 case EX24:
0578 ext_str = "ext24";
0579 break;
0580 case EX34:
0581 ext_str = "ext34";
0582 break;
0583 case EX15:
0584 ext_str = "ext15";
0585 break;
0586 case EX16:
0587 ext_str = "ext16";
0588 break;
0589 case EX25:
0590 ext_str = "ext25";
0591 break;
0592 case EX26:
0593 ext_str = "ext26";
0594 break;
0595 case EX56:
0596 ext_str = "ext56";
0597 break;
0598 }
0599
0600
0601 edm::FileInPath lut_f = edm::FileInPath(string(defaultPath + ext_dir + ext_str + ".lut"));
0602 string ext_file = lut_f.fullPath();
0603
0604
0605 L1TriggerLutFile file(ext_file);
0606 if (file.open() != 0)
0607 return -1;
0608
0609
0610
0611 L1TMuonBarrelParams::LUTParams::extLUT tmplut;
0612
0613 int number = -1;
0614 int adr_old = -512 >> sh_phib;
0615 int sum_low = 0;
0616 int sum_high = 0;
0617
0618
0619 while (file.good()) {
0620 int adr = (file.readInteger()) >> sh_phib;
0621 int low = (file.readInteger());
0622 int high = (file.readInteger());
0623
0624 number++;
0625
0626 if (adr != adr_old) {
0627 tmplut.low[adr_old] = sum_low >> sh_phi;
0628 tmplut.high[adr_old] = sum_high >> sh_phi;
0629
0630 adr_old = adr;
0631 number = 0;
0632 sum_low = 0;
0633 sum_high = 0;
0634 }
0635
0636 if (number == 0)
0637 sum_low = low;
0638 if (number == 0)
0639 sum_high = high;
0640
0641 if (!file.good())
0642 file.close();
0643 }
0644
0645 file.close();
0646 ext_lut.push_back(tmplut);
0647 }
0648 return 0;
0649 }