Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:21:03

0001 #include "L1Trigger/L1TMuonEndCapPhase2/interface/EMTFContext.h"
0002 #include "L1Trigger/L1TMuonEndCapPhase2/interface/Utils/DebugUtils.h"
0003 
0004 #include "L1Trigger/L1TMuonEndCapPhase2/interface/EMTFModel.h"
0005 
0006 using namespace emtf::phase2;
0007 using namespace emtf::phase2::model;
0008 
0009 EMTFModel::EMTFModel(const EMTFContext& context) : context_(context) {
0010   // ===========================================================================
0011   // Zone 0
0012   // ===========================================================================
0013 
0014   // clang-format off
0015     zones::hitmap_t&& zone0_hm = {
0016         { // Row 0
0017             {
0018                 site_id_t::kME0, {
0019                     {114,   38,     90 },
0020                     {108,   75,     127},
0021                     {109,   113,    165},
0022                     {110,   150,    202},
0023                     {111,   188,    240},
0024                     {112,   225,    277},
0025                     {113,   263,    315}
0026                 }
0027             }
0028         },
0029         { // Row 1
0030             {
0031                 site_id_t::kGE11, {
0032                     {99 ,   38,     90 },
0033                     {54 ,   75,     127},
0034                     {55 ,   113,    165},
0035                     {56 ,   150,    202},
0036                     {63 ,   188,    240},
0037                     {64 ,   225,    277},
0038                     {65 ,   263,    315}
0039                 }
0040             }
0041         },
0042         { // Row 2
0043             {
0044                 site_id_t::kME11, {
0045                     {45 ,   38,     90 },
0046                     {0  ,   75,     127},
0047                     {1  ,   113,    165},
0048                     {2  ,   150,    202},
0049                     {9  ,   188,    240},
0050                     {10 ,   225,    277},
0051                     {11 ,   263,    315}
0052                 }
0053             }
0054         },
0055         { // Row 3
0056             {
0057                 site_id_t::kGE21, {
0058                     {102,   0   ,   90 },
0059                     {72 ,   75  ,   165},
0060                     {73 ,   150 ,   240},
0061                     {74 ,   225 ,   315}
0062                 }
0063             }
0064         },
0065         { // Row 4
0066             {
0067                 site_id_t::kME2, {
0068                     {48 ,   0   ,   90 },
0069                     {18 ,   75  ,   165},
0070                     {19 ,   150 ,   240},
0071                     {20 ,   225 ,   315}
0072                 }
0073             }
0074         },
0075         { // Row 5
0076             {
0077                 site_id_t::kME3, {
0078                     {50 ,   0   ,   90 },
0079                     {27 ,   75  ,   165},
0080                     {28 ,   150 ,   240},
0081                     {29 ,   225 ,   315}
0082                 }
0083             }
0084         },
0085         { // Row 6
0086             {
0087                 site_id_t::kRE3, {
0088                     {104,   0   ,   90 },
0089                     {81 ,   75  ,   165},
0090                     {82 ,   150 ,   240},
0091                     {83 ,   225 ,   315}
0092                 }
0093             }
0094         },
0095         { // Row 7
0096             {
0097                 site_id_t::kME4, {
0098                     {52 ,   0   ,   90 },
0099                     {36 ,   75  ,   165},
0100                     {37 ,   150 ,   240},
0101                     {38 ,   225 ,   315}
0102                 }
0103             },
0104             {
0105                 site_id_t::kRE4, {
0106                     {106,   0   ,   90 },
0107                     {90 ,   75  ,   165},
0108                     {91 ,   150 ,   240},
0109                     {92 ,   225 ,   315}
0110                 }
0111             }
0112         },
0113     };
0114 
0115     std::vector<zones::pattern_t> zone0_prompt_pd = {
0116         {{49, 55, 61}, {49, 55, 61}, {50, 55, 60}, {53, 55, 57}, {53, 55, 57}, {54, 55, 56}, {54, 55, 56}, {53, 55, 57}},
0117         {{42, 47, 52}, {42, 47, 52}, {45, 49, 53}, {53, 54, 56}, {53, 55, 57}, {55, 56, 57}, {54, 56, 58}, {54, 56, 59}},
0118         {{58, 63, 68}, {58, 63, 68}, {57, 61, 65}, {54, 56, 57}, {53, 55, 57}, {53, 54, 55}, {52, 54, 56}, {51, 54, 56}},
0119         {{35, 42, 49}, {36, 42, 48}, {39, 45, 51}, {52, 54, 56}, {54, 55, 56}, {54, 57, 59}, {54, 57, 60}, {52, 57, 61}},
0120         {{61, 68, 75}, {62, 68, 74}, {59, 65, 71}, {54, 56, 58}, {54, 55, 56}, {51, 53, 56}, {50, 53, 56}, {49, 53, 58}},
0121         {{21, 33, 45}, {22, 33, 43}, {29, 39, 49}, {51, 54, 56}, {54, 55, 56}, {52, 57, 62}, {51, 57, 63}, {46, 55, 65}},
0122         {{65, 77, 89}, {67, 77, 88}, {61, 71, 81}, {54, 56, 59}, {54, 55, 56}, {48, 53, 58}, {47, 53, 59}, {45, 55, 64}}
0123     };
0124 
0125     zones::quality_lut_t zone0_prompt_ql = {
0126         0, 3, 3, 4, 3, 5, 4, 6, 1, 6, 6, 7, 21, 26, 24, 27, 1, 21, 21, 24, 22, 26, 24, 29,
0127         2, 25, 25, 27, 26, 30, 28, 31, 0, 17, 17, 20, 18, 34, 20, 37, 2, 42, 28, 45, 42, 46, 45, 49,
0128         9, 42, 42, 45, 43, 47, 46, 49, 10, 45, 45, 48, 47, 50, 49, 51, 0, 5, 5, 6, 17, 33, 19, 36,
0129         2, 7, 7, 7, 29, 46, 30, 49, 3, 42, 29, 46, 43, 47, 46, 50, 4, 45, 31, 49, 47, 50, 50, 51,
0130         1, 20, 19, 23, 22, 38, 23, 39, 4, 45, 30, 48, 46, 49, 48, 51, 11, 46, 46, 49, 47, 50, 50, 51,
0131         13, 48, 49, 51, 50, 51, 51, 51, 0, 16, 16, 18, 16, 32, 18, 35, 2, 41, 27, 43, 42, 44, 44, 47,
0132         9, 42, 41, 44, 42, 45, 44, 48, 10, 44, 44, 47, 44, 48, 48, 50, 8, 40, 40, 41, 40, 41, 40, 43,
0133         11, 52, 52, 55, 53, 57, 54, 61, 12, 52, 52, 55, 53, 58, 56, 61, 14, 55, 55, 60, 58, 62, 59, 63,
0134         1, 40, 23, 40, 40, 41, 40, 43, 5, 52, 31, 54, 53, 57, 54, 60, 12, 52, 53, 56, 53, 58, 57, 62,
0135         14, 55, 56, 60, 57, 61, 60, 63, 8, 41, 41, 43, 41, 43, 43, 47, 13, 54, 54, 59, 57, 61, 58, 63,
0136         15, 56, 56, 59, 58, 61, 60, 63, 15, 59, 59, 62, 62, 63, 62, 63
0137     };
0138 
0139     std::vector<zones::pattern_t> zone0_disp_pd = {
0140         {{50, 55, 60}, {50, 55, 60}, {50, 55, 60}, {53, 55, 57}, {53, 55, 57}, {54, 55, 56}, {53, 55, 57}, {53, 55, 57}},
0141         {{53, 61, 67}, {53, 61, 65}, {53, 60, 65}, {54, 56, 57}, {54, 56, 57}, {52, 54, 56}, {52, 54, 56}, {49, 53, 56}},
0142         {{43, 49, 57}, {45, 49, 57}, {45, 50, 57}, {53, 54, 56}, {53, 54, 56}, {54, 56, 58}, {54, 56, 58}, {54, 57, 61}},
0143         {{54, 63, 72}, {54, 63, 70}, {54, 63, 71}, {54, 57, 58}, {54, 56, 56}, {49, 53, 56}, {49, 52, 56}, {45, 51, 56}},
0144         {{38, 47, 56}, {40, 47, 56}, {39, 47, 56}, {52, 53, 56}, {54, 54, 56}, {54, 57, 61}, {54, 58, 61}, {54, 59, 65}},
0145         {{54, 64, 77}, {54, 66, 74}, {54, 66, 76}, {54, 57, 59}, {54, 56, 56}, {46, 52, 56}, {45, 50, 56}, {40, 48, 56}},
0146         {{33, 46, 56}, {36, 44, 56}, {34, 44, 56}, {51, 53, 56}, {54, 54, 56}, {54, 58, 64}, {54, 60, 65}, {54, 62, 70}}
0147     };
0148 
0149     zones::quality_lut_t zone0_disp_ql = {
0150         0, 3, 3, 4, 3, 5, 4, 5, 1, 6, 6, 7, 21, 26, 26, 30, 1, 22, 21, 25, 22, 26, 24, 29,
0151         2, 24, 24, 27, 25, 29, 29, 31, 0, 17, 17, 20, 18, 34, 20, 38, 2, 42, 28, 47, 42, 47, 46, 50,
0152         9, 42, 42, 46, 43, 47, 46, 49, 10, 45, 45, 49, 46, 49, 49, 51, 0, 6, 5, 6, 17, 33, 19, 36,
0153         2, 7, 7, 7, 28, 46, 31, 50, 3, 42, 27, 46, 43, 47, 46, 50, 4, 45, 30, 50, 46, 50, 50, 51,
0154         1, 20, 19, 23, 21, 37, 23, 39, 4, 45, 30, 48, 45, 49, 48, 51, 11, 45, 45, 49, 47, 50, 49, 51,
0155         13, 48, 48, 51, 49, 51, 51, 51, 0, 16, 16, 18, 16, 32, 18, 35, 2, 41, 27, 44, 41, 44, 44, 48,
0156         9, 42, 41, 44, 42, 45, 44, 48, 10, 44, 43, 47, 44, 48, 47, 50, 8, 40, 40, 41, 40, 41, 41, 43,
0157         11, 52, 52, 56, 53, 57, 57, 61, 12, 53, 52, 57, 53, 58, 58, 62, 14, 56, 55, 60, 57, 62, 61, 63,
0158         1, 40, 23, 40, 40, 41, 40, 43, 5, 52, 31, 55, 52, 55, 56, 60, 12, 53, 52, 56, 53, 58, 57, 61,
0159         13, 55, 54, 60, 55, 61, 60, 63, 8, 41, 40, 43, 42, 43, 43, 47, 14, 54, 54, 59, 54, 59, 60, 62,
0160         15, 56, 54, 59, 58, 62, 61, 63, 15, 59, 58, 62, 59, 63, 63, 63
0161     };
0162   // clang-format on
0163 
0164   zones_.push_back({zone0_hm, zone0_prompt_pd, zone0_prompt_ql, zone0_disp_pd, zone0_disp_ql});
0165 
0166   // ===========================================================================
0167   // Zone 1
0168   // ===========================================================================
0169 
0170   // clang-format off
0171     zones::hitmap_t&& zone1_hm = {
0172         { // Row 0
0173             {
0174                 site_id_t::kGE11, {
0175                     {99 ,   38,     90 },
0176                     {54 ,   75,     127},
0177                     {55 ,   113,    165},
0178                     {56 ,   150,    202},
0179                     {63 ,   188,    240},
0180                     {64 ,   225,    277},
0181                     {65 ,   263,    315}
0182                 }
0183             }
0184         },
0185         { // Row 1
0186             {
0187                 site_id_t::kME11, {
0188                     {45 ,   38,     90 },
0189                     {0  ,   75,     127},
0190                     {1  ,   113,    165},
0191                     {2  ,   150,    202},
0192                     {9  ,   188,    240},
0193                     {10 ,   225,    277},
0194                     {11 ,   263,    315}
0195                 }
0196             }
0197         },
0198         { // Row 2
0199             {
0200                 site_id_t::kME12, {
0201                     {46 ,   38,     90 },
0202                     {3  ,   75,     127},
0203                     {4  ,   113,    165},
0204                     {5  ,   150,    202},
0205                     {12 ,   188,    240},
0206                     {13 ,   225,    277},
0207                     {14 ,   263,    315}
0208                 }
0209             },
0210             {
0211                 site_id_t::kRE1, {
0212                     {100,   38,     90 },
0213                     {57 ,   75,     127},
0214                     {58 ,   113,    165},
0215                     {59 ,   150,    202},
0216                     {66 ,   188,    240},
0217                     {67 ,   225,    277},
0218                     {68 ,   263,    315}
0219                 }
0220             }
0221         },
0222         { // Row 3
0223             {
0224                 site_id_t::kGE21, {
0225                     {102,   0   ,   90 },
0226                     {72 ,   75  ,   165},
0227                     {73 ,   150 ,   240},
0228                     {74 ,   225 ,   315}
0229                 }
0230             }
0231         },
0232         { // Row 4
0233             {
0234                 site_id_t::kME2, {
0235                     {48 ,   0   ,   90 },
0236                     {18 ,   75  ,   165},
0237                     {19 ,   150 ,   240},
0238                     {20 ,   225 ,   315}
0239                 }
0240             }
0241         },
0242         { // Row 5
0243             {
0244                 site_id_t::kME3, {
0245                     // ME3/1
0246                     {50 ,   0   ,   90 },
0247                     {27 ,   75  ,   165},
0248                     {28 ,   150 ,   240},
0249                     {29 ,   225 ,   315},
0250                     // ME3/2
0251                     {51 ,   38,     90 },
0252                     {30 ,   75,     127},
0253                     {31 ,   113,    165},
0254                     {32 ,   150,    202},
0255                     {33 ,   188,    240},
0256                     {34 ,   225,    277},
0257                     {35 ,   263,    315}
0258                 }
0259             }
0260         },
0261         { // Row 6
0262             {
0263                 site_id_t::kRE3, {
0264                     // RE3/1
0265                     {104,   0   ,   90 },
0266                     {81 ,   75  ,   165},
0267                     {82 ,   150 ,   240},
0268                     {83 ,   225 ,   315},
0269                     // RE3/2
0270                     {105,   38,     90 },
0271                     {84 ,   75,     127},
0272                     {85 ,   113,    165},
0273                     {86 ,   150,    202},
0274                     {87 ,   188,    240},
0275                     {88 ,   225,    277},
0276                     {89 ,   263,    315}
0277                 }
0278             }
0279         },
0280         { // Row 7
0281             {
0282                 site_id_t::kME4, {
0283                     // ME4/1
0284                     {52 ,   0   ,   90 },
0285                     {36 ,   75  ,   165},
0286                     {37 ,   150 ,   240},
0287                     {38 ,   225 ,   315},
0288                     // ME4/2
0289                     {53 ,   38,     90 },
0290                     {39 ,   75,     127},
0291                     {40 ,   113,    165},
0292                     {41 ,   150,    202},
0293                     {42 ,   188,    240},
0294                     {43 ,   225,    277},
0295                     {44 ,   263,    315}
0296                 }
0297             },        
0298             {
0299                 site_id_t::kRE4, {
0300                     // RE4/1
0301                     {106,   0   ,   90 },
0302                     {90 ,   75  ,   165},
0303                     {91 ,   150 ,   240},
0304                     {92 ,   225 ,   315},
0305                     // RE4/2
0306                     {107,   38,     90 },
0307                     {93 ,   75,     127},
0308                     {94 ,   113,    165},
0309                     {95 ,   150,    202},
0310                     {96 ,   188,    240},
0311                     {97 ,   225,    277},
0312                     {98 ,   263,    315}
0313                 }
0314             }        
0315         }
0316     };
0317 
0318     std::vector<zones::pattern_t> zone1_prompt_pd = {
0319         {{47, 55, 63}, {48, 55, 62}, {51, 55, 59}, {53, 55, 57}, {53, 55, 57}, {54, 55, 56}, {53, 55, 57}, {53, 55, 57}},
0320         {{38, 44, 50}, {41, 46, 51}, {49, 52, 54}, {53, 54, 56}, {53, 55, 57}, {54, 56, 57}, {54, 56, 58}, {53, 56, 58}},
0321         {{60, 66, 72}, {59, 64, 69}, {56, 58, 61}, {54, 56, 57}, {53, 55, 57}, {53, 54, 56}, {52, 54, 56}, {52, 54, 57}},
0322         {{29, 37, 44}, {32, 40, 47}, {46, 50, 53}, {52, 54, 56}, {54, 55, 56}, {53, 56, 59}, {51, 55, 59}, {48, 54, 59}},
0323         {{66, 73, 81}, {63, 70, 78}, {57, 60, 64}, {54, 56, 58}, {54, 55, 56}, {51, 54, 57}, {51, 55, 59}, {51, 56, 62}},
0324         {{16, 27, 39}, {21, 32, 42}, {43, 48, 53}, {52, 55, 57}, {54, 55, 56}, {44, 52, 59}, {40, 49, 59}, {31, 44, 59}},
0325         {{71, 83, 94}, {68, 78, 89}, {57, 62, 67}, {53, 55, 58}, {54, 55, 56}, {51, 58, 66}, {51, 61, 70}, {51, 66, 79}}
0326     };
0327 
0328     zones::quality_lut_t zone1_prompt_ql = {
0329         0, 3, 4, 6, 3, 5, 5, 7, 1, 7, 21, 25, 19, 23, 25, 27, 1, 20, 22, 25, 34, 36, 37, 39,
0330         2, 24, 26, 28, 36, 38, 39, 39, 0, 16, 18, 21, 32, 33, 34, 37, 4, 27, 42, 46, 42, 45, 45, 49,
0331         9, 42, 43, 46, 43, 46, 47, 50, 10, 45, 46, 50, 45, 48, 49, 51, 0, 7, 17, 20, 17, 18, 20, 23,
0332         3, 7, 28, 31, 27, 29, 30, 31, 4, 29, 43, 47, 42, 45, 47, 50, 6, 30, 46, 50, 46, 48, 49, 51,
0333         1, 19, 22, 24, 34, 35, 37, 38, 5, 29, 46, 49, 45, 48, 49, 51, 11, 46, 47, 50, 47, 49, 50, 51,
0334         13, 49, 50, 51, 48, 51, 51, 51, 0, 16, 16, 18, 32, 32, 33, 35, 2, 26, 42, 44, 41, 43, 44, 48,
0335         9, 41, 42, 45, 42, 44, 45, 48, 10, 44, 44, 48, 44, 47, 48, 50, 8, 40, 40, 41, 40, 40, 41, 43,
0336         11, 52, 53, 56, 52, 54, 56, 60, 12, 52, 53, 57, 53, 56, 58, 62, 14, 55, 57, 61, 57, 59, 61, 63,
0337         2, 22, 40, 41, 40, 40, 41, 43, 6, 31, 52, 55, 52, 54, 55, 59, 12, 52, 53, 57, 53, 54, 58, 61,
0338         14, 54, 57, 61, 55, 59, 60, 63, 8, 40, 41, 43, 41, 43, 44, 47, 13, 54, 56, 60, 56, 58, 60, 62,
0339         15, 55, 58, 62, 58, 59, 62, 63, 15, 59, 61, 63, 60, 62, 63, 63
0340     };
0341 
0342     std::vector<zones::pattern_t> zone1_disp_pd = {
0343         {{50, 55, 60}, {50, 55, 60}, {52, 55, 58}, {53, 55, 57}, {53, 55, 57}, {54, 55, 56}, {53, 55, 57}, {53, 55, 57}},
0344         {{53, 60, 65}, {53, 60, 65}, {54, 58, 61}, {54, 56, 57}, {54, 56, 57}, {53, 54, 56}, {52, 54, 56}, {50, 53, 56}},
0345         {{45, 50, 57}, {45, 50, 57}, {49, 52, 56}, {53, 54, 56}, {53, 54, 56}, {54, 56, 57}, {54, 56, 58}, {54, 57, 60}},
0346         {{53, 63, 71}, {53, 62, 69}, {54, 59, 63}, {54, 57, 58}, {54, 56, 56}, {50, 54, 56}, {50, 53, 56}, {47, 51, 56}},
0347         {{39, 47, 57}, {41, 48, 57}, {47, 51, 56}, {52, 53, 56}, {54, 54, 56}, {54, 56, 60}, {54, 57, 60}, {54, 59, 63}},
0348         {{54, 65, 73}, {54, 65, 74}, {54, 61, 67}, {54, 57, 59}, {54, 56, 56}, {47, 53, 56}, {47, 51, 56}, {43, 49, 56}},
0349         {{37, 45, 56}, {36, 45, 56}, {43, 49, 56}, {51, 53, 56}, {54, 54, 56}, {54, 57, 63}, {54, 59, 63}, {54, 61, 67}}
0350     };
0351 
0352     zones::quality_lut_t zone1_disp_ql = {
0353         0, 3, 4, 6, 4, 5, 6, 7, 1, 7, 22, 26, 20, 24, 25, 29, 1, 21, 22, 25, 34, 37, 37, 39,
0354         2, 23, 25, 28, 36, 38, 39, 39, 0, 17, 18, 20, 32, 33, 34, 37, 3, 27, 42, 46, 42, 45, 46, 50,
0355         9, 42, 43, 46, 43, 46, 47, 50, 10, 45, 46, 50, 45, 48, 49, 51, 0, 7, 17, 18, 16, 19, 20, 24,
0356         3, 7, 27, 31, 27, 30, 29, 31, 4, 28, 43, 47, 42, 47, 47, 50, 5, 30, 46, 50, 45, 49, 49, 51,
0357         1, 19, 21, 23, 34, 35, 36, 38, 5, 29, 45, 49, 45, 49, 48, 51, 11, 46, 47, 50, 46, 48, 50, 51,
0358         13, 49, 49, 51, 48, 51, 51, 51, 0, 16, 16, 18, 32, 32, 33, 35, 2, 26, 41, 44, 41, 44, 44, 48,
0359         9, 42, 42, 45, 42, 44, 45, 48, 10, 44, 44, 48, 44, 48, 47, 50, 8, 40, 40, 41, 40, 41, 41, 43,
0360         11, 52, 52, 57, 52, 55, 56, 61, 12, 53, 53, 57, 53, 57, 58, 62, 14, 55, 56, 61, 55, 61, 60, 63,
0361         2, 22, 40, 40, 40, 40, 41, 43, 6, 31, 52, 57, 52, 54, 55, 60, 12, 52, 53, 58, 53, 56, 58, 62,
0362         14, 56, 56, 61, 54, 59, 60, 63, 8, 40, 41, 43, 41, 43, 43, 47, 13, 54, 54, 60, 54, 58, 59, 63,
0363         15, 55, 57, 61, 58, 60, 62, 63, 15, 59, 59, 63, 59, 62, 62, 63
0364     };
0365   // clang-format on
0366 
0367   zones_.push_back({zone1_hm, zone1_prompt_pd, zone1_prompt_ql, zone1_disp_pd, zone1_disp_ql});
0368 
0369   // ===========================================================================
0370   // Zone 2
0371   // ===========================================================================
0372 
0373   // clang-format off
0374     zones::hitmap_t&& zone2_hm = {
0375         { // Row 0
0376             {
0377                 site_id_t::kME12, {
0378                     {46 ,   38,     90 },
0379                     {3  ,   75,     127},
0380                     {4  ,   113,    165},
0381                     {5  ,   150,    202},
0382                     {12 ,   188,    240},
0383                     {13 ,   225,    277},
0384                     {14 ,   263,    315}
0385                 }
0386             }
0387         },
0388         { // Row 1
0389             {
0390                 site_id_t::kRE1, {
0391                     {100,   38,     90 },
0392                     {57 ,   75,     127},
0393                     {58 ,   113,    165},
0394                     {59 ,   150,    202},
0395                     {66 ,   188,    240},
0396                     {67 ,   225,    277},
0397                     {68 ,   263,    315}
0398                 }
0399             }
0400         },
0401         { // Row 2
0402             {
0403                 site_id_t::kRE2, {
0404                     {103,   38,     90 },
0405                     {75 ,   75,     127},
0406                     {76 ,   113,    165},
0407                     {77 ,   150,    202},
0408                     {78 ,   188,    240},
0409                     {79 ,   225,    277},
0410                     {80 ,   263,    315}
0411                 }
0412             }
0413         },
0414         { // Row 3
0415             {
0416                 site_id_t::kME2, {
0417                     {49 ,   38,     90 },
0418                     {21 ,   75,     127},
0419                     {22 ,   113,    165},
0420                     {23 ,   150,    202},
0421                     {24 ,   188,    240},
0422                     {25 ,   225,    277},
0423                     {26 ,   263,    315}
0424                 }
0425             }
0426         },
0427         { // Row 4
0428             {
0429                 site_id_t::kME3, {
0430                     {51 ,   38,     90 },
0431                     {30 ,   75,     127},
0432                     {31 ,   113,    165},
0433                     {32 ,   150,    202},
0434                     {33 ,   188,    240},
0435                     {34 ,   225,    277},
0436                     {35 ,   263,    315}
0437                 }
0438             }
0439         },
0440         { // Row 5
0441             {
0442                 site_id_t::kRE3, {
0443                     {105,   38,     90 },
0444                     {84 ,   75,     127},
0445                     {85 ,   113,    165},
0446                     {86 ,   150,    202},
0447                     {87 ,   188,    240},
0448                     {88 ,   225,    277},
0449                     {89 ,   263,    315}
0450                 }
0451             }
0452         },
0453         { // Row 6
0454             {
0455                 site_id_t::kME4, {
0456                     {53 ,   38,     90 },
0457                     {39 ,   75,     127},
0458                     {40 ,   113,    165},
0459                     {41 ,   150,    202},
0460                     {42 ,   188,    240},
0461                     {43 ,   225,    277},
0462                     {44 ,   263,    315}
0463                 }
0464             }
0465         },
0466         { // Row 7
0467             {
0468                 site_id_t::kRE4, {
0469                     {107,   38,     90 },
0470                     {93 ,   75,     127},
0471                     {94 ,   113,    165},
0472                     {95 ,   150,    202},
0473                     {96 ,   188,    240},
0474                     {97 ,   225,    277},
0475                     {98 ,   263,    315},
0476                 }
0477             }
0478         }
0479     };
0480 
0481     std::vector<zones::pattern_t> zone2_prompt_pd = { // Pattern N: Row0..RowM
0482         {{52, 55, 58}, {52, 55, 58}, {53, 55, 57}, {53, 55, 57}, {54, 55, 56}, {53, 55, 57}, {53, 55, 57}, {53, 55, 57}},
0483         {{54, 57, 61}, {53, 57, 60}, {54, 56, 58}, {54, 56, 58}, {53, 55, 56}, {53, 54, 56}, {52, 54, 56}, {52, 54, 56}},
0484         {{49, 53, 56}, {50, 53, 57}, {52, 54, 56}, {52, 54, 56}, {54, 55, 57}, {54, 56, 57}, {54, 56, 58}, {54, 56, 58}},
0485         {{54, 57, 61}, {54, 57, 61}, {54, 56, 59}, {54, 56, 59}, {53, 54, 56}, {52, 54, 56}, {51, 54, 56}, {51, 53, 56}},
0486         {{49, 53, 56}, {49, 53, 56}, {51, 54, 56}, {51, 54, 56}, {54, 56, 57}, {54, 56, 58}, {54, 56, 59}, {54, 57, 59}},
0487         {{54, 59, 65}, {54, 60, 64}, {54, 57, 59}, {54, 56, 56}, {50, 54, 56}, {49, 53, 56}, {47, 52, 56}, {46, 51, 56}},
0488         {{45, 51, 56}, {46, 50, 56}, {51, 53, 56}, {54, 54, 56}, {54, 56, 60}, {54, 57, 61}, {54, 58, 63}, {54, 59, 64}}
0489     };
0490 
0491     zones::quality_lut_t zone2_prompt_ql = {
0492         0, 3, 3, 5, 1, 23, 7, 26, 1, 36, 22, 38, 2, 39, 25, 39, 0, 32, 18, 35, 4, 44, 44, 48,
0493         9, 44, 44, 49, 10, 49, 48, 51, 0, 17, 6, 21, 3, 28, 7, 30, 4, 44, 43, 48, 5, 48, 48, 51,
0494         1, 34, 21, 37, 4, 47, 47, 50, 10, 49, 48, 51, 11, 51, 50, 51, 0, 32, 16, 33, 3, 43, 43, 47,
0495         8, 43, 43, 47, 9, 47, 46, 50, 8, 40, 40, 42, 11, 53, 53, 57, 11, 54, 53, 58, 13, 58, 56, 62,
0496         2, 40, 40, 41, 5, 52, 52, 54, 11, 53, 52, 57, 12, 58, 54, 61, 8, 42, 42, 45, 12, 56, 55, 59,
0497         14, 57, 56, 61, 15, 62, 59, 63, 0, 16, 5, 19, 2, 27, 7, 29, 3, 43, 42, 46, 4, 46, 45, 50,
0498         1, 40, 40, 41, 6, 52, 52, 54, 10, 53, 52, 58, 12, 55, 54, 60, 1, 24, 7, 26, 5, 31, 7, 31,
0499         6, 53, 52, 57, 6, 58, 54, 60, 2, 41, 41, 45, 7, 55, 55, 59, 13, 56, 56, 61, 14, 60, 59, 63,
0500         0, 34, 20, 37, 4, 46, 46, 49, 9, 47, 46, 50, 10, 50, 49, 51, 8, 42, 42, 45, 12, 57, 56, 61,
0501         13, 57, 55, 62, 15, 62, 59, 63, 2, 41, 41, 44, 6, 55, 54, 59, 13, 58, 56, 61, 14, 61, 59, 63,
0502         9, 45, 45, 49, 14, 60, 60, 62, 15, 61, 60, 63, 15, 63, 62, 63
0503     };
0504 
0505     std::vector<zones::pattern_t> zone2_disp_pd = { // Pattern N: Row0..RowM
0506         {{52, 55, 58}, {52, 55, 58}, {53, 55, 57}, {53, 55, 57}, {54, 55, 56}, {53, 55, 57}, {53, 55, 57}, {53, 55, 57}},
0507         {{54, 57, 61}, {54, 57, 61}, {54, 56, 59}, {54, 56, 59}, {53, 55, 56}, {53, 54, 56}, {52, 54, 56}, {51, 54, 56}},
0508         {{49, 53, 56}, {49, 53, 56}, {51, 54, 56}, {51, 54, 56}, {54, 55, 57}, {54, 56, 57}, {54, 56, 58}, {54, 56, 59}},
0509         {{54, 58, 62}, {54, 58, 62}, {54, 56, 58}, {54, 56, 57}, {51, 54, 56}, {51, 53, 56}, {49, 53, 56}, {48, 52, 56}},
0510         {{48, 52, 56}, {48, 52, 56}, {52, 54, 56}, {53, 54, 56}, {54, 56, 59}, {54, 57, 59}, {54, 57, 61}, {54, 58, 62}},
0511         {{54, 60, 66}, {54, 60, 65}, {54, 57, 59}, {54, 56, 56}, {49, 53, 56}, {48, 52, 56}, {46, 52, 56}, {45, 51, 56}},
0512         {{44, 50, 56}, {45, 50, 56}, {51, 53, 56}, {54, 54, 56}, {54, 57, 61}, {54, 58, 62}, {54, 58, 64}, {54, 59, 65}}
0513     };
0514 
0515     zones::quality_lut_t zone2_disp_ql = {
0516         0, 3, 3, 5, 1, 23, 7, 26, 1, 36, 22, 38, 2, 39, 25, 39, 0, 32, 18, 35, 4, 44, 44, 48,
0517         9, 44, 44, 49, 10, 49, 48, 51, 0, 17, 6, 21, 3, 28, 7, 30, 4, 44, 43, 48, 5, 48, 48, 51,
0518         1, 34, 21, 37, 4, 47, 48, 50, 10, 49, 47, 51, 11, 51, 50, 51, 0, 32, 16, 33, 3, 43, 43, 47,
0519         8, 43, 43, 47, 9, 47, 46, 50, 8, 40, 40, 42, 11, 53, 52, 57, 11, 53, 52, 58, 13, 58, 56, 61,
0520         2, 40, 40, 41, 5, 52, 52, 55, 11, 53, 53, 57, 12, 56, 55, 61, 8, 42, 41, 45, 12, 56, 54, 59,
0521         14, 58, 56, 62, 15, 61, 59, 63, 0, 16, 6, 20, 2, 27, 7, 29, 3, 43, 42, 46, 4, 46, 46, 50,
0522         1, 40, 40, 41, 5, 53, 52, 54, 10, 53, 52, 58, 12, 55, 54, 60, 1, 24, 7, 26, 5, 31, 7, 31,
0523         6, 53, 52, 57, 6, 57, 54, 61, 2, 42, 41, 45, 7, 54, 55, 59, 13, 58, 55, 60, 14, 60, 59, 63,
0524         0, 34, 19, 37, 4, 46, 45, 49, 9, 47, 46, 50, 10, 50, 49, 51, 8, 42, 42, 45, 12, 57, 56, 61,
0525         13, 57, 56, 62, 15, 62, 60, 63, 2, 41, 41, 44, 6, 56, 54, 59, 13, 58, 55, 61, 14, 61, 59, 63,
0526         9, 45, 45, 49, 14, 60, 59, 62, 15, 62, 60, 63, 15, 63, 62, 63
0527     };
0528   // clang-format on
0529 
0530   zones_.push_back({zone2_hm, zone2_prompt_pd, zone2_prompt_ql, zone2_disp_pd, zone2_disp_ql});
0531 
0532   // ===========================================================================
0533   // Features
0534   // ===========================================================================
0535   // feat       | ME1/1 | ME1/2 |  ME2  |  ME3  |  ME4  |  RE1  |  RE2  |  RE3  |  RE4  | GE1/1 | GE2/1 |  ME0
0536   // -----------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------
0537   // emtf_phi   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *
0538   // emtf_theta |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *   |   *
0539   // emtf_bend  |   *   |   *   |   *   |   *   |   *   |       |       |       |       |       |       |   *
0540   // emtf_qual  |   *   |   *   |   *   |   *   |   *   |       |       |       |       |       |       |   *
0541   // emtf_time  |       |       |       |       |       |       |       |       |       |       |       |
0542 
0543   // clang-format off
0544     features_ = {
0545         {
0546             feature_id_t::kPhi, {
0547                 site_id_t::kME11, site_id_t::kME12, site_id_t::kME2, site_id_t::kME3, site_id_t::kME4,
0548                 site_id_t::kRE1 , site_id_t::kRE2 , site_id_t::kRE3, site_id_t::kRE4,
0549                 site_id_t::kGE11, site_id_t::kGE21, site_id_t::kME0
0550             }
0551         }, 
0552         {
0553             feature_id_t::kTheta, {
0554                 site_id_t::kME11, site_id_t::kME12, site_id_t::kME2, site_id_t::kME3, site_id_t::kME4,
0555                 site_id_t::kRE1 , site_id_t::kRE2 , site_id_t::kRE3, site_id_t::kRE4,
0556                 site_id_t::kGE11, site_id_t::kGE21, site_id_t::kME0
0557             }
0558         }, 
0559         {
0560             feature_id_t::kBend, {
0561                 site_id_t::kME11, site_id_t::kME12, site_id_t::kME2, site_id_t::kME3, site_id_t::kME4,
0562                 site_id_t::kME0
0563             }
0564         }, 
0565         {
0566             feature_id_t::kQuality, {
0567                 site_id_t::kME11, site_id_t::kME12, site_id_t::kME2, site_id_t::kME3, site_id_t::kME4,
0568                 site_id_t::kME0
0569             }
0570         }, 
0571     };
0572   // clang-format on
0573 
0574   // ===========================================================================
0575   // Theta Options
0576   // ===========================================================================
0577 
0578   // clang-format off
0579     theta_medians_ = {
0580         // ME2_t1, ME3_t1, ME4_t1, ME2_t2, ME3_t2, ME4_t2, GE21, RE3, RE4
0581         {
0582             {
0583                 {site_id_t::kME2, theta_id_t::kTheta1},
0584                 {site_id_t::kME3, theta_id_t::kTheta1},
0585                 {site_id_t::kME4, theta_id_t::kTheta1}
0586             },
0587             {
0588                 {site_id_t::kME2, theta_id_t::kTheta2},
0589                 {site_id_t::kME3, theta_id_t::kTheta2},
0590                 {site_id_t::kME4, theta_id_t::kTheta2}
0591             },
0592             {
0593                 {site_id_t::kGE21, theta_id_t::kTheta1},
0594                 {site_id_t::kRE3, theta_id_t::kTheta1},
0595                 {site_id_t::kRE4, theta_id_t::kTheta1}
0596             },
0597         },
0598         // ME2_t1, ME3_t1, ME4_t1, ME2_t2, ME3_t2, ME4_t2, RE2, RE3, RE4
0599         {
0600             {
0601                 {site_id_t::kME2, theta_id_t::kTheta1},
0602                 {site_id_t::kME3, theta_id_t::kTheta1},
0603                 {site_id_t::kME4, theta_id_t::kTheta1}
0604             },
0605             {
0606                 {site_id_t::kME2, theta_id_t::kTheta2},
0607                 {site_id_t::kME3, theta_id_t::kTheta2},
0608                 {site_id_t::kME4, theta_id_t::kTheta2}
0609             },
0610             {
0611                 {site_id_t::kRE2, theta_id_t::kTheta1},
0612                 {site_id_t::kRE3, theta_id_t::kTheta1},
0613                 {site_id_t::kRE4, theta_id_t::kTheta1}
0614             },
0615         },
0616         // ME12_t1, ME11_t1, ME0_t2, ME12_t2, ME11_t2, ME0_t2, RE1, GE11, ME0_t1
0617         {
0618             {
0619                 {site_id_t::kME12, theta_id_t::kTheta1},
0620                 {site_id_t::kME11, theta_id_t::kTheta1},
0621                 {site_id_t::kME0 , theta_id_t::kTheta2}
0622             },
0623             {
0624                 {site_id_t::kME12, theta_id_t::kTheta2},
0625                 {site_id_t::kME11, theta_id_t::kTheta2},
0626                 {site_id_t::kME0 , theta_id_t::kTheta2}
0627             },
0628             {
0629                 {site_id_t::kRE1, theta_id_t::kTheta1},
0630                 {site_id_t::kGE11, theta_id_t::kTheta1},
0631                 {site_id_t::kME0, theta_id_t::kTheta1}
0632             },
0633         },
0634     };
0635   // clang-format on
0636 
0637   // ===========================================================================
0638   // Site Reduction
0639   // ===========================================================================
0640   // Site (out) | Site (in)
0641   // -----------|-------------------------------------------
0642   // ME1        | ME1/1, GE1/1, ME1/2, RE1/2
0643   // ME2        | ME2, GE2/1, RE2/2
0644   // ME3        | ME3, RE3
0645   // ME4        | ME4, RE4
0646   // ME0        | ME0
0647 
0648   // clang-format off
0649     reduced_sites_ = {
0650         {reduced_site_id_t::kME1, {site_id_t::kME11, site_id_t::kGE11, site_id_t::kME12, site_id_t::kRE1}},
0651         {reduced_site_id_t::kME2, {site_id_t::kME2, site_id_t::kGE21, site_id_t::kRE2}},
0652         {reduced_site_id_t::kME3, {site_id_t::kME3, site_id_t::kRE3}},
0653         {reduced_site_id_t::kME4, {site_id_t::kME4, site_id_t::kRE4}},
0654         {reduced_site_id_t::kME0, {site_id_t::kME0}},
0655     };
0656   // clang-format on
0657 }
0658 
0659 EMTFModel::~EMTFModel() {
0660   // Do Nothing
0661 }