6 const int padding_w_st1 = 15;
7 const int padding_w_st3 = 7;
8 const int padding_extra_w_st1 = padding_w_st1 - padding_w_st3;
16 const std::vector<std::string>& pattDefinitions,
17 const std::vector<std::string>& symPattDefinitions,
20 bool useSecondEarliest) {
43 const std::vector<std::string>& tokens = split_string(
s,
',',
':');
44 if (not(tokens.size() == 9))
50 std::vector<std::string>::const_iterator tokens_it = tokens.begin();
54 int straightness = std::stoi(*tokens_it++);
55 int st1_max = std::stoi(*tokens_it++);
56 int st1_min = std::stoi(*tokens_it++);
57 int st2_max = std::stoi(*tokens_it++);
58 int st2_min = std::stoi(*tokens_it++);
59 int st3_max = std::stoi(*tokens_it++);
60 int st3_min = std::stoi(*tokens_it++);
61 int st4_max = std::stoi(*tokens_it++);
62 int st4_min = std::stoi(*tokens_it++);
66 if (not(st2_max == padding_w_st3 && st2_min == padding_w_st3)) {
67 edm::LogError(
"L1T") <<
"st2_max = " << st2_max <<
", padding_w_st3 = " << padding_w_st3
68 <<
", st2_min = " << st2_min <<
", padding_w_st3 = " << padding_w_st3;
74 st2_max += padding_extra_w_st1;
75 st2_min += padding_extra_w_st1;
76 st3_max += padding_extra_w_st1;
77 st3_min += padding_extra_w_st1;
78 st4_max += padding_extra_w_st1;
79 st4_min += padding_extra_w_st1;
86 for (i = st1_min; i <= st1_max; i++)
88 for (i = st2_min; i <= st2_max; i++)
90 for (i = st3_min; i <= st3_max; i++)
92 for (i = st4_min; i <= st4_max; i++)
96 pattern.
rotr(padding_extra_w_st1);
99 if (not(
patterns_.size() == pattDefinitions_.size())) {
101 <<
", pattDefinitions_.size() = " << pattDefinitions_.size();
108 const std::vector<std::string>& tokens = split_string(
s,
',',
':');
109 if (not(tokens.size() == 17))
115 std::vector<std::string>::const_iterator tokens_it = tokens.begin();
119 int straightness = std::stoi(*tokens_it++);
120 int st1_max1 = std::stoi(*tokens_it++);
121 int st1_min1 = std::stoi(*tokens_it++);
122 int st1_max2 = std::stoi(*tokens_it++);
123 int st1_min2 = std::stoi(*tokens_it++);
124 int st2_max1 = std::stoi(*tokens_it++);
125 int st2_min1 = std::stoi(*tokens_it++);
126 int st2_max2 = std::stoi(*tokens_it++);
127 int st2_min2 = std::stoi(*tokens_it++);
128 int st3_max1 = std::stoi(*tokens_it++);
129 int st3_min1 = std::stoi(*tokens_it++);
130 int st3_max2 = std::stoi(*tokens_it++);
131 int st3_min2 = std::stoi(*tokens_it++);
132 int st4_max1 = std::stoi(*tokens_it++);
133 int st4_min1 = std::stoi(*tokens_it++);
134 int st4_max2 = std::stoi(*tokens_it++);
135 int st4_min2 = std::stoi(*tokens_it++);
139 if (not(st2_max1 == padding_w_st3 && st2_min1 == padding_w_st3)) {
140 edm::LogError(
"L1T") <<
"st2_max1 = " << st2_max1 <<
", padding_w_st3 = " << padding_w_st3
141 <<
", st2_min1 = " << st2_min1 <<
", padding_w_st3 = " << padding_w_st3;
144 if (not(st2_max2 == padding_w_st3 && st2_min2 == padding_w_st3)) {
145 edm::LogError(
"L1T") <<
"st2_max2 = " << st2_max2 <<
", padding_w_st3 = " << padding_w_st3
146 <<
", st2_min2 = " << st2_min2 <<
", padding_w_st3 = " << padding_w_st3;
152 st2_max1 += padding_extra_w_st1;
153 st2_min1 += padding_extra_w_st1;
154 st2_max2 += padding_extra_w_st1;
155 st2_min2 += padding_extra_w_st1;
156 st3_max1 += padding_extra_w_st1;
157 st3_min1 += padding_extra_w_st1;
158 st3_max2 += padding_extra_w_st1;
159 st3_min2 += padding_extra_w_st1;
160 st4_max1 += padding_extra_w_st1;
161 st4_min1 += padding_extra_w_st1;
162 st4_max2 += padding_extra_w_st1;
163 st4_min2 += padding_extra_w_st1;
170 for (i = st1_min1; i <= st1_max1; i++)
172 for (i = st1_min2; i <= st1_max2; i++)
174 for (i = st2_min1; i <= st2_max1; i++)
176 for (i = st2_min2; i <= st2_max2; i++)
178 for (i = st3_min1; i <= st3_max1; i++)
180 for (i = st3_min2; i <= st3_max2; i++)
182 for (i = st4_min1; i <= st4_max1; i++)
184 for (i = st4_min2; i <= st4_max2; i++)
188 pattern.
rotr(padding_extra_w_st1);
191 if (not(
patterns_.size() == symPattDefinitions_.size())) {
193 <<
", symPattDefinitions_.size() = " << symPattDefinitions_.size();
200 std::cout <<
"Pattern straightness: " <<
pattern.get_straightness() <<
" image: " << std::endl;
207 std::map<pattern_ref_t, int>& patt_lifetime_map,
210 int num_conv_hits = 0;
211 for (
const auto& conv_hits : extended_conv_hits)
212 num_conv_hits += conv_hits.size();
213 bool early_exit = (num_conv_hits == 0) && (patt_lifetime_map.empty());
219 for (
const auto& conv_hits : extended_conv_hits) {
220 for (
const auto& conv_hit : conv_hits) {
222 std::cout <<
"CSC hit st: " << conv_hit.PC_station() <<
" ch: " << conv_hit.PC_chamber()
223 <<
" ph: " << conv_hit.Phi_fp() <<
" th: " << conv_hit.Theta_fp()
224 <<
" ph_hit: " << (1ul << conv_hit.Ph_hit()) <<
" phzvl: " << conv_hit.Phzvl()
225 <<
" strip: " << conv_hit.Strip() <<
" wire: " << conv_hit.Wire() <<
" cpat: " << conv_hit.Pattern()
226 <<
" zone_hit: " << conv_hit.Zone_hit() <<
" zone_code: " << conv_hit.Zone_code()
227 <<
" bx: " << conv_hit.BX() << std::endl;
232 for (
const auto& conv_hits : extended_conv_hits) {
233 for (
const auto& conv_hit : conv_hits) {
235 std::cout <<
"RPC hit st: " << conv_hit.PC_station() <<
" ch: " << conv_hit.PC_chamber()
236 <<
" ph>>2: " << (conv_hit.Phi_fp() >> 2) <<
" th>>2: " << (conv_hit.Theta_fp() >> 2)
237 <<
" strip: " << conv_hit.Strip() <<
" roll: " << conv_hit.Roll() <<
" cpat: " << conv_hit.Pattern()
238 <<
" bx: " << conv_hit.BX() << std::endl;
243 for (
const auto& conv_hits : extended_conv_hits) {
244 for (
const auto& conv_hit : conv_hits) {
246 std::cout <<
"GEM hit st: " << conv_hit.PC_station() <<
" ch: " << conv_hit.PC_chamber()
247 <<
" ph: " << conv_hit.Phi_fp() <<
" th: " << conv_hit.Theta_fp() <<
" strip: " << conv_hit.Strip()
248 <<
" roll: " << conv_hit.Roll() <<
" cpat: " << conv_hit.Pattern() <<
" bx: " << conv_hit.BX()
260 if (
is_zone_empty(izone + 1, extended_conv_hits, patt_lifetime_map))
267 process_single_zone(izone + 1, zone_images.at(izone), patt_lifetime_map, zone_roads.at(izone));
271 for (
int izone = emtf::NUM_ZONES; izone >= 1; --izone) {
272 std::cout <<
"zone: " << izone << std::endl;
273 std::cout << zone_images.at(izone - 1) << std::endl;
281 for (
const auto& roads : zone_roads) {
282 for (
const auto& road : reversed(roads)) {
283 std::cout <<
"pattern: z: " << road.Zone() - 1 <<
" ph: " << road.Key_zhit()
284 <<
" q: " <<
to_hex(road.Quality_code()) <<
" ly: " << to_binary(road.Layer_code(), 3)
285 <<
" str: " << to_binary(road.Straightness(), 3) <<
" bx: " << road.BX() << std::endl;
297 const std::deque<EMTFHitCollection>& extended_conv_hits,
298 const std::map<pattern_ref_t, int>& patt_lifetime_map)
const {
299 int izone = zone - 1;
300 int num_conv_hits = 0;
303 std::deque<EMTFHitCollection>::const_iterator ext_conv_hits_it = extended_conv_hits.begin();
304 std::deque<EMTFHitCollection>::const_iterator ext_conv_hits_end = extended_conv_hits.end();
306 for (; ext_conv_hits_it != ext_conv_hits_end; ++ext_conv_hits_it) {
307 EMTFHitCollection::const_iterator conv_hits_it = ext_conv_hits_it->begin();
308 EMTFHitCollection::const_iterator conv_hits_end = ext_conv_hits_it->end();
310 for (; conv_hits_it != conv_hits_end; ++conv_hits_it) {
311 if (not(conv_hits_it->PC_segment() <= 4))
313 edm::LogError(
"L1T") <<
"conv_hits_it->PC_segment() = " << conv_hits_it->PC_segment();
323 if (conv_hits_it->Zone_code() & (1 << izone)) {
329 std::map<pattern_ref_t, int>::const_iterator patt_lifetime_map_it = patt_lifetime_map.begin();
330 std::map<pattern_ref_t, int>::const_iterator patt_lifetime_map_end = patt_lifetime_map.end();
332 for (; patt_lifetime_map_it != patt_lifetime_map_end; ++patt_lifetime_map_it) {
333 if (patt_lifetime_map_it->first.at(0) == zone) {
338 return (num_conv_hits == 0) && (num_patts == 0);
342 const std::deque<EMTFHitCollection>& extended_conv_hits,
344 int izone = zone - 1;
346 std::deque<EMTFHitCollection>::const_iterator ext_conv_hits_it = extended_conv_hits.begin();
347 std::deque<EMTFHitCollection>::const_iterator ext_conv_hits_end = extended_conv_hits.end();
349 for (; ext_conv_hits_it != ext_conv_hits_end; ++ext_conv_hits_it) {
350 EMTFHitCollection::const_iterator conv_hits_it = ext_conv_hits_it->begin();
351 EMTFHitCollection::const_iterator conv_hits_end = ext_conv_hits_it->end();
353 for (; conv_hits_it != conv_hits_end; ++conv_hits_it) {
360 if (conv_hits_it->Zone_code() & (1 << izone)) {
361 unsigned int layer = conv_hits_it->Station() - 1;
362 unsigned int bit = conv_hits_it->Zone_hit();
371 std::map<pattern_ref_t, int>& patt_lifetime_map,
380 cloned_image.
rotl(padding_w_st3);
386 cloned_image.
rotr(1);
388 int max_quality_code = -1;
392 for (
int ipatt = 0; ipatt < npatterns; ++ipatt) {
397 bool is_lifetime_up =
false;
399 int layer_code = patt.
op_and(cloned_image);
400 bool more_than_one = (layer_code != 0) && (layer_code != 1) && (layer_code != 2) && (layer_code != 4);
401 bool more_than_zero = (layer_code != 0);
403 if (more_than_zero) {
405 auto ins = patt_lifetime_map.insert({patt_ref, 0});
409 auto patt_ins =
ins.first;
410 bool patt_exists = !
ins.second;
413 if (patt_ins->second == drift_time) {
414 is_lifetime_up =
true;
417 patt_ins->second += 1;
421 auto patt_ins =
ins.first;
422 int bx_shifter = patt_ins->second;
423 int bx2 =
bool(bx_shifter & (1 << 2));
424 int bx1 =
bool(bx_shifter & (1 << 1));
425 int bx0 =
bool(bx_shifter & (1 << 0));
428 if (drift_time == 2 && bx2 == 0 && bx1 == 1) {
429 is_lifetime_up =
true;
430 }
else if (drift_time == 1 && bx1 == 0 && bx0 == 1) {
431 is_lifetime_up =
true;
432 }
else if (drift_time == 0) {
433 is_lifetime_up =
true;
436 if (not(drift_time == 2 || drift_time == 1 || drift_time == 0)) {
437 edm::LogError(
"L1T") <<
"drift_time = " << drift_time <<
", not 0 or 1 or 2";
444 bx0 = more_than_zero;
445 bx_shifter = (bx2 << 2) | (bx1 << 1) | bx0;
446 patt_ins->second = bx_shifter;
451 patt_lifetime_map.erase(patt_ref);
456 if (is_lifetime_up && more_than_one) {
461 ((((straightness >> 2) & 1) << 5) | (((straightness >> 1) & 1) << 3) | (((straightness >> 0) & 1) << 1) |
462 (((layer_code >> 2) & 1) << 4) | (((layer_code >> 1) & 1) << 2) | (((layer_code >> 0) & 1) << 0));
480 if (max_quality_code < quality_code) {
481 max_quality_code = quality_code;
489 if (max_quality_code != -1) {
490 roads.push_back(tmp_road);
497 if (!roads.empty()) {
498 std::array<int, emtf::NUM_ZONE_HITS> quality_codes;
499 quality_codes.fill(0);
501 EMTFRoadCollection::iterator roads_it = roads.begin();
502 EMTFRoadCollection::iterator roads_end = roads.end();
504 for (; roads_it != roads_end; ++roads_it) {
505 quality_codes.at(roads_it->Key_zhit()) = roads_it->Quality_code();
508 roads_it = roads.begin();
509 roads_end = roads.end();
511 for (; roads_it != roads_end; ++roads_it) {
512 int izhit = roads_it->Key_zhit();
515 int qc = quality_codes.at(izhit);
519 int ql = (izhit == emtf::NUM_ZONE_HITS - 1) ? 0 : quality_codes.at(izhit + 1);
520 int qr = (izhit == 0) ? 0 : quality_codes.at(izhit - 1);
523 if (qc <= ql || qc < qr) {
524 roads_it->set_quality_code(0);
533 bool operator()(
const value_type&
x)
const {
return (x.Quality_code() == 0); }
534 } quality_code_zero_pred;
536 roads.erase(std::remove_if(roads.begin(), roads.end(), quality_code_zero_pred), roads.end());
543 bool operator()(
const value_type& lhs,
const value_type& rhs)
const {
return lhs.Key_zhit() > rhs.Key_zhit(); }
546 std::sort(roads.begin(), roads.end(), greater_zhit_cmp);
551 bool operator()(
const value_type& lhs,
const value_type& rhs)
const {
552 return lhs.Quality_code() > rhs.Quality_code();
554 } greater_quality_cmp;
556 std::stable_sort(roads.begin(), roads.end(), greater_quality_cmp);
560 if (roads.size() >
n) {
561 roads.erase(roads.begin() +
n, roads.end());
563 if (not(roads.size() <=
n)) {
564 edm::LogError(
"L1T") <<
"roads.size() = " << roads.size() <<
", n = " <<
n;
569 for (
unsigned iroad = 0; iroad < roads.size(); ++iroad) {
570 roads.at(iroad).set_winner(iroad);
unsigned int op_and(const PhiMemoryImage &other) const
static char to_hex(unsigned int i)
void set_straightness(int s)
void set_bit(unsigned int layer, unsigned int bit)
std::vector< PhiMemoryImage > patterns_
void set_pattern(int bits)
void set_quality_code(int bits)
std::vector< std::string > pattDefinitions_
void sort_single_zone(EMTFRoadCollection &roads) const
void set_key_zhit(int bits)
void process_single_zone(int zone, PhiMemoryImage cloned_image, std::map< pattern_ref_t, int > &patt_lifetime_map, EMTFRoadCollection &roads) const
void set_sector(int bits)
void make_zone_image(int zone, const std::deque< EMTFHitCollection > &extended_conv_hits, PhiMemoryImage &image) const
Container::value_type value_type
void process(const std::deque< EMTFHitCollection > &extended_conv_hits, std::map< pattern_ref_t, int > &patt_lifetime_map, emtf::zone_array< EMTFRoadCollection > &zone_roads) const
void set_straightness(int bits)
int get_straightness() const
l1t::EMTFRoadCollection EMTFRoadCollection
std::vector< std::string > symPattDefinitions_
std::array< T, NUM_ZONES > zone_array
void rotr(unsigned int n)
void rotl(unsigned int n)
void set_endcap(int bits)
void configure(int verbose, int endcap, int sector, int bx, int bxWindow, const std::vector< std::string > &pattDefinitions, const std::vector< std::string > &symPattDefinitions, bool useSymPatterns, int maxRoadsPerZone, bool useSecondEarliest)
bool is_zone_empty(int zone, const std::deque< EMTFHitCollection > &extended_conv_hits, const std::map< pattern_ref_t, int > &patt_lifetime_map) const
void set_layer_code(int bits)
void set_sector_idx(int bits)
std::array< int, 3 > pattern_ref_t